obsidian-dev-utils 97.0.0 → 99.0.0

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 (143) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +1 -1
  3. package/dist/integration-test-plugin/main.js +686 -439
  4. package/dist/lib/cjs/__merged.cjs +22 -9
  5. package/dist/lib/cjs/__merged.d.cts +4 -3
  6. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +36 -1
  8. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +21 -0
  9. package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.cjs +20 -6
  10. package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.d.cts +26 -4
  11. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
  12. package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
  13. package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
  14. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -5
  15. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +10 -8
  16. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
  17. package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
  18. package/dist/lib/cjs/obsidian/file-change.cjs +6 -6
  19. package/dist/lib/cjs/obsidian/index.cjs +10 -1
  20. package/dist/lib/cjs/obsidian/index.d.cts +3 -0
  21. package/dist/lib/cjs/obsidian/link.cjs +33 -6
  22. package/dist/lib/cjs/obsidian/link.d.cts +35 -0
  23. package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
  24. package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
  25. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  26. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
  27. package/dist/lib/cjs/obsidian/reference.cjs +9 -1
  28. package/dist/lib/cjs/obsidian/reference.d.cts +33 -0
  29. package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
  30. package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
  31. package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
  32. package/dist/lib/cjs/obsidian/validation.cjs +22 -3
  33. package/dist/lib/cjs/obsidian/validation.d.cts +37 -0
  34. package/dist/lib/cjs/obsidian/vault.cjs +4 -1
  35. package/dist/lib/cjs/obsidian/vault.d.cts +8 -1
  36. package/dist/lib/cjs/script-utils/build.cjs +30 -6
  37. package/dist/lib/cjs/script-utils/build.d.cts +5 -0
  38. package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
  39. package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
  40. package/dist/lib/cjs/script-utils/exec.cjs +1 -1
  41. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
  42. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  43. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  44. package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
  45. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
  46. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
  47. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
  48. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
  49. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
  50. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
  51. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
  52. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
  53. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
  54. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
  55. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
  56. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
  57. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
  58. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
  59. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
  60. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
  61. package/dist/lib/cjs/script-utils/nano-staged-config.cjs +7 -5
  62. package/dist/lib/cjs/script-utils/nano-staged-config.d.cts +5 -2
  63. package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
  64. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
  65. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
  66. package/dist/lib/cjs/script-utils/package-manager.cjs +370 -0
  67. package/dist/lib/cjs/script-utils/package-manager.d.cts +93 -0
  68. package/dist/lib/cjs/script-utils/version.cjs +21 -9
  69. package/dist/lib/esm/__merged.d.mts +4 -3
  70. package/dist/lib/esm/__merged.mjs +24 -10
  71. package/dist/lib/esm/generated-during-build.mjs +1 -1
  72. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +21 -0
  73. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +36 -1
  74. package/dist/lib/esm/obsidian/components/plugin-suggestion-component.d.mts +26 -4
  75. package/dist/lib/esm/obsidian/components/plugin-suggestion-component.mjs +20 -6
  76. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
  77. package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
  78. package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
  79. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +10 -8
  80. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +14 -5
  81. package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
  82. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
  83. package/dist/lib/esm/obsidian/file-change.mjs +6 -6
  84. package/dist/lib/esm/obsidian/index.d.mts +3 -0
  85. package/dist/lib/esm/obsidian/index.mjs +7 -1
  86. package/dist/lib/esm/obsidian/link.d.mts +35 -0
  87. package/dist/lib/esm/obsidian/link.mjs +38 -7
  88. package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
  89. package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
  90. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
  91. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  92. package/dist/lib/esm/obsidian/reference.d.mts +33 -0
  93. package/dist/lib/esm/obsidian/reference.mjs +8 -1
  94. package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
  95. package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
  96. package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
  97. package/dist/lib/esm/obsidian/validation.d.mts +37 -0
  98. package/dist/lib/esm/obsidian/validation.mjs +21 -2
  99. package/dist/lib/esm/obsidian/vault.d.mts +8 -1
  100. package/dist/lib/esm/obsidian/vault.mjs +4 -1
  101. package/dist/lib/esm/script-utils/build.d.mts +5 -0
  102. package/dist/lib/esm/script-utils/build.mjs +30 -6
  103. package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
  104. package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
  105. package/dist/lib/esm/script-utils/exec.mjs +1 -1
  106. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
  107. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  108. package/dist/lib/esm/script-utils/index.mjs +3 -1
  109. package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
  110. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
  111. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
  112. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
  113. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
  114. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
  115. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
  116. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
  117. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
  118. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
  119. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
  120. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
  121. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
  122. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
  123. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
  124. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
  125. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
  126. package/dist/lib/esm/script-utils/nano-staged-config.d.mts +5 -2
  127. package/dist/lib/esm/script-utils/nano-staged-config.mjs +7 -5
  128. package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
  129. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
  130. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
  131. package/dist/lib/esm/script-utils/package-manager.d.mts +93 -0
  132. package/dist/lib/esm/script-utils/package-manager.mjs +256 -0
  133. package/dist/lib/esm/script-utils/version.mjs +21 -9
  134. package/obsidian/demo-vault-naming/package.json +6 -0
  135. package/obsidian/mobile-trusted-input/package.json +6 -0
  136. package/obsidian/trusted-input/package.json +6 -0
  137. package/package.json +19 -17
  138. package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
  139. package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
  140. package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
  141. package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
  142. package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
  143. package/script-utils/package-manager/package.json +6 -0
@@ -23,7 +23,12 @@ export declare function buildCompile(): Promise<void>;
23
23
  /**
24
24
  * Compiles the Svelte code.
25
25
  *
26
+ * The project's Svelte files are found by globbing the Svelte extensions directly. Globbing the tsconfig
27
+ * `include` patterns and filtering that list would never match: `include` lists TypeScript globs
28
+ * (`./src/**\/*.ts`, …), so no `.svelte` path can ever appear in it and the check would always be skipped.
29
+ *
26
30
  * @returns A {@link Promise} that resolves when the code compiles successfully.
31
+ * @throws If the project has Svelte files but does not declare `svelte-check`.
27
32
  */
28
33
  export declare function buildCompileSvelte(): Promise<void>;
29
34
  /**
@@ -61,7 +61,9 @@ import {
61
61
  npmRunOptional,
62
62
  NpmRunOptionalResult
63
63
  } from "./npm-run.mjs";
64
+ import { readPackageJson } from "./npm.mjs";
64
65
  import { ObsidianDevUtilsRepoPaths } from "./obsidian-dev-utils-repo-paths.mjs";
66
+ import { resolveToolCommand } from "./package-manager.mjs";
65
67
  import {
66
68
  execFromRoot,
67
69
  getRootFolder,
@@ -81,16 +83,25 @@ async function buildCompile() {
81
83
  async function buildCompileSvelte() {
82
84
  const tsConfigPath = resolvePathFromRootSafe({ path: ObsidianDevUtilsRepoPaths.TsConfigJson });
83
85
  const tsConfig = await readJson(tsConfigPath);
84
- const allFiles = await toArray(glob(tsConfig.include ?? [], { exclude: tsConfig.exclude ?? [] }));
85
- const svelteFiles = allFiles.filter((file) => file.endsWith(".svelte") || file.endsWith(".svelte.js") || file.endsWith(".svelte.ts"));
86
- if (svelteFiles.length === 0) {
86
+ const svelteFiles = await toArray(glob(SVELTE_FILE_PATTERNS, {
87
+ cwd: resolvePathFromRootSafe({ path: ObsidianDevUtilsRepoPaths.CurrentFolder }),
88
+ exclude: [...SVELTE_FILE_EXCLUDE_PATTERNS, ...tsConfig.exclude ?? []]
89
+ }));
90
+ const [firstSvelteFile] = svelteFiles;
91
+ if (firstSvelteFile === void 0) {
87
92
  getLibDebugger("build:buildCompileSvelte")("No Svelte files found in the project, skipping Svelte compilation");
88
93
  return;
89
94
  }
90
- await execFromRoot(["npx", "svelte-check", "--tsconfig", ObsidianDevUtilsRepoPaths.TsConfigJson]);
95
+ const packageJson = await readPackageJson();
96
+ if (!checkSvelteCheckDeclared(packageJson)) {
97
+ throw new Error(
98
+ `Found Svelte file(s) in the project (e.g. ${firstSvelteFile}), but \`${SVELTE_CHECK_PACKAGE_NAME}\` is not declared in package.json. Add \`${SVELTE_CHECK_PACKAGE_NAME}\` as a devDependency to type-check the Svelte code.`
99
+ );
100
+ }
101
+ await execFromRoot([...resolveToolCommand({ tool: SVELTE_CHECK_PACKAGE_NAME }), "--tsconfig", ObsidianDevUtilsRepoPaths.TsConfigJson]);
91
102
  }
92
103
  async function buildCompileTypeScript() {
93
- await execFromRoot(["npx", "tsc", "--build", "--force"]);
104
+ await execFromRoot([...resolveToolCommand({ tool: "tsc" }), "--build", "--force"]);
94
105
  if (!areProjectTypesValid()) {
95
106
  throw new Error("TypeScript declaration validation failed.");
96
107
  }
@@ -110,6 +121,16 @@ async function buildTemplates() {
110
121
  }
111
122
  const TEMPLATE_FILE_SUFFIX = ".template";
112
123
  const NODE_MODULES_SEGMENT = "/node_modules/";
124
+ const SVELTE_CHECK_PACKAGE_NAME = "svelte-check";
125
+ const SVELTE_FILE_PATTERNS = [
126
+ `${ObsidianDevUtilsRepoPaths.AnyPath}/*.svelte`,
127
+ `${ObsidianDevUtilsRepoPaths.AnyPath}/*.svelte.js`,
128
+ `${ObsidianDevUtilsRepoPaths.AnyPath}/*.svelte.ts`
129
+ ];
130
+ const SVELTE_FILE_EXCLUDE_PATTERNS = [
131
+ `${ObsidianDevUtilsRepoPaths.AnyPath}/${ObsidianDevUtilsRepoPaths.NodeModules}/${ObsidianDevUtilsRepoPaths.AnyPath}`,
132
+ `${ObsidianDevUtilsRepoPaths.AnyPath}/${ObsidianDevUtilsRepoPaths.Dist}/${ObsidianDevUtilsRepoPaths.AnyPath}`
133
+ ];
113
134
  function areProjectTypesValid() {
114
135
  const root = getRootFolder();
115
136
  if (!root) {
@@ -123,6 +144,9 @@ function areProjectTypesValid() {
123
144
  shouldKeepFile: (fileName) => shouldKeepProjectFile({ fileName, rootCanonical })
124
145
  });
125
146
  }
147
+ function checkSvelteCheckDeclared(packageJson) {
148
+ return [packageJson.dependencies, packageJson.devDependencies, packageJson.peerDependencies].some((dependencies) => dependencies?.[SVELTE_CHECK_PACKAGE_NAME] !== void 0);
149
+ }
126
150
  function shouldKeepProjectFile(params) {
127
151
  const { fileName, rootCanonical } = params;
128
152
  return fileName.startsWith(`${rootCanonical}/`) && !fileName.includes(NODE_MODULES_SEGMENT);
@@ -134,4 +158,4 @@ export {
134
158
  buildCompileTypeScript,
135
159
  buildTemplates
136
160
  };
137
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9idWlsZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgYnVpbGQgcHJvY2VzcyBmb3Igc3RhdGljIGFzc2V0cyBhbmQgY2xlYW5pbmdcbiAqIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyLiBJdCBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gY29weSBzdGF0aWMgZmlsZXMgdG8gdGhlIGRpc3RyaWJ1dGlvbiBmb2xkZXJcbiAqIGFuZCB0byByZW1vdmUgdGhlIGV4aXN0aW5nIGJ1aWxkIG91dHB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIGNwLFxuICBnbG9iLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IHsgdG9BcnJheSB9IGZyb20gJy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgdHJpbVN0YXJ0IH0gZnJvbSAnLi4vc3RyaW5nLnRzJztcbmltcG9ydCB7XG4gIGNoZWNrUHJvamVjdFR5cGVzLFxuICBwYXJzZVRzQ29uZmlnLFxuICB0b0Nhbm9uaWNhbFxufSBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyByZWFkSnNvbiB9IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQge1xuICBucG1SdW5PcHRpb25hbCxcbiAgTnBtUnVuT3B0aW9uYWxSZXN1bHRcbn0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi9yb290LnRzJztcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBkaXN0cmlidXRpb24gZm9sZGVyIGFuZCBpdHMgY29udGVudHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkZWxldGVzIHRoZSBlbnRpcmUgZGlzdHJpYnV0aW9uIGZvbGRlciB0byBlbnN1cmUgYSBjbGVhbiBidWlsZCBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbGRlciBoYXMgYmVlbiByZW1vdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGVhbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcm0oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG5cbi8qKlxuICogQ29tcGlsZXMgdGhlIGNvZGUuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb2RlIGNvbXBpbGVzIHN1Y2Nlc3NmdWxseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29tcGlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdidWlsZDpjb21waWxlOnN2ZWx0ZScpID09PSBOcG1SdW5PcHRpb25hbFJlc3VsdC5Ta2lwcGVkKSB7XG4gICAgYXdhaXQgYnVpbGRDb21waWxlU3ZlbHRlKCk7XG4gIH1cbiAgaWYgKGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdidWlsZDpjb21waWxlOnR5cGVzY3JpcHQnKSA9PT0gTnBtUnVuT3B0aW9uYWxSZXN1bHQuU2tpcHBlZCkge1xuICAgIGF3YWl0IGJ1aWxkQ29tcGlsZVR5cGVTY3JpcHQoKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBpbGVzIHRoZSBTdmVsdGUgY29kZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlU3ZlbHRlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0c0NvbmZpZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uIH0pO1xuICBjb25zdCB0c0NvbmZpZyA9IGF3YWl0IHJlYWRKc29uPFRzQ29uZmlnSnNvbj4odHNDb25maWdQYXRoKTtcbiAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0b0FycmF5KGdsb2IodHNDb25maWcuaW5jbHVkZSA/PyBbXSwgeyBleGNsdWRlOiB0c0NvbmZpZy5leGNsdWRlID8/IFtdIH0pKTtcbiAgY29uc3Qgc3ZlbHRlRmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoJy5zdmVsdGUnKSB8fCBmaWxlLmVuZHNXaXRoKCcuc3ZlbHRlLmpzJykgfHwgZmlsZS5lbmRzV2l0aCgnLnN2ZWx0ZS50cycpKTtcblxuICBpZiAoc3ZlbHRlRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ2J1aWxkOmJ1aWxkQ29tcGlsZVN2ZWx0ZScpKCdObyBTdmVsdGUgZmlsZXMgZm91bmQgaW4gdGhlIHByb2plY3QsIHNraXBwaW5nIFN2ZWx0ZSBjb21waWxhdGlvbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25weCcsICdzdmVsdGUtY2hlY2snLCAnLS10c2NvbmZpZycsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uXSk7XG59XG5cbi8qKlxuICogQ29tcGlsZXMgdGhlIFR5cGVTY3JpcHQgY29kZS5cbiAqXG4gKiBUaGUgZ2VuZXJhbCBgdHNjYCBwYXNzIHJ1bnMgd2l0aCBgc2tpcExpYkNoZWNrOiB0cnVlYCAoY29uZmlndXJlZCBpbiBgdHNjb25maWcuanNvbmApIHNvIGl0IGRvZXNcbiAqIG5vdCBmYWlsIG9uIGJyb2tlbiB1cHN0cmVhbSBgLmQudHNgIGZpbGVzIHdlIGRvIG5vdCBjb250cm9sLiBBZnRlcndhcmRzLCB7QGxpbmsgYXJlUHJvamVjdFR5cGVzVmFsaWR9XG4gKiByZS1ydW5zIHRoZSB0eXBlLWNoZWNrIGluLW1lbW9yeSB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCwgcmVwb3J0aW5nIG9ubHkgZGlhZ25vc3RpY3MgZnJvbSB0aGVcbiAqIGZpbGVzIHdlIG93biwgc28gdGhlIGRlY2xhcmF0aW9ucyB3ZSBhdXRob3IgYXJlIHN0aWxsIGZ1bGx5IHZhbGlkYXRlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICogQHRocm93cyBJZiB0aGUgcHJvamVjdCdzIG93biBkZWNsYXJhdGlvbnMgZmFpbCB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlVHlwZVNjcmlwdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsnbnB4JywgJ3RzYycsICctLWJ1aWxkJywgJy0tZm9yY2UnXSk7XG5cbiAgaWYgKCFhcmVQcm9qZWN0VHlwZXNWYWxpZCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkLicpO1xuICB9XG59XG5cbi8qKlxuICogQ29waWVzIGFsbCB0ZW1wbGF0ZSBmaWxlcyBmcm9tIHRoZSB0ZW1wbGF0ZXMgZm9sZGVyIHRvIHRoZSBgdGVtcGxhdGVzYCBmb2xkZXIgd2l0aGluIHRoZVxuICogZGlzdHJpYnV0aW9uIGZvbGRlci5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5IHJlYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgdGVtcGxhdGVzIGZvbGRlciBhbmQgY29waWVzIGVhY2ggZmlsZSB0byB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgcGF0aCB1bmRlciB7QGxpbmsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0VGVtcGxhdGVzfSwgc28gY29uc3VtZXJzIGNhbiBjb3B5IHRoZVxuICogdGVtcGxhdGVzIGZyb20gYG5vZGVfbW9kdWxlcy9vYnNpZGlhbi1kZXYtdXRpbHMvZGlzdC90ZW1wbGF0ZXNgLiBBIHRyYWlsaW5nIGAudGVtcGxhdGVgIG9uIGEgc291cmNlXG4gKiBmaWxlIG5hbWUgaXMgc3RyaXBwZWQgaW4gdGhlIGRlc3RpbmF0aW9uIChlLmcuIGBlc2xpbnQuY29uZmlnLm10cy50ZW1wbGF0ZWAgaXMgY29waWVkIGFzXG4gKiBgZXNsaW50LmNvbmZpZy5tdHNgKSwgc28gYW4gYWN0aXZlIGNvbmZpZyB0ZW1wbGF0ZSBjYW4gbGl2ZSBpbiB0aGUgcmVwbyB1bmRlciBhIG5hbWUgdGhhdCB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgdG9vbCBkb2VzIG5vdCBhdXRvLWRpc2NvdmVyLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgZmlsZXMgaGF2ZSBiZWVuIGNvcGllZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkVGVtcGxhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGRpcmVudCBvZiBhd2FpdCByZWFkZGlyUG9zaXgoT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5UZW1wbGF0ZXMsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSB0cmltU3RhcnQoe1xuICAgICAgJHN0cmluZzogam9pbihkaXJlbnQucGFyZW50UGF0aCwgZGlyZW50Lm5hbWUpLFxuICAgICAgcHJlZml4OiBgJHtPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlRlbXBsYXRlc30vYFxuICAgIH0pO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uUGF0aCA9IHBhdGguZW5kc1dpdGgoVEVNUExBVEVfRklMRV9TVUZGSVgpID8gcGF0aC5zbGljZSgwLCAtVEVNUExBVEVfRklMRV9TVUZGSVgubGVuZ3RoKSA6IHBhdGg7XG4gICAgYXdhaXQgY3Aoam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlRlbXBsYXRlcywgcGF0aCksIGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0VGVtcGxhdGVzLCBkZXN0aW5hdGlvblBhdGgpKTtcbiAgfVxufVxuXG5jb25zdCBURU1QTEFURV9GSUxFX1NVRkZJWCA9ICcudGVtcGxhdGUnO1xuXG5jb25zdCBOT0RFX01PRFVMRVNfU0VHTUVOVCA9ICcvbm9kZV9tb2R1bGVzLyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNob3VsZEtlZXBQcm9qZWN0RmlsZX0uXG4gKi9cbmludGVyZmFjZSBTaG91bGRLZWVwUHJvamVjdEZpbGVQYXJhbXMge1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB1bmRlciBjb25zaWRlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdENhbm9uaWNhbDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlLXJ1bnMgdGhlIHByb2plY3QgdHlwZS1jaGVjayBpbi1tZW1vcnkgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAsIHJlcG9ydGluZyBvbmx5IGRpYWdub3N0aWNzXG4gKiB3aG9zZSBzb3VyY2UgZmlsZSBiZWxvbmdzIHRvIHRoZSBwcm9qZWN0ICh1bmRlciB0aGUgcm9vdCBmb2xkZXIsIG91dHNpZGUgYG5vZGVfbW9kdWxlc2ApLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBwcm9qZWN0J3Mgb3duIGZpbGVzIGhhdmUgbm8gdHlwZSBlcnJvcnMsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHRocm93cyBJZiB0aGUgcm9vdCBmb2xkZXIgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiBhcmVQcm9qZWN0VHlwZXNWYWxpZCgpOiBib29sZWFuIHtcbiAgY29uc3Qgcm9vdCA9IGdldFJvb3RGb2xkZXIoKTtcblxuICBpZiAoIXJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHJvb3QgZm9sZGVyJyk7XG4gIH1cblxuICBjb25zdCByb290Q2Fub25pY2FsID0gdG9DYW5vbmljYWwocm9vdCk7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKGpvaW4ocm9vdCwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5Uc0NvbmZpZ0pzb24pKTtcblxuICByZXR1cm4gY2hlY2tQcm9qZWN0VHlwZXMoe1xuICAgIG9wdGlvbnMsXG4gICAgcm9vdE5hbWVzOiBmaWxlTmFtZXMsXG4gICAgc2hvdWxkS2VlcEZpbGU6IChmaWxlTmFtZSkgPT4gc2hvdWxkS2VlcFByb2plY3RGaWxlKHsgZmlsZU5hbWUsIHJvb3RDYW5vbmljYWwgfSlcbiAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZmlsZSBiZWxvbmdzIHRvIHRoZSBwcm9qZWN0ICh1bmRlciB0aGUgcm9vdCBmb2xkZXIsIG91dHNpZGUgYG5vZGVfbW9kdWxlc2ApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgYmVsb25ncyB0byB0aGUgcHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkS2VlcFByb2plY3RGaWxlKHBhcmFtczogU2hvdWxkS2VlcFByb2plY3RGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZU5hbWUsIHJvb3RDYW5vbmljYWwgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGZpbGVOYW1lLnN0YXJ0c1dpdGgoYCR7cm9vdENhbm9uaWNhbH0vYCkgJiYgIWZpbGVOYW1lLmluY2x1ZGVzKE5PREVfTU9EVUxFU19TRUdNRU5UKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLGVBQWU7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBU1AsZUFBc0IsYUFBNEI7QUFDaEQsUUFBTSxHQUFHLDBCQUEwQixNQUFNLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQzNFO0FBT0EsZUFBc0IsZUFBOEI7QUFDbEQsTUFBSSxNQUFNLGVBQWUsc0JBQXNCLE1BQU0scUJBQXFCLFNBQVM7QUFDakYsVUFBTSxtQkFBbUI7QUFBQSxFQUMzQjtBQUNBLE1BQUksTUFBTSxlQUFlLDBCQUEwQixNQUFNLHFCQUFxQixTQUFTO0FBQ3JGLFVBQU0sdUJBQXVCO0FBQUEsRUFDL0I7QUFDRjtBQU9BLGVBQXNCLHFCQUFvQztBQUN4RCxRQUFNLGVBQWUsd0JBQXdCLEVBQUUsTUFBTSwwQkFBMEIsYUFBYSxDQUFDO0FBQzdGLFFBQU0sV0FBVyxNQUFNLFNBQXVCLFlBQVk7QUFDMUQsUUFBTSxXQUFXLE1BQU0sUUFBUSxLQUFLLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLFNBQVMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hHLFFBQU0sY0FBYyxTQUFTLE9BQU8sQ0FBQyxTQUFTLEtBQUssU0FBUyxTQUFTLEtBQUssS0FBSyxTQUFTLFlBQVksS0FBSyxLQUFLLFNBQVMsWUFBWSxDQUFDO0FBRXBJLE1BQUksWUFBWSxXQUFXLEdBQUc7QUFDNUIsbUJBQWUsMEJBQTBCLEVBQUUsbUVBQW1FO0FBQzlHO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxDQUFDLE9BQU8sZ0JBQWdCLGNBQWMsMEJBQTBCLFlBQVksQ0FBQztBQUNsRztBQWFBLGVBQXNCLHlCQUF3QztBQUM1RCxRQUFNLGFBQWEsQ0FBQyxPQUFPLE9BQU8sV0FBVyxTQUFTLENBQUM7QUFFdkQsTUFBSSxDQUFDLHFCQUFxQixHQUFHO0FBQzNCLFVBQU0sSUFBSSxNQUFNLDJDQUEyQztBQUFBLEVBQzdEO0FBQ0Y7QUFlQSxlQUFzQixpQkFBZ0M7QUFDcEQsYUFBVyxVQUFVLE1BQU0sYUFBYSwwQkFBMEIsV0FBVyxFQUFFLFdBQVcsTUFBTSxlQUFlLEtBQUssQ0FBQyxHQUFHO0FBQ3RILFFBQUksQ0FBQyxPQUFPLE9BQU8sR0FBRztBQUNwQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sVUFBVTtBQUFBLE1BQ3JCLFNBQVMsS0FBSyxPQUFPLFlBQVksT0FBTyxJQUFJO0FBQUEsTUFDNUMsUUFBUSxHQUFHLDBCQUEwQixTQUFTO0FBQUEsSUFDaEQsQ0FBQztBQUNELFVBQU0sa0JBQWtCLEtBQUssU0FBUyxvQkFBb0IsSUFBSSxLQUFLLE1BQU0sR0FBRyxDQUFDLHFCQUFxQixNQUFNLElBQUk7QUFDNUcsVUFBTSxHQUFHLEtBQUssMEJBQTBCLFdBQVcsSUFBSSxHQUFHLEtBQUssMEJBQTBCLGVBQWUsZUFBZSxDQUFDO0FBQUEsRUFDMUg7QUFDRjtBQUVBLE1BQU0sdUJBQXVCO0FBRTdCLE1BQU0sdUJBQXVCO0FBd0I3QixTQUFTLHVCQUFnQztBQUN2QyxRQUFNLE9BQU8sY0FBYztBQUUzQixNQUFJLENBQUMsTUFBTTtBQUNULFVBQU0sSUFBSSxNQUFNLDRCQUE0QjtBQUFBLEVBQzlDO0FBRUEsUUFBTSxnQkFBZ0IsWUFBWSxJQUFJO0FBQ3RDLFFBQU0sRUFBRSxXQUFXLFFBQVEsSUFBSSxjQUFjLEtBQUssTUFBTSwwQkFBMEIsWUFBWSxDQUFDO0FBRS9GLFNBQU8sa0JBQWtCO0FBQUEsSUFDdkI7QUFBQSxJQUNBLFdBQVc7QUFBQSxJQUNYLGdCQUFnQixDQUFDLGFBQWEsc0JBQXNCLEVBQUUsVUFBVSxjQUFjLENBQUM7QUFBQSxFQUNqRixDQUFDO0FBQ0g7QUFRQSxTQUFTLHNCQUFzQixRQUE4QztBQUMzRSxRQUFNLEVBQUUsVUFBVSxjQUFjLElBQUk7QUFDcEMsU0FBTyxTQUFTLFdBQVcsR0FBRyxhQUFhLEdBQUcsS0FBSyxDQUFDLFNBQVMsU0FBUyxvQkFBb0I7QUFDNUY7IiwKICAibmFtZXMiOiBbXQp9Cg==
161
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9idWlsZC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgYnVpbGQgcHJvY2VzcyBmb3Igc3RhdGljIGFzc2V0cyBhbmQgY2xlYW5pbmdcbiAqIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyLiBJdCBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gY29weSBzdGF0aWMgZmlsZXMgdG8gdGhlIGRpc3RyaWJ1dGlvbiBmb2xkZXJcbiAqIGFuZCB0byByZW1vdmUgdGhlIGV4aXN0aW5nIGJ1aWxkIG91dHB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFBhY2thZ2VKc29uLFxuICBUc0NvbmZpZ0pzb25cbn0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgY3AsXG4gIGdsb2IsXG4gIHJtXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0b0FycmF5IH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyB0cmltU3RhcnQgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgY2hlY2tQcm9qZWN0VHlwZXMsXG4gIHBhcnNlVHNDb25maWcsXG4gIHRvQ2Fub25pY2FsXG59IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICcuL2ZzLnRzJztcbmltcG9ydCB7IHJlYWRKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7XG4gIG5wbVJ1bk9wdGlvbmFsLFxuICBOcG1SdW5PcHRpb25hbFJlc3VsdFxufSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICBnZXRSb290Rm9sZGVyLFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGRpc3RyaWJ1dGlvbiBmb2xkZXIgYW5kIGl0cyBjb250ZW50cy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgdGhlIGVudGlyZSBkaXN0cmlidXRpb24gZm9sZGVyIHRvIGVuc3VyZSBhIGNsZWFuIGJ1aWxkIGVudmlyb25tZW50LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZm9sZGVyIGhhcyBiZWVuIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENsZWFuKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBybShPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3QsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyB0aGUgY29kZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGU6c3ZlbHRlJykgPT09IE5wbVJ1bk9wdGlvbmFsUmVzdWx0LlNraXBwZWQpIHtcbiAgICBhd2FpdCBidWlsZENvbXBpbGVTdmVsdGUoKTtcbiAgfVxuICBpZiAoYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2J1aWxkOmNvbXBpbGU6dHlwZXNjcmlwdCcpID09PSBOcG1SdW5PcHRpb25hbFJlc3VsdC5Ta2lwcGVkKSB7XG4gICAgYXdhaXQgYnVpbGRDb21waWxlVHlwZVNjcmlwdCgpO1xuICB9XG59XG5cbi8qKlxuICogQ29tcGlsZXMgdGhlIFN2ZWx0ZSBjb2RlLlxuICpcbiAqIFRoZSBwcm9qZWN0J3MgU3ZlbHRlIGZpbGVzIGFyZSBmb3VuZCBieSBnbG9iYmluZyB0aGUgU3ZlbHRlIGV4dGVuc2lvbnMgZGlyZWN0bHkuIEdsb2JiaW5nIHRoZSB0c2NvbmZpZ1xuICogYGluY2x1ZGVgIHBhdHRlcm5zIGFuZCBmaWx0ZXJpbmcgdGhhdCBsaXN0IHdvdWxkIG5ldmVyIG1hdGNoOiBgaW5jbHVkZWAgbGlzdHMgVHlwZVNjcmlwdCBnbG9ic1xuICogKGAuL3NyYy8qKlxcLyoudHNgLCBcdTIwMjYpLCBzbyBubyBgLnN2ZWx0ZWAgcGF0aCBjYW4gZXZlciBhcHBlYXIgaW4gaXQgYW5kIHRoZSBjaGVjayB3b3VsZCBhbHdheXMgYmUgc2tpcHBlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvZGUgY29tcGlsZXMgc3VjY2Vzc2Z1bGx5LlxuICogQHRocm93cyBJZiB0aGUgcHJvamVjdCBoYXMgU3ZlbHRlIGZpbGVzIGJ1dCBkb2VzIG5vdCBkZWNsYXJlIGBzdmVsdGUtY2hlY2tgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21waWxlU3ZlbHRlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0c0NvbmZpZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVHNDb25maWdKc29uIH0pO1xuICBjb25zdCB0c0NvbmZpZyA9IGF3YWl0IHJlYWRKc29uPFRzQ29uZmlnSnNvbj4odHNDb25maWdQYXRoKTtcbiAgY29uc3Qgc3ZlbHRlRmlsZXMgPSBhd2FpdCB0b0FycmF5KGdsb2IoU1ZFTFRFX0ZJTEVfUEFUVEVSTlMsIHtcbiAgICBjd2Q6IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5DdXJyZW50Rm9sZGVyIH0pLFxuICAgIGV4Y2x1ZGU6IFsuLi5TVkVMVEVfRklMRV9FWENMVURFX1BBVFRFUk5TLCAuLi50c0NvbmZpZy5leGNsdWRlID8/IFtdXVxuICB9KSk7XG5cbiAgY29uc3QgW2ZpcnN0U3ZlbHRlRmlsZV0gPSBzdmVsdGVGaWxlcztcblxuICBpZiAoZmlyc3RTdmVsdGVGaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignYnVpbGQ6YnVpbGRDb21waWxlU3ZlbHRlJykoJ05vIFN2ZWx0ZSBmaWxlcyBmb3VuZCBpbiB0aGUgcHJvamVjdCwgc2tpcHBpbmcgU3ZlbHRlIGNvbXBpbGF0aW9uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcblxuICBpZiAoIWNoZWNrU3ZlbHRlQ2hlY2tEZWNsYXJlZChwYWNrYWdlSnNvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRm91bmQgU3ZlbHRlIGZpbGUocykgaW4gdGhlIHByb2plY3QgKGUuZy4gJHtmaXJzdFN2ZWx0ZUZpbGV9KSwgYnV0IFxcYCR7U1ZFTFRFX0NIRUNLX1BBQ0tBR0VfTkFNRX1cXGAgaXMgbm90IGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbi5gXG4gICAgICAgICsgYCBBZGQgXFxgJHtTVkVMVEVfQ0hFQ0tfUEFDS0FHRV9OQU1FfVxcYCBhcyBhIGRldkRlcGVuZGVuY3kgdG8gdHlwZS1jaGVjayB0aGUgU3ZlbHRlIGNvZGUuYFxuICAgICk7XG4gIH1cblxuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6IFNWRUxURV9DSEVDS19QQUNLQUdFX05BTUUgfSksICctLXRzY29uZmlnJywgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5Uc0NvbmZpZ0pzb25dKTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyB0aGUgVHlwZVNjcmlwdCBjb2RlLlxuICpcbiAqIFRoZSBnZW5lcmFsIGB0c2NgIHBhc3MgcnVucyB3aXRoIGBza2lwTGliQ2hlY2s6IHRydWVgIChjb25maWd1cmVkIGluIGB0c2NvbmZpZy5qc29uYCkgc28gaXQgZG9lc1xuICogbm90IGZhaWwgb24gYnJva2VuIHVwc3RyZWFtIGAuZC50c2AgZmlsZXMgd2UgZG8gbm90IGNvbnRyb2wuIEFmdGVyd2FyZHMsIHtAbGluayBhcmVQcm9qZWN0VHlwZXNWYWxpZH1cbiAqIHJlLXJ1bnMgdGhlIHR5cGUtY2hlY2sgaW4tbWVtb3J5IHdpdGggYHNraXBMaWJDaGVjazogZmFsc2VgLCByZXBvcnRpbmcgb25seSBkaWFnbm9zdGljcyBmcm9tIHRoZVxuICogZmlsZXMgd2Ugb3duLCBzbyB0aGUgZGVjbGFyYXRpb25zIHdlIGF1dGhvciBhcmUgc3RpbGwgZnVsbHkgdmFsaWRhdGVkLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29kZSBjb21waWxlcyBzdWNjZXNzZnVsbHkuXG4gKiBAdGhyb3dzIElmIHRoZSBwcm9qZWN0J3Mgb3duIGRlY2xhcmF0aW9ucyBmYWlsIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENvbXBpbGVUeXBlU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6ICd0c2MnIH0pLCAnLS1idWlsZCcsICctLWZvcmNlJ10pO1xuXG4gIGlmICghYXJlUHJvamVjdFR5cGVzVmFsaWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZC4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvcGllcyBhbGwgdGVtcGxhdGUgZmlsZXMgZnJvbSB0aGUgdGVtcGxhdGVzIGZvbGRlciB0byB0aGUgYHRlbXBsYXRlc2AgZm9sZGVyIHdpdGhpbiB0aGVcbiAqIGRpc3RyaWJ1dGlvbiBmb2xkZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSByZWFkcyB0aGUgY29udGVudHMgb2YgdGhlIHRlbXBsYXRlcyBmb2xkZXIgYW5kIGNvcGllcyBlYWNoIGZpbGUgdG8gdGhlXG4gKiBjb3JyZXNwb25kaW5nIHBhdGggdW5kZXIge0BsaW5rIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdFRlbXBsYXRlc30sIHNvIGNvbnN1bWVycyBjYW4gY29weSB0aGVcbiAqIHRlbXBsYXRlcyBmcm9tIGBub2RlX21vZHVsZXMvb2JzaWRpYW4tZGV2LXV0aWxzL2Rpc3QvdGVtcGxhdGVzYC4gQSB0cmFpbGluZyBgLnRlbXBsYXRlYCBvbiBhIHNvdXJjZVxuICogZmlsZSBuYW1lIGlzIHN0cmlwcGVkIGluIHRoZSBkZXN0aW5hdGlvbiAoZS5nLiBgZXNsaW50LmNvbmZpZy5tdHMudGVtcGxhdGVgIGlzIGNvcGllZCBhc1xuICogYGVzbGludC5jb25maWcubXRzYCksIHNvIGFuIGFjdGl2ZSBjb25maWcgdGVtcGxhdGUgY2FuIGxpdmUgaW4gdGhlIHJlcG8gdW5kZXIgYSBuYW1lIHRoYXQgdGhlXG4gKiBjb3JyZXNwb25kaW5nIHRvb2wgZG9lcyBub3QgYXV0by1kaXNjb3Zlci5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGZpbGVzIGhhdmUgYmVlbiBjb3BpZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFRlbXBsYXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgcmVhZGRpclBvc2l4KE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuVGVtcGxhdGVzLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRmlsZSgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gdHJpbVN0YXJ0KHtcbiAgICAgICRzdHJpbmc6IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKSxcbiAgICAgIHByZWZpeDogYCR7T2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5UZW1wbGF0ZXN9L2BcbiAgICB9KTtcbiAgICBjb25zdCBkZXN0aW5hdGlvblBhdGggPSBwYXRoLmVuZHNXaXRoKFRFTVBMQVRFX0ZJTEVfU1VGRklYKSA/IHBhdGguc2xpY2UoMCwgLVRFTVBMQVRFX0ZJTEVfU1VGRklYLmxlbmd0aCkgOiBwYXRoO1xuICAgIGF3YWl0IGNwKGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5UZW1wbGF0ZXMsIHBhdGgpLCBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdFRlbXBsYXRlcywgZGVzdGluYXRpb25QYXRoKSk7XG4gIH1cbn1cblxuY29uc3QgVEVNUExBVEVfRklMRV9TVUZGSVggPSAnLnRlbXBsYXRlJztcblxuY29uc3QgTk9ERV9NT0RVTEVTX1NFR01FTlQgPSAnL25vZGVfbW9kdWxlcy8nO1xuXG5jb25zdCBTVkVMVEVfQ0hFQ0tfUEFDS0FHRV9OQU1FID0gJ3N2ZWx0ZS1jaGVjayc7XG5cbmNvbnN0IFNWRUxURV9GSUxFX1BBVFRFUk5TID0gW1xuICBgJHtPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkFueVBhdGh9Lyouc3ZlbHRlYCxcbiAgYCR7T2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5BbnlQYXRofS8qLnN2ZWx0ZS5qc2AsXG4gIGAke09ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuQW55UGF0aH0vKi5zdmVsdGUudHNgXG5dO1xuXG4vKipcbiAqIGBub2RlX21vZHVsZXNgIG11c3QgYmUgbGlzdGVkIGV4cGxpY2l0bHk6IGEgdHNjb25maWcgdGhhdCBzZXRzIGBleGNsdWRlYCBhdCBhbGwgKipyZXBsYWNlcyoqIFR5cGVTY3JpcHQnc1xuICogZGVmYXVsdCBgbm9kZV9tb2R1bGVzYCBleGNsdXNpb24sIHNvIGl0IGNhbm5vdCBiZSByZWxpZWQgb24gdG8ga2VlcCBkZXBlbmRlbmNpZXMgb3V0IG9mIHRoZSBnbG9iLlxuICovXG5jb25zdCBTVkVMVEVfRklMRV9FWENMVURFX1BBVFRFUk5TID0gW1xuICBgJHtPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkFueVBhdGh9LyR7T2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5Ob2RlTW9kdWxlc30vJHtPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkFueVBhdGh9YCxcbiAgYCR7T2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5BbnlQYXRofS8ke09ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdH0vJHtPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkFueVBhdGh9YFxuXTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2hvdWxkS2VlcFByb2plY3RGaWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZEtlZXBQcm9qZWN0RmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHVuZGVyIGNvbnNpZGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSByb290Q2Fub25pY2FsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmUtcnVucyB0aGUgcHJvamVjdCB0eXBlLWNoZWNrIGluLW1lbW9yeSB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCwgcmVwb3J0aW5nIG9ubHkgZGlhZ25vc3RpY3NcbiAqIHdob3NlIHNvdXJjZSBmaWxlIGJlbG9uZ3MgdG8gdGhlIHByb2plY3QgKHVuZGVyIHRoZSByb290IGZvbGRlciwgb3V0c2lkZSBgbm9kZV9tb2R1bGVzYCkuXG4gKlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHByb2plY3QncyBvd24gZmlsZXMgaGF2ZSBubyB0eXBlIGVycm9ycywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKiBAdGhyb3dzIElmIHRoZSByb290IGZvbGRlciBjYW5ub3QgYmUgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGFyZVByb2plY3RUeXBlc1ZhbGlkKCk6IGJvb2xlYW4ge1xuICBjb25zdCByb290ID0gZ2V0Um9vdEZvbGRlcigpO1xuXG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcm9vdCBmb2xkZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJvb3RDYW5vbmljYWwgPSB0b0Nhbm9uaWNhbChyb290KTtcbiAgY29uc3QgeyBmaWxlTmFtZXMsIG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoam9pbihyb290LCBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlRzQ29uZmlnSnNvbikpO1xuXG4gIHJldHVybiBjaGVja1Byb2plY3RUeXBlcyh7XG4gICAgb3B0aW9ucyxcbiAgICByb290TmFtZXM6IGZpbGVOYW1lcyxcbiAgICBzaG91bGRLZWVwRmlsZTogKGZpbGVOYW1lKSA9PiBzaG91bGRLZWVwUHJvamVjdEZpbGUoeyBmaWxlTmFtZSwgcm9vdENhbm9uaWNhbCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb2plY3QgZGVjbGFyZXMgYHN2ZWx0ZS1jaGVja2AuXG4gKlxuICogVGhlIGRlY2xhcmF0aW9uIGlzIHJlYWQgZnJvbSBgcGFja2FnZS5qc29uYCByYXRoZXIgdGhhbiBwcm9iZWQgaW4gYG5vZGVfbW9kdWxlcy8uYmluYCwgYmVjYXVzZVxuICoge0BsaW5rIHJlc29sdmVUb29sQ29tbWFuZH0gZGVsaWJlcmF0ZWx5IGZhbGxzIGJhY2sgdG8gdGhlIHBhY2thZ2UgbWFuYWdlcidzIGV4ZWMgZm9ybSBmb3IgdG9vbHMgdGhhdCBoYXZlXG4gKiBubyBiaW4gc2hpbSBcdTIwMTQgdGhlIG9ubHkgd2F5IGEgbG9jYWxseSBpbnN0YWxsZWQgdG9vbCByZXNvbHZlcyB1bmRlciB5YXJuIFBuUC4gVHJlYXRpbmcgYSBtaXNzaW5nIHNoaW0gYXMgYVxuICogbWlzc2luZyB0b29sIHdvdWxkIHRoZXJlZm9yZSBicmVhayBQblAgcHJvamVjdHMuXG4gKlxuICogQHBhcmFtIHBhY2thZ2VKc29uIC0gVGhlIHByb2plY3QncyBwYXJzZWQgYHBhY2thZ2UuanNvbmAuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBgc3ZlbHRlLWNoZWNrYCBpcyBkZWNsYXJlZCBhcyBhIHJlZ3VsYXIsIGRldiwgb3IgcGVlciBkZXBlbmRlbmN5LlxuICovXG5mdW5jdGlvbiBjaGVja1N2ZWx0ZUNoZWNrRGVjbGFyZWQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIHJldHVybiBbcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXNdXG4gICAgLnNvbWUoKGRlcGVuZGVuY2llcykgPT4gZGVwZW5kZW5jaWVzPy5bU1ZFTFRFX0NIRUNLX1BBQ0tBR0VfTkFNRV0gIT09IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZmlsZSBiZWxvbmdzIHRvIHRoZSBwcm9qZWN0ICh1bmRlciB0aGUgcm9vdCBmb2xkZXIsIG91dHNpZGUgYG5vZGVfbW9kdWxlc2ApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgYmVsb25ncyB0byB0aGUgcHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkS2VlcFByb2plY3RGaWxlKHBhcmFtczogU2hvdWxkS2VlcFByb2plY3RGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZU5hbWUsIHJvb3RDYW5vbmljYWwgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGZpbGVOYW1lLnN0YXJ0c1dpdGgoYCR7cm9vdENhbm9uaWNhbH0vYCkgJiYgIWZpbGVOYW1lLmluY2x1ZGVzKE5PREVfTU9EVUxFU19TRUdNRU5UKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLGVBQWU7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQ0FBaUM7QUFDMUMsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBU1AsZUFBc0IsYUFBNEI7QUFDaEQsUUFBTSxHQUFHLDBCQUEwQixNQUFNLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQzNFO0FBT0EsZUFBc0IsZUFBOEI7QUFDbEQsTUFBSSxNQUFNLGVBQWUsc0JBQXNCLE1BQU0scUJBQXFCLFNBQVM7QUFDakYsVUFBTSxtQkFBbUI7QUFBQSxFQUMzQjtBQUNBLE1BQUksTUFBTSxlQUFlLDBCQUEwQixNQUFN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
@@ -6,22 +6,26 @@
6
6
  *
7
7
  * A plugin can ship a curated demo vault at `demo-vault/` in its repo root. At release time this
8
8
  * module installs the freshly built plugin into that vault's `.obsidian/plugins/<id>/` folder and
9
- * zips the whole vault into `dist/build/<plugin-id>-demo-vault-<version>.zip`, so the existing
10
- * GitHub-release step (which uploads every file in `dist/build/`) attaches it automatically. The
11
- * archive name carries the plugin id (so several plugins' demo vaults never collide) and the version
12
- * (so each release ships its own distinctly named artifact).
9
+ * zips the whole vault into `dist/build/<plugin-id>-demo-vault.zip`, so the existing GitHub-release
10
+ * step (which uploads every file in `dist/build/`) attaches it automatically.
11
+ *
12
+ * The version is deliberately absent from that name and lives INSIDE the archive instead — see
13
+ * `obsidian/demo-vault-naming.ts` for why — in the two places a person actually meets it: the vault
14
+ * sits under a single `<plugin-id>-demo-vault-<version>/` folder, so unzipping several releases by hand
15
+ * into one folder neither collides nor produces anonymous directories, and the vault's `README.md`
16
+ * heading gains the version it demonstrates.
13
17
  *
14
18
  * The archived copy also carries the `.obsidian/app.json` settings this package owns (see
15
- * `demo-vault-app-json.ts`). They are written into the ZIP ENTRY and never into the repo folder: the
16
- * committed `app.json` is a tracked file, and `updateVersion` archives after it has already pushed, so
17
- * an in-place write would leave an uncommitted change behind a published release.
19
+ * `demo-vault-app-json.ts`). Those settings and the README heading are written into the ZIP ENTRY and
20
+ * never into the repo folder: both files are tracked, and `updateVersion` archives after it has already
21
+ * pushed, so an in-place write would leave an uncommitted change behind a published release.
18
22
  */
19
23
  /**
20
24
  * Archives the plugin's demo vault (`demo-vault/` in the repo root) as a release artifact.
21
25
  *
22
26
  * Installs the freshly built plugin from `dist/build/` into the vault's
23
27
  * `.obsidian/plugins/<id>/` folder, then zips the whole vault to
24
- * `dist/build/<plugin-id>-demo-vault-<version>.zip`.
28
+ * `dist/build/<plugin-id>-demo-vault.zip`, under a single `<plugin-id>-demo-vault-<version>/` folder.
25
29
  *
26
30
  * @returns A {@link Promise} that resolves to the absolute path of the created zip archive, or
27
31
  * `null` if the repo has no `demo-vault/` folder.
@@ -49,6 +49,10 @@ import {
49
49
  readFile,
50
50
  writeFile
51
51
  } from "node:fs/promises";
52
+ import {
53
+ getDemoVaultArchiveFileName,
54
+ getDemoVaultFolderName
55
+ } from "../obsidian/demo-vault-naming.mjs";
52
56
  import { ObsidianPluginRepoPaths } from "../obsidian/plugin/obsidian-plugin-repo-paths.mjs";
53
57
  import {
54
58
  getFolderName,
@@ -67,6 +71,8 @@ import {
67
71
  const DEMO_VAULT_HELPER_PLUGIN_ID = "demo-vault-helper";
68
72
  const DATA_JSON_FILE_NAME = "data.json";
69
73
  const DATA_JSON_INDENT = 2;
74
+ const README_FILE_NAME = "README.md";
75
+ const OPENING_HEADING_REG_EXP = /^# .*/;
70
76
  async function archivePluginDemoVault() {
71
77
  const demoVaultPath = resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.DemoVault });
72
78
  if (!existsSync(demoVaultPath)) {
@@ -87,16 +93,21 @@ async function archivePluginDemoVault() {
87
93
  await cp(distBuildPath, pluginFolder, { recursive: true });
88
94
  await injectDemoVaultHelper(manifest.id);
89
95
  const zipPath = resolvePathFromRootSafe({
90
- path: join(ObsidianPluginRepoPaths.DistBuild, `${manifest.id}-demo-vault-${manifest.version}.zip`)
96
+ path: join(ObsidianPluginRepoPaths.DistBuild, getDemoVaultArchiveFileName(manifest.id))
97
+ });
98
+ const rootFolderName = getDemoVaultFolderName({
99
+ pluginId: manifest.id,
100
+ version: manifest.version
91
101
  });
92
102
  const zip = new AdmZip();
93
- zip.addLocalFolder(demoVaultPath);
94
- injectAppJson(zip, await readCommittedAppJson());
103
+ zip.addLocalFolder(demoVaultPath, rootFolderName);
104
+ injectAppJson(zip, await readCommittedAppJson(), rootFolderName);
105
+ injectReadmeVersion(zip, rootFolderName, manifest.version);
95
106
  await zip.writeZipPromise(zipPath);
96
107
  return zipPath;
97
108
  }
98
- function injectAppJson(zip, appJson) {
99
- const entryName = join(ObsidianPluginRepoPaths.DotObsidian, ObsidianPluginRepoPaths.AppJson);
109
+ function injectAppJson(zip, appJson, rootFolderName) {
110
+ const entryName = join(rootFolderName, ObsidianPluginRepoPaths.DotObsidian, ObsidianPluginRepoPaths.AppJson);
100
111
  const content = Buffer.from(buildArchivedDemoVaultAppJsonContent({ appJson }), "utf-8");
101
112
  const entry = zip.getEntry(entryName);
102
113
  if (entry) {
@@ -125,6 +136,18 @@ async function injectDemoVaultHelper(demoedPluginId) {
125
136
  await writeFile(join(helperFolder, DATA_JSON_FILE_NAME), `${JSON.stringify(settings, null, DATA_JSON_INDENT)}
126
137
  `, "utf-8");
127
138
  }
139
+ function injectReadmeVersion(zip, rootFolderName, version) {
140
+ const entry = zip.getEntry(join(rootFolderName, README_FILE_NAME));
141
+ if (!entry) {
142
+ return;
143
+ }
144
+ const content = entry.getData().toString("utf-8");
145
+ const versionedContent = content.replace(OPENING_HEADING_REG_EXP, (heading) => `${heading} v${version}`);
146
+ if (versionedContent === content) {
147
+ return;
148
+ }
149
+ zip.updateFile(entry, Buffer.from(versionedContent, "utf-8"));
150
+ }
128
151
  async function readCommittedAppJson() {
129
152
  const appJsonPath = resolvePathFromRootSafe({
130
153
  path: join(ObsidianPluginRepoPaths.DemoVault, ObsidianPluginRepoPaths.DotObsidian, ObsidianPluginRepoPaths.AppJson)
@@ -142,4 +165,4 @@ async function readCommittedAppJson() {
142
165
  export {
143
166
  archivePluginDemoVault
144
167
  };
145
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXJjaGl2ZXMgYSBwbHVnaW4ncyBkZW1vIHZhdWx0IGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIEF0IHJlbGVhc2UgdGltZSB0aGlzXG4gKiBtb2R1bGUgaW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGludG8gdGhhdCB2YXVsdCdzIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgZm9sZGVyIGFuZFxuICogemlwcyB0aGUgd2hvbGUgdmF1bHQgaW50byBgZGlzdC9idWlsZC88cGx1Z2luLWlkPi1kZW1vLXZhdWx0LTx2ZXJzaW9uPi56aXBgLCBzbyB0aGUgZXhpc3RpbmdcbiAqIEdpdEh1Yi1yZWxlYXNlIHN0ZXAgKHdoaWNoIHVwbG9hZHMgZXZlcnkgZmlsZSBpbiBgZGlzdC9idWlsZC9gKSBhdHRhY2hlcyBpdCBhdXRvbWF0aWNhbGx5LiBUaGVcbiAqIGFyY2hpdmUgbmFtZSBjYXJyaWVzIHRoZSBwbHVnaW4gaWQgKHNvIHNldmVyYWwgcGx1Z2lucycgZGVtbyB2YXVsdHMgbmV2ZXIgY29sbGlkZSkgYW5kIHRoZSB2ZXJzaW9uXG4gKiAoc28gZWFjaCByZWxlYXNlIHNoaXBzIGl0cyBvd24gZGlzdGluY3RseSBuYW1lZCBhcnRpZmFjdCkuXG4gKlxuICogVGhlIGFyY2hpdmVkIGNvcHkgYWxzbyBjYXJyaWVzIHRoZSBgLm9ic2lkaWFuL2FwcC5qc29uYCBzZXR0aW5ncyB0aGlzIHBhY2thZ2Ugb3ducyAoc2VlXG4gKiBgZGVtby12YXVsdC1hcHAtanNvbi50c2ApLiBUaGV5IGFyZSB3cml0dGVuIGludG8gdGhlIFpJUCBFTlRSWSBhbmQgbmV2ZXIgaW50byB0aGUgcmVwbyBmb2xkZXI6IHRoZVxuICogY29tbWl0dGVkIGBhcHAuanNvbmAgaXMgYSB0cmFja2VkIGZpbGUsIGFuZCBgdXBkYXRlVmVyc2lvbmAgYXJjaGl2ZXMgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgcHVzaGVkLCBzb1xuICogYW4gaW4tcGxhY2Ugd3JpdGUgd291bGQgbGVhdmUgYW4gdW5jb21taXR0ZWQgY2hhbmdlIGJlaGluZCBhIHB1Ymxpc2hlZCByZWxlYXNlLlxuICovXG5cbmltcG9ydCBBZG1aaXAgZnJvbSAnYWRtLXppcCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHsgRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3MgfSBmcm9tICcuLi9vYnNpZGlhbi9kZW1vLXZhdWx0LWhlbHBlci1zZXR0aW5ncy50cyc7XG5pbXBvcnQgdHlwZSB7IERlbW9WYXVsdEFwcEpzb24gfSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuL3BsdWdpbi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBnZXRGb2xkZXJOYW1lLFxuICBqb2luXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRBcmNoaXZlZERlbW9WYXVsdEFwcEpzb25Db250ZW50LFxuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi9yb290LnRzJztcblxuY29uc3QgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEID0gJ2RlbW8tdmF1bHQtaGVscGVyJztcbmNvbnN0IERBVEFfSlNPTl9GSUxFX05BTUUgPSAnZGF0YS5qc29uJztcbmNvbnN0IERBVEFfSlNPTl9JTkRFTlQgPSAyO1xuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHNoYXBlIG9mIGEgcGx1Z2luIGBtYW5pZmVzdC5qc29uYCByZWFkIGJ5IHtAbGluayBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0fS5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQsIHVzZWQgYXMgdGhlIGZvbGRlciBuYW1lIHVuZGVyIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zL2AuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHZlcnNpb24sIGVtYmVkZGVkIGluIHRoZSBhcmNoaXZlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBBcmNoaXZlcyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCBpbiB0aGUgcmVwbyByb290KSBhcyBhIHJlbGVhc2UgYXJ0aWZhY3QuXG4gKlxuICogSW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGZyb20gYGRpc3QvYnVpbGQvYCBpbnRvIHRoZSB2YXVsdCdzXG4gKiBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIGZvbGRlciwgdGhlbiB6aXBzIHRoZSB3aG9sZSB2YXVsdCB0b1xuICogYGRpc3QvYnVpbGQvPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj4uemlwYC5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBjcmVhdGVkIHppcCBhcmNoaXZlLCBvclxuICogYG51bGxgIGlmIHRoZSByZXBvIGhhcyBubyBgZGVtby12YXVsdC9gIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQoKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCB9KTtcbiAgaWYgKCFleGlzdHNTeW5jKGRlbW9WYXVsdFBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KTtcbiAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuXG4gIGNvbnN0IHBsdWdpbkZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgbWFuaWZlc3QuaWRcbiAgICApXG4gIH0pO1xuICBhd2FpdCBta2RpcihwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGRpc3RCdWlsZFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgYXdhaXQgY3AoZGlzdEJ1aWxkUGF0aCwgcGx1Z2luRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBhd2FpdCBpbmplY3REZW1vVmF1bHRIZWxwZXIobWFuaWZlc3QuaWQpO1xuXG4gIC8vIEFyY2hpdmUgbmFtZSBpcyBoYW5kLXN5bmNlZCB3aXRoIHRoZSBydW50aW1lIGBvcGVuRGVtb1ZhdWx0YCBvcGVuZXIsIHdoaWNoIGRvd25sb2FkcyB0aGlzIGV4YWN0IGFzc2V0IG5hbWUuXG4gIGNvbnN0IHppcFBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7XG4gICAgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIGAke21hbmlmZXN0LmlkfS1kZW1vLXZhdWx0LSR7bWFuaWZlc3QudmVyc2lvbn0uemlwYClcbiAgfSk7XG4gIGNvbnN0IHppcCA9IG5ldyBBZG1aaXAoKTtcbiAgemlwLmFkZExvY2FsRm9sZGVyKGRlbW9WYXVsdFBhdGgpO1xuICBpbmplY3RBcHBKc29uKHppcCwgYXdhaXQgcmVhZENvbW1pdHRlZEFwcEpzb24oKSk7XG4gIGF3YWl0IHppcC53cml0ZVppcFByb21pc2UoemlwUGF0aCk7XG4gIHJldHVybiB6aXBQYXRoO1xufVxuXG4vLyBTdG9yZXMgdGhlIGFyY2hpdmVkIHZhdWx0J3MgYC5vYnNpZGlhbi9hcHAuanNvbmAgXHUyMDE0IHRoZSBjb21taXR0ZWQgc2V0dGluZ3Mgd2l0aCB0aGUgb3duZWQgb25lcyBtZXJnZWRcbi8vIE92ZXIgdGhlbS4gVGhlIGVudHJ5IGlzIHJlcGxhY2VkIHJhdGhlciB0aGFuIHRoZSBmaWxlLCBzbyB0aGUgcmVwbyBmb2xkZXIgaXMgbGVmdCBleGFjdGx5IGFzIGl0IHdhcy5cbmZ1bmN0aW9uIGluamVjdEFwcEpzb24oemlwOiBBZG1aaXAsIGFwcEpzb246IERlbW9WYXVsdEFwcEpzb24pOiB2b2lkIHtcbiAgY29uc3QgZW50cnlOYW1lID0gam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQoeyBhcHBKc29uIH0pLCAndXRmLTgnKTtcbiAgY29uc3QgZW50cnkgPSB6aXAuZ2V0RW50cnkoZW50cnlOYW1lKTtcbiAgaWYgKGVudHJ5KSB7XG4gICAgemlwLnVwZGF0ZUZpbGUoZW50cnksIGNvbnRlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEEgdmF1bHQgd2l0aCBub3RoaW5nIGVsc2UgdG8gY29uZmlndXJlIGNvbW1pdHMgbm8gYGFwcC5qc29uYCBhdCBhbGwsIHdoaWNoIGlzIHRoZSBleHBlY3RlZCBzdGF0ZS5cbiAgemlwLmFkZEZpbGUoZW50cnlOYW1lLCBjb250ZW50KTtcbn1cblxuLy8gSW5qZWN0cyB0aGUgYnVpbHQsIGBvYnNpZGlhbi1kZXYtdXRpbHNgLW93bmVkIGBkZW1vLXZhdWx0LWhlbHBlcmAgYm9vdHN0cmFwIHBsdWdpbiAoc2hpcHBlZCBpbiB0aGlzIHBhY2thZ2UpIGludG8gdGhlIGRlbW8gdmF1bHQsIHNvIG5vIHBlci12YXVsdCBjb3B5IGlzIGNvbW1pdHRlZCBhbmQgYW4gYG9ic2lkaWFuLWRldi11dGlsc2AgYnVtcCBwcm9wYWdhdGVzIGZpeGVzLlxuLy9cbi8vIEFsb25nc2lkZSB0aGUgYmluYXJpZXMgaXQgd3JpdGVzIHRoZSBoZWxwZXIncyBvd24gYGRhdGEuanNvbmAgbmFtaW5nIHRoZSBkZW1vbnN0cmF0ZWQgcGx1Z2luLiBUaGF0IGlzXG4vLyBUaGUgb25lIG1vbWVudCB0aGUgaWQgaXMga25vd24gZm9yIGNlcnRhaW4gXHUyMDE0IGl0IGNvbWVzIGZyb20gdGhlIHBsdWdpbidzIG93biBtYW5pZmVzdCBcdTIwMTQgd2hlcmVhcyB0aGVcbi8vIE9wZW5lZCB2YXVsdCBvbmx5IG9mZmVycyBwbHVnaW4gZm9sZGVycyB0byBjb3VudCwgd2hpY2ggdGhlIGJvb3RzdHJhcCBpdHNlbGYgYWRkcyB0byAoc2VlXG4vLyBgRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3NgKS5cbmFzeW5jIGZ1bmN0aW9uIGluamVjdERlbW9WYXVsdEhlbHBlcihkZW1vZWRQbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VGb2xkZXIgPSBnZXRSb290Rm9sZGVyKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGlmICghcGFja2FnZUZvbGRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlc29sdmUgdGhlIG9ic2lkaWFuLWRldi11dGlscyBwYWNrYWdlIGZvbGRlciB0byBpbmplY3QgdGhlIGRlbW8tdmF1bHQtaGVscGVyIHBsdWdpbi4nKTtcbiAgfVxuXG4gIGNvbnN0IGhlbHBlclNvdXJjZVBhdGggPSBqb2luKHBhY2thZ2VGb2xkZXIsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdERlbW9WYXVsdEhlbHBlcik7XG4gIGNvbnN0IGhlbHBlckZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIoaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoaGVscGVyU291cmNlUGF0aCwgaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzZXR0aW5nczogRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3MgPSB7IGRlbW9lZFBsdWdpbklkIH07XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKGhlbHBlckZvbGRlciwgREFUQV9KU09OX0ZJTEVfTkFNRSksIGAke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKX1cXG5gLCAndXRmLTgnKTtcbn1cblxuLy8gUmVhZHMgdGhlIGRlbW8gdmF1bHQncyBjb21taXR0ZWQgYC5vYnNpZGlhbi9hcHAuanNvbmAsIHJlZnVzaW5nIHRoZSBzZXR0aW5ncyB0aGlzIHBhY2thZ2Ugb3ducy5cbi8vXG4vLyBUaG9zZSBzZXR0aW5ncyBhcmUgaW5qZWN0ZWQgaW50byB0aGUgYXJjaGl2ZSwgc28gYSBjb21taXR0ZWQgb25lIGlzIGEgc2Vjb25kIHNvdXJjZSBvZiB0cnV0aCB0aGF0XG4vLyBOb3RoaW5nIGtlZXBzIGluIHN0ZXAuIFRoZSBkZW1vLXZhdWx0IGNvdmVyYWdlIHN1aXRlIGFscmVhZHkgZmFpbHMgb24gaXQsIHdoaWNoIG1lYW5zIHJlYWNoaW5nIGhlcmVcbi8vIE1lYW5zIHRoYXQgZ2F0ZSB3YXMgc2tpcHBlZCBcdTIwMTQgc28gdGhpcyByZWZ1c2VzIHJhdGhlciB0aGFuIG92ZXJ3cml0aW5nIGEgdmFsdWUgc29tZWJvZHkgY2hvc2Ugb24gcHVycG9zZS5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDb21taXR0ZWRBcHBKc29uKCk6IFByb21pc2U8RGVtb1ZhdWx0QXBwSnNvbj4ge1xuICBjb25zdCBhcHBKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRlbW9WYXVsdCwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFwcEpzb24pXG4gIH0pO1xuICBjb25zdCBjb250ZW50ID0gZXhpc3RzU3luYyhhcHBKc29uUGF0aCkgPyBhd2FpdCByZWFkRmlsZShhcHBKc29uUGF0aCwgJ3V0Zi04JykgOiBudWxsO1xuICBjb25zdCBhcHBKc29uID0gcGFyc2VEZW1vVmF1bHRBcHBKc29uKHsgY29udGVudCwgcGF0aDogYXBwSnNvblBhdGggfSk7XG5cbiAgY29uc3Qgb3duZWRTZXR0aW5ncyA9IGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyh7IGFwcEpzb24gfSk7XG4gIGlmIChvd25lZFNldHRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHthcHBKc29uUGF0aH0gc2V0cyAke293bmVkU2V0dGluZ3Muam9pbignLCAnKX0sIHdoaWNoIG9ic2lkaWFuLWRldi11dGlscyBvd25zIGFuZCB3cml0ZXMgaW50byB0aGUgYXJjaGl2ZWQgZGVtbyB2YXVsdC4gU2V0dGluZ3MgaXQgb3ducyBtdXN0IG5vdCBiZSBjb21taXR0ZWQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gYXBwSnNvbjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsT0FBTyxZQUFZO0FBQ25CLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFLUCxTQUFTLCtCQUErQjtBQUN4QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUNBQWlDO0FBQzFDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxtQkFBbUI7QUEyQnpCLGVBQXNCLHlCQUFpRDtBQUNyRSxRQUFNLGdCQUFnQix3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixVQUFVLENBQUM7QUFDekYsTUFBSSxDQUFDLFdBQVcs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
168
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9kZW1vLXZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXJjaGl2ZXMgYSBwbHVnaW4ncyBkZW1vIHZhdWx0IGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIEF0IHJlbGVhc2UgdGltZSB0aGlzXG4gKiBtb2R1bGUgaW5zdGFsbHMgdGhlIGZyZXNobHkgYnVpbHQgcGx1Z2luIGludG8gdGhhdCB2YXVsdCdzIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgZm9sZGVyIGFuZFxuICogemlwcyB0aGUgd2hvbGUgdmF1bHQgaW50byBgZGlzdC9idWlsZC88cGx1Z2luLWlkPi1kZW1vLXZhdWx0LnppcGAsIHNvIHRoZSBleGlzdGluZyBHaXRIdWItcmVsZWFzZVxuICogc3RlcCAod2hpY2ggdXBsb2FkcyBldmVyeSBmaWxlIGluIGBkaXN0L2J1aWxkL2ApIGF0dGFjaGVzIGl0IGF1dG9tYXRpY2FsbHkuXG4gKlxuICogVGhlIHZlcnNpb24gaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tIHRoYXQgbmFtZSBhbmQgbGl2ZXMgSU5TSURFIHRoZSBhcmNoaXZlIGluc3RlYWQgXHUyMDE0IHNlZVxuICogYG9ic2lkaWFuL2RlbW8tdmF1bHQtbmFtaW5nLnRzYCBmb3Igd2h5IFx1MjAxNCBpbiB0aGUgdHdvIHBsYWNlcyBhIHBlcnNvbiBhY3R1YWxseSBtZWV0cyBpdDogdGhlIHZhdWx0XG4gKiBzaXRzIHVuZGVyIGEgc2luZ2xlIGA8cGx1Z2luLWlkPi1kZW1vLXZhdWx0LTx2ZXJzaW9uPi9gIGZvbGRlciwgc28gdW56aXBwaW5nIHNldmVyYWwgcmVsZWFzZXMgYnkgaGFuZFxuICogaW50byBvbmUgZm9sZGVyIG5laXRoZXIgY29sbGlkZXMgbm9yIHByb2R1Y2VzIGFub255bW91cyBkaXJlY3RvcmllcywgYW5kIHRoZSB2YXVsdCdzIGBSRUFETUUubWRgXG4gKiBoZWFkaW5nIGdhaW5zIHRoZSB2ZXJzaW9uIGl0IGRlbW9uc3RyYXRlcy5cbiAqXG4gKiBUaGUgYXJjaGl2ZWQgY29weSBhbHNvIGNhcnJpZXMgdGhlIGAub2JzaWRpYW4vYXBwLmpzb25gIHNldHRpbmdzIHRoaXMgcGFja2FnZSBvd25zIChzZWVcbiAqIGBkZW1vLXZhdWx0LWFwcC1qc29uLnRzYCkuIFRob3NlIHNldHRpbmdzIGFuZCB0aGUgUkVBRE1FIGhlYWRpbmcgYXJlIHdyaXR0ZW4gaW50byB0aGUgWklQIEVOVFJZIGFuZFxuICogbmV2ZXIgaW50byB0aGUgcmVwbyBmb2xkZXI6IGJvdGggZmlsZXMgYXJlIHRyYWNrZWQsIGFuZCBgdXBkYXRlVmVyc2lvbmAgYXJjaGl2ZXMgYWZ0ZXIgaXQgaGFzIGFscmVhZHlcbiAqIHB1c2hlZCwgc28gYW4gaW4tcGxhY2Ugd3JpdGUgd291bGQgbGVhdmUgYW4gdW5jb21taXR0ZWQgY2hhbmdlIGJlaGluZCBhIHB1Ymxpc2hlZCByZWxlYXNlLlxuICovXG5cbmltcG9ydCBBZG1aaXAgZnJvbSAnYWRtLXppcCc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHsgRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3MgfSBmcm9tICcuLi9vYnNpZGlhbi9kZW1vLXZhdWx0LWhlbHBlci1zZXR0aW5ncy50cyc7XG5pbXBvcnQgdHlwZSB7IERlbW9WYXVsdEFwcEpzb24gfSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuXG5pbXBvcnQge1xuICBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUsXG4gIGdldERlbW9WYXVsdEZvbGRlck5hbWVcbn0gZnJvbSAnLi4vb2JzaWRpYW4vZGVtby12YXVsdC1uYW1pbmcudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Rm9sZGVyTmFtZSxcbiAgam9pblxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGJ1aWxkQXJjaGl2ZWREZW1vVmF1bHRBcHBKc29uQ29udGVudCxcbiAgZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzLFxuICBwYXJzZURlbW9WYXVsdEFwcEpzb25cbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWFwcC1qc29uLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGdldFJvb3RGb2xkZXIsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbmNvbnN0IERFTU9fVkFVTFRfSEVMUEVSX1BMVUdJTl9JRCA9ICdkZW1vLXZhdWx0LWhlbHBlcic7XG5jb25zdCBEQVRBX0pTT05fRklMRV9OQU1FID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcbmNvbnN0IFJFQURNRV9GSUxFX05BTUUgPSAnUkVBRE1FLm1kJztcblxuLy8gVGhlIFJFQURNRSdzIG9wZW5pbmcgYCMgSDFgLCBhbmQgb25seSB0aGF0IG9uZTogd2l0aG91dCB0aGUgYG1gIGZsYWcgdGhlIG1hdGNoIGlzIGFuY2hvcmVkIHRvIHRoZSBzdGFydFxuLy8gT2YgdGhlIGZpbGUsIGFuZCBgLmAgc3RvcHMgYXQgdGhlIG5ld2xpbmUgdGhhdCBlbmRzIHRoZSBsaW5lLlxuY29uc3QgT1BFTklOR19IRUFESU5HX1JFR19FWFAgPSAvXiMgLiovO1xuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHNoYXBlIG9mIGEgcGx1Z2luIGBtYW5pZmVzdC5qc29uYCByZWFkIGJ5IHtAbGluayBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0fS5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQsIHVzZWQgYXMgdGhlIGZvbGRlciBuYW1lIHVuZGVyIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zL2AuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHZlcnNpb24sIGVtYmVkZGVkIGluIHRoZSBhcmNoaXZlJ3MgdG9wLWxldmVsIGZvbGRlciBuYW1lIGFuZCBpdHMgUkVBRE1FIGhlYWRpbmcuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXJjaGl2ZXMgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2AgaW4gdGhlIHJlcG8gcm9vdCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICpcbiAqIEluc3RhbGxzIHRoZSBmcmVzaGx5IGJ1aWx0IHBsdWdpbiBmcm9tIGBkaXN0L2J1aWxkL2AgaW50byB0aGUgdmF1bHQnc1xuICogYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBmb2xkZXIsIHRoZW4gemlwcyB0aGUgd2hvbGUgdmF1bHQgdG9cbiAqIGBkaXN0L2J1aWxkLzxwbHVnaW4taWQ+LWRlbW8tdmF1bHQuemlwYCwgdW5kZXIgYSBzaW5nbGUgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+L2AgZm9sZGVyLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGNyZWF0ZWQgemlwIGFyY2hpdmUsIG9yXG4gKiBgbnVsbGAgaWYgdGhlIHJlcG8gaGFzIG5vIGBkZW1vLXZhdWx0L2AgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCgpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgY29uc3QgZGVtb1ZhdWx0UGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0IH0pO1xuICBpZiAoIWV4aXN0c1N5bmMoZGVtb1ZhdWx0UGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pO1xuICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUobWFuaWZlc3RQYXRoLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG5cbiAgY29uc3QgcGx1Z2luRm9sZGVyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQsXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbixcbiAgICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBsdWdpbnMsXG4gICAgICBtYW5pZmVzdC5pZFxuICAgIClcbiAgfSk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgZGlzdEJ1aWxkUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkIH0pO1xuICBhd2FpdCBjcChkaXN0QnVpbGRQYXRoLCBwbHVnaW5Gb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGF3YWl0IGluamVjdERlbW9WYXVsdEhlbHBlcihtYW5pZmVzdC5pZCk7XG5cbiAgY29uc3QgemlwUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCwgZ2V0RGVtb1ZhdWx0QXJjaGl2ZUZpbGVOYW1lKG1hbmlmZXN0LmlkKSlcbiAgfSk7XG4gIGNvbnN0IHJvb3RGb2xkZXJOYW1lID0gZ2V0RGVtb1ZhdWx0Rm9sZGVyTmFtZSh7XG4gICAgcGx1Z2luSWQ6IG1hbmlmZXN0LmlkLFxuICAgIHZlcnNpb246IG1hbmlmZXN0LnZlcnNpb25cbiAgfSk7XG4gIGNvbnN0IHppcCA9IG5ldyBBZG1aaXAoKTtcbiAgemlwLmFkZExvY2FsRm9sZGVyKGRlbW9WYXVsdFBhdGgsIHJvb3RGb2xkZXJOYW1lKTtcbiAgaW5qZWN0QXBwSnNvbih6aXAsIGF3YWl0IHJlYWRDb21taXR0ZWRBcHBKc29uKCksIHJvb3RGb2xkZXJOYW1lKTtcbiAgaW5qZWN0UmVhZG1lVmVyc2lvbih6aXAsIHJvb3RGb2xkZXJOYW1lLCBtYW5pZmVzdC52ZXJzaW9uKTtcbiAgYXdhaXQgemlwLndyaXRlWmlwUHJvbWlzZSh6aXBQYXRoKTtcbiAgcmV0dXJuIHppcFBhdGg7XG59XG5cbi8vIFN0b3JlcyB0aGUgYXJjaGl2ZWQgdmF1bHQncyBgLm9ic2lkaWFuL2FwcC5qc29uYCBcdTIwMTQgdGhlIGNvbW1pdHRlZCBzZXR0aW5ncyB3aXRoIHRoZSBvd25lZCBvbmVzIG1lcmdlZFxuLy8gT3ZlciB0aGVtLiBUaGUgZW50cnkgaXMgcmVwbGFjZWQgcmF0aGVyIHRoYW4gdGhlIGZpbGUsIHNvIHRoZSByZXBvIGZvbGRlciBpcyBsZWZ0IGV4YWN0bHkgYXMgaXQgd2FzLlxuZnVuY3Rpb24gaW5qZWN0QXBwSnNvbih6aXA6IEFkbVppcCwgYXBwSnNvbjogRGVtb1ZhdWx0QXBwSnNvbiwgcm9vdEZvbGRlck5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBlbnRyeU5hbWUgPSBqb2luKHJvb3RGb2xkZXJOYW1lLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShidWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnQoeyBhcHBKc29uIH0pLCAndXRmLTgnKTtcbiAgY29uc3QgZW50cnkgPSB6aXAuZ2V0RW50cnkoZW50cnlOYW1lKTtcbiAgaWYgKGVudHJ5KSB7XG4gICAgemlwLnVwZGF0ZUZpbGUoZW50cnksIGNvbnRlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEEgdmF1bHQgd2l0aCBub3RoaW5nIGVsc2UgdG8gY29uZmlndXJlIGNvbW1pdHMgbm8gYGFwcC5qc29uYCBhdCBhbGwsIHdoaWNoIGlzIHRoZSBleHBlY3RlZCBzdGF0ZS5cbiAgemlwLmFkZEZpbGUoZW50cnlOYW1lLCBjb250ZW50KTtcbn1cblxuLy8gSW5qZWN0cyB0aGUgYnVpbHQsIGBvYnNpZGlhbi1kZXYtdXRpbHNgLW93bmVkIGBkZW1vLXZhdWx0LWhlbHBlcmAgYm9vdHN0cmFwIHBsdWdpbiAoc2hpcHBlZCBpbiB0aGlzIHBhY2thZ2UpIGludG8gdGhlIGRlbW8gdmF1bHQsIHNvIG5vIHBlci12YXVsdCBjb3B5IGlzIGNvbW1pdHRlZCBhbmQgYW4gYG9ic2lkaWFuLWRldi11dGlsc2AgYnVtcCBwcm9wYWdhdGVzIGZpeGVzLlxuLy9cbi8vIEFsb25nc2lkZSB0aGUgYmluYXJpZXMgaXQgd3JpdGVzIHRoZSBoZWxwZXIncyBvd24gYGRhdGEuanNvbmAgbmFtaW5nIHRoZSBkZW1vbnN0cmF0ZWQgcGx1Z2luLiBUaGF0IGlzXG4vLyBUaGUgb25lIG1vbWVudCB0aGUgaWQgaXMga25vd24gZm9yIGNlcnRhaW4gXHUyMDE0IGl0IGNvbWVzIGZyb20gdGhlIHBsdWdpbidzIG93biBtYW5pZmVzdCBcdTIwMTQgd2hlcmVhcyB0aGVcbi8vIE9wZW5lZCB2YXVsdCBvbmx5IG9mZmVycyBwbHVnaW4gZm9sZGVycyB0byBjb3VudCwgd2hpY2ggdGhlIGJvb3RzdHJhcCBpdHNlbGYgYWRkcyB0byAoc2VlXG4vLyBgRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3NgKS5cbmFzeW5jIGZ1bmN0aW9uIGluamVjdERlbW9WYXVsdEhlbHBlcihkZW1vZWRQbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VGb2xkZXIgPSBnZXRSb290Rm9sZGVyKGdldEZvbGRlck5hbWUoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIGlmICghcGFja2FnZUZvbGRlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHJlc29sdmUgdGhlIG9ic2lkaWFuLWRldi11dGlscyBwYWNrYWdlIGZvbGRlciB0byBpbmplY3QgdGhlIGRlbW8tdmF1bHQtaGVscGVyIHBsdWdpbi4nKTtcbiAgfVxuXG4gIGNvbnN0IGhlbHBlclNvdXJjZVBhdGggPSBqb2luKHBhY2thZ2VGb2xkZXIsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdERlbW9WYXVsdEhlbHBlcik7XG4gIGNvbnN0IGhlbHBlckZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHtcbiAgICBwYXRoOiBqb2luKFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LFxuICAgICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sXG4gICAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5QbHVnaW5zLFxuICAgICAgREVNT19WQVVMVF9IRUxQRVJfUExVR0lOX0lEXG4gICAgKVxuICB9KTtcbiAgYXdhaXQgbWtkaXIoaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoaGVscGVyU291cmNlUGF0aCwgaGVscGVyRm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzZXR0aW5nczogRGVtb1ZhdWx0SGVscGVyU2V0dGluZ3MgPSB7IGRlbW9lZFBsdWdpbklkIH07XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKGhlbHBlckZvbGRlciwgREFUQV9KU09OX0ZJTEVfTkFNRSksIGAke0pTT04uc3RyaW5naWZ5KHNldHRpbmdzLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKX1cXG5gLCAndXRmLTgnKTtcbn1cblxuLy8gTmFtZXMgdGhlIHZlcnNpb24gb24gdGhlIGFyY2hpdmVkIGBSRUFETUUubWRgJ3MgaGVhZGluZywgc28gdGhlIHZhdWx0IHNheXMgd2hpY2ggcmVsZWFzZSBpdCBkZW1vbnN0cmF0ZXNcbi8vIEhvd2V2ZXIgZmFyIGl0IHRyYXZlbHMgZnJvbSB0aGUgcmVsZWFzZSBwYWdlIGl0IHdhcyBkb3dubG9hZGVkIGZyb20uXG4vL1xuLy8gRW50cnktb25seSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBgaW5qZWN0QXBwSnNvbmAgaXM6IHRoZSBjb21taXR0ZWQgUkVBRE1FIGlzIGEgdHJhY2tlZCwgaGFuZC1hdXRob3JlZFxuLy8gRmlsZSBhbmQgYHVwZGF0ZVZlcnNpb25gIGFyY2hpdmVzIGFmdGVyIGl0IGhhcyBhbHJlYWR5IHB1c2hlZC5cbi8vXG4vLyBBIHZhdWx0IHRoYXQgc2hpcHMgbm8gUkVBRE1FLCBvciBvbmUgb3BlbmluZyBvbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBgIyBIMWAsIGlzIGxlZnQgYWxvbmUgcmF0aGVyXG4vLyBUaGFuIGNvcnJlY3RlZC4gVGhlIGRlbW8tdmF1bHQgY292ZXJhZ2Ugc3VpdGUgZXhlbXB0cyBgUkVBRE1FLm1kYCBmcm9tIGl0cyBIMSBjaGVjaywgc28gbmVpdGhlciBzaGFwZVxuLy8gSXMgYSBkZWZlY3QgXHUyMDE0IGFuZCBhIHJlbGVhc2UgaXMgdGhlIHdyb25nIG1vbWVudCB0byBzdGFydCBmYWlsaW5nIG9uIG9uZS5cbmZ1bmN0aW9uIGluamVjdFJlYWRtZVZlcnNpb24oemlwOiBBZG1aaXAsIHJvb3RGb2xkZXJOYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBlbnRyeSA9IHppcC5nZXRFbnRyeShqb2luKHJvb3RGb2xkZXJOYW1lLCBSRUFETUVfRklMRV9OQU1FKSk7XG4gIGlmICghZW50cnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZW50cnkuZ2V0RGF0YSgpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICBjb25zdCB2ZXJzaW9uZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlKE9QRU5JTkdfSEVBRElOR19SRUdfRVhQLCAoaGVhZGluZykgPT4gYCR7aGVhZGluZ30gdiR7dmVyc2lvbn1gKTtcbiAgaWYgKHZlcnNpb25lZENvbnRlbnQgPT09IGNvbnRlbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB6aXAudXBkYXRlRmlsZShlbnRyeSwgQnVmZmVyLmZyb20odmVyc2lvbmVkQ29udGVudCwgJ3V0Zi04JykpO1xufVxuXG4vLyBSZWFkcyB0aGUgZGVtbyB2YXVsdCdzIGNvbW1pdHRlZCBgLm9ic2lkaWFuL2FwcC5qc29uYCwgcmVmdXNpbmcgdGhlIHNldHRpbmdzIHRoaXMgcGFja2FnZSBvd25zLlxuLy9cbi8vIFRob3NlIHNldHRpbmdzIGFyZSBpbmplY3RlZCBpbnRvIHRoZSBhcmNoaXZlLCBzbyBhIGNvbW1pdHRlZCBvbmUgaXMgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIHRoYXRcbi8vIE5vdGhpbmcga2VlcHMgaW4gc3RlcC4gVGhlIGRlbW8tdmF1bHQgY292ZXJhZ2Ugc3VpdGUgYWxyZWFkeSBmYWlscyBvbiBpdCwgd2hpY2ggbWVhbnMgcmVhY2hpbmcgaGVyZVxuLy8gTWVhbnMgdGhhdCBnYXRlIHdhcyBza2lwcGVkIFx1MjAxNCBzbyB0aGlzIHJlZnVzZXMgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgYSB2YWx1ZSBzb21lYm9keSBjaG9zZSBvbiBwdXJwb3NlLlxuYXN5bmMgZnVuY3Rpb24gcmVhZENvbW1pdHRlZEFwcEpzb24oKTogUHJvbWlzZTxEZW1vVmF1bHRBcHBKc29uPiB7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoe1xuICAgIHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0LCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbilcbiAgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBleGlzdHNTeW5jKGFwcEpzb25QYXRoKSA/IGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gIGNvbnN0IGFwcEpzb24gPSBwYXJzZURlbW9WYXVsdEFwcEpzb24oeyBjb250ZW50LCBwYXRoOiBhcHBKc29uUGF0aCB9KTtcblxuICBjb25zdCBvd25lZFNldHRpbmdzID0gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHsgYXBwSnNvbiB9KTtcbiAgaWYgKG93bmVkU2V0dGluZ3MubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2FwcEpzb25QYXRofSBzZXRzICR7b3duZWRTZXR0aW5ncy5qb2luKCcsICcpfSwgd2hpY2ggb2JzaWRpYW4tZGV2LXV0aWxzIG93bnMgYW5kIHdyaXRlcyBpbnRvIHRoZSBhcmNoaXZlZCBkZW1vIHZhdWx0LiBTZXR0aW5ncyBpdCBvd25zIG11c3Qgbm90IGJlIGNvbW1pdHRlZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBhcHBKc29uO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxPQUFPLFlBQVk7QUFDbkIsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNF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
@@ -346,4 +346,4 @@ export {
346
346
  buildChildEnv,
347
347
  exec
348
348
  };
349
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9leGVjLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGV4ZWN1dGluZyBjb21tYW5kcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSBhcyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUsXG4gIHRvQ29tbWFuZExpbmUsXG4gIHRvUG9zaXhDb21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSB3aXRoIGJhdGNoZWQgYXJndW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBDb21tYW5kUGFydCA9IEV4ZWNBcmd1bWVudCB8IHN0cmluZztcblxuLyoqXG4gKiBBIGNvbW1hbmQgYXJndW1lbnQgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYXJncyB0byBiZSBiYXRjaGVkLlxuICogSWYgdGhlIGV4cGFuZGVkIGNvbW1hbmQgZXhjZWVkcyB0aGUgcGxhdGZvcm0ncyBtYXggY29tbWFuZCBsZW5ndGgsXG4gKiB0aGUgYmF0Y2hlZCBhcmdzIGFyZSBzcGxpdCBpbnRvIHNlcXVlbnRpYWwgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjQXJndW1lbnQge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBkZXRhaWxlZCByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNEZXRhaWxlZE9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGB0cnVlYCB0byByZWNlaXZlIGRldGFpbGVkIHJlc3VsdHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlsczogdHJ1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY3VycmVudCB3b3JraW5nIGZvbGRlciBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MsIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCBwcm9jZXNzJ3Mgc3RkaW8gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsIChgc3RkaW86ICdpbmhlcml0J2ApIGluc3RlYWRcbiAgICogb2YgY2FwdHVyaW5nIGl0LiBVc2UgZm9yIGxvbmctcnVubmluZyBvciBpbnRlcmFjdGl2ZSBjb21tYW5kcyBzdWNoIGFzIGRldiBzZXJ2ZXJzIGFuZCB3YXRjaCBtb2RlLlxuICAgKiBCZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm90IGNhcHR1cmVkLCB0aGUgcmVzb2x2ZWQgc3Rkb3V0IGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbElmQ2FsbGVkRnJvbU91dHNpZGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBpZ25vcmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZElnbm9yZUV4aXRDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYGZhbHNlYCwgb25seSByZXR1cm5zIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdGRpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiB7QGxpbmsgZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgcHJvY2VzcyB0byBiZSB0ZXJtaW5hdGVkLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCBubyBzaWduYWwgd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gb25seSBzdGRvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1NpbXBsZU9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGBmYWxzZWAgb3Igb21pdHRlZCB0byByZWNlaXZlIG9ubHkgc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGZhbHNlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjU3RyaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWNTdHJpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEV4ZWNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSksIHVzZWQgYnkgdGhlIFBvd2VyU2hlbGxcbiAgICogZmFsbGJhY2sgcGF0aCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBQb3dlclNoZWxsLW5hdGl2ZSBzaW5nbGUgcXVvdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgaWYgKHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgcmV0dXJuIHRyaW1tZWQ7XG4gIH1cbiAgcmV0dXJuIGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCBcdTIwMTQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IFx1MjAxNCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudlxuICB9O1xuICBpZiAoYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpKSB7XG4gICAgZW52WydOT0RFX09QVElPTlMnXSA9IGFwcGVuZE5vZGVPcHRpb24oYmFzZUVudlsnTk9ERV9PUFRJT05TJ10sIExPQ0FMX1NUT1JBR0VfTk9ERV9PUFRJT04pO1xuICB9XG4gIHJldHVybiBlbnY7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUgYW5kIHN0ZGVyci5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9ucz86IEV4ZWNTaW1wbGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+O1xuLyoqXG4gKiBFeGVjdXRlcyBhIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBleGVjdXRlLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggRXhlY1Jlc3VsdCBvYmplY3QuXG4gKiAgICAgICAgICBUaGUgRXhlY1Jlc3VsdCBvYmplY3QgY29udGFpbnMgdGhlIGV4aXQgY29kZSwgZXhpdCBzaWduYWwsIHN0ZGVyciwgYW5kIHN0ZG91dC5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgaWdub3JlRXhpdENvZGUgaXMgYGZhbHNlYC5cbiAqICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4aXQgY29kZSBhbmQgc3RkZXJyLlxuICogICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGB0cnVlYCxcbiAqICAgICAgICAgdGhlIGVycm9yIGlzIHJlc29sdmVkIHdpdGggdGhlIHN0ZG91dCBhbmQgc3RkZXJyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjb21tYW5kOiBDb21tYW5kUGFydFtdIHwgc3RyaW5nLCBvcHRpb25zOiBFeGVjRGV0YWlsZWRPcHRpb25zKTogUHJvbWlzZTxFeGVjUmVzdWx0Pjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgb3IgYW4gRXhlY1Jlc3VsdCBvYmplY3QuXG4gKiAgICAgICAgICBUaGUgRXhlY1Jlc3VsdCBvYmplY3QgY29udGFpbnMgdGhlIGV4aXQgY29kZSwgZXhpdCBzaWduYWwsIHN0ZGVyciwgYW5kIHN0ZG91dC5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgaWdub3JlRXhpdENvZGUgaXMgYGZhbHNlYC5cbiAqICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4aXQgY29kZSBhbmQgc3RkZXJyLlxuICogICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGB0cnVlYCxcbiAqICAgICAgICAgdGhlIGVycm9yIGlzIHJlc29sdmVkIHdpdGggdGhlIHN0ZG91dCBhbmQgc3RkZXJyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjb21tYW5kOiBDb21tYW5kUGFydFtdIHwgc3RyaW5nLCBvcHRpb25zOiBFeGVjT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHQgPSBoYW5kbGVCYXRjaGVkQ29tbWFuZChjb21tYW5kLCBvcHRpb25zKTtcbiAgICBpZiAoYmF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBiYXRjaFJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgJGFyZ3VtZW50cyA9IGNvbW1hbmQuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBjb21tYW5kTGluZSA9IGJ1aWxkQ29tbWFuZExpbmUoJGFyZ3VtZW50cyk7XG5cbiAgICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUxlbmd0aCA9IGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKGNvbW1hbmRMaW5lKTtcbiAgICBpZiAoZWZmZWN0aXZlTGVuZ3RoID4gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvbW1hbmQgbGluZSBpcyB0b28gbG9uZyAoJHtTdHJpbmcoZWZmZWN0aXZlTGVuZ3RoKX0gY2hhcnMgb25jZSB3cmFwcGVkIGZvciB0aGUgc2hlbGwsIG1heCAke1N0cmluZyhtYXhDb21tYW5kTGVuZ3RoKX0gb24gJHtwcm9jZXNzLnBsYXRmb3JtfSkuIENvbnNpZGVyIHNwbGl0dGluZyBpbnRvIHNtYWxsZXIgYmF0Y2hlcyBvciB1c2UgRXhlY0FyZy5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4ZWNTdHJpbmcoe1xuICAgICAgY29tbWFuZDogY29tbWFuZExpbmUsXG4gICAgICBvcHRpb25zLFxuICAgICAgcmF3QXJndW1lbnRzOiAkYXJndW1lbnRzXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kKTtcbiAgaWYgKGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgKCR7U3RyaW5nKGVmZmVjdGl2ZUxlbmd0aCl9IGNoYXJzIG9uY2Ugd3JhcHBlZCBmb3IgdGhlIHNoZWxsLCBtYXggJHtTdHJpbmcobWF4Q29tbWFuZExlbmd0aCl9IG9uICR7cHJvY2Vzcy5wbGF0Zm9ybX0pLiBDb25zaWRlciBzcGxpdHRpbmcgaW50byBzbWFsbGVyIGJhdGNoZXMgb3IgdXNlIEV4ZWNBcmcuYFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZXhlY1N0cmluZyh7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgc2luZ2xlIHN0cmluZyBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gZXhlY1N0cmluZyhwYXJhbXM6IEV4ZWNTdHJpbmdQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGNvbW1hbmQsXG4gICAgb3B0aW9ucyA9IHt9LFxuICAgIHJhd0FyZ3VtZW50c1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCB7XG4gICAgY3dkID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBlbnYsXG4gICAgaXNJbnRlcmFjdGl2ZSA9IGZhbHNlLFxuICAgIGlzUXVpZXQ6IHF1aWV0ID0gZmFsc2UsXG4gICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IGlnbm9yZUV4aXRDb2RlID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZURldGFpbHMgPSBmYWxzZSxcbiAgICBzdGRpbiA9ICcnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ0V4ZWMnKShgRXhlY3V0aW5nIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcblxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd25WaWFTaGVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U3Bhd25WaWFTaGVsbFBhcmFtcz4oe1xuICAgICAgY29tbWFuZCxcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICByYXdBcmd1bWVudHNcbiAgICB9KSk7XG5cbiAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgbGV0IHN0ZGVyciA9ICcnO1xuXG4gICAgLy8gSW4gaW50ZXJhY3RpdmUgbW9kZSB0aGUgY2hpbGQncyBzdGRpbyBpcyBpbmhlcml0ZWQgYnkgdGhlIHRlcm1pbmFsLCBzbyB0aGVyZSBhcmUgbm8gc3RyZWFtcyB0byByZWFkIGFuZCBub3RoaW5nIGlzIGNhcHR1cmVkLlxuICAgIGlmICghaXNJbnRlcmFjdGl2ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGRlcnI6IGNoaWxkU3RkZXJyLFxuICAgICAgICBzdGRpbjogY2hpbGRTdGRpbixcbiAgICAgICAgc3Rkb3V0OiBjaGlsZFN0ZG91dFxuICAgICAgfSA9IGNoaWxkO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoY2hpbGRTdGRpbiwgJ0NoaWxkIHByb2Nlc3Mgc3RkaW4gaXMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoY2hpbGRTdGRvdXQsICdDaGlsZCBwcm9jZXNzIHN0ZG91dCBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZGVyciwgJ0NoaWxkIHByb2Nlc3Mgc3RkZXJyIGlzIG5vdCBhdmFpbGFibGUnKTtcblxuICAgICAgY2hpbGRTdGRpbi53cml0ZShzdGRpbik7XG4gICAgICBjaGlsZFN0ZGluLmVuZCgpO1xuXG4gICAgICBjaGlsZFN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKCFxdWlldCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZG91dCArPSBkYXRhLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkU3Rkb3V0Lm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIHN0ZG91dCA9IHRyaW1FbmQoe1xuICAgICAgICAgICRzdHJpbmc6IHN0ZG91dCxcbiAgICAgICAgICBzdWZmaXg6ICdcXG4nXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkU3RkZXJyLm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3RkZXJyID0gdHJpbUVuZCh7XG4gICAgICAgICAgJHN0cmluZzogc3RkZXJyLFxuICAgICAgICAgIHN1ZmZpeDogJ1xcbidcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjaGlsZC5vbignY2xvc2UnLCAoZXhpdENvZGUsIGV4aXRTaWduYWwpID0+IHtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCAmJiAhaWdub3JlRXhpdENvZGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZSA/IFN0cmluZyhleGl0Q29kZSkgOiAnKG51bGwpJ31cXG4ke3N0ZGVycn1gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBleGl0Q29kZSxcbiAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgc3RkZXJyLFxuICAgICAgICBzdGRvdXRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIWlnbm9yZUV4aXRDb2RlKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlOiBudWxsLFxuICAgICAgICBleGl0U2lnbmFsOiBudWxsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYG5vZGVgIENMSSBvcHRpb24gKHBhc3NlZCB2aWEgYE5PREVfT1BUSU9OU2ApIHRoYXQgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGBsb2NhbFN0b3JhZ2VgIHRvIGV2ZXJ5XG4gKiBzcGF3bmVkIGBub2RlYCBwcm9jZXNzLiBOb2RlIDIyKyBleHBvc2VzIGFuIGV4cGVyaW1lbnRhbCBXZWIgU3RvcmFnZSBgbG9jYWxTdG9yYWdlYCwgYnV0IGFjY2Vzc2luZyBpdFxuICogd2l0aG91dCBgLS1sb2NhbHN0b3JhZ2UtZmlsZWAgZW1pdHMgYW4gYEV4cGVyaW1lbnRhbFdhcm5pbmdgIGFuZCBsZWF2ZXMgYGxvY2FsU3RvcmFnZWAgdW5hdmFpbGFibGUuXG4gKiBQb2ludGluZyBpdCBhdCB0aGUgc3BlY2lhbCBgOm1lbW9yeTpgIGRhdGFiYXNlIGdpdmVzIGVhY2ggcHJvY2VzcyBhIHdvcmtpbmcsIG5vbi1wZXJzaXN0ZW50XG4gKiBgbG9jYWxTdG9yYWdlYCAobm8gZmlsZSBvbiBkaXNrLCBubyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMpIFx1MjAxNCBtYXRjaGluZyB0aGUgcmVhbCBPYnNpZGlhblxuICogKEVsZWN0cm9uKSBydW50aW1lIGFuZCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgYnkgYWRkcmVzc2luZyBpdHMgcm9vdCBjYXVzZSByYXRoZXIgdGhhbiBzdXBwcmVzc2luZyBpdC5cbiAqXG4gKiBJdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcnVubmluZyBgbm9kZWAgYWN0dWFsbHkgc3VwcG9ydHMgaXQgKHNlZSB7QGxpbmsgYnVpbGRDaGlsZEVudn0pOiBwYXNzaW5nXG4gKiBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWEgYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgcmVmdXNlIHRvIHN0YXJ0LCBzbyBhbiBvbGRlciBgbm9kZWBcbiAqICg8IDIyKSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkLlxuICovXG5jb25zdCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OID0gJy0tbG9jYWxzdG9yYWdlLWZpbGU9Om1lbW9yeTonO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgaGVsZCBiYWNrIGZyb20gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lIGJ1ZGdldCB3aGVuIHNpemluZyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCwgdG9cbiAqIGNvdmVyIGV4cGFuc2lvbnMgdGhhdCBoYXBwZW4gSU5TSURFIHRoZSBjb21tYW5kIHdlIHNwYXduIGFuZCBhcmUgdGhlcmVmb3JlIGludmlzaWJsZSBmcm9tIGhlcmUuXG4gKlxuICogQSBgbnB4IDx0b29sPiA8YXJnc1x1MjAyNj5gIGludm9jYXRpb24gaXMgbm90IG9uZSBgY21kLmV4ZWAgY29tbWFuZCBsaW5lIGJ1dCBhIGNoYWluIG9mIHRoZW06IGBucHguY21kYFxuICogcmUtZXhwYW5kcyBgJSpgIGludG8gYSBmcmVzaCBgbm9kZSBcdTIwMjYgbnB4LWNsaS5qcyA8YXJnc1x1MjAyNj5gIGxpbmUsIHRoZSB0b29sJ3Mgb3duIGAuYmluLzx0b29sPi5jbWRgIHNoaW0gZG9lc1xuICogaXQgYWdhaW4sIGFuZCBlYWNoIGhvcCByZS1xdW90ZXMgd2hhdCBpdCBmb3J3YXJkcy4gRXZlcnkgb25lIG9mIHRob3NlIGxpbmVzIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgODE5MVxuICogbGltaXQsIGFuZCBldmVyeSBvbmUgaXMgbG9uZ2VyIHRoYW4gdGhlIGxpbmUgd2UgYXNzZW1ibGVkIFx1MjAxNCBidXQgYnkgaG93IG11Y2ggaXMgdGhlIGNoaWxkJ3MgYnVzaW5lc3MsIG5vdFxuICogb3Vycywgc28gbm8gZm9ybXVsYSBjYW4gYmUgcmlnaHQuIE9ubHkgdGhlIGRlbGliZXJhdGUgc2xhY2sgYmVsb3cgY2FuLlxuICpcbiAqIGAyMDQ4YCBpcyByb3VnaGx5IGRvdWJsZSB0aGUgb3ZlcmhlYWQgbWVhc3VyZWQgd2hlbiB0aGlzIHdhcyBmb3VuZCAoVDYzNSkuIE92ZXIgYSByZXBvc2l0b3J5J3MgMTg3XG4gKiBtYXJrZG93biBwYXRocywgYSBgbnB4IG1hcmtkb3dubGludC1jbGkyIFx1MjAyNmAgbGluZSAqKmFzc2VtYmxlZCBhdCA3MDUxIGNoYXJzKiogXHUyMDE0IDExNDAgdW5kZXIgdGhlIGxpbWl0IFx1MjAxNFxuICogc3RpbGwgZGllZCB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmA7IHRoZSBzYW1lIHBheWxvYWQgc3BsaXQgaW4gdHdvIHJ1bnMgY2xlYW4uIE5vdGUgdGhlIHRvb2w6XG4gKiB0aGlzIGlzIG5vdCBzcGVjaWZpYyB0byBgbGlua2luYXRvcmAsIGl0IGlzIHRoZSBzaGFwZSBvZiBldmVyeSBgbnB4YC1mcm9udGVkIGludm9jYXRpb24uXG4gKlxuICogT3Zlci1yZXNlcnZpbmcgY29zdHMgb25lIGV4dHJhIHNlcXVlbnRpYWwgaW52b2NhdGlvbiBvZiBhIGNvbW1hbmQgdGhhdCB3YXMgYWxyZWFkeSBnb2luZyB0byBiZSBiYXRjaGVkO1xuICogdW5kZXItcmVzZXJ2aW5nIGNvc3RzIGEgbGludCBmYWlsdXJlIHRoYXQgbmFtZXMgbm90aGluZyB3cm9uZyB3aXRoIHRoZSBjb250ZW50LiBSYWlzZSBpdCwgbmV2ZXIgbG93ZXIgaXQsXG4gKiBpZiB0aGUgc3ltcHRvbSByZXR1cm5zLlxuICovXG5jb25zdCBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFID0gMjA0ODtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXhlY3V0ZUJhdGNoZXN9LlxuICovXG5pbnRlcmZhY2UgRXhlY3V0ZUJhdGNoZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJhc2UgY29tbWFuZCB3aXRob3V0IGJhdGNoZWQgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VDb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYXRjaGVzIG9mIGFyZ3MuXG4gICAqL1xuICByZWFkb25seSBiYXRjaGVzOiBzdHJpbmdbXVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogRXhlY09wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNwYXduVmlhU2hlbGx9LlxuICovXG5pbnRlcmZhY2UgU3Bhd25WaWFTaGVsbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgY2hpbGQgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhdHRhY2hlcyB0aGUgY2hpbGQncyBzdGRpbyB0byB0aGUgdGVybWluYWwgaW5zdGVhZCBvZiBwaXBpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBpc0ludGVyYWN0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGFyZ3VtZW50IGFycmF5IChpZiBhdmFpbGFibGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQnVpbGRzIGEgY29tbWFuZC1saW5lIHN0cmluZyBmcm9tIGFuIGFyZ3VtZW50IGFycmF5LCBxdW90ZWQgZm9yIHRoZSBzaGVsbCB0aGF0XG4gKiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0gd2lsbCByb3V0ZSB0aHJvdWdoIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICpcbiAqIE9uIFdpbmRvd3MgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgdmlhIGBjbWQuZXhlYCwgc28gaXQgdXNlcyB0aGVcbiAqIGBDb21tYW5kTGluZVRvQXJndldgIGNvbnZlbnRpb24gKHtAbGluayB0b0NvbW1hbmRMaW5lfSk7IHtAbGluayBzcGF3blZpYVNoZWxsfVxuICogdGhlbiBhcHBsaWVzIHtAbGluayBjbWRFc2NhcGVDb21tYW5kTGluZX0gb24gdG9wIGZvciBgY21kLmV4ZWAgbWV0YWNoYXJhY3RlcnMuXG4gKiBFbHNld2hlcmUgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgdmlhIGBzaCAtY2AsIHNvIGl0IHVzZXMgUE9TSVggc2luZ2xlLXF1b3RlXG4gKiBxdW90aW5nICh7QGxpbmsgdG9Qb3NpeENvbW1hbmRMaW5lfSkgYW5kIG5lZWRzIG5vIGZ1cnRoZXIgZXNjYXBpbmcuXG4gKlxuICogVGhlIHBsYXRmb3JtIGJyYW5jaCBoZXJlIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgYXJndW1lbnQgYXJyYXkgdG8gcXVvdGUgYW5kIGpvaW4uXG4gKiBAcmV0dXJucyBUaGUgcXVvdGVkIGNvbW1hbmQtbGluZSBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtJ3Mgc2hlbGwuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZExpbmUoJGFyZ3VtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHRvQ29tbWFuZExpbmUoJGFyZ3VtZW50cykgOiB0b1Bvc2l4Q29tbWFuZExpbmUoJGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYmF0Y2hlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciBvdXRwdXQuXG4gKlxuICogYGV4ZWNTdHJpbmdgIHJldHVybnMgYSBgc3RyaW5nYCBvciBhbiB7QGxpbmsgRXhlY1Jlc3VsdH0gZGVwZW5kaW5nIG9uIGBvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzYCwgc29cbiAqIGJvdGggc2hhcGVzIGFyZSB1bnBhY2tlZCBcdTIwMTQgcmVhZGluZyBvbmx5IHRoZSBgc3RyaW5nYCBvbmUgc2lsZW50bHkgdGhyZXcgYXdheSBldmVyeSBiYXRjaCdzIG91dHB1dCBpblxuICogZXhhY3RseSB0aGUgbW9kZSB0aGF0IGFza2VkIGZvciBpdC5cbiAqXG4gKiBBIGJhdGNoIHRoYXQgZXhpdHMgbm9uLXplcm8gbm9ybWFsbHkgcmVqZWN0czsgaXQgb25seSByZWFjaGVzIGhlcmUgd2hlbiBgc2hvdWxkSWdub3JlRXhpdENvZGVgIGFza2VkIGZvclxuICogaXQgdG8gYmUgcmVwb3J0ZWQgaW5zdGVhZC4gVGhlIGZpcnN0IHN1Y2ggZmFpbHVyZSBpcyB3aGF0IHRoZSBhZ2dyZWdhdGUgcmVwb3J0cywgc28gc3BsaXR0aW5nIGEgY29tbWFuZFxuICogaW50byBiYXRjaGVzIGNhbm5vdCB0dXJuIGEgZmFpbHVyZSBpbnRvIGEgc3VjY2Vzcy5cbiAqXG4gKiBTaWxlbnQgYmF0Y2hlcyBjb250cmlidXRlIG5vdGhpbmcgdG8gdGhlIGpvaW5lZCBvdXRwdXQuIGBleGVjU3RyaW5nYCBhbHJlYWR5IHRyaW1zIGVhY2ggcmVzdWx0J3MgdHJhaWxpbmdcbiAqIG5ld2xpbmUsIHNvIGpvaW5pbmcgZW1wdHkgb25lcyBiYWNrIGluIHdvdWxkIHJlaW50cm9kdWNlIGV4YWN0bHkgdGhlIGJsYW5rLWxpbmUgbm9pc2UgaXQgcmVtb3ZlZCBcdTIwMTQgYVxuICogY29tbWFuZCB0aGF0IHByaW50ZWQgbm90aGluZyBtdXN0IGFnZ3JlZ2F0ZSB0byBgJydgLCBub3QgdG8gYSBydW4gb2YgbmV3bGluZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYmF0Y2hlZCBleGVjdXRpb24uXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb25jYXRlbmF0ZWQgcmVzdWx0LlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQmF0Y2hlcyhwYXJhbXM6IEV4ZWN1dGVCYXRjaGVzUGFyYW1zKTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYmFzZUNvbW1hbmQsIGJhdGNoZXMsIG9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3Qgc3Rkb3V0UGFydHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZGVyclBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZmFpbHVyZTogRXhlY1Jlc3VsdCB8IG51bGwgPSBudWxsO1xuXG4gIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgIGNvbnN0IGJhdGNoQ29tbWFuZCA9IGAke2Jhc2VDb21tYW5kfSAke2J1aWxkQ29tbWFuZExpbmUoYmF0Y2gpfWA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY1N0cmluZyh7XG4gICAgICBjb21tYW5kOiBiYXRjaENvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwdXNoSWZOb3RFbXB0eShzdGRvdXRQYXJ0cywgcmVzdWx0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHB1c2hJZk5vdEVtcHR5KHN0ZG91dFBhcnRzLCByZXN1bHQuc3Rkb3V0KTtcbiAgICBwdXNoSWZOb3RFbXB0eShzdGRlcnJQYXJ0cywgcmVzdWx0LnN0ZGVycik7XG4gICAgZmFpbHVyZSA/Pz0gcmVzdWx0LmV4aXRDb2RlID09PSAwID8gbnVsbCA6IHJlc3VsdDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiBmYWlsdXJlPy5leGl0Q29kZSA/PyAwLFxuICAgICAgZXhpdFNpZ25hbDogZmFpbHVyZT8uZXhpdFNpZ25hbCA/PyBudWxsLFxuICAgICAgc3RkZXJyOiBzdGRlcnJQYXJ0cy5qb2luKCdcXG4nKSxcbiAgICAgIHN0ZG91dDogc3Rkb3V0UGFydHMuam9pbignXFxuJylcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0ZG91dFBhcnRzLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHBhc3NlZCB0byBjaGlsZCBwcm9jZXNzZXMsIHJlc29sdmVkIGF0IHNwYXduIHRpbWUuXG4gKlxuICogRGVsaWJlcmF0ZWx5IG5vdCBhIG1vZHVsZS1sZXZlbCBjb25zdGFudC4gYC5lbnZgIGlzIGxvYWRlZCBieSBgbG9hZEVudkZpbGVJZkV4aXN0c2AgZnJvbSBpbnNpZGVcbiAqIGB3cmFwQ2xpVGFza2AsIGFuZCBFU00gZXZhbHVhdGVzIGV2ZXJ5IGltcG9ydCBiZWZvcmUgdGhlIGVudHJ5IG1vZHVsZSdzIGZpcnN0IHN0YXRlbWVudCBcdTIwMTQgc28gYVxuICogc25hcHNob3QgdGFrZW4gaGVyZSB3b3VsZCBhbHdheXMgcHJlZGF0ZSB0aGUgbG9hZCwgYW5kIGV2ZXJ5IHNwYXduZWQgY2hpbGQgd291bGQgcnVuIHdpdGhvdXQgdGhlXG4gKiByZXBvJ3Mgb3duIGAuZW52YC4gTm90aGluZyBzdXJmYWNlZCB0aGF0IHdoaWxlIFZpdGVzdCAzIGNvcGllZCB0aGUgYC5lbnZgIGl0IGxvYWRlZCBpbnRvIHRoZVxuICogd29ya2VyJ3MgYHByb2Nlc3MuZW52YDsgVml0ZXN0IDQgd3JpdGVzIHRob3NlIHRvIGBpbXBvcnQubWV0YS5lbnZgIG9ubHksIGxlYXZpbmcgdGhpcyB0aGUgc29sZVxuICogcGF0aCBhbmQgYW4gZW1wdHkgb25lLlxuICpcbiAqIEByZXR1cm5zIFRoZSBlbnZpcm9ubWVudCB0byBwYXNzIHRvIHNwYXduZWQgY2hpbGQgcHJvY2Vzc2VzLCByZWZsZWN0aW5nIGBwcm9jZXNzLmVudmAgYXMgaXQgc3RhbmRzIG5vdy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2hpbGRFbnYoKTogTm9kZUpTLlByb2Nlc3NFbnYge1xuICByZXR1cm4gYnVpbGRDaGlsZEVudihwcm9jZXNzLmVudiwgcHJvY2Vzcy5hbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3MpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBsaW5lIGFzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYWN0dWFsbHkgc2VlIGl0LCB3aGljaCBvbiBXaW5kb3dzIGlzXG4gKiBOT1QgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHBhc3NlZCBpbi5cbiAqXG4gKiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0gcm91dGVzIHRoZSBjb21tYW5kIHRocm91Z2ggYGNtZC5leGVgLCBhbmQgdHdvIHRoaW5ncyBhcmUgc3BlbnQgYmV0d2VlbiBoZXJlIGFuZFxuICogdGhlcmUsIG5laXRoZXIgb2YgdGhlbSB2aXNpYmxlIGluIHRoZSBhc3NlbWJsZWQgY29tbWFuZDpcbiAqIC0gTm9kZSdzIGBzcGF3bihcdTIwMjYsIHsgc2hlbGw6IHRydWUgfSlgIHdyYXBzIGl0IGFzIGA8Y29tc3BlYz4gL2QgL3MgL2MgXCI8Y29tbWFuZD5cImAuXG4gKiAtIHtAbGluayBjbWRFc2NhcGVDb21tYW5kTGluZX0gYF5gLWVzY2FwZXMgZXZlcnkgb25lIG9mIGBjbWQuZXhlYCdzIG1ldGFjaGFyYWN0ZXJzLCB3aGljaCBvbiBhIGxpc3Qgb2ZcbiAqICAgcXVvdGVkIHBhdGhzIGlzIGEgZmV3IHBlcmNlbnQgb2YgdGhlIHdob2xlIChtZWFzdXJlZDogKzIzNiBjaGFycyBvbiBhIDcyMTYtY2hhciBpbnZvY2F0aW9uKS5cbiAqXG4gKiBCb3RoIGFyZSBvdXJzIHRvIGNvbXB1dGUsIHNvIHRoZXkgYXJlIGNvbXB1dGVkIHJhdGhlciB0aGFuIGd1ZXNzZWQuIFdoYXQgaXMgTk9UIGNvbXB1dGFibGUgZnJvbSBoZXJlIGlzXG4gKiB3aGF0IHRoZSBzcGF3bmVkIGNvbW1hbmQgZG9lcyB0byBpdHMgb3duIGFyZ3VtZW50cyBcdTIwMTQgc2VlIHtAbGluayBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFfS5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gYnJhbmNoIGhlcmUgTVVTVCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgb25lIGluIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZExpbmUgLSBUaGUgYXNzZW1ibGVkIGNvbW1hbmQgbGluZSwgYmVmb3JlIGFueSBzaGVsbCB3cmFwcGluZy5cbiAqIEByZXR1cm5zIFRoZSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB3aGF0IHJlYWNoZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKGNvbW1hbmRMaW5lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBjb21tYW5kTGluZS5sZW5ndGg7XG4gIH1cblxuICBjb25zdCBjb21zcGVjID0gcHJvY2Vzcy5lbnZbJ2NvbXNwZWMnXSA/PyAnY21kLmV4ZSc7XG4gIGNvbnN0IENNRF9XUkFQUEVSID0gJyAvZCAvcyAvYyBcIlwiJztcbiAgcmV0dXJuIGNvbXNwZWMubGVuZ3RoICsgQ01EX1dSQVBQRVIubGVuZ3RoICsgY29tbWFuZEVzY2FwZUNvbW1hbmRMaW5lKGNvbW1hbmRMaW5lKS5sZW5ndGg7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IGNvbW1hbmQgbGluZSBsZW5ndGggdG8gc2l6ZSBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCBhZ2FpbnN0IFx1MjAxNCB0aGUgcGxhdGZvcm0gbWF4aW11bVxuICogbGVzcyB7QGxpbmsgV0lORE9XU19DSElMRF9FWFBBTlNJT05fUkVTRVJWRX0uXG4gKlxuICogRGVsaWJlcmF0ZWx5IG1vcmUgY29uc2VydmF0aXZlIHRoYW4ge0BsaW5rIGdldE1heENvbW1hbmRMZW5ndGh9LCBiZWNhdXNlIHRoZSB0d28gYW5zd2VyIGRpZmZlcmVudFxuICogcXVlc3Rpb25zLiBFeGNlZWRpbmcgdGhlIHBsYWluLWNvbW1hbmQgbGltaXQgaXMgYSBoYXJkIGZhaWx1cmUgdGhlIGNhbGxlciBjYW5ub3QgYXZvaWQsIHNvIHRoYXQgY2hlY2tcbiAqIHN0YXlzIGV4YWN0LiBFeGNlZWRpbmcgdGhlIGJhdGNoaW5nIGxpbWl0IG9ubHkgY29zdHMgb25lIGV4dHJhIGludm9jYXRpb24sIHNvIHRoYXQgY2hlY2sgbWF5IFx1MjAxNCBhbmRcbiAqIHNob3VsZCBcdTIwMTQgbGVhdmUgcm9vbSB0byBzcGFyZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbWF4IGxlbmd0aCBpbiBjaGFyYWN0ZXJzIGF2YWlsYWJsZSB0byBhIHNpbmdsZSBiYXRjaC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCk6IG51bWJlciB7XG4gIHJldHVybiBnZXRNYXhDb21tYW5kTGVuZ3RoKCkgLSAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgOiAwKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBtYXggY29tbWFuZCBsaW5lIGxlbmd0aC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbWF4IGNvbW1hbmQgbGVuZ3RoIGluIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldE1heENvbW1hbmRMZW5ndGgoKTogbnVtYmVyIHtcbiAgY29uc3QgV0lORE9XU19NQVhfQ09NTUFORF9MRU5HVEggPSA4MTkxO1xuICBjb25zdCBVTklYX01BWF9DT01NQU5EX0xFTkdUSCA9IDEzMV8wNzI7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gV0lORE9XU19NQVhfQ09NTUFORF9MRU5HVEggOiBVTklYX01BWF9DT01NQU5EX0xFTkdUSDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgY29tbWFuZCBhcnJheSB0aGF0IG1heSBjb250YWluIGFuIHtAbGluayBFeGVjQXJndW1lbnR9LlxuICogUmV0dXJucyBhIFByb21pc2UgaWYgYmF0Y2hpbmcgaXMgbmVlZGVkLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgY29tbWFuZFxuICogaGFzIG5vIEV4ZWNBcmcgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQgbm9ybWFsbHkuXG4gKlxuICogQHBhcmFtIHBhcnRzIC0gVGhlIGNvbW1hbmQgcGFydHMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBleGVjIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIFByb21pc2UgaWYgYmF0Y2hpbmcgaXMgaGFuZGxlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUJhdGNoZWRDb21tYW5kKHBhcnRzOiBDb21tYW5kUGFydFtdLCBvcHRpb25zOiBFeGVjT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBleGVjQXJndW1lbnRzID0gcGFydHMuZmlsdGVyKGlzRXhlY0FyZ3VtZW50KTtcbiAgaWYgKGV4ZWNBcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZXhlY0FyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignT25seSBvbmUgRXhlY0FyZyB3aXRoIGJhdGNoZWRBcmd1bWVudHMgaXMgYWxsb3dlZCBwZXIgY29tbWFuZCcpKTtcbiAgfVxuXG4gIGNvbnN0IGV4ZWNBcmd1bWVudCA9IGV4ZWNBcmd1bWVudHNbMF07XG4gIGFzc2VydE5vbk51bGxhYmxlKGV4ZWNBcmd1bWVudCk7XG4gIGNvbnN0IHN0YXRpY1BhcnRzID0gcGFydHMuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKTtcbiAgY29uc3QgYmFzZUNvbW1hbmQgPSBidWlsZENvbW1hbmRMaW5lKHN0YXRpY1BhcnRzKTtcbiAgY29uc3QgbWF4Q29tbWFuZExlbmd0aCA9IGdldE1heEJhdGNoQ29tbWFuZExlbmd0aCgpO1xuXG4gIC8vIFRyeSBleHBhbmRpbmcgYWxsIGFyZ3MgaW5saW5lXG4gIGNvbnN0IGZ1bGxDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShbLi4uZXhlY0FyZ3VtZW50LmJhdGNoZWRBcmd1bWVudHNdKX1gO1xuICBpZiAoZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoZnVsbENvbW1hbmQpIDw9IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICByZXR1cm4gZXhlY1N0cmluZyh7XG4gICAgICBjb21tYW5kOiBmdWxsQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNwbGl0IGludG8gYmF0Y2hlc1xuICBjb25zdCBiYXRjaGVzOiBzdHJpbmdbXVtdID0gW107XG4gIGxldCBjdXJyZW50QmF0Y2g6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBleGVjQXJndW1lbnQuYmF0Y2hlZEFyZ3VtZW50cykge1xuICAgIGNvbnN0IHRlbnRhdGl2ZSA9IGAke2Jhc2VDb21tYW5kfSAke2J1aWxkQ29tbWFuZExpbmUoWy4uLmN1cnJlbnRCYXRjaCwgYXJndW1lbnRdKX1gO1xuICAgIGlmIChnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aCh0ZW50YXRpdmUpID4gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgICAgaWYgKGN1cnJlbnRCYXRjaC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3Qgc3BsaXQgY29tbWFuZCBpbnRvIGJhdGNoZXM6IGEgc2luZ2xlIGFyZ3VtZW50ICgke1N0cmluZyhhcmd1bWVudC5sZW5ndGgpfSBjaGFycykgcGx1cyB0aGUgYmFzZSBjb21tYW5kICgke1N0cmluZyhiYXNlQ29tbWFuZC5sZW5ndGgpfSBjaGFycykgZXhjZWVkcyB0aGUgbWF4IGJhdGNoIGNvbW1hbmQgbGVuZ3RoICgke1N0cmluZyhtYXhDb21tYW5kTGVuZ3RoKX0pLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcbiAgICAgIGN1cnJlbnRCYXRjaCA9IFthcmd1bWVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRCYXRjaC5wdXNoKGFyZ3VtZW50KTtcbiAgICB9XG4gIH1cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsd2F5cyB0cnVlIGFmdGVyIHRoZSBsb29wOyBiYXRjaGVkQXJndW1lbnRzIGlzIG5vbi1lbXB0eSBhdCB0aGlzIHBvaW50LiAqL1xuICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVCYXRjaGVzKHtcbiAgICBiYXNlQ29tbWFuZCxcbiAgICBiYXRjaGVzLFxuICAgIG9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgY29tbWFuZCBwYXJ0IGlzIGFuIHtAbGluayBFeGVjQXJndW1lbnR9LlxuICpcbiAqIEBwYXJhbSBwYXJ0IC0gVGhlIGNvbW1hbmQgcGFydCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBhcnQgaXMgYW4gRXhlY0FyZy5cbiAqL1xuZnVuY3Rpb24gaXNFeGVjQXJndW1lbnQocGFydDogQ29tbWFuZFBhcnQpOiBwYXJ0IGlzIEV4ZWNBcmd1bWVudCB7XG4gIHJldHVybiB0eXBlb2YgcGFydCA9PT0gJ29iamVjdCcgJiYgJ2JhdGNoZWRBcmd1bWVudHMnIGluIHBhcnQ7XG59XG5cbi8qKlxuICogQXBwZW5kcyBhIGJhdGNoJ3MgY2FwdHVyZWQgb3V0cHV0IHRvIHRoZSBhY2N1bXVsYXRvciwgc2tpcHBpbmcgYW4gZW1wdHkgb25lIHNvIHRoZSBldmVudHVhbCBqb2luIGRvZXMgbm90XG4gKiBmYWJyaWNhdGUgYmxhbmsgbGluZXMgZm9yIGJhdGNoZXMgdGhhdCBwcmludGVkIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGFjY3VtdWxhdG9yIC0gVGhlIGNvbGxlY3RlZCBvdXRwdXRzIHNvIGZhci5cbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgb3V0cHV0IG9mIGEgc2luZ2xlIGJhdGNoLlxuICovXG5mdW5jdGlvbiBwdXNoSWZOb3RFbXB0eShhY2N1bXVsYXRvcjogc3RyaW5nW10sIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChvdXRwdXQgIT09ICcnKSB7XG4gICAgYWNjdW11bGF0b3IucHVzaChvdXRwdXQpO1xuICB9XG59XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyB2aWEgdGhlIGFwcHJvcHJpYXRlIHNoZWxsLlxuICpcbiAqIE9uIFdpbmRvd3MsIGlmIHRoZSBjb21tYW5kIGNvbnRhaW5zIG5ld2xpbmVzICh3aGljaCBgY21kLmV4ZWAgY2Fubm90IGhhbmRsZSlcbiAqIGFuZCB0aGUgcmF3IGFyZ3MgYXJyYXkgaXMgYXZhaWxhYmxlLCBzcGF3bnMgdGhlIHByb2Nlc3MgZGlyZWN0bHkgd2l0aG91dFxuICogYW55IHNoZWxsIFx1MjAxNCBwYXNzaW5nIGFyZ3MgdmlhIGBDcmVhdGVQcm9jZXNzYCwgd2hpY2ggYXZvaWRzIGFsbCBxdW90aW5nIGlzc3Vlcy5cbiAqXG4gKiBPbiBXaW5kb3dzIChjbWQuZXhlIHBhdGgpLCBhcHBsaWVzIGBeYC1lc2NhcGluZyBmb3IgY21kIG1ldGFjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc3Bhd25pbmcgdGhlIGNoaWxkIHByb2Nlc3MuXG4gKiBAcmV0dXJucyBUaGUgc3Bhd25lZCBjaGlsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzcGF3blZpYVNoZWxsKHBhcmFtczogU3Bhd25WaWFTaGVsbFBhcmFtcyk6IENoaWxkUHJvY2VzcyB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY3dkLCBlbnY6IGV4dHJhRW52LCBpc0ludGVyYWN0aXZlID0gZmFsc2UsIHJhd0FyZ3VtZW50cyB9ID0gcGFyYW1zO1xuICBjb25zdCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0ge1xuICAgIC4uLmdldENoaWxkRW52KCksXG4gICAgLi4uZXh0cmFFbnZcbiAgfTtcbiAgY29uc3Qgc3RkaW86ICdpbmhlcml0JyB8ICdwaXBlJyA9IGlzSW50ZXJhY3RpdmUgPyAnaW5oZXJpdCcgOiAncGlwZSc7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmIGNvbW1hbmQuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgaWYgKCFyYXdBcmd1bWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29tbWFuZHMgY29udGFpbmluZyBuZXdsaW5lcyBjYW5ub3QgYmUgZXhlY3V0ZWQgdGhyb3VnaCBjbWQuZXhlIG9uIFdpbmRvd3MuIFBhc3MgYW4gYXJndW1lbnQgYXJyYXkgaW5zdGVhZCBvZiBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgY29uc3QgW3Byb2dyYW0sIC4uLiRhcmd1bWVudHNdID0gcmF3QXJndW1lbnRzO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdDb21tYW5kIGFycmF5IG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gICAgcmV0dXJuIHNwYXduKHByb2dyYW0sICRhcmd1bWVudHMsIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHN0ZGlvXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzaGVsbENvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gY29tbWFuZEVzY2FwZUNvbW1hbmRMaW5lKGNvbW1hbmQpIDogY29tbWFuZDtcbiAgcmV0dXJuIHNwYXduKHNoZWxsQ29tbWFuZCwgW10sIHtcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvXG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLFNBQVMsYUFBYTtBQUN0QixPQUFPLGFBQWE7QUFFcEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxlQUFl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QUEsSUFDN0IsR0FBRyxZQUFZO0FBQUEsSUFDZixHQUFHO0FBQUEsRUFDTDtBQUNBLFFBQU0sUUFBNEIsZ0JBQWdCLFlBQVk7QUFDOUQsTUFBSSxRQUFRLGFBQWEsV0FBVyxRQUFRLFNBQVMsSUFBSSxHQUFHO0FBQzFELFFBQUksQ0FBQyxjQUFjO0FBQ2pCLFlBQU0sSUFBSSxNQUFNLHlIQUF5SDtBQUFBLElBQzNJO0FBQ0EsVUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFVLElBQUk7QUFDakMsc0JBQWtCLFNBQVMsaUNBQWlDO0FBQzVELFdBQU8sTUFBTSxTQUFTLFlBQVk7QUFBQSxNQUNoQztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sZUFBZSxRQUFRLGFBQWEsVUFBVSx5QkFBeUIsT0FBTyxJQUFJO0FBQ3hGLFNBQU8sTUFBTSxjQUFjLENBQUMsR0FBRztBQUFBLElBQzdCO0FBQUEsSUFDQTtBQUFBLElBQ0EsT0FBTztBQUFBLElBQ1A7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsibWF4Q29tbWFuZExlbmd0aCIsICJlZmZlY3RpdmVMZW5ndGgiXQp9Cg==
349
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9leGVjLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGV4ZWN1dGluZyBjb21tYW5kcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSBhcyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUsXG4gIHRvQ29tbWFuZExpbmUsXG4gIHRvUG9zaXhDb21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSB3aXRoIGJhdGNoZWQgYXJndW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBDb21tYW5kUGFydCA9IEV4ZWNBcmd1bWVudCB8IHN0cmluZztcblxuLyoqXG4gKiBBIGNvbW1hbmQgYXJndW1lbnQgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYXJncyB0byBiZSBiYXRjaGVkLlxuICogSWYgdGhlIGV4cGFuZGVkIGNvbW1hbmQgZXhjZWVkcyB0aGUgcGxhdGZvcm0ncyBtYXggY29tbWFuZCBsZW5ndGgsXG4gKiB0aGUgYmF0Y2hlZCBhcmdzIGFyZSBzcGxpdCBpbnRvIHNlcXVlbnRpYWwgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjQXJndW1lbnQge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBkZXRhaWxlZCByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNEZXRhaWxlZE9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGB0cnVlYCB0byByZWNlaXZlIGRldGFpbGVkIHJlc3VsdHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlsczogdHJ1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY3VycmVudCB3b3JraW5nIGZvbGRlciBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MsIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCBwcm9jZXNzJ3Mgc3RkaW8gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsIChgc3RkaW86ICdpbmhlcml0J2ApIGluc3RlYWRcbiAgICogb2YgY2FwdHVyaW5nIGl0LiBVc2UgZm9yIGxvbmctcnVubmluZyBvciBpbnRlcmFjdGl2ZSBjb21tYW5kcyBzdWNoIGFzIGRldiBzZXJ2ZXJzIGFuZCB3YXRjaCBtb2RlLlxuICAgKiBCZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm90IGNhcHR1cmVkLCB0aGUgcmVzb2x2ZWQgc3Rkb3V0IGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbElmQ2FsbGVkRnJvbU91dHNpZGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBpZ25vcmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZElnbm9yZUV4aXRDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYGZhbHNlYCwgb25seSByZXR1cm5zIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdGRpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiB7QGxpbmsgZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgcHJvY2VzcyB0byBiZSB0ZXJtaW5hdGVkLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCBubyBzaWduYWwgd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gb25seSBzdGRvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1NpbXBsZU9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGBmYWxzZWAgb3Igb21pdHRlZCB0byByZWNlaXZlIG9ubHkgc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGZhbHNlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjU3RyaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWNTdHJpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEV4ZWNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSksIHVzZWQgYnkgdGhlIFBvd2VyU2hlbGxcbiAgICogZmFsbGJhY2sgcGF0aCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBQb3dlclNoZWxsLW5hdGl2ZSBzaW5nbGUgcXVvdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgaWYgKHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgcmV0dXJuIHRyaW1tZWQ7XG4gIH1cbiAgcmV0dXJuIGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCBcdTIwMTQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IFx1MjAxNCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudlxuICB9O1xuICBpZiAoYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpKSB7XG4gICAgZW52WydOT0RFX09QVElPTlMnXSA9IGFwcGVuZE5vZGVPcHRpb24oYmFzZUVudlsnTk9ERV9PUFRJT05TJ10sIExPQ0FMX1NUT1JBR0VfTk9ERV9PUFRJT04pO1xuICB9XG4gIHJldHVybiBlbnY7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUgYW5kIHN0ZGVyci5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9ucz86IEV4ZWNTaW1wbGVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+O1xuLyoqXG4gKiBFeGVjdXRlcyBhIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBleGVjdXRlLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBleGVjdXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggRXhlY1Jlc3VsdCBvYmplY3QuXG4gKiAgICAgICAgICBUaGUgRXhlY1Jlc3VsdCBvYmplY3QgY29udGFpbnMgdGhlIGV4aXQgY29kZSwgZXhpdCBzaWduYWwsIHN0ZGVyciwgYW5kIHN0ZG91dC5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgaWdub3JlRXhpdENvZGUgaXMgYGZhbHNlYC5cbiAqICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4aXQgY29kZSBhbmQgc3RkZXJyLlxuICogICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGB0cnVlYCxcbiAqICAgICAgICAgdGhlIGVycm9yIGlzIHJlc29sdmVkIHdpdGggdGhlIHN0ZG91dCBhbmQgc3RkZXJyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjb21tYW5kOiBDb21tYW5kUGFydFtdIHwgc3RyaW5nLCBvcHRpb25zOiBFeGVjRGV0YWlsZWRPcHRpb25zKTogUHJvbWlzZTxFeGVjUmVzdWx0Pjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgb3IgYW4gRXhlY1Jlc3VsdCBvYmplY3QuXG4gKiAgICAgICAgICBUaGUgRXhlY1Jlc3VsdCBvYmplY3QgY29udGFpbnMgdGhlIGV4aXQgY29kZSwgZXhpdCBzaWduYWwsIHN0ZGVyciwgYW5kIHN0ZG91dC5cbiAqIEB0aHJvd3MgSWYgdGhlIGNvbW1hbmQgZmFpbHMgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgaWdub3JlRXhpdENvZGUgaXMgYGZhbHNlYC5cbiAqICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4aXQgY29kZSBhbmQgc3RkZXJyLlxuICogICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24gYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGB0cnVlYCxcbiAqICAgICAgICAgdGhlIGVycm9yIGlzIHJlc29sdmVkIHdpdGggdGhlIHN0ZG91dCBhbmQgc3RkZXJyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhjb21tYW5kOiBDb21tYW5kUGFydFtdIHwgc3RyaW5nLCBvcHRpb25zOiBFeGVjT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHQgPSBoYW5kbGVCYXRjaGVkQ29tbWFuZChjb21tYW5kLCBvcHRpb25zKTtcbiAgICBpZiAoYmF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBiYXRjaFJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgJGFyZ3VtZW50cyA9IGNvbW1hbmQuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBjb21tYW5kTGluZSA9IGJ1aWxkQ29tbWFuZExpbmUoJGFyZ3VtZW50cyk7XG5cbiAgICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUxlbmd0aCA9IGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKGNvbW1hbmRMaW5lKTtcbiAgICBpZiAoZWZmZWN0aXZlTGVuZ3RoID4gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvbW1hbmQgbGluZSBpcyB0b28gbG9uZyAoJHtTdHJpbmcoZWZmZWN0aXZlTGVuZ3RoKX0gY2hhcnMgb25jZSB3cmFwcGVkIGZvciB0aGUgc2hlbGwsIG1heCAke1N0cmluZyhtYXhDb21tYW5kTGVuZ3RoKX0gb24gJHtwcm9jZXNzLnBsYXRmb3JtfSkuIENvbnNpZGVyIHNwbGl0dGluZyBpbnRvIHNtYWxsZXIgYmF0Y2hlcyBvciB1c2UgRXhlY0FyZy5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4ZWNTdHJpbmcoe1xuICAgICAgY29tbWFuZDogY29tbWFuZExpbmUsXG4gICAgICBvcHRpb25zLFxuICAgICAgcmF3QXJndW1lbnRzOiAkYXJndW1lbnRzXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kKTtcbiAgaWYgKGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgKCR7U3RyaW5nKGVmZmVjdGl2ZUxlbmd0aCl9IGNoYXJzIG9uY2Ugd3JhcHBlZCBmb3IgdGhlIHNoZWxsLCBtYXggJHtTdHJpbmcobWF4Q29tbWFuZExlbmd0aCl9IG9uICR7cHJvY2Vzcy5wbGF0Zm9ybX0pLiBDb25zaWRlciBzcGxpdHRpbmcgaW50byBzbWFsbGVyIGJhdGNoZXMgb3IgdXNlIEV4ZWNBcmcuYFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZXhlY1N0cmluZyh7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgc2luZ2xlIHN0cmluZyBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gZXhlY1N0cmluZyhwYXJhbXM6IEV4ZWNTdHJpbmdQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGNvbW1hbmQsXG4gICAgb3B0aW9ucyA9IHt9LFxuICAgIHJhd0FyZ3VtZW50c1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCB7XG4gICAgY3dkID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBlbnYsXG4gICAgaXNJbnRlcmFjdGl2ZSA9IGZhbHNlLFxuICAgIGlzUXVpZXQ6IHF1aWV0ID0gZmFsc2UsXG4gICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IGlnbm9yZUV4aXRDb2RlID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZURldGFpbHMgPSBmYWxzZSxcbiAgICBzdGRpbiA9ICcnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZ2V0TGliRGVidWdnZXIoJ0V4ZWMnKShgRXhlY3V0aW5nIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcblxuICAgIGNvbnN0IGNoaWxkID0gc3Bhd25WaWFTaGVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U3Bhd25WaWFTaGVsbFBhcmFtcz4oe1xuICAgICAgY29tbWFuZCxcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICByYXdBcmd1bWVudHNcbiAgICB9KSk7XG5cbiAgICBsZXQgc3Rkb3V0ID0gJyc7XG4gICAgbGV0IHN0ZGVyciA9ICcnO1xuXG4gICAgLy8gSW4gaW50ZXJhY3RpdmUgbW9kZSB0aGUgY2hpbGQncyBzdGRpbyBpcyBpbmhlcml0ZWQgYnkgdGhlIHRlcm1pbmFsLCBzbyB0aGVyZSBhcmUgbm8gc3RyZWFtcyB0byByZWFkIGFuZCBub3RoaW5nIGlzIGNhcHR1cmVkLlxuICAgIGlmICghaXNJbnRlcmFjdGl2ZSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGRlcnI6IGNoaWxkU3RkZXJyLFxuICAgICAgICBzdGRpbjogY2hpbGRTdGRpbixcbiAgICAgICAgc3Rkb3V0OiBjaGlsZFN0ZG91dFxuICAgICAgfSA9IGNoaWxkO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoY2hpbGRTdGRpbiwgJ0NoaWxkIHByb2Nlc3Mgc3RkaW4gaXMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoY2hpbGRTdGRvdXQsICdDaGlsZCBwcm9jZXNzIHN0ZG91dCBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZGVyciwgJ0NoaWxkIHByb2Nlc3Mgc3RkZXJyIGlzIG5vdCBhdmFpbGFibGUnKTtcblxuICAgICAgY2hpbGRTdGRpbi53cml0ZShzdGRpbik7XG4gICAgICBjaGlsZFN0ZGluLmVuZCgpO1xuXG4gICAgICBjaGlsZFN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKCFxdWlldCkge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZG91dCArPSBkYXRhLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkU3Rkb3V0Lm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIHN0ZG91dCA9IHRyaW1FbmQoe1xuICAgICAgICAgICRzdHJpbmc6IHN0ZG91dCxcbiAgICAgICAgICBzdWZmaXg6ICdcXG4nXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkU3RkZXJyLm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RkZXJyICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3RkZXJyID0gdHJpbUVuZCh7XG4gICAgICAgICAgJHN0cmluZzogc3RkZXJyLFxuICAgICAgICAgIHN1ZmZpeDogJ1xcbidcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjaGlsZC5vbignY2xvc2UnLCAoZXhpdENvZGUsIGV4aXRTaWduYWwpID0+IHtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCAmJiAhaWdub3JlRXhpdENvZGUpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZSA/IFN0cmluZyhleGl0Q29kZSkgOiAnKG51bGwpJ31cXG4ke3N0ZGVycn1gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoe1xuICAgICAgICBleGl0Q29kZSxcbiAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgc3RkZXJyLFxuICAgICAgICBzdGRvdXRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoIWlnbm9yZUV4aXRDb2RlKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlOiBudWxsLFxuICAgICAgICBleGl0U2lnbmFsOiBudWxsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYG5vZGVgIENMSSBvcHRpb24gKHBhc3NlZCB2aWEgYE5PREVfT1BUSU9OU2ApIHRoYXQgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGBsb2NhbFN0b3JhZ2VgIHRvIGV2ZXJ5XG4gKiBzcGF3bmVkIGBub2RlYCBwcm9jZXNzLiBOb2RlIDIyKyBleHBvc2VzIGFuIGV4cGVyaW1lbnRhbCBXZWIgU3RvcmFnZSBgbG9jYWxTdG9yYWdlYCwgYnV0IGFjY2Vzc2luZyBpdFxuICogd2l0aG91dCBgLS1sb2NhbHN0b3JhZ2UtZmlsZWAgZW1pdHMgYW4gYEV4cGVyaW1lbnRhbFdhcm5pbmdgIGFuZCBsZWF2ZXMgYGxvY2FsU3RvcmFnZWAgdW5hdmFpbGFibGUuXG4gKiBQb2ludGluZyBpdCBhdCB0aGUgc3BlY2lhbCBgOm1lbW9yeTpgIGRhdGFiYXNlIGdpdmVzIGVhY2ggcHJvY2VzcyBhIHdvcmtpbmcsIG5vbi1wZXJzaXN0ZW50XG4gKiBgbG9jYWxTdG9yYWdlYCAobm8gZmlsZSBvbiBkaXNrLCBubyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMpIFx1MjAxNCBtYXRjaGluZyB0aGUgcmVhbCBPYnNpZGlhblxuICogKEVsZWN0cm9uKSBydW50aW1lIGFuZCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgYnkgYWRkcmVzc2luZyBpdHMgcm9vdCBjYXVzZSByYXRoZXIgdGhhbiBzdXBwcmVzc2luZyBpdC5cbiAqXG4gKiBJdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcnVubmluZyBgbm9kZWAgYWN0dWFsbHkgc3VwcG9ydHMgaXQgKHNlZSB7QGxpbmsgYnVpbGRDaGlsZEVudn0pOiBwYXNzaW5nXG4gKiBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWEgYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgcmVmdXNlIHRvIHN0YXJ0LCBzbyBhbiBvbGRlciBgbm9kZWBcbiAqICg8IDIyKSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkLlxuICovXG5jb25zdCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OID0gJy0tbG9jYWxzdG9yYWdlLWZpbGU9Om1lbW9yeTonO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgaGVsZCBiYWNrIGZyb20gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lIGJ1ZGdldCB3aGVuIHNpemluZyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCwgdG9cbiAqIGNvdmVyIGV4cGFuc2lvbnMgdGhhdCBoYXBwZW4gSU5TSURFIHRoZSBjb21tYW5kIHdlIHNwYXduIGFuZCBhcmUgdGhlcmVmb3JlIGludmlzaWJsZSBmcm9tIGhlcmUuXG4gKlxuICogQSBzaGltbWVkIGA8dG9vbD4gPGFyZ3NcdTIwMjY+YCBpbnZvY2F0aW9uIGlzIG5vdCBvbmUgYGNtZC5leGVgIGNvbW1hbmQgbGluZSBidXQgYSBjaGFpbiBvZiB0aGVtOiB0aGVcbiAqIGAuYmluLzx0b29sPi5jbWRgIHNoaW0gcmUtZXhwYW5kcyBgJSpgIGludG8gYSBmcmVzaCBgbm9kZSBcdTIwMjYgPHRvb2w+LWNsaS5qcyA8YXJnc1x1MjAyNj5gIGxpbmUsIGFuZCBlYWNoIGhvcFxuICogcmUtcXVvdGVzIHdoYXQgaXQgZm9yd2FyZHMuIEV2ZXJ5IG9uZSBvZiB0aG9zZSBsaW5lcyBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIDgxOTEgbGltaXQsIGFuZCBldmVyeSBvbmUgaXNcbiAqIGxvbmdlciB0aGFuIHRoZSBsaW5lIHdlIGFzc2VtYmxlZCBcdTIwMTQgYnV0IGJ5IGhvdyBtdWNoIGlzIHRoZSBjaGlsZCdzIGJ1c2luZXNzLCBub3Qgb3Vycywgc28gbm8gZm9ybXVsYSBjYW5cbiAqIGJlIHJpZ2h0LiBPbmx5IHRoZSBkZWxpYmVyYXRlIHNsYWNrIGJlbG93IGNhbi5cbiAqXG4gKiBgMjA0OGAgaXMgcm91Z2hseSBkb3VibGUgdGhlIG92ZXJoZWFkIG1lYXN1cmVkIHdoZW4gdGhpcyB3YXMgZm91bmQgKFQ2MzUpLCBiYWNrIHdoZW4gZXZlcnkgdG9vbCB3YXNcbiAqIGFkZGl0aW9uYWxseSBmcm9udGVkIGJ5IGBucHhgIGFuZCBzbyBwYWlkIG9uZSBtb3JlIHJlLWV4cGFuc2lvbiBob3AgdGhhbiBpdCBkb2VzIG5vdy4gT3ZlciBhIHJlcG9zaXRvcnknc1xuICogMTg3IG1hcmtkb3duIHBhdGhzLCBhIGBtYXJrZG93bmxpbnQtY2xpMiBcdTIwMjZgIGxpbmUgKiphc3NlbWJsZWQgYXQgNzA1MSBjaGFycyoqIFx1MjAxNCAxMTQwIHVuZGVyIHRoZSBsaW1pdCBcdTIwMTRcbiAqIHN0aWxsIGRpZWQgd2l0aCBgVGhlIGNvbW1hbmQgbGluZSBpcyB0b28gbG9uZy5gOyB0aGUgc2FtZSBwYXlsb2FkIHNwbGl0IGluIHR3byBydW5zIGNsZWFuLiBOb3RlIHRoZSB0b29sOlxuICogdGhpcyBpcyBub3Qgc3BlY2lmaWMgdG8gYGxpbmtpbmF0b3JgLCBpdCBpcyB0aGUgc2hhcGUgb2YgZXZlcnkgc2hpbS1mcm9udGVkIGludm9jYXRpb24uXG4gKlxuICogT3Zlci1yZXNlcnZpbmcgY29zdHMgb25lIGV4dHJhIHNlcXVlbnRpYWwgaW52b2NhdGlvbiBvZiBhIGNvbW1hbmQgdGhhdCB3YXMgYWxyZWFkeSBnb2luZyB0byBiZSBiYXRjaGVkO1xuICogdW5kZXItcmVzZXJ2aW5nIGNvc3RzIGEgbGludCBmYWlsdXJlIHRoYXQgbmFtZXMgbm90aGluZyB3cm9uZyB3aXRoIHRoZSBjb250ZW50LiBSYWlzZSBpdCwgbmV2ZXIgbG93ZXIgaXQsXG4gKiBpZiB0aGUgc3ltcHRvbSByZXR1cm5zLlxuICovXG5jb25zdCBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFID0gMjA0ODtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXhlY3V0ZUJhdGNoZXN9LlxuICovXG5pbnRlcmZhY2UgRXhlY3V0ZUJhdGNoZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJhc2UgY29tbWFuZCB3aXRob3V0IGJhdGNoZWQgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VDb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBiYXRjaGVzIG9mIGFyZ3MuXG4gICAqL1xuICByZWFkb25seSBiYXRjaGVzOiBzdHJpbmdbXVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogRXhlY09wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNwYXduVmlhU2hlbGx9LlxuICovXG5pbnRlcmZhY2UgU3Bhd25WaWFTaGVsbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgY2hpbGQgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhdHRhY2hlcyB0aGUgY2hpbGQncyBzdGRpbyB0byB0aGUgdGVybWluYWwgaW5zdGVhZCBvZiBwaXBpbmcgaXQuXG4gICAqL1xuICByZWFkb25seSBpc0ludGVyYWN0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGFyZ3VtZW50IGFycmF5IChpZiBhdmFpbGFibGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQnVpbGRzIGEgY29tbWFuZC1saW5lIHN0cmluZyBmcm9tIGFuIGFyZ3VtZW50IGFycmF5LCBxdW90ZWQgZm9yIHRoZSBzaGVsbCB0aGF0XG4gKiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0gd2lsbCByb3V0ZSB0aHJvdWdoIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICpcbiAqIE9uIFdpbmRvd3MgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgdmlhIGBjbWQuZXhlYCwgc28gaXQgdXNlcyB0aGVcbiAqIGBDb21tYW5kTGluZVRvQXJndldgIGNvbnZlbnRpb24gKHtAbGluayB0b0NvbW1hbmRMaW5lfSk7IHtAbGluayBzcGF3blZpYVNoZWxsfVxuICogdGhlbiBhcHBsaWVzIHtAbGluayBjbWRFc2NhcGVDb21tYW5kTGluZX0gb24gdG9wIGZvciBgY21kLmV4ZWAgbWV0YWNoYXJhY3RlcnMuXG4gKiBFbHNld2hlcmUgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgdmlhIGBzaCAtY2AsIHNvIGl0IHVzZXMgUE9TSVggc2luZ2xlLXF1b3RlXG4gKiBxdW90aW5nICh7QGxpbmsgdG9Qb3NpeENvbW1hbmRMaW5lfSkgYW5kIG5lZWRzIG5vIGZ1cnRoZXIgZXNjYXBpbmcuXG4gKlxuICogVGhlIHBsYXRmb3JtIGJyYW5jaCBoZXJlIE1VU1Qgc3RheSBpbiBzeW5jIHdpdGggdGhlIG9uZSBpbiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKlxuICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgYXJndW1lbnQgYXJyYXkgdG8gcXVvdGUgYW5kIGpvaW4uXG4gKiBAcmV0dXJucyBUaGUgcXVvdGVkIGNvbW1hbmQtbGluZSBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtJ3Mgc2hlbGwuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ29tbWFuZExpbmUoJGFyZ3VtZW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHRvQ29tbWFuZExpbmUoJGFyZ3VtZW50cykgOiB0b1Bvc2l4Q29tbWFuZExpbmUoJGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYmF0Y2hlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciBvdXRwdXQuXG4gKlxuICogYGV4ZWNTdHJpbmdgIHJldHVybnMgYSBgc3RyaW5nYCBvciBhbiB7QGxpbmsgRXhlY1Jlc3VsdH0gZGVwZW5kaW5nIG9uIGBvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzYCwgc29cbiAqIGJvdGggc2hhcGVzIGFyZSB1bnBhY2tlZCBcdTIwMTQgcmVhZGluZyBvbmx5IHRoZSBgc3RyaW5nYCBvbmUgc2lsZW50bHkgdGhyZXcgYXdheSBldmVyeSBiYXRjaCdzIG91dHB1dCBpblxuICogZXhhY3RseSB0aGUgbW9kZSB0aGF0IGFza2VkIGZvciBpdC5cbiAqXG4gKiBBIGJhdGNoIHRoYXQgZXhpdHMgbm9uLXplcm8gbm9ybWFsbHkgcmVqZWN0czsgaXQgb25seSByZWFjaGVzIGhlcmUgd2hlbiBgc2hvdWxkSWdub3JlRXhpdENvZGVgIGFza2VkIGZvclxuICogaXQgdG8gYmUgcmVwb3J0ZWQgaW5zdGVhZC4gVGhlIGZpcnN0IHN1Y2ggZmFpbHVyZSBpcyB3aGF0IHRoZSBhZ2dyZWdhdGUgcmVwb3J0cywgc28gc3BsaXR0aW5nIGEgY29tbWFuZFxuICogaW50byBiYXRjaGVzIGNhbm5vdCB0dXJuIGEgZmFpbHVyZSBpbnRvIGEgc3VjY2Vzcy5cbiAqXG4gKiBTaWxlbnQgYmF0Y2hlcyBjb250cmlidXRlIG5vdGhpbmcgdG8gdGhlIGpvaW5lZCBvdXRwdXQuIGBleGVjU3RyaW5nYCBhbHJlYWR5IHRyaW1zIGVhY2ggcmVzdWx0J3MgdHJhaWxpbmdcbiAqIG5ld2xpbmUsIHNvIGpvaW5pbmcgZW1wdHkgb25lcyBiYWNrIGluIHdvdWxkIHJlaW50cm9kdWNlIGV4YWN0bHkgdGhlIGJsYW5rLWxpbmUgbm9pc2UgaXQgcmVtb3ZlZCBcdTIwMTQgYVxuICogY29tbWFuZCB0aGF0IHByaW50ZWQgbm90aGluZyBtdXN0IGFnZ3JlZ2F0ZSB0byBgJydgLCBub3QgdG8gYSBydW4gb2YgbmV3bGluZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYmF0Y2hlZCBleGVjdXRpb24uXG4gKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBjb25jYXRlbmF0ZWQgcmVzdWx0LlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQmF0Y2hlcyhwYXJhbXM6IEV4ZWN1dGVCYXRjaGVzUGFyYW1zKTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYmFzZUNvbW1hbmQsIGJhdGNoZXMsIG9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3Qgc3Rkb3V0UGFydHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHN0ZGVyclBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZmFpbHVyZTogRXhlY1Jlc3VsdCB8IG51bGwgPSBudWxsO1xuXG4gIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgIGNvbnN0IGJhdGNoQ29tbWFuZCA9IGAke2Jhc2VDb21tYW5kfSAke2J1aWxkQ29tbWFuZExpbmUoYmF0Y2gpfWA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY1N0cmluZyh7XG4gICAgICBjb21tYW5kOiBiYXRjaENvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwdXNoSWZOb3RFbXB0eShzdGRvdXRQYXJ0cywgcmVzdWx0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHB1c2hJZk5vdEVtcHR5KHN0ZG91dFBhcnRzLCByZXN1bHQuc3Rkb3V0KTtcbiAgICBwdXNoSWZOb3RFbXB0eShzdGRlcnJQYXJ0cywgcmVzdWx0LnN0ZGVycik7XG4gICAgZmFpbHVyZSA/Pz0gcmVzdWx0LmV4aXRDb2RlID09PSAwID8gbnVsbCA6IHJlc3VsdDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiBmYWlsdXJlPy5leGl0Q29kZSA/PyAwLFxuICAgICAgZXhpdFNpZ25hbDogZmFpbHVyZT8uZXhpdFNpZ25hbCA/PyBudWxsLFxuICAgICAgc3RkZXJyOiBzdGRlcnJQYXJ0cy5qb2luKCdcXG4nKSxcbiAgICAgIHN0ZG91dDogc3Rkb3V0UGFydHMuam9pbignXFxuJylcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0ZG91dFBhcnRzLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIERlZmF1bHQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHBhc3NlZCB0byBjaGlsZCBwcm9jZXNzZXMsIHJlc29sdmVkIGF0IHNwYXduIHRpbWUuXG4gKlxuICogRGVsaWJlcmF0ZWx5IG5vdCBhIG1vZHVsZS1sZXZlbCBjb25zdGFudC4gYC5lbnZgIGlzIGxvYWRlZCBieSBgbG9hZEVudkZpbGVJZkV4aXN0c2AgZnJvbSBpbnNpZGVcbiAqIGB3cmFwQ2xpVGFza2AsIGFuZCBFU00gZXZhbHVhdGVzIGV2ZXJ5IGltcG9ydCBiZWZvcmUgdGhlIGVudHJ5IG1vZHVsZSdzIGZpcnN0IHN0YXRlbWVudCBcdTIwMTQgc28gYVxuICogc25hcHNob3QgdGFrZW4gaGVyZSB3b3VsZCBhbHdheXMgcHJlZGF0ZSB0aGUgbG9hZCwgYW5kIGV2ZXJ5IHNwYXduZWQgY2hpbGQgd291bGQgcnVuIHdpdGhvdXQgdGhlXG4gKiByZXBvJ3Mgb3duIGAuZW52YC4gTm90aGluZyBzdXJmYWNlZCB0aGF0IHdoaWxlIFZpdGVzdCAzIGNvcGllZCB0aGUgYC5lbnZgIGl0IGxvYWRlZCBpbnRvIHRoZVxuICogd29ya2VyJ3MgYHByb2Nlc3MuZW52YDsgVml0ZXN0IDQgd3JpdGVzIHRob3NlIHRvIGBpbXBvcnQubWV0YS5lbnZgIG9ubHksIGxlYXZpbmcgdGhpcyB0aGUgc29sZVxuICogcGF0aCBhbmQgYW4gZW1wdHkgb25lLlxuICpcbiAqIEByZXR1cm5zIFRoZSBlbnZpcm9ubWVudCB0byBwYXNzIHRvIHNwYXduZWQgY2hpbGQgcHJvY2Vzc2VzLCByZWZsZWN0aW5nIGBwcm9jZXNzLmVudmAgYXMgaXQgc3RhbmRzIG5vdy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2hpbGRFbnYoKTogTm9kZUpTLlByb2Nlc3NFbnYge1xuICByZXR1cm4gYnVpbGRDaGlsZEVudihwcm9jZXNzLmVudiwgcHJvY2Vzcy5hbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3MpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBsaW5lIGFzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYWN0dWFsbHkgc2VlIGl0LCB3aGljaCBvbiBXaW5kb3dzIGlzXG4gKiBOT1QgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHBhc3NlZCBpbi5cbiAqXG4gKiB7QGxpbmsgc3Bhd25WaWFTaGVsbH0gcm91dGVzIHRoZSBjb21tYW5kIHRocm91Z2ggYGNtZC5leGVgLCBhbmQgdHdvIHRoaW5ncyBhcmUgc3BlbnQgYmV0d2VlbiBoZXJlIGFuZFxuICogdGhlcmUsIG5laXRoZXIgb2YgdGhlbSB2aXNpYmxlIGluIHRoZSBhc3NlbWJsZWQgY29tbWFuZDpcbiAqIC0gTm9kZSdzIGBzcGF3bihcdTIwMjYsIHsgc2hlbGw6IHRydWUgfSlgIHdyYXBzIGl0IGFzIGA8Y29tc3BlYz4gL2QgL3MgL2MgXCI8Y29tbWFuZD5cImAuXG4gKiAtIHtAbGluayBjbWRFc2NhcGVDb21tYW5kTGluZX0gYF5gLWVzY2FwZXMgZXZlcnkgb25lIG9mIGBjbWQuZXhlYCdzIG1ldGFjaGFyYWN0ZXJzLCB3aGljaCBvbiBhIGxpc3Qgb2ZcbiAqICAgcXVvdGVkIHBhdGhzIGlzIGEgZmV3IHBlcmNlbnQgb2YgdGhlIHdob2xlIChtZWFzdXJlZDogKzIzNiBjaGFycyBvbiBhIDcyMTYtY2hhciBpbnZvY2F0aW9uKS5cbiAqXG4gKiBCb3RoIGFyZSBvdXJzIHRvIGNvbXB1dGUsIHNvIHRoZXkgYXJlIGNvbXB1dGVkIHJhdGhlciB0aGFuIGd1ZXNzZWQuIFdoYXQgaXMgTk9UIGNvbXB1dGFibGUgZnJvbSBoZXJlIGlzXG4gKiB3aGF0IHRoZSBzcGF3bmVkIGNvbW1hbmQgZG9lcyB0byBpdHMgb3duIGFyZ3VtZW50cyBcdTIwMTQgc2VlIHtAbGluayBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFfS5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gYnJhbmNoIGhlcmUgTVVTVCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgb25lIGluIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZExpbmUgLSBUaGUgYXNzZW1ibGVkIGNvbW1hbmQgbGluZSwgYmVmb3JlIGFueSBzaGVsbCB3cmFwcGluZy5cbiAqIEByZXR1cm5zIFRoZSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB3aGF0IHJlYWNoZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKGNvbW1hbmRMaW5lOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBjb21tYW5kTGluZS5sZW5ndGg7XG4gIH1cblxuICBjb25zdCBjb21zcGVjID0gcHJvY2Vzcy5lbnZbJ2NvbXNwZWMnXSA/PyAnY21kLmV4ZSc7XG4gIGNvbnN0IENNRF9XUkFQUEVSID0gJyAvZCAvcyAvYyBcIlwiJztcbiAgcmV0dXJuIGNvbXNwZWMubGVuZ3RoICsgQ01EX1dSQVBQRVIubGVuZ3RoICsgY29tbWFuZEVzY2FwZUNvbW1hbmRMaW5lKGNvbW1hbmRMaW5lKS5sZW5ndGg7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IGNvbW1hbmQgbGluZSBsZW5ndGggdG8gc2l6ZSBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCBhZ2FpbnN0IFx1MjAxNCB0aGUgcGxhdGZvcm0gbWF4aW11bVxuICogbGVzcyB7QGxpbmsgV0lORE9XU19DSElMRF9FWFBBTlNJT05fUkVTRVJWRX0uXG4gKlxuICogRGVsaWJlcmF0ZWx5IG1vcmUgY29uc2VydmF0aXZlIHRoYW4ge0BsaW5rIGdldE1heENvbW1hbmRMZW5ndGh9LCBiZWNhdXNlIHRoZSB0d28gYW5zd2VyIGRpZmZlcmVudFxuICogcXVlc3Rpb25zLiBFeGNlZWRpbmcgdGhlIHBsYWluLWNvbW1hbmQgbGltaXQgaXMgYSBoYXJkIGZhaWx1cmUgdGhlIGNhbGxlciBjYW5ub3QgYXZvaWQsIHNvIHRoYXQgY2hlY2tcbiAqIHN0YXlzIGV4YWN0LiBFeGNlZWRpbmcgdGhlIGJhdGNoaW5nIGxpbWl0IG9ubHkgY29zdHMgb25lIGV4dHJhIGludm9jYXRpb24sIHNvIHRoYXQgY2hlY2sgbWF5IFx1MjAxNCBhbmRcbiAqIHNob3VsZCBcdTIwMTQgbGVhdmUgcm9vbSB0byBzcGFyZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbWF4IGxlbmd0aCBpbiBjaGFyYWN0ZXJzIGF2YWlsYWJsZSB0byBhIHNpbmdsZSBiYXRjaC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCk6IG51bWJlciB7XG4gIHJldHVybiBnZXRNYXhDb21tYW5kTGVuZ3RoKCkgLSAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgOiAwKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBtYXggY29tbWFuZCBsaW5lIGxlbmd0aC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbWF4IGNvbW1hbmQgbGVuZ3RoIGluIGNoYXJhY3RlcnMuXG4gKi9cbmZ1bmN0aW9uIGdldE1heENvbW1hbmRMZW5ndGgoKTogbnVtYmVyIHtcbiAgY29uc3QgV0lORE9XU19NQVhfQ09NTUFORF9MRU5HVEggPSA4MTkxO1xuICBjb25zdCBVTklYX01BWF9DT01NQU5EX0xFTkdUSCA9IDEzMV8wNzI7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gV0lORE9XU19NQVhfQ09NTUFORF9MRU5HVEggOiBVTklYX01BWF9DT01NQU5EX0xFTkdUSDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgY29tbWFuZCBhcnJheSB0aGF0IG1heSBjb250YWluIGFuIHtAbGluayBFeGVjQXJndW1lbnR9LlxuICogUmV0dXJucyBhIFByb21pc2UgaWYgYmF0Y2hpbmcgaXMgbmVlZGVkLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgY29tbWFuZFxuICogaGFzIG5vIEV4ZWNBcmcgYW5kIHNob3VsZCBiZSBwcm9jZXNzZWQgbm9ybWFsbHkuXG4gKlxuICogQHBhcmFtIHBhcnRzIC0gVGhlIGNvbW1hbmQgcGFydHMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBleGVjIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIFByb21pc2UgaWYgYmF0Y2hpbmcgaXMgaGFuZGxlZCwgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZUJhdGNoZWRDb21tYW5kKHBhcnRzOiBDb21tYW5kUGFydFtdLCBvcHRpb25zOiBFeGVjT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBleGVjQXJndW1lbnRzID0gcGFydHMuZmlsdGVyKGlzRXhlY0FyZ3VtZW50KTtcbiAgaWYgKGV4ZWNBcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZXhlY0FyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignT25seSBvbmUgRXhlY0FyZyB3aXRoIGJhdGNoZWRBcmd1bWVudHMgaXMgYWxsb3dlZCBwZXIgY29tbWFuZCcpKTtcbiAgfVxuXG4gIGNvbnN0IGV4ZWNBcmd1bWVudCA9IGV4ZWNBcmd1bWVudHNbMF07XG4gIGFzc2VydE5vbk51bGxhYmxlKGV4ZWNBcmd1bWVudCk7XG4gIGNvbnN0IHN0YXRpY1BhcnRzID0gcGFydHMuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKTtcbiAgY29uc3QgYmFzZUNvbW1hbmQgPSBidWlsZENvbW1hbmRMaW5lKHN0YXRpY1BhcnRzKTtcbiAgY29uc3QgbWF4Q29tbWFuZExlbmd0aCA9IGdldE1heEJhdGNoQ29tbWFuZExlbmd0aCgpO1xuXG4gIC8vIFRyeSBleHBhbmRpbmcgYWxsIGFyZ3MgaW5saW5lXG4gIGNvbnN0IGZ1bGxDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShbLi4uZXhlY0FyZ3VtZW50LmJhdGNoZWRBcmd1bWVudHNdKX1gO1xuICBpZiAoZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoZnVsbENvbW1hbmQpIDw9IG1heENvbW1hbmRMZW5ndGgpIHtcbiAgICByZXR1cm4gZXhlY1N0cmluZyh7XG4gICAgICBjb21tYW5kOiBmdWxsQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNwbGl0IGludG8gYmF0Y2hlc1xuICBjb25zdCBiYXRjaGVzOiBzdHJpbmdbXVtdID0gW107XG4gIGxldCBjdXJyZW50QmF0Y2g6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBleGVjQXJndW1lbnQuYmF0Y2hlZEFyZ3VtZW50cykge1xuICAgIGNvbnN0IHRlbnRhdGl2ZSA9IGAke2Jhc2VDb21tYW5kfSAke2J1aWxkQ29tbWFuZExpbmUoWy4uLmN1cnJlbnRCYXRjaCwgYXJndW1lbnRdKX1gO1xuICAgIGlmIChnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aCh0ZW50YXRpdmUpID4gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgICAgaWYgKGN1cnJlbnRCYXRjaC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3Qgc3BsaXQgY29tbWFuZCBpbnRvIGJhdGNoZXM6IGEgc2luZ2xlIGFyZ3VtZW50ICgke1N0cmluZyhhcmd1bWVudC5sZW5ndGgpfSBjaGFycykgcGx1cyB0aGUgYmFzZSBjb21tYW5kICgke1N0cmluZyhiYXNlQ29tbWFuZC5sZW5ndGgpfSBjaGFycykgZXhjZWVkcyB0aGUgbWF4IGJhdGNoIGNvbW1hbmQgbGVuZ3RoICgke1N0cmluZyhtYXhDb21tYW5kTGVuZ3RoKX0pLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBiYXRjaGVzLnB1c2goY3VycmVudEJhdGNoKTtcbiAgICAgIGN1cnJlbnRCYXRjaCA9IFthcmd1bWVudF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRCYXRjaC5wdXNoKGFyZ3VtZW50KTtcbiAgICB9XG4gIH1cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsd2F5cyB0cnVlIGFmdGVyIHRoZSBsb29wOyBiYXRjaGVkQXJndW1lbnRzIGlzIG5vbi1lbXB0eSBhdCB0aGlzIHBvaW50LiAqL1xuICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVCYXRjaGVzKHtcbiAgICBiYXNlQ29tbWFuZCxcbiAgICBiYXRjaGVzLFxuICAgIG9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgY29tbWFuZCBwYXJ0IGlzIGFuIHtAbGluayBFeGVjQXJndW1lbnR9LlxuICpcbiAqIEBwYXJhbSBwYXJ0IC0gVGhlIGNvbW1hbmQgcGFydCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBhcnQgaXMgYW4gRXhlY0FyZy5cbiAqL1xuZnVuY3Rpb24gaXNFeGVjQXJndW1lbnQocGFydDogQ29tbWFuZFBhcnQpOiBwYXJ0IGlzIEV4ZWNBcmd1bWVudCB7XG4gIHJldHVybiB0eXBlb2YgcGFydCA9PT0gJ29iamVjdCcgJiYgJ2JhdGNoZWRBcmd1bWVudHMnIGluIHBhcnQ7XG59XG5cbi8qKlxuICogQXBwZW5kcyBhIGJhdGNoJ3MgY2FwdHVyZWQgb3V0cHV0IHRvIHRoZSBhY2N1bXVsYXRvciwgc2tpcHBpbmcgYW4gZW1wdHkgb25lIHNvIHRoZSBldmVudHVhbCBqb2luIGRvZXMgbm90XG4gKiBmYWJyaWNhdGUgYmxhbmsgbGluZXMgZm9yIGJhdGNoZXMgdGhhdCBwcmludGVkIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIGFjY3VtdWxhdG9yIC0gVGhlIGNvbGxlY3RlZCBvdXRwdXRzIHNvIGZhci5cbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgb3V0cHV0IG9mIGEgc2luZ2xlIGJhdGNoLlxuICovXG5mdW5jdGlvbiBwdXNoSWZOb3RFbXB0eShhY2N1bXVsYXRvcjogc3RyaW5nW10sIG91dHB1dDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChvdXRwdXQgIT09ICcnKSB7XG4gICAgYWNjdW11bGF0b3IucHVzaChvdXRwdXQpO1xuICB9XG59XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyB2aWEgdGhlIGFwcHJvcHJpYXRlIHNoZWxsLlxuICpcbiAqIE9uIFdpbmRvd3MsIGlmIHRoZSBjb21tYW5kIGNvbnRhaW5zIG5ld2xpbmVzICh3aGljaCBgY21kLmV4ZWAgY2Fubm90IGhhbmRsZSlcbiAqIGFuZCB0aGUgcmF3IGFyZ3MgYXJyYXkgaXMgYXZhaWxhYmxlLCBzcGF3bnMgdGhlIHByb2Nlc3MgZGlyZWN0bHkgd2l0aG91dFxuICogYW55IHNoZWxsIFx1MjAxNCBwYXNzaW5nIGFyZ3MgdmlhIGBDcmVhdGVQcm9jZXNzYCwgd2hpY2ggYXZvaWRzIGFsbCBxdW90aW5nIGlzc3Vlcy5cbiAqXG4gKiBPbiBXaW5kb3dzIChjbWQuZXhlIHBhdGgpLCBhcHBsaWVzIGBeYC1lc2NhcGluZyBmb3IgY21kIG1ldGFjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc3Bhd25pbmcgdGhlIGNoaWxkIHByb2Nlc3MuXG4gKiBAcmV0dXJucyBUaGUgc3Bhd25lZCBjaGlsZCBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzcGF3blZpYVNoZWxsKHBhcmFtczogU3Bhd25WaWFTaGVsbFBhcmFtcyk6IENoaWxkUHJvY2VzcyB7XG4gIGNvbnN0IHsgY29tbWFuZCwgY3dkLCBlbnY6IGV4dHJhRW52LCBpc0ludGVyYWN0aXZlID0gZmFsc2UsIHJhd0FyZ3VtZW50cyB9ID0gcGFyYW1zO1xuICBjb25zdCBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0ge1xuICAgIC4uLmdldENoaWxkRW52KCksXG4gICAgLi4uZXh0cmFFbnZcbiAgfTtcbiAgY29uc3Qgc3RkaW86ICdpbmhlcml0JyB8ICdwaXBlJyA9IGlzSW50ZXJhY3RpdmUgPyAnaW5oZXJpdCcgOiAncGlwZSc7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmIGNvbW1hbmQuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgaWYgKCFyYXdBcmd1bWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29tbWFuZHMgY29udGFpbmluZyBuZXdsaW5lcyBjYW5ub3QgYmUgZXhlY3V0ZWQgdGhyb3VnaCBjbWQuZXhlIG9uIFdpbmRvd3MuIFBhc3MgYW4gYXJndW1lbnQgYXJyYXkgaW5zdGVhZCBvZiBhIHN0cmluZy4nKTtcbiAgICB9XG4gICAgY29uc3QgW3Byb2dyYW0sIC4uLiRhcmd1bWVudHNdID0gcmF3QXJndW1lbnRzO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdDb21tYW5kIGFycmF5IG11c3Qgbm90IGJlIGVtcHR5Jyk7XG4gICAgcmV0dXJuIHNwYXduKHByb2dyYW0sICRhcmd1bWVudHMsIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHN0ZGlvXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzaGVsbENvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gY29tbWFuZEVzY2FwZUNvbW1hbmRMaW5lKGNvbW1hbmQpIDogY29tbWFuZDtcbiAgcmV0dXJuIHNwYXduKHNoZWxsQ29tbWFuZCwgW10sIHtcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvXG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztB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QTJDO0FBQ2hFLFFBQU0sRUFBRSxTQUFTLEtBQUssS0FBSyxVQUFVLGdCQUFnQixPQUFPLGFBQWEsSUFBSTtBQUM3RSxRQUFNLE1BQXlCO0FBQUEsSUFDN0IsR0FBRyxZQUFZO0FBQUEsSUFDZixHQUFHO0FBQUEsRUFDTDtBQUNBLFFBQU0sUUFBNEIsZ0JBQWdCLFlBQVk7QUFDOUQsTUFBSSxRQUFRLGFBQWEsV0FBVyxRQUFRLFNBQVMsSUFBSSxHQUFHO0FBQzFELFFBQUksQ0FBQyxjQUFjO0FBQ2pCLFlBQU0sSUFBSSxNQUFNLHlIQUF5SDtBQUFBLElBQzNJO0FBQ0EsVUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFVLElBQUk7QUFDakMsc0JBQWtCLFNBQVMsaUNBQWlDO0FBQzVELFdBQU8sTUFBTSxTQUFTLFlBQVk7QUFBQSxNQUNoQztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFFBQU0sZUFBZSxRQUFRLGFBQWEsVUFBVSx5QkFBeUIsT0FBTyxJQUFJO0FBQ3hGLFNBQU8sTUFBTSxjQUFjLENBQUMsR0FBRztBQUFBLElBQzdCO0FBQUEsSUFDQTtBQUFBLElBQ0EsT0FBTztBQUFBLElBQ1A7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsibWF4Q29tbWFuZExlbmd0aCIsICJlZmZlY3RpdmVMZW5ndGgiXQp9Cg==
@@ -48,6 +48,7 @@ import {
48
48
  } from "../../path.mjs";
49
49
  import { assertNonNullable } from "../../type-guards.mjs";
50
50
  import { ObsidianDevUtilsRepoPaths } from "../obsidian-dev-utils-repo-paths.mjs";
51
+ import { resolveToolCommand } from "../package-manager.mjs";
51
52
  import {
52
53
  execFromRoot,
53
54
  getRootFolder,
@@ -68,9 +69,9 @@ async function format(options) {
68
69
  }
69
70
  const command = rewrite ? "fmt" : "check";
70
71
  const targets = paths?.length ? paths : ["**/*"];
71
- await execFromRoot(["npx", "dprint", command, "--config", dprintJsonPath, { batchedArguments: targets }]);
72
+ await execFromRoot([...resolveToolCommand({ tool: "dprint" }), command, "--config", dprintJsonPath, { batchedArguments: targets }]);
72
73
  }
73
74
  export {
74
75
  format
75
76
  };
76
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9mb3JtYXR0ZXJzL2RwcmludC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZvcm1hdCB0aGUgc291cmNlIGNvZGUuXG4gKi9cblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQge1xuICBnZXRGb2xkZXJOYW1lLFxuICBqb2luXG59IGZyb20gJy4uLy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICBnZXRSb290Rm9sZGVyLFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuLi9yb290LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIGZvcm1hdH0gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBmaWxlIHBhdGhzIHRvIGZvcm1hdC4gSWYgb21pdHRlZCwgZm9ybWF0cyB0aGUgZW50aXJlIHByb2plY3QuXG4gICAqL1xuICByZWFkb25seSBwYXRocz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJld3JpdGUgdGhlIHNvdXJjZSBjb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHJld3JpdGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZvcm1hdCB0aGUgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEZvcm1hdE9wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBmb3JtYXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmb3JtYXQob3B0aW9ucz86IEZvcm1hdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBwYXRocywgcmV3cml0ZSA9IHRydWUgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJvb3RGb2xkZXIgPSBnZXRSb290Rm9sZGVyKCk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHJvb3RGb2xkZXIsICdSb290IGZvbGRlciBub3QgZm91bmQnKTtcbiAgbGV0IGRwcmludEpzb25QYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRwcmludEpzb24gfSk7XG4gIGlmICghZXhpc3RzU3luYyhkcHJpbnRKc29uUGF0aCkpIHtcbiAgICBjb25zdCBwYWNrYWdlRm9sZGVyID0gZ2V0Um9vdEZvbGRlcihnZXRGb2xkZXJOYW1lKGltcG9ydC5tZXRhLnVybCkpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHBhY2thZ2VGb2xkZXIsICdDb3VsZCBub3QgZmluZCBwYWNrYWdlIGZvbGRlci4nKTtcbiAgICBkcHJpbnRKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgY3dkOiBwYWNrYWdlRm9sZGVyLCBwYXRoOiBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdFRlbXBsYXRlcywgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EcHJpbnRKc29uKSB9KTtcbiAgfVxuXG4gIGlmICghZXhpc3RzU3luYyhkcHJpbnRKc29uUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RwcmludC5qc29uIG5vdCBmb3VuZCcpO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZCA9IHJld3JpdGUgPyAnZm10JyA6ICdjaGVjayc7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGUgcGF0aHMtcHJvdmlkZWQgYnJhbmNoIGlzIG9ubHkgZXhlcmNpc2VkIGJ5IGNvbnN1bWVyIHByb2plY3RzIHBhc3NpbmcgZmlsZSBsaXN0cy4gKi9cbiAgY29uc3QgdGFyZ2V0cyA9IHBhdGhzPy5sZW5ndGggPyBwYXRocyA6IFsnKiovKiddO1xuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICBhd2FpdCBleGVjRnJvbVJvb3QoWyducHgnLCAnZHByaW50JywgY29tbWFuZCwgJy0tY29uZmlnJywgZHByaW50SnNvblBhdGgsIHsgYmF0Y2hlZEFyZ3VtZW50czogdGFyZ2V0cyB9XSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsU0FBUyxrQkFBa0I7QUFFM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGlDQUFpQztBQUMxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUF5QlAsZUFBc0IsT0FBTyxTQUF3QztBQUNuRSxRQUFNLEVBQUUsT0FBTyxVQUFVLEtBQUssSUFBSSxXQUFXLENBQUM7QUFDOUMsUUFBTSxhQUFhLGNBQWM7QUFDakMsb0JBQWtCLFlBQVksdUJBQXVCO0FBQ3JELE1BQUksaUJBQWlCLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLFdBQVcsQ0FBQztBQUMzRixNQUFJLENBQUMsV0FBVyxjQUFjLEdBQUc7QUFDL0IsVUFBTSxnQkFBZ0IsY0FBYyxjQUFjLFlBQVksR0FBRyxDQUFDO0FBQ2xFLHNCQUFrQixlQUFlLGdDQUFnQztBQUNqRSxxQkFBaUIsd0JBQXdCLEVBQUUsS0FBSyxlQUFlLE1BQU0sS0FBSywwQkFBMEIsZUFBZSwwQkFBMEIsVUFBVSxFQUFFLENBQUM7QUFBQSxFQUM1SjtBQUVBLE1BQUksQ0FBQyxXQUFXLGNBQWMsR0FBRztBQUMvQixVQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxFQUN6QztBQUVBLFFBQU0sVUFBVSxVQUFVLFFBQVE7QUFFbEMsUUFBTSxVQUFVLE9BQU8sU0FBUyxRQUFRLENBQUMsTUFBTTtBQUUvQyxRQUFNLGFBQWEsQ0FBQyxPQUFPLFVBQVUsU0FBUyxZQUFZLGdCQUFnQixFQUFFLGtCQUFrQixRQUFRLENBQUMsQ0FBQztBQUMxRzsiLAogICJuYW1lcyI6IFtdCn0K
77
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9mb3JtYXR0ZXJzL2RwcmludC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZvcm1hdCB0aGUgc291cmNlIGNvZGUuXG4gKi9cblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQge1xuICBnZXRGb2xkZXJOYW1lLFxuICBqb2luXG59IGZyb20gJy4uLy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi4vcGFja2FnZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgZ2V0Um9vdEZvbGRlcixcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi4vcm9vdC50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE9wdGlvbnMge1xuICAvKipcbiAgICogT3B0aW9uYWwgZmlsZSBwYXRocyB0byBmb3JtYXQuIElmIG9taXR0ZWQsIGZvcm1hdHMgdGhlIGVudGlyZSBwcm9qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aHM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXdyaXRlIHRoZSBzb3VyY2UgY29kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSByZXdyaXRlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgdGhlIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc291cmNlIGNvZGUgaGFzIGJlZW4gZm9ybWF0dGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0KG9wdGlvbnM/OiBGb3JtYXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcGF0aHMsIHJld3JpdGUgPSB0cnVlIH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCByb290Rm9sZGVyID0gZ2V0Um9vdEZvbGRlcigpO1xuICBhc3NlcnROb25OdWxsYWJsZShyb290Rm9sZGVyLCAnUm9vdCBmb2xkZXIgbm90IGZvdW5kJyk7XG4gIGxldCBkcHJpbnRKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EcHJpbnRKc29uIH0pO1xuICBpZiAoIWV4aXN0c1N5bmMoZHByaW50SnNvblBhdGgpKSB7XG4gICAgY29uc3QgcGFja2FnZUZvbGRlciA9IGdldFJvb3RGb2xkZXIoZ2V0Rm9sZGVyTmFtZShpbXBvcnQubWV0YS51cmwpKTtcbiAgICBhc3NlcnROb25OdWxsYWJsZShwYWNrYWdlRm9sZGVyLCAnQ291bGQgbm90IGZpbmQgcGFja2FnZSBmb2xkZXIuJyk7XG4gICAgZHByaW50SnNvblBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IGN3ZDogcGFja2FnZUZvbGRlciwgcGF0aDogam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3RUZW1wbGF0ZXMsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRHByaW50SnNvbikgfSk7XG4gIH1cblxuICBpZiAoIWV4aXN0c1N5bmMoZHByaW50SnNvblBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkcHJpbnQuanNvbiBub3QgZm91bmQnKTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1hbmQgPSByZXdyaXRlID8gJ2ZtdCcgOiAnY2hlY2snO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVGhlIHBhdGhzLXByb3ZpZGVkIGJyYW5jaCBpcyBvbmx5IGV4ZXJjaXNlZCBieSBjb25zdW1lciBwcm9qZWN0cyBwYXNzaW5nIGZpbGUgbGlzdHMuICovXG4gIGNvbnN0IHRhcmdldHMgPSBwYXRocz8ubGVuZ3RoID8gcGF0aHMgOiBbJyoqLyonXTtcbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAnZHByaW50JyB9KSwgY29tbWFuZCwgJy0tY29uZmlnJywgZHByaW50SnNvblBhdGgsIHsgYmF0Y2hlZEFyZ3VtZW50czogdGFyZ2V0cyB9XSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsU0FBUyxrQkFBa0I7QUFFM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGlDQUFpQztBQUMxQyxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUF5QlAsZUFBc0IsT0FBTyxTQUF3QztBQUNuRSxRQUFNLEVBQUUsT0FBTyxVQUFVLEtBQUssSUFBSSxXQUFXLENBQUM7QUFDOUMsUUFBTSxhQUFhLGNBQWM7QUFDakMsb0JBQWtCLFlBQVksdUJBQXVCO0FBQ3JELE1BQUksaUJBQWlCLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLFdBQVcsQ0FBQztBQUMzRixNQUFJLENBQUMsV0FBVyxjQUFjLEdBQUc7QUFDL0IsVUFBTSxnQkFBZ0IsY0FBYyxjQUFjLFlBQVksR0FBRyxDQUFDO0FBQ2xFLHNCQUFrQixlQUFlLGdDQUFnQztBQUNqRSxxQkFBaUIsd0JBQXdCLEVBQUUsS0FBSyxlQUFlLE1BQU0sS0FBSywwQkFBMEIsZUFBZSwwQkFBMEIsVUFBVSxFQUFFLENBQUM7QUFBQSxFQUM1SjtBQUVBLE1BQUksQ0FBQyxXQUFXLGNBQWMsR0FBRztBQUMvQixVQUFNLElBQUksTUFBTSx1QkFBdUI7QUFBQSxFQUN6QztBQUVBLFFBQU0sVUFBVSxVQUFVLFFBQVE7QUFFbEMsUUFBTSxVQUFVLE9BQU8sU0FBUyxRQUFRLENBQUMsTUFBTTtBQUUvQyxRQUFNLGFBQWEsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDLEdBQUcsU0FBUyxZQUFZLGdCQUFnQixFQUFFLGtCQUFrQixRQUFRLENBQUMsQ0FBQztBQUNwSTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -21,6 +21,7 @@ export * as 'npm-publish' from './npm-publish.mjs';
21
21
  export * as 'npm-run' from './npm-run.mjs';
22
22
  export * as 'npm' from './npm.mjs';
23
23
  export * as 'obsidian-dev-utils-repo-paths' from './obsidian-dev-utils-repo-paths.mjs';
24
+ export * as 'package-manager' from './package-manager.mjs';
24
25
  export * as 'root' from './root.mjs';
25
26
  export * as 'test-runners' from './test-runners/index.mjs';
26
27
  export * as 'validate-declarations' from './validate-declarations.mjs';