obsidian-integration-testing 9.2.2 → 10.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/README.md +45 -45
- package/dist/lib/cjs/appium-dependencies.cjs +5 -5
- package/dist/lib/cjs/appium-dependencies.d.cts +4 -2
- package/dist/lib/cjs/appium-session-config.cjs +1 -1
- package/dist/lib/cjs/asar-fallback-detection.cjs +4 -4
- package/dist/lib/cjs/asar-fallback-detection.d.cts +15 -7
- package/dist/lib/cjs/avd-list.cjs +1 -1
- package/dist/lib/cjs/avd-list.d.cts +6 -2
- package/dist/lib/cjs/cli.cjs +4 -4
- package/dist/lib/cjs/compatibility-options.cjs +13 -13
- package/dist/lib/cjs/compatibility-options.d.cts +24 -12
- package/dist/lib/cjs/connect-to-cdp.cjs +4 -4
- package/dist/lib/cjs/connect-to-cdp.d.cts +6 -6
- package/dist/lib/cjs/context-id.cjs +5 -5
- package/dist/lib/cjs/context-id.d.cts +1 -1
- package/dist/lib/cjs/context-provider.cjs +5 -5
- package/dist/lib/cjs/context-provider.d.cts +4 -4
- package/dist/lib/cjs/demo-vault-populate.cjs +5 -5
- package/dist/lib/cjs/demo-vault-populate.d.cts +4 -4
- package/dist/lib/cjs/demo-vault-tree.cjs +4 -4
- package/dist/lib/cjs/demo-vault-tree.d.cts +3 -3
- package/dist/lib/cjs/device-readiness.cjs +3 -3
- package/dist/lib/cjs/device-readiness.d.cts +7 -3
- package/dist/lib/cjs/ecmascript-version.cjs +1 -1
- package/dist/lib/cjs/electron-compatibility.cjs +4 -4
- package/dist/lib/cjs/electron-compatibility.d.cts +33 -17
- package/dist/lib/cjs/emulator-arguments.cjs +36 -0
- package/dist/lib/{esm/emulator-args.d.mts → cjs/emulator-arguments.d.cts} +6 -4
- package/dist/lib/cjs/enable-plugin.cjs +29 -29
- package/dist/lib/cjs/enable-plugin.d.cts +6 -6
- package/dist/lib/cjs/eval-in-obsidian.cjs +9 -9
- package/dist/lib/cjs/eval-in-obsidian.d.cts +23 -23
- package/dist/lib/cjs/exec.cjs +49 -53
- package/dist/lib/cjs/exec.d.cts +9 -9
- package/dist/lib/cjs/function-expression.cjs +8 -8
- package/dist/lib/cjs/function-expression.d.cts +4 -4
- package/dist/lib/cjs/generate-function-call.cjs +6 -6
- package/dist/lib/cjs/generate-function-call.d.cts +15 -9
- package/dist/lib/cjs/global-setup-core.cjs +43 -43
- package/dist/lib/cjs/global-setup-core.d.cts +19 -9
- package/dist/lib/cjs/incompatible-installer-version-error.cjs +10 -4
- package/dist/lib/cjs/incompatible-installer-version-error.d.cts +18 -6
- package/dist/lib/cjs/index.cjs +10 -10
- package/dist/lib/cjs/index.d.cts +8 -8
- package/dist/lib/cjs/installer-asset.cjs +4 -4
- package/dist/lib/cjs/installer-asset.d.cts +21 -7
- package/dist/lib/cjs/installer-compatibility.cjs +4 -4
- package/dist/lib/cjs/installer-compatibility.d.cts +36 -18
- package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +3 -3
- package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +1 -1
- package/dist/lib/cjs/jest/global-setup.cjs +11 -11
- package/dist/lib/cjs/jest/global-setup.d.cts +12 -8
- package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +2 -3
- package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +1 -2
- package/dist/lib/cjs/jest/global-teardown.cjs +2 -3
- package/dist/lib/cjs/jest/global-teardown.d.cts +1 -2
- package/dist/lib/cjs/jest/setup.cjs +2 -2
- package/dist/lib/cjs/jest/setup.d.cts +1 -1
- package/dist/lib/cjs/json-with-functions.cjs +7 -7
- package/dist/lib/cjs/leftover-cleanup.cjs +14 -14
- package/dist/lib/cjs/leftover-cleanup.d.cts +42 -20
- package/dist/lib/cjs/library.cjs +2 -2
- package/dist/lib/cjs/namespace-bootstrap.cjs +46 -40
- package/dist/lib/cjs/native-dialog-monitor.cjs +15 -13
- package/dist/lib/cjs/normalize-optional-properties.cjs +3 -3
- package/dist/lib/cjs/normalize-optional-properties.d.cts +2 -2
- package/dist/lib/cjs/obsidian-config.cjs +30 -31
- package/dist/lib/cjs/obsidian-config.d.cts +8 -8
- package/dist/lib/cjs/obsidian-executable.cjs +2 -2
- package/dist/lib/cjs/obsidian-installer.cjs +37 -37
- package/dist/lib/cjs/obsidian-installer.d.cts +7 -3
- package/dist/lib/cjs/obsidian-instance.cjs +3 -3
- package/dist/lib/cjs/obsidian-instance.d.cts +18 -8
- package/dist/lib/cjs/obsidian-metadata.cjs +1 -1
- package/dist/lib/cjs/obsidian-metadata.d.cts +36 -12
- package/dist/lib/cjs/obsidian-namespace.cjs +1 -1
- package/dist/lib/cjs/obsidian-namespace.d.cts +25 -11
- package/dist/lib/cjs/obsidian-version-switch.cjs +9 -9
- package/dist/lib/cjs/obsidian-version-switch.d.cts +14 -10
- package/dist/lib/cjs/obsidian-version.cjs +3 -3
- package/dist/lib/cjs/obsidian-version.d.cts +15 -5
- package/dist/lib/cjs/owned-vault-seed.cjs +1 -1
- package/dist/lib/cjs/owned-vault-seed.d.cts +24 -8
- package/dist/lib/cjs/parent-liveness.cjs +4 -4
- package/dist/lib/cjs/parent-liveness.d.cts +7 -3
- package/dist/lib/cjs/poll-in-obsidian.cjs +5 -5
- package/dist/lib/cjs/poll-in-obsidian.d.cts +12 -12
- package/dist/lib/cjs/poll-until.cjs +1 -1
- package/dist/lib/cjs/poll-until.d.cts +21 -7
- package/dist/lib/cjs/process-exit-message.cjs +1 -1
- package/dist/lib/cjs/process-exit-message.d.cts +21 -7
- package/dist/lib/cjs/renderer-boot-detection.cjs +9 -9
- package/dist/lib/cjs/renderer-boot-detection.d.cts +31 -27
- package/dist/lib/cjs/renderer-failed-to-initialize-error.cjs +1 -1
- package/dist/lib/cjs/renderer-failed-to-initialize-error.d.cts +1 -1
- package/dist/lib/cjs/setup-lock.cjs +26 -26
- package/dist/lib/cjs/setup-lock.d.cts +6 -2
- package/dist/lib/cjs/silent-asar-fallback-error.cjs +7 -3
- package/dist/lib/cjs/silent-asar-fallback-error.d.cts +12 -4
- package/dist/lib/cjs/spawn-options.cjs +1 -1
- package/dist/lib/cjs/spawn-options.d.cts +3 -1
- package/dist/lib/cjs/strict-proxy.cjs +25 -25
- package/dist/lib/cjs/strict-proxy.d.cts +3 -3
- package/dist/lib/cjs/temporary-vault.cjs +166 -0
- package/dist/lib/cjs/{temp-vault.d.cts → temporary-vault.d.cts} +3 -3
- package/dist/lib/cjs/transport-appium.cjs +7 -7
- package/dist/lib/cjs/transport-appium.d.cts +7 -3
- package/dist/lib/cjs/transport-desktop-cdp.cjs +57 -57
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +29 -17
- package/dist/lib/cjs/transport-factory.cjs +62 -63
- package/dist/lib/cjs/type-guards.cjs +3 -3
- package/dist/lib/cjs/type-guards.d.cts +2 -2
- package/dist/lib/cjs/vault-path-match.cjs +9 -9
- package/dist/lib/cjs/vault-path-match.d.cts +11 -11
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +51 -17
- package/dist/lib/cjs/visibility.cjs +7 -7
- package/dist/lib/cjs/visibility.d.cts +5 -5
- package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +3 -3
- package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +2 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +9 -9
- package/dist/lib/cjs/vitest/global-setup.d.cts +4 -4
- package/dist/lib/cjs/vitest/setup.cjs +2 -2
- package/dist/lib/cjs/vitest/typings.d.cts +2 -2
- package/dist/lib/esm/appium-dependencies.d.mts +4 -2
- package/dist/lib/esm/appium-dependencies.mjs +4 -4
- package/dist/lib/esm/appium-session-config.mjs +1 -1
- package/dist/lib/esm/asar-fallback-detection.d.mts +15 -7
- package/dist/lib/esm/asar-fallback-detection.mjs +3 -3
- package/dist/lib/esm/avd-list.d.mts +6 -2
- package/dist/lib/esm/avd-list.mjs +1 -1
- package/dist/lib/esm/cli.mjs +4 -4
- package/dist/lib/esm/compatibility-options.d.mts +24 -12
- package/dist/lib/esm/compatibility-options.mjs +10 -10
- package/dist/lib/esm/connect-to-cdp.d.mts +6 -6
- package/dist/lib/esm/connect-to-cdp.mjs +6 -6
- package/dist/lib/esm/context-id.d.mts +1 -1
- package/dist/lib/esm/context-id.mjs +5 -5
- package/dist/lib/esm/context-provider.d.mts +4 -4
- package/dist/lib/esm/context-provider.mjs +5 -5
- package/dist/lib/esm/demo-vault-populate.d.mts +4 -4
- package/dist/lib/esm/demo-vault-populate.mjs +5 -5
- package/dist/lib/esm/demo-vault-tree.d.mts +3 -3
- package/dist/lib/esm/demo-vault-tree.mjs +4 -4
- package/dist/lib/esm/device-readiness.d.mts +7 -3
- package/dist/lib/esm/device-readiness.mjs +3 -3
- package/dist/lib/esm/ecmascript-version.mjs +1 -1
- package/dist/lib/esm/electron-compatibility.d.mts +33 -17
- package/dist/lib/esm/electron-compatibility.mjs +3 -3
- package/dist/lib/{cjs/emulator-args.d.cts → esm/emulator-arguments.d.mts} +6 -4
- package/dist/lib/esm/emulator-arguments.mjs +12 -0
- package/dist/lib/esm/enable-plugin.d.mts +6 -6
- package/dist/lib/esm/enable-plugin.mjs +29 -29
- package/dist/lib/esm/eval-in-obsidian.d.mts +23 -23
- package/dist/lib/esm/eval-in-obsidian.mjs +9 -9
- package/dist/lib/esm/exec.d.mts +9 -9
- package/dist/lib/esm/exec.mjs +49 -53
- package/dist/lib/esm/function-expression.d.mts +4 -4
- package/dist/lib/esm/function-expression.mjs +8 -8
- package/dist/lib/esm/generate-function-call.d.mts +15 -9
- package/dist/lib/esm/generate-function-call.mjs +6 -6
- package/dist/lib/esm/global-setup-core.d.mts +19 -9
- package/dist/lib/esm/global-setup-core.mjs +45 -45
- package/dist/lib/esm/incompatible-installer-version-error.d.mts +18 -6
- package/dist/lib/esm/incompatible-installer-version-error.mjs +10 -4
- package/dist/lib/esm/index.d.mts +8 -8
- package/dist/lib/esm/index.mjs +9 -9
- package/dist/lib/esm/installer-asset.d.mts +21 -7
- package/dist/lib/esm/installer-asset.mjs +4 -4
- package/dist/lib/esm/installer-compatibility.d.mts +36 -18
- package/dist/lib/esm/installer-compatibility.mjs +3 -3
- package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +1 -1
- package/dist/lib/esm/jest/global-setup-no-plugin.mjs +3 -3
- package/dist/lib/esm/jest/global-setup.d.mts +12 -8
- package/dist/lib/esm/jest/global-setup.mjs +10 -10
- package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +1 -2
- package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +2 -3
- package/dist/lib/esm/jest/global-teardown.d.mts +1 -2
- package/dist/lib/esm/jest/global-teardown.mjs +2 -3
- package/dist/lib/esm/jest/setup.d.mts +1 -1
- package/dist/lib/esm/jest/setup.mjs +2 -2
- package/dist/lib/esm/json-with-functions.mjs +7 -7
- package/dist/lib/esm/leftover-cleanup.d.mts +42 -20
- package/dist/lib/esm/leftover-cleanup.mjs +12 -12
- package/dist/lib/esm/library.mjs +2 -2
- package/dist/lib/esm/namespace-bootstrap.mjs +46 -40
- package/dist/lib/esm/native-dialog-monitor.mjs +15 -13
- package/dist/lib/esm/normalize-optional-properties.d.mts +2 -2
- package/dist/lib/esm/normalize-optional-properties.mjs +3 -3
- package/dist/lib/esm/obsidian-config.d.mts +8 -8
- package/dist/lib/esm/obsidian-config.mjs +27 -28
- package/dist/lib/esm/obsidian-executable.mjs +2 -2
- package/dist/lib/esm/obsidian-installer.d.mts +7 -3
- package/dist/lib/esm/obsidian-installer.mjs +36 -36
- package/dist/lib/esm/obsidian-instance.d.mts +18 -8
- package/dist/lib/esm/obsidian-instance.mjs +3 -3
- package/dist/lib/esm/obsidian-metadata.d.mts +36 -12
- package/dist/lib/esm/obsidian-metadata.mjs +1 -1
- package/dist/lib/esm/obsidian-namespace.d.mts +25 -11
- package/dist/lib/esm/obsidian-version-switch.d.mts +14 -10
- package/dist/lib/esm/obsidian-version-switch.mjs +9 -9
- package/dist/lib/esm/obsidian-version.d.mts +15 -5
- package/dist/lib/esm/obsidian-version.mjs +3 -3
- package/dist/lib/esm/owned-vault-seed.d.mts +24 -8
- package/dist/lib/esm/owned-vault-seed.mjs +1 -1
- package/dist/lib/esm/parent-liveness.d.mts +7 -3
- package/dist/lib/esm/parent-liveness.mjs +3 -3
- package/dist/lib/esm/poll-in-obsidian.d.mts +12 -12
- package/dist/lib/esm/poll-in-obsidian.mjs +5 -5
- package/dist/lib/esm/poll-until.d.mts +21 -7
- package/dist/lib/esm/poll-until.mjs +1 -1
- package/dist/lib/esm/process-exit-message.d.mts +21 -7
- package/dist/lib/esm/process-exit-message.mjs +1 -1
- package/dist/lib/esm/renderer-boot-detection.d.mts +31 -27
- package/dist/lib/esm/renderer-boot-detection.mjs +7 -7
- package/dist/lib/esm/renderer-failed-to-initialize-error.d.mts +1 -1
- package/dist/lib/esm/renderer-failed-to-initialize-error.mjs +1 -1
- package/dist/lib/esm/setup-lock.d.mts +6 -2
- package/dist/lib/esm/setup-lock.mjs +26 -26
- package/dist/lib/esm/silent-asar-fallback-error.d.mts +12 -4
- package/dist/lib/esm/silent-asar-fallback-error.mjs +7 -3
- package/dist/lib/esm/spawn-options.d.mts +3 -1
- package/dist/lib/esm/spawn-options.mjs +1 -1
- package/dist/lib/esm/strict-proxy.d.mts +3 -3
- package/dist/lib/esm/strict-proxy.mjs +25 -25
- package/dist/lib/esm/{temp-vault.d.mts → temporary-vault.d.mts} +3 -3
- package/dist/lib/esm/temporary-vault.mjs +157 -0
- package/dist/lib/esm/transport-appium.d.mts +7 -3
- package/dist/lib/esm/transport-appium.mjs +7 -7
- package/dist/lib/esm/transport-desktop-cdp.d.mts +29 -17
- package/dist/lib/esm/transport-desktop-cdp.mjs +67 -67
- package/dist/lib/esm/transport-factory.mjs +71 -72
- package/dist/lib/esm/type-guards.d.mts +2 -2
- package/dist/lib/esm/type-guards.mjs +3 -3
- package/dist/lib/esm/vault-path-match.d.mts +11 -11
- package/dist/lib/esm/vault-path-match.mjs +7 -7
- package/dist/lib/esm/version-matrix.d.mts +51 -17
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/visibility.d.mts +5 -5
- package/dist/lib/esm/visibility.mjs +5 -5
- package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +2 -2
- package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +3 -3
- package/dist/lib/esm/vitest/global-setup.d.mts +4 -4
- package/dist/lib/esm/vitest/global-setup.mjs +8 -8
- package/dist/lib/esm/vitest/setup.mjs +2 -2
- package/dist/lib/esm/vitest/typings.d.mts +2 -2
- package/dist/obsidian-integration-testing-10.0.0.tgz +0 -0
- package/package.json +15 -13
- package/dist/lib/cjs/emulator-args.cjs +0 -36
- package/dist/lib/cjs/temp-vault.cjs +0 -166
- package/dist/lib/esm/emulator-args.mjs +0 -12
- package/dist/lib/esm/temp-vault.mjs +0 -157
- package/dist/obsidian-integration-testing-9.2.2.tgz +0 -0
|
@@ -45,7 +45,7 @@ var import_leftover_cleanup = require("./leftover-cleanup.cjs");
|
|
|
45
45
|
var import_log = require("./log.cjs");
|
|
46
46
|
var import_plugin_enable_retry = require("./plugin-enable-retry.cjs");
|
|
47
47
|
var import_setup_lock = require("./setup-lock.cjs");
|
|
48
|
-
var
|
|
48
|
+
var import_temporary_vault = require("./temporary-vault.cjs");
|
|
49
49
|
var import_transport_appium = require("./transport-appium.cjs");
|
|
50
50
|
var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
|
|
51
51
|
var import_transport_factory = require("./transport-factory.cjs");
|
|
@@ -80,44 +80,44 @@ async function coreSetup(params) {
|
|
|
80
80
|
}
|
|
81
81
|
await sweepLeftovers({ label, phase: "setup", transportOptions });
|
|
82
82
|
let transport;
|
|
83
|
-
let
|
|
83
|
+
let temporaryVault;
|
|
84
84
|
try {
|
|
85
85
|
(0, import_log.log)(`[integration-setup:${label}] Creating transport...`);
|
|
86
86
|
transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
|
|
87
87
|
(0, import_log.log)(`[integration-setup:${label}] Transport created: ${transport.constructor.name}`);
|
|
88
88
|
(0, import_log.log)(`[integration-setup:${label}] Project root: ${projectRoot}`);
|
|
89
89
|
const shouldInstallPlugin = params?.installPlugin !== false;
|
|
90
|
-
|
|
91
|
-
(0, import_log.log)(`[integration-setup:${label}] Created temp vault: ${
|
|
90
|
+
temporaryVault = new import_temporary_vault.TemporaryVault();
|
|
91
|
+
(0, import_log.log)(`[integration-setup:${label}] Created temp vault: ${temporaryVault.path}`);
|
|
92
92
|
let pluginId;
|
|
93
93
|
if (shouldInstallPlugin) {
|
|
94
|
-
pluginId = await copyPluginIntoVault({ label, projectRoot,
|
|
94
|
+
pluginId = await copyPluginIntoVault({ label, projectRoot, temporaryVault, transport });
|
|
95
95
|
} else {
|
|
96
96
|
(0, import_log.log)(`[integration-setup:${label}] Skipping plugin install (installPlugin: false) \u2014 registering an empty vault.`);
|
|
97
97
|
}
|
|
98
98
|
if (params?.populate) {
|
|
99
99
|
const entryCount = Object.keys(params.populate).length;
|
|
100
100
|
(0, import_log.log)(`[integration-setup:${label}] Populating vault with ${String(entryCount)} entries before open...`);
|
|
101
|
-
|
|
101
|
+
temporaryVault.populate(params.populate);
|
|
102
102
|
}
|
|
103
|
-
await ensureAlwaysUpdateLinks(
|
|
103
|
+
await ensureAlwaysUpdateLinks(temporaryVault, label);
|
|
104
104
|
(0, import_log.log)(`[integration-setup:${label}] Syncing vault to device...`);
|
|
105
|
-
await
|
|
105
|
+
await temporaryVault.syncToDevice(transport);
|
|
106
106
|
(0, import_log.log)(`[integration-setup:${label}] Registering vault...`);
|
|
107
|
-
await
|
|
107
|
+
await temporaryVault.register(transport);
|
|
108
108
|
(0, import_log.log)(`[integration-setup:${label}] Vault registered.`);
|
|
109
109
|
if (pluginId !== void 0) {
|
|
110
|
-
await enablePluginInVault({ label, pluginId,
|
|
110
|
+
await enablePluginInVault({ label, pluginId, temporaryVault, transport, transportOptions });
|
|
111
111
|
}
|
|
112
112
|
await enableExtraCommunityPlugins({
|
|
113
113
|
label,
|
|
114
114
|
pluginIds: params?.enableCommunityPlugins ?? [],
|
|
115
|
-
|
|
115
|
+
temporaryVault,
|
|
116
116
|
transport,
|
|
117
117
|
transportOptions
|
|
118
118
|
});
|
|
119
119
|
const augmentedOptions = augmentTransportOptions(transportOptions, transport);
|
|
120
|
-
const result = {
|
|
120
|
+
const result = { temporaryVault, transport, transportLabel: label, transportOptions: augmentedOptions };
|
|
121
121
|
activeSetups.add(result);
|
|
122
122
|
if (lock) {
|
|
123
123
|
setupLocks.set(result, lock);
|
|
@@ -127,8 +127,8 @@ async function coreSetup(params) {
|
|
|
127
127
|
} catch (error) {
|
|
128
128
|
(0, import_log.log)(`[integration-setup:${label}] Setup failed, cleaning up...`);
|
|
129
129
|
try {
|
|
130
|
-
if (
|
|
131
|
-
await
|
|
130
|
+
if (temporaryVault && transport) {
|
|
131
|
+
await temporaryVault.dispose(transport);
|
|
132
132
|
}
|
|
133
133
|
} catch (cleanupError) {
|
|
134
134
|
(0, import_log.log)(`[integration-setup:${label}] Vault cleanup error (non-fatal): ${(0, import_error_to_string.errorToString)(cleanupError)}`);
|
|
@@ -158,7 +158,7 @@ async function coreTeardown(result) {
|
|
|
158
158
|
releaseSetupLock(result);
|
|
159
159
|
}
|
|
160
160
|
await sweepLeftovers({
|
|
161
|
-
excludedNames: [...activeSetups].map((activeSetup) => (0, import_node_path.basename)(activeSetup.
|
|
161
|
+
excludedNames: [...activeSetups].map((activeSetup) => (0, import_node_path.basename)(activeSetup.temporaryVault.path)),
|
|
162
162
|
label: result.transportLabel,
|
|
163
163
|
phase: "teardown",
|
|
164
164
|
transportOptions: result.transportOptions
|
|
@@ -200,7 +200,7 @@ function augmentTransportOptions(options, transport) {
|
|
|
200
200
|
return options;
|
|
201
201
|
}
|
|
202
202
|
async function copyPluginIntoVault(params) {
|
|
203
|
-
const { label, projectRoot,
|
|
203
|
+
const { label, projectRoot, temporaryVault, transport } = params;
|
|
204
204
|
const distPath = await resolveDistPath(projectRoot);
|
|
205
205
|
const manifestJson = JSON.parse(await (0, import_promises.readFile)((0, import_node_path.join)(distPath, "manifest.json"), "utf-8"));
|
|
206
206
|
const pluginId = manifestJson.id;
|
|
@@ -212,21 +212,21 @@ async function copyPluginIntoVault(params) {
|
|
|
212
212
|
const mainJs = (0, import_node_path.join)(distPath, MAIN_JS);
|
|
213
213
|
const buildStat = await (0, import_promises.stat)(mainJs);
|
|
214
214
|
(0, import_log.log)(`[integration-setup:${label}] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
|
|
215
|
-
const
|
|
216
|
-
await (0, import_promises.mkdir)(
|
|
217
|
-
await (0, import_promises.cp)(distPath,
|
|
218
|
-
await (0, import_promises.writeFile)((0, import_node_path.join)(
|
|
215
|
+
const pluginDirectory = (0, import_node_path.join)(temporaryVault.path, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
|
|
216
|
+
await (0, import_promises.mkdir)(pluginDirectory, { recursive: true });
|
|
217
|
+
await (0, import_promises.cp)(distPath, pluginDirectory, { recursive: true });
|
|
218
|
+
await (0, import_promises.writeFile)((0, import_node_path.join)(temporaryVault.path, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
|
|
219
219
|
return pluginId;
|
|
220
220
|
}
|
|
221
221
|
async function enableExtraCommunityPlugins(params) {
|
|
222
|
-
const { label, pluginIds,
|
|
222
|
+
const { label, pluginIds, temporaryVault, transport, transportOptions } = params;
|
|
223
223
|
for (const pluginId of pluginIds) {
|
|
224
224
|
(0, import_log.log)(`[integration-setup:${label}] Enabling extra community plugin "${pluginId}"...`);
|
|
225
|
-
await enablePluginInVault({ label, pluginId,
|
|
225
|
+
await enablePluginInVault({ label, pluginId, temporaryVault, transport, transportOptions });
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
228
|
async function enablePluginInVault(params) {
|
|
229
|
-
const { label, pluginId,
|
|
229
|
+
const { label, pluginId, temporaryVault, transport, transportOptions } = params;
|
|
230
230
|
(0, import_log.log)(`[integration-setup:${label}] Enabling plugin "${pluginId}"...`);
|
|
231
231
|
const captureHandle = await transport.beginConsoleCapture?.();
|
|
232
232
|
const maxAttempts = 1 + (0, import_plugin_enable_retry.resolvePluginEnableRetryCount)(transportOptions);
|
|
@@ -235,11 +235,11 @@ async function enablePluginInVault(params) {
|
|
|
235
235
|
let result;
|
|
236
236
|
try {
|
|
237
237
|
result = await (0, import_eval_in_obsidian.evalInObsidian)({
|
|
238
|
-
|
|
239
|
-
|
|
238
|
+
callback: import_enable_plugin.enablePluginWithErrorCapture,
|
|
239
|
+
input: { pluginId },
|
|
240
240
|
shouldSkipPreflightChecks: true,
|
|
241
241
|
transport,
|
|
242
|
-
vaultPath:
|
|
242
|
+
vaultPath: temporaryVault.path
|
|
243
243
|
});
|
|
244
244
|
} catch (error) {
|
|
245
245
|
if (attempt < maxAttempts) {
|
|
@@ -273,30 +273,30 @@ async function enablePluginInVault(params) {
|
|
|
273
273
|
const detail = logcatTail ?? (0, import_enable_plugin.getGenericPluginLoadFailureMessage)(pluginId);
|
|
274
274
|
throw new Error(`Plugin "${pluginId}" failed to load: ${detail}`);
|
|
275
275
|
}
|
|
276
|
-
async function ensureAlwaysUpdateLinks(
|
|
277
|
-
const
|
|
278
|
-
const appJsonPath = (0, import_node_path.join)(
|
|
276
|
+
async function ensureAlwaysUpdateLinks(temporaryVault, label) {
|
|
277
|
+
const configDirectory = (0, import_node_path.join)(temporaryVault.path, OBSIDIAN_CONFIG_DIR);
|
|
278
|
+
const appJsonPath = (0, import_node_path.join)(configDirectory, APP_JSON);
|
|
279
279
|
let appConfig = {};
|
|
280
280
|
try {
|
|
281
281
|
appConfig = JSON.parse(await (0, import_promises.readFile)(appJsonPath, "utf-8"));
|
|
282
282
|
} catch {
|
|
283
283
|
}
|
|
284
284
|
appConfig["alwaysUpdateLinks"] = true;
|
|
285
|
-
await (0, import_promises.mkdir)(
|
|
285
|
+
await (0, import_promises.mkdir)(configDirectory, { recursive: true });
|
|
286
286
|
await (0, import_promises.writeFile)(appJsonPath, JSON.stringify(appConfig, null, APP_JSON_INDENT));
|
|
287
287
|
(0, import_log.log)(`[integration-setup:${label}] Enabled alwaysUpdateLinks in ${APP_JSON} (headless rename support).`);
|
|
288
288
|
}
|
|
289
289
|
function findProjectRoot() {
|
|
290
|
-
let
|
|
290
|
+
let directory = import_node_process.default.cwd();
|
|
291
291
|
while (true) {
|
|
292
|
-
if ((0, import_node_fs.existsSync)((0, import_node_path.join)(
|
|
293
|
-
return
|
|
292
|
+
if ((0, import_node_fs.existsSync)((0, import_node_path.join)(directory, "package.json"))) {
|
|
293
|
+
return directory;
|
|
294
294
|
}
|
|
295
|
-
const parent = (0, import_node_path.join)(
|
|
296
|
-
if (parent ===
|
|
295
|
+
const parent = (0, import_node_path.join)(directory, "..");
|
|
296
|
+
if (parent === directory) {
|
|
297
297
|
throw new Error("Could not find project root (no package.json found).");
|
|
298
298
|
}
|
|
299
|
-
|
|
299
|
+
directory = parent;
|
|
300
300
|
}
|
|
301
301
|
}
|
|
302
302
|
function getLockScope(transportOptions) {
|
|
@@ -312,7 +312,7 @@ function registerProcessCleanupHandler() {
|
|
|
312
312
|
return;
|
|
313
313
|
}
|
|
314
314
|
(0, import_log.log)(`[integration-teardown] Process exiting with ${String(activeSetups.size)} setup(s) not torn down. Cleaning up...`);
|
|
315
|
-
for (const result of
|
|
315
|
+
for (const result of activeSetups) {
|
|
316
316
|
coreTeardown(result).catch((error) => {
|
|
317
317
|
(0, import_log.log)(`[integration-teardown:${result.transportLabel}] Process cleanup error (non-fatal): ${(0, import_error_to_string.errorToString)(error)}`);
|
|
318
318
|
});
|
|
@@ -323,7 +323,7 @@ function registerProcessCleanupHandler() {
|
|
|
323
323
|
return;
|
|
324
324
|
}
|
|
325
325
|
(0, import_log.log)(`[integration-teardown] Unhandled rejection detected. Tearing down ${String(activeSetups.size)} active setup(s)...`);
|
|
326
|
-
for (const result of
|
|
326
|
+
for (const result of activeSetups) {
|
|
327
327
|
coreTeardown(result).catch((error) => {
|
|
328
328
|
(0, import_log.log)(`[integration-teardown:${result.transportLabel}] Rejection cleanup error (non-fatal): ${(0, import_error_to_string.errorToString)(error)}`);
|
|
329
329
|
});
|
|
@@ -334,14 +334,14 @@ function registerProcessCleanupHandler() {
|
|
|
334
334
|
return;
|
|
335
335
|
}
|
|
336
336
|
(0, import_log.log)(`[integration-teardown] Sync cleanup: ${String(activeSetups.size)} orphaned setup(s).`);
|
|
337
|
-
for (const result of
|
|
337
|
+
for (const result of activeSetups) {
|
|
338
338
|
try {
|
|
339
339
|
result.transport.disposeSync?.();
|
|
340
340
|
} catch (error) {
|
|
341
341
|
(0, import_log.log)(`[integration-teardown:${result.transportLabel}] Sync transport cleanup error (non-fatal): ${(0, import_error_to_string.errorToString)(error)}`);
|
|
342
342
|
}
|
|
343
343
|
try {
|
|
344
|
-
(0, import_node_fs.rmSync)(result.
|
|
344
|
+
(0, import_node_fs.rmSync)(result.temporaryVault.path, { force: true, recursive: true });
|
|
345
345
|
} catch (error) {
|
|
346
346
|
(0, import_log.log)(`[integration-teardown:${result.transportLabel}] Sync vault cleanup error (non-fatal): ${(0, import_error_to_string.errorToString)(error)}`);
|
|
347
347
|
}
|
|
@@ -377,7 +377,7 @@ async function resolveDistPath(projectRoot) {
|
|
|
377
377
|
}
|
|
378
378
|
async function sweepLeftovers(params) {
|
|
379
379
|
const { label, phase, transportOptions } = params;
|
|
380
|
-
if (!(0, import_leftover_cleanup.
|
|
380
|
+
if (!(0, import_leftover_cleanup.willSweepLeftovers)(transportOptions)) {
|
|
381
381
|
return;
|
|
382
382
|
}
|
|
383
383
|
try {
|
|
@@ -396,7 +396,7 @@ async function sweepLeftovers(params) {
|
|
|
396
396
|
}
|
|
397
397
|
async function teardownAsync(result) {
|
|
398
398
|
try {
|
|
399
|
-
await result.
|
|
399
|
+
await result.temporaryVault.dispose(result.transport);
|
|
400
400
|
} catch (error) {
|
|
401
401
|
(0, import_log.log)(`[integration-teardown:${result.transportLabel}] Vault cleanup error (non-fatal): ${(0, import_error_to_string.errorToString)(error)}`);
|
|
402
402
|
}
|
|
@@ -412,4 +412,4 @@ async function teardownAsync(result) {
|
|
|
412
412
|
coreTeardown,
|
|
413
413
|
resolveIntegrationTransportOptions
|
|
414
414
|
});
|
|
415
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgam9pblxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MsIHsgbG9hZEVudkZpbGUgfSBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBFbmFibGVQbHVnaW5SZXN1bHQgfSBmcm9tICcuL2VuYWJsZS1wbHVnaW4uY2pzJztcbmltcG9ydCB0eXBlIHsgU2V0dXBMb2NrIH0gZnJvbSAnLi9zZXR1cC1sb2NrLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7XG4gIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gIGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2Vcbn0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLmNqcyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi9lcnJvci10by1zdHJpbmcuY2pzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyxcbiAgcmVzb2x2ZVNob3VsZFN3ZWVwTGVmdG92ZXJzLFxuICBzd2VlcEhvc3RMZWZ0b3ZlcnNcbn0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZUJhY2tvZmZEZWxheUluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlDb3VudCxcbiAgcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyxcbiAgc2hvdWxkUmV0cnlQbHVnaW5FbmFibGVcbn0gZnJvbSAnLi9wbHVnaW4tZW5hYmxlLXJldHJ5LmNqcyc7XG5pbXBvcnQgeyBhY3F1aXJlU2V0dXBMb2NrIH0gZnJvbSAnLi9zZXR1cC1sb2NrLmNqcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkuY2pzJztcblxuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgRElTVF9ERVYgPSAnZGlzdC9kZXYnO1xuY29uc3QgRElTVF9CVUlMRCA9ICdkaXN0L2J1aWxkJztcbmNvbnN0IE1BSU5fSlMgPSAnbWFpbi5qcyc7XG5jb25zdCBPQlNJRElBTl9DT05GSUdfRElSID0gJy5vYnNpZGlhbic7XG5jb25zdCBQTFVHSU5TX0RJUiA9ICdwbHVnaW5zJztcbmNvbnN0IENPTU1VTklUWV9QTFVHSU5TX0pTT04gPSAnY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5jb25zdCBBUFBfSlNPTiA9ICdhcHAuanNvbic7XG5jb25zdCBBUFBfSlNPTl9JTkRFTlQgPSAyO1xuXG4vKipcbiAqIFRyYWNrcyBzZXR1cHMgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBoYXZlbid0IGJlZW4gdG9ybiBkb3duIHlldC5cbiAqIFVzZWQgYnkgdGhlIGBiZWZvcmVFeGl0YCBoYW5kbGVyIHRvIGNsZWFuIHVwIHdoZW4gYSB0ZXN0IHJ1bm5lciBleGl0c1xuICogd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIChlLmcuLCB3aGVuIG9uZSBwcm9qZWN0J3Mgc2V0dXAgZmFpbHMgYW5kIHRoZVxuICogcnVubmVyIGFib3J0cyBiZWZvcmUgdGVhcmluZyBkb3duIGFscmVhZHktaW5pdGlhbGl6ZWQgcHJvamVjdHMpLlxuICovXG5jb25zdCBhY3RpdmVTZXR1cHMgPSBuZXcgU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmNvbnN0IGRpc3Bvc2VkUmVzdWx0cyA9IG5ldyBXZWFrU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmxldCBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBjcm9zcy1wcm9jZXNzIHNldHVwIGxvY2sgaGVsZCBieSBlYWNoIGFjdGl2ZSBzZXR1cC4gUmVsZWFzZWQgd2hlbiB0aGVcbiAqIHNldHVwIGlzIHRvcm4gZG93biAob3IgYnkgdGhlIHByb2Nlc3MgY2xlYW51cCBoYW5kbGVycyksIGFsbG93aW5nIGEgY29tcGV0aW5nXG4gKiBydW4gdG8gcHJvY2VlZC4gU2VlIHtAbGluayBhY3F1aXJlU2V0dXBMb2NrfS5cbiAqL1xuY29uc3Qgc2V0dXBMb2NrcyA9IG5ldyBNYXA8Q29yZVNldHVwUmVzdWx0LCBTZXR1cExvY2s+KCk7XG5cbmNvbnN0IEFORFJPSURfTE9DS19TQ09QRSA9ICdhbmRyb2lkJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogQ29tbXVuaXR5LXBsdWdpbiBpZHMgdG8gZW5hYmxlIGluIHRoZSB2YXVsdCAqKmluIGFkZGl0aW9uIHRvKiogdGhlXG4gICAqIHBsdWdpbi11bmRlci10ZXN0LCBhZnRlciBpdCBpcyBlbmFibGVkLiBFYWNoIGlkJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlXG4gICAqIHByZXNlbnQgdW5kZXIgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBcdTIwMTQgc2VlZCB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfVxuICAgKiAoZS5nLiB3aXRoIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCkuIEVuYWJsaW5nIGdvZXMgdGhyb3VnaCB0aGUgc2FtZVxuICAgKiByZXRyeS9sb2FkLXZlcmlmeSBwYXRoIGFzIHRoZSBwbHVnaW4tdW5kZXItdGVzdC4gQ29tcG9zZXMgd2l0aFxuICAgKiBgaW5zdGFsbFBsdWdpbjogZmFsc2VgIChlbmFibGUgZXh0cmFzIGludG8gYW4gb3RoZXJ3aXNlIHBsdWdpbi1sZXNzIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNvbW11bml0eVBsdWdpbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbnN0YWxsIGFuZCBlbmFibGUgdGhlIGJ1aWx0IHBsdWdpbiBpbiB0aGUgdGVtcCB2YXVsdC4gRGVmYXVsdHNcbiAgICogdG8gYHRydWVgLiBTZXQgdG8gYGZhbHNlYCBmb3IgYSAqKm5vbi1wbHVnaW4qKiBjb25zdW1lciAoZS5nLiBhIHR5cGluZ3NcbiAgICogY3Jhd2xlcikgdGhhdCBvbmx5IG5lZWRzIGEgcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgdG8gYGV2YWxJbk9ic2lkaWFuYFxuICAgKiBhZ2FpbnN0OiB0aGUgcGx1Z2luIGBkaXN0YC9gbWFuaWZlc3QuanNvbmAgcmVhZCwgdGhlIGNvcHkgaW50b1xuICAgKiBgLm9ic2lkaWFuL3BsdWdpbnNgLCB0aGUgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHdyaXRlLCBhbmQgdGhlIGVuYWJsZSBzdGVwXG4gICAqIGFyZSBhbGwgc2tpcHBlZCwgd2hpbGUgdGhlIHRyYW5zcG9ydCwgdGVtcCB2YXVsdCwgcmVnaXN0cmF0aW9uLCBhbmRcbiAgICogd29ya2VyLWZhY2luZyBlbmRwb2ludCBwcm92aXNpb25pbmcgc3RpbGwgcnVuIHVuY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxQbHVnaW4/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBGaWxlcyBhbmQgZm9sZGVycyB0byB3cml0ZSBpbnRvIHRoZSB2YXVsdCAqKmJlZm9yZSoqIE9ic2lkaWFuIG9wZW5zIGl0LCBzb1xuICAgKiBpdHMgc3RhcnR1cCBzY2FuIGluZGV4ZXMgdGhlbSBpbiBvbmUgcGFzcyAoc2VlIHtAbGluayBUZW1wVmF1bHQucG9wdWxhdGV9KS5cbiAgICogVXNlIHRoaXMgZm9yIGxhcmdlIGZpeHR1cmVzIFx1MjAxNCB3cml0aW5nIHRob3VzYW5kcyBvZiBub3RlcyBhZnRlciBvcGVuIGFuZFxuICAgKiBmb3JjaW5nIGEgcmUtc2NhbiBpcyBmYXIgc2xvd2VyIGFuZCBsZXNzIHJlbGlhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9wdWxhdGU/OiBQb3B1bGF0ZUZpbGVzUGFyYW1zIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUcmFuc3BvcnQgb3B0aW9ucy4gV2hlbiBvbWl0dGVkLCB1c2VzIGFuIG9mZi1zY3JlZW4gb3duZWQgZGVza3RvcCBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkge0BsaW5rIGNvcmVTZXR1cH0sIHVzZWQgYnkgZnJhbWV3b3JrIGFkYXB0ZXJzXG4gKiB0byBwYXNzIGNvbnRleHQgdG8gdGVzdCB3b3JrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFJlc3VsdCB7XG4gIC8qKiBUaGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLiAqL1xuICByZWFkb25seSB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSB1c2VkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKiogU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcyAoZS5nLiBgXCJvYnNpZGlhbi1jZHBcImApLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IG9wdGlvbnMgdGhhdCB3ZXJlIHJlc29sdmVkLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlQbHVnaW5JbnRvVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyB7XG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcHJvamVjdCByb290IHRvIHJlc29sdmUgdGhlIGJ1aWx0IHBsdWdpbiBmcm9tLiAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdGVtcCB2YXVsdCB0byBjb3B5IHRoZSBwbHVnaW4gaW50by4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgKHVzZWQgZm9yIHRoZSBtb2JpbGUvZGVza3RvcC1vbmx5IGNvbXBhdGliaWxpdHkgY2hlY2spLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnN9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zUGFyYW1zIHtcbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBpZHMgb2YgdGhlIGV4dHJhIGNvbW11bml0eSBwbHVnaW5zIHRvIGVuYWJsZSAodGhlaXIgYmluYXJpZXMgbXVzdCBhbHJlYWR5IGJlIGluIHRoZSB2YXVsdCkuICovXG4gIHJlYWRvbmx5IHBsdWdpbklkczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIFRoZSB0ZW1wIHZhdWx0IHRoZSBwbHVnaW5zIHdlcmUgc2VlZGVkIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IHRvIGV2YWx1YXRlIGFnYWluc3QuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luSW5WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBFbmFibGVQbHVnaW5JblZhdWx0UGFyYW1zIHtcbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKiogVGhlIHRlbXAgdmF1bHQgdGhlIHBsdWdpbiB3YXMgY29waWVkIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IHRvIGV2YWx1YXRlIGFnYWluc3QuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3dlZXBMZWZ0b3ZlcnN9LlxuICovXG5pbnRlcmZhY2UgU3dlZXBMZWZ0b3ZlcnNQYXJhbXMge1xuICAvKiogRGlyZWN0b3J5IG5hbWVzIHRvIGtlZXAgcmVnYXJkbGVzcyBvZiBhZ2UgKGUuZy4gYSBjb25jdXJyZW50IHNldHVwJ3MgdmF1bHQpLiAqL1xuICByZWFkb25seSBleGNsdWRlZE5hbWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFdoaWNoIGVuZCBvZiB0aGUgcnVuIGlzIHN3ZWVwaW5nLCBmb3IgdGhlIGxvZyBwcmVmaXguICovXG4gIHJlYWRvbmx5IHBoYXNlOiAnc2V0dXAnIHwgJ3RlYXJkb3duJztcblxuICAvKiogVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zIChzb3VyY2Ugb2YgdGhlIHN3ZWVwIGtub2JzKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgc2V0dXAgbG9naWMuXG4gKlxuICogTG9hZHMgYC5lbnZgIGZyb20gdGhlIHByb2plY3Qgcm9vdCwgY3JlYXRlcyBhIHRyYW5zcG9ydCwgY3JlYXRlcyBhbmQgcmVnaXN0ZXJzXG4gKiBhIHRlbXBvcmFyeSB2YXVsdCB3aXRoIE9ic2lkaWFuLCBhbmQgXHUyMDE0IHVubGVzcyB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLmluc3RhbGxQbHVnaW59XG4gKiBpcyBgZmFsc2VgIFx1MjAxNCBjb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB2YXVsdCBhbmQgZW5hYmxlcyBpdC4gVGhlXG4gKiBwbHVnaW4tbGVzcyBtb2RlIHN0aWxsIGxhdW5jaGVzIHRoZSBvd25lZCBpbnN0YW5jZSBhbmQgcHVibGlzaGVzIGl0c1xuICogd29ya2VyLWZhY2luZyBlbmRwb2ludCwgc28gYSBub24tcGx1Z2luIGNvbnN1bWVyIHJldXNlcyB0aGUgc2FtZSBhdHRhY2ggd2lyaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBTZXR1cCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHNldHVwIHJlc3VsdCBjb250YWluaW5nIHRoZSB0ZW1wIHZhdWx0LCB0cmFuc3BvcnQsIGFuZCByZXNvbHZlZCBvcHRpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVNldHVwKHBhcmFtcz86IENvcmVTZXR1cFBhcmFtcyk6IFByb21pc2U8Q29yZVNldHVwUmVzdWx0PiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnN0IGVudkZpbGVQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJy5lbnYnKTtcbiAgaWYgKGV4aXN0c1N5bmMoZW52RmlsZVBhdGgpKSB7XG4gICAgbG9hZEVudkZpbGUoZW52RmlsZVBhdGgpO1xuICB9XG5cbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IHJlc29sdmVJbnRlZ3JhdGlvblRyYW5zcG9ydE9wdGlvbnMocGFyYW1zPy50cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc3QgbGFiZWwgPSB0cmFuc3BvcnRPcHRpb25zLnR5cGU7XG4gIGNvbnN0IGxvY2tTY29wZSA9IGdldExvY2tTY29wZSh0cmFuc3BvcnRPcHRpb25zKTtcblxuICBsZXQgbG9jazogU2V0dXBMb2NrIHwgdW5kZWZpbmVkO1xuICBpZiAobG9ja1Njb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQWNxdWlyaW5nICcke2xvY2tTY29wZX0nIHNldHVwIGxvY2sgKHNlcmlhbGl6ZXMgYWdhaW5zdCBhbnkgY29uY3VycmVudCBpbnRlZ3JhdGlvbi10ZXN0IHJ1bikuLi5gKTtcbiAgICBsb2NrID0gYXdhaXQgYWNxdWlyZVNldHVwTG9jayh7IGxhYmVsLCBzY29wZTogbG9ja1Njb3BlIH0pO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBsb2NrIGFjcXVpcmVkLmApO1xuICB9XG5cbiAgYXdhaXQgc3dlZXBMZWZ0b3ZlcnMoeyBsYWJlbCwgcGhhc2U6ICdzZXR1cCcsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG5cbiAgbGV0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG4gIGxldCB0ZW1wVmF1bHQ6IFRlbXBWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGluZyB0cmFuc3BvcnQuLi5gKTtcbiAgICB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUHJvamVjdCByb290OiAke3Byb2plY3RSb290fWApO1xuICAgIGNvbnN0IHNob3VsZEluc3RhbGxQbHVnaW4gPSBwYXJhbXM/Lmluc3RhbGxQbHVnaW4gIT09IGZhbHNlO1xuXG4gICAgdGVtcFZhdWx0ID0gbmV3IFRlbXBWYXVsdCgpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGVkIHRlbXAgdmF1bHQ6ICR7dGVtcFZhdWx0LnBhdGh9YCk7XG5cbiAgICBsZXQgcGx1Z2luSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChzaG91bGRJbnN0YWxsUGx1Z2luKSB7XG4gICAgICBwbHVnaW5JZCA9IGF3YWl0IGNvcHlQbHVnaW5JbnRvVmF1bHQoeyBsYWJlbCwgcHJvamVjdFJvb3QsIHRlbXBWYXVsdCwgdHJhbnNwb3J0IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2tpcHBpbmcgcGx1Z2luIGluc3RhbGwgKGluc3RhbGxQbHVnaW46IGZhbHNlKSBcdTIwMTQgcmVnaXN0ZXJpbmcgYW4gZW1wdHkgdmF1bHQuYCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcz8ucG9wdWxhdGUpIHtcbiAgICAgIGNvbnN0IGVudHJ5Q291bnQgPSBPYmplY3Qua2V5cyhwYXJhbXMucG9wdWxhdGUpLmxlbmd0aDtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQb3B1bGF0aW5nIHZhdWx0IHdpdGggJHtTdHJpbmcoZW50cnlDb3VudCl9IGVudHJpZXMgYmVmb3JlIG9wZW4uLi5gKTtcbiAgICAgIHRlbXBWYXVsdC5wb3B1bGF0ZShwYXJhbXMucG9wdWxhdGUpO1xuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZUFsd2F5c1VwZGF0ZUxpbmtzKHRlbXBWYXVsdCwgbGFiZWwpO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFN5bmNpbmcgdmF1bHQgdG8gZGV2aWNlLi4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBSZWdpc3RlcmluZyB2YXVsdC4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5yZWdpc3Rlcih0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCByZWdpc3RlcmVkLmApO1xuXG4gICAgaWYgKHBsdWdpbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IGVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2lucyh7XG4gICAgICBsYWJlbCxcbiAgICAgIHBsdWdpbklkczogcGFyYW1zPy5lbmFibGVDb21tdW5pdHlQbHVnaW5zID8/IFtdLFxuICAgICAgdGVtcFZhdWx0LFxuICAgICAgdHJhbnNwb3J0LFxuICAgICAgdHJhbnNwb3J0T3B0aW9uc1xuICAgIH0pO1xuXG4gICAgY29uc3QgYXVnbWVudGVkT3B0aW9ucyA9IGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMsIHRyYW5zcG9ydCk7XG4gICAgY29uc3QgcmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQgPSB7IHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRMYWJlbDogbGFiZWwsIHRyYW5zcG9ydE9wdGlvbnM6IGF1Z21lbnRlZE9wdGlvbnMgfTtcbiAgICBhY3RpdmVTZXR1cHMuYWRkKHJlc3VsdCk7XG4gICAgaWYgKGxvY2spIHtcbiAgICAgIHNldHVwTG9ja3Muc2V0KHJlc3VsdCwgbG9jayk7XG4gICAgfVxuICAgIHJlZ2lzdGVyUHJvY2Vzc0NsZWFudXBIYW5kbGVyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgZmFpbGVkLCBjbGVhbmluZyB1cC4uLmApO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGVtcFZhdWx0ICYmIHRyYW5zcG9ydCkge1xuICAgICAgICBhd2FpdCB0ZW1wVmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdHJhbnNwb3J0Py5kaXNwb3NlPy4oKTtcbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyBhIHdhaXRpbmcgcnVuIGNhbiBwcm9jZWVkIGV2ZW4gdGhvdWdoIHRoaXMgcnVuIGZhaWxlZC5cbiAgICBsb2NrPy5yZWxlYXNlKCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gTk9URTogSWYgdGhlIHRlc3QgcnVubmVyIHJlcG9ydHMgXCJObyB0ZXN0IGZpbGVzIGZvdW5kXCIsIGlnbm9yZSBpdCBcdTIwMTQgaXQgaXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgc2V0dXAgZmFpbHVyZSBhYm92ZS5gKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgdGVhcmRvd24gbG9naWMuXG4gKlxuICogRGlzcG9zZXMgb2YgdGhlIHRlbXBvcmFyeSB2YXVsdCBhbmQgdHJhbnNwb3J0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IGZyb20ge0BsaW5rIGNvcmVTZXR1cH0uIFdoZW4gYHVuZGVmaW5lZGAsIGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVUZWFyZG93bihyZXN1bHQ/OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXN1bHQgfHwgZGlzcG9zZWRSZXN1bHRzLmhhcyhyZXN1bHQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpc3Bvc2VkUmVzdWx0cy5hZGQocmVzdWx0KTtcblxuICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRlYXJpbmcgZG93bi4uLmApO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVhcmRvd25Bc3luYyhyZXN1bHQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gQ2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmVTZXR1cHMuZGVsZXRlKHJlc3VsdCk7XG4gICAgcmVsZWFzZVNldHVwTG9jayhyZXN1bHQpO1xuICB9XG5cbiAgYXdhaXQgc3dlZXBMZWZ0b3ZlcnMoe1xuICAgIGV4Y2x1ZGVkTmFtZXM6IFsuLi5hY3RpdmVTZXR1cHNdLm1hcCgoYWN0aXZlU2V0dXApID0+IGJhc2VuYW1lKGFjdGl2ZVNldHVwLnRlbXBWYXVsdC5wYXRoKSksXG4gICAgbGFiZWw6IHJlc3VsdC50cmFuc3BvcnRMYWJlbCxcbiAgICBwaGFzZTogJ3RlYXJkb3duJyxcbiAgICB0cmFuc3BvcnRPcHRpb25zOiByZXN1bHQudHJhbnNwb3J0T3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0cmFuc3BvcnQgb3B0aW9ucyBmb3IgYW4gaW50ZWdyYXRpb24gcnVuLlxuICpcbiAqIERlc2t0b3AgbGF1bmNoZXMgYXJlIG5vcm1hbGx5IHZpc2libGUsIGJ1dCB0ZXN0IHNldHVwIGV4cGxpY2l0bHkga2VlcHMgaXRzXG4gKiBvd25lZCBpbnN0YW5jZSBvZmYtc2NyZWVuIHNvIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgZGV2ZWxvcGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uc3VtZXItcHJvdmlkZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBPcHRpb25zIHdpdGggdGhlIGRlc2t0b3AgaW50ZWdyYXRpb24gdmlzaWJpbGl0eSBkZWZhdWx0IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJykge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyBmYWxzZSxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggcmV1c2UgaW5mbyBzbyB0ZXN0IHdvcmtlcnMgY2FuIHJlYXR0YWNoIHRvIHRoZVxuICogaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlaXIgb3duOlxuICpcbiAqIC0gKipBcHBpdW0qKiBcdTIwMTQgaW5qZWN0cyB0aGUgZXN0YWJsaXNoZWQgYHNlc3Npb25JZGAvYGRldmljZUlkYC5cbiAqIC0gKipPd25lZCBkZXNrdG9wIENEUCoqIFx1MjAxNCBpbmplY3RzIHRoZSBvd25lZCBpbnN0YW5jZSdzIGBob3N0YC9gcG9ydGAgKGNob3NlblxuICogICBhdCBsYXVuY2gpIHBsdXMgdGhlIGludGVybmFsIGBpc0hhcm5lc3NPd25lZEluc3RhbmNlYCBmbGFnLCBzbyBlYWNoIHdvcmtlclxuICogICAqKmF0dGFjaGVzKiogdG8gdGhhdCBpbnN0YW5jZSBvdmVyIENEUCByYXRoZXIgdGhhbiBsYXVuY2hpbmcgKGFuZCBuZXZlclxuICogICByZWdpc3RlcmluZykgaXRzIG93biBcdTIwMTQgdGhlIGJ1ZyB0aGF0IG90aGVyd2lzZSBsZWF2ZXMgYSB3b3JrZXIncyB0cmFuc3BvcnRcbiAqICAgd2l0aCBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICBpZiAoKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke0RFRkFVTFRfVFJBTlNQT1JUX1RZUEV9XSBPd25lZCBpbnN0YW5jZSByZXVzZSBpbmZvOiBob3N0PSR7ZW5kcG9pbnQuaG9zdH0sIHBvcnQ9JHtTdHJpbmcoZW5kcG9pbnQucG9ydCl9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBob3N0OiBlbmRwb2ludC5ob3N0LFxuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0cnVlLFxuICAgICAgICBwb3J0OiBlbmRwb2ludC5wb3J0LFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB0ZW1wIHZhdWx0IGFuZCBtYXJrcyBpdCBhcyBhIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogUmVhZHMgYG1hbmlmZXN0Lmpzb25gIGZyb20gdGhlIG5ld2VyIG9mIGBkaXN0L2RldmAvYGRpc3QvYnVpbGRgLCByZWplY3RzIGFcbiAqIGRlc2t0b3Atb25seSBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWxkIGludG9cbiAqIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+YCwgYW5kIHdyaXRlcyBgLm9ic2lkaWFuL2NvbW11bml0eS1wbHVnaW5zLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29weSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHBsdWdpbiBpZCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5UGx1Z2luSW50b1ZhdWx0KHBhcmFtczogQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHByb2plY3RSb290LCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICByZXR1cm4gcGx1Z2luSWQ7XG59XG5cbi8qKlxuICogRW5hYmxlcyBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyAoYmV5b25kIHRoZSBwbHVnaW4tdW5kZXItdGVzdCkgaW4gdGhlIHJlZ2lzdGVyZWQgdmF1bHQsIGVhY2ggdGhyb3VnaCB0aGVcbiAqIHNhbWUge0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9IHBhdGguIEVhY2ggcGx1Z2luJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlIHByZXNlbnQgaW4gdGhlIHZhdWx0IChzZWVkXG4gKiB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfSkuIEEgbm8tb3Agd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVuYWJsZSBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnMocGFyYW1zOiBFbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWRzLCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IHBsdWdpbklkIG9mIHBsdWdpbklkcykge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBleHRyYSBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcGx1Z2luIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0IGFuZCB2ZXJpZmllcyBpdCBsb2FkZWQuXG4gKlxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luKClgIHdyYXBzIGBsb2FkUGx1Z2luKClgIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3NcbiAqIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZSwgc28ge0BsaW5rIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmV9IG1vbmtleS1wYXRjaGVzXG4gKiBgbG9hZFBsdWdpbigpYCB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luSW5WYXVsdChwYXJhbXM6IEVuYWJsZVBsdWdpbkluVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG5cbiAgLypcbiAgICogT3BlbiBhIG5hdGl2ZSBjb25zb2xlLWNhcHR1cmUgd2luZG93IChMYXllciAyLCBBbmRyb2lkIG9ubHkpIGFyb3VuZCB0aGVcbiAgICogZW5hYmxlIHNvIHRoYXQgaWYgT2JzaWRpYW4gc3dhbGxvd3MgdGhlIGxvYWQgZXJyb3IgYmVmb3JlIHRoZSBtb25rZXktcGF0Y2hcbiAgICogYW5kIHRoZSByZW5kZXJlciBjb25zb2xlIChMYXllciAxKSBjYW1lIHVwIGVtcHR5LCB3ZSBjYW4gc3RpbGwgcmVjb3ZlciB0aGVcbiAgICogcmVhbCBjYXVzZSBmcm9tIGBhZGIgbG9nY2F0YC4gTm8tb3AgKHVuZGVmaW5lZCkgb24gdHJhbnNwb3J0cyB0aGF0IGRvbid0XG4gICAqIGltcGxlbWVudCBpdCAoZS5nLiBkZXNrdG9wKS5cbiAgICovXG4gIGNvbnN0IGNhcHR1cmVIYW5kbGUgPSBhd2FpdCB0cmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZT8uKCk7XG5cbiAgLypcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHdlIGVuYWJsZSB0aGUgcGx1Z2luLCBzbyBhIHNpbmdsZS1zaG90IGVuYWJsZSByYWNlcyB0aGUgbG9hZCBhbmQgbG9zZXNcbiAgICogKHRoZSBwbHVnaW4gbGFuZHMgaW4gdGhlIGVuYWJsZWQgc2V0IGJ1dCBuZXZlciBsb2FkcykuIFJldHJ5IHRoZSBlbmFibGUgK1xuICAgKiBsb2FkLXZlcmlmaWNhdGlvbiBhIGZldyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYsIHdoaWNoIHJlY292ZXJzIHRoZVxuICAgKiB0cmFuc2llbnQgcmFjZS4gQSBjYXB0dXJlZCBsb2FkIGVycm9yIChgcmVhbEVycm9yYCkgaXMgYSBkZXRlcm1pbmlzdGljIGJ1ZyBcdTIwMTRcbiAgICogcmV0cnlpbmcgY2Fubm90IGZpeCBpdCwgc28gd2UgZmFpbCBmYXN0LiBOb24tQW5kcm9pZCB0cmFuc3BvcnRzIHJlc29sdmUgdG9cbiAgICogdGhlIHNhbWUgZGVmYXVsdHMgYnV0IG5ldmVyIGVudGVyIHRoZSByZXRyeSBwYXRoOiB0aGVpciBsb2FkIGVpdGhlciBzdWNjZWVkc1xuICAgKiBvbiB0aGUgZmlyc3QgYXR0ZW1wdCBvciB0aHJvd3MgYSBjYXB0dXJlZCBlcnJvci5cbiAgICovXG4gIGNvbnN0IG1heEF0dGVtcHRzID0gMSArIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50KHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBiYXNlRGVsYXlJbk1pbGxpc2Vjb25kcyA9IHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHModHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGxldCByZXN1bHQ6IEVuYWJsZVBsdWdpblJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgICB0cmFuc3BvcnQsXG4gICAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGV2YWwgaXRzZWxmIHRocmV3IChlLmcuIHRoZSBXZWJWaWV3IGNvbnRleHQgd2FzIGxvc3QgbWlkLWV4ZWN1dGlvbiBvblxuICAgICAgICogYSBjaHVybmluZyBndWVzdCkgXHUyMDE0IGEgdHJhbnNwb3J0LWxldmVsIHRyYW5zaWVudC4gUmV0cnkgaWYgYXR0ZW1wdHMgcmVtYWluLlxuICAgICAgICovXG4gICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsZSBhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhtYXhBdHRlbXB0cyl9IHRocmV3IGBcbiAgICAgICAgICAgICsgYCgke2Vycm9yVG9TdHJpbmcoZXJyb3IpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGBlcnJvck1lc3NhZ2VgIGlzIHRoZSByZWFsIHRocm93IHNlZW4gYnkgdGhlIG1vbmtleS1wYXRjaDtcbiAgICAgKiBgcmVuZGVyZXJDb25zb2xlRXJyb3JzYCAoTGF5ZXIgMSkgaXMgdGhlIHJlYWwgY2F1c2UgY29uc29sZS1sb2dnZWQgaW4gdGhlIHJlbmRlcmVyLlxuICAgICAqL1xuICAgIGNvbnN0IHJlYWxFcnJvciA9IHJlc3VsdC5lcnJvck1lc3NhZ2UgPz8gcmVzdWx0LnJlbmRlcmVyQ29uc29sZUVycm9ycztcblxuICAgIGlmIChyZXN1bHQuaXNMb2FkZWQgJiYgIXJlYWxFcnJvcikge1xuICAgICAgY29uc3QgYXR0ZW1wdFN1ZmZpeCA9IGF0dGVtcHQgPiAxID8gYCAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSlgIDogJyc7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseSR7YXR0ZW1wdFN1ZmZpeH0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBjYXB0dXJlZCBsb2FkIGVycm9yIGlzIGRldGVybWluaXN0aWMgXHUyMDE0IGZhaWwgZmFzdCByYXRoZXIgdGhhbiByZXRyeS5cbiAgICBpZiAoIXNob3VsZFJldHJ5UGx1Z2luRW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtyZWFsRXJyb3IgPz8gZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZShwbHVnaW5JZCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNpZW50IGNvbGQtYm9vdCByYWNlIChlbmFibGVkIGJ1dCBub3QgbG9hZGVkLCBubyBjYXVzZSBjYXB0dXJlZCk6IHJldHJ5LlxuICAgIGlmIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIGJ1dCBub3QgbG9hZGVkIGBcbiAgICAgICAgICArIGAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIEV4aGF1c3RlZCBldmVyeSBhdHRlbXB0IG9uIHRoZSB0cmFuc2llbnQgc2lnbmF0dXJlOiBjb21wb3NlIHRoZSBtb3N0XG4gICAqIHNwZWNpZmljIGRldGFpbCBhdmFpbGFibGUgKGBhZGIgbG9nY2F0YCB0YWlsIG9uIEFuZHJvaWQsIGVsc2UgdGhlIGdlbmVyaWNcbiAgICogbWVzc2FnZSkgXHUyMDE0IHVuY2hhbmdlZCBmcm9tIHRoZSBwcmUtcmV0cnkgc2luZ2xlLXNob3QgZmFpbHVyZS5cbiAgICovXG4gIGNvbnN0IGxvZ2NhdFRhaWwgPSBhd2FpdCB0cmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2U/LihjYXB0dXJlSGFuZGxlKTtcbiAgY29uc3QgZGV0YWlsID0gbG9nY2F0VGFpbCA/PyBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlKHBsdWdpbklkKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2RldGFpbH1gKTtcbn1cblxuLyoqXG4gKiBFbmFibGVzIGBhbHdheXNVcGRhdGVMaW5rc2AgaW4gdGhlIG93bmVkIHZhdWx0J3MgYC5vYnNpZGlhbi9hcHAuanNvbmAuXG4gKlxuICogV2l0aG91dCBpdCwgYW55IHJlbmFtZSBvciBtb3ZlIHRoYXQgYWZmZWN0cyBsaW5rcyBtYWtlcyBPYnNpZGlhbidzXG4gKiBgRmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3NgIHBvcCBhbiBpbnRlcmFjdGl2ZSBcIlVwZGF0ZSBsaW5rcz9cIiBjb25maXJtYXRpb24gbW9kYWxcbiAqIChpdCBvbmx5IHNraXBzIHRoZSBtb2RhbCB3aGVuIGBhbHdheXNVcGRhdGVMaW5rc2AgaXMgb24pLiBIZWFkbGVzcyB0aGVyZSBpcyBubyB1c2VyXG4gKiB0byBhbnN3ZXIgaXQsIHNvIHRoZSBQcm9taXNlIG5ldmVyIHJlc29sdmVzIFx1MjAxNCB0aGUgcmVuYW1lJ3MgaW50ZXJuYWxcbiAqIGBGaWxlTWFuYWdlci51cGRhdGVRdWV1ZWAgdGFzayBoYW5ncyBmb3JldmVyLCBhbmQgYmVjYXVzZSB0aGF0IHF1ZXVlIGlzIGEgc2luZ2xldG9uXG4gKiBldmVyeSBzdWJzZXF1ZW50IGByZW5hbWVGaWxlYCBpbiB0aGUgc2hhcmVkIGluc3RhbmNlIGhhbmdzIHRvbyAodGhlIGxvbmctb2JzZXJ2ZWRcbiAqIFwicmVuYW1lIHdhbGxcIikuIEVuYWJsaW5nIHRoZSBzZXR0aW5nIG1ha2VzIHJlbmFtZXMgdXBkYXRlIGxpbmtzIG5vbi1pbnRlcmFjdGl2ZWx5LFxuICogc28gcmVuYW1lLWRyaXZlbiBpbnRlZ3JhdGlvbiB0ZXN0cyBydW4gaW4gaGVhZGxlc3MgbW9kZS5cbiAqXG4gKiBNZXJnZXMgaW50byBhbnkgZXhpc3RpbmcgYGFwcC5qc29uYCAoZS5nLiBvbmUgY2FycmllZCBpbiB2aWEgYHBvcHVsYXRlYCkgc28gb3RoZXJcbiAqIGNvbmZpZyBrZXlzIGFyZSBwcmVzZXJ2ZWQsIGFuZCBydW5zIGJlZm9yZSBgc3luY1RvRGV2aWNlYCBzbyB0aGUgdmFsdWUgcmVhY2hlc1xuICogbW9iaWxlIGRldmljZXMgdG9vLlxuICpcbiAqIEBwYXJhbSB0ZW1wVmF1bHQgLSBUaGUgb3duZWQgdGVtcCB2YXVsdCB0byBjb25maWd1cmUuXG4gKiBAcGFyYW0gbGFiZWwgLSBUaGUgdHJhbnNwb3J0IGxhYmVsLCBmb3IgbG9nZ2luZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQWx3YXlzVXBkYXRlTGlua3ModGVtcFZhdWx0OiBUZW1wVmF1bHQsIGxhYmVsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnRGlyID0gam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUik7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gam9pbihjb25maWdEaXIsIEFQUF9KU09OKTtcbiAgbGV0IGFwcENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgdHJ5IHtcbiAgICBhcHBDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIGV4aXN0aW5nIGFwcC5qc29uIChvciB1bnJlYWRhYmxlKSBcdTIwMTQgc3RhcnQgZnJvbSBhbiBlbXB0eSBjb25maWcuXG4gIH1cbiAgYXBwQ29uZmlnWydhbHdheXNVcGRhdGVMaW5rcyddID0gdHJ1ZTtcbiAgYXdhaXQgbWtkaXIoY29uZmlnRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGFwcEpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShhcHBDb25maWcsIG51bGwsIEFQUF9KU09OX0lOREVOVCkpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxlZCBhbHdheXNVcGRhdGVMaW5rcyBpbiAke0FQUF9KU09OfSAoaGVhZGxlc3MgcmVuYW1lIHN1cHBvcnQpLmApO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXIsICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgc2NvcGUgZm9yIGEgdHJhbnNwb3J0LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vXG4gKiBsb2NrIGlzIG5lZWRlZC5cbiAqXG4gKiBEZXNrdG9wIHJ1bnMgdXNlIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlcyAodGhlaXIgb3duIHVzZXItZGF0YSBkaXJcbiAqIGFuZCBDRFAgcG9ydCksIHNvIHRoZXkgbm8gbG9uZ2VyIGNvbnRlbmQgYW5kIG5lZWQgbm8gbG9jay4gT25seSB0aGUgQW5kcm9pZFxuICogdHJhbnNwb3J0LCB3aGljaCBzaGFyZXMgdGhlIHNpbmdsZSBlbXVsYXRvciBhbmQgQXBwaXVtIHNlcnZlciwgbXVzdCBzZXJpYWxpemUuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydE9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbG9jayBzY29wZSBzdHJpbmcsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGxvY2sgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScgPyBBTkRST0lEX0xPQ0tfU0NPUEUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFVuaGFuZGxlZCByZWplY3Rpb24gZGV0ZWN0ZWQuIFRlYXJpbmcgZG93biAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IGFjdGl2ZSBzZXR1cChzKS4uLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICBjb3JlVGVhcmRvd24ocmVzdWx0KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBSZWplY3Rpb24gY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJtU3luYyhyZXN1bHQudGVtcFZhdWx0LnBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB2YXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcmVsZWFzZVNldHVwTG9jayhyZXN1bHQpO1xuICAgIH1cbiAgICBhY3RpdmVTZXR1cHMuY2xlYXIoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYW5kIGZvcmdldHMgdGhlIHNldHVwIGxvY2sgYXNzb2NpYXRlZCB3aXRoIGEgcmVzdWx0LCBpZiBhbnkuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBzZXR1cCByZXN1bHQgd2hvc2UgbG9jayBzaG91bGQgYmUgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VTZXR1cExvY2socmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiB2b2lkIHtcbiAgY29uc3QgbG9jayA9IHNldHVwTG9ja3MuZ2V0KHJlc3VsdCk7XG4gIGlmIChsb2NrKSB7XG4gICAgbG9jay5yZWxlYXNlKCk7XG4gICAgc2V0dXBMb2Nrcy5kZWxldGUocmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBob3N0LXNpZGUgdGVtcCBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICpcbiAqIFJ1bnMgYXQgYm90aCBlbmRzIG9mIGEgcnVuOiBhdCBzZXR1cCBpdCBoYXBwZW5zICoqYmVmb3JlKiogdGhlIHRyYW5zcG9ydCBpc1xuICogY3JlYXRlZCwgc28gaXQgZG9lcyBub3QgZGVwZW5kIG9uIGEgaGVhbHRoeSBPYnNpZGlhbi9XZWJWaWV3IFx1MjAxNCB3aGljaCBpc1xuICogZXhhY3RseSB3aGF0IGEgZmFpbGVkIHJ1biBubyBsb25nZXIgaGFzLCBhbmQgd2h5IGEgZmFpbGVkIHJ1biBjYW5ub3QgY2xlYW4gdXBcbiAqIGFmdGVyIGl0c2VsZi4gQWdlLWdhdGVkIChzZWUgYGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHNgKSBiZWNhdXNlIGRlc2t0b3BcbiAqIHJ1bnMgYXJlIG5vdCBzZXJpYWxpemVkIGFuZCBldmVyeSBwcm9qZWN0IG9uIHRoZSBtYWNoaW5lIHNoYXJlcyBvbmUgdGVtcFxuICogZGlyZWN0b3J5LiBCZXN0LWVmZm9ydDogYSBzd2VlcCBuZXZlciBmYWlscyB0aGUgcnVuIGl0IGlzIGNsZWFuaW5nIHVwIGZvci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN3ZWVwIHBhcmFtZXRlcnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN3ZWVwTGVmdG92ZXJzKHBhcmFtczogU3dlZXBMZWZ0b3ZlcnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGhhc2UsIHRyYW5zcG9ydE9wdGlvbnMgfSA9IHBhcmFtcztcbiAgaWYgKCFyZXNvbHZlU2hvdWxkU3dlZXBMZWZ0b3ZlcnModHJhbnNwb3J0T3B0aW9ucykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN3ZWVwSG9zdExlZnRvdmVycyh7XG4gICAgICBleGNsdWRlZE5hbWVzOiBwYXJhbXMuZXhjbHVkZWROYW1lcyxcbiAgICAgIG1heEFnZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyh0cmFuc3BvcnRPcHRpb25zKVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQucmVtb3ZlZENvdW50ID4gMCB8fCByZXN1bHQuZmFpbGVkQ291bnQgPiAwKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbaW50ZWdyYXRpb24tJHtwaGFzZX06JHtsYWJlbH1dIFN3ZXB0ICR7U3RyaW5nKHJlc3VsdC5yZW1vdmVkQ291bnQpfSBsZWZ0b3ZlciB0ZW1wIGRpcmVjdG9yKGllcykgYFxuICAgICAgICAgICsgYGZyb20gZWFybGllciBydW5zICgke1N0cmluZyhyZXN1bHQuZmFpbGVkQ291bnQpfSBzdGlsbCBpbiB1c2UpLmBcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLSR7cGhhc2V9OiR7bGFiZWx9XSBMZWZ0b3ZlciBzd2VlcCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhc3luYyB0ZWFyZG93biB3b3JrICh2YXVsdCBkaXNwb3NhbCArIHRyYW5zcG9ydCBkaXNwb3NhbCkuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBzZXR1cCByZXN1bHQgdG8gdGVhciBkb3duLlxuICovXG5hc3luYyBmdW5jdGlvbiB0ZWFyZG93bkFzeW5jKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRlbXBWYXVsdC5kaXNwb3NlKHJlc3VsdC50cmFuc3BvcnQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxxQkFHTztBQUNQLHNCQU1PO0FBQ1AsdUJBR087QUFDUCwwQkFBcUM7QUFDckMsSUFBQUEsbUJBQW9DO0FBUXBDLDJCQUdPO0FBQ1AsNkJBQThCO0FBQzlCLDhCQUErQjtBQUMvQiw4QkFJTztBQUNQLGlCQUFvQjtBQUNwQixpQ0FLTztBQUNQLHdCQUFpQztBQUNqQyx3QkFBMEI7QUFDMUIsOEJBQWdDO0FBQ2hDLG1DQUFvQztBQUNwQywrQkFBMkM7QUFFM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sYUFBYTtBQUNuQixNQUFNLFVBQVU7QUFDaEIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sV0FBVztBQUNqQixNQUFNLGtCQUFrQjtBQVF4QixNQUFNLGVBQWUsb0JBQUksSUFBcUI7QUFDOUMsTUFBTSxrQkFBa0Isb0JBQUksUUFBeUI7QUFDckQsSUFBSSw2QkFBNkI7QUFPakMsTUFBTSxhQUFhLG9CQUFJLElBQWdDO0FBRXZELE1BQU0scUJBQXFCO0FBK0kzQixlQUFzQixVQUFVLFFBQW9EO0FBQ2xGLFFBQU0sY0FBYyxnQkFBZ0I7QUFDcEMsUUFBTSxrQkFBYyx1QkFBSyxhQUFhLE1BQU07QUFDNUMsVUFBSSwyQkFBVyxXQUFXLEdBQUc7QUFDM0IseUNBQVksV0FBVztBQUFBLEVBQ3pCO0FBRUEsUUFBTSxtQkFBbUIsbUNBQW1DLFFBQVEsZ0JBQWdCO0FBQ3BGLFFBQU0sUUFBUSxpQkFBaUI7QUFDL0IsUUFBTSxZQUFZLGFBQWEsZ0JBQWdCO0FBRS9DLE1BQUk7QUFDSixNQUFJLGNBQWMsUUFBVztBQUMzQix3QkFBSSxzQkFBc0IsS0FBSyxnQkFBZ0IsU0FBUywwRUFBMEU7QUFDbEksV0FBTyxVQUFNLG9DQUFpQixFQUFFLE9BQU8sT0FBTyxVQUFVLENBQUM7QUFDekQsd0JBQUksc0JBQXNCLEtBQUssd0JBQXdCO0FBQUEsRUFDekQ7QUFFQSxRQUFNLGVBQWUsRUFBRSxPQUFPLE9BQU8sU0FBUyxpQkFBaUIsQ0FBQztBQUVoRSxNQUFJO0FBQ0osTUFBSTtBQUVKLE1BQUk7QUFDRix3QkFBSSxzQkFBc0IsS0FBSyx5QkFBeUI7QUFDeEQsZ0JBQVksVUFBTSxxREFBMkIsZ0JBQWdCO0FBQzdELHdCQUFJLHNCQUFzQixLQUFLLHdCQUF3QixVQUFVLFlBQVksSUFBSSxFQUFFO0FBRW5GLHdCQUFJLHNCQUFzQixLQUFLLG1CQUFtQixXQUFXLEVBQUU7QUFDL0QsVUFBTSxzQkFBc0IsUUFBUSxrQkFBa0I7QUFFdEQsZ0JBQVksSUFBSSw0QkFBVTtBQUMxQix3QkFBSSxzQkFBc0IsS0FBSyx5QkFBeUIsVUFBVSxJQUFJLEVBQUU7QUFFeEUsUUFBSTtBQUVKLFFBQUkscUJBQXFCO0FBQ3ZCLGlCQUFXLE1BQU0sb0JBQW9CLEVBQUUsT0FBTyxhQUFhLFdBQVcsVUFBVSxDQUFDO0FBQUEsSUFDbkYsT0FBTztBQUNMLDBCQUFJLHNCQUFzQixLQUFLLHFGQUFnRjtBQUFBLElBQ2pIO0FBRUEsUUFBSSxRQUFRLFVBQVU7QUFDcEIsWUFBTSxhQUFhLE9BQU8sS0FBSyxPQUFPLFFBQVEsRUFBRTtBQUNoRCwwQkFBSSxzQkFBc0IsS0FBSywyQkFBMkIsT0FBTyxVQUFVLENBQUMseUJBQXlCO0FBQ3JHLGdCQUFVLFNBQVMsT0FBTyxRQUFRO0FBQUEsSUFDcEM7QUFFQSxVQUFNLHdCQUF3QixXQUFXLEtBQUs7QUFFOUMsd0JBQUksc0JBQXNCLEtBQUssOEJBQThCO0FBQzdELFVBQU0sVUFBVSxhQUFhLFNBQVM7QUFDdEMsd0JBQUksc0JBQXNCLEtBQUssd0JBQXdCO0FBQ3ZELFVBQU0sVUFBVSxTQUFTLFNBQVM7QUFDbEMsd0JBQUksc0JBQXNCLEtBQUsscUJBQXFCO0FBRXBELFFBQUksYUFBYSxRQUFXO0FBQzFCLFlBQU0sb0JBQW9CLEVBQUUsT0FBTyxVQUFVLFdBQVcsV0FBVyxpQkFBaUIsQ0FBQztBQUFBLElBQ3ZGO0FBRUEsVUFBTSw0QkFBNEI7QUFBQSxNQUNoQztBQUFBLE1BQ0EsV0FBVyxRQUFRLDBCQUEwQixDQUFDO0FBQUEsTUFDOUM7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQztBQUVELFVBQU0sbUJBQW1CLHdCQUF3QixrQkFBa0IsU0FBUztBQUM1RSxVQUFNLFNBQTBCLEVBQUUsV0FBVyxXQUFXLGdCQUFnQixPQUFPLGtCQUFrQixpQkFBaUI7QUFDbEgsaUJBQWEsSUFBSSxNQUFNO0FBQ3ZCLFFBQUksTUFBTTtBQUNSLGlCQUFXLElBQUksUUFBUSxJQUFJO0FBQUEsSUFDN0I7QUFDQSxrQ0FBOEI7QUFDOUIsV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSxzQkFBc0IsS0FBSyxnQ0FBZ0M7QUFDL0QsUUFBSTtBQUNGLFVBQUksYUFBYSxXQUFXO0FBQzFCLGNBQU0sVUFBVSxRQUFRLFNBQVM7QUFBQSxNQUNuQztBQUFBLElBQ0YsU0FBUyxjQUF1QjtBQUM5QiwwQkFBSSxzQkFBc0IsS0FBSywwQ0FBc0Msc0NBQWMsWUFBWSxDQUFDLEVBQUU7QUFBQSxJQUNwRztBQUNBLFFBQUk7QUFDRixZQUFNLFdBQVcsVUFBVTtBQUFBLElBQzdCLFNBQVMsY0FBdUI7QUFDOUIsMEJBQUksc0JBQXNCLEtBQUssOENBQTBDLHNDQUFjLFlBQVksQ0FBQyxFQUFFO0FBQUEsSUFDeEc7QUFHQSxVQUFNLFFBQVE7QUFFZCx3QkFBSSxzQkFBc0IsS0FBSyw0SEFBdUg7QUFDdEosVUFBTTtBQUFBLEVBQ1I7QUFDRjtBQVNBLGVBQXNCLGFBQWEsUUFBeUM7QUFDMUUsTUFBSSxDQUFDLFVBQVUsZ0JBQWdCLElBQUksTUFBTSxHQUFHO0FBQzFDO0FBQUEsRUFDRjtBQUNBLGtCQUFnQixJQUFJLE1BQU07QUFFMUIsc0JBQUkseUJBQXlCLE9BQU8sY0FBYyxtQkFBbUI7QUFFckUsTUFBSTtBQUNGLFVBQU0sY0FBYyxNQUFNO0FBQUEsRUFDNUIsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSx5QkFBeUIsT0FBTyxjQUFjLG9DQUFnQyxzQ0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQzFHLFVBQUU7QUFDQSxpQkFBYSxPQUFPLE1BQU07QUFDMUIscUJBQWlCLE1BQU07QUFBQSxFQUN6QjtBQUVBLFFBQU0sZUFBZTtBQUFBLElBQ25CLGVBQWUsQ0FBQyxHQUFHLFlBQVksRUFBRSxJQUFJLENBQUMsb0JBQWdCLDJCQUFTLFlBQVksVUFBVSxJQUFJLENBQUM7QUFBQSxJQUMxRixPQUFPLE9BQU87QUFBQSxJQUNkLE9BQU87QUFBQSxJQUNQLGtCQUFrQixPQUFPO0FBQUEsRUFDM0IsQ0FBQztBQUNIO0FBV08sU0FBUyxtQ0FBbUMsU0FBOEQ7QUFDL0csTUFBSSxTQUFTLFNBQVMsMkJBQTJCO0FBQy9DLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUFBLElBQ0wsR0FBRztBQUFBLElBQ0gsc0JBQXNCLFNBQVMsd0JBQXdCO0FBQUEsSUFDdkQsTUFBTTtBQUFBLEVBQ1I7QUFDRjtBQWlCQSxTQUFTLHdCQUNQLFNBQ0EsV0FDc0M7QUFDdEMsTUFBSSxTQUFTLFNBQVMsNkJBQTZCLHFCQUFxQix5Q0FBaUI7QUFDdkYsVUFBTSxjQUFjLFVBQVUsZUFBZTtBQUM3Qyx3QkFBSSxzQkFBc0IsUUFBUSxJQUFJLG1DQUFtQyxZQUFZLFNBQVMsY0FBYyxZQUFZLFFBQVEsRUFBRTtBQUNsSSxXQUFPO0FBQUEsTUFDTCxHQUFHO0FBQUEsTUFDSCxVQUFVLFlBQVk7QUFBQSxNQUN0QixXQUFXLFlBQVk7QUFBQSxJQUN6QjtBQUFBLEVBQ0Y7QUFFQSxPQUFLLFlBQVksVUFBYSxRQUFRLFNBQVMsbUJBQW1CLHFCQUFxQixrREFBcUI7QUFDMUcsVUFBTSxXQUFXLFVBQVUseUJBQXlCO0FBQ3BELFFBQUksVUFBVTtBQUNaLDBCQUFJLHNCQUFzQixzQkFBc0IscUNBQXFDLFNBQVMsSUFBSSxVQUFVLE9BQU8sU0FBUyxJQUFJLENBQUMsRUFBRTtBQUNuSSxhQUFPO0FBQUEsUUFDTCxHQUFHO0FBQUEsUUFDSCxNQUFNLFNBQVM7QUFBQSxRQUNmLHdCQUF3QjtBQUFBLFFBQ3hCLE1BQU0sU0FBUztBQUFBLFFBQ2YsTUFBTTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVlBLGVBQWUsb0JBQW9CLFFBQW9EO0FBQ3JGLFFBQU0sRUFBRSxPQUFPLGFBQWEsV0FBVyxVQUFVLElBQUk7QUFDckQsUUFBTSxXQUFXLE1BQU0sZ0JBQWdCLFdBQVc7QUFDbEQsUUFBTSxlQUFlLEtBQUssTUFBTSxVQUFNLDhCQUFTLHVCQUFLLFVBQVUsZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUN4RixRQUFNLFdBQVcsYUFBYTtBQUU5QixNQUFJLFVBQVUsWUFBWSxhQUFhLGVBQWU7QUFDcEQsVUFBTSxJQUFJO0FBQUEsTUFDUixXQUFXLFFBQVE7QUFBQSxJQUNyQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGFBQVMsdUJBQUssVUFBVSxPQUFPO0FBQ3JDLFFBQU0sWUFBWSxVQUFNLHNCQUFLLE1BQU07QUFDbkMsc0JBQUksc0JBQXNCLEtBQUssV0FBVyxRQUFRLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQywwQkFBMEI7QUFFOUcsUUFBTSxnQkFBWSx1QkFBSyxVQUFVLE1BQU0scUJBQXFCLGFBQWEsUUFBUTtBQUNqRixZQUFNLHVCQUFNLFdBQVcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUMxQyxZQUFNLG9CQUFHLFVBQVUsV0FBVyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2pELFlBQU0sK0JBQVUsdUJBQUssVUFBVSxNQUFNLHFCQUFxQixzQkFBc0IsR0FBRyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU3RyxTQUFPO0FBQ1Q7QUFTQSxlQUFlLDRCQUE0QixRQUEwRDtBQUNuRyxRQUFNLEVBQUUsT0FBTyxXQUFXLFdBQVcsV0FBVyxpQkFBaUIsSUFBSTtBQUNyRSxhQUFXLFlBQVksV0FBVztBQUNoQyx3QkFBSSxzQkFBc0IsS0FBSyxzQ0FBc0MsUUFBUSxNQUFNO0FBQ25GLFVBQU0sb0JBQW9CLEVBQUUsT0FBTyxVQUFVLFdBQVcsV0FBVyxpQkFBaUIsQ0FBQztBQUFBLEVBQ3ZGO0FBQ0Y7QUFXQSxlQUFlLG9CQUFvQixRQUFrRDtBQUNuRixRQUFNLEVBQUUsT0FBTyxVQUFVLFdBQVcsV0FBVyxpQkFBaUIsSUFBSTtBQUNwRSxzQkFBSSxzQkFBc0IsS0FBSyxzQkFBc0IsUUFBUSxNQUFNO0FBU25FLFFBQU0sZ0JBQWdCLE1BQU0sVUFBVSxzQkFBc0I7QUFZNUQsUUFBTSxjQUFjLFFBQUksMERBQThCLGdCQUFnQjtBQUN0RSxRQUFNLDhCQUEwQix3RUFBNEMsZ0JBQWdCO0FBRTVGLFdBQVMsVUFBVSxHQUFHLFdBQVcsYUFBYSxXQUFXO0FBQ3ZELFFBQUk7QUFDSixRQUFJO0FBQ0YsZUFBUyxVQUFNLHdDQUFlO0FBQUEsUUFDNUIsTUFBTSxFQUFFLFNBQVM7QUFBQSxRQUNqQixJQUFJO0FBQUEsUUFDSiwyQkFBMkI7QUFBQSxRQUMzQjtBQUFBLFFBQ0EsV0FBVyxVQUFVO0FBQUEsTUFDdkIsQ0FBQztBQUFBLElBQ0gsU0FBUyxPQUFPO0FBS2QsVUFBSSxVQUFVLGFBQWE7QUFDekIsY0FBTSwwQkFBc0IsOERBQWtDLHlCQUF5QixVQUFVLENBQUM7QUFDbEc7QUFBQSxVQUNFLHNCQUFzQixLQUFLLG9CQUFvQixPQUFPLE9BQU8sQ0FBQyxJQUFJLE9BQU8sV0FBVyxDQUFDLGVBQzdFLHNDQUFjLEtBQUssQ0FBQyxrQkFBa0IsT0FBTyxtQkFBbUIsQ0FBQztBQUFBLFFBQzNFO0FBQ0Esa0JBQU0saUJBQUFDLFlBQU0sbUJBQW1CO0FBQy9CO0FBQUEsTUFDRjtBQUNBLFlBQU07QUFBQSxJQUNSO0FBTUEsVUFBTSxZQUFZLE9BQU8sZ0JBQWdCLE9BQU87QUFFaEQsUUFBSSxPQUFPLFlBQVksQ0FBQyxXQUFXO0FBQ2pDLFlBQU0sZ0JBQWdCLFVBQVUsSUFBSSxhQUFhLE9BQU8sT0FBTyxDQUFDLElBQUksT0FBTyxXQUFXLENBQUMsTUFBTTtBQUM3RiwwQkFBSSxzQkFBc0IsS0FBSyxhQUFhLFFBQVEseUJBQXlCLGFBQWEsR0FBRztBQUM3RjtBQUFBLElBQ0Y7QUFHQSxRQUFJLEtBQUMsb0RBQXdCLE1BQU0sR0FBRztBQUNwQyxZQUFNLElBQUksTUFBTSxXQUFXLFFBQVEscUJBQXFCLGlCQUFhLHlEQUFtQyxRQUFRLENBQUMsRUFBRTtBQUFBLElBQ3JIO0FBR0EsUUFBSSxVQUFVLGFBQWE7QUFDekIsWUFBTSwwQkFBc0IsOERBQWtDLHlCQUF5QixVQUFVLENBQUM7QUFDbEc7QUFBQSxRQUNFLHNCQUFzQixLQUFLLGFBQWEsUUFBUSxxQ0FDaEMsT0FBTyxPQUFPLENBQUMsSUFBSSxPQUFPLFdBQVcsQ0FBQyxrQkFBa0IsT0FBTyxtQkFBbUIsQ0FBQztBQUFBLE1BQ3JHO0FBQ0EsZ0JBQU0saUJBQUFBLFlBQU0sbUJBQW1CO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBT0EsUUFBTSxhQUFhLE1BQU0sVUFBVSwwQkFBMEIsYUFBYTtBQUMxRSxRQUFNLFNBQVMsa0JBQWMseURBQW1DLFFBQVE7QUFDeEUsUUFBTSxJQUFJLE1BQU0sV0FBVyxRQUFRLHFCQUFxQixNQUFNLEVBQUU7QUFDbEU7QUFxQkEsZUFBZSx3QkFBd0IsV0FBc0IsT0FBOEI7QUFDekYsUUFBTSxnQkFBWSx1QkFBSyxVQUFVLE1BQU0sbUJBQW1CO0FBQzFELFFBQU0sa0JBQWMsdUJBQUssV0FBVyxRQUFRO0FBQzVDLE1BQUksWUFBcUMsQ0FBQztBQUMxQyxNQUFJO0FBQ0YsZ0JBQVksS0FBSyxNQUFNLFVBQU0sMEJBQVMsYUFBYSxPQUFPLENBQUM7QUFBQSxFQUM3RCxRQUFRO0FBQUEsRUFFUjtBQUNBLFlBQVUsbUJBQW1CLElBQUk7QUFDakMsWUFBTSx1QkFBTSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDMUMsWUFBTSwyQkFBVSxhQUFhLEtBQUssVUFBVSxXQUFXLE1BQU0sZUFBZSxDQUFDO0FBQzdFLHNCQUFJLHNCQUFzQixLQUFLLGtDQUFrQyxRQUFRLDZCQUE2QjtBQUN4RztBQU9BLFNBQVMsa0JBQTBCO0FBQ2pDLE1BQUksTUFBTSxvQkFBQUMsUUFBUSxJQUFJO0FBR3RCLFNBQU8sTUFBTTtBQUNYLFlBQUksK0JBQVcsdUJBQUssS0FBSyxjQUFjLENBQUMsR0FBRztBQUN6QyxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sYUFBUyx1QkFBSyxLQUFLLElBQUk7QUFDN0IsUUFBSSxXQUFXLEtBQUs7QUFDbEIsWUFBTSxJQUFJLE1BQU0sc0RBQXNEO0FBQUEsSUFDeEU7QUFDQSxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBYUEsU0FBUyxhQUFhLGtCQUE0RTtBQUNoRyxTQUFPLGtCQUFrQixTQUFTLDRCQUE0QixxQkFBcUI7QUFDckY7QUFzQkEsU0FBUyxnQ0FBc0M7QUFDN0MsTUFBSSw0QkFBNEI7QUFDOUI7QUFBQSxFQUNGO0FBQ0EsK0JBQTZCO0FBRTdCLHNCQUFBQSxRQUFRLEdBQUcsY0FBYyxNQUFNO0FBQzdCLFFBQUksYUFBYSxTQUFTLEdBQUc7QUFDM0I7QUFBQSxJQUNGO0FBRUEsd0JBQUksK0NBQStDLE9BQU8sYUFBYSxJQUFJLENBQUMseUNBQXlDO0FBRXJILGVBQVcsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHO0FBQ3RDLG1CQUFhLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBbUI7QUFDN0MsNEJBQUkseUJBQXlCLE9BQU8sY0FBYyw0Q0FBd0Msc0NBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUNsSCxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0YsQ0FBQztBQUVELHNCQUFBQSxRQUFRLEdBQUcsc0JBQXNCLE1BQU07QUFDckMsUUFBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLElBQ0Y7QUFFQSx3QkFBSSxxRUFBcUUsT0FBTyxhQUFhLElBQUksQ0FBQyxxQkFBcUI7QUFDdkgsZUFBVyxVQUFVLENBQUMsR0FBRyxZQUFZLEdBQUc7QUFDdEMsbUJBQWEsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFtQjtBQUM3Qyw0QkFBSSx5QkFBeUIsT0FBTyxjQUFjLDhDQUEwQyxzQ0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3BILENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBRUQsc0JBQUFBLFFBQVEsR0FBRyxRQUFRLE1BQU07QUFDdkIsUUFBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLElBQ0Y7QUFFQSx3QkFBSSx3Q0FBd0MsT0FBTyxhQUFhLElBQUksQ0FBQyxxQkFBcUI7QUFDMUYsZUFBVyxVQUFVLENBQUMsR0FBRyxZQUFZLEdBQUc7QUFDdEMsVUFBSTtBQUNGLGVBQU8sVUFBVSxjQUFjO0FBQUEsTUFDakMsU0FBUyxPQUFnQjtBQUN2Qiw0QkFBSSx5QkFBeUIsT0FBTyxjQUFjLG1EQUErQyxzQ0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3pIO0FBQ0EsVUFBSTtBQUNGLG1DQUFPLE9BQU8sVUFBVSxNQUFNLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQUEsTUFDaEUsU0FBUyxPQUFnQjtBQUN2Qiw0QkFBSSx5QkFBeUIsT0FBTyxjQUFjLCtDQUEyQyxzQ0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3JIO0FBQ0EsdUJBQWlCLE1BQU07QUFBQSxJQUN6QjtBQUNBLGlCQUFhLE1BQU07QUFBQSxFQUNyQixDQUFDO0FBQ0g7QUFPQSxTQUFTLGlCQUFpQixRQUErQjtBQUN2RCxRQUFNLE9BQU8sV0FBVyxJQUFJLE1BQU07QUFDbEMsTUFBSSxNQUFNO0FBQ1IsU0FBSyxRQUFRO0FBQ2IsZUFBVyxPQUFPLE1BQU07QUFBQSxFQUMxQjtBQUNGO0FBV0EsZUFBZSxnQkFBZ0IsYUFBc0M7QUFDbkUsUUFBTSxjQUFVLHVCQUFLLGFBQWEsUUFBUTtBQUMxQyxRQUFNLGdCQUFZLHVCQUFLLGFBQWEsVUFBVTtBQUM5QyxRQUFNLGdCQUFZLHVCQUFLLFNBQVMsT0FBTztBQUN2QyxRQUFNLGtCQUFjLHVCQUFLLFdBQVcsT0FBTztBQUMzQyxRQUFNLGNBQVUsMkJBQVcsU0FBUyxJQUFJLFVBQU0sc0JBQUssU0FBUyxJQUFJO0FBQ2hFLFFBQU0sZ0JBQVksMkJBQVcsV0FBVyxJQUFJLFVBQU0sc0JBQUssV0FBVyxJQUFJO0FBRXRFLE1BQUksV0FBVyxXQUFXO0FBQ3hCLFdBQU8sUUFBUSxRQUFRLFVBQVUsUUFBUSxVQUFVO0FBQUEsRUFDckQ7QUFFQSxNQUFJLFNBQVM7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksV0FBVztBQUNiLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0sNkRBQTZEO0FBQy9FO0FBY0EsZUFBZSxlQUFlLFFBQTZDO0FBQ3pFLFFBQU0sRUFBRSxPQUFPLE9BQU8saUJBQWlCLElBQUk7QUFDM0MsTUFBSSxLQUFDLHFEQUE0QixnQkFBZ0IsR0FBRztBQUNsRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsVUFBTSxTQUFTLFVBQU0sNENBQW1CO0FBQUEsTUFDdEMsZUFBZSxPQUFPO0FBQUEsTUFDdEIsMEJBQXNCLDZEQUFvQyxnQkFBZ0I7QUFBQSxJQUM1RSxDQUFDO0FBQ0QsUUFBSSxPQUFPLGVBQWUsS0FBSyxPQUFPLGNBQWMsR0FBRztBQUNyRDtBQUFBLFFBQ0UsZ0JBQWdCLEtBQUssSUFBSSxLQUFLLFdBQVcsT0FBTyxPQUFPLFlBQVksQ0FBQyxtREFDMUMsT0FBTyxPQUFPLFdBQVcsQ0FBQztBQUFBLE1BQ3REO0FBQUEsSUFDRjtBQUFBLEVBQ0YsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSxnQkFBZ0IsS0FBSyxJQUFJLEtBQUssMkNBQXVDLHNDQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDakc7QUFDRjtBQU9BLGVBQWUsY0FBYyxRQUF3QztBQUNuRSxNQUFJO0FBQ0YsVUFBTSxPQUFPLFVBQVUsUUFBUSxPQUFPLFNBQVM7QUFBQSxFQUNqRCxTQUFTLE9BQWdCO0FBQ3ZCLHdCQUFJLHlCQUF5QixPQUFPLGNBQWMsMENBQXNDLHNDQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDaEg7QUFFQSxNQUFJO0FBQ0YsVUFBTSxPQUFPLFVBQVUsVUFBVTtBQUFBLEVBQ25DLFNBQVMsT0FBZ0I7QUFDdkIsd0JBQUkseUJBQXlCLE9BQU8sY0FBYyw4Q0FBMEMsc0NBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNwSDtBQUNGOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfcHJvbWlzZXMiLCAic2xlZXAiLCAicHJvY2VzcyJdCn0K
|
|
415
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgam9pblxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MsIHsgbG9hZEVudkZpbGUgfSBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUgeyBFbmFibGVQbHVnaW5SZXN1bHQgfSBmcm9tICcuL2VuYWJsZS1wbHVnaW4uY2pzJztcbmltcG9ydCB0eXBlIHsgU2V0dXBMb2NrIH0gZnJvbSAnLi9zZXR1cC1sb2NrLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSxcbiAgZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZVxufSBmcm9tICcuL2VuYWJsZS1wbHVnaW4uY2pzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLXRvLXN0cmluZy5janMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7XG4gIHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzLFxuICBzd2VlcEhvc3RMZWZ0b3ZlcnMsXG4gIHdpbGxTd2VlcExlZnRvdmVyc1xufSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQge1xuICBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50LFxuICByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzLFxuICBzaG91bGRSZXRyeVBsdWdpbkVuYWJsZVxufSBmcm9tICcuL3BsdWdpbi1lbmFibGUtcmV0cnkuY2pzJztcbmltcG9ydCB7IGFjcXVpcmVTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2suY2pzJztcbmltcG9ydCB7IFRlbXBvcmFyeVZhdWx0IH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkuY2pzJztcblxuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgRElTVF9ERVYgPSAnZGlzdC9kZXYnO1xuY29uc3QgRElTVF9CVUlMRCA9ICdkaXN0L2J1aWxkJztcbmNvbnN0IE1BSU5fSlMgPSAnbWFpbi5qcyc7XG5jb25zdCBPQlNJRElBTl9DT05GSUdfRElSID0gJy5vYnNpZGlhbic7XG5jb25zdCBQTFVHSU5TX0RJUiA9ICdwbHVnaW5zJztcbmNvbnN0IENPTU1VTklUWV9QTFVHSU5TX0pTT04gPSAnY29tbXVuaXR5LXBsdWdpbnMuanNvbic7XG5jb25zdCBBUFBfSlNPTiA9ICdhcHAuanNvbic7XG5jb25zdCBBUFBfSlNPTl9JTkRFTlQgPSAyO1xuXG4vKipcbiAqIFRyYWNrcyBzZXR1cHMgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBoYXZlbid0IGJlZW4gdG9ybiBkb3duIHlldC5cbiAqIFVzZWQgYnkgdGhlIGBiZWZvcmVFeGl0YCBoYW5kbGVyIHRvIGNsZWFuIHVwIHdoZW4gYSB0ZXN0IHJ1bm5lciBleGl0c1xuICogd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIChlLmcuLCB3aGVuIG9uZSBwcm9qZWN0J3Mgc2V0dXAgZmFpbHMgYW5kIHRoZVxuICogcnVubmVyIGFib3J0cyBiZWZvcmUgdGVhcmluZyBkb3duIGFscmVhZHktaW5pdGlhbGl6ZWQgcHJvamVjdHMpLlxuICovXG5jb25zdCBhY3RpdmVTZXR1cHMgPSBuZXcgU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmNvbnN0IGRpc3Bvc2VkUmVzdWx0cyA9IG5ldyBXZWFrU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmxldCBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBjcm9zcy1wcm9jZXNzIHNldHVwIGxvY2sgaGVsZCBieSBlYWNoIGFjdGl2ZSBzZXR1cC4gUmVsZWFzZWQgd2hlbiB0aGVcbiAqIHNldHVwIGlzIHRvcm4gZG93biAob3IgYnkgdGhlIHByb2Nlc3MgY2xlYW51cCBoYW5kbGVycyksIGFsbG93aW5nIGEgY29tcGV0aW5nXG4gKiBydW4gdG8gcHJvY2VlZC4gU2VlIHtAbGluayBhY3F1aXJlU2V0dXBMb2NrfS5cbiAqL1xuY29uc3Qgc2V0dXBMb2NrcyA9IG5ldyBNYXA8Q29yZVNldHVwUmVzdWx0LCBTZXR1cExvY2s+KCk7XG5cbmNvbnN0IEFORFJPSURfTE9DS19TQ09QRSA9ICdhbmRyb2lkJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogQ29tbXVuaXR5LXBsdWdpbiBpZHMgdG8gZW5hYmxlIGluIHRoZSB2YXVsdCAqKmluIGFkZGl0aW9uIHRvKiogdGhlXG4gICAqIHBsdWdpbi11bmRlci10ZXN0LCBhZnRlciBpdCBpcyBlbmFibGVkLiBFYWNoIGlkJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlXG4gICAqIHByZXNlbnQgdW5kZXIgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBcdTIwMTQgc2VlZCB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfVxuICAgKiAoZS5nLiB3aXRoIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCkuIEVuYWJsaW5nIGdvZXMgdGhyb3VnaCB0aGUgc2FtZVxuICAgKiByZXRyeS9sb2FkLXZlcmlmeSBwYXRoIGFzIHRoZSBwbHVnaW4tdW5kZXItdGVzdC4gQ29tcG9zZXMgd2l0aFxuICAgKiBgaW5zdGFsbFBsdWdpbjogZmFsc2VgIChlbmFibGUgZXh0cmFzIGludG8gYW4gb3RoZXJ3aXNlIHBsdWdpbi1sZXNzIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNvbW11bml0eVBsdWdpbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbnN0YWxsIGFuZCBlbmFibGUgdGhlIGJ1aWx0IHBsdWdpbiBpbiB0aGUgdGVtcCB2YXVsdC4gRGVmYXVsdHNcbiAgICogdG8gYHRydWVgLiBTZXQgdG8gYGZhbHNlYCBmb3IgYSAqKm5vbi1wbHVnaW4qKiBjb25zdW1lciAoZS5nLiBhIHR5cGluZ3NcbiAgICogY3Jhd2xlcikgdGhhdCBvbmx5IG5lZWRzIGEgcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgdG8gYGV2YWxJbk9ic2lkaWFuYFxuICAgKiBhZ2FpbnN0OiB0aGUgcGx1Z2luIGBkaXN0YC9gbWFuaWZlc3QuanNvbmAgcmVhZCwgdGhlIGNvcHkgaW50b1xuICAgKiBgLm9ic2lkaWFuL3BsdWdpbnNgLCB0aGUgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHdyaXRlLCBhbmQgdGhlIGVuYWJsZSBzdGVwXG4gICAqIGFyZSBhbGwgc2tpcHBlZCwgd2hpbGUgdGhlIHRyYW5zcG9ydCwgdGVtcCB2YXVsdCwgcmVnaXN0cmF0aW9uLCBhbmRcbiAgICogd29ya2VyLWZhY2luZyBlbmRwb2ludCBwcm92aXNpb25pbmcgc3RpbGwgcnVuIHVuY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxQbHVnaW4/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBGaWxlcyBhbmQgZm9sZGVycyB0byB3cml0ZSBpbnRvIHRoZSB2YXVsdCAqKmJlZm9yZSoqIE9ic2lkaWFuIG9wZW5zIGl0LCBzb1xuICAgKiBpdHMgc3RhcnR1cCBzY2FuIGluZGV4ZXMgdGhlbSBpbiBvbmUgcGFzcyAoc2VlIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0pLlxuICAgKiBVc2UgdGhpcyBmb3IgbGFyZ2UgZml4dHVyZXMgXHUyMDE0IHdyaXRpbmcgdGhvdXNhbmRzIG9mIG5vdGVzIGFmdGVyIG9wZW4gYW5kXG4gICAqIGZvcmNpbmcgYSByZS1zY2FuIGlzIGZhciBzbG93ZXIgYW5kIGxlc3MgcmVsaWFibGUuXG4gICAqL1xuICByZWFkb25seSBwb3B1bGF0ZT86IFBvcHVsYXRlRmlsZXNQYXJhbXMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRyYW5zcG9ydCBvcHRpb25zLiBXaGVuIG9taXR0ZWQsIHVzZXMgYW4gb2ZmLXNjcmVlbiBvd25lZCBkZXNrdG9wIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkge0BsaW5rIGNvcmVTZXR1cH0sIHVzZWQgYnkgZnJhbWV3b3JrIGFkYXB0ZXJzXG4gKiB0byBwYXNzIGNvbnRleHQgdG8gdGVzdCB3b3JrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFJlc3VsdCB7XG4gIC8qKlxuICBUaGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcG9yYXJ5VmF1bHQ6IFRlbXBvcmFyeVZhdWx0O1xuXG4gIC8qKlxuICBUaGUgdHJhbnNwb3J0IGluc3RhbmNlIHVzZWQgZHVyaW5nIHNldHVwLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcyAoZS5nLiBgXCJvYnNpZGlhbi1jZHBcImApLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29weVBsdWdpbkludG9WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBDb3B5UGx1Z2luSW50b1ZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvamVjdCByb290IHRvIHJlc29sdmUgdGhlIGJ1aWx0IHBsdWdpbiBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdFJvb3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHRlbXAgdmF1bHQgdG8gY29weSB0aGUgcGx1Z2luIGludG8uXG4gICAqL1xuICByZWFkb25seSB0ZW1wb3JhcnlWYXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG5cbiAgLyoqXG4gIFRoZSB0cmFuc3BvcnQgKHVzZWQgZm9yIHRoZSBtb2JpbGUvZGVza3RvcC1vbmx5IGNvbXBhdGliaWxpdHkgY2hlY2spLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zfS5cbiAqL1xuaW50ZXJmYWNlIEVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGlkcyBvZiB0aGUgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdG8gZW5hYmxlICh0aGVpciBiaW5hcmllcyBtdXN0IGFscmVhZHkgYmUgaW4gdGhlIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gIFRoZSB0ZW1wIHZhdWx0IHRoZSBwbHVnaW5zIHdlcmUgc2VlZGVkIGludG8uXG4gICAqL1xuICByZWFkb25seSB0ZW1wb3JhcnlWYXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG5cbiAgLyoqXG4gIFRoZSB0cmFuc3BvcnQgdG8gZXZhbHVhdGUgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlUGx1Z2luSW5WYXVsdFBhcmFtcyB7XG4gIC8qKlxuICBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGlkIG9mIHRoZSBwbHVnaW4gdG8gZW5hYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHRlbXAgdmF1bHQgdGhlIHBsdWdpbiB3YXMgY29waWVkIGludG8uXG4gICAqL1xuICByZWFkb25seSB0ZW1wb3JhcnlWYXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG5cbiAgLyoqXG4gIFRoZSB0cmFuc3BvcnQgdG8gZXZhbHVhdGUgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHN3ZWVwTGVmdG92ZXJzfS5cbiAqL1xuaW50ZXJmYWNlIFN3ZWVwTGVmdG92ZXJzUGFyYW1zIHtcbiAgLyoqXG4gIERpcmVjdG9yeSBuYW1lcyB0byBrZWVwIHJlZ2FyZGxlc3Mgb2YgYWdlIChlLmcuIGEgY29uY3VycmVudCBzZXR1cCdzIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoaWNoIGVuZCBvZiB0aGUgcnVuIGlzIHN3ZWVwaW5nLCBmb3IgdGhlIGxvZyBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSBwaGFzZTogJ3NldHVwJyB8ICd0ZWFyZG93bic7XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBzd2VlcCBrbm9icykuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCBzZXR1cCBsb2dpYy5cbiAqXG4gKiBMb2FkcyBgLmVudmAgZnJvbSB0aGUgcHJvamVjdCByb290LCBjcmVhdGVzIGEgdHJhbnNwb3J0LCBjcmVhdGVzIGFuZCByZWdpc3RlcnNcbiAqIGEgdGVtcG9yYXJ5IHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZCBcdTIwMTQgdW5sZXNzIHtAbGluayBDb3JlU2V0dXBQYXJhbXMuaW5zdGFsbFBsdWdpbn1cbiAqIGlzIGBmYWxzZWAgXHUyMDE0IGNvcGllcyB0aGUgYnVpbHQgcGx1Z2luIGludG8gdGhlIHZhdWx0IGFuZCBlbmFibGVzIGl0LiBUaGVcbiAqIHBsdWdpbi1sZXNzIG1vZGUgc3RpbGwgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIGFuZCBwdWJsaXNoZXMgaXRzXG4gKiB3b3JrZXItZmFjaW5nIGVuZHBvaW50LCBzbyBhIG5vbi1wbHVnaW4gY29uc3VtZXIgcmV1c2VzIHRoZSBzYW1lIGF0dGFjaCB3aXJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcmVzb2x2ZUludGVncmF0aW9uVHJhbnNwb3J0T3B0aW9ucyhwYXJhbXM/LnRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnMudHlwZTtcbiAgY29uc3QgbG9ja1Njb3BlID0gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGxldCBsb2NrOiBTZXR1cExvY2sgfCB1bmRlZmluZWQ7XG4gIGlmIChsb2NrU2NvcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBBY3F1aXJpbmcgJyR7bG9ja1Njb3BlfScgc2V0dXAgbG9jayAoc2VyaWFsaXplcyBhZ2FpbnN0IGFueSBjb25jdXJyZW50IGludGVncmF0aW9uLXRlc3QgcnVuKS4uLmApO1xuICAgIGxvY2sgPSBhd2FpdCBhY3F1aXJlU2V0dXBMb2NrKHsgbGFiZWwsIHNjb3BlOiBsb2NrU2NvcGUgfSk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGxvY2sgYWNxdWlyZWQuYCk7XG4gIH1cblxuICBhd2FpdCBzd2VlcExlZnRvdmVycyh7IGxhYmVsLCBwaGFzZTogJ3NldHVwJywgdHJhbnNwb3J0T3B0aW9ucyB9KTtcblxuICBsZXQgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcbiAgbGV0IHRlbXBvcmFyeVZhdWx0OiBUZW1wb3JhcnlWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGluZyB0cmFuc3BvcnQuLi5gKTtcbiAgICB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUHJvamVjdCByb290OiAke3Byb2plY3RSb290fWApO1xuICAgIGNvbnN0IHNob3VsZEluc3RhbGxQbHVnaW4gPSBwYXJhbXM/Lmluc3RhbGxQbHVnaW4gIT09IGZhbHNlO1xuXG4gICAgdGVtcG9yYXJ5VmF1bHQgPSBuZXcgVGVtcG9yYXJ5VmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBvcmFyeVZhdWx0LnBhdGh9YCk7XG5cbiAgICBsZXQgcGx1Z2luSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChzaG91bGRJbnN0YWxsUGx1Z2luKSB7XG4gICAgICBwbHVnaW5JZCA9IGF3YWl0IGNvcHlQbHVnaW5JbnRvVmF1bHQoeyBsYWJlbCwgcHJvamVjdFJvb3QsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTa2lwcGluZyBwbHVnaW4gaW5zdGFsbCAoaW5zdGFsbFBsdWdpbjogZmFsc2UpIFx1MjAxNCByZWdpc3RlcmluZyBhbiBlbXB0eSB2YXVsdC5gKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5wb3B1bGF0ZSkge1xuICAgICAgY29uc3QgZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKHBhcmFtcy5wb3B1bGF0ZSkubGVuZ3RoO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBvcHVsYXRpbmcgdmF1bHQgd2l0aCAke1N0cmluZyhlbnRyeUNvdW50KX0gZW50cmllcyBiZWZvcmUgb3Blbi4uLmApO1xuICAgICAgdGVtcG9yYXJ5VmF1bHQucG9wdWxhdGUocGFyYW1zLnBvcHVsYXRlKTtcbiAgICB9XG5cbiAgICBhd2FpdCBlbnN1cmVBbHdheXNVcGRhdGVMaW5rcyh0ZW1wb3JhcnlWYXVsdCwgbGFiZWwpO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFN5bmNpbmcgdmF1bHQgdG8gZGV2aWNlLi4uYCk7XG4gICAgYXdhaXQgdGVtcG9yYXJ5VmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFJlZ2lzdGVyaW5nIHZhdWx0Li4uYCk7XG4gICAgYXdhaXQgdGVtcG9yYXJ5VmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgcmVnaXN0ZXJlZC5gKTtcblxuICAgIGlmIChwbHVnaW5JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCBlbmFibGVQbHVnaW5JblZhdWx0KHsgbGFiZWwsIHBsdWdpbklkLCB0ZW1wb3JhcnlWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IGVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2lucyh7XG4gICAgICBsYWJlbCxcbiAgICAgIHBsdWdpbklkczogcGFyYW1zPy5lbmFibGVDb21tdW5pdHlQbHVnaW5zID8/IFtdLFxuICAgICAgdGVtcG9yYXJ5VmF1bHQsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB0cmFuc3BvcnRPcHRpb25zXG4gICAgfSk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgICBjb25zdCByZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCA9IHsgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0TGFiZWw6IGxhYmVsLCB0cmFuc3BvcnRPcHRpb25zOiBhdWdtZW50ZWRPcHRpb25zIH07XG4gICAgYWN0aXZlU2V0dXBzLmFkZChyZXN1bHQpO1xuICAgIGlmIChsb2NrKSB7XG4gICAgICBzZXR1cExvY2tzLnNldChyZXN1bHQsIGxvY2spO1xuICAgIH1cbiAgICByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCwgY2xlYW5pbmcgdXAuLi5gKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRlbXBvcmFyeVZhdWx0ICYmIHRyYW5zcG9ydCkge1xuICAgICAgICBhd2FpdCB0ZW1wb3JhcnlWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIGEgd2FpdGluZyBydW4gY2FuIHByb2NlZWQgZXZlbiB0aG91Z2ggdGhpcyBydW4gZmFpbGVkLlxuICAgIGxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcbiAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gIH1cblxuICBhd2FpdCBzd2VlcExlZnRvdmVycyh7XG4gICAgZXhjbHVkZWROYW1lczogWy4uLmFjdGl2ZVNldHVwc10ubWFwKChhY3RpdmVTZXR1cCkgPT4gYmFzZW5hbWUoYWN0aXZlU2V0dXAudGVtcG9yYXJ5VmF1bHQucGF0aCkpLFxuICAgIGxhYmVsOiByZXN1bHQudHJhbnNwb3J0TGFiZWwsXG4gICAgcGhhc2U6ICd0ZWFyZG93bicsXG4gICAgdHJhbnNwb3J0T3B0aW9uczogcmVzdWx0LnRyYW5zcG9ydE9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdHJhbnNwb3J0IG9wdGlvbnMgZm9yIGFuIGludGVncmF0aW9uIHJ1bi5cbiAqXG4gKiBEZXNrdG9wIGxhdW5jaGVzIGFyZSBub3JtYWxseSB2aXNpYmxlLCBidXQgdGVzdCBzZXR1cCBleHBsaWNpdGx5IGtlZXBzIGl0c1xuICogb3duZWQgaW5zdGFuY2Ugb2ZmLXNjcmVlbiBzbyBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIGRldmVsb3Blci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbnN1bWVyLXByb3ZpZGVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgT3B0aW9ucyB3aXRoIHRoZSBkZXNrdG9wIGludGVncmF0aW9uIHZpc2liaWxpdHkgZGVmYXVsdCBhcHBsaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUludGVncmF0aW9uVHJhbnNwb3J0T3B0aW9ucyhvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHtcbiAgaWYgKG9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUgPz8gZmFsc2UsXG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgfTtcbn1cblxuLyoqXG4gKiBBdWdtZW50cyB0cmFuc3BvcnQgb3B0aW9ucyB3aXRoIHJldXNlIGluZm8gc28gdGVzdCB3b3JrZXJzIGNhbiByZWF0dGFjaCB0byB0aGVcbiAqIGluc3RhbmNlIHRoZSBnbG9iYWwgc2V0dXAgYWxyZWFkeSBsYXVuY2hlZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIHRoZWlyIG93bjpcbiAqXG4gKiAtICoqQXBwaXVtKiogXHUyMDE0IGluamVjdHMgdGhlIGVzdGFibGlzaGVkIGBzZXNzaW9uSWRgL2BkZXZpY2VJZGAuXG4gKiAtICoqT3duZWQgZGVza3RvcCBDRFAqKiBcdTIwMTQgaW5qZWN0cyB0aGUgb3duZWQgaW5zdGFuY2UncyBgaG9zdGAvYHBvcnRgIChjaG9zZW5cbiAqICAgYXQgbGF1bmNoKSBwbHVzIHRoZSBpbnRlcm5hbCBgaXNIYXJuZXNzT3duZWRJbnN0YW5jZWAgZmxhZywgc28gZWFjaCB3b3JrZXJcbiAqICAgKiphdHRhY2hlcyoqIHRvIHRoYXQgaW5zdGFuY2Ugb3ZlciBDRFAgcmF0aGVyIHRoYW4gbGF1bmNoaW5nIChhbmQgbmV2ZXJcbiAqICAgcmVnaXN0ZXJpbmcpIGl0cyBvd24gXHUyMDE0IHRoZSBidWcgdGhhdCBvdGhlcndpc2UgbGVhdmVzIGEgd29ya2VyJ3MgdHJhbnNwb3J0XG4gKiAgIHdpdGggbm8gQ0RQIGVuZHBvaW50LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9yaWdpbmFsIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKiBAcmV0dXJucyBUaGUgYXVnbWVudGVkIG9wdGlvbnMsIG9yIHRoZSBvcmlnaW5hbCBvcHRpb25zIGlmIG5vdCBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyhcbiAgb3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0XG4pOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJyAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBBcHBpdW1UcmFuc3BvcnQpIHtcbiAgICBjb25zdCBzZXNzaW9uSW5mbyA9IHRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mbygpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7b3B0aW9ucy50eXBlfV0gU2Vzc2lvbiByZXVzZSBpbmZvOiBzZXNzaW9uSWQ9JHtzZXNzaW9uSW5mby5zZXNzaW9uSWR9LCBkZXZpY2VJZD0ke3Nlc3Npb25JbmZvLmRldmljZUlkfWApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZGV2aWNlSWQ6IHNlc3Npb25JbmZvLmRldmljZUlkLFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSW5mby5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgaWYgKChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykgJiYgdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCkge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICAgIGlmIChlbmRwb2ludCkge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtERUZBVUxUX1RSQU5TUE9SVF9UWVBFfV0gT3duZWQgaW5zdGFuY2UgcmV1c2UgaW5mbzogaG9zdD0ke2VuZHBvaW50Lmhvc3R9LCBwb3J0PSR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaG9zdDogZW5kcG9pbnQuaG9zdCxcbiAgICAgICAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogdHJ1ZSxcbiAgICAgICAgcG9ydDogZW5kcG9pbnQucG9ydCxcbiAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byB0aGUgdGVtcCB2YXVsdCBhbmQgbWFya3MgaXQgYXMgYSBjb21tdW5pdHkgcGx1Z2luLlxuICpcbiAqIFJlYWRzIGBtYW5pZmVzdC5qc29uYCBmcm9tIHRoZSBuZXdlciBvZiBgZGlzdC9kZXZgL2BkaXN0L2J1aWxkYCwgcmVqZWN0cyBhXG4gKiBkZXNrdG9wLW9ubHkgcGx1Z2luIG9uIGEgbW9iaWxlIHRyYW5zcG9ydCwgY29waWVzIHRoZSBidWlsZCBpbnRvXG4gKiBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPmAsIGFuZCB3cml0ZXMgYC5vYnNpZGlhbi9jb21tdW5pdHktcGx1Z2lucy5qc29uYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvcHkgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaWQgcmVhZCBmcm9tIHRoZSBtYW5pZmVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29weVBsdWdpbkludG9WYXVsdChwYXJhbXM6IENvcHlQbHVnaW5JbnRvVmF1bHRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGxhYmVsLCBwcm9qZWN0Um9vdCwgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGNvbnN0IHBsdWdpbkRpcmVjdG9yeSA9IGpvaW4odGVtcG9yYXJ5VmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgUExVR0lOU19ESVIsIHBsdWdpbklkKTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHRlbXBvcmFyeVZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIENPTU1VTklUWV9QTFVHSU5TX0pTT04pLCBKU09OLnN0cmluZ2lmeShbcGx1Z2luSWRdKSk7XG5cbiAgcmV0dXJuIHBsdWdpbklkO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgKGJleW9uZCB0aGUgcGx1Z2luLXVuZGVyLXRlc3QpIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0LCBlYWNoIHRocm91Z2ggdGhlXG4gKiBzYW1lIHtAbGluayBlbmFibGVQbHVnaW5JblZhdWx0fSBwYXRoLiBFYWNoIHBsdWdpbidzIGJ1aWx0IGZpbGVzIG11c3QgYWxyZWFkeSBiZSBwcmVzZW50IGluIHRoZSB2YXVsdCAoc2VlZFxuICogdGhlbSB2aWEge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5wb3B1bGF0ZX0pLiBBIG5vLW9wIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zKHBhcmFtczogRW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHBsdWdpbklkcywgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IHBsdWdpbklkIG9mIHBsdWdpbklkcykge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBleHRyYSBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGVzIHRoZSBwbHVnaW4gaW4gdGhlIHJlZ2lzdGVyZWQgdmF1bHQgYW5kIHZlcmlmaWVzIGl0IGxvYWRlZC5cbiAqXG4gKiBPYnNpZGlhbidzIGBlbmFibGVQbHVnaW4oKWAgd3JhcHMgYGxvYWRQbHVnaW4oKWAgaW4gYSB0cnktY2F0Y2ggdGhhdCBzd2FsbG93c1xuICogZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLCBzbyB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0gbW9ua2V5LXBhdGNoZXNcbiAqIGBsb2FkUGx1Z2luKClgIHRvIGNhcHR1cmUgdGhlIGVycm9yIGJlZm9yZSBpdCdzIHN3YWxsb3dlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVuYWJsZSBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbmFibGVQbHVnaW5JblZhdWx0KHBhcmFtczogRW5hYmxlUGx1Z2luSW5WYXVsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGxhYmVsLCBwbHVnaW5JZCwgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxpbmcgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuXG4gIC8qXG4gICAqIE9wZW4gYSBuYXRpdmUgY29uc29sZS1jYXB0dXJlIHdpbmRvdyAoTGF5ZXIgMiwgQW5kcm9pZCBvbmx5KSBhcm91bmQgdGhlXG4gICAqIGVuYWJsZSBzbyB0aGF0IGlmIE9ic2lkaWFuIHN3YWxsb3dzIHRoZSBsb2FkIGVycm9yIGJlZm9yZSB0aGUgbW9ua2V5LXBhdGNoXG4gICAqIGFuZCB0aGUgcmVuZGVyZXIgY29uc29sZSAoTGF5ZXIgMSkgY2FtZSB1cCBlbXB0eSwgd2UgY2FuIHN0aWxsIHJlY292ZXIgdGhlXG4gICAqIHJlYWwgY2F1c2UgZnJvbSBgYWRiIGxvZ2NhdGAuIE5vLW9wICh1bmRlZmluZWQpIG9uIHRyYW5zcG9ydHMgdGhhdCBkb24ndFxuICAgKiBpbXBsZW1lbnQgaXQgKGUuZy4gZGVza3RvcCkuXG4gICAqL1xuICBjb25zdCBjYXB0dXJlSGFuZGxlID0gYXdhaXQgdHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmU/LigpO1xuXG4gIC8qXG4gICAqIE9uIGEgZnJlc2hseSBjb2xkLWJvb3RlZCBlbXVsYXRvciB0aGUgcGx1Z2luIHN1YnN5c3RlbSBjYW4gc3RpbGwgYmUgc2V0dGxpbmdcbiAgICogd2hlbiB3ZSBlbmFibGUgdGhlIHBsdWdpbiwgc28gYSBzaW5nbGUtc2hvdCBlbmFibGUgcmFjZXMgdGhlIGxvYWQgYW5kIGxvc2VzXG4gICAqICh0aGUgcGx1Z2luIGxhbmRzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbmV2ZXIgbG9hZHMpLiBSZXRyeSB0aGUgZW5hYmxlICtcbiAgICogbG9hZC12ZXJpZmljYXRpb24gYSBmZXcgdGltZXMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLCB3aGljaCByZWNvdmVycyB0aGVcbiAgICogdHJhbnNpZW50IHJhY2UuIEEgY2FwdHVyZWQgbG9hZCBlcnJvciAoYHJlYWxFcnJvcmApIGlzIGEgZGV0ZXJtaW5pc3RpYyBidWcgXHUyMDE0XG4gICAqIHJldHJ5aW5nIGNhbm5vdCBmaXggaXQsIHNvIHdlIGZhaWwgZmFzdC4gTm9uLUFuZHJvaWQgdHJhbnNwb3J0cyByZXNvbHZlIHRvXG4gICAqIHRoZSBzYW1lIGRlZmF1bHRzIGJ1dCBuZXZlciBlbnRlciB0aGUgcmV0cnkgcGF0aDogdGhlaXIgbG9hZCBlaXRoZXIgc3VjY2VlZHNcbiAgICogb24gdGhlIGZpcnN0IGF0dGVtcHQgb3IgdGhyb3dzIGEgY2FwdHVyZWQgZXJyb3IuXG4gICAqL1xuICBjb25zdCBtYXhBdHRlbXB0cyA9IDEgKyByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlDb3VudCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc3QgYmFzZURlbGF5SW5NaWxsaXNlY29uZHMgPSByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzdWx0OiBFbmFibGVQbHVnaW5SZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAgICAgY2FsbGJhY2s6IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gICAgICAgIGlucHV0OiB7IHBsdWdpbklkIH0sXG4gICAgICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgICAgIHRyYW5zcG9ydCxcbiAgICAgICAgdmF1bHRQYXRoOiB0ZW1wb3JhcnlWYXVsdC5wYXRoXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBldmFsIGl0c2VsZiB0aHJldyAoZS5nLiB0aGUgV2ViVmlldyBjb250ZXh0IHdhcyBsb3N0IG1pZC1leGVjdXRpb24gb25cbiAgICAgICAqIGEgY2h1cm5pbmcgZ3Vlc3QpIFx1MjAxNCBhIHRyYW5zcG9ydC1sZXZlbCB0cmFuc2llbnQuIFJldHJ5IGlmIGF0dGVtcHRzIHJlbWFpbi5cbiAgICAgICAqL1xuICAgICAgaWYgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBjb25zdCBkZWxheUluTWlsbGlzZWNvbmRzID0gY29tcHV0ZUJhY2tvZmZEZWxheUluTWlsbGlzZWNvbmRzKGJhc2VEZWxheUluTWlsbGlzZWNvbmRzLCBhdHRlbXB0IC0gMSk7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICBgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGUgYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSB0aHJldyBgXG4gICAgICAgICAgICArIGAoJHtlcnJvclRvU3RyaW5nKGVycm9yKX0pOyByZXRyeWluZyBpbiAke1N0cmluZyhkZWxheUluTWlsbGlzZWNvbmRzKX1tcy4uLmBcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoZGVsYXlJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBgZXJyb3JNZXNzYWdlYCBpcyB0aGUgcmVhbCB0aHJvdyBzZWVuIGJ5IHRoZSBtb25rZXktcGF0Y2g7XG4gICAgICogYHJlbmRlcmVyQ29uc29sZUVycm9yc2AgKExheWVyIDEpIGlzIHRoZSByZWFsIGNhdXNlIGNvbnNvbGUtbG9nZ2VkIGluIHRoZSByZW5kZXJlci5cbiAgICAgKi9cbiAgICBjb25zdCByZWFsRXJyb3IgPSByZXN1bHQuZXJyb3JNZXNzYWdlID8/IHJlc3VsdC5yZW5kZXJlckNvbnNvbGVFcnJvcnM7XG5cbiAgICBpZiAocmVzdWx0LmlzTG9hZGVkICYmICFyZWFsRXJyb3IpIHtcbiAgICAgIGNvbnN0IGF0dGVtcHRTdWZmaXggPSBhdHRlbXB0ID4gMSA/IGAgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKG1heEF0dGVtcHRzKX0pYCA6ICcnO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBzdWNjZXNzZnVsbHkke2F0dGVtcHRTdWZmaXh9LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgY2FwdHVyZWQgbG9hZCBlcnJvciBpcyBkZXRlcm1pbmlzdGljIFx1MjAxNCBmYWlsIGZhc3QgcmF0aGVyIHRoYW4gcmV0cnkuXG4gICAgaWYgKCFzaG91bGRSZXRyeVBsdWdpbkVuYWJsZShyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZmFpbGVkIHRvIGxvYWQ6ICR7cmVhbEVycm9yID8/IGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2UocGx1Z2luSWQpfWApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zaWVudCBjb2xkLWJvb3QgcmFjZSAoZW5hYmxlZCBidXQgbm90IGxvYWRlZCwgbm8gY2F1c2UgY2FwdHVyZWQpOiByZXRyeS5cbiAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICBjb25zdCBkZWxheUluTWlsbGlzZWNvbmRzID0gY29tcHV0ZUJhY2tvZmZEZWxheUluTWlsbGlzZWNvbmRzKGJhc2VEZWxheUluTWlsbGlzZWNvbmRzLCBhdHRlbXB0IC0gMSk7XG4gICAgICBsb2coXG4gICAgICAgIGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBidXQgbm90IGxvYWRlZCBgXG4gICAgICAgICAgKyBgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKG1heEF0dGVtcHRzKX0pOyByZXRyeWluZyBpbiAke1N0cmluZyhkZWxheUluTWlsbGlzZWNvbmRzKX1tcy4uLmBcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbGVlcChkZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBFeGhhdXN0ZWQgZXZlcnkgYXR0ZW1wdCBvbiB0aGUgdHJhbnNpZW50IHNpZ25hdHVyZTogY29tcG9zZSB0aGUgbW9zdFxuICAgKiBzcGVjaWZpYyBkZXRhaWwgYXZhaWxhYmxlIChgYWRiIGxvZ2NhdGAgdGFpbCBvbiBBbmRyb2lkLCBlbHNlIHRoZSBnZW5lcmljXG4gICAqIG1lc3NhZ2UpIFx1MjAxNCB1bmNoYW5nZWQgZnJvbSB0aGUgcHJlLXJldHJ5IHNpbmdsZS1zaG90IGZhaWx1cmUuXG4gICAqL1xuICBjb25zdCBsb2djYXRUYWlsID0gYXdhaXQgdHJhbnNwb3J0LnJlYWRDb25zb2xlQ2FwdHVyZVNpbmNlPy4oY2FwdHVyZUhhbmRsZSk7XG4gIGNvbnN0IGRldGFpbCA9IGxvZ2NhdFRhaWwgPz8gZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZShwbHVnaW5JZCk7XG4gIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtkZXRhaWx9YCk7XG59XG5cbi8qKlxuICogRW5hYmxlcyBgYWx3YXlzVXBkYXRlTGlua3NgIGluIHRoZSBvd25lZCB2YXVsdCdzIGAub2JzaWRpYW4vYXBwLmpzb25gLlxuICpcbiAqIFdpdGhvdXQgaXQsIGFueSByZW5hbWUgb3IgbW92ZSB0aGF0IGFmZmVjdHMgbGlua3MgbWFrZXMgT2JzaWRpYW4nc1xuICogYEZpbGVNYW5hZ2VyLnVwZGF0ZUFsbExpbmtzYCBwb3AgYW4gaW50ZXJhY3RpdmUgXCJVcGRhdGUgbGlua3M/XCIgY29uZmlybWF0aW9uIG1vZGFsXG4gKiAoaXQgb25seSBza2lwcyB0aGUgbW9kYWwgd2hlbiBgYWx3YXlzVXBkYXRlTGlua3NgIGlzIG9uKS4gSGVhZGxlc3MgdGhlcmUgaXMgbm8gdXNlclxuICogdG8gYW5zd2VyIGl0LCBzbyB0aGUgUHJvbWlzZSBuZXZlciByZXNvbHZlcyBcdTIwMTQgdGhlIHJlbmFtZSdzIGludGVybmFsXG4gKiBgRmlsZU1hbmFnZXIudXBkYXRlUXVldWVgIHRhc2sgaGFuZ3MgZm9yZXZlciwgYW5kIGJlY2F1c2UgdGhhdCBxdWV1ZSBpcyBhIHNpbmdsZXRvblxuICogZXZlcnkgc3Vic2VxdWVudCBgcmVuYW1lRmlsZWAgaW4gdGhlIHNoYXJlZCBpbnN0YW5jZSBoYW5ncyB0b28gKHRoZSBsb25nLW9ic2VydmVkXG4gKiBcInJlbmFtZSB3YWxsXCIpLiBFbmFibGluZyB0aGUgc2V0dGluZyBtYWtlcyByZW5hbWVzIHVwZGF0ZSBsaW5rcyBub24taW50ZXJhY3RpdmVseSxcbiAqIHNvIHJlbmFtZS1kcml2ZW4gaW50ZWdyYXRpb24gdGVzdHMgcnVuIGluIGhlYWRsZXNzIG1vZGUuXG4gKlxuICogTWVyZ2VzIGludG8gYW55IGV4aXN0aW5nIGBhcHAuanNvbmAgKGUuZy4gb25lIGNhcnJpZWQgaW4gdmlhIGBwb3B1bGF0ZWApIHNvIG90aGVyXG4gKiBjb25maWcga2V5cyBhcmUgcHJlc2VydmVkLCBhbmQgcnVucyBiZWZvcmUgYHN5bmNUb0RldmljZWAgc28gdGhlIHZhbHVlIHJlYWNoZXNcbiAqIG1vYmlsZSBkZXZpY2VzIHRvby5cbiAqXG4gKiBAcGFyYW0gdGVtcG9yYXJ5VmF1bHQgLSBUaGUgb3duZWQgdGVtcCB2YXVsdCB0byBjb25maWd1cmUuXG4gKiBAcGFyYW0gbGFiZWwgLSBUaGUgdHJhbnNwb3J0IGxhYmVsLCBmb3IgbG9nZ2luZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQWx3YXlzVXBkYXRlTGlua3ModGVtcG9yYXJ5VmF1bHQ6IFRlbXBvcmFyeVZhdWx0LCBsYWJlbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbmZpZ0RpcmVjdG9yeSA9IGpvaW4odGVtcG9yYXJ5VmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUik7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gam9pbihjb25maWdEaXJlY3RvcnksIEFQUF9KU09OKTtcbiAgbGV0IGFwcENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgdHJ5IHtcbiAgICBhcHBDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIGV4aXN0aW5nIGFwcC5qc29uIChvciB1bnJlYWRhYmxlKSBcdTIwMTQgc3RhcnQgZnJvbSBhbiBlbXB0eSBjb25maWcuXG4gIH1cbiAgYXBwQ29uZmlnWydhbHdheXNVcGRhdGVMaW5rcyddID0gdHJ1ZTtcbiAgYXdhaXQgbWtkaXIoY29uZmlnRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGFwcEpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShhcHBDb25maWcsIG51bGwsIEFQUF9KU09OX0lOREVOVCkpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxlZCBhbHdheXNVcGRhdGVMaW5rcyBpbiAke0FQUF9KU09OfSAoaGVhZGxlc3MgcmVuYW1lIHN1cHBvcnQpLmApO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpcmVjdG9yeSA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpcmVjdG9yeSwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdG9yeTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXJlY3RvcnksICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcmVjdG9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpcmVjdG9yeSA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgc2NvcGUgZm9yIGEgdHJhbnNwb3J0LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vXG4gKiBsb2NrIGlzIG5lZWRlZC5cbiAqXG4gKiBEZXNrdG9wIHJ1bnMgdXNlIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlcyAodGhlaXIgb3duIHVzZXItZGF0YSBkaXJcbiAqIGFuZCBDRFAgcG9ydCksIHNvIHRoZXkgbm8gbG9uZ2VyIGNvbnRlbmQgYW5kIG5lZWQgbm8gbG9jay4gT25seSB0aGUgQW5kcm9pZFxuICogdHJhbnNwb3J0LCB3aGljaCBzaGFyZXMgdGhlIHNpbmdsZSBlbXVsYXRvciBhbmQgQXBwaXVtIHNlcnZlciwgbXVzdCBzZXJpYWxpemUuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydE9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbG9jayBzY29wZSBzdHJpbmcsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGxvY2sgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScgPyBBTkRST0lEX0xPQ0tfU0NPUEUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBhY3RpdmVTZXR1cHMpIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGRldGVjdGVkLiBUZWFyaW5nIGRvd24gJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBhY3RpdmUgc2V0dXAocykuLi5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBhY3RpdmVTZXR1cHMpIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFJlamVjdGlvbiBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBTeW5jIGNsZWFudXA6ICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gb3JwaGFuZWQgc2V0dXAocykuYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgYWN0aXZlU2V0dXBzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJtU3luYyhyZXN1bHQudGVtcG9yYXJ5VmF1bHQucGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gICAgfVxuICAgIGFjdGl2ZVNldHVwcy5jbGVhcigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhbmQgZm9yZ2V0cyB0aGUgc2V0dXAgbG9jayBhc3NvY2lhdGVkIHdpdGggYSByZXN1bHQsIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB3aG9zZSBsb2NrIHNob3VsZCBiZSByZWxlYXNlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZVNldHVwTG9jayhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IHZvaWQge1xuICBjb25zdCBsb2NrID0gc2V0dXBMb2Nrcy5nZXQocmVzdWx0KTtcbiAgaWYgKGxvY2spIHtcbiAgICBsb2NrLnJlbGVhc2UoKTtcbiAgICBzZXR1cExvY2tzLmRlbGV0ZShyZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRpc3QgcGF0aCB0byB1c2UgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIFBpY2tzIHdoaWNoZXZlciBvZiBgZGlzdC9kZXZgIGFuZCBgZGlzdC9idWlsZGAgaGFzIGEgbmV3ZXIgYG1haW4uanNgLlxuICogSWYgb25seSBvbmUgZXhpc3RzLCB0aGF0IG9uZSBpcyB1c2VkLiBUaHJvd3MgaWYgbmVpdGhlciBleGlzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3RSb290IC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGV2UGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfREVWKTtcbiAgY29uc3QgYnVpbGRQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9CVUlMRCk7XG4gIGNvbnN0IGRldk1haW5KcyA9IGpvaW4oZGV2UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkTWFpbkpzID0gam9pbihidWlsZFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBkZXZTdGF0ID0gZXhpc3RzU3luYyhkZXZNYWluSnMpID8gYXdhaXQgc3RhdChkZXZNYWluSnMpIDogbnVsbDtcbiAgY29uc3QgYnVpbGRTdGF0ID0gZXhpc3RzU3luYyhidWlsZE1haW5KcykgPyBhd2FpdCBzdGF0KGJ1aWxkTWFpbkpzKSA6IG51bGw7XG5cbiAgaWYgKGRldlN0YXQgJiYgYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGRldlN0YXQubXRpbWUgPiBidWlsZFN0YXQubXRpbWUgPyBkZXZQYXRoIDogYnVpbGRQYXRoO1xuICB9XG5cbiAgaWYgKGRldlN0YXQpIHtcbiAgICByZXR1cm4gZGV2UGF0aDtcbiAgfVxuXG4gIGlmIChidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBidWlsZCBmb3VuZC4gUnVuIGBucG0gcnVuIGJ1aWxkYCBvciBgbnBtIHJ1biBkZXZgIGZpcnN0LicpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSB0ZW1wIGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQuXG4gKlxuICogUnVucyBhdCBib3RoIGVuZHMgb2YgYSBydW46IGF0IHNldHVwIGl0IGhhcHBlbnMgKipiZWZvcmUqKiB0aGUgdHJhbnNwb3J0IGlzXG4gKiBjcmVhdGVkLCBzbyBpdCBkb2VzIG5vdCBkZXBlbmQgb24gYSBoZWFsdGh5IE9ic2lkaWFuL1dlYlZpZXcgXHUyMDE0IHdoaWNoIGlzXG4gKiBleGFjdGx5IHdoYXQgYSBmYWlsZWQgcnVuIG5vIGxvbmdlciBoYXMsIGFuZCB3aHkgYSBmYWlsZWQgcnVuIGNhbm5vdCBjbGVhbiB1cFxuICogYWZ0ZXIgaXRzZWxmLiBBZ2UtZ2F0ZWQgKHNlZSBgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc2ApIGJlY2F1c2UgZGVza3RvcFxuICogcnVucyBhcmUgbm90IHNlcmlhbGl6ZWQgYW5kIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzIG9uZSB0ZW1wXG4gKiBkaXJlY3RvcnkuIEJlc3QtZWZmb3J0OiBhIHN3ZWVwIG5ldmVyIGZhaWxzIHRoZSBydW4gaXQgaXMgY2xlYW5pbmcgdXAgZm9yLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3dlZXAgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3dlZXBMZWZ0b3ZlcnMocGFyYW1zOiBTd2VlcExlZnRvdmVyc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGxhYmVsLCBwaGFzZSwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBpZiAoIXdpbGxTd2VlcExlZnRvdmVycyh0cmFuc3BvcnRPcHRpb25zKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3dlZXBIb3N0TGVmdG92ZXJzKHtcbiAgICAgIGV4Y2x1ZGVkTmFtZXM6IHBhcmFtcy5leGNsdWRlZE5hbWVzLFxuICAgICAgbWF4QWdlSW5NaWxsaXNlY29uZHM6IHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzKHRyYW5zcG9ydE9wdGlvbnMpXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5yZW1vdmVkQ291bnQgPiAwIHx8IHJlc3VsdC5mYWlsZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtpbnRlZ3JhdGlvbi0ke3BoYXNlfToke2xhYmVsfV0gU3dlcHQgJHtTdHJpbmcocmVzdWx0LnJlbW92ZWRDb3VudCl9IGxlZnRvdmVyIHRlbXAgZGlyZWN0b3IoaWVzKSBgXG4gICAgICAgICAgKyBgZnJvbSBlYXJsaWVyIHJ1bnMgKCR7U3RyaW5nKHJlc3VsdC5mYWlsZWRDb3VudCl9IHN0aWxsIGluIHVzZSkuYFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tJHtwaGFzZX06JHtsYWJlbH1dIExlZnRvdmVyIHN3ZWVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFzeW5jIHRlYXJkb3duIHdvcmsgKHZhdWx0IGRpc3Bvc2FsICsgdHJhbnNwb3J0IGRpc3Bvc2FsKS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB0byB0ZWFyIGRvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duQXN5bmMocmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcG9yYXJ5VmF1bHQuZGlzcG9zZShyZXN1bHQudHJhbnNwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWUEscUJBR087QUFDUCxzQkFNTztBQUNQLHVCQUdPO0FBQ1AsMEJBQXFDO0FBQ3JDLElBQUFBLG1CQUFvQztBQVFwQywyQkFHTztBQUNQLDZCQUE4QjtBQUM5Qiw4QkFBK0I7QUFDL0IsOEJBSU87QUFDUCxpQkFBb0I7QUFDcEIsaUNBS087QUFDUCx3QkFBaUM7QUFDakMsNkJBQStCO0FBQy9CLDhCQUFnQztBQUNoQyxtQ0FBb0M7QUFDcEMsK0JBQTJDO0FBRTNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sV0FBVztBQUNqQixNQUFNLGFBQWE7QUFDbkIsTUFBTSxVQUFVO0FBQ2hCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sY0FBYztBQUNwQixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLFdBQVc7QUFDakIsTUFBTSxrQkFBa0I7QUFReEIsTUFBTSxlQUFlLG9CQUFJLElBQXFCO0FBQzlDLE1BQU0sa0JBQWtCLG9CQUFJLFFBQXlCO0FBQ3JELElBQUksNkJBQTZCO0FBT2pDLE1BQU0sYUFBYSxvQkFBSSxJQUFnQztBQUV2RCxNQUFNLHFCQUFxQjtBQTZMM0IsZUFBc0IsVUFBVSxRQUFvRDtBQUNsRixRQUFNLGNBQWMsZ0JBQWdCO0FBQ3BDLFFBQU0sa0JBQWMsdUJBQUssYUFBYSxNQUFNO0FBQzVDLFVBQUksMkJBQVcsV0FBVyxHQUFHO0FBQzNCLHlDQUFZLFdBQVc7QUFBQSxFQUN6QjtBQUVBLFFBQU0sbUJBQW1CLG1DQUFtQyxRQUFRLGdCQUFnQjtBQUNwRixRQUFNLFFBQVEsaUJB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U0FBUyxPQUFPO0FBQ3ZDLFFBQU0sa0JBQWMsdUJBQUssV0FBVyxPQUFPO0FBQzNDLFFBQU0sY0FBVSwyQkFBVyxTQUFTLElBQUksVUFBTSxzQkFBSyxTQUFTLElBQUk7QUFDaEUsUUFBTSxnQkFBWSwyQkFBVyxXQUFXLElBQUksVUFBTSxzQkFBSyxXQUFXLElBQUk7QUFFdEUsTUFBSSxXQUFXLFdBQVc7QUFDeEIsV0FBTyxRQUFRLFFBQVEsVUFBVSxRQUFRLFVBQVU7QUFBQSxFQUNyRDtBQUVBLE1BQUksU0FBUztBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxXQUFXO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLElBQUksTUFBTSw2REFBNkQ7QUFDL0U7QUFjQSxlQUFlLGVBQWUsUUFBNkM7QUFDekUsUUFBTSxFQUFFLE9BQU8sT0FBTyxpQkFBaUIsSUFBSTtBQUMzQyxNQUFJLEtBQUMsNENBQW1CLGdCQUFnQixHQUFHO0FBQ3pDO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDRixVQUFNLFNBQVMsVUFBTSw0Q0FBbUI7QUFBQSxNQUN0QyxlQUFlLE9BQU87QUFBQSxNQUN0QiwwQkFBc0IsNkRBQW9DLGdCQUFnQjtBQUFBLElBQzVFLENBQUM7QUFDRCxRQUFJLE9BQU8sZUFBZSxLQUFLLE9BQU8sY0FBYyxHQUFHO0FBQ3JEO0FBQUEsUUFDRSxnQkFBZ0IsS0FBSyxJQUFJLEtBQUssV0FBVyxPQUFPLE9BQU8sWUFBWSxDQUFDLG1EQUMxQyxPQUFPLE9BQU8sV0FBVyxDQUFDO0FBQUEsTUFDdEQ7QUFBQSxJQUNGO0FBQUEsRUFDRixTQUFTLE9BQWdCO0FBQ3ZCLHdCQUFJLGdCQUFnQixLQUFLLElBQUksS0FBSywyQ0FBdUMsc0NBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNqRztBQUNGO0FBT0EsZUFBZSxjQUFjLFFBQXdDO0FBQ25FLE1BQUk7QUFDRixVQUFNLE9BQU8sZUFBZSxRQUFRLE9BQU8sU0FBUztBQUFBLEVBQ3RELFNBQVMsT0FBZ0I7QUFDdkIsd0JBQUkseUJBQXlCLE9BQU8sY0FBYywwQ0FBc0Msc0NBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNoSDtBQUVBLE1BQUk7QUFDRixVQUFNLE9BQU8sVUFBVSxVQUFVO0FBQUEsRUFDbkMsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSx5QkFBeUIsT0FBTyxjQUFjLDhDQUEwQyxzQ0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ3BIO0FBQ0Y7IiwKICAibmFtZXMiOiBbImltcG9ydF9wcm9taXNlcyIsICJzbGVlcCIsICJwcm9jZXNzIl0KfQo=
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Vitest and Jest adapters delegate to these functions.
|
|
7
7
|
*/
|
|
8
|
-
import type { PopulateFilesParams } from './
|
|
8
|
+
import type { PopulateFilesParams } from './temporary-vault.cjs';
|
|
9
9
|
import type { ObsidianTransportOptions } from './transport-options.cjs';
|
|
10
10
|
import type { ObsidianTransport } from './transport.cjs';
|
|
11
|
-
import {
|
|
11
|
+
import { TemporaryVault } from './temporary-vault.cjs';
|
|
12
12
|
/**
|
|
13
13
|
* Parameters for {@link coreSetup}.
|
|
14
14
|
*/
|
|
@@ -34,12 +34,14 @@ export interface CoreSetupParams {
|
|
|
34
34
|
readonly installPlugin?: boolean | undefined;
|
|
35
35
|
/**
|
|
36
36
|
* Files and folders to write into the vault **before** Obsidian opens it, so
|
|
37
|
-
* its startup scan indexes them in one pass (see {@link
|
|
37
|
+
* its startup scan indexes them in one pass (see {@link TemporaryVault.populate}).
|
|
38
38
|
* Use this for large fixtures — writing thousands of notes after open and
|
|
39
39
|
* forcing a re-scan is far slower and less reliable.
|
|
40
40
|
*/
|
|
41
41
|
readonly populate?: PopulateFilesParams | undefined;
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
Transport options. When omitted, uses an off-screen owned desktop instance.
|
|
44
|
+
*/
|
|
43
45
|
readonly transportOptions?: ObsidianTransportOptions | undefined;
|
|
44
46
|
}
|
|
45
47
|
/**
|
|
@@ -47,13 +49,21 @@ export interface CoreSetupParams {
|
|
|
47
49
|
* to pass context to test workers.
|
|
48
50
|
*/
|
|
49
51
|
export interface CoreSetupResult {
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
/**
|
|
53
|
+
The temporary vault created during setup.
|
|
54
|
+
*/
|
|
55
|
+
readonly temporaryVault: TemporaryVault;
|
|
56
|
+
/**
|
|
57
|
+
The transport instance used during setup.
|
|
58
|
+
*/
|
|
53
59
|
readonly transport: ObsidianTransport;
|
|
54
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
Short label for log messages (e.g. `"obsidian-cdp"`).
|
|
62
|
+
*/
|
|
55
63
|
readonly transportLabel: string;
|
|
56
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
The transport options that were resolved.
|
|
66
|
+
*/
|
|
57
67
|
readonly transportOptions: ObsidianTransportOptions | undefined;
|
|
58
68
|
}
|
|
59
69
|
/**
|
|
@@ -22,11 +22,17 @@ __export(incompatible_installer_version_error_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(incompatible_installer_version_error_exports);
|
|
24
24
|
class IncompatibleInstallerVersionError extends Error {
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
The resolved Obsidian app (asar) version that was requested.
|
|
27
|
+
*/
|
|
26
28
|
appVersion;
|
|
27
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
The resolved installer/Electron shell version that is too old to run it.
|
|
31
|
+
*/
|
|
28
32
|
installerVersion;
|
|
29
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
The oldest installer version that can boot {@link appVersion}.
|
|
35
|
+
*/
|
|
30
36
|
minRunnableInstallerVersion;
|
|
31
37
|
/**
|
|
32
38
|
* Creates the error from the resolved versions and the run floor.
|
|
@@ -49,4 +55,4 @@ class IncompatibleInstallerVersionError extends Error {
|
|
|
49
55
|
0 && (module.exports = {
|
|
50
56
|
IncompatibleInstallerVersionError
|
|
51
57
|
});
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBkaXN0aW5jdCBlcnJvciB0aHJvd24gd2hlbiBhIHBpbm5lZCBPYnNpZGlhbiBpbnN0YWxsZXIvRWxlY3Ryb24gc2hlbGwgaXNcbiAqIHRvbyBvbGQgdG8gcnVuIHRoZSBwaW5uZWQgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIFx1MjAxNCB0aGUgcmVzb2x2ZWQgaW5zdGFsbGVyXG4gKiBpcyBiZWxvdyB0aGF0IGFwcCB2ZXJzaW9uJ3MgZW1waXJpY2FsbHktbWVhc3VyZWQgcnVuIGZsb29yXG4gKiAoYG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbmAgaW4gYG1ldGFkYXRhLmpzb25gKS4gVW5saWtlXG4gKiBgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAgKHdoaWNoIGlzIGRpc2NvdmVyZWQgcmVhY3RpdmVseSwgYWZ0ZXIgdGhlXG4gKiBkZWFkIHJlbmRlcmVyIGhhcyBidXJuZWQgdGhlIGJvb3QgZ3JhY2Ugd2luZG93KSwgdGhpcyBpcyB0aHJvd24gKnByb2FjdGl2ZWx5KlxuICogZnJvbSB0aGUgdmVyc2lvbi1yZXNvbHV0aW9uIHN0ZXAsIGJlZm9yZSBhbnl0aGluZyBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkLCBzb1xuICogdGhlIG1lc3NhZ2UgY2FuIG5hbWUgdGhlIGluc3RhbGxlciB2ZXJzaW9uIHRoYXQgd291bGQgd29yay5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgcmVzb2x2ZWQgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgVGhlIHJlc29sdmVkIGluc3RhbGxlci9FbGVjdHJvbiBzaGVsbCB2ZXJzaW9uIHRoYXQgaXMgdG9vIG9sZCB0byBydW4gaXQuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBvbGRlc3QgaW5zdGFsbGVyIHZlcnNpb24gdGhhdCBjYW4gYm9vdCB7QGxpbmsgYXBwVmVyc2lvbn0uXG4gICAqL1xuICByZWFkb25seSBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcmVzb2x2ZWQgaW5zdGFsbGVyL0VsZWN0cm9uIHNoZWxsIHZlcnNpb24gaXMgYmVsb3cgdGhlIHJ1blxuICogZmxvb3IgZm9yIHRoZSByZXNvbHZlZCBPYnNpZGlhbiBhcHAgdmVyc2lvbiwgc28gdGhlIGFwcCBjb3VsZCBub3QgYm9vdCBvbiBpdC5cbiAqIENhcnJpZXMgdGhlIHRocmVlIHZlcnNpb25zIHNvIGNhbGxlcnMgY2FuIGBpbnN0YW5jZW9mYC1tYXRjaCBhbmQgc3VyZmFjZSBhblxuICogYWN0aW9uYWJsZSByZW1lZHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICBUaGUgcmVzb2x2ZWQgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcHBWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvRWxlY3Ryb24gc2hlbGwgdmVyc2lvbiB0aGF0IGlzIHRvbyBvbGQgdG8gcnVuIGl0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgVGhlIG9sZGVzdCBpbnN0YWxsZXIgdmVyc2lvbiB0aGF0IGNhbiBib290IHtAbGluayBhcHBWZXJzaW9ufS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB0aGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSBydW4gZmxvb3IuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVxdWVzdGVkIGFwcCB2ZXJzaW9uLCB0aGUgdG9vLW9sZCBpbnN0YWxsZXIgdmVyc2lvbixcbiAgICogICBhbmQgdGhlIHJ1biBmbG9vciB0aGF0IHdvdWxkIHdvcmsuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IHsgYXBwVmVyc2lvbiwgaW5zdGFsbGVyVmVyc2lvbiwgbWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uIH0gPSBwYXJhbXM7XG4gICAgc3VwZXIoXG4gICAgICBgT2JzaWRpYW4gaW5zdGFsbGVyICR7aW5zdGFsbGVyVmVyc2lvbn0gY2Fubm90IHJ1biBPYnNpZGlhbiAke2FwcFZlcnNpb259IFx1MjAxNCBgXG4gICAgICAgICsgYGl0IG5lZWRzIGluc3RhbGxlciAke21pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbn0gb3IgbmV3ZXIuIGBcbiAgICAgICAgKyAnUGluIGEgbmV3ZXIgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uLCBvciBhbGlnbiBvYnNpZGlhblZlcnNpb24gd2l0aCB0aGUgaW5zdGFsbGVyLidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3InO1xuICAgIHRoaXMuYXBwVmVyc2lvbiA9IGFwcFZlcnNpb247XG4gICAgdGhpcy5pbnN0YWxsZXJWZXJzaW9uID0gaW5zdGFsbGVyVmVyc2lvbjtcbiAgICB0aGlzLm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbiA9IG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVDTyxNQUFNLDBDQUEwQyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJM0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUVQsWUFBWSxRQUE0RDtBQUM3RSxVQUFNLEVBQUUsWUFBWSxrQkFBa0IsNEJBQTRCLElBQUk7QUFDdEU7QUFBQSxNQUNFLHNCQUFzQixnQkFBZ0Isd0JBQXdCLFVBQVUsOEJBQzlDLDJCQUEyQjtBQUFBLElBRXZEO0FBQ0EsU0FBSyxPQUFPO0FBQ1osU0FBSyxhQUFhO0FBQ2xCLFNBQUssbUJBQW1CO0FBQ3hCLFNBQUssOEJBQThCO0FBQUEsRUFDckM7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|