obsidian-dev-utils 96.6.0 → 98.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.
- package/CHANGELOG.md +22 -0
- package/LICENSE +1 -1
- package/dist/integration-test-plugin/main.js +1762 -4197
- package/dist/lib/cjs/__merged.cjs +17 -9
- package/dist/lib/cjs/__merged.d.cts +3 -1
- package/dist/lib/cjs/desktop-zip-extractor.cjs +276 -0
- package/dist/lib/cjs/desktop-zip-extractor.d.cts +94 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
- package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
- package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +20 -21
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +21 -16
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
- package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
- package/dist/lib/cjs/obsidian/index.cjs +10 -1
- package/dist/lib/cjs/obsidian/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
- package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
- package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
- package/dist/lib/cjs/script-utils/build.cjs +30 -6
- package/dist/lib/cjs/script-utils/build.d.cts +5 -0
- package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
- package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
- package/dist/lib/cjs/script-utils/exec.cjs +1 -1
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
- package/dist/lib/cjs/script-utils/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
- package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
- package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
- package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
- package/dist/lib/cjs/script-utils/version.cjs +21 -9
- package/dist/lib/esm/__merged.d.mts +3 -1
- package/dist/lib/esm/__merged.mjs +18 -10
- package/dist/lib/esm/desktop-zip-extractor.d.mts +94 -0
- package/dist/lib/esm/desktop-zip-extractor.mjs +174 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
- package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
- package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +21 -16
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +23 -11
- package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
- package/dist/lib/esm/obsidian/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.mjs +7 -1
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
- package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
- package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
- package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
- package/dist/lib/esm/script-utils/build.d.mts +5 -0
- package/dist/lib/esm/script-utils/build.mjs +30 -6
- package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
- package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
- package/dist/lib/esm/script-utils/exec.mjs +1 -1
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
- package/dist/lib/esm/script-utils/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
- package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
- package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
- package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
- package/dist/lib/esm/script-utils/version.mjs +21 -9
- package/obsidian/demo-vault-naming/package.json +6 -0
- package/obsidian/mobile-trusted-input/package.json +6 -0
- package/obsidian/trusted-input/package.json +6 -0
- package/package.json +19 -17
- package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
- package/script-utils/package-manager/package.json +6 -0
|
@@ -251,15 +251,10 @@ async function publishGitHubRelease(newVersion, isObsidianPlugin) {
|
|
|
251
251
|
const fileNames = await readdirPosix(buildFolder);
|
|
252
252
|
filePaths = fileNames.map((fileName) => join(buildFolder, fileName));
|
|
253
253
|
} else {
|
|
254
|
-
|
|
255
|
-
const
|
|
256
|
-
if (index === -1) {
|
|
257
|
-
throw new Error("Failed to find the start of the JSON array in the result output");
|
|
258
|
-
}
|
|
259
|
-
resultOutput = resultOutput.slice(index);
|
|
260
|
-
const result = JSON.parse(resultOutput);
|
|
254
|
+
const resultOutput = await execFromRoot(["npm", "pack", "--pack-destination", ObsidianDevUtilsRepoPaths.Dist, "--json"], { isQuiet: true });
|
|
255
|
+
const result = parseNpmPackOutput(resultOutput);
|
|
261
256
|
filePaths = [
|
|
262
|
-
join(ObsidianDevUtilsRepoPaths.Dist, result
|
|
257
|
+
join(ObsidianDevUtilsRepoPaths.Dist, result.filename),
|
|
263
258
|
join(ObsidianDevUtilsRepoPaths.Dist, ObsidianDevUtilsRepoPaths.StylesCss)
|
|
264
259
|
];
|
|
265
260
|
}
|
|
@@ -401,6 +396,23 @@ async function getLatestObsidianVersion() {
|
|
|
401
396
|
function isPreRelease(version) {
|
|
402
397
|
return prerelease(version) !== null;
|
|
403
398
|
}
|
|
399
|
+
function parseNpmPackOutput(output) {
|
|
400
|
+
for (const match of output.matchAll(/[[{]/g)) {
|
|
401
|
+
let payload;
|
|
402
|
+
try {
|
|
403
|
+
payload = JSON.parse(output.slice(match.index));
|
|
404
|
+
} catch {
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
const results = Array.isArray(payload) ? payload : Object.values(payload);
|
|
408
|
+
const result = results[0];
|
|
409
|
+
if (!result) {
|
|
410
|
+
throw new Error("Found no pack result in the `npm pack --json` output");
|
|
411
|
+
}
|
|
412
|
+
return result;
|
|
413
|
+
}
|
|
414
|
+
throw new Error("Failed to find the JSON payload in the `npm pack --json` output");
|
|
415
|
+
}
|
|
404
416
|
async function prepareChangelog(newVersion, options) {
|
|
405
417
|
const {
|
|
406
418
|
changelogFilePath,
|
|
@@ -544,4 +556,4 @@ export {
|
|
|
544
556
|
updateVersionInFiles,
|
|
545
557
|
validate
|
|
546
558
|
};
|
|
547
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkdGVtcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gJ25vZGU6cmVhZGxpbmUvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIGluYyxcbiAgcHJlcmVsZWFzZVxufSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VMb2NrSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi4vZXJyb3IudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROb25OdWxsYWJsZSxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCB9IGZyb20gJy4vZGVtby12YXVsdC50cyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICcuL2ZzLnRzJztcbmltcG9ydCB7IGVkaXRKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7XG4gIG5wbVJ1bixcbiAgbnBtUnVuT3B0aW9uYWxcbn0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7XG4gIGVkaXROcG1TaHJpbmtXcmFwSnNvbixcbiAgZWRpdFBhY2thZ2VKc29uLFxuICBlZGl0UGFja2FnZUxvY2tKc29uLFxuICByZWFkUGFja2FnZUpzb25cbn0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LiBXaGVuIGBmYWxzZWAsXG4gICAqIHRoZSBjaGFuZ2Vsb2cgaXMgc3RpbGwgZ2VuZXJhdGVkIGZyb20gY29tbWl0IG1lc3NhZ2VzLCBidXQgaXQgaXMgbm90IG9wZW5lZCBpbiB0aGUgZWRpdG9yIGZvclxuICAgKiBtYW51YWwgcmV2aWV3LlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4ge0BsaW5rIGNoYW5nZWxvZ0ZpbGVQYXRofSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZVZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgcGF0aCB0byBhIGZpbGUgd2hvc2UgY29udGVudHMgYmVjb21lIHRoZSBib2R5IG9mIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uLCBpbnN0ZWFkIG9mXG4gICAqIHRoZSBidWxsZXRzIGRlcml2ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzLiBVc2UgaXQgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMgZnJvbSBhXG4gICAqIG5vbi1pbnRlcmFjdGl2ZSBjYWxsZXIgKGEgYmFja2dyb3VuZCBwcm9jZXNzLCBDSSwgYW4gYWdlbnQpLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGltcGxpZXMgbm8gaW50ZXJhY3RpdmUgcmV2aWV3OiB0aGUgY29tbWl0IGxvZyBpcyBub3QgcmVhZCwgYW5kIHRoZSBjaGFuZ2Vsb2cgaXMgbmV2ZXJcbiAgICogb3BlbmVkIGluIHRoZSBlZGl0b3Igbm9yIHdhaXRlZCBvbiBhdCB0aGUgY29uc29sZSwgcmVnYXJkbGVzcyBvZiB7QGxpbmsgc2hvdWxkRWRpdENoYW5nZWxvZ30uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IHN1YmplY3RzIHNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwbGljaXQgYG1pbkFwcFZlcnNpb25gIHRvIHdyaXRlIGludG8gdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBhbmQgaXRzIG5ldyBgdmVyc2lvbnMuanNvbmBcbiAgICogZW50cnkuIFdoZW4gc2V0LCBpdCBpcyB1c2VkIHZlcmJhdGltIGFuZCB0aGUgbGF0ZXN0IE9ic2lkaWFuIGRlc2t0b3AgdmVyc2lvbiBpcyBub3QgZmV0Y2hlZCBhdCBhbGwuXG4gICAqXG4gICAqIFNldCB0aGlzIHdoZW4gdGhlIHBsdWdpbiBoYXMgYSBrbm93biBtaW5pbXVtIGl0IGFjdHVhbGx5IHJlcXVpcmVzLCByYXRoZXIgdGhhbiB0cmFja2luZyB3aGF0ZXZlclxuICAgKiBPYnNpZGlhbiByZWxlYXNlZCBtb3N0IHJlY2VudGx5LiBPbmx5IGFwcGxpZXMgdG8gT2JzaWRpYW4gcGx1Z2lucywgYW5kIG9ubHkgdG8gbm9uLXByZS1yZWxlYXNlXG4gICAqIHZlcnNpb25zIChhIHByZS1yZWxlYXNlIGNvcGllcyB0aGUgZXhpc3RpbmcgYG1hbmlmZXN0Lmpzb25gIGFuZCBuZXZlciB3cml0ZXMgYG1pbkFwcFZlcnNpb25gKS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGxhdGVzdCBPYnNpZGlhbiBkZXNrdG9wIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pbkFwcFZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgR2l0SHViIHJlbGVhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgR2l0SHViIHJlbGVhc2UgaGFzIGJlZW4gcHJlcGFyZWQuXG4gICAqL1xuICBwcmVwYXJlR2l0SHViUmVsZWFzZT8odGhpczogdm9pZCwgbmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhcmNoaXZlIHRoZSBwbHVnaW4ncyBkZW1vIHZhdWx0IChgZGVtby12YXVsdC9gIGluIHRoZSByZXBvIHJvb3QpIGFzIGEgcmVsZWFzZVxuICAgKiBhcnRpZmFjdC4gT25seSBhcHBsaWVzIHRvIE9ic2lkaWFuIHBsdWdpbnM7IGlnbm9yZWQgd2hlbiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBidWlsZCBzdGVwLiBUaGUgYnVpbGQgaXMgYSBwdWJsaXNoaW5nIHByZXJlcXVpc2l0ZSwgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLFxuICAgKiBzbyBpdCBpcyBnb3Zlcm5lZCBieSB0aGlzIGZsYWcgaW5kZXBlbmRlbnRseSBvZiB7QGxpbmsgc2hvdWxkUnVuQ2hlY2tzfSBcdTIwMTQgaXQgcnVucyBldmVuIHdoZW4gdGhlXG4gICAqIGNoZWNrcyBhcmUgc2tpcHBlZCwgc28gYSBmYXN0IHJlbGVhc2Ugc3RpbGwgc2hpcHMgZnJlc2ggYXJ0aWZhY3RzLiBTZXQgdG8gYGZhbHNlYCBvbmx5IHdoZW4gdGhlXG4gICAqIGJ1aWxkIG91dHB1dCBpcyBrbm93biB0byBhbHJlYWR5IG1hdGNoIHRoZSBjdXJyZW50IGNvZGU7IG90aGVyd2lzZSB0aGUgcmVsZWFzZSB3b3VsZCBwdWJsaXNoXG4gICAqIHN0YWxlIGFydGlmYWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRCdWlsZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyBcdTIwMTQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByZS1yZWxlYXNlIGlkZW50aWZpZXIgdXNlZCBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJFSUQgPSAnYmV0YSc7XG5cbi8qKlxuICogVGhlIGZlZWQgdGhlIE9ic2lkaWFuIGRlc2t0b3AgYXBwIHVwZGF0ZXMgZnJvbS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIHRoZSBHaXRIdWIgYHJlbGVhc2VzL2xhdGVzdGAgQVBJOiB0aGF0IGVuZHBvaW50IHJldHVybnMgdGhlIG5ld2VzdCByZWxlYXNlIG9mIGFueSBraW5kXG4gKiBpbiBgb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlc2AsIGluY2x1ZGluZyBvbmUgd2hvc2Ugb25seSBhc3NldCBpcyB0aGUgQW5kcm9pZCBBUEssIHdoaWNoIG5vIGRlc2t0b3BcbiAqIHVzZXIgY2FuIGluc3RhbGwuIFNlZSB7QGxpbmsgZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9ufS5cbiAqL1xuY29uc3QgREVTS1RPUF9SRUxFQVNFU19KU09OX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9tYXN0ZXIvZGVza3RvcC1yZWxlYXNlcy5qc29uJztcblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgdmVyc2lvbiB1cGRhdGVzLlxuICpcbiAqIEFsaWducyB3aXRoIG5wbSdzIGBucG0gdmVyc2lvbmAgaW5jcmVtZW50IHR5cGVzIHBsdXMgYE1hbnVhbGAgZm9yIGV4cGxpY2l0IHZlcnNpb25zLlxuICovXG5leHBvcnQgZW51bSBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIEludmFsaWQgPSAnaW52YWxpZCcsXG4gIE1ham9yID0gJ21ham9yJyxcbiAgTWFudWFsID0gJ21hbnVhbCcsXG4gIE1pbm9yID0gJ21pbm9yJyxcbiAgUGF0Y2ggPSAncGF0Y2gnLFxuICBQcmVNYWpvciA9ICdwcmVtYWpvcicsXG4gIFByZU1pbm9yID0gJ3ByZW1pbm9yJyxcbiAgUHJlUGF0Y2ggPSAncHJlcGF0Y2gnLFxuICBQcmVSZWxlYXNlID0gJ3ByZXJlbGVhc2UnXG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSBvZiBPYnNpZGlhbidzIGBkZXNrdG9wLXJlbGVhc2VzLmpzb25gIGZlZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgZmVlZCB0aGUgZGVza3RvcCBhcHAgaXRzZWxmIHVwZGF0ZXMgZnJvbSwgc28gaXQgaXMgdGhlIG9ubHkgc291cmNlIHRoYXQgc3RhdGVzIGEgdmVyc2lvblxuICogZGVza3RvcCB1c2VycyBjYW4gYWN0dWFsbHkgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc2t0b3BSZWxlYXNlc0pzb24ge1xuICAvKipcbiAgICogVGhlIGxhdGVzdCBPYnNpZGlhbiB2ZXJzaW9uIGF2YWlsYWJsZSBmb3IgZGVza3RvcC5cbiAgICovXG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyB0aGUgbWFuaWZlc3QgZmlsZSBmb3JtYXQgZm9yIE9ic2lkaWFuIHBsdWdpbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3Qge1xuICAvKipcbiAgICogQSBtaW5pbXVtIE9ic2lkaWFuIHZlcnNpb24gcmVxdWlyZWQgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBtaW5BcHBWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGFnIGhhcyBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRHaXRUYWcobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IHRhZyAtYSAke25ld1ZlcnNpb259IC1tICR7bmV3VmVyc2lvbn0gLS1mb3JjZWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5J107XG4gIGlmICghc2hvdWxkVmVyaWZ5Q29tbWl0KSB7XG4gICAgY29tbWl0QXJndW1lbnRzLnB1c2goJy0tbm8tdmVyaWZ5Jyk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3VtZW50cywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYEZhaWxlZCB0byBjb21taXQgdGhlIHJlbGVhc2UuXFxuJHtlcnJvclRvU3RyaW5nKGVycm9yKX1cXG5gXG4gICAgICAgICAgKyAnRml4IHRoZSBpc3N1ZXMgKGZvciBleGFtcGxlLCBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBjc3BlbGwuanNvbikgYW5kIHByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQsIG9yIEN0cmwrQyB0byBhYm9ydC4nXG4gICAgICApO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbignUHJlc3MgRW50ZXIgdG8gcmV0cnkgdGhlIGNvbW1pdC4uLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0SHViIENMSSBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2dpdC1zY20uY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbiwgbWVhbmluZyB0aGVyZSBhcmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRSZXBvQ2xlYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgc3RhdHVzIC0tcG9yY2VsYWluIC0tdW50cmFja2VkLWZpbGVzPWFsbCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHlvdXIgY2hhbmdlcyBiZWZvcmUgcmVsZWFzaW5nIGEgbmV3IHZlcnNpb24uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhbnkgYmFyZSBgaHR0cChzKTovL2AgVVJMIGluIHRoZSBnaXZlbiB0ZXh0IGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBzbyB0aGF0IHRleHQgZW1pdHRlZFxuICogaW50byBhIE1hcmtkb3duIGRvY3VtZW50IChzdWNoIGFzIGEgZ2VuZXJhdGVkIGNoYW5nZWxvZyBidWxsZXQpIHBhc3NlcyBtYXJrZG93bmxpbnQnc1xuICogYE1EMDM0L25vLWJhcmUtdXJsc2AgcnVsZSB3aGlsZSBzdGlsbCByZW5kZXJpbmcgYXMgYSBjbGlja2FibGUgYXV0b2xpbmsgb24gR2l0SHViLlxuICpcbiAqIFVSTHMgdGhhdCBhcmUgYWxyZWFkeSB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBvciB0aGF0IGZvcm0gdGhlIHRhcmdldCBvZiBhIE1hcmtkb3duXG4gKiBsaW5rIChgW3RleHRdKHVybClgKSBhcmUgbGVmdCB1bnRvdWNoZWQsIHNvIHRoZSBmdW5jdGlvbiBpcyBzYWZlIHRvIHJ1biByZXBlYXRlZGx5LiBUcmFpbGluZ1xuICogc2VudGVuY2UgcHVuY3R1YXRpb24gKGAuYCwgYCxgLCBgO2AsIGA6YCwgYCFgLCBgP2ApIGlzIGtlcHQgb3V0c2lkZSB0aGUgYW5nbGUgYnJhY2tldHMgc28gaXQgZG9lc1xuICogbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBsaW5rLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgcG9zc2libHkgY29udGFpbmluZyBiYXJlIFVSTHMuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IGJhcmUgVVJMIHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGlua0JhcmVVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoLyg/PCFbPFsoXSlodHRwcz86XFwvXFwvW15cXHM8PilcXF1dKy9nLCAodXJsKSA9PiB7XG4gICAgY29uc3QgdHJhaWxpbmdQdW5jdHVhdGlvbiA9IC9bLiw7OiE/XSskLy5leGVjKHVybCk/LlswXSA/PyAnJztcbiAgICBjb25zdCBiYXJlVXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSB0cmFpbGluZ1B1bmN0dWF0aW9uLmxlbmd0aCk7XG4gICAgcmV0dXJuIGA8JHtiYXJlVXJsfT4ke3RyYWlsaW5nUHVuY3R1YXRpb259YDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBidWlsZCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3B5IG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlVcGRhdGVkTWFuaWZlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNwKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pLFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbikgfSksXG4gICAgeyBmb3JjZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVXNlcyB0aGUgYHNlbXZlcmAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24sIHN1cHBvcnRpbmcgYWxsIG5wbSBpbmNyZW1lbnQgdHlwZXM6XG4gKiBgbWFqb3JgLCBgbWlub3JgLCBgcGF0Y2hgLCBgcHJlbWFqb3JgLCBgcHJlbWlub3JgLCBgcHJlcGF0Y2hgLCBhbmQgYHByZXJlbGVhc2VgLlxuICogUHJlLXJlbGVhc2UgdmVyc2lvbnMgdXNlIHRoZSBgYmV0YWAgaWRlbnRpZmllciBieSBkZWZhdWx0IChlLmcuLCBgMS4yLjQtYmV0YS4wYCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgb3IgYW4gZXhwbGljaXQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgaW52YWxpZCBvciB0aGUgaW5jcmVtZW50IGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdmVyc2lvblR5cGUgPSBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmICh2ZXJzaW9uVHlwZSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsKSB7XG4gICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcnO1xuXG4gIGNvbnN0IHJlbGVhc2VUeXBlID0gdmVyc2lvblR5cGUgYXMgUmVsZWFzZVR5cGU7XG4gIGNvbnN0IGlzUHJlUmVsZWFzZVR5cGUgPSByZWxlYXNlVHlwZS5zdGFydHNXaXRoKCdwcmUnKTtcbiAgY29uc3QgbmV3VmVyc2lvbiA9IGlzUHJlUmVsZWFzZVR5cGVcbiAgICA/IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUsIERFRkFVTFRfUFJFSUQpXG4gICAgOiBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3VmVyc2lvbiwgYEZhaWxlZCB0byBpbmNyZW1lbnQgdmVyc2lvbiBmcm9tICcke2N1cnJlbnRWZXJzaW9ufScgd2l0aCB0eXBlICcke3ZlcnNpb25UeXBlfSdgKTtcblxuICByZXR1cm4gbmV3VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgY29uc3Qgc2VjdGlvbiA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNvbnRlbnQsIG5ld1ZlcnNpb24pO1xuICBsZXQgcmVsZWFzZU5vdGVzID0gc2VjdGlvbiA/IGAke3NlY3Rpb259XFxuXFxuYCA6ICcnO1xuXG4gIGNvbnN0IHRhZ091dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHRhZyAtLXNvcnQ9LWNyZWF0b3JkYXRlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCB0YWdzID0gdGFnT3V0cHV0LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG5cbiAgY29uc3QgcmVwb1VybCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBjb25zdCBjaGFuZ2VzVXJsID0gcHJldmlvdXNWZXJzaW9uID8gYCR7cmVwb1VybH0vY29tcGFyZS8ke3ByZXZpb3VzVmVyc2lvbn0uLi4ke25ld1ZlcnNpb259YCA6IGAke3JlcG9Vcmx9L2NvbW1pdHMvJHtuZXdWZXJzaW9ufWA7XG5cbiAgcmVsZWFzZU5vdGVzICs9IGAqKkZ1bGwgQ2hhbmdlbG9nKio6ICR7Y2hhbmdlc1VybH1gO1xuICByZXR1cm4gcmVsZWFzZU5vdGVzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgYmFzZWQgb24gdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgaW5wdXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIGBWZXJzaW9uVXBkYXRlVHlwZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogVmVyc2lvblVwZGF0ZVR5cGUge1xuICBjb25zdCB2ZXJzaW9uVXBkYXRlVHlwZUVudW0gPSB2ZXJzaW9uVXBkYXRlVHlwZSBhcyBWZXJzaW9uVXBkYXRlVHlwZTtcbiAgc3dpdGNoICh2ZXJzaW9uVXBkYXRlVHlwZUVudW0pIHtcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZU1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVJlbGVhc2U6IHtcbiAgICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZUVudW07XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSkge1xuICAgICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoZXMgY29tbWl0cyBhbmQgdGFncyB0byB0aGUgcmVtb3RlIEdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHVzaCBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRQdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBwdXNoIC0tZm9sbG93LXRhZ3MgLS1mb3JjZScsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUgaW50byBhIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kXG4gKiB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICpcbiAqIEVhY2ggYmVoYXZpb3IgaXMgZW5hYmxlZCBieSBkZWZhdWx0OyB0aGUgY29ycmVzcG9uZGluZyBgLS1uby0qYCBmbGFnIHR1cm5zIGl0IG9mZi4gYC0tY2hhbmdlbG9nLWZpbGVgIGFuZFxuICogYC0tbWluLWFwcC12ZXJzaW9uYCB0YWtlIGEgdmFsdWUgaW5zdGVhZCBhbmQgaGF2ZSBubyBkZWZhdWx0LiBSZWNvZ25pemVkIGZsYWdzOlxuICogLSBgLS1jaGFuZ2Vsb2ctZmlsZT08cGF0aD5gIFx1MjAxNCB1c2UgdGhpcyBmaWxlJ3MgY29udGVudHMgYXMgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24gaW5zdGVhZCBvZlxuICogICB0aGUgY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgYW5kIHNraXAgdGhlIGludGVyYWN0aXZlIHJldmlldyBlbnRpcmVseS5cbiAqIC0gYC0tbWluLWFwcC12ZXJzaW9uPTx4Lnkuej5gIFx1MjAxNCB3cml0ZSB0aGlzIGBtaW5BcHBWZXJzaW9uYCBpbnRvIHRoZSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYW5kIGl0cyBuZXdcbiAqICAgYHZlcnNpb25zLmpzb25gIGVudHJ5IGluc3RlYWQgb2YgdHJhY2tpbmcgdGhlIGxhdGVzdCBPYnNpZGlhbiBkZXNrdG9wIHZlcnNpb24uXG4gKiAtIGAtLW5vLWJ1aWxkYCBcdTIwMTQgc2tpcCB0aGUgYnVpbGQgc3RlcCAob25seSBzYWZlIHdoZW4gdGhlIGJ1aWxkIG91dHB1dCBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgY29kZSkuXG4gKiAtIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCBcdTIwMTQgZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyB3aXRob3V0IG9wZW5pbmcgaXQgZm9yIG1hbnVhbCByZXZpZXcuXG4gKiAtIGAtLW5vLWNoZWNrc2AgXHUyMDE0IHNraXAgdGhlIGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCwgb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzICh0aGUgYnVpbGQgc3RpbGwgcnVucykuXG4gKiAtIGAtLW5vLWNvbW1pdC12ZXJpZmljYXRpb25gIFx1MjAxNCBwYXNzIGAtLW5vLXZlcmlmeWAgdG8gdGhlIHJlbGVhc2UgY29tbWl0LCBza2lwcGluZyB0aGUgcHJlLWNvbW1pdCBob29rLlxuICogLSBgLS1uby1kZW1vLXZhdWx0YCBcdTIwMTQgc2tpcCBhcmNoaXZpbmcgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2ApIGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqIC0gYC0tbm8tcmVsZWFzZWAgXHUyMDE0IHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJndW1lbnRzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgdGhlIG9wdGlvbiBuYW1lIE5vZGUncyBgcGFyc2VBcmdzYCByZWFkcy5cbiAgICBhcmdzOiAkYXJndW1lbnRzLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgICdjaGFuZ2Vsb2ctZmlsZSc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICdtaW4tYXBwLXZlcnNpb24nOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoYW5nZWxvZy1lZGl0aW5nJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1jaGVja3MnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWRlbW8tdmF1bHQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLXJlbGVhc2UnOiB7IHR5cGU6ICdib29sZWFuJyB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNoYW5nZWxvZ0ZpbGVQYXRoOiB2YWx1ZXNbJ2NoYW5nZWxvZy1maWxlJ10sXG4gICAgICBtaW5BcHBWZXJzaW9uOiB2YWx1ZXNbJ21pbi1hcHAtdmVyc2lvbiddLFxuICAgICAgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdDogISh2YWx1ZXNbJ25vLWRlbW8tdmF1bHQnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRCdWlsZDogISh2YWx1ZXNbJ25vLWJ1aWxkJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkRWRpdENoYW5nZWxvZzogISh2YWx1ZXNbJ25vLWNoYW5nZWxvZy1lZGl0aW5nJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkUmVsZWFzZTogISh2YWx1ZXNbJ25vLXJlbGVhc2UnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRWZXJpZnlDb21taXQ6ICEodmFsdWVzWyduby1jb21taXQtdmVyaWZpY2F0aW9uJ10gPz8gZmFsc2UpXG4gICAgfSxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZTogcG9zaXRpb25hbHNbMF1cbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIGEgcmVsZWFzZSBhbmQgdXBsb2FkaW5nIGZpbGVzIGZvciBlaXRoZXIgYW4gT2JzaWRpYW4gcGx1Z2luIG9yIGFub3RoZXIgcHJvamVjdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICogQHBhcmFtIGlzT2JzaWRpYW5QbHVnaW4gLSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcHJvamVjdCBpcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlbGVhc2UgaGFzIGJlZW4gcHVibGlzaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbjogc3RyaW5nLCBpc09ic2lkaWFuUGx1Z2luOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBmaWxlUGF0aHM6IHN0cmluZ1tdO1xuXG4gIGlmIChpc09ic2lkaWFuUGx1Z2luKSB7XG4gICAgY29uc3QgYnVpbGRGb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoYnVpbGRGb2xkZXIpO1xuICAgIGZpbGVQYXRocyA9IGZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBqb2luKGJ1aWxkRm9sZGVyLCBmaWxlTmFtZSkpO1xuICB9IGVsc2Uge1xuICAgIGxldCByZXN1bHRPdXRwdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoWyducG0nLCAncGFjaycsICctLXBhY2stZGVzdGluYXRpb24nLCBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3QsICctLWpzb24nXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGNvbnN0IGluZGV4ID0gcmVzdWx0T3V0cHV0LmluZGV4T2YoJ1tcXG4gIHsnKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGUgSlNPTiBhcnJheSBpbiB0aGUgcmVzdWx0IG91dHB1dCcpO1xuICAgIH1cbiAgICByZXN1bHRPdXRwdXQgPSByZXN1bHRPdXRwdXQuc2xpY2UoaW5kZXgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0T3V0cHV0KSBhcyBbTnBtUGFja1Jlc3VsdF07XG4gICAgZmlsZVBhdGhzID0gW1xuICAgICAgam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3QsIHJlc3VsdFswXS5maWxlbmFtZSksXG4gICAgICBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5TdHlsZXNDc3MpXG4gICAgXTtcbiAgfVxuXG4gIGZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogZmlsZVBhdGggfSkpKTtcblxuICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICdnaCcsXG4gICAgJ3JlbGVhc2UnLFxuICAgICdjcmVhdGUnLFxuICAgIG5ld1ZlcnNpb24sXG4gICAgLi4uZmlsZVBhdGhzLFxuICAgICctLXRpdGxlJyxcbiAgICBgdiR7bmV3VmVyc2lvbn1gLFxuICAgIC4uLihpc1ByZVJlbGVhc2UobmV3VmVyc2lvbikgPyBbJy0tcHJlcmVsZWFzZSddIDogW10pLFxuICAgICctLW5vdGVzLWZpbGUnLFxuICAgICctJ1xuICBdLCB7XG4gICAgaXNRdWlldDogdHJ1ZSxcbiAgICBzdGRpbjogYXdhaXQgZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb24pXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNoYW5nZWxvZyBmaWxlIHdpdGggbmV3IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGNvbW1pdCBtZXNzYWdlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjdXJyZW50IGNoYW5nZWxvZywgYXBwZW5kcyBuZXcgZW50cmllcyBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLFxuICogYW5kIHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzLlxuICpcbiAqIFRoZSByZXZpZXcgaGFwcGVucyBvbiBhIHNjcmF0Y2ggY29weSBpbiB0aGUgT1MgdGVtcG9yYXJ5IGZvbGRlciwgYW5kIHRoZSByZXBvc2l0b3J5J3Mgb3duXG4gKiBgQ0hBTkdFTE9HLm1kYCBpcyB3cml0dGVuIG9ubHkgb25jZSB0aGUgcmV2aWV3IGlzIG92ZXIgXHUyMDE0IHNvIGludGVycnVwdGluZyB0aGUgcmV2aWV3IGxlYXZlcyB0aGVcbiAqIHJlcG9zaXRvcnkgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byBiZSBhZGRlZCB0byB0aGUgY2hhbmdlbG9nLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjaGFuZ2Vsb2cgcmV2aWV3IGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGFuZ2Vsb2cgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgYmFzZWQgb24gdGhlIHNwZWNpZmllZCB1cGRhdGUgdHlwZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgc2VyaWVzIG9mIHRhc2tzIHRvIGhhbmRsZSB2ZXJzaW9uIHVwZGF0ZXM6XG4gKiAxLiBWYWxpZGF0ZXMgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUuXG4gKiAyLiBDaGVja3MgaWYgR2l0IGFuZCBHaXRIdWIgQ0xJIGFyZSBpbnN0YWxsZWQuXG4gKiAzLiBWZXJpZmllcyB0aGF0IHRoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3LCBpZiBvbmUgaXMgZHVlLCBjYW4gYWN0dWFsbHkgYmUgYW5zd2VyZWQuXG4gKiA0LiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDUuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDYuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDcuIFNldHRsZXMgdGhlIGNoYW5nZWxvZyBcdTIwMTQgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhIGh1bWFuLCBhbmQgZGVsaWJlcmF0ZWx5IHRoZSBsYXN0IG9uZSBiZWZvcmVcbiAqICAgIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIGFuIGludGVycnVwdCBoZXJlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGNsZWFuIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5uYWJsZS5cbiAqIDguIFVwZGF0ZXMgdmVyc2lvbiBpbiBmaWxlcywgdGhlbiB3cml0ZXMgdGhlIHNldHRsZWQgY2hhbmdlbG9nLlxuICogOS4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogMTAuIElmIGFuIE9ic2lkaWFuIHBsdWdpbiwgY29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSB0byBwZXJmb3JtIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVtYWpvciwgcHJlbWlub3IsIHByZXBhdGNoLCBwcmVyZWxlYXNlLCBvciB4Lnkuelstc3VmZml4XSkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSByZWxlYXNlIGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2ZXJzaW9uIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU/OiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIG1pbkFwcFZlcnNpb24sXG4gICAgcHJlcGFyZUdpdEh1YlJlbGVhc2UsXG4gICAgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdCA9IHRydWUsXG4gICAgc2hvdWxkQnVpbGQgPSB0cnVlLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlLFxuICAgIHNob3VsZFJlbGVhc2UgPSB0cnVlLFxuICAgIHNob3VsZFJ1bkNoZWNrcyA9IHRydWUsXG4gICAgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbnBtT2xkVmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fb2xkX3ZlcnNpb24nXTtcbiAgICBjb25zdCBucG1OZXdWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9uZXdfdmVyc2lvbiddO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbik7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uKG5wbU5ld1ZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignTm8gdmVyc2lvbiB1cGRhdGUgdHlwZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgbGV0IGlzT2JzaWRpYW5QbHVnaW4gPSBmYWxzZTtcbiAgaWYgKGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSkpKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgICBpc09ic2lkaWFuUGx1Z2luID0gcGFja2FnZUpzb24ubmFtZSAhPT0gJ29ic2lkaWFuLWRldi11dGlscyc7XG4gIH1cblxuICB2YWxpZGF0ZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGF3YWl0IGFzc2VydEdpdEluc3RhbGxlZCgpO1xuICBhd2FpdCBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTtcbiAgLy8gQ2hlY2tlZCBoZXJlLCBiZWZvcmUgdGhlIGNoZWNrcyBhbmQgdGhlIGJ1aWxkLCByYXRoZXIgdGhhbiBhdCB0aGUgY2hhbmdlbG9nIHN0ZXAgaXRzZWxmOiBhIG5vbi1pbnRlcmFjdGl2ZVxuICAvLyBDYWxsZXIgbGVhcm5zIGluIHNlY29uZHMgaW5zdGVhZCBvZiBwYXlpbmcgZm9yIHRoZSB3aG9sZSBwcmVmbGlnaHQgYW5kIG9ubHkgdGhlbiBibG9ja2luZyBvbiBhbiBlZGl0b3JcbiAgLy8gV2luZG93IG5vYm9keSB3aWxsIGV2ZXIgY2xvc2UuXG4gIGFzc2VydENoYW5nZWxvZ1N0ZXBJc05vbkJsb2NraW5nKGNoYW5nZWxvZ0ZpbGVQYXRoLCBzaG91bGRFZGl0Q2hhbmdlbG9nKTtcblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgYXNzZXJ0R2l0UmVwb0NsZWFuKCk7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAgXHUyMDE0IHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBpZiAoc2hvdWxkQnVpbGQpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2J1aWxkJyk7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdsaW50Jyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2ZpbmQtb3ZlcmV4cG9zZWQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgndGVzdCcpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ3Rlc3Q6Y292ZXJhZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcblxuICAvLyBUaGUgY2hhbmdlbG9nIGlzIHNldHRsZWQgQkVGT1JFIGFueXRoaW5nIGlzIHdyaXR0ZW4sIGJlY2F1c2UgdGhpcyBpcyB0aGUgb25seSBzdGVwIHRoYXQgY2FuIGJsb2NrIG9uIGFcbiAgLy8gSHVtYW4uIEludGVycnVwdGluZyBpdCB0aGVyZWZvcmUgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSB3aG9sZSByZWxlYXNlIHJlLXJ1bm5hYmxlLFxuICAvLyBJbnN0ZWFkIG9mIHN0cmFuZGluZyBhIGJ1bXBlZC1idXQtdW5jb21taXR0ZWQgdHJlZSB0aGF0IGBhc3NlcnRHaXRSZXBvQ2xlYW5gIHRoZW4gcmVmdXNlcyB0byByZS1yZWxlYXNlLlxuICBjb25zdCBuZXdDaGFuZ2VMb2cgPSBhd2FpdCBwcmVwYXJlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nXG4gIH0pO1xuXG4gIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb24sIG1pbkFwcFZlcnNpb24pO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nKTtcbiAgYXdhaXQgYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbiwgeyBzaG91bGRWZXJpZnlDb21taXQgfSk7XG4gIGF3YWl0IGFkZEdpdFRhZyhuZXdWZXJzaW9uKTtcblxuICBpZiAoIXNob3VsZFJlbGVhc2UpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpKCdTa2lwcGluZyBnaXQgcHVzaCBhbmQgR2l0SHViIHJlbGVhc2UgKC0tbm8tcmVsZWFzZSkuIFRoZSB2ZXJzaW9uIGJ1bXAsIGNoYW5nZWxvZywgY29tbWl0LCBhbmQgdGFnIGhhdmUgYmVlbiBjcmVhdGVkIGxvY2FsbHkuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZ2l0UHVzaCgpO1xuICBhd2FpdCBwcmVwYXJlR2l0SHViUmVsZWFzZT8uKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbiAmJiBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0KSB7XG4gICAgYXdhaXQgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCgpO1xuICB9XG4gIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIGlzT2JzaWRpYW5QbHVnaW4pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gdmFyaW91cyBmaWxlcywgaW5jbHVkaW5nIGBwYWNrYWdlLmpzb25gLCBgcGFja2FnZS1sb2NrLmpzb25gLFxuICogYW5kIE9ic2lkaWFuIHBsdWdpbiBtYW5pZmVzdHMgaWYgYXBwbGljYWJsZS5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBzdHJpbmcgdG8gdXBkYXRlIGluIHRoZSBmaWxlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbigocGFja2FnZUpzb24pID0+IHtcbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSk7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VMb2NrSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbiAgYXdhaXQgZWRpdE5wbVNocmlua1dyYXBKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbik6IHZvaWQge1xuICAgIHBhY2thZ2VMb2NrSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICBjb25zdCBkZWZhdWx0UGFja2FnZSA9IHBhY2thZ2VMb2NrSnNvbi5wYWNrYWdlcz8uWycnXTtcbiAgICBpZiAoZGVmYXVsdFBhY2thZ2UpIHtcbiAgICAgIGRlZmF1bHRQYWNrYWdlLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byBlbnN1cmUgaXQgaXMgZWl0aGVyIGEgcmVjb2duaXplZCB0eXBlXG4gKiBvciBhIHZhbGlkIG1hbnVhbCB2ZXJzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byB2YWxpZGF0ZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgaXMgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZlcnNpb24gdXBkYXRlIHR5cGUuIFBsZWFzZSB1c2UgXFwnbWFqb3JcXCcsIFxcJ21pbm9yXFwnLCBcXCdwYXRjaFxcJywgXFwncHJlbWFqb3JcXCcsIFxcJ3ByZW1pbm9yXFwnLCBcXCdwcmVwYXRjaFxcJywgXFwncHJlcmVsZWFzZVxcJywgb3IgXFwneC55LnpbLXN1ZmZpeF1cXCcgZm9ybWF0LidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIHJlbGVhc2UgdGhhdCB3b3VsZCBoYXZlIHRvIHN0b3AgYXQgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcgd2l0aCBub2JvZHkgdGhlcmUgdG9cbiAqIGZpbmlzaCBpdC4gQ2FsbGVkIGZyb20gdGhlIHByZWZsaWdodCBzbyB0aGUgcmVmdXNhbCBjb3N0cyBzZWNvbmRzLCBub3QgdGhlIHdob2xlIGNoZWNrLWFuZC1idWlsZCBnYXRlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAcGFyYW0gc2hvdWxkRWRpdENoYW5nZWxvZyAtIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaXMgbWVhbnQgdG8gYmUgcmV2aWV3ZWQgaW50ZXJhY3RpdmVseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlbG9nU3RlcElzTm9uQmxvY2tpbmcoY2hhbmdlbG9nRmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2hvdWxkRWRpdENoYW5nZWxvZzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggIT09IHVuZGVmaW5lZCB8fCAhc2hvdWxkRWRpdENoYW5nZWxvZyB8fCBwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdUaGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyBuZWVkcyBhIHRlcm1pbmFsLCBhbmQgdGhpcyBwcm9jZXNzIGhhcyBub25lLCBzbyB0aGUgcmVsZWFzZSB3b3VsZCBibG9jayBmb3JldmVyLidcbiAgICAgICsgJyBQYXNzIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCB0byBhY2NlcHQgdGhlJ1xuICAgICAgKyAnIGNoYW5nZWxvZyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGFzIGlzLidcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYm9keSBvZiBvbmUgdmVyc2lvbidzIGBDSEFOR0VMT0cubWRgIHNlY3Rpb24gXHUyMDE0IGV2ZXJ5dGhpbmcgYmV0d2VlbiBpdHMgYCMjIDx2ZXJzaW9uPmAgaGVhZGluZ1xuICogYW5kIHdoaWNoZXZlciBjb21lcyBmaXJzdCwgdGhlIG5leHQgYCMjIGAgaGVhZGluZyBvciB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICpcbiAqIEVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIG5vdCBhbiBlZGdlIGNhc2UgYnV0IHRoZSBub3JtYWwgc2hhcGUgb2YgYSBGSVJTVCByZWxlYXNlOiBzZWN0aW9ucyBhcmVcbiAqIHByZXBlbmRlZCwgc28gdGhlIG5ld2VzdCBvbmUgaXMgYm91bmRlZCBieSB0aGUgcHJldmlvdXMgcmVsZWFzZSBvbmx5IG9uY2UgYSBwcmV2aW91cyByZWxlYXNlIGV4aXN0cy4gVGhlXG4gKiByZWdleCB0aGlzIHJlcGxhY2VkIHJlcXVpcmVkIGEgdHJhaWxpbmcgYFxcblxcbiMjYCwgc28gZXZlcnkgYDEuMC4wYCBzaWxlbnRseSBwdWJsaXNoZWQgZW1wdHkgcmVsZWFzZSBub3Rlcy5cbiAqIFRlcm1pbmF0aW5nIG9uIGAnIyMgJ2AgV0lUSCBpdHMgdHJhaWxpbmcgc3BhY2UgaXMgd2hhdCBrZWVwcyBhbiBgIyMjYCBzdWItaGVhZGluZyBpbnNpZGUgdGhlIHNlY3Rpb25cbiAqIGluc3RlYWQgb2YgdHJ1bmNhdGluZyBpdCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbnRlbnRzIG9mIGBDSEFOR0VMT0cubWRgLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2VjdGlvbiBib2R5LCB0cmltbWVkLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgY2hhbmdlbG9nIGhhcyBubyBzZWN0aW9uIGZvciB0aGF0IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBjaGFuZ2Vsb2dDb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IGhlYWRpbmdJbmRleCA9IGxpbmVzLmluZGV4T2YoYCMjICR7dmVyc2lvbn1gKTtcbiAgaWYgKGhlYWRpbmdJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBib2R5U3RhcnRJbmRleCA9IGhlYWRpbmdJbmRleCArIDE7XG4gIGNvbnN0IG5leHRIZWFkaW5nT2Zmc2V0ID0gbGluZXMuc2xpY2UoYm9keVN0YXJ0SW5kZXgpLmZpbmRJbmRleCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKCcjIyAnKSk7XG4gIGNvbnN0IGJvZHlFbmRJbmRleCA9IG5leHRIZWFkaW5nT2Zmc2V0ID09PSAtMSA/IGxpbmVzLmxlbmd0aCA6IGJvZHlTdGFydEluZGV4ICsgbmV4dEhlYWRpbmdPZmZzZXQ7XG4gIHJldHVybiBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCwgYm9keUVuZEluZGV4KS5qb2luKCdcXG4nKS50cmltKCk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgT2JzaWRpYW4gdGhhdCB0aGUgZGVza3RvcCBhcHAgY2FuIGFjdHVhbGx5IHJ1bi5cbiAqXG4gKiBSZWFkcyB7QGxpbmsgREVTS1RPUF9SRUxFQVNFU19KU09OX1VSTH0sIG5vdCB0aGUgR2l0SHViIGByZWxlYXNlcy9sYXRlc3RgIEFQSS4gVGhlIEFQSSByZXR1cm5zIHRoZSBuZXdlc3RcbiAqIHJlbGVhc2Ugb2YgQU5ZIGtpbmQsIHNvIHdoZW5ldmVyIGEgbW9iaWxlLW9ubHkgcmVsZWFzZSAoYW4gQVBLLW9ubHkgYXNzZXQpIGlzIG5ld2VyIHRoYW4gdGhlIGRlc2t0b3Agb25lLFxuICogaXQgcmVwb3J0cyBhIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBleGlzdCBmb3IgZGVza3RvcC4gQSBwbHVnaW4gcmVsZWFzZWQgaW4gdGhhdCB3aW5kb3cgZ2V0cyBhXG4gKiBgbWluQXBwVmVyc2lvbmAgbm8gZGVza3RvcCB1c2VyIGNhbiBzYXRpc2Z5LCBhbmQgT2JzaWRpYW4gc2lsZW50bHkga2VlcHMgb2ZmZXJpbmcgdGhlbSB0aGUgcHJldmlvdXNcbiAqIHJlbGVhc2UgaW5zdGVhZCBcdTIwMTQgdGhlIHJlbGVhc2Ugc3VjY2VlZHMgYW5kIHJlYWNoZXMgbm9ib2R5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxhdGVzdCBPYnNpZGlhbiB2ZXJzaW9uIGF2YWlsYWJsZSBmb3IgZGVza3RvcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChERVNLVE9QX1JFTEVBU0VTX0pTT05fVVJMKTtcbiAgY29uc3QgZGVza3RvcFJlbGVhc2VzSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBQYXJ0aWFsPERlc2t0b3BSZWxlYXNlc0pzb24+O1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoZGVza3RvcFJlbGVhc2VzSnNvbi5sYXRlc3RWZXJzaW9uLCAnQ291bGQgbm90IGZpbmQgdGhlIGxhdGVzdCBkZXNrdG9wIE9ic2lkaWFuIHZlcnNpb24nKTtcbn1cblxuZnVuY3Rpb24gaXNQcmVSZWxlYXNlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJlcmVsZWFzZSh2ZXJzaW9uKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0aGUgZnVsbCBuZXcgYENIQU5HRUxPRy5tZGAgY29udGVudCBcdTIwMTQgaW5jbHVkaW5nIHRoZSBpbnRlcmFjdGl2ZSByZXZpZXcsIHdoZW4gb25lIGlzIGR1ZSBcdTIwMTRcbiAqIFdJVEhPVVQgdG91Y2hpbmcgdGhlIHJlcG9zaXRvcnkuIE5vdGhpbmcgaGVyZSB3cml0ZXMgaW50byB0aGUgcmVwbywgc28gYW4gaW50ZXJydXB0IGFueXdoZXJlIGluIHRoZVxuICogcmV2aWV3IHdpbmRvdyAodGhlIHdob2xlIHBvaW50IG9mIHRoZSBzcGxpdCkgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgZXhhY3RseSBhcyBpdCB3YXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRoZSBjaGFuZ2Vsb2cgc2VjdGlvbiBpcyB3cml0dGVuIGZvci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zfSBjb250cm9sbGluZyB3aGVyZSB0aGUgc2VjdGlvbiBib2R5IGNvbWVzIGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzZXR0bGVkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBIRUFERVJfTElORVNfQ09VTlQgPSAyO1xuICBjb25zdCBjaGFuZ2Vsb2dQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgbGV0IHByZXZpb3VzQ2hhbmdlbG9nTGluZXM6IHN0cmluZ1tdO1xuICBpZiAoZXhpc3RzU3luYyhjaGFuZ2Vsb2dQYXRoKSkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJykuc2xpY2UoSEVBREVSX0xJTkVTX0NPVU5UKTtcbiAgICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5hdCgtMSkgPT09ICcnKSB7XG4gICAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLnBvcCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gW107XG4gIH1cblxuICBsZXQgbmV3Q2hhbmdlTG9nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG5cbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBsYXN0VGFnID0gcmVwbGFjZUFsbCh7XG4gICAgICAkc3RyaW5nOiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzWzBdID8/ICcnLFxuICAgICAgcmVwbGFjZXI6ICcnLFxuICAgICAgc2VhcmNoVmFsdWU6ICcjIyAnXG4gICAgfSk7XG4gICAgY29uc3QgY29tbWl0UmFuZ2UgPSBsYXN0VGFnID8gYCR7bGFzdFRhZ30uLkhFQURgIDogJ0hFQUQnO1xuICAgIGNvbnN0IGNvbW1pdE1lc3NhZ2VzU3RyaW5nID0gYXdhaXQgZXhlY0Zyb21Sb290KGBnaXQgbG9nICR7Y29tbWl0UmFuZ2V9IC0tZm9ybWF0PSVCIC0tZmlyc3QtcGFyZW50IC16YCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGNvbnN0IGNvbW1pdE1lc3NhZ2VzID0gY29tbWl0TWVzc2FnZXNTdHJpbmcuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5tYXAoKGNvbW1pdE1lc3NhZ2UpID0+IHRvRmlyc3RMaW5lKGNvbW1pdE1lc3NhZ2UpKTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBjb21taXRNZXNzYWdlcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAtICR7YXV0b2xpbmtCYXJlVXJscyhtZXNzYWdlKX1cXG5gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcmVwYXJlZE5vdGVzID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nRmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIG5ld0NoYW5nZUxvZyArPSBgJHtyZXBsYWNlQWxsKHsgJHN0cmluZzogcHJlcGFyZWROb3RlcywgcmVwbGFjZXI6ICdcXG4nLCBzZWFyY2hWYWx1ZTogJ1xcclxcbicgfSkudHJpbSgpfVxcbmA7XG4gIH1cblxuICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9ICdcXG4nO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKSB7XG4gICAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByZXBhcmVkIG5vdGVzIGFyZSBhbHJlYWR5IHRoZSByZXZpZXdlZCB0ZXh0LCBzbyB0aGV5IG5ldmVyIG9wZW4gYW4gZWRpdG9yLCB3aGF0ZXZlciBgc2hvdWxkRWRpdENoYW5nZWxvZ2Agc2F5cy5cbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoICE9PSB1bmRlZmluZWQgfHwgIXNob3VsZEVkaXRDaGFuZ2Vsb2cpIHtcbiAgICByZXR1cm4gbmV3Q2hhbmdlTG9nO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHJldmlld0NoYW5nZWxvZyhuZXdDaGFuZ2VMb2cpO1xufVxuXG4vKipcbiAqIEhhbmRzIHRoZSBjb21wb3NlZCBjaGFuZ2Vsb2cgdG8gdGhlIHVzZXIgZm9yIHJldmlldyBvbiBhIHNjcmF0Y2ggY29weSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBhbmRcbiAqIHJldHVybnMgd2hhdGV2ZXIgdGhleSBsZWZ0IGJlaGluZC4gVGhlIHNjcmF0Y2ggZm9sZGVyIGlzIHJlbW92ZWQgZXZlbiB3aGVuIHRoZSByZXZpZXcgZmFpbHMuXG4gKlxuICogQHBhcmFtIG5ld0NoYW5nZUxvZyAtIFRoZSBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IHRvIGhhbmQgb3ZlciBmb3IgcmV2aWV3LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV2aWV3ZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV2aWV3Q2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc2NyYXRjaEZvbGRlciA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWRldi11dGlscy1jaGFuZ2Vsb2ctJykpO1xuICBjb25zdCBzY3JhdGNoQ2hhbmdlbG9nUGF0aCA9IGpvaW4oc2NyYXRjaEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY29kZVZlcnNpb24gPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2NvZGUgLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgICBpZiAoY29kZVZlcnNpb24pIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihgUGxlYXNlIHVwZGF0ZSB0aGUgJHtPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZmlsZS4gQ2xvc2UgVmlzdWFsIFN0dWRpbyBDb2RlIHdoZW4geW91IGFyZSBkb25lLi4uYCk7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydjb2RlJywgJy13Jywgc2NyYXRjaENoYW5nZWxvZ1BhdGhdLCB7XG4gICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKCdDb3VsZCBub3QgZmluZCBWaXN1YWwgU3R1ZGlvIENvZGUgaW4geW91ciBQQVRILiBVc2luZyBjb25zb2xlIG1vZGUgaW5zdGVhZC4nKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIHRoZSAke3NjcmF0Y2hDaGFuZ2Vsb2dQYXRofSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBybShzY3JhdGNoRm9sZGVyLCB7XG4gICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvRmlyc3RMaW5lKCRzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAkc3RyaW5nLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKEJvb2xlYW4pLnNsaWNlKDAsIDEpLmpvaW4oJycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlc0ZvclBsdWdpbihuZXdWZXJzaW9uOiBzdHJpbmcsIG1pbkFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5pZmVzdEJldGFKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RCZXRhSnNvbiB9KTtcbiAgaWYgKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSkge1xuICAgIGF3YWl0IGNwKFxuICAgICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSksXG4gICAgICBtYW5pZmVzdEJldGFKc29uUGF0aCxcbiAgICAgIHsgZm9yY2U6IHRydWUgfVxuICAgICk7XG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGdW5jdGlvbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0QmV0YUpzb25cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByZXNvbHZlZE1pbkFwcFZlcnNpb24gPSBtaW5BcHBWZXJzaW9uID8/IGF3YWl0IGdldExhdGVzdE9ic2lkaWFuVmVyc2lvbigpO1xuXG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGdW5jdGlvbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0Lm1pbkFwcFZlcnNpb24gPSByZXNvbHZlZE1pbkFwcFZlcnNpb247XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvblxuICAgIH0pO1xuXG4gICAgYXdhaXQgZWRpdEpzb248UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe1xuICAgICAgZWRpdEZ1bmN0aW9uOiAodmVyc2lvbnMpID0+IHtcbiAgICAgICAgdmVyc2lvbnNbbmV3VmVyc2lvbl0gPSByZXNvbHZlZE1pbkFwcFZlcnNpb247XG4gICAgICB9LFxuICAgICAgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuVmVyc2lvbnNKc29uXG4gICAgfSk7XG5cbiAgICBpZiAoZXhpc3RzU3luYyhtYW5pZmVzdEJldGFKc29uUGF0aCkpIHtcbiAgICAgIGF3YWl0IHJtKG1hbmlmZXN0QmV0YUpzb25QYXRoKTtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBjb3B5VXBkYXRlZE1hbmlmZXN0KCk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBjb21wb3NlZCBjaGFuZ2Vsb2cgaW50byB0aGUgcmVwb3NpdG9yeS4gRGVsaWJlcmF0ZWx5IHRoZSBsYXN0IHRoaW5nIHRoZSBjaGFuZ2Vsb2cgc3RlcCBkb2VzLFxuICogc28gbm90aGluZyBsYW5kcyBvbiBkaXNrIHVudGlsIHRoZSBjb250ZW50IGlzIHNldHRsZWQuXG4gKlxuICogQHBhcmFtIG5ld0NoYW5nZUxvZyAtIFRoZSBzZXR0bGVkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgdG8gd3JpdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZWxvZyBoYXMgYmVlbiB3cml0dGVuLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYW5nZWxvZyhuZXdDaGFuZ2VMb2c6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUZpbGUocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KSwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsWUFBWTtBQUNyQixTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUNBQWlDO0FBQzFDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBNkpQLE1BQU0sZ0JBQWdCO0FBU3RCLE1BQU0sNEJBQTRCO0FBTzNCLElBQUssb0JBQUwsa0JBQUtBLHVCQUFMO0FBQ0wsRUFBQUEsbUJBQUEsYUFBVTtBQUNWLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxZQUFTO0FBQ1QsRUFBQUEsbUJBQUEsV0FBUTtBQUNSLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxjQUFXO0FBQ1gsRUFBQUEsbUJBQUEsY0FBVztBQUNYLEVBQUFBLG1CQUFBLGNBQVc7QUFDWCxFQUFBQSxtQkFBQSxnQkFBYTtBQVRI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
|
|
559
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkdGVtcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gJ25vZGU6cmVhZGxpbmUvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIGluYyxcbiAgcHJlcmVsZWFzZVxufSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VMb2NrSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi4vZXJyb3IudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROb25OdWxsYWJsZSxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCB9IGZyb20gJy4vZGVtby12YXVsdC50cyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICcuL2ZzLnRzJztcbmltcG9ydCB7IGVkaXRKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7XG4gIG5wbVJ1bixcbiAgbnBtUnVuT3B0aW9uYWxcbn0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7XG4gIGVkaXROcG1TaHJpbmtXcmFwSnNvbixcbiAgZWRpdFBhY2thZ2VKc29uLFxuICBlZGl0UGFja2FnZUxvY2tKc29uLFxuICByZWFkUGFja2FnZUpzb25cbn0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LiBXaGVuIGBmYWxzZWAsXG4gICAqIHRoZSBjaGFuZ2Vsb2cgaXMgc3RpbGwgZ2VuZXJhdGVkIGZyb20gY29tbWl0IG1lc3NhZ2VzLCBidXQgaXQgaXMgbm90IG9wZW5lZCBpbiB0aGUgZWRpdG9yIGZvclxuICAgKiBtYW51YWwgcmV2aWV3LlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4ge0BsaW5rIGNoYW5nZWxvZ0ZpbGVQYXRofSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZVZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgcGF0aCB0byBhIGZpbGUgd2hvc2UgY29udGVudHMgYmVjb21lIHRoZSBib2R5IG9mIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uLCBpbnN0ZWFkIG9mXG4gICAqIHRoZSBidWxsZXRzIGRlcml2ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzLiBVc2UgaXQgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMgZnJvbSBhXG4gICAqIG5vbi1pbnRlcmFjdGl2ZSBjYWxsZXIgKGEgYmFja2dyb3VuZCBwcm9jZXNzLCBDSSwgYW4gYWdlbnQpLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGltcGxpZXMgbm8gaW50ZXJhY3RpdmUgcmV2aWV3OiB0aGUgY29tbWl0IGxvZyBpcyBub3QgcmVhZCwgYW5kIHRoZSBjaGFuZ2Vsb2cgaXMgbmV2ZXJcbiAgICogb3BlbmVkIGluIHRoZSBlZGl0b3Igbm9yIHdhaXRlZCBvbiBhdCB0aGUgY29uc29sZSwgcmVnYXJkbGVzcyBvZiB7QGxpbmsgc2hvdWxkRWRpdENoYW5nZWxvZ30uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IHN1YmplY3RzIHNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwbGljaXQgYG1pbkFwcFZlcnNpb25gIHRvIHdyaXRlIGludG8gdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBhbmQgaXRzIG5ldyBgdmVyc2lvbnMuanNvbmBcbiAgICogZW50cnkuIFdoZW4gc2V0LCBpdCBpcyB1c2VkIHZlcmJhdGltIGFuZCB0aGUgbGF0ZXN0IE9ic2lkaWFuIGRlc2t0b3AgdmVyc2lvbiBpcyBub3QgZmV0Y2hlZCBhdCBhbGwuXG4gICAqXG4gICAqIFNldCB0aGlzIHdoZW4gdGhlIHBsdWdpbiBoYXMgYSBrbm93biBtaW5pbXVtIGl0IGFjdHVhbGx5IHJlcXVpcmVzLCByYXRoZXIgdGhhbiB0cmFja2luZyB3aGF0ZXZlclxuICAgKiBPYnNpZGlhbiByZWxlYXNlZCBtb3N0IHJlY2VudGx5LiBPbmx5IGFwcGxpZXMgdG8gT2JzaWRpYW4gcGx1Z2lucywgYW5kIG9ubHkgdG8gbm9uLXByZS1yZWxlYXNlXG4gICAqIHZlcnNpb25zIChhIHByZS1yZWxlYXNlIGNvcGllcyB0aGUgZXhpc3RpbmcgYG1hbmlmZXN0Lmpzb25gIGFuZCBuZXZlciB3cml0ZXMgYG1pbkFwcFZlcnNpb25gKS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGxhdGVzdCBPYnNpZGlhbiBkZXNrdG9wIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pbkFwcFZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgR2l0SHViIHJlbGVhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgR2l0SHViIHJlbGVhc2UgaGFzIGJlZW4gcHJlcGFyZWQuXG4gICAqL1xuICBwcmVwYXJlR2l0SHViUmVsZWFzZT8odGhpczogdm9pZCwgbmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhcmNoaXZlIHRoZSBwbHVnaW4ncyBkZW1vIHZhdWx0IChgZGVtby12YXVsdC9gIGluIHRoZSByZXBvIHJvb3QpIGFzIGEgcmVsZWFzZVxuICAgKiBhcnRpZmFjdC4gT25seSBhcHBsaWVzIHRvIE9ic2lkaWFuIHBsdWdpbnM7IGlnbm9yZWQgd2hlbiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBidWlsZCBzdGVwLiBUaGUgYnVpbGQgaXMgYSBwdWJsaXNoaW5nIHByZXJlcXVpc2l0ZSwgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLFxuICAgKiBzbyBpdCBpcyBnb3Zlcm5lZCBieSB0aGlzIGZsYWcgaW5kZXBlbmRlbnRseSBvZiB7QGxpbmsgc2hvdWxkUnVuQ2hlY2tzfSBcdTIwMTQgaXQgcnVucyBldmVuIHdoZW4gdGhlXG4gICAqIGNoZWNrcyBhcmUgc2tpcHBlZCwgc28gYSBmYXN0IHJlbGVhc2Ugc3RpbGwgc2hpcHMgZnJlc2ggYXJ0aWZhY3RzLiBTZXQgdG8gYGZhbHNlYCBvbmx5IHdoZW4gdGhlXG4gICAqIGJ1aWxkIG91dHB1dCBpcyBrbm93biB0byBhbHJlYWR5IG1hdGNoIHRoZSBjdXJyZW50IGNvZGU7IG90aGVyd2lzZSB0aGUgcmVsZWFzZSB3b3VsZCBwdWJsaXNoXG4gICAqIHN0YWxlIGFydGlmYWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRCdWlsZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyBcdTIwMTQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByZS1yZWxlYXNlIGlkZW50aWZpZXIgdXNlZCBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJFSUQgPSAnYmV0YSc7XG5cbi8qKlxuICogVGhlIGZlZWQgdGhlIE9ic2lkaWFuIGRlc2t0b3AgYXBwIHVwZGF0ZXMgZnJvbS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIHRoZSBHaXRIdWIgYHJlbGVhc2VzL2xhdGVzdGAgQVBJOiB0aGF0IGVuZHBvaW50IHJldHVybnMgdGhlIG5ld2VzdCByZWxlYXNlIG9mIGFueSBraW5kXG4gKiBpbiBgb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlc2AsIGluY2x1ZGluZyBvbmUgd2hvc2Ugb25seSBhc3NldCBpcyB0aGUgQW5kcm9pZCBBUEssIHdoaWNoIG5vIGRlc2t0b3BcbiAqIHVzZXIgY2FuIGluc3RhbGwuIFNlZSB7QGxpbmsgZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9ufS5cbiAqL1xuY29uc3QgREVTS1RPUF9SRUxFQVNFU19KU09OX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9tYXN0ZXIvZGVza3RvcC1yZWxlYXNlcy5qc29uJztcblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgdmVyc2lvbiB1cGRhdGVzLlxuICpcbiAqIEFsaWducyB3aXRoIG5wbSdzIGBucG0gdmVyc2lvbmAgaW5jcmVtZW50IHR5cGVzIHBsdXMgYE1hbnVhbGAgZm9yIGV4cGxpY2l0IHZlcnNpb25zLlxuICovXG5leHBvcnQgZW51bSBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIEludmFsaWQgPSAnaW52YWxpZCcsXG4gIE1ham9yID0gJ21ham9yJyxcbiAgTWFudWFsID0gJ21hbnVhbCcsXG4gIE1pbm9yID0gJ21pbm9yJyxcbiAgUGF0Y2ggPSAncGF0Y2gnLFxuICBQcmVNYWpvciA9ICdwcmVtYWpvcicsXG4gIFByZU1pbm9yID0gJ3ByZW1pbm9yJyxcbiAgUHJlUGF0Y2ggPSAncHJlcGF0Y2gnLFxuICBQcmVSZWxlYXNlID0gJ3ByZXJlbGVhc2UnXG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSBvZiBPYnNpZGlhbidzIGBkZXNrdG9wLXJlbGVhc2VzLmpzb25gIGZlZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgZmVlZCB0aGUgZGVza3RvcCBhcHAgaXRzZWxmIHVwZGF0ZXMgZnJvbSwgc28gaXQgaXMgdGhlIG9ubHkgc291cmNlIHRoYXQgc3RhdGVzIGEgdmVyc2lvblxuICogZGVza3RvcCB1c2VycyBjYW4gYWN0dWFsbHkgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc2t0b3BSZWxlYXNlc0pzb24ge1xuICAvKipcbiAgICogVGhlIGxhdGVzdCBPYnNpZGlhbiB2ZXJzaW9uIGF2YWlsYWJsZSBmb3IgZGVza3RvcC5cbiAgICovXG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyB0aGUgbWFuaWZlc3QgZmlsZSBmb3JtYXQgZm9yIE9ic2lkaWFuIHBsdWdpbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3Qge1xuICAvKipcbiAgICogQSBtaW5pbXVtIE9ic2lkaWFuIHZlcnNpb24gcmVxdWlyZWQgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBtaW5BcHBWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGFnIGhhcyBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRHaXRUYWcobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IHRhZyAtYSAke25ld1ZlcnNpb259IC1tICR7bmV3VmVyc2lvbn0gLS1mb3JjZWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5J107XG4gIGlmICghc2hvdWxkVmVyaWZ5Q29tbWl0KSB7XG4gICAgY29tbWl0QXJndW1lbnRzLnB1c2goJy0tbm8tdmVyaWZ5Jyk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3VtZW50cywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYEZhaWxlZCB0byBjb21taXQgdGhlIHJlbGVhc2UuXFxuJHtlcnJvclRvU3RyaW5nKGVycm9yKX1cXG5gXG4gICAgICAgICAgKyAnRml4IHRoZSBpc3N1ZXMgKGZvciBleGFtcGxlLCBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBjc3BlbGwuanNvbikgYW5kIHByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQsIG9yIEN0cmwrQyB0byBhYm9ydC4nXG4gICAgICApO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbignUHJlc3MgRW50ZXIgdG8gcmV0cnkgdGhlIGNvbW1pdC4uLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0SHViIENMSSBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2dpdC1zY20uY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbiwgbWVhbmluZyB0aGVyZSBhcmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRSZXBvQ2xlYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgc3RhdHVzIC0tcG9yY2VsYWluIC0tdW50cmFja2VkLWZpbGVzPWFsbCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHlvdXIgY2hhbmdlcyBiZWZvcmUgcmVsZWFzaW5nIGEgbmV3IHZlcnNpb24uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhbnkgYmFyZSBgaHR0cChzKTovL2AgVVJMIGluIHRoZSBnaXZlbiB0ZXh0IGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBzbyB0aGF0IHRleHQgZW1pdHRlZFxuICogaW50byBhIE1hcmtkb3duIGRvY3VtZW50IChzdWNoIGFzIGEgZ2VuZXJhdGVkIGNoYW5nZWxvZyBidWxsZXQpIHBhc3NlcyBtYXJrZG93bmxpbnQnc1xuICogYE1EMDM0L25vLWJhcmUtdXJsc2AgcnVsZSB3aGlsZSBzdGlsbCByZW5kZXJpbmcgYXMgYSBjbGlja2FibGUgYXV0b2xpbmsgb24gR2l0SHViLlxuICpcbiAqIFVSTHMgdGhhdCBhcmUgYWxyZWFkeSB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBvciB0aGF0IGZvcm0gdGhlIHRhcmdldCBvZiBhIE1hcmtkb3duXG4gKiBsaW5rIChgW3RleHRdKHVybClgKSBhcmUgbGVmdCB1bnRvdWNoZWQsIHNvIHRoZSBmdW5jdGlvbiBpcyBzYWZlIHRvIHJ1biByZXBlYXRlZGx5LiBUcmFpbGluZ1xuICogc2VudGVuY2UgcHVuY3R1YXRpb24gKGAuYCwgYCxgLCBgO2AsIGA6YCwgYCFgLCBgP2ApIGlzIGtlcHQgb3V0c2lkZSB0aGUgYW5nbGUgYnJhY2tldHMgc28gaXQgZG9lc1xuICogbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBsaW5rLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgcG9zc2libHkgY29udGFpbmluZyBiYXJlIFVSTHMuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IGJhcmUgVVJMIHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGlua0JhcmVVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoLyg/PCFbPFsoXSlodHRwcz86XFwvXFwvW15cXHM8PilcXF1dKy9nLCAodXJsKSA9PiB7XG4gICAgY29uc3QgdHJhaWxpbmdQdW5jdHVhdGlvbiA9IC9bLiw7OiE/XSskLy5leGVjKHVybCk/LlswXSA/PyAnJztcbiAgICBjb25zdCBiYXJlVXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSB0cmFpbGluZ1B1bmN0dWF0aW9uLmxlbmd0aCk7XG4gICAgcmV0dXJuIGA8JHtiYXJlVXJsfT4ke3RyYWlsaW5nUHVuY3R1YXRpb259YDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBidWlsZCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3B5IG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlVcGRhdGVkTWFuaWZlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNwKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pLFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbikgfSksXG4gICAgeyBmb3JjZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVXNlcyB0aGUgYHNlbXZlcmAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24sIHN1cHBvcnRpbmcgYWxsIG5wbSBpbmNyZW1lbnQgdHlwZXM6XG4gKiBgbWFqb3JgLCBgbWlub3JgLCBgcGF0Y2hgLCBgcHJlbWFqb3JgLCBgcHJlbWlub3JgLCBgcHJlcGF0Y2hgLCBhbmQgYHByZXJlbGVhc2VgLlxuICogUHJlLXJlbGVhc2UgdmVyc2lvbnMgdXNlIHRoZSBgYmV0YWAgaWRlbnRpZmllciBieSBkZWZhdWx0IChlLmcuLCBgMS4yLjQtYmV0YS4wYCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgb3IgYW4gZXhwbGljaXQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgaW52YWxpZCBvciB0aGUgaW5jcmVtZW50IGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdmVyc2lvblR5cGUgPSBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmICh2ZXJzaW9uVHlwZSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsKSB7XG4gICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcnO1xuXG4gIGNvbnN0IHJlbGVhc2VUeXBlID0gdmVyc2lvblR5cGUgYXMgUmVsZWFzZVR5cGU7XG4gIGNvbnN0IGlzUHJlUmVsZWFzZVR5cGUgPSByZWxlYXNlVHlwZS5zdGFydHNXaXRoKCdwcmUnKTtcbiAgY29uc3QgbmV3VmVyc2lvbiA9IGlzUHJlUmVsZWFzZVR5cGVcbiAgICA/IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUsIERFRkFVTFRfUFJFSUQpXG4gICAgOiBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3VmVyc2lvbiwgYEZhaWxlZCB0byBpbmNyZW1lbnQgdmVyc2lvbiBmcm9tICcke2N1cnJlbnRWZXJzaW9ufScgd2l0aCB0eXBlICcke3ZlcnNpb25UeXBlfSdgKTtcblxuICByZXR1cm4gbmV3VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgY29uc3Qgc2VjdGlvbiA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNvbnRlbnQsIG5ld1ZlcnNpb24pO1xuICBsZXQgcmVsZWFzZU5vdGVzID0gc2VjdGlvbiA/IGAke3NlY3Rpb259XFxuXFxuYCA6ICcnO1xuXG4gIGNvbnN0IHRhZ091dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHRhZyAtLXNvcnQ9LWNyZWF0b3JkYXRlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCB0YWdzID0gdGFnT3V0cHV0LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG5cbiAgY29uc3QgcmVwb1VybCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBjb25zdCBjaGFuZ2VzVXJsID0gcHJldmlvdXNWZXJzaW9uID8gYCR7cmVwb1VybH0vY29tcGFyZS8ke3ByZXZpb3VzVmVyc2lvbn0uLi4ke25ld1ZlcnNpb259YCA6IGAke3JlcG9Vcmx9L2NvbW1pdHMvJHtuZXdWZXJzaW9ufWA7XG5cbiAgcmVsZWFzZU5vdGVzICs9IGAqKkZ1bGwgQ2hhbmdlbG9nKio6ICR7Y2hhbmdlc1VybH1gO1xuICByZXR1cm4gcmVsZWFzZU5vdGVzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgYmFzZWQgb24gdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgaW5wdXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIGBWZXJzaW9uVXBkYXRlVHlwZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogVmVyc2lvblVwZGF0ZVR5cGUge1xuICBjb25zdCB2ZXJzaW9uVXBkYXRlVHlwZUVudW0gPSB2ZXJzaW9uVXBkYXRlVHlwZSBhcyBWZXJzaW9uVXBkYXRlVHlwZTtcbiAgc3dpdGNoICh2ZXJzaW9uVXBkYXRlVHlwZUVudW0pIHtcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZU1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVJlbGVhc2U6IHtcbiAgICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZUVudW07XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSkge1xuICAgICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoZXMgY29tbWl0cyBhbmQgdGFncyB0byB0aGUgcmVtb3RlIEdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHVzaCBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRQdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBwdXNoIC0tZm9sbG93LXRhZ3MgLS1mb3JjZScsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUgaW50byBhIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kXG4gKiB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICpcbiAqIEVhY2ggYmVoYXZpb3IgaXMgZW5hYmxlZCBieSBkZWZhdWx0OyB0aGUgY29ycmVzcG9uZGluZyBgLS1uby0qYCBmbGFnIHR1cm5zIGl0IG9mZi4gYC0tY2hhbmdlbG9nLWZpbGVgIGFuZFxuICogYC0tbWluLWFwcC12ZXJzaW9uYCB0YWtlIGEgdmFsdWUgaW5zdGVhZCBhbmQgaGF2ZSBubyBkZWZhdWx0LiBSZWNvZ25pemVkIGZsYWdzOlxuICogLSBgLS1jaGFuZ2Vsb2ctZmlsZT08cGF0aD5gIFx1MjAxNCB1c2UgdGhpcyBmaWxlJ3MgY29udGVudHMgYXMgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24gaW5zdGVhZCBvZlxuICogICB0aGUgY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgYW5kIHNraXAgdGhlIGludGVyYWN0aXZlIHJldmlldyBlbnRpcmVseS5cbiAqIC0gYC0tbWluLWFwcC12ZXJzaW9uPTx4Lnkuej5gIFx1MjAxNCB3cml0ZSB0aGlzIGBtaW5BcHBWZXJzaW9uYCBpbnRvIHRoZSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYW5kIGl0cyBuZXdcbiAqICAgYHZlcnNpb25zLmpzb25gIGVudHJ5IGluc3RlYWQgb2YgdHJhY2tpbmcgdGhlIGxhdGVzdCBPYnNpZGlhbiBkZXNrdG9wIHZlcnNpb24uXG4gKiAtIGAtLW5vLWJ1aWxkYCBcdTIwMTQgc2tpcCB0aGUgYnVpbGQgc3RlcCAob25seSBzYWZlIHdoZW4gdGhlIGJ1aWxkIG91dHB1dCBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgY29kZSkuXG4gKiAtIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCBcdTIwMTQgZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyB3aXRob3V0IG9wZW5pbmcgaXQgZm9yIG1hbnVhbCByZXZpZXcuXG4gKiAtIGAtLW5vLWNoZWNrc2AgXHUyMDE0IHNraXAgdGhlIGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCwgb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzICh0aGUgYnVpbGQgc3RpbGwgcnVucykuXG4gKiAtIGAtLW5vLWNvbW1pdC12ZXJpZmljYXRpb25gIFx1MjAxNCBwYXNzIGAtLW5vLXZlcmlmeWAgdG8gdGhlIHJlbGVhc2UgY29tbWl0LCBza2lwcGluZyB0aGUgcHJlLWNvbW1pdCBob29rLlxuICogLSBgLS1uby1kZW1vLXZhdWx0YCBcdTIwMTQgc2tpcCBhcmNoaXZpbmcgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2ApIGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqIC0gYC0tbm8tcmVsZWFzZWAgXHUyMDE0IHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJndW1lbnRzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgdGhlIG9wdGlvbiBuYW1lIE5vZGUncyBgcGFyc2VBcmdzYCByZWFkcy5cbiAgICBhcmdzOiAkYXJndW1lbnRzLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgICdjaGFuZ2Vsb2ctZmlsZSc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICdtaW4tYXBwLXZlcnNpb24nOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoYW5nZWxvZy1lZGl0aW5nJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1jaGVja3MnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWRlbW8tdmF1bHQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLXJlbGVhc2UnOiB7IHR5cGU6ICdib29sZWFuJyB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNoYW5nZWxvZ0ZpbGVQYXRoOiB2YWx1ZXNbJ2NoYW5nZWxvZy1maWxlJ10sXG4gICAgICBtaW5BcHBWZXJzaW9uOiB2YWx1ZXNbJ21pbi1hcHAtdmVyc2lvbiddLFxuICAgICAgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdDogISh2YWx1ZXNbJ25vLWRlbW8tdmF1bHQnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRCdWlsZDogISh2YWx1ZXNbJ25vLWJ1aWxkJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkRWRpdENoYW5nZWxvZzogISh2YWx1ZXNbJ25vLWNoYW5nZWxvZy1lZGl0aW5nJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkUmVsZWFzZTogISh2YWx1ZXNbJ25vLXJlbGVhc2UnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRWZXJpZnlDb21taXQ6ICEodmFsdWVzWyduby1jb21taXQtdmVyaWZpY2F0aW9uJ10gPz8gZmFsc2UpXG4gICAgfSxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZTogcG9zaXRpb25hbHNbMF1cbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIGEgcmVsZWFzZSBhbmQgdXBsb2FkaW5nIGZpbGVzIGZvciBlaXRoZXIgYW4gT2JzaWRpYW4gcGx1Z2luIG9yIGFub3RoZXIgcHJvamVjdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICogQHBhcmFtIGlzT2JzaWRpYW5QbHVnaW4gLSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcHJvamVjdCBpcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlbGVhc2UgaGFzIGJlZW4gcHVibGlzaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbjogc3RyaW5nLCBpc09ic2lkaWFuUGx1Z2luOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBmaWxlUGF0aHM6IHN0cmluZ1tdO1xuXG4gIGlmIChpc09ic2lkaWFuUGx1Z2luKSB7XG4gICAgY29uc3QgYnVpbGRGb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoYnVpbGRGb2xkZXIpO1xuICAgIGZpbGVQYXRocyA9IGZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBqb2luKGJ1aWxkRm9sZGVyLCBmaWxlTmFtZSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlc3VsdE91dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25wbScsICdwYWNrJywgJy0tcGFjay1kZXN0aW5hdGlvbicsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgJy0tanNvbiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VOcG1QYWNrT3V0cHV0KHJlc3VsdE91dHB1dCk7XG4gICAgZmlsZVBhdGhzID0gW1xuICAgICAgam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3QsIHJlc3VsdC5maWxlbmFtZSksXG4gICAgICBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5TdHlsZXNDc3MpXG4gICAgXTtcbiAgfVxuXG4gIGZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogZmlsZVBhdGggfSkpKTtcblxuICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICdnaCcsXG4gICAgJ3JlbGVhc2UnLFxuICAgICdjcmVhdGUnLFxuICAgIG5ld1ZlcnNpb24sXG4gICAgLi4uZmlsZVBhdGhzLFxuICAgICctLXRpdGxlJyxcbiAgICBgdiR7bmV3VmVyc2lvbn1gLFxuICAgIC4uLihpc1ByZVJlbGVhc2UobmV3VmVyc2lvbikgPyBbJy0tcHJlcmVsZWFzZSddIDogW10pLFxuICAgICctLW5vdGVzLWZpbGUnLFxuICAgICctJ1xuICBdLCB7XG4gICAgaXNRdWlldDogdHJ1ZSxcbiAgICBzdGRpbjogYXdhaXQgZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb24pXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNoYW5nZWxvZyBmaWxlIHdpdGggbmV3IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGNvbW1pdCBtZXNzYWdlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjdXJyZW50IGNoYW5nZWxvZywgYXBwZW5kcyBuZXcgZW50cmllcyBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLFxuICogYW5kIHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzLlxuICpcbiAqIFRoZSByZXZpZXcgaGFwcGVucyBvbiBhIHNjcmF0Y2ggY29weSBpbiB0aGUgT1MgdGVtcG9yYXJ5IGZvbGRlciwgYW5kIHRoZSByZXBvc2l0b3J5J3Mgb3duXG4gKiBgQ0hBTkdFTE9HLm1kYCBpcyB3cml0dGVuIG9ubHkgb25jZSB0aGUgcmV2aWV3IGlzIG92ZXIgXHUyMDE0IHNvIGludGVycnVwdGluZyB0aGUgcmV2aWV3IGxlYXZlcyB0aGVcbiAqIHJlcG9zaXRvcnkgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byBiZSBhZGRlZCB0byB0aGUgY2hhbmdlbG9nLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjaGFuZ2Vsb2cgcmV2aWV3IGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGFuZ2Vsb2cgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgYmFzZWQgb24gdGhlIHNwZWNpZmllZCB1cGRhdGUgdHlwZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgc2VyaWVzIG9mIHRhc2tzIHRvIGhhbmRsZSB2ZXJzaW9uIHVwZGF0ZXM6XG4gKiAxLiBWYWxpZGF0ZXMgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUuXG4gKiAyLiBDaGVja3MgaWYgR2l0IGFuZCBHaXRIdWIgQ0xJIGFyZSBpbnN0YWxsZWQuXG4gKiAzLiBWZXJpZmllcyB0aGF0IHRoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3LCBpZiBvbmUgaXMgZHVlLCBjYW4gYWN0dWFsbHkgYmUgYW5zd2VyZWQuXG4gKiA0LiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDUuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDYuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDcuIFNldHRsZXMgdGhlIGNoYW5nZWxvZyBcdTIwMTQgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhIGh1bWFuLCBhbmQgZGVsaWJlcmF0ZWx5IHRoZSBsYXN0IG9uZSBiZWZvcmVcbiAqICAgIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIGFuIGludGVycnVwdCBoZXJlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGNsZWFuIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5uYWJsZS5cbiAqIDguIFVwZGF0ZXMgdmVyc2lvbiBpbiBmaWxlcywgdGhlbiB3cml0ZXMgdGhlIHNldHRsZWQgY2hhbmdlbG9nLlxuICogOS4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogMTAuIElmIGFuIE9ic2lkaWFuIHBsdWdpbiwgY29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSB0byBwZXJmb3JtIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVtYWpvciwgcHJlbWlub3IsIHByZXBhdGNoLCBwcmVyZWxlYXNlLCBvciB4Lnkuelstc3VmZml4XSkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSByZWxlYXNlIGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2ZXJzaW9uIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU/OiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIG1pbkFwcFZlcnNpb24sXG4gICAgcHJlcGFyZUdpdEh1YlJlbGVhc2UsXG4gICAgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdCA9IHRydWUsXG4gICAgc2hvdWxkQnVpbGQgPSB0cnVlLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlLFxuICAgIHNob3VsZFJlbGVhc2UgPSB0cnVlLFxuICAgIHNob3VsZFJ1bkNoZWNrcyA9IHRydWUsXG4gICAgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbnBtT2xkVmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fb2xkX3ZlcnNpb24nXTtcbiAgICBjb25zdCBucG1OZXdWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9uZXdfdmVyc2lvbiddO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbik7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uKG5wbU5ld1ZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignTm8gdmVyc2lvbiB1cGRhdGUgdHlwZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgbGV0IGlzT2JzaWRpYW5QbHVnaW4gPSBmYWxzZTtcbiAgaWYgKGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSkpKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgICBpc09ic2lkaWFuUGx1Z2luID0gcGFja2FnZUpzb24ubmFtZSAhPT0gJ29ic2lkaWFuLWRldi11dGlscyc7XG4gIH1cblxuICB2YWxpZGF0ZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGF3YWl0IGFzc2VydEdpdEluc3RhbGxlZCgpO1xuICBhd2FpdCBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTtcbiAgLy8gQ2hlY2tlZCBoZXJlLCBiZWZvcmUgdGhlIGNoZWNrcyBhbmQgdGhlIGJ1aWxkLCByYXRoZXIgdGhhbiBhdCB0aGUgY2hhbmdlbG9nIHN0ZXAgaXRzZWxmOiBhIG5vbi1pbnRlcmFjdGl2ZVxuICAvLyBDYWxsZXIgbGVhcm5zIGluIHNlY29uZHMgaW5zdGVhZCBvZiBwYXlpbmcgZm9yIHRoZSB3aG9sZSBwcmVmbGlnaHQgYW5kIG9ubHkgdGhlbiBibG9ja2luZyBvbiBhbiBlZGl0b3JcbiAgLy8gV2luZG93IG5vYm9keSB3aWxsIGV2ZXIgY2xvc2UuXG4gIGFzc2VydENoYW5nZWxvZ1N0ZXBJc05vbkJsb2NraW5nKGNoYW5nZWxvZ0ZpbGVQYXRoLCBzaG91bGRFZGl0Q2hhbmdlbG9nKTtcblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgYXNzZXJ0R2l0UmVwb0NsZWFuKCk7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAgXHUyMDE0IHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBpZiAoc2hvdWxkQnVpbGQpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2J1aWxkJyk7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdsaW50Jyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2ZpbmQtb3ZlcmV4cG9zZWQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgndGVzdCcpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ3Rlc3Q6Y292ZXJhZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcblxuICAvLyBUaGUgY2hhbmdlbG9nIGlzIHNldHRsZWQgQkVGT1JFIGFueXRoaW5nIGlzIHdyaXR0ZW4sIGJlY2F1c2UgdGhpcyBpcyB0aGUgb25seSBzdGVwIHRoYXQgY2FuIGJsb2NrIG9uIGFcbiAgLy8gSHVtYW4uIEludGVycnVwdGluZyBpdCB0aGVyZWZvcmUgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSB3aG9sZSByZWxlYXNlIHJlLXJ1bm5hYmxlLFxuICAvLyBJbnN0ZWFkIG9mIHN0cmFuZGluZyBhIGJ1bXBlZC1idXQtdW5jb21taXR0ZWQgdHJlZSB0aGF0IGBhc3NlcnRHaXRSZXBvQ2xlYW5gIHRoZW4gcmVmdXNlcyB0byByZS1yZWxlYXNlLlxuICBjb25zdCBuZXdDaGFuZ2VMb2cgPSBhd2FpdCBwcmVwYXJlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nXG4gIH0pO1xuXG4gIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb24sIG1pbkFwcFZlcnNpb24pO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nKTtcbiAgYXdhaXQgYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbiwgeyBzaG91bGRWZXJpZnlDb21taXQgfSk7XG4gIGF3YWl0IGFkZEdpdFRhZyhuZXdWZXJzaW9uKTtcblxuICBpZiAoIXNob3VsZFJlbGVhc2UpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpKCdTa2lwcGluZyBnaXQgcHVzaCBhbmQgR2l0SHViIHJlbGVhc2UgKC0tbm8tcmVsZWFzZSkuIFRoZSB2ZXJzaW9uIGJ1bXAsIGNoYW5nZWxvZywgY29tbWl0LCBhbmQgdGFnIGhhdmUgYmVlbiBjcmVhdGVkIGxvY2FsbHkuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZ2l0UHVzaCgpO1xuICBhd2FpdCBwcmVwYXJlR2l0SHViUmVsZWFzZT8uKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbiAmJiBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0KSB7XG4gICAgYXdhaXQgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCgpO1xuICB9XG4gIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIGlzT2JzaWRpYW5QbHVnaW4pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gdmFyaW91cyBmaWxlcywgaW5jbHVkaW5nIGBwYWNrYWdlLmpzb25gLCBgcGFja2FnZS1sb2NrLmpzb25gLFxuICogYW5kIE9ic2lkaWFuIHBsdWdpbiBtYW5pZmVzdHMgaWYgYXBwbGljYWJsZS5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBzdHJpbmcgdG8gdXBkYXRlIGluIHRoZSBmaWxlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbigocGFja2FnZUpzb24pID0+IHtcbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSk7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VMb2NrSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbiAgYXdhaXQgZWRpdE5wbVNocmlua1dyYXBKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbik6IHZvaWQge1xuICAgIHBhY2thZ2VMb2NrSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICBjb25zdCBkZWZhdWx0UGFja2FnZSA9IHBhY2thZ2VMb2NrSnNvbi5wYWNrYWdlcz8uWycnXTtcbiAgICBpZiAoZGVmYXVsdFBhY2thZ2UpIHtcbiAgICAgIGRlZmF1bHRQYWNrYWdlLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byBlbnN1cmUgaXQgaXMgZWl0aGVyIGEgcmVjb2duaXplZCB0eXBlXG4gKiBvciBhIHZhbGlkIG1hbnVhbCB2ZXJzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byB2YWxpZGF0ZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgaXMgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZlcnNpb24gdXBkYXRlIHR5cGUuIFBsZWFzZSB1c2UgXFwnbWFqb3JcXCcsIFxcJ21pbm9yXFwnLCBcXCdwYXRjaFxcJywgXFwncHJlbWFqb3JcXCcsIFxcJ3ByZW1pbm9yXFwnLCBcXCdwcmVwYXRjaFxcJywgXFwncHJlcmVsZWFzZVxcJywgb3IgXFwneC55LnpbLXN1ZmZpeF1cXCcgZm9ybWF0LidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIHJlbGVhc2UgdGhhdCB3b3VsZCBoYXZlIHRvIHN0b3AgYXQgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcgd2l0aCBub2JvZHkgdGhlcmUgdG9cbiAqIGZpbmlzaCBpdC4gQ2FsbGVkIGZyb20gdGhlIHByZWZsaWdodCBzbyB0aGUgcmVmdXNhbCBjb3N0cyBzZWNvbmRzLCBub3QgdGhlIHdob2xlIGNoZWNrLWFuZC1idWlsZCBnYXRlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAcGFyYW0gc2hvdWxkRWRpdENoYW5nZWxvZyAtIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaXMgbWVhbnQgdG8gYmUgcmV2aWV3ZWQgaW50ZXJhY3RpdmVseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlbG9nU3RlcElzTm9uQmxvY2tpbmcoY2hhbmdlbG9nRmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2hvdWxkRWRpdENoYW5nZWxvZzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggIT09IHVuZGVmaW5lZCB8fCAhc2hvdWxkRWRpdENoYW5nZWxvZyB8fCBwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdUaGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyBuZWVkcyBhIHRlcm1pbmFsLCBhbmQgdGhpcyBwcm9jZXNzIGhhcyBub25lLCBzbyB0aGUgcmVsZWFzZSB3b3VsZCBibG9jayBmb3JldmVyLidcbiAgICAgICsgJyBQYXNzIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCB0byBhY2NlcHQgdGhlJ1xuICAgICAgKyAnIGNoYW5nZWxvZyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGFzIGlzLidcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYm9keSBvZiBvbmUgdmVyc2lvbidzIGBDSEFOR0VMT0cubWRgIHNlY3Rpb24gXHUyMDE0IGV2ZXJ5dGhpbmcgYmV0d2VlbiBpdHMgYCMjIDx2ZXJzaW9uPmAgaGVhZGluZ1xuICogYW5kIHdoaWNoZXZlciBjb21lcyBmaXJzdCwgdGhlIG5leHQgYCMjIGAgaGVhZGluZyBvciB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICpcbiAqIEVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIG5vdCBhbiBlZGdlIGNhc2UgYnV0IHRoZSBub3JtYWwgc2hhcGUgb2YgYSBGSVJTVCByZWxlYXNlOiBzZWN0aW9ucyBhcmVcbiAqIHByZXBlbmRlZCwgc28gdGhlIG5ld2VzdCBvbmUgaXMgYm91bmRlZCBieSB0aGUgcHJldmlvdXMgcmVsZWFzZSBvbmx5IG9uY2UgYSBwcmV2aW91cyByZWxlYXNlIGV4aXN0cy4gVGhlXG4gKiByZWdleCB0aGlzIHJlcGxhY2VkIHJlcXVpcmVkIGEgdHJhaWxpbmcgYFxcblxcbiMjYCwgc28gZXZlcnkgYDEuMC4wYCBzaWxlbnRseSBwdWJsaXNoZWQgZW1wdHkgcmVsZWFzZSBub3Rlcy5cbiAqIFRlcm1pbmF0aW5nIG9uIGAnIyMgJ2AgV0lUSCBpdHMgdHJhaWxpbmcgc3BhY2UgaXMgd2hhdCBrZWVwcyBhbiBgIyMjYCBzdWItaGVhZGluZyBpbnNpZGUgdGhlIHNlY3Rpb25cbiAqIGluc3RlYWQgb2YgdHJ1bmNhdGluZyBpdCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbnRlbnRzIG9mIGBDSEFOR0VMT0cubWRgLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2VjdGlvbiBib2R5LCB0cmltbWVkLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgY2hhbmdlbG9nIGhhcyBubyBzZWN0aW9uIGZvciB0aGF0IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBjaGFuZ2Vsb2dDb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IGhlYWRpbmdJbmRleCA9IGxpbmVzLmluZGV4T2YoYCMjICR7dmVyc2lvbn1gKTtcbiAgaWYgKGhlYWRpbmdJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBib2R5U3RhcnRJbmRleCA9IGhlYWRpbmdJbmRleCArIDE7XG4gIGNvbnN0IG5leHRIZWFkaW5nT2Zmc2V0ID0gbGluZXMuc2xpY2UoYm9keVN0YXJ0SW5kZXgpLmZpbmRJbmRleCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKCcjIyAnKSk7XG4gIGNvbnN0IGJvZHlFbmRJbmRleCA9IG5leHRIZWFkaW5nT2Zmc2V0ID09PSAtMSA/IGxpbmVzLmxlbmd0aCA6IGJvZHlTdGFydEluZGV4ICsgbmV4dEhlYWRpbmdPZmZzZXQ7XG4gIHJldHVybiBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCwgYm9keUVuZEluZGV4KS5qb2luKCdcXG4nKS50cmltKCk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgT2JzaWRpYW4gdGhhdCB0aGUgZGVza3RvcCBhcHAgY2FuIGFjdHVhbGx5IHJ1bi5cbiAqXG4gKiBSZWFkcyB7QGxpbmsgREVTS1RPUF9SRUxFQVNFU19KU09OX1VSTH0sIG5vdCB0aGUgR2l0SHViIGByZWxlYXNlcy9sYXRlc3RgIEFQSS4gVGhlIEFQSSByZXR1cm5zIHRoZSBuZXdlc3RcbiAqIHJlbGVhc2Ugb2YgQU5ZIGtpbmQsIHNvIHdoZW5ldmVyIGEgbW9iaWxlLW9ubHkgcmVsZWFzZSAoYW4gQVBLLW9ubHkgYXNzZXQpIGlzIG5ld2VyIHRoYW4gdGhlIGRlc2t0b3Agb25lLFxuICogaXQgcmVwb3J0cyBhIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBleGlzdCBmb3IgZGVza3RvcC4gQSBwbHVnaW4gcmVsZWFzZWQgaW4gdGhhdCB3aW5kb3cgZ2V0cyBhXG4gKiBgbWluQXBwVmVyc2lvbmAgbm8gZGVza3RvcCB1c2VyIGNhbiBzYXRpc2Z5LCBhbmQgT2JzaWRpYW4gc2lsZW50bHkga2VlcHMgb2ZmZXJpbmcgdGhlbSB0aGUgcHJldmlvdXNcbiAqIHJlbGVhc2UgaW5zdGVhZCBcdTIwMTQgdGhlIHJlbGVhc2Ugc3VjY2VlZHMgYW5kIHJlYWNoZXMgbm9ib2R5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxhdGVzdCBPYnNpZGlhbiB2ZXJzaW9uIGF2YWlsYWJsZSBmb3IgZGVza3RvcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChERVNLVE9QX1JFTEVBU0VTX0pTT05fVVJMKTtcbiAgY29uc3QgZGVza3RvcFJlbGVhc2VzSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBQYXJ0aWFsPERlc2t0b3BSZWxlYXNlc0pzb24+O1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoZGVza3RvcFJlbGVhc2VzSnNvbi5sYXRlc3RWZXJzaW9uLCAnQ291bGQgbm90IGZpbmQgdGhlIGxhdGVzdCBkZXNrdG9wIE9ic2lkaWFuIHZlcnNpb24nKTtcbn1cblxuZnVuY3Rpb24gaXNQcmVSZWxlYXNlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJlcmVsZWFzZSh2ZXJzaW9uKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgc2luZ2xlIHBhY2sgcmVzdWx0IGZyb20gdGhlIG91dHB1dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqXG4gKiBUd28gdGhpbmdzIG1ha2UgdGhpcyBtb3JlIHRoYW4gYSBgSlNPTi5wYXJzZSgpYC4gVGhlIHBheWxvYWQgaXMgUFJFQ0VERUQgb24gc3Rkb3V0IGJ5IHdoYXRldmVyIHRoZVxuICogYHByZXBhcmVgIHNjcmlwdCBwcmludGVkICh0aGUgYG5wbSBub3RpY2VgIGxpbmVzIGdvIHRvIHN0ZGVyciwgbm90IGhlcmUpLCBzbyBpdHMgc3RhcnQgaGFzIHRvIGJlIGZvdW5kIFx1MjAxNFxuICogYW5kIGl0IGlzIGZvdW5kIGJ5IHBhcnNpbmcgZnJvbSBlYWNoIGNhbmRpZGF0ZSBzdGFydCByYXRoZXIgdGhhbiBieSBtYXRjaGluZyBhIGxpdGVyYWwsIGJlY2F1c2UgdGhlXG4gKiBwcmVmaXggbWF5IGl0c2VsZiBjb250YWluIGEgYnJhY2UuIEFuZCB0aGUgcGF5bG9hZCdzIFNIQVBFIGRlcGVuZHMgb24gdGhlIG5wbSBtYWpvcjogbnBtIDExIGFuZCBlYXJsaWVyXG4gKiBlbWl0IGFuIGFycmF5IG9mIHBhY2sgcmVzdWx0cywgbnBtIDEyIGVtaXRzIGFuIG9iamVjdCBrZXllZCBieSBwYWNrYWdlIG5hbWUuIEJvdGggYXJlIGFjY2VwdGVkOyBzY2FubmluZ1xuICogZm9yIHRoZSBhcnJheSdzIGxpdGVyYWwgb3BlbmluZyBpcyB3aGF0IGJyb2tlIGV2ZXJ5IHJlbGVhc2Ugb24gbnBtIDEyIChUODA2KS5cbiAqXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIHN0ZG91dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgTnBtUGFja1Jlc3VsdH0gZGVzY3JpYmluZyB0aGUgcGFja2VkIHRhcmJhbGwuXG4gKiBAdGhyb3dzIElmIHRoZSBvdXRwdXQgaG9sZHMgbm8gcGFyc2FibGUgSlNPTiBwYXlsb2FkLCBvciB0aGUgcGF5bG9hZCBob2xkcyBubyBwYWNrIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VOcG1QYWNrT3V0cHV0KG91dHB1dDogc3RyaW5nKTogTnBtUGFja1Jlc3VsdCB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygb3V0cHV0Lm1hdGNoQWxsKC9bW3tdL2cpKSB7XG4gICAgbGV0IHBheWxvYWQ6IHVua25vd247XG5cbiAgICB0cnkge1xuICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2Uob3V0cHV0LnNsaWNlKG1hdGNoLmluZGV4KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgYXMgTnBtUGFja1Jlc3VsdFtdIDogT2JqZWN0LnZhbHVlcyhwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIE5wbVBhY2tSZXN1bHQ+KTtcbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzWzBdO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgbm8gcGFjayByZXN1bHQgaW4gdGhlIGBucG0gcGFjayAtLWpzb25gIG91dHB1dCcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIHRoZSBKU09OIHBheWxvYWQgaW4gdGhlIGBucG0gcGFjayAtLWpzb25gIG91dHB1dCcpO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHRoZSBmdWxsIG5ldyBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IFx1MjAxNCBpbmNsdWRpbmcgdGhlIGludGVyYWN0aXZlIHJldmlldywgd2hlbiBvbmUgaXMgZHVlIFx1MjAxNFxuICogV0lUSE9VVCB0b3VjaGluZyB0aGUgcmVwb3NpdG9yeS4gTm90aGluZyBoZXJlIHdyaXRlcyBpbnRvIHRoZSByZXBvLCBzbyBhbiBpbnRlcnJ1cHQgYW55d2hlcmUgaW4gdGhlXG4gKiByZXZpZXcgd2luZG93ICh0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIHNwbGl0KSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBleGFjdGx5IGFzIGl0IHdhcy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHdoZXJlIHRoZSBzZWN0aW9uIGJvZHkgY29tZXMgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IEhFQURFUl9MSU5FU19DT1VOVCA9IDI7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pO1xuICBsZXQgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lczogc3RyaW5nW107XG4gIGlmIChleGlzdHNTeW5jKGNoYW5nZWxvZ1BhdGgpKSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKS5zbGljZShIRUFERVJfTElORVNfQ09VTlQpO1xuICAgIGlmIChwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLmF0KC0xKSA9PT0gJycpIHtcbiAgICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBbXTtcbiAgfVxuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGxhc3RUYWcgPSByZXBsYWNlQWxsKHtcbiAgICAgICRzdHJpbmc6IHByZXZpb3VzQ2hhbmdlbG9nTGluZXNbMF0gPz8gJycsXG4gICAgICByZXBsYWNlcjogJycsXG4gICAgICBzZWFyY2hWYWx1ZTogJyMjICdcbiAgICB9KTtcbiAgICBjb25zdCBjb21taXRSYW5nZSA9IGxhc3RUYWcgPyBgJHtsYXN0VGFnfS4uSEVBRGAgOiAnSEVBRCc7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXNTdHJpbmcgPSBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCBsb2cgJHtjb21taXRSYW5nZX0gLS1mb3JtYXQ9JUIgLS1maXJzdC1wYXJlbnQgLXpgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgY29tbWl0TWVzc2FnZXMgPSBjb21taXRNZXNzYWdlc1N0cmluZy5zcGxpdCgnXFwwJykuZmlsdGVyKEJvb2xlYW4pLm1hcCgoY29tbWl0TWVzc2FnZSkgPT4gdG9GaXJzdExpbmUoY29tbWl0TWVzc2FnZSkpO1xuXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGNvbW1pdE1lc3NhZ2VzKSB7XG4gICAgICBuZXdDaGFuZ2VMb2cgKz0gYC0gJHthdXRvbGlua0JhcmVVcmxzKG1lc3NhZ2UpfVxcbmA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByZXBhcmVkTm90ZXMgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgbmV3Q2hhbmdlTG9nICs9IGAke3JlcGxhY2VBbGwoeyAkc3RyaW5nOiBwcmVwYXJlZE5vdGVzLCByZXBsYWNlcjogJ1xcbicsIHNlYXJjaFZhbHVlOiAnXFxyXFxuJyB9KS50cmltKCl9XFxuYDtcbiAgfVxuXG4gIGlmIChwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLmxlbmd0aCA+IDApIHtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gJ1xcbic7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgJHtsaW5lfVxcbmA7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJlcGFyZWQgbm90ZXMgYXJlIGFscmVhZHkgdGhlIHJldmlld2VkIHRleHQsIHNvIHRoZXkgbmV2ZXIgb3BlbiBhbiBlZGl0b3IsIHdoYXRldmVyIGBzaG91bGRFZGl0Q2hhbmdlbG9nYCBzYXlzLlxuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggIT09IHVuZGVmaW5lZCB8fCAhc2hvdWxkRWRpdENoYW5nZWxvZykge1xuICAgIHJldHVybiBuZXdDaGFuZ2VMb2c7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgcmV2aWV3Q2hhbmdlbG9nKG5ld0NoYW5nZUxvZyk7XG59XG5cbi8qKlxuICogSGFuZHMgdGhlIGNvbXBvc2VkIGNoYW5nZWxvZyB0byB0aGUgdXNlciBmb3IgcmV2aWV3IG9uIGEgc2NyYXRjaCBjb3B5IG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIGFuZFxuICogcmV0dXJucyB3aGF0ZXZlciB0aGV5IGxlZnQgYmVoaW5kLiBUaGUgc2NyYXRjaCBmb2xkZXIgaXMgcmVtb3ZlZCBldmVuIHdoZW4gdGhlIHJldmlldyBmYWlscy5cbiAqXG4gKiBAcGFyYW0gbmV3Q2hhbmdlTG9nIC0gVGhlIGNvbXBvc2VkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgdG8gaGFuZCBvdmVyIGZvciByZXZpZXcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXZpZXdlZCBjb250ZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXZpZXdDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzY3JhdGNoRm9sZGVyID0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCAnb2JzaWRpYW4tZGV2LXV0aWxzLWNoYW5nZWxvZy0nKSk7XG4gIGNvbnN0IHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoID0gam9pbihzY3JhdGNoRm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZUZpbGUoc2NyYXRjaENoYW5nZWxvZ1BhdGgsIG5ld0NoYW5nZUxvZywgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjb2RlVmVyc2lvbiA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnY29kZSAtLXZlcnNpb24nLCB7XG4gICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuICAgIGlmIChjb2RlVmVyc2lvbikge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKGBQbGVhc2UgdXBkYXRlIHRoZSAke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBDbG9zZSBWaXN1YWwgU3R1ZGlvIENvZGUgd2hlbiB5b3UgYXJlIGRvbmUuLi5gKTtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2NvZGUnLCAnLXcnLCBzY3JhdGNoQ2hhbmdlbG9nUGF0aF0sIHtcbiAgICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2ZXJzaW9uRGVidWdnZXIoJ0NvdWxkIG5vdCBmaW5kIFZpc3VhbCBTdHVkaW8gQ29kZSBpbiB5b3VyIFBBVEguIFVzaW5nIGNvbnNvbGUgbW9kZSBpbnN0ZWFkLicpO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbihcbiAgICAgICAgYFBsZWFzZSB1cGRhdGUgdGhlICR7c2NyYXRjaENoYW5nZWxvZ1BhdGh9IGZpbGUuIFByZXNzIEVudGVyIHdoZW4geW91IGFyZSBkb25lLi4uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVhZEZpbGUoc2NyYXRjaENoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJtKHNjcmF0Y2hGb2xkZXIsIHtcbiAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9GaXJzdExpbmUoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuICRzdHJpbmcuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbikuc2xpY2UoMCwgMSkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb246IHN0cmluZywgbWluQXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1hbmlmZXN0QmV0YUpzb25QYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEJldGFKc29uIH0pO1xuICBpZiAoaXNQcmVSZWxlYXNlKG5ld1ZlcnNpb24pKSB7XG4gICAgYXdhaXQgY3AoXG4gICAgICByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KSxcbiAgICAgIG1hbmlmZXN0QmV0YUpzb25QYXRoLFxuICAgICAgeyBmb3JjZTogdHJ1ZSB9XG4gICAgKTtcbiAgICBhd2FpdCBlZGl0SnNvbjxNYW5pZmVzdD4oe1xuICAgICAgZWRpdEZ1bmN0aW9uOiAobWFuaWZlc3QpID0+IHtcbiAgICAgICAgbWFuaWZlc3QudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgICB9LFxuICAgICAgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RCZXRhSnNvblxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlc29sdmVkTWluQXBwVmVyc2lvbiA9IG1pbkFwcFZlcnNpb24gPz8gYXdhaXQgZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9uKCk7XG5cbiAgICBhd2FpdCBlZGl0SnNvbjxNYW5pZmVzdD4oe1xuICAgICAgZWRpdEZ1bmN0aW9uOiAobWFuaWZlc3QpID0+IHtcbiAgICAgICAgbWFuaWZlc3QubWluQXBwVmVyc2lvbiA9IHJlc29sdmVkTWluQXBwVmVyc2lvbjtcbiAgICAgICAgbWFuaWZlc3QudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgICB9LFxuICAgICAgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uXG4gICAgfSk7XG5cbiAgICBhd2FpdCBlZGl0SnNvbjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7XG4gICAgICBlZGl0RnVuY3Rpb246ICh2ZXJzaW9ucykgPT4ge1xuICAgICAgICB2ZXJzaW9uc1tuZXdWZXJzaW9uXSA9IHJlc29sdmVkTWluQXBwVmVyc2lvbjtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5WZXJzaW9uc0pzb25cbiAgICB9KTtcblxuICAgIGlmIChleGlzdHNTeW5jKG1hbmlmZXN0QmV0YUpzb25QYXRoKSkge1xuICAgICAgYXdhaXQgcm0obWFuaWZlc3RCZXRhSnNvblBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGNvcHlVcGRhdGVkTWFuaWZlc3QoKTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGNvbXBvc2VkIGNoYW5nZWxvZyBpbnRvIHRoZSByZXBvc2l0b3J5LiBEZWxpYmVyYXRlbHkgdGhlIGxhc3QgdGhpbmcgdGhlIGNoYW5nZWxvZyBzdGVwIGRvZXMsXG4gKiBzbyBub3RoaW5nIGxhbmRzIG9uIGRpc2sgdW50aWwgdGhlIGNvbnRlbnQgaXMgc2V0dGxlZC5cbiAqXG4gKiBAcGFyYW0gbmV3Q2hhbmdlTG9nIC0gVGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byB3cml0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlbG9nIGhhcyBiZWVuIHdyaXR0ZW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlRmlsZShyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVAsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUywrQkFBK0I7QUFDeEMsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FB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QUFJLGFBQWE7QUFDZixzQkFBZ0IscUJBQXFCLHdCQUF3QixXQUFXLHNEQUFzRDtBQUM5SCxZQUFNLGFBQWEsQ0FBQyxRQUFRLE1BQU0sb0JBQW9CLEdBQUc7QUFBQSxRQUN2RCxTQUFTO0FBQUEsUUFDVCxzQkFBc0I7QUFBQSxNQUN4QixDQUFDO0FBQUEsSUFDSCxPQUFPO0FBQ0wsc0JBQWdCLDZFQUE2RTtBQUM3RixZQUFNLGdCQUFnQixRQUFRLE9BQU8sUUFBUSxNQUFNLEVBQUU7QUFBQSxRQUNuRCxxQkFBcUIsb0JBQW9CO0FBQUEsTUFDM0M7QUFBQSxJQUNGO0FBRUEsV0FBTyxNQUFNLFNBQVMsc0JBQXNCLE9BQU87QUFBQSxFQUNyRCxVQUFFO0FBQ0EsVUFBTSxHQUFHLGVBQWU7QUFBQSxNQUN0QixPQUFPO0FBQUEsTUFDUCxXQUFXO0FBQUEsSUFDYixDQUFDO0FBQUEsRUFDSDtBQUNGO0FBRUEsU0FBUyxZQUFZLFNBQXlCO0FBQzVDLFNBQU8sUUFBUSxNQUFNLE9BQU8sRUFBRSxPQUFPLE9BQU8sRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUNuRTtBQUVBLGVBQWUsOEJBQThCLFlBQW9CLGVBQWtEO0FBQ2pILFFBQU0sdUJBQXVCLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLGlCQUFpQixDQUFDO0FBQ3ZHLE1BQUksYUFBYSxVQUFVLEdBQUc7QUFDNUIsVUFBTTtBQUFBLE1BQ0osd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsYUFBYSxDQUFDO0FBQUEsTUFDdEU7QUFBQSxNQUNBLEVBQUUsT0FBTyxLQUFLO0FBQUEsSUFDaEI7QUFDQSxVQUFNLFNBQW1CO0FBQUEsTUFDdkIsY0FBYyxDQUFDLGFBQWE7QUFDMUIsaUJBQVMsVUFBVTtBQUFBLE1BQ3JCO0FBQUEsTUFDQSxNQUFNLHdCQUF3QjtBQUFBLElBQ2hDLENBQUM7QUFBQSxFQUNILE9BQU87QUFDTCxVQUFNLHdCQUF3QixpQkFBaUIsTUFBTSx5QkFBeUI7QUFFOUUsVUFBTSxTQUFtQjtBQUFBLE1BQ3ZCLGNBQWMsQ0FBQyxhQUFhO0FBQzFCLGlCQUFTLGdCQUFnQjtBQUN6QixpQkFBUyxVQUFVO0FBQUEsTUFDckI7QUFBQSxNQUNBLE1BQU0sd0JBQXdCO0FBQUEsSUFDaEMsQ0FBQztBQUVELFVBQU0sU0FBaUM7QUFBQSxNQUNyQyxjQUFjLENBQUMsYUFBYTtBQUMxQixpQkFBUyxVQUFVLElBQUk7QUFBQSxNQUN6QjtBQUFBLE1BQ0EsTUFBTSx3QkFBd0I7QUFBQSxJQUNoQyxDQUFDO0FBRUQsUUFBSSxXQUFXLG9CQUFvQixHQUFHO0FBQ3BDLFlBQU0sR0FBRyxvQkFBb0I7QUFBQSxJQUMvQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLG9CQUFvQjtBQUM1QjtBQVNBLGVBQWUsZUFBZSxjQUFxQztBQUNqRSxRQUFNLFVBQVUsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsWUFBWSxDQUFDLEdBQUcsY0FBYyxPQUFPO0FBQy9HOyIsCiAgIm5hbWVzIjogWyJWZXJzaW9uVXBkYXRlVHlwZSJdCn0K
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obsidian-dev-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "98.0.0",
|
|
4
4
|
"description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian"
|
|
@@ -634,6 +634,7 @@
|
|
|
634
634
|
"build": "jiti scripts/build.ts",
|
|
635
635
|
"build:clean": "jiti scripts/build-clean.ts",
|
|
636
636
|
"build:compile": "jiti scripts/build-compile.ts",
|
|
637
|
+
"build:compile:svelte": "jiti scripts/build-compile-svelte.ts",
|
|
637
638
|
"build:compile:typescript": "jiti scripts/build-compile-typescript.ts",
|
|
638
639
|
"build:demo-vault-helper": "jiti scripts/build-demo-vault-helper.ts",
|
|
639
640
|
"build:generate-exports": "jiti scripts/build-generate-exports.ts",
|
|
@@ -641,8 +642,8 @@
|
|
|
641
642
|
"build:generate-merged": "jiti scripts/build-generate-merged.ts",
|
|
642
643
|
"build:integration-test-plugin": "jiti scripts/build-integration-test-plugin.ts",
|
|
643
644
|
"build:lib": "jiti scripts/build-lib.ts",
|
|
644
|
-
"build:styles": "jiti scripts/build-styles.ts",
|
|
645
645
|
"build:stamp-generated": "jiti scripts/build-stamp-generated.ts",
|
|
646
|
+
"build:styles": "jiti scripts/build-styles.ts",
|
|
646
647
|
"build:templates": "jiti scripts/build-templates.ts",
|
|
647
648
|
"build:types": "jiti scripts/build-types.ts",
|
|
648
649
|
"build:validate-declarations": "jiti scripts/build-validate-declarations.ts",
|
|
@@ -691,6 +692,7 @@
|
|
|
691
692
|
"@eslint-community/eslint-plugin-eslint-comments": "^4.7.2",
|
|
692
693
|
"@eslint/config-helpers": "^0.7.0",
|
|
693
694
|
"@eslint/js": "^10.0.1",
|
|
695
|
+
"@eslint/json": "^2.1.0",
|
|
694
696
|
"@lezer/common": "1.5.2",
|
|
695
697
|
"@obsidian-typings/obsidian-public-latest": "^6.36.0",
|
|
696
698
|
"@standard-schema/spec": "^1.1.0",
|
|
@@ -699,17 +701,17 @@
|
|
|
699
701
|
"@types/babel__core": "^7.20.5",
|
|
700
702
|
"@types/eslint": "^9.6.1",
|
|
701
703
|
"@types/luxon": "^3.7.5",
|
|
702
|
-
"@types/node": "^26.4.
|
|
704
|
+
"@types/node": "^26.4.1",
|
|
703
705
|
"@types/parsimmon": "^1.10.9",
|
|
704
706
|
"@types/path-browserify": "^1.0.3",
|
|
705
707
|
"@types/pug": "^2.0.10",
|
|
706
708
|
"@types/react": "^19.2.18",
|
|
707
709
|
"@types/semver": "^7.8.0",
|
|
708
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
709
|
-
"@typescript-eslint/parser": "^8.
|
|
710
|
+
"@typescript-eslint/eslint-plugin": "^8.69.0",
|
|
711
|
+
"@typescript-eslint/parser": "^8.69.0",
|
|
710
712
|
"adm-zip": "^0.6.0",
|
|
711
713
|
"compare-versions": "^6.1.1",
|
|
712
|
-
"cspell": "^10.
|
|
714
|
+
"cspell": "^10.2.0",
|
|
713
715
|
"debug": "^4.4.3",
|
|
714
716
|
"dprint": "^0.57.0",
|
|
715
717
|
"esbuild": "^0.28.2",
|
|
@@ -718,12 +720,12 @@
|
|
|
718
720
|
"eslint": "^10.9.1",
|
|
719
721
|
"eslint-import-resolver-typescript": "^4.4.5",
|
|
720
722
|
"eslint-plugin-import-x": "^4.17.1",
|
|
721
|
-
"eslint-plugin-jsdoc": "^64.3.
|
|
723
|
+
"eslint-plugin-jsdoc": "^64.3.3",
|
|
722
724
|
"eslint-plugin-obsidianmd": "^0.4.2",
|
|
723
|
-
"eslint-plugin-perfectionist": "^5.
|
|
725
|
+
"eslint-plugin-perfectionist": "^5.11.0",
|
|
724
726
|
"eslint-plugin-tsdoc": "^0.5.2",
|
|
725
727
|
"eslint-plugin-unicorn": "^74.0.0",
|
|
726
|
-
"i18next": "^26.4.
|
|
728
|
+
"i18next": "^26.4.1",
|
|
727
729
|
"jiti": "^2.7.0",
|
|
728
730
|
"localforage": "^1.10.0",
|
|
729
731
|
"markdownlint": "^0.41.1",
|
|
@@ -745,21 +747,21 @@
|
|
|
745
747
|
"svelte-preprocess": "^6.0.5",
|
|
746
748
|
"type-fest": "^5.9.0",
|
|
747
749
|
"typescript": "6.0.3",
|
|
748
|
-
"typescript-eslint": "^8.
|
|
750
|
+
"typescript-eslint": "^8.69.0"
|
|
749
751
|
},
|
|
750
752
|
"devDependencies": {
|
|
751
|
-
"@astrojs/markdown-remark": "^7.
|
|
752
|
-
"@astrojs/starlight": "^0.41.
|
|
753
|
+
"@astrojs/markdown-remark": "^7.3.0",
|
|
754
|
+
"@astrojs/starlight": "^0.41.11",
|
|
753
755
|
"@commitlint/cli": "^21.2.2",
|
|
754
756
|
"@commitlint/config-conventional": "^21.2.2",
|
|
755
757
|
"@commitlint/types": "^21.2.0",
|
|
756
|
-
"@jest/globals": "^30.5.
|
|
758
|
+
"@jest/globals": "^30.5.1",
|
|
757
759
|
"@resvg/resvg-js": "^2.6.2",
|
|
758
760
|
"@total-typescript/ts-reset": "^0.6.1",
|
|
759
761
|
"@types/adm-zip": "^0.5.8",
|
|
760
|
-
"@typescript-eslint/rule-tester": "^8.
|
|
762
|
+
"@typescript-eslint/rule-tester": "^8.69.0",
|
|
761
763
|
"@vitest/coverage-v8": "^4.1.11",
|
|
762
|
-
"astro": "^7.2.
|
|
764
|
+
"astro": "^7.2.10",
|
|
763
765
|
"better-typescript-lib": "^2.12.0",
|
|
764
766
|
"czg": "^1.14.0",
|
|
765
767
|
"dedent": "^1.7.2",
|
|
@@ -769,7 +771,7 @@
|
|
|
769
771
|
"jsdom": "^30.0.1",
|
|
770
772
|
"moment": "^2.30.1",
|
|
771
773
|
"nano-staged": "^1.0.2",
|
|
772
|
-
"obsidian-integration-testing": "^
|
|
774
|
+
"obsidian-integration-testing": "^12.0.0",
|
|
773
775
|
"obsidian-test-mocks": "^4.2.1",
|
|
774
776
|
"satori": "^0.33.4",
|
|
775
777
|
"starlight-github-alerts": "^0.4.0",
|
|
@@ -781,7 +783,7 @@
|
|
|
781
783
|
"yaml": "^2.9.0"
|
|
782
784
|
},
|
|
783
785
|
"peerDependencies": {
|
|
784
|
-
"obsidian-integration-testing": "^
|
|
786
|
+
"obsidian-integration-testing": "^12.0.0"
|
|
785
787
|
},
|
|
786
788
|
"peerDependenciesMeta": {
|
|
787
789
|
"obsidian-integration-testing": {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"main": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs",
|
|
3
|
+
"module": "../../../../dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"types": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"main": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs",
|
|
3
|
+
"module": "../../../../dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"types": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"main": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs",
|
|
3
|
+
"module": "../../../../dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"types": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"main": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs",
|
|
3
|
+
"module": "../../../../dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"types": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts"
|
|
6
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"main": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs",
|
|
3
|
+
"module": "../../../../dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"types": "../../../../dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts"
|
|
6
|
+
}
|