obsidian-dev-utils 87.0.2 → 87.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/demo-vault-helper/main.js +232 -0
  3. package/dist/demo-vault-helper/manifest.json +9 -0
  4. package/dist/dev/main.js +37464 -0
  5. package/dist/dev/manifest.json +9 -0
  6. package/dist/lib/cjs/__merged.cjs +13 -1
  7. package/dist/lib/cjs/__merged.d.cts +4 -2
  8. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  9. package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +138 -0
  10. package/dist/lib/cjs/obsidian/code-block-reg-exp.d.cts +33 -0
  11. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +13 -6
  12. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.d.cts +13 -5
  13. package/dist/lib/cjs/obsidian/community-plugins.cjs +25 -1
  14. package/dist/lib/cjs/obsidian/community-plugins.d.cts +28 -0
  15. package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +159 -0
  16. package/dist/lib/cjs/obsidian/demo-vault-helper.d.cts +40 -0
  17. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +17 -13
  18. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +13 -5
  19. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  20. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  21. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +12 -10
  22. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  23. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +2 -0
  24. package/dist/lib/cjs/reg-exp.cjs +11 -1
  25. package/dist/lib/cjs/reg-exp.d.cts +34 -0
  26. package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +289 -0
  27. package/dist/lib/cjs/script-utils/demo-vault-coverage.d.cts +264 -0
  28. package/dist/lib/cjs/script-utils/demo-vault.cjs +36 -3
  29. package/dist/lib/cjs/script-utils/demo-vault.d.cts +5 -5
  30. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  31. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  32. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +14 -1
  33. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +4 -5
  34. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  35. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  36. package/dist/lib/cjs/script-utils/version.cjs +2 -2
  37. package/dist/lib/esm/__merged.d.mts +4 -2
  38. package/dist/lib/esm/__merged.mjs +11 -1
  39. package/dist/lib/esm/generated-during-build.mjs +1 -1
  40. package/dist/lib/esm/obsidian/code-block-reg-exp.d.mts +33 -0
  41. package/dist/lib/esm/obsidian/code-block-reg-exp.mjs +30 -0
  42. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.d.mts +13 -5
  43. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +13 -6
  44. package/dist/lib/esm/obsidian/community-plugins.d.mts +28 -0
  45. package/dist/lib/esm/obsidian/community-plugins.mjs +24 -1
  46. package/dist/lib/esm/obsidian/demo-vault-helper.d.mts +40 -0
  47. package/dist/lib/esm/obsidian/demo-vault-helper.mjs +56 -0
  48. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +13 -5
  49. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +17 -13
  50. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  51. package/dist/lib/esm/obsidian/index.mjs +5 -1
  52. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +15 -10
  53. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +2 -0
  54. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  55. package/dist/lib/esm/reg-exp.d.mts +34 -0
  56. package/dist/lib/esm/reg-exp.mjs +11 -2
  57. package/dist/lib/esm/script-utils/demo-vault-coverage.d.mts +264 -0
  58. package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +190 -0
  59. package/dist/lib/esm/script-utils/demo-vault.d.mts +5 -5
  60. package/dist/lib/esm/script-utils/demo-vault.mjs +31 -5
  61. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  62. package/dist/lib/esm/script-utils/index.mjs +3 -1
  63. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +14 -1
  64. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +4 -5
  65. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  66. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  67. package/dist/lib/esm/script-utils/version.mjs +2 -2
  68. package/obsidian/code-block-reg-exp/package.json +6 -0
  69. package/obsidian/demo-vault-helper/package.json +6 -0
  70. package/package.json +6 -5
  71. package/script-utils/demo-vault-coverage/package.json +6 -0
@@ -129,6 +129,8 @@ __export(reg_exp_exports, {
129
129
  NEVER_MATCH_REG_EXP: () => NEVER_MATCH_REG_EXP,
130
130
  RegExpMergeFlagsConflictStrategy: () => RegExpMergeFlagsConflictStrategy,
131
131
  escapeRegExp: () => escapeRegExp,
132
+ getMandatoryNamedGroup: () => getMandatoryNamedGroup,
133
+ getOptionalNamedGroup: () => getOptionalNamedGroup,
132
134
  isValidRegExp: () => isValidRegExp,
133
135
  oneOf: () => oneOf
134
136
  });
@@ -143,6 +145,12 @@ var RegExpMergeFlagsConflictStrategy = /* @__PURE__ */ ((RegExpMergeFlagsConflic
143
145
  function escapeRegExp(str) {
144
146
  return str.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
145
147
  }
148
+ function getMandatoryNamedGroup(match, groupName) {
149
+ return (0, import_type_guards.ensureNonNullable)(getOptionalNamedGroup(match, groupName));
150
+ }
151
+ function getOptionalNamedGroup(match, groupName) {
152
+ return match.groups?.[groupName] ?? null;
153
+ }
146
154
  function isValidRegExp(str) {
147
155
  try {
148
156
  new RegExp(str);
@@ -275,7 +283,9 @@ function oneOf(regExps, strategy = "Throw" /* Throw */) {
275
283
  NEVER_MATCH_REG_EXP,
276
284
  RegExpMergeFlagsConflictStrategy,
277
285
  escapeRegExp,
286
+ getMandatoryNamedGroup,
287
+ getOptionalNamedGroup,
278
288
  isValidRegExp,
279
289
  oneOf
280
290
  });
281
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlZy1leHAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydE5ldmVyXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG4vKipcbiAqIEEgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWVyZ2luZyBtdWx0aXBsZSByZWdleCBmbGFncyBpbnRvIG9uZSBhbHRlcm5hdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kge1xuICAvKipcbiAgICogS2VlcCBvbmx5IHRoZSBmbGFncyBwcmVzZW50IGluIGFsbCByZWdleGVzLlxuICAgKi9cbiAgSW50ZXJzZWN0ID0gJ0ludGVyc2VjdCcsXG4gIC8qKlxuICAgKiBUaHJvdyBhbiBlcnJvciBpZiB0aGUgcmVnZXhlcyBoYXZlIGNvbmZsaWN0aW5nIGZsYWdzLlxuICAgKi9cbiAgVGhyb3cgPSAnVGhyb3cnLFxuICAvKipcbiAgICogS2VlcCBvbmx5IHRoZSBmbGFncyBwcmVzZW50IGluIGFueSByZWdleC5cbiAgICovXG4gIFVuaW9uID0gJ1VuaW9uJ1xufVxuXG4vKipcbiAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nIHRvIHNhZmVseSB1c2UgaXQgd2l0aGluIGEgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyBwcmVmaXhlZCB3aXRoIGEgYmFja3NsYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gTk9URTogV2UgY2FuJ3QgdXNlIGByZXBsYWNlQWxsKClgIGZyb20gYFN0cmluZy50c2AgaGVyZSBiZWNhdXNlIGl0IGludHJvZHVjZXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICByZXR1cm4gc3RyLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFJlZ0V4cChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBSZWdFeHAoc3RyKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0ZsYWcocmVnRXhwOiBSZWdFeHAsIGZsYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVnRXhwLmZsYWdzLmluY2x1ZGVzKGZsYWcpO1xufVxuXG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgYWx3YXlzIG1hdGNoZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBBTFdBWVNfTUFUQ0hfUkVHX0VYUCA9IC8oPzopLztcblxuLyoqXG4gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG5ldmVyIG1hdGNoZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBORVZFUl9NQVRDSF9SRUdfRVhQID0gLy5eLztcblxuLyoqXG4gKiBNZXJnZXMgdGhlIGZsYWdzIG9mIG11bHRpcGxlIHJlZ2V4ZXMgaW50byBhIHNpbmdsZSBmbGFnIHN0cmluZywgYXBwbHlpbmcgYSBjb25mbGljdCBzdHJhdGVneS5cbiAqXG4gKiBUaGUgY29vcGVyYXRpbmcgcGVyLWZsYWcgaGVscGVycyBzaGFyZSB0aGUgc2FtZSByZWdleGVzLCBzdHJhdGVneSwgYW5kIGFjY3VtdWxhdGVkIGZsYWcgc2V0LCBzb1xuICogdGhleSBhcmUgZ3JvdXBlZCBoZXJlIGFzIG1ldGhvZHMgb3ZlciB0aG9zZSBmaWVsZHMgcmF0aGVyIHRoYW4gdGhyZWFkaW5nIHRoZSBzdGF0ZSB0aHJvdWdoXG4gKiBwb3NpdGlvbmFsIGFyZ3VtZW50cy5cbiAqL1xuY2xhc3MgUmVnRXhwRmxhZ01lcmdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmluYWxGbGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IG1lcmdlci5cbiAgICpcbiAgICogQHBhcmFtIHJlZ0V4cHMgLSBUaGUgcmVnZXhlcyB3aG9zZSBmbGFncyBhcmUgbWVyZ2VkLlxuICAgKiBAcGFyYW0gc3RyYXRlZ3kgLSBUaGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gZmxhZ3MgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByZWdFeHBzOiBSZWdFeHBbXSwgcHJpdmF0ZSByZWFkb25seSBzdHJhdGVneTogUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kpIHt9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBtZXJnZWQgZmxhZyBzdHJpbmcgZm9yIHRoZSBjb25maWd1cmVkIHJlZ2V4ZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBtZXJnZWQgZmxhZ3Mgam9pbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGNvbXB1dGVGbGFncygpOiBzdHJpbmcge1xuICAgIHRoaXMuYWRkU2VtYW50aWNGbGFncygpO1xuICAgIHRoaXMuYWRkVW5pY29kZUZsYWdzKCk7XG4gICAgdGhpcy5hZGRNZXRhRmxhZ3MoKTtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmluYWxGbGFnc10uam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGFkZE1ldGFGbGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBNRVRBX0ZMQUdTID0gWydnJywgJ2QnXTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgTUVUQV9GTEFHUykge1xuICAgICAgaWYgKHRoaXMucmVnRXhwcy5zb21lKChyZWdFeHApID0+IGhhc0ZsYWcocmVnRXhwLCBmbGFnKSkpIHtcbiAgICAgICAgdGhpcy5maW5hbEZsYWdzLmFkZChmbGFnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNlbWFudGljRmxhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgU0VNQU5USUNfRkxBR1MgPSBbJ2knLCAnbScsICdzJywgJ3knXTtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgU0VNQU5USUNfRkxBR1MpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFBpY2tGbGFnKGZsYWcpKSB7XG4gICAgICAgIHRoaXMuZmluYWxGbGFncy5hZGQoZmxhZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRVbmljb2RlRmxhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgY291bnRVID0gdGhpcy5yZWdFeHBzLmZpbHRlcigocmVnRXhwKSA9PiBoYXNGbGFnKHJlZ0V4cCwgJ3UnKSkubGVuZ3RoO1xuICAgIGNvbnN0IGNvdW50ViA9IHRoaXMucmVnRXhwcy5maWx0ZXIoKHJlZ0V4cCkgPT4gaGFzRmxhZyhyZWdFeHAsICd2JykpLmxlbmd0aDtcblxuICAgIGxldCBzaG91bGRVc2VVRmxhZzogYm9vbGVhbjtcbiAgICBsZXQgc2hvdWxkVXNlVkZsYWc6IGJvb2xlYW47XG5cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdjggY291bnRzIHRoZSBpbXBsaWNpdCBkZWZhdWx0IGJyYW5jaCBhcyB1bmNvdmVyZWQgZXZlbiB3aGVuIGFsbCBlbnVtIGNhc2VzIGFyZSBoYW5kbGVkLiAqL1xuICAgIHN3aXRjaCAodGhpcy5zdHJhdGVneSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuSW50ZXJzZWN0OlxuICAgICAgICBzaG91bGRVc2VVRmxhZyA9IGNvdW50VSA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICAgICAgc2hvdWxkVXNlVkZsYWcgPSBjb3VudFYgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdzoge1xuICAgICAgICBjb25zdCBhbGxVID0gY291bnRVID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBub25lVSA9IGNvdW50VSA9PT0gMDtcbiAgICAgICAgY29uc3QgYWxsViA9IGNvdW50ViA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgbm9uZVYgPSBjb3VudFYgPT09IDA7XG5cbiAgICAgICAgaWYgKCEoYWxsVSB8fCBub25lVSkgfHwgIShhbGxWIHx8IG5vbmVWKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgXFwndVxcJy9cXCd2XFwnIGZsYWdzIGFjcm9zcyBwYXR0ZXJucy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3VsZFVzZVVGbGFnID0gYWxsVTtcbiAgICAgICAgc2hvdWxkVXNlVkZsYWcgPSBhbGxWO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVW5pb246XG4gICAgICAgIHNob3VsZFVzZVVGbGFnID0gY291bnRVID4gMDtcbiAgICAgICAgc2hvdWxkVXNlVkZsYWcgPSBjb3VudFYgPiAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZC4gKi9cbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5zdHJhdGVneSk7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFVzZVVGbGFnICYmIHNob3VsZFVzZVZGbGFnKSB7XG4gICAgICBhc3NlcnQodGhpcy5zdHJhdGVneSAhPT0gUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVGhyb3csICdDYW5ub3QgY29tYmluZSBib3RoIFxcJ3VcXCcvXFwndlxcJyBmbGFncyBpbiBvbmUgUmVnRXhwLicpO1xuICAgICAgc2hvdWxkVXNlVUZsYWcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXNlVUZsYWcpIHtcbiAgICAgIHRoaXMuZmluYWxGbGFncy5hZGQoJ3UnKTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFVzZVZGbGFnKSB7XG4gICAgICB0aGlzLmZpbmFsRmxhZ3MuYWRkKCd2Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRQaWNrRmxhZyhmbGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucmVnRXhwcy5maWx0ZXIoKHJlZ0V4cCkgPT4gaGFzRmxhZyhyZWdFeHAsIGZsYWcpKS5sZW5ndGg7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHY4IGNvdW50cyB0aGUgaW1wbGljaXQgZGVmYXVsdCBicmFuY2ggYXMgdW5jb3ZlcmVkIGV2ZW4gd2hlbiBhbGwgZW51bSBjYXNlcyBhcmUgaGFuZGxlZC4gKi9cbiAgICBzd2l0Y2ggKHRoaXMuc3RyYXRlZ3kpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LkludGVyc2VjdDpcbiAgICAgICAgcmV0dXJuIGNvdW50ID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlVuaW9uOlxuICAgICAgICByZXR1cm4gY291bnQgPiAwO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLnN0cmF0ZWd5KTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG5cbiAgICBjb25zdCBhbGxTYW1lID0gY291bnQgPT09IDAgfHwgY291bnQgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgaWYgKCFhbGxTYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZsaWN0aW5nIGZsYWcgJyR7ZmxhZ30nIGFjcm9zcyBwYXR0ZXJucy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICB9XG59XG5cbi8qKlxuICogQ29tYmluZSBtdWx0aXBsZSByZWdleGVzIGludG8gb25lIGFsdGVybmF0aW9uLCBoYW5kbGluZyBmbGFncy5cbiAqXG4gKiBAcGFyYW0gcmVnRXhwcyAtIFRoZSByZWdleGVzIHRvIGNvbWJpbmUuXG4gKiBAcGFyYW0gc3RyYXRlZ3kgLSBUaGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWVyZ2luZyBmbGFncyAoZGVmYXVsdDogYFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93YCkuXG4gKiBAcmV0dXJucyBUaGUgY29tYmluZWQgcmVnZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVPZihcbiAgcmVnRXhwczogUmVnRXhwW10sXG4gIHN0cmF0ZWd5OiBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneSA9IFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93XG4pOiBSZWdFeHAge1xuICBpZiAocmVnRXhwcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQUxXQVlTX01BVENIX1JFR19FWFA7XG4gIH1cblxuICBpZiAocmVnRXhwcy5sZW5ndGggPT09IDEgJiYgcmVnRXhwc1swXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHJlZ0V4cHNbMF07XG4gIH1cblxuICBjb25zdCBzb3VyY2UgPSByZWdFeHBzLm1hcCgocmVnRXhwKSA9PiBgKD86JHtyZWdFeHAuc291cmNlfSlgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFJlZ0V4cEZsYWdNZXJnZXIocmVnRXhwcywgc3RyYXRlZ3kpLmNvbXB1dGVGbGFncygpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIGZsYWdzKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSx5QkFHTztBQUtBLElBQUssbUNBQUwsa0JBQUtBLHNDQUFMO0FBSUwsRUFBQUEsa0NBQUEsZUFBWTtBQUlaLEVBQUFBLGtDQUFBLFdBQVE7QUFJUixFQUFBQSxrQ0FBQSxXQUFRO0FBWkUsU0FBQUE7QUFBQSxHQUFBO0FBcUJMLFNBQVMsYUFBYSxLQUFxQjtBQUVoRCxTQUFPLElBQUksV0FBVyx1QkFBdUIsTUFBTTtBQUNyRDtBQVFPLFNBQVMsY0FBYyxLQUFzQjtBQUNsRCxNQUFJO0FBQ0YsUUFBSSxPQUFPLEdBQUc7QUFDZCxXQUFPO0FBQUEsRUFDVCxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLFNBQVMsUUFBUSxRQUFnQixNQUF1QjtB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VUFBTSxVQUFVLFVBQVUsS0FBSyxVQUFVLEtBQUssUUFBUTtBQUN0RCxRQUFJLENBQUMsU0FBUztBQUNaLFlBQU0sSUFBSSxNQUFNLHFCQUFxQixJQUFJLG9CQUFvQjtBQUFBLElBQy9EO0FBQ0EsV0FBTyxVQUFVLEtBQUssUUFBUTtBQUFBLEVBQ2hDO0FBQ0Y7QUFTTyxTQUFTLE1BQ2QsU0FDQSxXQUE2QyxxQkFDckM7QUFDUixNQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLENBQUMsTUFBTSxRQUFXO0FBQ3BELFdBQU8sUUFBUSxDQUFDO0FBQUEsRUFDbEI7QUFFQSxRQUFNLFNBQVMsUUFBUSxJQUFJLENBQUMsV0FBVyxNQUFNLE9BQU8sTUFBTSxHQUFHLEVBQUUsS0FBSyxHQUFHO0FBQ3ZFLFFBQU0sUUFBUSxJQUFJLGlCQUFpQixTQUFTLFFBQVEsRUFBRSxhQUFhO0FBQ25FLFNBQU8sSUFBSSxPQUFPLFFBQVEsS0FBSztBQUNqQzsiLAogICJuYW1lcyI6IFsiUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kiXQp9Cg==
291
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlZy1leHAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgcmVndWxhciBleHByZXNzaW9ucy5cbiAqL1xuXG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGFzc2VydE5ldmVyLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBBIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIG1lcmdpbmcgbXVsdGlwbGUgcmVnZXggZmxhZ3MgaW50byBvbmUgYWx0ZXJuYXRpb24uXG4gKi9cbmV4cG9ydCBlbnVtIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIEtlZXAgb25seSB0aGUgZmxhZ3MgcHJlc2VudCBpbiBhbGwgcmVnZXhlcy5cbiAgICovXG4gIEludGVyc2VjdCA9ICdJbnRlcnNlY3QnLFxuICAvKipcbiAgICogVGhyb3cgYW4gZXJyb3IgaWYgdGhlIHJlZ2V4ZXMgaGF2ZSBjb25mbGljdGluZyBmbGFncy5cbiAgICovXG4gIFRocm93ID0gJ1Rocm93JyxcbiAgLyoqXG4gICAqIEtlZXAgb25seSB0aGUgZmxhZ3MgcHJlc2VudCBpbiBhbnkgcmVnZXguXG4gICAqL1xuICBVbmlvbiA9ICdVbmlvbidcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBhIHN0cmluZyB0byBzYWZlbHkgdXNlIGl0IHdpdGhpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgcHJlZml4ZWQgd2l0aCBhIGJhY2tzbGFzaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5PVEU6IFdlIGNhbid0IHVzZSBgcmVwbGFjZUFsbCgpYCBmcm9tIGBTdHJpbmcudHNgIGhlcmUgYmVjYXVzZSBpdCBpbnRyb2R1Y2VzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgbWFuZGF0b3J5IG5hbWVkIGNhcHR1cmUgZ3JvdXAgZnJvbSBhIHJlZ2V4IG1hdGNoLlxuICpcbiAqIFVzZSB0aGlzIGZvciBhIG5hbWVkIGdyb3VwIHRoYXQgaXMgQUxXQVlTIHByZXNlbnQgd2hlbiB0aGUgcGF0dGVybiBtYXRjaGVzIFx1MjAxNCBub3Qgd3JhcHBlZCBpbiBhbiBvcHRpb25hbFxuICogYCg/Olx1MjAyNik/YCAvIGAoXHUyMDI2KT9gLiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBzdHJpbmcgKHdoaWNoIG1heSBiZSBgJydgIGZvciBhIHplcm8td2lkdGggbWF0Y2ggc3VjaCBhcyBgXFx3KmApLFxuICogdGhyb3dpbmcgaWYgdGhlIGdyb3VwIFx1MjAxNCBvciB0aGUgbWF0Y2gncyBgZ3JvdXBzYCBvYmplY3QgXHUyMDE0IGlzIGFic2VudCwgc28gYSBwYXR0ZXJuIGNoYW5nZSB0aGF0IGRyb3BzIHRoZVxuICogZ3JvdXAgZmFpbHMgbG91ZGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgeWllbGRpbmcgYSB3cm9uZyB2YWx1ZS5cbiAqXG4gKiBQcmVmZXIgdGhpcyBvdmVyIGBtYXRjaC5ncm91cHM/LltuYW1lXSA/PyAnJ2A6IGZvciBhIG1hbmRhdG9yeSBncm91cCB0aGF0IGZhbGxiYWNrIGlzIGEgbmV2ZXItdGFrZW4gKGRlYWQpXG4gKiBicmFuY2ggdGhhdCBmYWlscyBhIDEwMCUtYnJhbmNoIGNvdmVyYWdlIGdhdGUsIHdoZXJlYXMgdGhlIHRocm93IGhlcmUgbGl2ZXMgaW5zaWRlIGBlbnN1cmVOb25OdWxsYWJsZWBcbiAqIChhbHJlYWR5IGNvdmVyZWQpLCBsZWF2aW5nIG5vIGlubGluZSBicmFuY2ggYXQgdGhlIGNhbGwgc2l0ZS4gRm9yIGEgZ3JvdXAgdGhhdCBtYXkgbGVnaXRpbWF0ZWx5IGJlIGFic2VudCxcbiAqIHVzZSB7QGxpbmsgZ2V0T3B0aW9uYWxOYW1lZEdyb3VwfSBhbmQgZGVmYXVsdCBpdHMgYG51bGxgIHdpdGggYD8/IFx1MjAyNmAuXG4gKlxuICogQHBhcmFtIG1hdGNoIC0gVGhlIG1hdGNoIHJldHVybmVkIGJ5IGBSZWdFeHAuZXhlY2AsIGBTdHJpbmcubWF0Y2hBbGxgLCBvciBgU3RyaW5nLm1hdGNoYC5cbiAqIEBwYXJhbSBncm91cE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2FwdHVyZSBncm91cCB0byByZWFkLlxuICogQHJldHVybnMgVGhlIGNhcHR1cmVkIHN0cmluZy5cbiAqIEB0aHJvd3MgV2hlbiB0aGUgbmFtZWQgZ3JvdXAgaXMgYWJzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSwgZ3JvdXBOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoZ2V0T3B0aW9uYWxOYW1lZEdyb3VwKG1hdGNoLCBncm91cE5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhbiBvcHRpb25hbCBuYW1lZCBjYXB0dXJlIGdyb3VwIGZyb20gYSByZWdleCBtYXRjaCwgZGlzdGluZ3Vpc2hpbmcgYW4gYWJzZW50IGdyb3VwIGZyb20gYSBwcmVzZW50XG4gKiBlbXB0eSBvbmUuXG4gKlxuICogUmV0dXJucyB0aGUgY2FwdHVyZWQgc3RyaW5nIHdoZW4gdGhlIGdyb3VwIHBhcnRpY2lwYXRlZCBpbiB0aGUgbWF0Y2ggXHUyMDE0IHdoaWNoIG1heSBiZSBgJydgIGZvciBhIHplcm8td2lkdGhcbiAqIG1hdGNoIHN1Y2ggYXMgYFxcdypgIFx1MjAxNCBvciBgbnVsbGAgd2hlbiB0aGUgZ3JvdXAsIG9yIHRoZSBtYXRjaCdzIGBncm91cHNgIG9iamVjdCwgaXMgYWJzZW50IChlLmcuIGFuIG9wdGlvbmFsXG4gKiBgKD86XHUyMDI2KT9gIGdyb3VwIHRoYXQgZGlkIG5vdCBtYXRjaCkuIEJlY2F1c2UgYG51bGxgIGlzIHJldHVybmVkIG9ubHkgZm9yIGEgZ2VudWluZWx5LWFic2VudCBncm91cCwgYVxuICogY2FsbGVyJ3MgYD8/IDxkZWZhdWx0PmAgaXMgYSBsaXZlIGJyYW5jaCByYXRoZXIgdGhhbiB0aGUgZGVhZCBvbmUgdGhhdCBgbWF0Y2guZ3JvdXBzPy5bbmFtZV0gPz8gJydgIGxlYXZlc1xuICogZm9yIGEgbWFuZGF0b3J5IGdyb3VwLiBGb3IgYSBncm91cCB0aGF0IG11c3QgYWx3YXlzIGJlIHByZXNlbnQsIHVzZSB7QGxpbmsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cH0uXG4gKlxuICogQHBhcmFtIG1hdGNoIC0gVGhlIG1hdGNoIHJldHVybmVkIGJ5IGBSZWdFeHAuZXhlY2AsIGBTdHJpbmcubWF0Y2hBbGxgLCBvciBgU3RyaW5nLm1hdGNoYC5cbiAqIEBwYXJhbSBncm91cE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY2FwdHVyZSBncm91cCB0byByZWFkLlxuICogQHJldHVybnMgVGhlIGNhcHR1cmVkIHN0cmluZywgb3IgYG51bGxgIHdoZW4gdGhlIGdyb3VwIGlzIGFic2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSwgZ3JvdXBOYW1lOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgcmV0dXJuIG1hdGNoLmdyb3Vwcz8uW2dyb3VwTmFtZV0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUmVnRXhwKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgbmV3IFJlZ0V4cChzdHIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzRmxhZyhyZWdFeHA6IFJlZ0V4cCwgZmxhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWdFeHAuZmxhZ3MuaW5jbHVkZXMoZmxhZyk7XG59XG5cbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBhbHdheXMgbWF0Y2hlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFMV0FZU19NQVRDSF9SRUdfRVhQID0gLyg/OikvO1xuXG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbmV2ZXIgbWF0Y2hlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE5FVkVSX01BVENIX1JFR19FWFAgPSAvLl4vO1xuXG4vKipcbiAqIE1lcmdlcyB0aGUgZmxhZ3Mgb2YgbXVsdGlwbGUgcmVnZXhlcyBpbnRvIGEgc2luZ2xlIGZsYWcgc3RyaW5nLCBhcHBseWluZyBhIGNvbmZsaWN0IHN0cmF0ZWd5LlxuICpcbiAqIFRoZSBjb29wZXJhdGluZyBwZXItZmxhZyBoZWxwZXJzIHNoYXJlIHRoZSBzYW1lIHJlZ2V4ZXMsIHN0cmF0ZWd5LCBhbmQgYWNjdW11bGF0ZWQgZmxhZyBzZXQsIHNvXG4gKiB0aGV5IGFyZSBncm91cGVkIGhlcmUgYXMgbWV0aG9kcyBvdmVyIHRob3NlIGZpZWxkcyByYXRoZXIgdGhhbiB0aHJlYWRpbmcgdGhlIHN0YXRlIHRocm91Z2hcbiAqIHBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICovXG5jbGFzcyBSZWdFeHBGbGFnTWVyZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmaW5hbEZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbWVyZ2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcmVnRXhwcyAtIFRoZSByZWdleGVzIHdob3NlIGZsYWdzIGFyZSBtZXJnZWQuXG4gICAqIEBwYXJhbSBzdHJhdGVneSAtIFRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBmbGFncyBjb25mbGljdC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlZ0V4cHM6IFJlZ0V4cFtdLCBwcml2YXRlIHJlYWRvbmx5IHN0cmF0ZWd5OiBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneSkge31cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIG1lcmdlZCBmbGFnIHN0cmluZyBmb3IgdGhlIGNvbmZpZ3VyZWQgcmVnZXhlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG1lcmdlZCBmbGFncyBqb2luZWQgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgY29tcHV0ZUZsYWdzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5hZGRTZW1hbnRpY0ZsYWdzKCk7XG4gICAgdGhpcy5hZGRVbmljb2RlRmxhZ3MoKTtcbiAgICB0aGlzLmFkZE1ldGFGbGFncygpO1xuICAgIHJldHVybiBbLi4udGhpcy5maW5hbEZsYWdzXS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTWV0YUZsYWdzKCk6IHZvaWQge1xuICAgIGNvbnN0IE1FVEFfRkxBR1MgPSBbJ2cnLCAnZCddO1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBNRVRBX0ZMQUdTKSB7XG4gICAgICBpZiAodGhpcy5yZWdFeHBzLnNvbWUoKHJlZ0V4cCkgPT4gaGFzRmxhZyhyZWdFeHAsIGZsYWcpKSkge1xuICAgICAgICB0aGlzLmZpbmFsRmxhZ3MuYWRkKGZsYWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU2VtYW50aWNGbGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBTRU1BTlRJQ19GTEFHUyA9IFsnaScsICdtJywgJ3MnLCAneSddO1xuICAgIGZvciAoY29uc3QgZmxhZyBvZiBTRU1BTlRJQ19GTEFHUykge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkUGlja0ZsYWcoZmxhZykpIHtcbiAgICAgICAgdGhpcy5maW5hbEZsYWdzLmFkZChmbGFnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFVuaWNvZGVGbGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudFUgPSB0aGlzLnJlZ0V4cHMuZmlsdGVyKChyZWdFeHApID0+IGhhc0ZsYWcocmVnRXhwLCAndScpKS5sZW5ndGg7XG4gICAgY29uc3QgY291bnRWID0gdGhpcy5yZWdFeHBzLmZpbHRlcigocmVnRXhwKSA9PiBoYXNGbGFnKHJlZ0V4cCwgJ3YnKSkubGVuZ3RoO1xuXG4gICAgbGV0IHNob3VsZFVzZVVGbGFnOiBib29sZWFuO1xuICAgIGxldCBzaG91bGRVc2VWRmxhZzogYm9vbGVhbjtcblxuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSB2OCBjb3VudHMgdGhlIGltcGxpY2l0IGRlZmF1bHQgYnJhbmNoIGFzIHVuY292ZXJlZCBldmVuIHdoZW4gYWxsIGVudW0gY2FzZXMgYXJlIGhhbmRsZWQuICovXG4gICAgc3dpdGNoICh0aGlzLnN0cmF0ZWd5KSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5JbnRlcnNlY3Q6XG4gICAgICAgIHNob3VsZFVzZVVGbGFnID0gY291bnRVID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgICBzaG91bGRVc2VWRmxhZyA9IGNvdW50ViA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93OiB7XG4gICAgICAgIGNvbnN0IGFsbFUgPSBjb3VudFUgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IG5vbmVVID0gY291bnRVID09PSAwO1xuICAgICAgICBjb25zdCBhbGxWID0gY291bnRWID09PSB0aGlzLnJlZ0V4cHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBub25lViA9IGNvdW50ViA9PT0gMDtcblxuICAgICAgICBpZiAoIShhbGxVIHx8IG5vbmVVKSB8fCAhKGFsbFYgfHwgbm9uZVYpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25mbGljdGluZyBcXCd1XFwnL1xcJ3ZcXCcgZmxhZ3MgYWNyb3NzIHBhdHRlcm5zLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2hvdWxkVXNlVUZsYWcgPSBhbGxVO1xuICAgICAgICBzaG91bGRVc2VWRmxhZyA9IGFsbFY7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5VbmlvbjpcbiAgICAgICAgc2hvdWxkVXNlVUZsYWcgPSBjb3VudFUgPiAwO1xuICAgICAgICBzaG91bGRVc2VWRmxhZyA9IGNvdW50ViA+IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEV4aGF1c3RpdmUgc3dpdGNoIGd1YXJkLiAqL1xuICAgICAgICBhc3NlcnROZXZlcih0aGlzLnN0cmF0ZWd5KTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXNlVUZsYWcgJiYgc2hvdWxkVXNlVkZsYWcpIHtcbiAgICAgIGFzc2VydCh0aGlzLnN0cmF0ZWd5ICE9PSBSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneS5UaHJvdywgJ0Nhbm5vdCBjb21iaW5lIGJvdGggXFwndVxcJy9cXCd2XFwnIGZsYWdzIGluIG9uZSBSZWdFeHAuJyk7XG4gICAgICBzaG91bGRVc2VVRmxhZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRVc2VVRmxhZykge1xuICAgICAgdGhpcy5maW5hbEZsYWdzLmFkZCgndScpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkVXNlVkZsYWcpIHtcbiAgICAgIHRoaXMuZmluYWxGbGFncy5hZGQoJ3YnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFBpY2tGbGFnKGZsYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yZWdFeHBzLmZpbHRlcigocmVnRXhwKSA9PiBoYXNGbGFnKHJlZ0V4cCwgZmxhZykpLmxlbmd0aDtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdjggY291bnRzIHRoZSBpbXBsaWNpdCBkZWZhdWx0IGJyYW5jaCBhcyB1bmNvdmVyZWQgZXZlbiB3aGVuIGFsbCBlbnVtIGNhc2VzIGFyZSBoYW5kbGVkLiAqL1xuICAgIHN3aXRjaCAodGhpcy5zdHJhdGVneSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuSW50ZXJzZWN0OlxuICAgICAgICByZXR1cm4gY291bnQgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gICAgICBjYXNlIFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5LlRocm93OlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVW5pb246XG4gICAgICAgIHJldHVybiBjb3VudCA+IDA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQuICovXG4gICAgICAgIGFzc2VydE5ldmVyKHRoaXMuc3RyYXRlZ3kpO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFNhbWUgPSBjb3VudCA9PT0gMCB8fCBjb3VudCA9PT0gdGhpcy5yZWdFeHBzLmxlbmd0aDtcbiAgICBpZiAoIWFsbFNhbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uZmxpY3RpbmcgZmxhZyAnJHtmbGFnfScgYWNyb3NzIHBhdHRlcm5zLmApO1xuICAgIH1cbiAgICByZXR1cm4gY291bnQgPT09IHRoaXMucmVnRXhwcy5sZW5ndGg7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21iaW5lIG11bHRpcGxlIHJlZ2V4ZXMgaW50byBvbmUgYWx0ZXJuYXRpb24sIGhhbmRsaW5nIGZsYWdzLlxuICpcbiAqIEBwYXJhbSByZWdFeHBzIC0gVGhlIHJlZ2V4ZXMgdG8gY29tYmluZS5cbiAqIEBwYXJhbSBzdHJhdGVneSAtIFRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBtZXJnaW5nIGZsYWdzIChkZWZhdWx0OiBgUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVGhyb3dgKS5cbiAqIEByZXR1cm5zIFRoZSBjb21iaW5lZCByZWdleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZU9mKFxuICByZWdFeHBzOiBSZWdFeHBbXSxcbiAgc3RyYXRlZ3k6IFJlZ0V4cE1lcmdlRmxhZ3NDb25mbGljdFN0cmF0ZWd5ID0gUmVnRXhwTWVyZ2VGbGFnc0NvbmZsaWN0U3RyYXRlZ3kuVGhyb3dcbik6IFJlZ0V4cCB7XG4gIGlmIChyZWdFeHBzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBBTFdBWVNfTUFUQ0hfUkVHX0VYUDtcbiAgfVxuXG4gIGlmIChyZWdFeHBzLmxlbmd0aCA9PT0gMSAmJiByZWdFeHBzWzBdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcmVnRXhwc1swXTtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IHJlZ0V4cHMubWFwKChyZWdFeHApID0+IGAoPzoke3JlZ0V4cC5zb3VyY2V9KWApLmpvaW4oJ3wnKTtcbiAgY29uc3QgZmxhZ3MgPSBuZXcgUmVnRXhwRmxhZ01lcmdlcihyZWdFeHBzLCBzdHJhdGVneSkuY29tcHV0ZUZsYWdzKCk7XG4gIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgZmxhZ3MpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSx5QkFJTztBQUtBLElBQUssbUNBQUwsa0JBQUtBLHNDQUFMO0FBSUwsRUFBQUEsa0NBQUEsZUFBWTtBQUlaLEVBQUFBLGtDQUFBLFdBQVE7QUFJUixFQUFBQSxrQ0FBQSxXQUFRO0FBWkUsU0FBQUE7QUFBQSxHQUFBO0FBcUJMLFNBQVMsYUFBYSxLQUFxQjtBQUVoRCxTQUFPLElBQUksV0FBVyx1QkFBdUIsTUFBTTtBQUNyRDtBQW9CTyxTQUFTLHVCQUF1QixPQUF5QixXQUEyQjtBQUN6RixhQUFPLHNDQUFrQixzQkFBc0IsT0FBTyxTQUFTLENBQUM7QUFDbEU7QUFnQk8sU0FBUyxzQkFBc0IsT0FBeUIsV0FBa0M7QUFDL0YsU0FBTyxNQUFNLFNBQVMsU0FBUyxLQUFLO0FBQ3RDO0FBUU8sU0FBUyxjQUFjLEtBQXNCO0FBQ2xELE1BQUk7QUFDRixRQUFJLE9BQU8sR0FBRztBQUNkLFdBQU87QUFBQSxFQUNULFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyxRQUFRLFFBQWdCLE1BQXVCO0FBQ3RELFNBQU8sT0FBTyxNQUFNLFNBQVMsSUFBSTtBQUNuQztBQUtPLE1BQU0sdUJBQXVCO0FBSzdCLE1BQU0sc0JBQXNCO0FBU25DLE1BQU0saUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTZCxZQUE2QixTQUFvQyxVQUE0QztBQUFoRjtBQUFvQztBQUFBLEVBQTZDO0FBQUEsRUFBakY7QUFBQSxFQUFvQztBQUFBLEVBUnZELGFBQWEsb0JBQUksSUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWV2QyxlQUF1QjtBQUM1QixTQUFLLGlCQUFpQjtBQUN0QixTQUFLLGdCQUFnQjtBQUNyQixTQUFLLGFBQWE7QUFDbEIsV0FBTyxDQUFDLEdBQUcsS0FBSyxVQUFVLEVBQUUsS0FBSyxFQUFFO0FBQUEsRUFDckM7QUFBQSxFQUVRLGVBQXFCO0FBQzNCLFVBQU0sYUFBYSxDQUFDLEtBQUssR0FBRztBQUM1QixlQUFXLFFBQVEsWUFBWTtBQUM3QixVQUFJLEtBQUssUUFBUSxLQUFLLENBQUMsV0FBVyxRQUFRLFFBQVEsSUFBSSxDQUFDLEdBQUc7QUFDeEQsYUFBSyxXQUFXLElBQUksSUFBSTtBQUFBLE1BQzFCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLG1CQUF5QjtBQUMvQixVQUFNLGlCQUFpQixDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7QUFDMUMsZUFBVyxRQUFRLGdCQUFnQjtBQUNqQyxVQUFJLEtBQUssZUFBZSxJQUFJLEdBQUc7QUFDN0IsYUFBSyxXQUFXLElBQUksSUFBSTtBQUFBLE1BQzFCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGtCQUF3QjtBQUM5QixVQUFNLFNBQVMsS0FBSyxRQUFRLE9BQU8sQ0FBQyxXQUFXLFFBQVEsUUFBUSxHQUFHLENBQUMsRUFBRTtBQUNyRSxVQUFNLFNBQVMsS0FBSyxRQUFRLE9BQU8sQ0FBQyxXQUFXLFFBQVEsUUFBUSxHQUFHLENBQUMsRUFBRTtBQUVyRSxRQUFJO0FBQ0osUUFBSTtBQUdKLFlBQVEsS0FBSyxVQUFVO0FBQUE7QUFBQSxNQUVyQixLQUFLO0FBQ0gseUJBQWlCLFdBQVcsS0FBSyxRQUFRO0FBQ3pDLHlCQUFpQixXQUFXLEtBQUssUUFBUTtBQUN6QztBQUFBLE1BQ0YsS0FBSyxxQkFBd0M7QUFDM0MsY0FBTSxPQUFPLFdBQVcsS0FBSyxRQUFRO0FBQ3JDLGNBQU0sUUFBUSxXQUFXO0FBQ3pCLGNBQU0sT0FBTyxXQUFXLEtBQUssUUFBUTtBQUNyQyxjQUFNLFFBQVEsV0FBVztBQUV6QixZQUFJLEVBQUUsUUFBUSxVQUFVLEVBQUUsUUFBUSxRQUFRO0FBQ3hDLGdCQUFNLElBQUksTUFBTSw0Q0FBZ0Q7QUFBQSxRQUNsRTtBQUVBLHlCQUFpQjtBQUNqQix5QkFBaUI7QUFDakI7QUFBQSxNQUNGO0FBQUEsTUFDQSxLQUFLO0FBQ0gseUJBQWlCLFNBQVM7QUFDMUIseUJBQWlCLFNBQVM7QUFDMUI7QUFBQSxNQUNGO0FBRUUsNENBQVksS0FBSyxRQUFRO0FBQUEsSUFFN0I7QUFFQSxRQUFJLGtCQUFrQixnQkFBZ0I7QUFDcEMscUNBQU8sS0FBSyxhQUFhLHFCQUF3QyxrREFBc0Q7QUFDdkgsdUJBQWlCO0FBQUEsSUFDbkI7QUFFQSxRQUFJLGdCQUFnQjtBQUNsQixXQUFLLFdBQVcsSUFBSSxHQUFHO0FBQUEsSUFDekI7QUFDQSxRQUFJLGdCQUFnQjtBQUNsQixXQUFLLFdBQVcsSUFBSSxHQUFHO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQUEsRUFFUSxlQUFlLE1BQXVCO0FBQzVDLFVBQU0sUUFBUSxLQUFLLFFBQVEsT0FBTyxDQUFDLFdBQVcsUUFBUSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBRXJFLFlBQVEsS0FBSyxVQUFVO0FBQUE7QUFBQSxNQUVyQixLQUFLO0FBQ0gsZUFBTyxVQUFVLEtBQUssUUFBUTtBQUFBLE1BQ2hDLEtBQUs7QUFDSDtBQUFBLE1BQ0YsS0FBSztBQUNILGVBQU8sUUFBUTtBQUFBLE1BQ2pCO0FBRUUsNENBQVksS0FBSyxRQUFRO0FBQUEsSUFFN0I7QUFFQSxVQUFNLFVBQVUsVUFBVSxLQUFLLFVBQVUsS0FBSyxRQUFRO0FBQ3RELFFBQUksQ0FBQyxTQUFTO0FBQ1osWUFBTSxJQUFJLE1BQU0scUJBQXFCLElBQUksb0JBQW9CO0FBQUEsSUFDL0Q7QUFDQSxXQUFPLFVBQVUsS0FBSyxRQUFRO0FBQUEsRUFDaEM7QUFDRjtBQVNPLFNBQVMsTUFDZCxTQUNBLFdBQTZDLHFCQUNyQztBQUNSLE1BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFFBQVEsV0FBVyxLQUFLLFFBQVEsQ0FBQyxNQUFNLFFBQVc7QUFDcEQsV0FBTyxRQUFRLENBQUM7QUFBQSxFQUNsQjtBQUVBLFFBQU0sU0FBUyxRQUFRLElBQUksQ0FBQyxXQUFXLE1BQU0sT0FBTyxNQUFNLEdBQUcsRUFBRSxLQUFLLEdBQUc7QUFDdkUsUUFBTSxRQUFRLElBQUksaUJBQWlCLFNBQVMsUUFBUSxFQUFFLGFBQWE7QUFDbkUsU0FBTyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ2pDOyIsCiAgIm5hbWVzIjogWyJSZWdFeHBNZXJnZUZsYWdzQ29uZmxpY3RTdHJhdGVneSJdCn0K
@@ -28,6 +28,40 @@ export declare enum RegExpMergeFlagsConflictStrategy {
28
28
  * @returns The escaped string with special characters prefixed with a backslash.
29
29
  */
30
30
  export declare function escapeRegExp(str: string): string;
31
+ /**
32
+ * Reads a mandatory named capture group from a regex match.
33
+ *
34
+ * Use this for a named group that is ALWAYS present when the pattern matches — not wrapped in an optional
35
+ * `(?:…)?` / `(…)?`. Returns the captured string (which may be `''` for a zero-width match such as `\w*`),
36
+ * throwing if the group — or the match's `groups` object — is absent, so a pattern change that drops the
37
+ * group fails loudly instead of silently yielding a wrong value.
38
+ *
39
+ * Prefer this over `match.groups?.[name] ?? ''`: for a mandatory group that fallback is a never-taken (dead)
40
+ * branch that fails a 100%-branch coverage gate, whereas the throw here lives inside `ensureNonNullable`
41
+ * (already covered), leaving no inline branch at the call site. For a group that may legitimately be absent,
42
+ * use {@link getOptionalNamedGroup} and default its `null` with `?? …`.
43
+ *
44
+ * @param match - The match returned by `RegExp.exec`, `String.matchAll`, or `String.match`.
45
+ * @param groupName - The name of the capture group to read.
46
+ * @returns The captured string.
47
+ * @throws When the named group is absent.
48
+ */
49
+ export declare function getMandatoryNamedGroup(match: RegExpMatchArray, groupName: string): string;
50
+ /**
51
+ * Reads an optional named capture group from a regex match, distinguishing an absent group from a present
52
+ * empty one.
53
+ *
54
+ * Returns the captured string when the group participated in the match — which may be `''` for a zero-width
55
+ * match such as `\w*` — or `null` when the group, or the match's `groups` object, is absent (e.g. an optional
56
+ * `(?:…)?` group that did not match). Because `null` is returned only for a genuinely-absent group, a
57
+ * caller's `?? <default>` is a live branch rather than the dead one that `match.groups?.[name] ?? ''` leaves
58
+ * for a mandatory group. For a group that must always be present, use {@link getMandatoryNamedGroup}.
59
+ *
60
+ * @param match - The match returned by `RegExp.exec`, `String.matchAll`, or `String.match`.
61
+ * @param groupName - The name of the capture group to read.
62
+ * @returns The captured string, or `null` when the group is absent.
63
+ */
64
+ export declare function getOptionalNamedGroup(match: RegExpMatchArray, groupName: string): null | string;
31
65
  /**
32
66
  * Checks if a string is a valid regular expression.
33
67
  *
@@ -0,0 +1,289 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function initCjs() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ const globalThisRecord = globalThis;
9
+ globalThisRecord['__name'] ??= name;
10
+ const originalRequire = require;
11
+ if (originalRequire && !originalRequire.__isPatched) {
12
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
13
+ require = Object.assign(
14
+ (id) => requirePatched(id),
15
+ originalRequire,
16
+ {
17
+ __isPatched: true
18
+ }
19
+ );
20
+ }
21
+
22
+ const newFuncs = {
23
+ __extractDefault() {
24
+ return extractDefault;
25
+ },
26
+ process() {
27
+ const browserProcess = {
28
+ browser: true,
29
+ cwd() {
30
+ return '/';
31
+ },
32
+ env: {},
33
+ platform: 'android'
34
+ };
35
+ return browserProcess;
36
+ }
37
+ };
38
+
39
+ for (const key of Object.keys(newFuncs)) {
40
+ globalThisRecord[key] ??= newFuncs[key]?.();
41
+ }
42
+
43
+ function name(obj) {
44
+ return obj;
45
+ }
46
+
47
+ function extractDefault(module) {
48
+ return module && module.__esModule && 'default' in module ? module.default : module;
49
+ }
50
+
51
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
+ 'obsidian',
53
+ '@codemirror/autocomplete',
54
+ '@codemirror/collab',
55
+ '@codemirror/commands',
56
+ '@codemirror/language',
57
+ '@codemirror/lint',
58
+ '@codemirror/search',
59
+ '@codemirror/state',
60
+ '@codemirror/text',
61
+ '@codemirror/view',
62
+ '@lezer/common',
63
+ '@lezer/lr',
64
+ '@lezer/highlight'];
65
+
66
+
67
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
68
+ '@codemirror/closebrackets',
69
+ '@codemirror/comment',
70
+ '@codemirror/fold',
71
+ '@codemirror/gutter',
72
+ '@codemirror/highlight',
73
+ '@codemirror/history',
74
+ '@codemirror/matchbrackets',
75
+ '@codemirror/panel',
76
+ '@codemirror/rangeset',
77
+ '@codemirror/rectangular-selection',
78
+ '@codemirror/stream-parser',
79
+ '@codemirror/tooltip'];
80
+
81
+
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+
87
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
88
+ if (globalThis.app.isMobile) {
89
+ if (id === 'process' || id === 'node:process') {
90
+ // eslint-disable-next-line no-console -- Valid usage.
91
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
+ return globalThis.process;
94
+ }
95
+ } else {
96
+ const module = originalRequire?.(id);
97
+ if (module) {
98
+ return extractDefault(module);
99
+ }
100
+ }
101
+
102
+ // eslint-disable-next-line no-console -- Valid usage.
103
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
104
+ return {};
105
+ }
106
+ })();
107
+
108
+ "use strict";
109
+ var __defProp = Object.defineProperty;
110
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
111
+ var __getOwnPropNames = Object.getOwnPropertyNames;
112
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
113
+ var __export = (target, all) => {
114
+ for (var name in all)
115
+ __defProp(target, name, { get: all[name], enumerable: true });
116
+ };
117
+ var __copyProps = (to, from, except, desc) => {
118
+ if (from && typeof from === "object" || typeof from === "function") {
119
+ for (let key of __getOwnPropNames(from))
120
+ if (!__hasOwnProp.call(to, key) && key !== except)
121
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
122
+ }
123
+ return to;
124
+ };
125
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
+ var demo_vault_coverage_exports = {};
127
+ __export(demo_vault_coverage_exports, {
128
+ DemoVaultCoverageChecker: () => DemoVaultCoverageChecker,
129
+ registerDemoVaultCoverageSuite: () => registerDemoVaultCoverageSuite
130
+ });
131
+ module.exports = __toCommonJS(demo_vault_coverage_exports);
132
+ var import_node_fs = require('node:fs');
133
+ var import_vitest = require('vitest');
134
+ var import_obsidian_plugin_repo_paths = require('../obsidian/plugin/obsidian-plugin-repo-paths.cjs');
135
+ var import_path = require('../path.cjs');
136
+ var import_reg_exp = require('../reg-exp.cjs');
137
+ class DemoVaultCoverageChecker {
138
+ cachedCorpus = null;
139
+ demoVaultFolder;
140
+ rootFolder;
141
+ /**
142
+ * Creates a checker rooted at a plugin repo.
143
+ *
144
+ * @param params - The parameters for the constructor.
145
+ */
146
+ constructor(params) {
147
+ this.rootFolder = params.rootFolder;
148
+ this.demoVaultFolder = (0, import_path.join)(this.rootFolder, import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.DemoVault);
149
+ }
150
+ /**
151
+ * Collects the demo notes as paths relative to the demo vault folder (for a non-trivial-surface guard).
152
+ *
153
+ * @returns The relative paths of every `*.md` note in the demo vault.
154
+ */
155
+ collectDemoNoteRelativePaths() {
156
+ return this.collectMarkdownFiles(this.demoVaultFolder).map((file) => (0, import_path.relative)(this.demoVaultFolder, file));
157
+ }
158
+ /**
159
+ * Finds members that the demo notes reference on a receiver but that no longer exist on it (rename drift).
160
+ *
161
+ * @param params - The parameters for the lookup.
162
+ * @returns The distinct stale member names referenced in the demo corpus.
163
+ */
164
+ findStaleReferences(params) {
165
+ const validMembers = new Set(params.validMembers);
166
+ const referenced = [...this.readCorpus().matchAll(new RegExp(`${params.receiver}\\.(?<member>\\w+)`, "g"))].map((match) => (0, import_reg_exp.getMandatoryNamedGroup)(match, "member"));
167
+ return [...new Set(referenced)].filter((member) => !validMembers.has(member));
168
+ }
169
+ /**
170
+ * Finds members that are not demonstrated anywhere in the demo corpus.
171
+ *
172
+ * @param params - The parameters for the lookup.
173
+ * @returns The member names with no demonstration.
174
+ */
175
+ findUndemonstratedMembers(params) {
176
+ const corpus = this.readCorpus();
177
+ return params.members.filter((member) => {
178
+ const needle = params.receiver === void 0 ? member : `${params.receiver}.${member}`;
179
+ return !corpus.includes(needle);
180
+ });
181
+ }
182
+ /**
183
+ * Finds feature docs that no demo note links to.
184
+ *
185
+ * @param params - The parameters for the lookup.
186
+ * @returns The feature-doc basenames (without `.md`) not linked from any demo note.
187
+ */
188
+ findUnlinkedFeatureDocs(params) {
189
+ const nonFeatureDocs = new Set(params.nonFeatureDocs);
190
+ const featureDocs = (0, import_node_fs.readdirSync)((0, import_path.join)(this.rootFolder, params.docsFolder)).filter((file) => file.endsWith(".md")).map((file) => file.replace(/\.md$/, "")).filter((name) => !nonFeatureDocs.has(name));
191
+ const linkedDocs = new Set(
192
+ [...this.readCorpus().matchAll(/docs\/(?<doc>[\w-]+)\.md/g)].map((match) => (0, import_reg_exp.getMandatoryNamedGroup)(match, "doc"))
193
+ );
194
+ return featureDocs.filter((doc) => !linkedDocs.has(doc));
195
+ }
196
+ /**
197
+ * Parses the members of an `export interface` declared in a source file.
198
+ *
199
+ * @param params - The parameters for the lookup.
200
+ * @returns The parsed {@link InterfaceMembers}.
201
+ * @throws When the interface cannot be found in the source file.
202
+ */
203
+ getInterfaceMembers(params) {
204
+ const source = (0, import_node_fs.readFileSync)((0, import_path.join)(this.rootFolder, params.sourcePath), "utf-8");
205
+ const match = new RegExp(`export interface ${params.interfaceName} \\{(?<body>[\\s\\S]*?)\\n\\}`).exec(source);
206
+ if (!match) {
207
+ throw new Error(`Could not find interface ${params.interfaceName}`);
208
+ }
209
+ const body = (0, import_reg_exp.getMandatoryNamedGroup)(match, "body");
210
+ const methods = extractMethodNames(body);
211
+ const properties = extractPropertyNames(body);
212
+ return {
213
+ all: [...methods, ...properties],
214
+ methods,
215
+ properties
216
+ };
217
+ }
218
+ /**
219
+ * Reads and caches the demo corpus — every `*.md` note in the demo vault joined into one string.
220
+ *
221
+ * @returns The concatenated demo-note contents.
222
+ */
223
+ readCorpus() {
224
+ this.cachedCorpus ??= this.collectMarkdownFiles(this.demoVaultFolder).map((file) => (0, import_node_fs.readFileSync)(file, "utf-8")).join("\n");
225
+ return this.cachedCorpus;
226
+ }
227
+ collectMarkdownFiles(folder) {
228
+ const result = [];
229
+ for (const entry of (0, import_node_fs.readdirSync)(folder, { withFileTypes: true })) {
230
+ if (entry.isDirectory()) {
231
+ if (entry.name === import_obsidian_plugin_repo_paths.ObsidianPluginRepoPaths.NodeModules) {
232
+ continue;
233
+ }
234
+ result.push(...this.collectMarkdownFiles((0, import_path.join)(folder, entry.name)));
235
+ } else if (entry.name.endsWith(".md")) {
236
+ result.push((0, import_path.join)(folder, entry.name));
237
+ }
238
+ }
239
+ return result;
240
+ }
241
+ }
242
+ function registerDemoVaultCoverageSuite(params) {
243
+ const checker = new DemoVaultCoverageChecker({ rootFolder: params.rootFolder });
244
+ (0, import_vitest.describe)("demo-vault coverage", () => {
245
+ for (const spec of params.interfaces) {
246
+ (0, import_vitest.it)(`demonstrates every ${spec.interfaceName} ${spec.kind}`, () => {
247
+ const members = checker.getInterfaceMembers(spec);
248
+ const demonstrated = members[spec.kind];
249
+ (0, import_vitest.expect)(demonstrated.length).toBeGreaterThan(0);
250
+ (0, import_vitest.expect)(checker.findUndemonstratedMembers({ members: demonstrated, receiver: spec.receiver })).toEqual([]);
251
+ });
252
+ (0, import_vitest.it)(`references no ${spec.interfaceName} member that no longer exists`, () => {
253
+ const members = checker.getInterfaceMembers(spec);
254
+ (0, import_vitest.expect)(checker.findStaleReferences({ receiver: spec.receiver, validMembers: members.all })).toEqual([]);
255
+ });
256
+ }
257
+ for (const spec of params.configInterfaces) {
258
+ (0, import_vitest.it)(`demonstrates every ${spec.interfaceName} option`, () => {
259
+ const members = checker.getInterfaceMembers(spec);
260
+ (0, import_vitest.expect)(members.properties.length).toBeGreaterThan(0);
261
+ (0, import_vitest.expect)(checker.findUndemonstratedMembers({ members: members.properties })).toEqual([]);
262
+ });
263
+ }
264
+ const docs = params.docs;
265
+ if (docs) {
266
+ (0, import_vitest.it)("links a demo note for every feature doc", () => {
267
+ (0, import_vitest.expect)(checker.findUnlinkedFeatureDocs({ docsFolder: docs.folder, nonFeatureDocs: docs.nonFeatureDocs })).toEqual([]);
268
+ });
269
+ }
270
+ (0, import_vitest.it)("keeps the reflected surface non-trivial", () => {
271
+ const guard = params.nonTrivialGuard;
272
+ const members = checker.getInterfaceMembers(guard);
273
+ (0, import_vitest.expect)(members.all).toContain(guard.expectMember);
274
+ (0, import_vitest.expect)(checker.collectDemoNoteRelativePaths()).toContain(guard.expectDemoNote);
275
+ });
276
+ });
277
+ }
278
+ function extractMethodNames(interfaceBody) {
279
+ return [...interfaceBody.matchAll(/^ {2}(?<name>\w+)(?:<[^>]*>)?\(/gm)].map((match) => (0, import_reg_exp.getMandatoryNamedGroup)(match, "name"));
280
+ }
281
+ function extractPropertyNames(interfaceBody) {
282
+ return [...interfaceBody.matchAll(/^ {2}(?<name>\w+)\??:/gm)].map((match) => (0, import_reg_exp.getMandatoryNamedGroup)(match, "name"));
283
+ }
284
+ // Annotate the CommonJS export names for ESM import in node:
285
+ 0 && (module.exports = {
286
+ DemoVaultCoverageChecker,
287
+ registerDemoVaultCoverageSuite
288
+ });
289
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogU3RhdGljIGNvdmVyYWdlL2ZyZXNobmVzcyBjaGVja3MgdGhhdCBrZWVwIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQSBwbHVnaW4gY2FuIHNoaXAgYSBjdXJhdGVkIGRlbW8gdmF1bHQgYXQgYGRlbW8tdmF1bHQvYCBpbiBpdHMgcmVwbyByb290LiBUaGVzZSBoZWxwZXJzIHJlZmxlY3QgdGhlIHJlYWxcbiAqIHB1YmxpYyBBUEkvY29uZmlnL2RvY3Mgc3RyYWlnaHQgZnJvbSBzb3VyY2UgYW5kIGFzc2VydCBcdTIwMTQgV0lUSE9VVCBsYXVuY2hpbmcgT2JzaWRpYW4gXHUyMDE0IHRoYXQgZXZlcnkgZmVhdHVyZSBpc1xuICogZGVtb25zdHJhdGVkIGluIHRoZSBub3RlcyBhbmQgdGhhdCB0aGUgbm90ZXMgcmVmZXJlbmNlIG5vIEFQSSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzIChyZW5hbWUgZHJpZnQpLlxuICogVGhlIHJ1bnRpbWUgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbiBpcyBjb3ZlcmVkIGJ5IGl0cyBvdGhlciBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IGJ5IHRoZSBkZW1vIHZhdWx0OyB0aGVcbiAqIHZhdWx0IGlzIGEgbGVhcm5pbmcgcmVzb3VyY2UsIGFuZCB0aGVzZSBjaGVja3Mgb25seSBndWFyZCB0aGF0IGl0IHN0YXlzIHRydXRoZnVsLlxuICpcbiAqIFR3byBsYXllcnMgYXJlIGV4cG9zZWQ6XG4gKiAtIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9IFx1MjAxNCBhIGZyYW1ld29yay1hZ25vc3RpYyBjb3JlIHRoYXQgcmVhZHMgdGhlIGNvcnB1cywgcGFyc2VzIGludGVyZmFjZVxuICogICBtZW1iZXJzLCBhbmQgcmV0dXJucyBkaWFnbm9zdGljIGFycmF5cyAod2hhdCBpcyB1bmRlbW9uc3RyYXRlZCAvIHN0YWxlIC8gdW5saW5rZWQpLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSBcdTIwMTQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuL3BsdWdpbi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAgfSBmcm9tICcuLi9yZWctZXhwLnRzJztcblxuLyoqXG4gKiBSZWZsZWN0cyBhIGNvbmZpZyBpbnRlcmZhY2Ugd2hvc2Ugb3B0aW9ucyBhcmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb25maWdJbnRlcmZhY2VDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSB0aGUgY29uZmlnIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdCBcdTIwMTQgdGhlIGZvbGRlciBjb250YWluaW5nIGBkZW1vLXZhdWx0L2AgYW5kIHRoZSBzb3VyY2UgYmVpbmdcbiAgICogcmVmbGVjdGVkLiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgd2hvc2UgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzIGFyZSBzY2FubmVkIGZvciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVycyB0aGF0IGN1cnJlbnRseSBleGlzdCBvbiB0aGUgcmVjZWl2ZXI7IGFueSByZWZlcmVuY2VkIG1lbWJlciBub3QgaW4gdGhpcyBzZXQgaXMgc3RhbGUuXG4gICAqL1xuICByZWFkb25seSB2YWxpZE1lbWJlcnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1lbWJlciBuYW1lcyB0aGF0IG11c3QgZWFjaCBhcHBlYXIgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBhIG1lbWJlciBpcyBkZW1vbnN0cmF0ZWQgb25seSBpZiBgYCBgJHtyZWNlaXZlcn0uJHttZW1iZXJ9YCBgYCBhcHBlYXJzIChlLmcuIGEgY29udGV4dCBvYmplY3Qnc1xuICAgKiBtZXRob2RzKTsgd2hlbiBhYnNlbnQsIHRoZSBiYXJlIG1lbWJlciBuYW1lIGlzIGxvb2tlZCB1cCAoZS5nLiBhIGNvbmZpZyBvcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVubGlua2VkRmVhdHVyZURvY3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3NGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAgdG8gcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHREb2NzQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgc2luZ2xlIGludGVyZmFjZSdzIG1lbWJlcnMgYW5kIGRlbW9uc3RyYXRlcyB0aGVtIHZpYSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAgdG8gcmVmbGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIHRoZSBpbnRlcmZhY2UncyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogRGVtb1ZhdWx0SW50ZXJmYWNlTWVtYmVyS2luZDtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgdGhlIG5vdGVzIGNhbGwgdGhlIG1lbWJlcnMgb24gKGUuZy4gYGNvZGVCdXR0b25Db250ZXh0YCkuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gaW50ZXJmYWNlJ3MgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIGl0cyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kID0gJ21ldGhvZHMnIHwgJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGd1YXJkIHRoYXQgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIGlzIG5vbi10cml2aWFsIChwcm90ZWN0cyBhZ2FpbnN0IGEgcGFyc2luZyByZWdyZXNzaW9uXG4gKiBzaWxlbnRseSBlbXB0eWluZyBldmVyeSBvdGhlciBjaGVjaykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYyB7XG4gIC8qKlxuICAgKiBBIGRlbW8gbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBtdXN0IGJlIHByZXNlbnQuXG4gICAqL1xuICByZWFkb25seSBleHBlY3REZW1vTm90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG1lbWJlciB0aGF0IG11c3QgYmUgcmVmbGVjdGVkIGZyb20ge0BsaW5rIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMuaW50ZXJmYWNlTmFtZX0uXG4gICAqL1xuICByZWFkb25seSBleHBlY3RNZW1iZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCB3aG9zZSBtZW1iZXJzIGFyZSByZS1wYXJzZWQgZm9yIHRoZSBndWFyZC5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyc2VkIG1lbWJlcnMgb2YgYSBzb3VyY2UgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZU1lbWJlcnMge1xuICAvKipcbiAgICogRXZlcnkgbWVtYmVyIFx1MjAxNCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5tZXRob2RzfSBmb2xsb3dlZCBieSB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5wcm9wZXJ0aWVzfS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWUoLi4uKWApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZT86IC4uLmApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmlnIGludGVyZmFjZXMgd2hvc2Ugb3B0aW9ucyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ0ludGVyZmFjZXM6IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcmZhY2VzIHdob3NlIG1lbWJlcnMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZCAoYW5kIHJlZmVyZW5jZWQgd2l0aG91dCBkcmlmdCkuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VzOiBEZW1vVmF1bHRJbnRlcmZhY2VDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGd1YXJkIHRoYXQga2VlcHMgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIG5vbi10cml2aWFsLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uVHJpdmlhbEd1YXJkOiBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgcGx1Z2luJ3MgcHVibGljIHN1cmZhY2UgZnJvbSBzb3VyY2UgYW5kIGNoZWNrcyBpdHMgaW4tcmVwbyBgZGVtby12YXVsdC9gIHN0YXlzIGluIHN5bmMgd2l0aCBpdC5cbiAqXG4gKiBFdmVyeSBtZXRob2QgaXMgYSBwdXJlIHF1ZXJ5IG92ZXIgZmlsZXMgdW5kZXIgdGhlIHJlcG8gcm9vdCAodGhlIGRlbW8gY29ycHVzIGlzIHJlYWQgb25jZSBhbmQgY2FjaGVkKSwgc29cbiAqIHRoZSBjaGVja2VyIGlzIHRyaXZpYWxseSB1bml0LXRlc3RhYmxlIGFnYWluc3QgYSBmaXh0dXJlIHJlcG8gYW5kIGNhcnJpZXMgbm8gdGVzdC1mcmFtZXdvcmsgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlciB7XG4gIHByaXZhdGUgY2FjaGVkQ29ycHVzOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZW1vVmF1bHRGb2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjaGVja2VyIHJvb3RlZCBhdCBhIHBsdWdpbiByZXBvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5yb290Rm9sZGVyID0gcGFyYW1zLnJvb3RGb2xkZXI7XG4gICAgdGhpcy5kZW1vVmF1bHRGb2xkZXIgPSBqb2luKHRoaXMucm9vdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgZGVtbyBub3RlcyBhcyBwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIgKGZvciBhIG5vbi10cml2aWFsLXN1cmZhY2UgZ3VhcmQpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQuXG4gICAqL1xuICBwdWJsaWMgY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXModGhpcy5kZW1vVmF1bHRGb2xkZXIpLm1hcCgoZmlsZSkgPT4gcmVsYXRpdmUodGhpcy5kZW1vVmF1bHRGb2xkZXIsIGZpbGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgdGhlIGRlbW8gbm90ZXMgcmVmZXJlbmNlIG9uIGEgcmVjZWl2ZXIgYnV0IHRoYXQgbm8gbG9uZ2VyIGV4aXN0IG9uIGl0IChyZW5hbWUgZHJpZnQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBzdGFsZSBtZW1iZXIgbmFtZXMgcmVmZXJlbmNlZCBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFN0YWxlUmVmZXJlbmNlcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRTdGFsZVJlZmVyZW5jZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsaWRNZW1iZXJzID0gbmV3IFNldChwYXJhbXMudmFsaWRNZW1iZXJzKTtcbiAgICBjb25zdCByZWZlcmVuY2VkID0gWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKG5ldyBSZWdFeHAoYCR7cGFyYW1zLnJlY2VpdmVyfVxcXFwuKD88bWVtYmVyPlxcXFx3KylgLCAnZycpKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbWVtYmVyJykpO1xuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWZlcmVuY2VkKV0uZmlsdGVyKChtZW1iZXIpID0+ICF2YWxpZE1lbWJlcnMuaGFzKG1lbWJlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCBhcmUgbm90IGRlbW9uc3RyYXRlZCBhbnl3aGVyZSBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIG1lbWJlciBuYW1lcyB3aXRoIG5vIGRlbW9uc3RyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29ycHVzID0gdGhpcy5yZWFkQ29ycHVzKCk7XG4gICAgcmV0dXJuIHBhcmFtcy5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZWVkbGUgPSBwYXJhbXMucmVjZWl2ZXIgPT09IHVuZGVmaW5lZCA/IG1lbWJlciA6IGAke3BhcmFtcy5yZWNlaXZlcn0uJHttZW1iZXJ9YDtcbiAgICAgIHJldHVybiAhY29ycHVzLmluY2x1ZGVzKG5lZWRsZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgZmVhdHVyZSBkb2NzIHRoYXQgbm8gZGVtbyBub3RlIGxpbmtzIHRvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBmZWF0dXJlLWRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIG5vdCBsaW5rZWQgZnJvbSBhbnkgZGVtbyBub3RlLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9uRmVhdHVyZURvY3MgPSBuZXcgU2V0KHBhcmFtcy5ub25GZWF0dXJlRG9jcyk7XG4gICAgY29uc3QgZmVhdHVyZURvY3MgPSByZWFkZGlyU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLmRvY3NGb2xkZXIpKVxuICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpXG4gICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnJlcGxhY2UoL1xcLm1kJC8sICcnKSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFub25GZWF0dXJlRG9jcy5oYXMobmFtZSkpO1xuICAgIGNvbnN0IGxpbmtlZERvY3MgPSBuZXcgU2V0KFxuICAgICAgWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKC9kb2NzXFwvKD88ZG9jPltcXHctXSspXFwubWQvZyldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdkb2MnKSlcbiAgICApO1xuICAgIHJldHVybiBmZWF0dXJlRG9jcy5maWx0ZXIoKGRvYykgPT4gIWxpbmtlZERvY3MuaGFzKGRvYykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbWVtYmVycyBvZiBhbiBgZXhwb3J0IGludGVyZmFjZWAgZGVjbGFyZWQgaW4gYSBzb3VyY2UgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgcGFyc2VkIHtAbGluayBJbnRlcmZhY2VNZW1iZXJzfS5cbiAgICogQHRocm93cyBXaGVuIHRoZSBpbnRlcmZhY2UgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJbnRlcmZhY2VNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyk6IEludGVyZmFjZU1lbWJlcnMge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLnNvdXJjZVBhdGgpLCAndXRmLTgnKTtcbiAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoYGV4cG9ydCBpbnRlcmZhY2UgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX0gXFxcXHsoPzxib2R5PltcXFxcc1xcXFxTXSo/KVxcXFxuXFxcXH1gKS5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBpbnRlcmZhY2UgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgYm9keSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdib2R5Jyk7XG4gICAgY29uc3QgbWV0aG9kcyA9IGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbDogWy4uLm1ldGhvZHMsIC4uLnByb3BlcnRpZXNdLFxuICAgICAgbWV0aG9kcyxcbiAgICAgIHByb3BlcnRpZXNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgdGhlIGRlbW8gY29ycHVzIFx1MjAxNCBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCBqb2luZWQgaW50byBvbmUgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29uY2F0ZW5hdGVkIGRlbW8tbm90ZSBjb250ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkQ29ycHVzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5jYWNoZWRDb3JwdXMgPz89IHRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXModGhpcy5kZW1vVmF1bHRGb2xkZXIpXG4gICAgICAubWFwKChmaWxlKSA9PiByZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkQ29ycHVzO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0TWFya2Rvd25GaWxlcyhmb2xkZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhmb2xkZXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk5vZGVNb2R1bGVzIGFzIHN0cmluZykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXMoam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKSk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSB0aGF0IGtlZXBzIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQ2FsbCBpdCBvbmNlIGZyb20gYSBwbHVnaW4ncyBgZGVtby12YXVsdC5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50c2A7IGl0IHJlZ2lzdGVycyBvbmUgdGVzdCBwZXIgY2hlY2ssXG4gKiBkZWxlZ2F0aW5nIHRvIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGVjbGFyYXRpdmUgY292ZXJhZ2Ugc3BlY2lmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZShwYXJhbXM6IFJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCBjaGVja2VyID0gbmV3IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcih7IHJvb3RGb2xkZXI6IHBhcmFtcy5yb290Rm9sZGVyIH0pO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGNvdmVyYWdlJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuaW50ZXJmYWNlcykge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gJHtzcGVjLmtpbmR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBjb25zdCBkZW1vbnN0cmF0ZWQgPSBtZW1iZXJzW3NwZWMua2luZF07XG4gICAgICAgIGV4cGVjdChkZW1vbnN0cmF0ZWQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBkZW1vbnN0cmF0ZWQsIHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgcmVmZXJlbmNlcyBubyAke3NwZWMuaW50ZXJmYWNlTmFtZX0gbWVtYmVyIHRoYXQgbm8gbG9uZ2VyIGV4aXN0c2AsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhzcGVjKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlcyh7IHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyLCB2YWxpZE1lbWJlcnM6IG1lbWJlcnMuYWxsIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuY29uZmlnSW50ZXJmYWNlcykge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gb3B0aW9uYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5wcm9wZXJ0aWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogbWVtYmVycy5wcm9wZXJ0aWVzIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY3MgPSBwYXJhbXMuZG9jcztcbiAgICBpZiAoZG9jcykge1xuICAgICAgaXQoJ2xpbmtzIGEgZGVtbyBub3RlIGZvciBldmVyeSBmZWF0dXJlIGRvYycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVubGlua2VkRmVhdHVyZURvY3MoeyBkb2NzRm9sZGVyOiBkb2NzLmZvbGRlciwgbm9uRmVhdHVyZURvY3M6IGRvY3Mubm9uRmVhdHVyZURvY3MgfSkpXG4gICAgICAgICAgLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXQoJ2tlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGd1YXJkID0gcGFyYW1zLm5vblRyaXZpYWxHdWFyZDtcbiAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoZ3VhcmQpO1xuICAgICAgZXhwZWN0KG1lbWJlcnMuYWxsKS50b0NvbnRhaW4oZ3VhcmQuZXhwZWN0TWVtYmVyKTtcbiAgICAgIGV4cGVjdChjaGVja2VyLmNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKSkudG9Db250YWluKGd1YXJkLmV4cGVjdERlbW9Ob3RlKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RNZXRob2ROYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uaW50ZXJmYWNlQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm9wZXJ0eU5hbWVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KylcXD8/Oi9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrQkEscUJBR087QUFDUCxvQkFJTztBQUVQLHdDQUF3QztBQUN4QyxrQkFHTztBQUNQLHFCQUF1QztBQXdOaEMsTUFBTSx5QkFBeUI7QUFBQSxFQUM1QixlQUE4QjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBbUQ7QUFDcEUsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxzQkFBa0Isa0JBQUssS0FBSyxZQUFZLDBEQUF3QixTQUFTO0FBQUEsRUFDaEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTywrQkFBeUM7QUFDOUMsV0FBTyxLQUFLLHFCQUFxQixLQUFLLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBUyxzQkFBUyxLQUFLLGlCQUFpQixJQUFJLENBQUM7QUFBQSxFQUMzRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sb0JBQW9CLFFBQXFFO0FBQzlGLFVBQU0sZUFBZSxJQUFJLElBQUksT0FBTyxZQUFZO0FBQ2hELFVBQU0sYUFBYSxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUUsU0FBUyxJQUFJLE9BQU8sR0FBRyxPQUFPLFFBQVEsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLEVBQ3ZHLElBQUksQ0FBQyxjQUFVLHVDQUF1QixPQUFPLFFBQVEsQ0FBQztBQUN6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