obsidian-integration-testing 12.2.0 → 13.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 +1 -5
- package/dist/lib/cjs/adb.cjs +1 -1
- package/dist/lib/cjs/app-config.cjs +1 -1
- package/dist/lib/cjs/app-config.d.cts +1 -1
- package/dist/lib/cjs/appium-dependencies.cjs +1 -1
- package/dist/lib/cjs/appium-session-config.cjs +3 -5
- package/dist/lib/cjs/appium-session-config.d.cts +6 -9
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
- package/dist/lib/cjs/desktop-only-plugin-skip-error.cjs +1 -1
- package/dist/lib/cjs/device-readiness.cjs +1 -1
- package/dist/lib/cjs/device-settings.cjs +1 -1
- package/dist/lib/cjs/device-settings.d.cts +1 -1
- package/dist/lib/cjs/emulator-device-id.cjs +1 -1
- package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
- package/dist/lib/cjs/emulator-reaper.cjs +1 -1
- package/dist/lib/cjs/emulator-reaper.d.cts +2 -2
- package/dist/lib/cjs/emulator-reclaim.cjs +1 -1
- package/dist/lib/cjs/emulator-reclaim.d.cts +17 -17
- package/dist/lib/cjs/eval-cap.cjs +29 -0
- package/dist/lib/cjs/eval-cap.d.cts +43 -0
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +5 -0
- package/dist/lib/cjs/fit-screenshot.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.d.cts +1 -1
- package/dist/lib/cjs/global-setup-core.cjs +1 -1
- package/dist/lib/cjs/global-setup-core.d.cts +4 -4
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/integration-setup-failed-error.cjs +1 -1
- package/dist/lib/cjs/jest/global-setup.cjs +1 -1
- package/dist/lib/cjs/jest/global-setup.d.cts +3 -3
- package/dist/lib/cjs/leftover-cleanup.cjs +1 -1
- package/dist/lib/cjs/leftover-cleanup.d.cts +2 -2
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +13 -3
- package/dist/lib/cjs/obsidian-instance.cjs +1 -1
- package/dist/lib/cjs/obsidian-version-switch.cjs +1 -1
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
- package/dist/lib/cjs/owned-vault-seed.cjs +3 -3
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +4 -3
- package/dist/lib/cjs/process-capture.cjs +1 -1
- package/dist/lib/cjs/process-capture.d.cts +5 -5
- package/dist/lib/cjs/process-exit-message.cjs +1 -1
- package/dist/lib/cjs/process-exit-message.d.cts +2 -2
- package/dist/lib/cjs/run-version-matrix.cjs +3 -3
- package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
- package/dist/lib/cjs/setup-lock.cjs +1 -1
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
- package/dist/lib/cjs/soft-keyboard.cjs +7 -4
- package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
- package/dist/lib/cjs/temporary-vault.cjs +3 -1
- package/dist/lib/cjs/transport-appium.cjs +7 -5
- package/dist/lib/cjs/transport-desktop-cdp.cjs +81 -15
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
- package/dist/lib/cjs/transport-factory.cjs +2 -2
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +11 -1
- package/dist/lib/cjs/vault-teardown-verdict.cjs +1 -1
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +2 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +1 -1
- package/dist/lib/cjs/vitest/global-setup.d.cts +3 -3
- package/dist/lib/cjs/webview-cdp.cjs +45 -14
- package/dist/lib/cjs/webview-cdp.d.cts +17 -0
- package/dist/lib/esm/adb.mjs +1 -1
- package/dist/lib/esm/app-config.d.mts +1 -1
- package/dist/lib/esm/app-config.mjs +1 -1
- package/dist/lib/esm/appium-dependencies.mjs +1 -1
- package/dist/lib/esm/appium-session-config.d.mts +6 -9
- package/dist/lib/esm/appium-session-config.mjs +3 -4
- package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
- package/dist/lib/esm/desktop-only-plugin-skip-error.mjs +1 -1
- package/dist/lib/esm/device-readiness.mjs +1 -1
- package/dist/lib/esm/device-settings.d.mts +1 -1
- package/dist/lib/esm/device-settings.mjs +1 -1
- package/dist/lib/esm/emulator-device-id.d.mts +7 -6
- package/dist/lib/esm/emulator-device-id.mjs +1 -1
- package/dist/lib/esm/emulator-reaper.d.mts +2 -2
- package/dist/lib/esm/emulator-reaper.mjs +1 -1
- package/dist/lib/esm/emulator-reclaim.d.mts +17 -17
- package/dist/lib/esm/emulator-reclaim.mjs +1 -1
- package/dist/lib/esm/eval-cap.d.mts +43 -0
- package/dist/lib/esm/eval-cap.mjs +5 -0
- package/dist/lib/esm/eval-in-obsidian.d.mts +5 -0
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/fit-screenshot.mjs +1 -1
- package/dist/lib/esm/generate-function-call.d.mts +1 -1
- package/dist/lib/esm/generate-function-call.mjs +1 -1
- package/dist/lib/esm/global-setup-core.d.mts +4 -4
- package/dist/lib/esm/global-setup-core.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/integration-setup-failed-error.mjs +1 -1
- package/dist/lib/esm/jest/global-setup.d.mts +3 -3
- package/dist/lib/esm/jest/global-setup.mjs +1 -1
- package/dist/lib/esm/leftover-cleanup.d.mts +2 -2
- package/dist/lib/esm/leftover-cleanup.mjs +1 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +13 -3
- package/dist/lib/esm/obsidian-instance.mjs +1 -1
- package/dist/lib/esm/obsidian-version-switch.mjs +1 -1
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
- package/dist/lib/esm/owned-vault-seed.mjs +3 -3
- package/dist/lib/esm/poll-in-obsidian.d.mts +4 -3
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/process-capture.d.mts +5 -5
- package/dist/lib/esm/process-capture.mjs +1 -1
- package/dist/lib/esm/process-exit-message.d.mts +2 -2
- package/dist/lib/esm/process-exit-message.mjs +1 -1
- package/dist/lib/esm/run-version-matrix.d.mts +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +3 -3
- package/dist/lib/esm/setup-lock.mjs +1 -1
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
- package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
- package/dist/lib/esm/soft-keyboard.d.mts +16 -2
- package/dist/lib/esm/soft-keyboard.mjs +7 -4
- package/dist/lib/esm/temporary-vault.mjs +3 -1
- package/dist/lib/esm/transport-appium.mjs +7 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +81 -15
- package/dist/lib/esm/transport-factory.mjs +2 -2
- package/dist/lib/esm/transport-options.d.mts +11 -1
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/vault-teardown-verdict.mjs +1 -1
- package/dist/lib/esm/version-matrix.d.mts +2 -2
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/vitest/global-setup.d.mts +3 -3
- package/dist/lib/esm/vitest/global-setup.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +17 -0
- package/dist/lib/esm/webview-cdp.mjs +45 -14
- package/package.json +1 -7
|
@@ -43,6 +43,7 @@ var import_config_directory_fallback_error = require("./config-directory-fallbac
|
|
|
43
43
|
var import_dismiss_trust_dialog = require("./dismiss-trust-dialog.cjs");
|
|
44
44
|
var import_electron_compatibility = require("./electron-compatibility.cjs");
|
|
45
45
|
var import_eval_cap_exceeded_error = require("./eval-cap-exceeded-error.cjs");
|
|
46
|
+
var import_eval_cap = require("./eval-cap.cjs");
|
|
46
47
|
var import_exec = require("./exec.cjs");
|
|
47
48
|
var import_log = require("./log.cjs");
|
|
48
49
|
var import_namespace_bootstrap = require("./namespace-bootstrap.cjs");
|
|
@@ -62,7 +63,6 @@ var import_type_guards = require("./type-guards.cjs");
|
|
|
62
63
|
var import_vault_path_match = require("./vault-path-match.cjs");
|
|
63
64
|
var import_vault_teardown_verdict = require("./vault-teardown-verdict.cjs");
|
|
64
65
|
var import_visibility = require("./visibility.cjs");
|
|
65
|
-
const COMMAND_TIMEOUT_IN_MILLISECONDS = 3e4;
|
|
66
66
|
const VAULT_ID_BYTE_LENGTH = 8;
|
|
67
67
|
const USER_DATA_RM_TIMEOUT_IN_MILLISECONDS = 1e4;
|
|
68
68
|
const USER_DATA_RM_RETRY_INTERVAL_IN_MILLISECONDS = 500;
|
|
@@ -99,6 +99,17 @@ class DesktopCdpTransport {
|
|
|
99
99
|
messageId = 0;
|
|
100
100
|
ownedConfig;
|
|
101
101
|
ownedInstance;
|
|
102
|
+
/**
|
|
103
|
+
* The in-flight commands of every socket this transport has opened, keyed by
|
|
104
|
+
* the CDP message id each is waiting for. One entry per command, added by
|
|
105
|
+
* {@link sendCommand} and removed by whichever of the reply and the timeout
|
|
106
|
+
* comes first — see {@link getPendingCommands} for why this exists at all.
|
|
107
|
+
*
|
|
108
|
+
* Weak by socket so a closed temporary connection is collectable with its
|
|
109
|
+
* pending map; the dispatcher listener is the socket's own, so nothing here
|
|
110
|
+
* keeps it alive.
|
|
111
|
+
*/
|
|
112
|
+
pendingCommandsBySocket = /* @__PURE__ */ new WeakMap();
|
|
102
113
|
/**
|
|
103
114
|
* Vault paths THIS transport opened via {@link registerVault}, normalized by
|
|
104
115
|
* {@link normalizeVaultPathForComparison}. A worker attached to a
|
|
@@ -120,7 +131,10 @@ class DesktopCdpTransport {
|
|
|
120
131
|
const {
|
|
121
132
|
cdpHost = "localhost",
|
|
122
133
|
cdpPort,
|
|
123
|
-
|
|
134
|
+
// A test's closure travels as one `Runtime.evaluate` CDP command, so the
|
|
135
|
+
// command budget IS the per-eval cap on this transport — hence the shared
|
|
136
|
+
// constant rather than a desktop-specific number that happens to match.
|
|
137
|
+
commandTimeoutInMilliseconds = import_eval_cap.DEFAULT_EVAL_CAP_IN_MILLISECONDS,
|
|
124
138
|
configDirectory,
|
|
125
139
|
deadBootGraceInMilliseconds = import_renderer_boot_detection.DEFAULT_DEAD_BOOT_GRACE_IN_MILLISECONDS,
|
|
126
140
|
isHarnessOwnedInstance = false,
|
|
@@ -156,6 +170,7 @@ class DesktopCdpTransport {
|
|
|
156
170
|
* @returns The raw PNG bytes.
|
|
157
171
|
* @throws Error if CDP returns no image data, or data that is not a PNG.
|
|
158
172
|
*/
|
|
173
|
+
// eslint-disable-next-line obsidian-dev-utils/params-options-name-match -- Permanent: `CaptureScreenshotParams` is one bag shared by the `captureScreenshot` of both transports, so no per-owner name can satisfy both.
|
|
159
174
|
async captureScreenshot(params) {
|
|
160
175
|
const ws = await this.ensureConnection(params.cwd);
|
|
161
176
|
const deviceMetricsOverride = (0, import_capture_screenshot.buildDeviceMetricsOverride)(params);
|
|
@@ -165,7 +180,7 @@ class DesktopCdpTransport {
|
|
|
165
180
|
try {
|
|
166
181
|
const response = await this.sendCommand(ws, "Page.captureScreenshot", {
|
|
167
182
|
// The override already sizes the viewport, so capturing beyond it would
|
|
168
|
-
//
|
|
183
|
+
// re-introduce the scroll height the override exists to pin down.
|
|
169
184
|
captureBeyondViewport: false,
|
|
170
185
|
format: "png"
|
|
171
186
|
});
|
|
@@ -232,6 +247,7 @@ class DesktopCdpTransport {
|
|
|
232
247
|
* @param options - Evaluation options.
|
|
233
248
|
* @returns The normalized result string.
|
|
234
249
|
*/
|
|
250
|
+
// eslint-disable-next-line obsidian-dev-utils/params-options-name-match -- Permanent: `TransportEvalOptions` is one bag shared by the `evaluate` of both transports, so no per-owner name can satisfy both.
|
|
235
251
|
async evaluate(expression, options) {
|
|
236
252
|
const ws = await this.ensureConnection(options.cwd);
|
|
237
253
|
let response;
|
|
@@ -753,6 +769,54 @@ class DesktopCdpTransport {
|
|
|
753
769
|
const targets = await response.json();
|
|
754
770
|
return targets.filter((t) => t.type === "page");
|
|
755
771
|
}
|
|
772
|
+
/**
|
|
773
|
+
* Returns a socket's in-flight command map, installing its reply dispatcher on
|
|
774
|
+
* first use.
|
|
775
|
+
*
|
|
776
|
+
* ONE `message` listener per socket, for the socket's whole life — not one per
|
|
777
|
+
* command. A listener per in-flight command makes the count scale with how many
|
|
778
|
+
* evaluations a suite has in flight at once, so a consumer that fires eleven
|
|
779
|
+
* concurrent `evalInObsidian` calls crosses Node's default `maxListeners` of 10
|
|
780
|
+
* and is told its transport is leaking memory, which it is not: measured
|
|
781
|
+
* 2026-09-15, fifteen concurrent evaluations registered fifteen listeners on the
|
|
782
|
+
* one long-lived socket and the count fell back to zero the moment they settled.
|
|
783
|
+
* A warning that fires on correct use is worse than no warning, because the real
|
|
784
|
+
* signal — an entry that is added and never removed — is then indistinguishable
|
|
785
|
+
* from it. With one dispatcher the listener count is a constant, and a genuine
|
|
786
|
+
* leak shows instead as a pending map that never empties.
|
|
787
|
+
*
|
|
788
|
+
* The dispatcher is deliberately forgiving about what arrives: a CDP **event**
|
|
789
|
+
* carries no `id` and belongs to no command, and a frame that is not JSON at all
|
|
790
|
+
* belongs to nothing this transport sent. Both are ignored. The old per-command
|
|
791
|
+
* handler parsed unguarded, so one frame that is not JSON threw once per
|
|
792
|
+
* in-flight command, out of the event dispatch, where nothing could catch it.
|
|
793
|
+
*
|
|
794
|
+
* @param ws - The socket whose replies are being awaited.
|
|
795
|
+
* @returns The socket's map of in-flight commands, keyed by CDP message id.
|
|
796
|
+
*/
|
|
797
|
+
getPendingCommands(ws) {
|
|
798
|
+
const existingPendingCommands = this.pendingCommandsBySocket.get(ws);
|
|
799
|
+
if (existingPendingCommands) {
|
|
800
|
+
return existingPendingCommands;
|
|
801
|
+
}
|
|
802
|
+
const pendingCommands = /* @__PURE__ */ new Map();
|
|
803
|
+
this.pendingCommandsBySocket.set(ws, pendingCommands);
|
|
804
|
+
ws.addEventListener("message", (event) => {
|
|
805
|
+
let message;
|
|
806
|
+
try {
|
|
807
|
+
message = JSON.parse(String(event.data));
|
|
808
|
+
} catch {
|
|
809
|
+
return;
|
|
810
|
+
}
|
|
811
|
+
const pendingCommand = pendingCommands.get(message.id);
|
|
812
|
+
if (!pendingCommand) {
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
815
|
+
pendingCommands.delete(message.id);
|
|
816
|
+
pendingCommand(message);
|
|
817
|
+
});
|
|
818
|
+
return pendingCommands;
|
|
819
|
+
}
|
|
756
820
|
/**
|
|
757
821
|
* Kills the currently-running owned instance (if any) and waits for it to exit,
|
|
758
822
|
* so the next launch gets a pristine single-window instance.
|
|
@@ -976,7 +1040,7 @@ class DesktopCdpTransport {
|
|
|
976
1040
|
try {
|
|
977
1041
|
const response = await this.sendCommand(ws, "Runtime.evaluate", {
|
|
978
1042
|
// Old Obsidian versions (e.g. 0.6.x) predate the `getBasePath()` method but
|
|
979
|
-
//
|
|
1043
|
+
// expose the `basePath` property; the method exists from ~0.9.20 onward.
|
|
980
1044
|
expression: "app.vault.adapter.getBasePath ? app.vault.adapter.getBasePath() : app.vault.adapter.basePath",
|
|
981
1045
|
returnByValue: true
|
|
982
1046
|
});
|
|
@@ -1052,21 +1116,23 @@ class DesktopCdpTransport {
|
|
|
1052
1116
|
*/
|
|
1053
1117
|
async sendCommand(ws, method, params) {
|
|
1054
1118
|
const id = ++this.messageId;
|
|
1119
|
+
const pendingCommands = this.getPendingCommands(ws);
|
|
1055
1120
|
return new Promise((resolve, reject) => {
|
|
1056
1121
|
const timeout = setTimeout(() => {
|
|
1057
|
-
|
|
1122
|
+
pendingCommands.delete(id);
|
|
1058
1123
|
reject(new import_cdp_command_timeout_error.CdpCommandTimeoutError({ method, timeoutInMilliseconds: this.commandTimeoutInMilliseconds }));
|
|
1059
1124
|
}, this.commandTimeoutInMilliseconds);
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1125
|
+
pendingCommands.set(id, (response) => {
|
|
1126
|
+
clearTimeout(timeout);
|
|
1127
|
+
resolve(response);
|
|
1128
|
+
});
|
|
1129
|
+
try {
|
|
1130
|
+
ws.send(JSON.stringify({ id, method, params }));
|
|
1131
|
+
} catch (error) {
|
|
1132
|
+
clearTimeout(timeout);
|
|
1133
|
+
pendingCommands.delete(id);
|
|
1134
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
1067
1135
|
}
|
|
1068
|
-
ws.addEventListener("message", handler);
|
|
1069
|
-
ws.send(JSON.stringify({ id, method, params }));
|
|
1070
1136
|
});
|
|
1071
1137
|
}
|
|
1072
1138
|
/**
|
|
@@ -1222,4 +1288,4 @@ async function getObsidianLaunchCommand(port) {
|
|
|
1222
1288
|
0 && (module.exports = {
|
|
1223
1289
|
DesktopCdpTransport
|
|
1224
1290
|
});
|
|
1225
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUgeyBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlLFxuICBkZWNvZGVCYXNlNjRQbmcsXG4gIGlzUG5nXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgeyBDZHBDb21tYW5kVGltZW91dEVycm9yIH0gZnJvbSAnLi9jZHAtY29tbWFuZC10aW1lb3V0LWVycm9yLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnktZmFsbGJhY2stZXJyb3IuY2pzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgeyBFdmFsQ2FwRXhjZWVkZWRFcnJvciB9IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IuY2pzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAuY2pzJztcbmltcG9ydCB7XG4gIGRpZFJlbW92ZVZhdWx0RnJvbUNvbmZpZyxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNWYXVsdFJlZ2lzdGVyZWRcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcuY2pzJztcbmltcG9ydCB7IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUgfSBmcm9tICcuL29ic2lkaWFuLWV4ZWN1dGFibGUuY2pzJztcbmltcG9ydCB7IGxhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZSB9IGZyb20gJy4vb2JzaWRpYW4taW5zdGFuY2UuY2pzJztcbmltcG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEuY2pzJztcbmltcG9ydCB7IGNvcHlBc2FySW50b1VzZXJEYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLXN3aXRjaC5janMnO1xuaW1wb3J0IHsgcmVhZE93bmVkSW5zdGFuY2VFeGl0TWFya2VyIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci5janMnO1xuaW1wb3J0IHtcbiAgYnVpbGRPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JGcm9tTWFya2VyLFxuICBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3Jcbn0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0ZWQtZXJyb3IuY2pzJztcbmltcG9ydCB7IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24gfSBmcm9tICcuL293bmVkLXZhdWx0LXNlZWQuY2pzJztcbmltcG9ydCB7IGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24gfSBmcm9tICcuL3BhcmVudC1saXZlbmVzcy5janMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTLFxuICByZXNvbHZlUmVuZGVyZXJCb290U3RhdGVcbn0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IuY2pzJztcbmltcG9ydCB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5pbXBvcnQge1xuICBhcmVWYXVsdFBhdGhzTWF0Y2hpbmcsXG4gIG5vcm1hbGl6ZVZhdWx0UGF0aEZvckNvbXBhcmlzb25cbn0gZnJvbSAnLi92YXVsdC1wYXRoLW1hdGNoLmNqcyc7XG5pbXBvcnQgeyBzaG91bGRUZWFyRG93blZhdWx0V2luZG93IH0gZnJvbSAnLi92YXVsdC10ZWFyZG93bi12ZXJkaWN0LmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlT3duZWRIaWRkZW5MYXVuY2hBcmd1bWVudHMsXG4gIHJlc29sdmVTYW5kYm94TGF1bmNoQXJndW1lbnRzLFxuICBzaG91bGRIaWRlT2JzaWRpYW5BcHBcbn0gZnJvbSAnLi92aXNpYmlsaXR5LmNqcyc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIENEUCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyB7XG4gIC8qKlxuICAgKiBDRFAgaG9zdC4gRGVmYXVsdHMgdG8gYCdsb2NhbGhvc3QnYC5cbiAgICovXG4gIGNkcEhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENEUCBwb3J0IGZvciAqKmF0dGFjaCoqIG1vZGUgKHRoZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgIHRoZSBydW5uaW5nXG4gICAqIE9ic2lkaWFuIHdhcyBsYXVuY2hlZCB3aXRoKS4gSW4gb3duZWQtaW5zdGFuY2UgbW9kZSB0aGlzIGlzIGlnbm9yZWQgXHUyMDE0IGFcbiAgICogZnJlZSBwb3J0IGlzIGNob3NlbiBhdCBsYXVuY2guXG4gICAqL1xuICBjZHBQb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqIERlZmF1bHRzIHRvIGAzMDAwMGAuXG4gICAqL1xuICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyBjb25maWcgZm9sZGVyIG92ZXJyaWRlIChPYnNpZGlhbidzICpPdmVycmlkZSBjb25maWcgZm9sZGVyKiksXG4gICAqIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLiBXaGVuIHNldCwgdGhlIG93bmVkIGluc3RhbmNlIGJvb3RzIHRvIHRoZVxuICAgKiBzdGFydGVyIHNjcmVlbiwgd3JpdGVzIGA8dmF1bHRJZD4tY29uZmlnYCBpbnRvIHRoYXQgcmVuZGVyZXInc1xuICAgKiBgbG9jYWxTdG9yYWdlYCwgYW5kIG9ubHkgdGhlbiBvcGVucyB0aGUgdmF1bHQgb3ZlciB0aGUgYHZhdWx0LW9wZW5gIElQQyBcdTIwMTRcbiAgICogdGhlIG92ZXJyaWRlIGlzIHJlYWQgb25jZSwgZHVyaW5nIHRoZSB2YXVsdCByZW5kZXJlcidzIG93biBzZXR1cCwgc28gaXQgaGFzXG4gICAqIHRvIGV4aXN0IGJlZm9yZSB0aGF0IHdpbmRvdyBpcyBjcmVhdGVkLiBUaGUgb3BlbmVkIHZhdWx0J3MgYWN0dWFsXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBpcyB0aGVuIHJlYWQgYmFjaywgYW5kIGEgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIHtAbGluayBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yfS4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgIChPYnNpZGlhbidzIG93biBkZWZhdWx0LCBgLm9ic2lkaWFuYClcbiAgICovXG4gIGNvbmZpZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgZGVhZCBib290IG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZSAoZW1wdHkgYDxib2R5PmAgd2l0aCBubyBgd2luZG93LmFwcGAgYWZ0ZXIgdGhlIHJlbmRlcmVyIHJlYWNoZWRcbiAgICogYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFN9LiBgMGAgZGlzYWJsZXMgZmFzdC1mYWlsLlxuICAgKi9cbiAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGF0dGFjaGluZyAoaS5lLiB7QGxpbmsgY2RwUG9ydH0gaXMgc2V0KSwgbWFya3MgdGhlIHRhcmdldCBhcyBhXG4gICAqICoqaGFybmVzcy1vd25lZCwgYWxyZWFkeS1wcmVwYXJlZCoqIGluc3RhbmNlLiBTdXBwcmVzc2VzIHRoZSB1c2VyLXNjb3BlXG4gICAqIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQsIHNpbmNlIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuXG4gICAqIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcgcmF0aGVyIHRoYW4gdGhlIHVzZXItc2NvcGUgcmVnaXN0cnkuXG4gICAqL1xuICBpc0hhcm5lc3NPd25lZEluc3RhbmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3duZWQgT2JzaWRpYW4gd2luZG93IGlzIHNob3duIG9uIHNjcmVlbi4gV2hlbiBgZmFsc2VgICh0aGVcbiAgICogZGVmYXVsdCksIHRoZSBvd25lZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCB3aXRoIGtlZXAtYWxpdmUgQ2hyb21pdW0gZmxhZ3MgYW5kXG4gICAqIGl0cyB3aW5kb3cgaXMgbW92ZWQgb2ZmLXNjcmVlbiBhZnRlciBsYXVuY2guIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlO1xuICAgKiBhdHRhY2ggbW9kZSBuZXZlciB0b3VjaGVzIHRoZSAodXNlcidzKSB3aW5kb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNPYnNpZGlhbkFwcFZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICAgKiBpbnN0ZWFkIG9mIGF0dGFjaGluZyB0byBhIHJ1bm5pbmcgb25lLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgbW9kZS5cbiAgICovXG4gIG93bmVkSW5zdGFuY2U/OiBPd25lZEluc3RhbmNlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS4gTmVlZGVkIHRvIGJvb3Qgb24gTGludXggd2l0aG91dCBhIGNvcnJlY3RseS1jb25maWd1cmVkXG4gICAqIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciAoZS5nLiBhbiBleHRyYWN0ZWQgcG9ydGFibGUgc2hlbGwsIG9yIENJIGFzIGFcbiAgICogbm9uLXJvb3QgdXNlcik7IGhhcm1sZXNzIG9uIFdpbmRvd3MvbWFjT1MuIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwb3N0LWJvb3QgKipzaWxlbnQgYXNhciBmYWxsYmFjayoqICh0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBkaWZmZXJzXG4gICAqIGZyb20gdGhlIHN3YXBwZWQtaW4gcGluKSBmYWlscyBmYXN0IHdpdGgge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfS4gVGhlXG4gICAqIHZlcmRpY3QgaXMgYWx3YXlzIGNvbXB1dGVkIGFuZCBzdXJmYWNlZCB2aWFcbiAgICoge0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnQuZ2V0QXNhckZhbGxiYWNrfTsgdGhpcyBnYXRlcyBvbmx5IHRoZSB0aHJvdy4gT25seVxuICAgKiBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUgcnVubmluZyBhIHN3YXBwZWQtaW4gYXNhci5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdC1ib290IHJ1bnRpbWUtRWxlY3Ryb24gY29tcGF0aWJpbGl0eSBuYWcgd2FybmluZyBpcyBlbWl0dGVkXG4gICAqIHdoZW4gdGhlIGxpdmUgRWxlY3Ryb24gaXMgYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkIG1pbmltdW0uIFRoZSB2ZXJkaWN0IGlzXG4gICAqIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eX07XG4gICAqIHRoaXMgb25seSBnYXRlcyB0aGUgbG9nLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBhc2FyIHRvIHByb3Zpc2lvbiBpbnRvIGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSdzIHVzZXItZGF0YSBkaXJlY3RvcnkgYmVmb3JlIGxhdW5jaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQXNhciB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQvc291cmNlIGFzYXIgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGFzYXIncyBgeC55LnpgIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZS5cbiAqXG4gKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgaXRzIG93biBPYnNpZGlhbiBwcm9jZXNzXG4gKiBhZ2FpbnN0IGFuIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VDb25maWcge1xuICAvKipcbiAgT3B0aW9uYWwgYXNhciB0byBwcm92aXNpb24gaW50byB7QGxpbmsgdXNlckRhdGFEaXJlY3Rvcnl9IGJlZm9yZSBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUFzYXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCB3aGVuIGl0IGNvdWxkIGJlIGRldGVybWluZWRcbiAgICogKGFuIGFzYXItc3dhcCBvbnRvIGEga25vd24gc2hlbGwgdmVyc2lvbikuIFN1cmZhY2VkIGJ5XG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldENvbXBhdGliaWxpdHl9LiBBbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHJlYWNoZXNcbiAgICogdGhpcyBzdXJmYWNlIG9ubHkgd2hlbiB0aGUgcHJvYWN0aXZlIHRocm93IGlzIGRpc2FibGVkXG4gICAqIChgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBiZWZvcmUgdGhlIGNvbmZpZyBpcyBidWlsdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhdGliaWxpdHk/OiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBzaGVsbCBleGVjdXRhYmxlIHRvIGxhdW5jaC5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeS4gQ3JlYXRlZCBhbmQgb3duZWQgYnkgdGhlXG4gICAqIHRyYW5zcG9ydCwgYW5kIGRlbGV0ZWQgb24gZGlzcG9zZS5cbiAgICovXG5cbiAgcmVhZG9ubHkgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgQ0RQIGVuZHBvaW50IG9mIGEgbGF1bmNoZWQsIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUVuZHBvaW50IHtcbiAgLyoqXG4gIENEUCBob3N0IChlLmcuIGAnbG9jYWxob3N0J2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZnJlZSBDRFAgcG9ydCB0aGUgb3duZWQgaW5zdGFuY2Ugd2FzIGxhdW5jaGVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ2RwRXhjZXB0aW9uRGV0YWlscyB7XG4gIGV4Y2VwdGlvbj86IENkcEV4Y2VwdGlvbk9iamVjdDtcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwRXhjZXB0aW9uT2JqZWN0IHtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBSZXNwb25zZSB7XG4gIGlkOiBudW1iZXI7XG4gIHJlc3VsdD86IENkcFJlc3BvbnNlUmVzdWx0O1xufVxuXG5pbnRlcmZhY2UgQ2RwUmVzcG9uc2VSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGJhc2U2NC1lbmNvZGVkIGltYWdlIHJldHVybmVkIGJ5IGBQYWdlLmNhcHR1cmVTY3JlZW5zaG90YC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkRldGFpbHM/OiBDZHBFeGNlcHRpb25EZXRhaWxzO1xuICByZWFkb25seSByZXN1bHQ/OiBDZHBWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHdlYlNvY2tldERlYnVnZ2VyVXJsOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBWYWx1ZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU/OiB1bmtub3duO1xufVxuXG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuY29uc3QgVkFVTFRfSURfQllURV9MRU5HVEggPSA4O1xuY29uc3QgVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuY29uc3QgVVNFUl9EQVRBX1JNX1JFVFJZX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG4vLyBPbGQgKEVsZWN0cm9uIDEwLWVyYSkgT2JzaWRpYW4gb2NjYXNpb25hbGx5IGJvb3RzIHdpdGhvdXQgdGhlIHdvcmtzcGFjZSBldmVyXG4vLyBJbml0aWFsaXppbmcsIHNvIHRoZSB2YXVsdCBuZXZlciBiZWNvbWVzIHJlYWR5LiBBIGZyZXNoIGluc3RhbmNlIGlzIGFuXG4vLyBJbmRlcGVuZGVudCBjaGFuY2U7IHJlbGF1bmNoIHVwIHRvIHRoaXMgbWFueSB0aW1lcyBiZWZvcmUgZ2l2aW5nIHVwLlxuY29uc3QgT1dORURfTEFVTkNIX01BWF9BVFRFTVBUUyA9IDM7XG4vLyBCcmllZiBzZXR0bGUgYmVmb3JlIGEgcmVsYXVuY2ggc28gdGhlIGtpbGxlZCBpbnN0YW5jZSdzIG1lbW9yeS9oYW5kbGVzIGFyZVxuLy8gUmVjbGFpbWVkIGJlZm9yZSB0aGUgbmV4dCBib290IFx1MjAxNCBpbXByb3ZlcyB0aGUgb2RkcyBvbiBhIGxvYWRlZCBtYWNoaW5lLlxuY29uc3QgT1dORURfUkVMQVVOQ0hfU0VUVExFX0lOX01JTExJU0VDT05EUyA9IDMwMDA7XG5jb25zdCBWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuY29uc3QgQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuY29uc3QgSU5TVEFOQ0VfRVhJVF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuLy8gSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHN0YXJ0ZXIgc2NyZWVuJ3MgcmVuZGVyZXIgdG8gZXhwb3NlIGBsb2NhbFN0b3JhZ2VgXG4vLyBBbmQgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlcmAgXHUyMDE0IHRoZSB0d28gdGhpbmdzIHRoZSBjb25maWctZm9sZGVyIG92ZXJyaWRlXG4vLyBOZWVkcy4gQ0RQIGFscmVhZHkgc2VydmVzIGEgcGFnZSB0YXJnZXQgYnkgdGhlIHRpbWUgdGhlIGxhdW5jaCByZXNvbHZlcywgc29cbi8vIFRoaXMgb25seSBjb3ZlcnMgdGhlIHJlbmRlcmVyIGZpbmlzaGluZyBpdHMgb3duIHNjcmlwdCBldmFsdWF0aW9uLlxuY29uc3QgU1RBUlRFUl9TQ1JFRU5fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBTVEFSVEVSX1NDUkVFTl9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDI1MDtcbmNvbnN0IE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyA9IDIwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjBfMDAwO1xuY29uc3QgT1dORURfV0lORE9XX0hJREVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyNTA7XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIENvbm5lY3RzIHRvIE9ic2lkaWFuJ3MgQ0RQIFdlYlNvY2tldCBlbmRwb2ludCwgc2VuZHMgYFJ1bnRpbWUuZXZhbHVhdGVgXG4gKiBjb21tYW5kcywgYW5kIHJvdXRlcyBleHByZXNzaW9ucyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2RwVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVWYXVsdFBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGFzYXJGYWxsYmFjazogQXNhckZhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkcEhvc3Q6IHN0cmluZztcbiAgcHJpdmF0ZSBjZHBQb3J0OiBudW1iZXI7XG4gIHByaXZhdGUgY2RwVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ0RpcmVjdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIGVsZWN0cm9uQ29tcGF0aWJpbGl0eTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNPYnNpZGlhbkFwcFZpc2libGU6IGJvb2xlYW47XG4gIHByaXZhdGUgbWVzc2FnZUlkID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBvd25lZENvbmZpZzogT3duZWRJbnN0YW5jZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvd25lZEluc3RhbmNlOiBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBWYXVsdCBwYXRocyBUSElTIHRyYW5zcG9ydCBvcGVuZWQgdmlhIHtAbGluayByZWdpc3RlclZhdWx0fSwgbm9ybWFsaXplZCBieVxuICAgKiB7QGxpbmsgbm9ybWFsaXplVmF1bHRQYXRoRm9yQ29tcGFyaXNvbn0uIEEgd29ya2VyIGF0dGFjaGVkIHRvIGFcbiAgICogaGFybmVzcy1vd25lZCBpbnN0YW5jZSBtYXkgdGVhciBkb3duIG9ubHkgdGhlc2UgXHUyMDE0IGV2ZXJ5IG90aGVyIHZhdWx0IGluIHRoYXRcbiAgICogaW5zdGFuY2UgYmVsb25ncyB0byB0aGUgZ2xvYmFsIHNldHVwIHRoYXQgbGF1bmNoZWQgaXQgKHNlZVxuICAgKiB7QGxpbmsgc2hvdWxkVGVhckRvd25WYXVsdFdpbmRvd30pLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZWxmUmVnaXN0ZXJlZFZhdWx0UGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgd3M6IG51bGwgfCBXZWJTb2NrZXQgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IENEUCB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBDRFAgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcpIHtcbiAgICAvLyBEZXN0cnVjdHVyZSB3aXRoIHBlci1maWVsZCBkZWZhdWx0cyAoZWFjaCBhcHBsaWVzIHdoZW4gdGhlIGZpZWxkIGlzIG9taXR0ZWQsXG4gICAgLy8gRXhhY3RseSBsaWtlIHRoZSBmb3JtZXIgYGNvbmZpZz8ueCA/PyBkZWZhdWx0YCkgc28gdGhlIGNvbnN0cnVjdG9yIHN0YXlzXG4gICAgLy8gVW5kZXIgdGhlIGN5Y2xvbWF0aWMtY29tcGxleGl0eSBsaW1pdCBhcyBmaWVsZHMgYXJlIGFkZGVkLlxuICAgIGNvbnN0IHtcbiAgICAgIGNkcEhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICAgIGNkcFBvcnQsXG4gICAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzID0gQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGNvbmZpZ0RpcmVjdG9yeSxcbiAgICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA9IERFRkFVTFRfREVBRF9CT09UX0dSQUNFX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGlzSGFybmVzc093bmVkSW5zdGFuY2UgPSBmYWxzZSxcbiAgICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlID0gdHJ1ZSxcbiAgICAgIG93bmVkSW5zdGFuY2UsXG4gICAgICBzaG91bGREaXNhYmxlU2FuZGJveCA9IGZhbHNlLFxuICAgICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayA9IHRydWUsXG4gICAgICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzID0gdHJ1ZVxuICAgIH0gPSBjb25maWcgPz8ge307XG4gICAgdGhpcy5jZHBIb3N0ID0gY2RwSG9zdDtcbiAgICB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuY29uZmlnRGlyZWN0b3J5ID0gY29uZmlnRGlyZWN0b3J5O1xuICAgIHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID0gZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA9IGlzSGFybmVzc093bmVkSW5zdGFuY2U7XG4gICAgdGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSA9IGlzT2JzaWRpYW5BcHBWaXNpYmxlO1xuICAgIHRoaXMub3duZWRDb25maWcgPSBvd25lZEluc3RhbmNlO1xuICAgIHRoaXMuc2hvdWxkRGlzYWJsZVNhbmRib3ggPSBzaG91bGREaXNhYmxlU2FuZGJveDtcbiAgICB0aGlzLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sgPSBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrO1xuICAgIHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyA9IHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM7XG4gICAgLy8gT3duZWQgbW9kZSBwaWNrcyBhIGZyZWUgcG9ydCBhdCBsYXVuY2ggKGFzc2lnbmVkIGluIHJlZ2lzdGVyVmF1bHQpLlxuICAgIC8vIEF0dGFjaCBtb2RlIGNvbm5lY3RzIHRvIHRoZSBjb25maWd1cmVkIHBvcnQ7IG5vIHBvcnQgaXMgaGFyZGNvZGVkLlxuICAgIHRoaXMuY2RwUG9ydCA9IGNkcFBvcnQgPz8gMDtcbiAgICB0aGlzLmNkcFVybCA9IGNkcFBvcnQgPT09IHVuZGVmaW5lZCA/ICcnIDogYGh0dHA6Ly8ke2NkcEhvc3R9OiR7U3RyaW5nKGNkcFBvcnQpfWA7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGUgT2JzaWRpYW4gd2luZG93IHNob3dpbmcgdGhlIGdpdmVuIHZhdWx0LlxuICAgKlxuICAgKiBXaGVuIGEgc2l6ZSBpcyByZXF1ZXN0ZWQgdGhlIHZpZXdwb3J0IGlzIHBpbm5lZCB0byBpdCB3aXRoXG4gICAqIGBFbXVsYXRpb24uc2V0RGV2aWNlTWV0cmljc092ZXJyaWRlYCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYXB0dXJlLCBzbyB0aGVcbiAgICogZW1pdHRlZCBQTkcgaXMgZXhhY3RseSB0aGF0IHNpemUgd2hhdGV2ZXIgc2l6ZSB0aGUgd2luZG93IGhhcHBlbnMgdG8gYmUgXHUyMDE0XG4gICAqIGFuZCB0aGUgb3ZlcnJpZGUgaXMgYWx3YXlzIGNsZWFyZWQgYWZ0ZXJ3YXJkcywgaW5jbHVkaW5nIHdoZW4gdGhlIGNhcHR1cmVcbiAgICogdGhyb3dzLCBzbyBhIGZhaWxlZCBjYXB0dXJlIGNhbm5vdCBsZWF2ZSB0aGUgd2luZG93IHN0dWNrIGF0IHRoZSBvdmVycmlkZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFdoaWNoIHZhdWx0IHdpbmRvdyB0byBjYXB0dXJlLCBhbmQgdGhlIGV4YWN0IHNpemUgdG8gY2FwdHVyZSBpdCBhdC5cbiAgICogQHJldHVybnMgVGhlIHJhdyBQTkcgYnl0ZXMuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgQ0RQIHJldHVybnMgbm8gaW1hZ2UgZGF0YSwgb3IgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChwYXJhbXM6IENhcHR1cmVTY3JlZW5zaG90UGFyYW1zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24ocGFyYW1zLmN3ZCk7XG4gICAgY29uc3QgZGV2aWNlTWV0cmljc092ZXJyaWRlID0gYnVpbGREZXZpY2VNZXRyaWNzT3ZlcnJpZGUocGFyYW1zKTtcbiAgICBpZiAoZGV2aWNlTWV0cmljc092ZXJyaWRlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsIGRldmljZU1ldHJpY3NPdmVycmlkZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1BhZ2UuY2FwdHVyZVNjcmVlbnNob3QnLCB7XG4gICAgICAgIC8vIFRoZSBvdmVycmlkZSBhbHJlYWR5IHNpemVzIHRoZSB2aWV3cG9ydCwgc28gY2FwdHVyaW5nIGJleW9uZCBpdCB3b3VsZFxuICAgICAgICAvLyBSZS1pbnRyb2R1Y2UgdGhlIHNjcm9sbCBoZWlnaHQgdGhlIG92ZXJyaWRlIGV4aXN0cyB0byBwaW4gZG93bi5cbiAgICAgICAgY2FwdHVyZUJleW9uZFZpZXdwb3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiAncG5nJ1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5yZXN1bHQ/LmRhdGE7XG4gICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ0RQIHNjcmVlbnNob3QgZXJyb3I6IFBhZ2UuY2FwdHVyZVNjcmVlbnNob3QgcmV0dXJuZWQgbm8gaW1hZ2UgZGF0YS4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnl0ZXMgPSBkZWNvZGVCYXNlNjRQbmcoZGF0YSk7XG4gICAgICBpZiAoIWlzUG5nKGJ5dGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUCBzY3JlZW5zaG90IGVycm9yOiBQYWdlLmNhcHR1cmVTY3JlZW5zaG90IHJldHVybmVkIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGRldmljZU1ldHJpY3NPdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlJywge30pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0aGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uIGFuZCwgaW4gb3duZWQtaW5zdGFuY2UgbW9kZSxcbiAgICoga2lsbHMgdGhlIG93bmVkIE9ic2lkaWFuIHByb2Nlc3MgYW5kIHJlbW92ZXMgaXRzIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gICAqXG4gICAqIFRoZSByZW1vdmFsIGlzIHJldHJpZWQgYmVjYXVzZSBXaW5kb3dzIGJyaWVmbHkgaG9sZHMgdGhlIGp1c3Qta2lsbGVkXG4gICAqIHByb2Nlc3MncyBmaWxlIGhhbmRsZXMsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBmYWlsIGBybVN5bmNgIHdpdGggYEVQRVJNYC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgIGNvbnN0IHsgdXNlckRhdGFEaXJlY3RvcnkgfSA9IHRoaXMub3duZWRDb25maWc7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGlmIChkaWRSZW1vdmVEaXJlY3RvcnkodXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBpZiAoIWRpZFJlbW92ZURpcmVjdG9yeSh1c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZW1vdmUgb3duZWQgdXNlci1kYXRhIGRpcmVjdG9yeSB3aXRoaW4gJHtTdHJpbmcoVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsKTogJHt1c2VyRGF0YURpcmVjdG9yeX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgZGlzcG9zYWwgXHUyMDE0IGtpbGxzIHRoZSBvd25lZCBpbnN0YW5jZSBhbmQgbWFrZXMgYSBiZXN0LWVmZm9ydFxuICAgKiByZW1vdmFsIG9mIGl0cyB1c2VyLWRhdGEgZGlyZWN0b3J5LiBTYWZlIHRvIGNhbGwgZnJvbSBhIHByb2Nlc3MgYGV4aXRgIGhhbmRsZXJcbiAgICogKHdoZXJlIGFzeW5jIHJldHJpZXMgYXJlIGltcG9zc2libGU7IGEgbGVmdG92ZXIgdGVtcCBkaXJlY3RvcnkgaXMgYWNjZXB0YWJsZSkuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgICAgaWYgKCFkaWRSZW1vdmVEaXJlY3RvcnkodGhpcy5vd25lZENvbmZpZy51c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT3duZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBub3QgcmVtb3ZlZCBzeW5jaHJvbm91c2x5IChwcm9jZXNzIG1heSBzdGlsbCBob2xkIGhhbmRsZXMpOiAke3RoaXMub3duZWRDb25maWcudXNlckRhdGFEaXJlY3Rvcnl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIENEUCBgUnVudGltZS5ldmFsdWF0ZWAuXG4gICAqXG4gICAqIFJvdXRlcyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQgYmFzZWQgb24gYG9wdGlvbnMuY3dkYC5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbihvcHRpb25zLmN3ZCk7XG4gICAgbGV0IHJlc3BvbnNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8qXG4gICAgICAgKiBPbmx5IFRISVMgZXZhbCBjYXJyaWVzIGEgY2FsbGVyJ3MgY2xvc3VyZSBcdTIwMTQgdGhlIGhhcm5lc3MncyBvd24gYFJ1bnRpbWUuZXZhbHVhdGVgIGNhbGxzICh0aGUgdHJ1c3RcbiAgICAgICAqIERpYWxvZywgdGhlIHdhdGNoZG9nLCB0aGUgYm9vdCBwcm9iZXMpIHRpbWUgb3V0IGZvciByZWFzb25zIHRoYXQgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggYSB0ZXN0J3NcbiAgICAgICAqIFdhaXRpbmcsIGFuZCByZXBvcnRpbmcgdGhlIGNhcCBmb3IgdGhvc2Ugd291bGQgYmUgdGhlIHNhbWUgbWlzZGlhZ25vc2lzIHBvaW50aW5nIHRoZSBvdGhlciB3YXkuXG4gICAgICAgKi9cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENkcENvbW1hbmRUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV2YWxDYXBFeGNlZWRlZEVycm9yKHtcbiAgICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczogdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBvcHRpb25OYW1lOiAnY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcycsXG4gICAgICAgICAgdHJhbnNwb3J0TmFtZTogJ2Rlc2t0b3AgKENEUCknXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2UucmVzdWx0Py5leGNlcHRpb25EZXRhaWxzKSB7XG4gICAgICBjb25zdCBkZXNjID0gcmVzcG9uc2UucmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMuZXhjZXB0aW9uPy5kZXNjcmlwdGlvblxuICAgICAgICA/PyByZXNwb25zZS5yZXN1bHQuZXhjZXB0aW9uRGV0YWlscy50ZXh0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDRFAgZXZhbHVhdGlvbiBlcnJvcjogJHtkZXNjfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdE9iamVjdCA9IHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0O1xuICAgIGlmICghcmVzdWx0T2JqZWN0IHx8IHJlc3VsdE9iamVjdC50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIE5PX09VVFBVVDtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHJlc3VsdE9iamVjdC52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCBmb3IgdGhpcyBvd25lZCBpbnN0YW5jZSBcdTIwMTQgd2hldGhlciB0aGVcbiAgICogYXBwIHZlcnNpb24gaXQgaXMgYWN0dWFsbHkgcnVubmluZyBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiwgb3IgdGhlIGluc3RhbGxlclxuICAgKiBzaWxlbnRseSByZXZlcnRlZCB0byBpdHMgb3duIGJ1bmRsZWQgYXNhciAocmVhZCBsaXZlIHBvc3QtYm9vdCkuIFJldHVybnNcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIG5vdCBhbiBvd25lZCBpbnN0YW5jZSwgdGhlIGluc3RhbmNlIGhhcyBub3QgYm9vdGVkXG4gICAqIHlldCwgb3IgdGhlIHZlcmRpY3QgY291bGQgbm90IGJlIGRldGVybWluZWQgKG5vIGFzYXIgd2FzIHN3YXBwZWQsIG9yIHRoZSBsaXZlXG4gICAqIHZlcnNpb24gd2FzIHVucmVhZGFibGUpLiBBIGAnZmFsbGJhY2snYCB2ZXJkaWN0IHJlYWNoZXMgdGhpcyBzdXJmYWNlIG9ubHkgd2hlblxuICAgKiB0aGUgdGhyb3cgaXMgZGlzYWJsZWQgKHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2t9XG4gICAqIGBmYWxzZWApOyBvdGhlcndpc2UgaXQgdGhyb3dzIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRBc2FyRmFsbGJhY2soKTogQXNhckZhbGxiYWNrIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hc2FyRmFsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgdGhpcyBvd25lZFxuICAgKiBpbnN0YW5jZSwgc28gY2FsbGVycyBjYW4gYXNzZXJ0IG9uIGl0LiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3RcbiAgICogYW4gb3duZWQgaW5zdGFuY2UsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChlLmcuIGFuXG4gICAqIHVuZGV0ZWN0YWJsZSBzaGVsbCB2ZXJzaW9uLCBvciB0aGUgYXBwIHZlcnNpb24gaXMgYWJzZW50IGZyb20gdGhlIHRhYmxlKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcGF0aWJpbGl0eSgpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vd25lZENvbmZpZz8uY29tcGF0aWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgdGhpcyBvd25lZCBpbnN0YW5jZSBcdTIwMTRcbiAgICogd2hldGhlciB0aGUgRWxlY3Ryb24gdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIGlzIG5ldyBlbm91Z2ggZm9yIHRoZVxuICAgKiBydW5uaW5nIGFwcCB2ZXJzaW9uIChyZWFkIGxpdmUgcG9zdC1ib290OyBzZWUge0BsaW5rIE9ic2lkaWFuVmVyc2lvbk1ldGFkYXRhLm1pblJlY29tbWVuZGVkRWxlY3Ryb25WZXJzaW9ufSkuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIG5vdCBhbiBvd25lZCBpbnN0YW5jZSwgdGhlIGluc3RhbmNlIGhhcyBub3RcbiAgICogYm9vdGVkIHlldCwgb3IgdGhlIHZlcmRpY3QgY291bGQgbm90IGJlIGRldGVybWluZWQgKHRoZSBsaXZlIHZlcnNpb24gd2FzXG4gICAqIHVucmVhZGFibGUsIG9yIHRoZSBhcHAgdmVyc2lvbiBjYXJyaWVzIG5vIHJlY29tbWVuZGVkIEVsZWN0cm9uIHZlcnNpb24pLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eSgpOiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVsZWN0cm9uQ29tcGF0aWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBDRFAgZW5kcG9pbnQgb2YgdGhlIG93bmVkLCBsYXVuY2hlZCBpbnN0YW5jZSBzbyB0aGUgZ2xvYmFsIHNldHVwXG4gICAqIGNhbiBoYW5kIGl0IHRvIHRlc3Qgd29ya2VycyAod2hpY2ggdGhlbiAqKmF0dGFjaCoqIHRvIGl0IGluc3RlYWQgb2ZcbiAgICogbGF1bmNoaW5nIHRoZWlyIG93bikuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIHRyYW5zcG9ydCBpcyBub3QgYW5cbiAgICogb3duZWQgaW5zdGFuY2UsIG9yIGl0cyBpbnN0YW5jZSBoYXMgbm90IGJlZW4gbGF1bmNoZWQgeWV0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgb3duZWQgaW5zdGFuY2UncyBDRFAgaG9zdCBhbmQgcG9ydCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk6IE93bmVkSW5zdGFuY2VFbmRwb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLm93bmVkQ29uZmlnIHx8ICF0aGlzLm93bmVkSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7IGhvc3Q6IHRoaXMuY2RwSG9zdCwgcG9ydDogdGhpcy5jZHBQb3J0IH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgQ0RQIGVuZHBvaW50IGlzIHJlYWNoYWJsZSBhbmQgaGFzIE9ic2lkaWFuIHRhcmdldHMuXG4gICAqXG4gICAqIElmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBhdHRlbXB0cyB0byBhdXRvLXN0YXJ0IGl0IHZpYSBVUkkgcHJvdG9jb2xcbiAgICogYW5kIHBvbGxzIHVudGlsIENEUCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGZvciB2YXVsdCByZWdpc3RyYXRpb24gY2hlY2spLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcgfHwgdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlKSB7XG4gICAgICAvLyBPd25lZCBpbnN0YW5jZSAobGF1bmNoZWQgaGVyZSkgb3IgYSB3b3JrZXIgYXR0YWNoZWQgdG8gb25lOiByZWFkaW5lc3MgaXNcbiAgICAgIC8vIEd1YXJhbnRlZWQgYnkgdGhlIGdsb2JhbCBzZXR1cCdzIHJlZ2lzdGVyVmF1bHQsIGFuZCB0aGUgdmF1bHQgbGl2ZXMgaW5cbiAgICAgIC8vIFRoZSBpc29sYXRlZCBjb25maWcgXHUyMDE0IHRoZXJlIGlzIG5vdGhpbmcgdG8gdmVyaWZ5IGFnYWluc3QgdGhlIHVzZXItc2NvcGVcbiAgICAgIC8vIFJlZ2lzdHJ5LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrIGZvciB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgaWYgKCFpc1ZhdWx0UmVnaXN0ZXJlZCh2YXVsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWYXVsdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbjogJHt2YXVsdFBhdGh9LiBSZWdpc3RlciB0aGUgdmF1bHQgZmlyc3Qgd2l0aCByZWdpc3RlclZhdWx0KCkgb3IgVGVtcG9yYXJ5VmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcGFnZSB0YXJnZXRzJyk7XG4gICAgICB9XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDRFAgcmVhY2hhYmxlLCAke1N0cmluZyh0YXJnZXRzLmxlbmd0aCl9IHRhcmdldChzKSBmb3VuZC5gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IHZpYSBFbGVjdHJvbiBJUEMgZXZhbHVhdGVkIHRocm91Z2ggQ0RQLlxuICAgKlxuICAgKiBVc2VzIGFuIGV4aXN0aW5nIE9ic2lkaWFuIHRhcmdldCB0byBzZW5kIHRoZSBgdmF1bHQtb3BlbmAgSVBDIGNvbW1hbmQsXG4gICAqIHRoZW4gcG9sbHMgdW50aWwgdGhlIG5ldyB2YXVsdCdzIHRhcmdldCBhcHBlYXJzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJWYXVsdEluT3duZWRJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMub3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgICAvLyBSZWNvcmRlZCBvbmx5IG9uIHN1Y2Nlc3MsIGFuZCBvbmx5IGhlcmU6IHRoaXMgaXMgdGhlIG9uZSBicmFuY2ggdGhhdCBvcGVuc1xuICAgIC8vIEEgd2luZG93IGluIGFuIGluc3RhbmNlIHRoaXMgdHJhbnNwb3J0IGRpZCBub3QgbGF1bmNoLCBzbyBpdCBpcyB0aGUgb25lXG4gICAgLy8gQnJhbmNoIHRoYXQgZWFybnMgdGhlIHJpZ2h0IHRvIGNsb3NlIG9uZSAoc2VlIGB1bnJlZ2lzdGVyVmF1bHRgKS5cbiAgICB0aGlzLnNlbGZSZWdpc3RlcmVkVmF1bHRQYXRocy5hZGQobm9ybWFsaXplVmF1bHRQYXRoRm9yQ29tcGFyaXNvbih2YXVsdFBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGJ5IGRlc3Ryb3lpbmcgaXRzIHdpbmRvdyBhbmQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIFJlZnVzZXMgd2hlbiB0aGlzIHRyYW5zcG9ydCBkb2VzIG5vdCBvd24gd2hhdCBpdCB3b3VsZCBiZSB0ZWFyaW5nIGRvd24gXHUyMDE0XG4gICAqIHNlZSB7QGxpbmsgc2hvdWxkVGVhckRvd25WYXVsdFdpbmRvd30gZm9yIHdoaWNoIG9mIHRoZSB0d28gb3duZXJzaGlwIGZsYWdzXG4gICAqIG1lYW5zIHdoYXQsIGFuZCB3aHkgdGhleSBhcmUgbm90IGludGVyY2hhbmdlYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhdWx0UGF0aCA9IG5vcm1hbGl6ZVZhdWx0UGF0aEZvckNvbXBhcmlzb24odmF1bHRQYXRoKTtcbiAgICBpZiAoXG4gICAgICAhc2hvdWxkVGVhckRvd25WYXVsdFdpbmRvdyh7XG4gICAgICAgIGlzSGFybmVzc093bmVkSW5zdGFuY2U6IHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSxcbiAgICAgICAgaXNPd25lZEluc3RhbmNlOiBCb29sZWFuKHRoaXMub3duZWRDb25maWcpLFxuICAgICAgICBpc1NlbGZSZWdpc3RlcmVkOiB0aGlzLnNlbGZSZWdpc3RlcmVkVmF1bHRQYXRocy5oYXMobm9ybWFsaXplZFZhdWx0UGF0aClcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBsb2coXG4gICAgICAgIHRoaXMub3duZWRDb25maWdcbiAgICAgICAgICA/IGBbY2RwLXRyYW5zcG9ydF0gU2tpcHBpbmcgcGVyLXZhdWx0IHRlYXJkb3duOyB0aGUgb3duZWQgaW5zdGFuY2UgaXMga2lsbGVkIHdob2xlc2FsZSBvbiBkaXNwb3NlOiAke3ZhdWx0UGF0aH1gXG4gICAgICAgICAgOiBgW2NkcC10cmFuc3BvcnRdIFNraXBwaW5nIHBlci12YXVsdCB0ZWFyZG93bjsgdGhpcyB3b3JrZXIgZGlkIG5vdCByZWdpc3RlciB0aGUgdmF1bHQgaXQgd2FzIGFza2VkIHRvIHVucmVnaXN0ZXI6ICR7dmF1bHRQYXRofWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxmUmVnaXN0ZXJlZFZhdWx0UGF0aHMuZGVsZXRlKG5vcm1hbGl6ZWRWYXVsdFBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd0Rlc3Ryb3lFeHByZXNzaW9uID0gJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmRlc3Ryb3lDdXJyZW50V2luZG93KCknO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogd2luZG93RGVzdHJveUV4cHJlc3Npb24sXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBXaW5kb3cgbWF5IGFscmVhZHkgYmUgY2xvc2VkLlxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgYHZhdWx0LXJlbW92ZWAgSVBDIGlzIHNlbnQgdGhyb3VnaCBhIHN0aWxsLW9wZW4gd2luZG93IChgdGFyZ2V0c1swXWApIFx1MjAxNFxuICAgICAgLy8gYHZhdWx0UGF0aGAncyBvd24gd2luZG93IHdhcyBqdXN0IGRlc3Ryb3llZCBhYm92ZSwgc28gYm9vdHN0cmFwIHRoZSBuYW1lc3BhY2VcbiAgICAgIC8vIE9uIHRoZSBleGlzdGluZyB3aW5kb3cncyBPV04gYmFzZSBwYXRoLCBub3Qgb24gYHZhdWx0UGF0aGAgKHdoaWNoIG5vIGxvbmdlciBoYXNcbiAgICAgIC8vIEEgbGl2ZSB0YXJnZXQgdG8gbWF0Y2gpLlxuICAgICAgY29uc3QgcmVtb3ZhbFRhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHRhcmdldHNbMF0pO1xuICAgICAgY29uc3QgcmVtb3ZhbEJhc2VQYXRoID0gYXdhaXQgdGhpcy5wcm9iZVZhdWx0UGF0aChyZW1vdmFsVGFyZ2V0KTtcbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQocmVtb3ZhbFRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgcmVtb3ZhbEJhc2VQYXRoKTtcbiAgICAgICAgY29uc3QgdmF1bHRSZW1vdmVFeHByZXNzaW9uID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJywgY2hhbm5lbEFyZ3VtZW50czogW3ZhdWx0UGF0aF0gfSl9KWA7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgICBleHByZXNzaW9uOiB2YXVsdFJlbW92ZUV4cHJlc3Npb24sXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE5vIENEUCB0YXJnZXRzIGZvciByZW1vdmFsIElQQyBcdTIwMTQgcmVtb3ZpbmcgZGlyZWN0bHkgZnJvbSBvYnNpZGlhbi5qc29uLicpO1xuICAgICAgZGlkUmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIGFuZCBzdG9yZXMgdGhlIHJ1bnRpbWUtRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0IChvblxuICAgKiB7QGxpbmsgZ2V0RWxlY3Ryb25Db21wYXRpYmlsaXR5fSkgZnJvbSBhbiBhbHJlYWR5LXJlYWQgdmVyc2lvbiBwYWlyLCB3YXJuaW5nXG4gICAqIHdoZW4gdGhlIGxpdmUgRWxlY3Ryb24gaXMgYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkIG1pbmltdW0uIE5ldmVyIHRocm93czsgYVxuICAgKiBib290IHdob3NlIHJ1bm5pbmcgYXBwIHZlcnNpb24gd2FzIHVucmVhZGFibGUgaXMgc2tpcHBlZCAobm90aGluZyB0byBqdWRnZSkuXG4gICAqXG4gICAqIEBwYXJhbSBhcHBWZXJzaW9uIC0gVGhlIGxpdmUgcnVubmluZyBhcHAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnJlYWRhYmxlLlxuICAgKiBAcGFyYW0gYWN0dWFsRWxlY3Ryb25WZXJzaW9uIC0gVGhlIGxpdmUgRWxlY3Ryb24gdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnJlYWRhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUVsZWN0cm9uQ29tcGF0aWJpbGl0eShhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsIGFjdHVhbEVsZWN0cm9uVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKGFwcFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcmRpY3QgPSByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5KHtcbiAgICAgIGFjdHVhbEVsZWN0cm9uVmVyc2lvbixcbiAgICAgIGFwcFZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogZ2V0VmVyc2lvbk1ldGFkYXRhKGFwcFZlcnNpb24pXG4gICAgfSk7XG4gICAgdGhpcy5lbGVjdHJvbkNvbXBhdGliaWxpdHkgPSB2ZXJkaWN0O1xuICAgIGlmICh2ZXJkaWN0LnRpZXIgPT09ICduYWdnZWQnICYmIHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcykge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gJHtlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0Lm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb2ludHMgdGhlIG93bmVkIGluc3RhbmNlJ3MgcmVuZGVyZXIgYXQgdGhpcyBwcm9jZXNzJ3MgbGl2ZW5lc3Mgc29ja2V0IHNvIGl0XG4gICAqIGRlc3Ryb3lzIGl0c2VsZiBpZiB3ZSBkaWUgd2l0aG91dCBydW5uaW5nIHRlYXJkb3duIChzZWUgYHBhcmVudC1saXZlbmVzcy50c2ApLlxuICAgKlxuICAgKiBCZXN0LWVmZm9ydCBieSBkZXNpZ24uIEEgcmVuZGVyZXIgd2l0aG91dCBOb2RlIGFjY2VzcyByZXBvcnRzIGAndW5hdmFpbGFibGUnYFxuICAgKiBhbmQgYW4gZXZhbHVhdGlvbiBmYWlsdXJlIGlzIGxvZ2dlZCBhbmQgc3dhbGxvd2VkOiB0aGUgd2F0Y2hkb2cgaXMgYSBiYWNrc3RvcFxuICAgKiBmb3IgYW4gYWxyZWFkeS1hYm5vcm1hbCBleGl0LCBuZXZlciBhIHJlYXNvbiB0byBmYWlsIGFuIG90aGVyd2lzZSBnb29kIGxhdW5jaC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKiBAcGFyYW0gcGFyZW50TGl2ZW5lc3NQb3J0IC0gVGhlIGxvb3BiYWNrIHBvcnQgdGhlIHJlbmRlcmVyIHNob3VsZCBjb25uZWN0IGJhY2sgdG8uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFybVBhcmVudExpdmVuZXNzV2F0Y2hkb2codmF1bHRQYXRoOiBzdHJpbmcsIHBhcmVudExpdmVuZXNzUG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoYnVpbGRQYXJlbnRMaXZlbmVzc1dhdGNoZG9nRXhwcmVzc2lvbihwYXJlbnRMaXZlbmVzc1BvcnQpLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nIG9uIHBvcnQgJHtTdHJpbmcocGFyZW50TGl2ZW5lc3NQb3J0KX06ICR7cmVzdWx0fS5gKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IGFybSB0aGUgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nIChpbnN0YW5jZSBtYXkgb3V0bGl2ZSBhIGtpbGxlZCBoYXJuZXNzKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcmVhZHkgdmF1bHQgaXMgYWN0dWFsbHkgdXNpbmcgdGhlIHJlcXVlc3RlZCBjb25maWcgZm9sZGVyLFxuICAgKiB0aHJvd2luZyB7QGxpbmsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcn0gd2hlbiBpdCBpcyBub3QuXG4gICAqXG4gICAqIE9ic2lkaWFuIGFwcGxpZXMgdGhlIG92ZXJyaWRlIHdpdGggYHNldENvbmZpZ0RpcmAsIHdoaWNoIHN1YnN0aXR1dGVzXG4gICAqIGAub2JzaWRpYW5gIGZvciBhbnkgdmFsdWUgaXRzIG93biBgdmFsaWRhdGVDb25maWdEaXJgIHJlamVjdHMgXHUyMDE0IHdpdGhvdXQgYVxuICAgKiB3b3JkLCBhbmQgd2l0aG91dCBmYWlsaW5nIHRoZSBib290LiBUaGUgcmVzdWx0aW5nIHZhdWx0IG9wZW5zLCByZWFjaGVzXG4gICAqIGxheW91dC1yZWFkeSwgYW5kIHJlcG9ydHMgc3VjY2Vzczsgd2hhdCBpdCBsYWNrcyBpcyB0aGUgc2V0dGluZ3MgYW5kIGVuYWJsZWRcbiAgICogcGx1Z2lucyBvZiB0aGUgZm9sZGVyIHRoYXQgd2FzIGFza2VkIGZvci4gUmVhZGluZyB0aGUgbGl2ZVxuICAgKiBgYXBwLnZhdWx0LmNvbmZpZ0RpcmAgYmFjayBpcyB0aGUgb25seSB3YXkgdG8gdGVsbCB0aGUgdHdvIGFwYXJ0LCBhbmQgaXRcbiAgICogY292ZXJzIGV2ZXJ5IGNhdXNlIGF0IG9uY2U6IGEgbmFtZSBPYnNpZGlhbiByZWplY3RlZCAoaW5jbHVkaW5nIGl0c1xuICAgKiB1bnJlY292ZXJhYmxlIGNoYXJhY3RlciBibGFja2xpc3QsIHdoaWNoIGBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeWAgZGVsaWJlcmF0ZWx5XG4gICAqIGRvZXMgbm90IGd1ZXNzIGF0KSwgYW5kIGEgd3JpdGUgdGhhdCBuZXZlciByZWFjaGVkIHRoZSB2YXVsdCdzIHJlbmRlcmVyLlxuICAgKlxuICAgKiBBIG5vLW9wIHdoZW4gbm8gb3ZlcnJpZGUgd2FzIHJlcXVlc3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFzc2VydFJlcXVlc3RlZENvbmZpZ0RpcmVjdG9yeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvbmZpZ0RpcmVjdG9yeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsQ29uZmlnRGlyZWN0b3J5ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZSgnYXBwLnZhdWx0LmNvbmZpZ0RpcicsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKGFjdHVhbENvbmZpZ0RpcmVjdG9yeSA9PT0gdGhpcy5jb25maWdEaXJlY3RvcnkpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFZhdWx0IG9wZW5lZCB3aXRoIHRoZSByZXF1ZXN0ZWQgY29uZmlnIGZvbGRlciAke3RoaXMuY29uZmlnRGlyZWN0b3J5fS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvcih7XG4gICAgICBhY3R1YWxDb25maWdEaXJlY3RvcnksXG4gICAgICByZXF1ZXN0ZWRDb25maWdEaXJlY3Rvcnk6IHRoaXMuY29uZmlnRGlyZWN0b3J5LFxuICAgICAgdmF1bHRQYXRoXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBlcnJvciBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIHRoYXQgaXMgbm8gbG9uZ2VyIHNlcnZpbmcgQ0RQLFxuICAgKiBmcm9tIHRoZSBiZXN0IGV2aWRlbmNlIHRoaXMgcHJvY2VzcyBoYXMuXG4gICAqXG4gICAqIFR3byBwcm9jZXNzZXMgc2VlIHR3byBkaWZmZXJlbnQgaGFsdmVzIG9mIHRoZSBkZWF0aC4gVGhlIG9uZSB0aGF0IGxhdW5jaGVkXG4gICAqIHRoZSBpbnN0YW5jZSBob2xkcyB0aGUgY2hpbGQgYW5kIGNhbiByZWFkIHRoZSBleGl0IGNvZGUgc3RyYWlnaHQgb2ZmIGl0OyBhXG4gICAqIHRlc3Qgd29ya2VyIGhvbGRzIG5vdGhpbmcgYnV0IHRoZSBwb3J0LCBhbmQgcmVhZHMgdGhlIHNhbWUgZmFjdHMgZnJvbSB0aGVcbiAgICogZXhpdCBtYXJrZXIgdGhlIG93bmVyIHdyb3RlIChgb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXIudHNgKS4gV2l0aCBuZWl0aGVyXG4gICAqIFx1MjAxNCB0aGUgbWFya2VyIGxvc3QsIG9yIGEga2lsbCBzbyBhYnJ1cHQgbm90aGluZyByZWNvcmRlZCBpdCBcdTIwMTQgdGhlIGVycm9yIHN0aWxsXG4gICAqIG5hbWVzIHRoZSBpbnN0YW5jZSBhcyB0aGUgY2F1c2UsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBpdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGVycm9yIHRvIHRocm93IGluIHBsYWNlIG9mIGEgcmVmdXNlZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcigpOiBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3Ige1xuICAgIGNvbnN0IGV4aXRJbmZvID0gdGhpcy5vd25lZEluc3RhbmNlPy5yZWFkRXhpdEluZm8oKTtcbiAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yKHtcbiAgICAgICAgY2RwVXJsOiB0aGlzLmNkcFVybCxcbiAgICAgICAgY29kZTogZXhpdEluZm8uY29kZSxcbiAgICAgICAgb3V0cHV0VGFpbDogdGhpcy5vd25lZEluc3RhbmNlPy5yZWFkT3V0cHV0KCksXG4gICAgICAgIHNpZ25hbDogZXhpdEluZm8uc2lnbmFsLFxuICAgICAgICBzcGF3bkVycm9yOiBleGl0SW5mby5zcGF3bkVycm9yXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JGcm9tTWFya2VyKHRoaXMuY2RwVXJsLCByZWFkT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIodGhpcy5jZHBQb3J0KSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHJ1bm5pbmcgYXBwIChhc2FyKSB2ZXJzaW9uIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluLCBzdG9yaW5nIHRoZVxuICAgKiB2ZXJkaWN0IG9uIHtAbGluayBnZXRBc2FyRmFsbGJhY2t9LiBPbiBhICoqc2lsZW50IGZhbGxiYWNrKiogKHRoZSBpbnN0YWxsZXIgcmFuXG4gICAqIGl0cyBvd24gYnVuZGxlZCBhc2FyIGluc3RlYWQgb2YgdGhlIHBpbikgaXQgdGhyb3dzIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn1cbiAgICogd2hlbiB0aGUgdGhyb3cgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlIHdhcm5zICh3aGVuIHdhcm5pbmdzIGFyZSBvbikgYW5kIGxldHMgdGhlXG4gICAqIGJvb3QgcHJvY2VlZC4gQSBib290IHdpdGggbm8gc3dhcHBlZC1pbiBhc2FyLCBvciBhbiB1bnJlYWRhYmxlIHJ1bm5pbmcgdmVyc2lvbixcbiAgICogaXMgYCd1bmtub3duJ2AgXHUyMDE0IG5vdGhpbmcgaXMgdGhyb3duIG9yIHdhcm5lZC4gVGhpcyBpcyB0aGUgaGVhbHRoeS1VSSBjb21wYW5pb24gdG9cbiAgICogdGhlIGJsYWNrLXNjcmVlbiB7QGxpbmsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcn0gZGVhZC1ib290IGZhc3QtZmFpbC5cbiAgICpcbiAgICogQHBhcmFtIHJ1bm5pbmdBcGlWZXJzaW9uIC0gVGhlIGxpdmUgcnVubmluZyBhcHAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnJlYWRhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1J1bnRpbWVBc2FyRmFsbGJhY2socnVubmluZ0FwaVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHZlcmRpY3QgPSByZXNvbHZlQXNhckZhbGxiYWNrKHtcbiAgICAgIHJlcXVlc3RlZFZlcnNpb246IHRoaXMub3duZWRDb25maWc/LmFzYXI/LnZlcnNpb24sXG4gICAgICBydW5uaW5nQXBpVmVyc2lvblxuICAgIH0pO1xuICAgIHRoaXMuYXNhckZhbGxiYWNrID0gdmVyZGljdDtcblxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc29sdmVBc2FyRmFsbGJhY2tBY3Rpb24oe1xuICAgICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogdGhpcy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICAgICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzLFxuICAgICAgdGllcjogdmVyZGljdC50aWVyXG4gICAgfSk7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgICAgdGhyb3cgbmV3IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yKHtcbiAgICAgICAgcmVxdWVzdGVkVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5yZXF1ZXN0ZWRWZXJzaW9uKSxcbiAgICAgICAgcnVubmluZ0FwaVZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QucnVubmluZ0FwaVZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3dhcm4nKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSAke2Vuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHBvc3QtYm9vdCBydW50aW1lIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBhbiBvd25lZCBpbnN0YW5jZSwgb25jZSB0aGVcbiAgICogdmF1bHQgaXMgcmVhZHkuIFJlYWRzIHRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24gYW5kIEVsZWN0cm9uIHZlcnNpb24gKipvbmNlKipcbiAgICogZnJvbSB0aGUgYm9vdGVkIHJlbmRlcmVyJ3MgbWFpbiBwcm9jZXNzLCB0aGVuOiAoMSkgdmVyaWZpZXMgdGhlIHJ1bm5pbmcgYXBwXG4gICAqIHZlcnNpb24gbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4gXHUyMDE0IHRocm93aW5nIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn0gb25cbiAgICogYSBzaWxlbnQgZmFsbGJhY2sgKHdoZW4gZW5hYmxlZCk7IGFuZCAoMikgcnVucyB0aGUgYmVzdC1lZmZvcnQgcnVudGltZS1FbGVjdHJvblxuICAgKiBuYWcuIE9ubHkgdGhlIGFzYXItZmFsbGJhY2sgY2hlY2sgY2FuIHRocm93LCBzbyB0aGlzIG11c3QgcnVuIG91dHNpZGUgdGhlXG4gICAqIHJlYWRpbmVzcyBwb2xsJ3MgdHJ5L2NhdGNoIChhIHN3YWxsb3dlZCB0aHJvdyB3b3VsZCBsb29wIHVudGlsIHRpbWVvdXQpLlxuICAgKlxuICAgKiBCb3RoIGFyZSByZWFkIGF0IHRoZSByZW5kZXJlciB0b3AgbGV2ZWw6IGBpcGNSZW5kZXJlci5zZW5kU3luYygndmVyc2lvbicpYCAodGhlXG4gICAqIHJ1bm5pbmcgYXBwIHZlcnNpb24sIHRydXRoZnVsIGV2ZW4gdW5kZXIgYSBzaWxlbnQgYXNhciBmYWxsYmFjaykgYW5kXG4gICAqIGBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uYCAodGhlIGxpdmUgc2hlbGwgRWxlY3Ryb24pOyBuZWl0aGVyIHVzZXNcbiAgICogYHJlcXVpcmUoJ29ic2lkaWFuJylgLCB3aGljaCByZXNvbHZlcyBvbmx5IGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEEgcmVhZFxuICAgKiBmYWlsdXJlIGxlYXZlcyBib3RoIHVua25vd24gKGxvZ2dlZCwgbm9uLWZhdGFsKSBcdTIwMTQgYW4gdW5yZWFkYWJsZSBydW5uaW5nIHZlcnNpb25cbiAgICogY2Fubm90IGJlIGp1ZGdlZCBhIGZhbGxiYWNrLCBzbyB0aGUgYm9vdCBpcyBub3QgYnJva2VuIGJ5IGEgZmxha3kgcmVhZC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1J1bnRpbWVDb21wYXRpYmlsaXR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYWN0dWFsRWxlY3Ryb25WZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0FwcFZlcnNpb24gPSBhd2FpdCB0aGlzLmV2YWx1YXRlKCdTdHJpbmcod2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKFxcJ3ZlcnNpb25cXCcpKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICBhcHBWZXJzaW9uID0gcmF3QXBwVmVyc2lvbiA9PT0gJycgfHwgcmF3QXBwVmVyc2lvbiA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiByYXdBcHBWZXJzaW9uO1xuICAgICAgYWN0dWFsRWxlY3Ryb25WZXJzaW9uID0gYXdhaXQgdGhpcy5ldmFsdWF0ZSgnU3RyaW5nKHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24pJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IHJlYWQgcnVudGltZSB2ZXJzaW9ucyAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cblxuICAgIC8vIEZhaWxzIGZhc3QgKHdoZW4gZW5hYmxlZCkgb24gYSBzaWxlbnQgYXNhciBmYWxsYmFjayBcdTIwMTQgTVVTVCBydW4gYmVmb3JlIHRoZVxuICAgIC8vIEJlc3QtZWZmb3J0IG5hZyBhbmQgb3V0c2lkZSBhbnkgdHJ5L2NhdGNoIHNvIHRoZSB0aHJvdyBlc2NhcGVzIHRoZSBwb2xsLlxuICAgIHRoaXMuY2hlY2tSdW50aW1lQXNhckZhbGxiYWNrKGFwcFZlcnNpb24pO1xuICAgIHRoaXMuYXBwbHlFbGVjdHJvbkNvbXBhdGliaWxpdHkoYXBwVmVyc2lvbiwgYWN0dWFsRWxlY3Ryb25WZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0cyB0byBhIENEUCB0YXJnZXQncyBXZWJTb2NrZXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgQ0RQIHRhcmdldCB0byBjb25uZWN0IHRvLlxuICAgKiBAcmV0dXJucyBUaGUgb3BlbiBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvVGFyZ2V0KHRhcmdldDogQ2RwVGFyZ2V0KTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodGFyZ2V0LndlYlNvY2tldERlYnVnZ2VyVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCB0byBDRFAgdGFyZ2V0OiAke3RhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybH1gKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy53cyA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVWYXVsdFBhdGggPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBBY3RzIGFzIGEgc2FmZXR5IG5ldCB3aGVuIGBlbmFibGUtcGx1Z2luLTxpZD5gIGlzIHdyaXR0ZW4gaW4gb25lIHJlbmRlcmVyXG4gICAqIGJ1dCBub3QgeWV0IHZpc2libGUgdG8gdGhlIG5ld2x5LW9wZW5lZCB2YXVsdCdzIHJlbmRlcmVyIChyYWNlIG9ic2VydmVkXG4gICAqIGluIE9ic2lkaWFuIDEuMTMuMCkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgIGlmIChyZXN1bHQgPT09ICd0cnVlJykge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gRGlzbWlzc2VkIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3JcIiBkaWFsb2cuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYGVuYWJsZS1wbHVnaW4tPHZhdWx0SWQ+YCBpbiBPYnNpZGlhbidzIGxvY2FsU3RvcmFnZSB0byBwcmV2ZW50XG4gICAqIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGZyb20gYXBwZWFyaW5nXG4gICAqIHdoZW4gYSB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgdmF1bHQtb3BlbmAgSVBDIChzbyB0aGUgdmF1bHQgSUQgZXhpc3RzIGluXG4gICAqIGBvYnNpZGlhbi5qc29uYCkgYW5kIGJlZm9yZSB0aGUgbmV3IHZhdWx0IHdpbmRvdyBmaW5pc2hlcyBsb2FkaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gd3MgLSBBbiBvcGVuIFdlYlNvY2tldCB0byBhbiBleGlzdGluZyBPYnNpZGlhbiB0YXJnZXQuXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2Uod3M6IFdlYlNvY2tldCwgdmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgZXhwcmVzc2lvbjogYGxvY2FsU3RvcmFnZS5zZXRJdGVtKCR7SlNPTi5zdHJpbmdpZnkoYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWApfSwgJ3RydWUnKTtgLFxuICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgIH0pO1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFNldCBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH0gaW4gbG9jYWxTdG9yYWdlLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlcmUgaXMgYW4gYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldC5cbiAgICpcbiAgICogUmV1c2VzIHRoZSBleGlzdGluZyBjb25uZWN0aW9uIGlmIGl0IHRhcmdldHMgdGhlIHJlcXVlc3RlZCB2YXVsdC5cbiAgICogT3RoZXJ3aXNlLCBmaW5kcyB0aGUgY29ycmVjdCB0YXJnZXQgYW5kIHJlY29ubmVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byB0YXJnZXQuXG4gICAqIEByZXR1cm5zIFRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbm5lY3Rpb24odmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdlYlNvY2tldD4ge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTiAmJiB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICByZXR1cm4gdGhpcy53cztcbiAgICB9XG5cbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgdGhpcy53cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgdGhpcy5hY3RpdmVWYXVsdFBhdGggPSB2YXVsdFBhdGg7XG4gICAgcmV0dXJuIHRoaXMud3M7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gd2l0aCBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgIGFuZCBwb2xscyB1bnRpbCBDRFAgYmVjb21lcyBhdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZU9ic2lkaWFuUnVubmluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBPYnNpZGlhbiBDRFAgbm90IHJlYWNoYWJsZS4gU3RhcnRpbmcgT2JzaWRpYW4gd2l0aCByZW1vdGUgZGVidWdnaW5nLi4uJyk7XG5cbiAgICBjb25zdCBsYXVuY2hDb21tYW5kID0gYXdhaXQgZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKHRoaXMuY2RwUG9ydCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMobGF1bmNoQ29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgQ0RQIGVuZHBvaW50IGF0ICR7dGhpcy5jZHBVcmx9ICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0RQIHJlYWR5LCAke1N0cmluZyh0YXJnZXRzLmxlbmd0aCl9IHRhcmdldChzKSBmb3VuZC5gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBDRFAgbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBFbnN1cmUgT2JzaWRpYW4gaXMgaW5zdGFsbGVkIGFuZCBhY2Nlc3NpYmxlLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBDRFAgdGFyZ2V0IHRoYXQgaGFzIHRoZSBnaXZlbiB2YXVsdCBvcGVuLlxuICAgKlxuICAgKiBQcm9iZXMgZXZlcnkgdGFyZ2V0IGJ5IGV2YWx1YXRpbmcgYGdldEJhc2VQYXRoKClgIGFuZCByZXR1cm5zIHRoZSBvbmUgd2hvc2VcbiAgICogYmFzZSBwYXRoIG1hdGNoZXMgYHZhdWx0UGF0aGAgKHZpYSB7QGxpbmsgYXJlVmF1bHRQYXRoc01hdGNoaW5nfSwgdG9sZXJhbnQgb2ZcbiAgICogc2VwYXJhdG9yL2Nhc2UgZGlmZmVyZW5jZXMpLiBBIHNpbmdsZSB0YXJnZXQgaXMgKipub3QqKiByZXR1cm5lZCBibGluZGx5OiB3aXRoXG4gICAqIG1vcmUgdGhhbiBvbmUgdmF1bHQgb3BlbiAoYXR0YWNoIG1vZGUncyBzaGFyZWQgaW5zdGFuY2UpLCB0aGUgc29sZS10YXJnZXRcbiAgICogc2hvcnRjdXQgd291bGQgcmV0dXJuIHdoaWNoZXZlciB3aW5kb3cgaGFwcGVucyB0byBiZSBvcGVuIHJlZ2FyZGxlc3Mgb2Ygd2hpY2hcbiAgICogdmF1bHQgd2FzIHJlcXVlc3RlZCBcdTIwMTQgdGhlIGV4YWN0IG1pcy1yb3V0aW5nIHRoaXMgbWV0aG9kIG11c3QgYXZvaWQuIEEgdGFyZ2V0XG4gICAqIHdob3NlIHByb2JlIHRocm93cyBpcyB0cmVhdGVkIGFzIG5vdC1yZWFkeSBhbmQgc2tpcHBlZCAodGhlIGNhbGxlcidzIHJlYWRpbmVzc1xuICAgKiBwb2xsIHJldHJpZXMpOyBhIHRhcmdldCB3aG9zZSBwcm9iZSBzdWNjZWVkcyBidXQgZG9lcyBub3QgbWF0Y2ggaXMgbmV2ZXJcbiAgICogcmV0dXJuZWQuIFdoZW4gbm90aGluZyBtYXRjaGVzLCB0aHJvdyBzbyB0aGUgY2FsbGVyIGtlZXBzIHBvbGxpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBtYXRjaC5cbiAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIENEUCB0YXJnZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8Q2RwVGFyZ2V0PiB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcblxuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBPYnNpZGlhbiBDRFAgdGFyZ2V0cyBmb3VuZCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gYXdhaXQgdGhpcy5wcm9iZVZhdWx0UGF0aCh0YXJnZXQpO1xuICAgICAgICBpZiAoYXJlVmF1bHRQYXRoc01hdGNoaW5nKGJhc2VQYXRoLCB2YXVsdFBhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vdCBhIHZhdWx0IHRhcmdldCBvciBub3QgcmVhZHkuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBDRFAgdGFyZ2V0IGZvdW5kIGZvciB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgbGlzdCBvZiBwYWdlLXR5cGUgdGFyZ2V0cyBmcm9tIHRoZSBDRFAgYC9qc29uYCBlbmRwb2ludC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgcGFnZSB0YXJnZXRzLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBubyBDRFAgZW5kcG9pbnQgaXMgY29uZmlndXJlZCB5ZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFBhZ2VUYXJnZXRzKCk6IFByb21pc2U8Q2RwVGFyZ2V0W10+IHtcbiAgICBpZiAoIXRoaXMuY2RwVXJsKSB7XG4gICAgICAvLyBBbiBvd25lZCBpbnN0YW5jZSBwaWNrcyBpdHMgcG9ydCBhdCBsYXVuY2gsIHNvIGJlZm9yZSBgcmVnaXN0ZXJWYXVsdGAgdGhlcmUgaXMgbm8gZW5kcG9pbnQgYW5kXG4gICAgICAvLyBgdGhpcy5jZHBVcmxgIGlzIHN0aWxsIGVtcHR5IC0tIHdoaWNoIHVzZWQgdG8gbWFrZSB0aGlzIGEgYGZldGNoKCcvanNvbicpYCBhbmQgZmFpbCB3aXRoXG4gICAgICAvLyBgRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tIC9qc29uYCwgYW4gZXJyb3IgbmFtaW5nIG5laXRoZXIgdGhlIHRyYW5zcG9ydCBub3Igd2hhdCB3ZW50IHdyb25nLlxuICAgICAgLy8gQSB0cmFuc3BvcnQgaW4gdGhpcyBzdGF0ZSBpcyBhbHdheXMgYSBzeW1wdG9tIG9mIHNvbWV0aGluZyB1cHN0cmVhbSAoYSBmYWlsZWQgZ2xvYmFsIHNldHVwLCBhXG4gICAgICAvLyBXb3JrZXIgd2l0aCBubyByZWdpc3RlcmVkIHJlc29sdmVycyAtLSBMOSksIHNvIHNheSBzbyByYXRoZXIgdGhhbiByZXBvcnQgYSBtYWxmb3JtZWQgVVJMLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTm8gQ0RQIGVuZHBvaW50IGNvbmZpZ3VyZWQ6IHRoZSBvd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBoYXMgbm90IGJlZW4gbGF1bmNoZWQgeWV0LCBhbmQgbm8gYHBvcnRgICdcbiAgICAgICAgICArICd3YXMgZ2l2ZW4gdG8gYXR0YWNoIHRvIGEgcnVubmluZyBvbmUuIEEgdGVzdCB3b3JrZXIgaW4gdGhpcyBzdGF0ZSB1c3VhbGx5IG1lYW5zIGl0cyBnbG9iYWwgc2V0dXAgJ1xuICAgICAgICAgICsgJ2ZhaWxlZCwgb3IgdGhlIHByb2plY3QgaXMgbWlzc2luZyB0aGUgcGVyLXdvcmtlciBzZXR1cCBmaWxlIGluIGBzZXR1cEZpbGVzYC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5jZHBVcmx9L2pzb25gKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLypcbiAgICAgICAqIEFuIHVucmVhY2hhYmxlIGVuZHBvaW50IG1lYW5zIGRpZmZlcmVudCB0aGluZ3MgaW4gdGhlIHR3byBtb2RlcywgYW5kXG4gICAgICAgKiBjb25mbGF0aW5nIHRoZW0gaXMgd2hhdCBwcm9kdWNlZCB0aGUgYEVDT05OUkVGVVNFRGAgY2FzY2FkZXMuIFRoZVxuICAgICAgICogaGFybmVzcyBvd25zIHRoaXMgcG9ydCBhbmQgbm90aGluZyBlbHNlIG1heSBob2xkIGl0LCBzbyBub3RoaW5nXG4gICAgICAgKiBhbnN3ZXJpbmcgbWVhbnMgT1VSIGluc3RhbmNlIGlzIGdvbmUgXHUyMDE0IHNheSB0aGF0LCB3aXRoIGl0cyBleGl0IGNvZGVcbiAgICAgICAqIHdoZW4gaXQgaXMga25vd24uIEluIHBsYWluIGF0dGFjaCBtb2RlIHRoZSBlbmRwb2ludCBiZWxvbmdzIHRvIGFcbiAgICAgICAqIGZvcmVpZ24gT2JzaWRpYW4gdGhhdCBpcyBzaW1wbHkgbm90IHJ1bm5pbmcsIHdoaWNoIGBlbnN1cmVPYnNpZGlhblJ1bm5pbmdgXG4gICAgICAgKiBoYW5kbGVzIGJ5IHN0YXJ0aW5nIG9uZTsgdGhhdCBwYXRoIG11c3Qga2VlcCBzZWVpbmcgdGhlIHJhdyBmYWlsdXJlLlxuICAgICAgICovXG4gICAgICBpZiAodGhpcy5vd25lZENvbmZpZyB8fCB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5idWlsZE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2RwVGFyZ2V0W107XG4gICAgcmV0dXJuIHRhcmdldHMuZmlsdGVyKCh0KSA9PiB0LnR5cGUgPT09ICdwYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogS2lsbHMgdGhlIGN1cnJlbnRseS1ydW5uaW5nIG93bmVkIGluc3RhbmNlIChpZiBhbnkpIGFuZCB3YWl0cyBmb3IgaXQgdG8gZXhpdCxcbiAgICogc28gdGhlIG5leHQgbGF1bmNoIGdldHMgYSBwcmlzdGluZSBzaW5nbGUtd2luZG93IGluc3RhbmNlLlxuICAgKlxuICAgKiBSZWxhdW5jaGluZyBvdmVyIGEgbGl2ZSBpbnN0YW5jZSBpcyBmb3J3YXJkZWQgYnkgRWxlY3Ryb24ncyBzaW5nbGUtaW5zdGFuY2VcbiAgICogbG9jayBvbiB0aGUgc2hhcmVkIHVzZXItZGF0YSBkaXJlY3RvcnkgYW5kIHN1cmZhY2VzIHRoZSB2YXVsdCBwaWNrZXIsIGFuZCBvcGVuaW5nIGFcbiAgICogc2Vjb25kIHdpbmRvdyB2aWEgSVBDIGxlYXZlcyBzdGFsZSB3aW5kb3dzIHRoYXQgYnJlYWsgdmF1bHQtdGFyZ2V0IHJvdXRpbmcgXHUyMDE0XG4gICAqIGhlbmNlIGEgZnVsbCBraWxsICsgd2FpdC1mb3ItZXhpdCAocmVsZWFzaW5nIHRoZSBsb2NrKSBiZXR3ZWVuIGxhdW5jaGVzLiBBXG4gICAqIG5vLW9wIG9uIHRoZSBmaXJzdCBhdHRlbXB0LCB3aGVuIG5vIGluc3RhbmNlIGlzIHJ1bm5pbmcgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBraWxsUnVubmluZ093bmVkSW5zdGFuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm93bmVkSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gS2lsbGluZyBydW5uaW5nIG93bmVkIGluc3RhbmNlIGJlZm9yZSAocmUpbGF1bmNoLicpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IHByZXZpb3VzQ2RwVXJsID0gdGhpcy5jZHBVcmw7XG4gICAgdGhpcy5vd25lZEluc3RhbmNlLmtpbGwoKTtcbiAgICB0aGlzLm93bmVkSW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9ySW5zdGFuY2VFeGl0KHByZXZpb3VzQ2RwVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgb3duZWQgaW5zdGFuY2UncyB3aW5kb3cgb2ZmLXNjcmVlbiBzbyBhIGhpZGRlbiBydW4gbmV2ZXIgc3RlYWxzXG4gICAqIGZvY3VzLiBVc2VzIEVsZWN0cm9uJ3MgcmVtb3RlIGJyaWRnZSAoYHdpbmRvdy5lbGVjdHJvbi5yZW1vdGVgKSBcdTIwMTQgdGhlIG9ubHlcbiAgICogY3Jvc3MtcGxhdGZvcm0gd2F5IHRvIHJlcG9zaXRpb24gdGhlIHdpbmRvdyBcdTIwMTQgcGxhY2luZyBpdCBqdXN0IGJleW9uZCB0aGVcbiAgICogcmlnaHQgZWRnZSBvZiBhbGwgZGlzcGxheXMuIFRoZSB3aW5kb3cgc3RheXMgXCJ2aXNpYmxlXCIgdG8gQ2hyb21pdW0gKHNvXG4gICAqIHRpbWVycywgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAsIGA6aG92ZXJgLCBhbmQgdHJ1c3RlZCBpbnB1dCBrZWVwIHdvcmtpbmcpLFxuICAgKiB1bmxpa2UgbWluaW1pemluZywgd2hpY2ggd291bGQgZnJlZXplIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLlxuICAgKlxuICAgKiBUaGUgcmVtb3RlIGJyaWRnZSBpcyBub3QgYXZhaWxhYmxlIHRoZSBpbnN0YW50IENEUCBzdGFydHMgc2VydmluZywgc28gdGhpc1xuICAgKiBwb2xscyB1bnRpbCB0aGUgbW92ZSBzdWNjZWVkcy4gQmVzdC1lZmZvcnQ6IGlmIHRoZSB3aW5kb3cgY2Fubm90IGJlIG1vdmVkXG4gICAqIHdpdGhpbiB0aGUgdGltZW91dCwgdGhlIGtlZXAtYWxpdmUgbGF1bmNoIGZsYWdzIHN0aWxsIGFwcGx5IGFuZCB0aGUgcnVuXG4gICAqIHByb2NlZWRzICh3b3JzdCBjYXNlIHRoZSB3aW5kb3cgaXMgYnJpZWZseSB2aXNpYmxlKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW92ZU93bmVkV2luZG93T2Zmc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmUgdGhlIEVsZWN0cm9uIHJlbW90ZSBicmlkZ2UgdHdvIHdheXMgc28gQk9USCBtb2Rlcm4gYW5kIG9sZCBPYnNpZGlhblxuICAgIC8vIENhbiBiZSBtb3ZlZCBvZmYtc2NyZWVuOiBtb2Rlcm4gaW5qZWN0cyBgd2luZG93LmVsZWN0cm9uLnJlbW90ZWA7IG9sZFxuICAgIC8vIFZlcnNpb25zIChubyBgd2luZG93LmVsZWN0cm9uYCkgc3RpbGwgZXhwb3NlIHRoZSBidWlsdC1pbiBgcmVtb3RlYCBtb2R1bGUgdmlhXG4gICAgLy8gYHJlcXVpcmUoJ2VsZWN0cm9uJylgIGluIHRoZSBub2RlLWludGVncmF0ZWQgcmVuZGVyZXIgKHJlbW92ZWQgZnJvbSBFbGVjdHJvblxuICAgIC8vIDE0KywgYnV0IHByZXNlbnQgb24gdGhlIEVsZWN0cm9uIDgtMTMgc2hlbGxzIG9sZCBPYnNpZGlhbiBzaGlwcykuIFJldHVybmluZ1xuICAgIC8vIGBtb3ZlZGAgb24gdGhlIGZpcnN0IHN1Y2Nlc3MgaXMgaW1wb3J0YW50IG9uIEVsZWN0cm9uIDEwLWVyYSBidWlsZHM6IHBvbGxpbmdcbiAgICAvLyBPbiB3aXRob3V0IGEgcmVzb2x2YWJsZSBicmlkZ2UgaGFtbWVycyB0aGUgcmVuZGVyZXIgd2l0aCBDRFAgcm91bmQtdHJpcHNcbiAgICAvLyBEdXJpbmcgYm9vdCBhbmQgaW50ZXJtaXR0ZW50bHkgcHJldmVudHMgdGhlIHdvcmtzcGFjZSBmcm9tIGluaXRpYWxpemluZy5cbiAgICBjb25zdCBtb3ZlRXhwcmVzc2lvbiA9IGAoKCkgPT4ge1xuICAgICAgbGV0IHJlbW90ZSA9ICh3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLnJlbW90ZSkgfHwgbnVsbDtcbiAgICAgIGlmICghcmVtb3RlKSB7XG4gICAgICAgIHRyeSB7IHJlbW90ZSA9IHJlcXVpcmUoJ2VsZWN0cm9uJykucmVtb3RlIHx8IG51bGw7IH0gY2F0Y2ggKHJlcXVpcmVFcnJvcikgeyByZW1vdGUgPSBudWxsOyB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlbW90ZSB8fCB0eXBlb2YgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3cgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2Ygd2luZG93LmFwcCA9PT0gJ3VuZGVmaW5lZCcpID8gJ25vdC1yZWFkeScgOiAnbm8tYnJpZGdlJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdpbiA9IHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCk7XG4gICAgICBjb25zdCBkaXNwbGF5cyA9IHJlbW90ZS5zY3JlZW4uZ2V0QWxsRGlzcGxheXMoKTtcbiAgICAgIGNvbnN0IG1heFJpZ2h0ID0gTWF0aC5tYXgoLi4uZGlzcGxheXMubWFwKChkaXNwbGF5KSA9PiBkaXNwbGF5LmJvdW5kcy54ICsgZGlzcGxheS5ib3VuZHMud2lkdGgpKTtcbiAgICAgIHdpbi5zZXRQb3NpdGlvbihtYXhSaWdodCArICR7U3RyaW5nKE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyl9LCAwKTtcbiAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH0pKClgO1xuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3RhcmdldF0gPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IG1vdmVFeHByZXNzaW9uLFxuICAgICAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUgPT09ICdtb3ZlZCcpIHtcbiAgICAgICAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gTW92ZWQgb3duZWQgT2JzaWRpYW4gd2luZG93IG9mZi1zY3JlZW4gKGhpZGRlbiBtb2RlKS4nKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIENEUCBlbmRwb2ludCAvIHRhcmdldCAvIHJlbW90ZSBicmlkZ2Ugbm90IHJlYWR5IHlldCBcdTIwMTQga2VlcCBwb2xsaW5nLlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoT1dORURfV0lORE9XX0hJREVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgbW92ZSBvd25lZCB3aW5kb3cgb2ZmLXNjcmVlbiB3aXRoaW4gJHtTdHJpbmcoT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zIChub24tZmF0YWw7IGtlZXAtYWxpdmUgZmxhZ3Mgc3RpbGwgYXBwbGllZCkuYCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBjb25maWctZm9sZGVyIG92ZXJyaWRlIGludG8gdGhlIHN0YXJ0ZXIgc2NyZWVuJ3MgYGxvY2FsU3RvcmFnZWBcbiAgICogYW5kIHRoZW4gb3BlbnMgdGhlIHZhdWx0IGZyb20gdGhlcmUgb3ZlciB0aGUgYHZhdWx0LW9wZW5gIElQQy5cbiAgICpcbiAgICogT2JzaWRpYW4gcmVhZHMgdGhlIG92ZXJyaWRlIGV4YWN0bHkgb25jZSwgaW4gdGhlIHZhdWx0J3Mgb3duIHJlbmRlcmVyLCBkdXJpbmdcbiAgICogYFZhdWx0LnNldHVwYCBcdTIwMTQgYGdldE92ZXJyaWRlQ29uZmlnRGlyKGFwcElkKWAgaXMgYGxvY2FsU3RvcmFnZS5nZXRJdGVtKGFwcElkICtcbiAgICogJy1jb25maWcnKWAuIFNvIHRoZXJlIGlzIG5vIHdyaXRpbmcgaXQgaW50byB0aGUgdmF1bHQncyB3aW5kb3c6IGJ5IHRoZSB0aW1lXG4gICAqIHRoYXQgd2luZG93IGV4aXN0cyB0aGUgcmVhZCBoYXMgaGFwcGVuZWQuIFRoZSBzdGFydGVyIHNjcmVlbiBpcyB0aGUgZWFybGllclxuICAgKiByZW5kZXJlciB0aGUgd3JpdGUgbmVlZHMsIGFuZCBpdCBxdWFsaWZpZXMgYmVjYXVzZSBpdCBoYXMgYGxvY2FsU3RvcmFnZWAgYW5kXG4gICAqIGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXJgIGJ1dCBubyBgYXBwYCAodmVyaWZpZWQgb24gMS4xMy43KS5cbiAgICpcbiAgICogVGhhdCBtaXNzaW5nIGBhcHBgIGlzIGFsc28gd2h5IHRoaXMgdGFsa3MgcmF3IENEUCByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoXG4gICAqIHtAbGluayBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWR9IC8gdGhlIGBpcGNTZW5kU3luY2AgaGVscGVyIGFzXG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0Lm9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlfSBkb2VzOiBldmVyeSBvbmUgb2ZcbiAgICogdGhvc2UgcGF0aHMgcHJvYmVzIGBhcHAudmF1bHQuYWRhcHRlcmAgdG8gaWRlbnRpZnkgaXRzIHRhcmdldCwgYW5kIHdvdWxkIGZhaWxcbiAgICogb24gdGhlIHZlcnkgcmVuZGVyZXIgdGhpcyBuZWVkcy5cbiAgICpcbiAgICogVGhlIGtleSBuYW1lIGlzIGtub3duIGFoZWFkIG9mIHRoZSB3cml0ZSBiZWNhdXNlIHRoZSBoYXJuZXNzIHJlZ2lzdGVyZWQgdGhlXG4gICAqIHZhdWx0IHVuZGVyIGFuIGlkIGl0IGdlbmVyYXRlZCBpdHNlbGYsIGFuZCBgdmF1bHQtb3BlbmAgcmV1c2VzIHRoYXQgZW50cnlcbiAgICogcmF0aGVyIHRoYW4gbWludGluZyBhIG5ldyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKiBAcGFyYW0gdmF1bHRJZCAtIFRoZSBoYXJuZXNzLWdlbmVyYXRlZCB2YXVsdCBpZCB0aGUgdmF1bHQgaXMgcmVnaXN0ZXJlZCB1bmRlci5cbiAgICogQHBhcmFtIGNvbmZpZ0RpcmVjdG9yeSAtIFRoZSBjb25maWcgZm9sZGVyIHRvIG92ZXJyaWRlIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuVmF1bHRGcm9tU3RhcnRlclNjcmVlbih2YXVsdFBhdGg6IHN0cmluZywgdmF1bHRJZDogc3RyaW5nLCBjb25maWdEaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFNlZWRpbmcgY29uZmlnIGZvbGRlciBvdmVycmlkZSAke2NvbmZpZ0RpcmVjdG9yeX0gb24gdGhlIHN0YXJ0ZXIgc2NyZWVuLi4uYCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnRlclNjcmVlblRhcmdldCgpO1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGAke3ZhdWx0SWR9LWNvbmZpZ2ApfSwgJHtKU09OLnN0cmluZ2lmeShjb25maWdEaXJlY3RvcnkpfSk7YCxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgZXhwcmVzc2lvbjogYGxvY2FsU3RvcmFnZS5zZXRJdGVtKCR7SlNPTi5zdHJpbmdpZnkoYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWApfSwgJ3RydWUnKTtgLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFNldCAke3ZhdWx0SWR9LWNvbmZpZyBhbmQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGV4cHJlc3Npb246IGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZhdWx0LW9wZW4nLCAke0pTT04uc3RyaW5naWZ5KHZhdWx0UGF0aCl9LCBmYWxzZSlgLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFNlbnQgdmF1bHQtb3BlbiBmb3IgJHt2YXVsdFBhdGh9IGZyb20gdGhlIHN0YXJ0ZXIgc2NyZWVuLmApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIHZhdWx0IGluIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZSB2aWEgdGhlIGB2YXVsdC1vcGVuYFxuICAgKiBFbGVjdHJvbiBJUEMgKGV2YWx1YXRlZCB0aHJvdWdoIENEUCBvbiBhbiBleGlzdGluZyB0YXJnZXQpLCB0aGVuIHBvbGxzIHVudGlsXG4gICAqIHRoZSBuZXcgdmF1bHQncyB3aW5kb3cgdGFyZ2V0IGFwcGVhcnMsIGlzIGxheW91dC1yZWFkeSwgYW5kIGl0cyB0cnVzdCBkaWFsb2dcbiAgICogKGlmIGFueSkgaGFzIGJlZW4gZGlzbWlzc2VkLlxuICAgKlxuICAgKiBTaGFyZWQgYnkgdGhlIGF0dGFjaC1tb2RlIHtAbGluayByZWdpc3RlclZhdWx0fSBhbmQgdGhlIG93bmVkLW1vZGVcbiAgICogXCJpbnN0YW5jZSBhbHJlYWR5IGxhdW5jaGVkXCIgcGF0aCwgc28gb3BlbmluZyBhbiBhZGRpdGlvbmFsIHZhdWx0IG5ldmVyXG4gICAqIHJlbGF1bmNoZXMgdGhlIHByb2Nlc3MgKHdoaWNoIHdvdWxkIHN1cmZhY2UgdGhlIHZhdWx0IHBpY2tlcikuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuVmF1bHRJblJ1bm5pbmdJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBPYnNpZGlhbiBDRFAgdGFyZ2V0cyBhdmFpbGFibGUuIElzIE9ic2lkaWFuIHJ1bm5pbmc/Jyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGB2YXVsdC1vcGVuYCBJUEMgaXMgc2VudCB0aHJvdWdoIGFuIEVYSVNUSU5HIHdpbmRvdyAoYHRhcmdldHNbMF1gKSwgc28gdGhlXG4gICAgLy8gSGVscGVyIG5hbWVzcGFjZSBtdXN0IGJlIGJvb3RzdHJhcHBlZCBvbiBUSEFUIHdpbmRvdyBcdTIwMTQgbm90IG9uIGB2YXVsdFBhdGhgLCB3aG9zZVxuICAgIC8vIFdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQuIEJvb3RzdHJhcHBpbmcgYWdhaW5zdCBgdmF1bHRQYXRoYCBoZXJlIHdvdWxkIHJvdXRlXG4gICAgLy8gVGhyb3VnaCBgZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aClgIHdpdGggb25seSB0aGUgZXhpc3Rpbmcgd2luZG93IHByZXNlbnQgYW5kXG4gICAgLy8gUG9pc29uIHRoZSBjb25uZWN0aW9uIGNhY2hlIChsYWJlbCBgdmF1bHRQYXRoYCwgc29ja2V0IFx1MjE5MiB0aGUgZXhpc3Rpbmcgd2luZG93KSwgc29cbiAgICAvLyBFdmVyeSBsYXRlciBldmFsIGZvciBgdmF1bHRQYXRoYCB3b3VsZCBtaXMtcm91dGUgdG8gdGhlIGV4aXN0aW5nIHdpbmRvdy4gUHJvYmUgdGhlXG4gICAgLy8gRXhpc3Rpbmcgd2luZG93J3Mgb3duIGJhc2UgcGF0aCBhbmQgYm9vdHN0cmFwIGFnYWluc3QgdGhhdCBpbnN0ZWFkLlxuICAgIGNvbnN0IGV4aXN0aW5nVGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSk7XG4gICAgY29uc3QgZXhpc3RpbmdWYXVsdFBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKGV4aXN0aW5nVGFyZ2V0KTtcbiAgICBjb25zdCBpcGNXcyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KGV4aXN0aW5nVGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IGlwY0V4cHJlc3Npb24gPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWw6ICd2YXVsdC1vcGVuJywgY2hhbm5lbEFyZ3VtZW50czogW3ZhdWx0UGF0aCwgZmFsc2VdIH0pfSlgO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChpcGNXcywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgZXhwcmVzc2lvbjogaXBjRXhwcmVzc2lvbixcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKGlwY1dzLCB2YXVsdFBhdGgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpcGNXcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHRhcmdldCAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIFZhdWx0IHRhcmdldCBmb3VuZC4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IHRhcmdldCBub3QgcmVhZHkgeWV0LlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGVzIHRoZSB2YXVsdCByZW5kZXJlcidzIGJvb3RzdHJhcCBzdGF0ZSBcdTIwMTQgd2hldGhlciB0aGUgZG9jdW1lbnQgaXNcbiAgICogYGNvbXBsZXRlYCwgd2hldGhlciBgd2luZG93LmFwcGAgZXhpc3RzLCBhbmQgdGhlIGA8Ym9keT5gIGNoaWxkIGNvdW50IFx1MjAxNCBmcm9tXG4gICAqIHRoZSBmaXJzdCBwYWdlIHRhcmdldCwgZm9yIGRlYWQtYm9vdCBkZXRlY3Rpb24uIFRoaXMgd29ya3MgZXZlbiB3aGVuIHRoZSBhcHBcbiAgICogbmV2ZXIgYm9vdHN0cmFwcGVkICh0aGUgcmVuZGVyZXIgcGFnZSB0YXJnZXQgc3RpbGwgZXhpc3RzKSwgd2hpY2ggaXMgZXhhY3RseVxuICAgKiB0aGUgc3RhdGUgaXQgbXVzdCBvYnNlcnZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2FtcGxlZCBvYnNlcnZhdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyB0YXJnZXQgaXMgcmVhY2hhYmxlXG4gICAqICAgb3IgdGhlIHByb2JlIGZhaWxlZCAoc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nIHJhdGhlciB0aGFuIGZhc3QtZmFpbGluZykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2JlUmVuZGVyZXJCb290U3RhdGUoKTogUHJvbWlzZTxSZW5kZXJlckJvb3RPYnNlcnZhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2JlRXhwcmVzc2lvbiA9IGBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYm9keUNoaWxkRWxlbWVudENvdW50OiBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keS5jaGlsZEVsZW1lbnRDb3VudCA6IDAsXG4gICAgICAgICAgaGFzV2luZG93QXBwOiB0eXBlb2Ygd2luZG93LmFwcCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgaXNEb2N1bWVudENvbXBsZXRlOiBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnXG4gICAgICAgIH0pYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBleHByZXNzaW9uOiBwcm9iZUV4cHJlc3Npb24sXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgUmVuZGVyZXJCb290T2JzZXJ2YXRpb247XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvYmVzIGEgdGFyZ2V0IHRvIGRpc2NvdmVyIHdoaWNoIHZhdWx0IHBhdGggaXQgaGFzIG9wZW4uXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgV2ViU29ja2V0IGNvbm5lY3Rpb24sIGV2YWx1YXRlcyBgZ2V0QmFzZVBhdGgoKWAsXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgQ0RQIHRhcmdldCB0byBwcm9iZS5cbiAgICogQHJldHVybnMgVGhlIHZhdWx0J3MgYmFzZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVZhdWx0UGF0aCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgICAgZXhwcmVzc2lvbjogJ2FwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoID8gYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IGFwcC52YXVsdC5hZGFwdGVyLmJhc2VQYXRoJyxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gU3RyaW5nKHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHdzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIGFuZCBjb25uZWN0cyB0byBhIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlIGZvciBhXG4gICAqIHZhdWx0OiBwcm92aXNpb25zIHRoZSBhc2FyIChpZiBhbnkpLCBwcmUtc2VlZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYFxuICAgKiBzbyB0aGUgdmF1bHQgb3BlbnMgZGlyZWN0bHksIGxhdW5jaGVzIHRoZSBpbnN0YW5jZSBvbiBhIGZyZWUgQ0RQIHBvcnQsIHRoZW5cbiAgICogd2FpdHMgdW50aWwgdGhlIHZhdWx0IHdpbmRvdyBpcyByZWFkeSBhbmQgZGlzbWlzc2VzIHRoZSB0cnVzdCBkaWFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclZhdWx0SW5Pd25lZEluc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25lZENvbmZpZyk7XG5cbiAgICBta2RpclN5bmMoY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBpZiAoY29uZmlnLmFzYXIpIHtcbiAgICAgIGNvcHlBc2FySW50b1VzZXJEYXRhKGNvbmZpZy5hc2FyLnBhdGgsIGNvbmZpZy5hc2FyLnZlcnNpb24sIGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmF1bHRJZCA9IHJhbmRvbUJ5dGVzKFZBVUxUX0lEX0JZVEVfTEVOR1RIKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAvLyBBIGNvbmZpZy1mb2xkZXIgb3ZlcnJpZGUgaXMgYSBgbG9jYWxTdG9yYWdlYCBlbnRyeSwgYW5kIGBsb2NhbFN0b3JhZ2VgIG5lZWRzIGFcbiAgICAvLyBSZW5kZXJlciwgc28gdGhlIHZhdWx0IG11c3QgTk9UIGF1dG8tb3BlbjogdGhlIGluc3RhbmNlIGJvb3RzIHRvIHRoZSBzdGFydGVyXG4gICAgLy8gU2NyZWVuLCB0aGUgb3ZlcnJpZGUgaXMgd3JpdHRlbiB0aGVyZSwgYW5kIHRoZSB2YXVsdCBpcyBvcGVuZWQgZnJvbSBpdCBvdmVyXG4gICAgLy8gSVBDLiBPYnNpZGlhbiByZXVzZXMgdGhlIHByZS1yZWdpc3RlcmVkIGlkIGZvciB0aGF0IG9wZW4gKHZlcmlmaWVkIG9uIDEuMTMuNyksXG4gICAgLy8gV2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgYDx2YXVsdElkPi1jb25maWdgIGtleSBuYW1lIGtub3dhYmxlIGJlZm9yZSBsYXVuY2guXG4gICAgY29uc3Qgc2hvdWxkQXV0b09wZW5WYXVsdCA9IHRoaXMuY29uZmlnRGlyZWN0b3J5ID09PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBSZWxhdW5jaC1yZXRyeTogc29tZSBvbGQgKEVsZWN0cm9uIDEwLWVyYSkgT2JzaWRpYW4gYnVpbGRzIGludGVybWl0dGVudGx5XG4gICAgLy8gQm9vdCB3aXRoIGB3aW5kb3cuYXBwYCBwcmVzZW50IGJ1dCB0aGUgd29ya3NwYWNlIG5ldmVyIGluaXRpYWxpemluZywgc28gdGhlXG4gICAgLy8gVmF1bHQgbmV2ZXIgYmVjb21lcyByZWFkeS4gQSBmcmVzaCBpbnN0YW5jZSBpcyBhbiBpbmRlcGVuZGVudCBjaGFuY2UuIEFcbiAgICAvLyBEZXRlcm1pbmlzdGljIGZhaWx1cmUgKGRlYWQgYm9vdCwgc2lsZW50IGFzYXIgZmFsbGJhY2spIGlzIHJlLXRocm93biBhdCBvbmNlIFx1MjAxNFxuICAgIC8vIFJldHJ5aW5nIGl0IG9ubHkgd2FzdGVzIHRoZSByZWFkaW5lc3MgdGltZW91dC5cbiAgICBsZXQgbGFzdEVycm9yOiB1bmtub3duO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgYXdhaXQgdGhpcy5raWxsUnVubmluZ093bmVkSW5zdGFuY2UoKTtcbiAgICAgIGlmIChhdHRlbXB0ID4gMSkge1xuICAgICAgICBhd2FpdCBkZWxheShPV05FRF9SRUxBVU5DSF9TRVRUTEVfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmUtc2VlZGVkIGV2ZXJ5IGF0dGVtcHQgcmF0aGVyIHRoYW4gb25jZSBiZWZvcmUgdGhlIGxvb3A6IE9ic2lkaWFuIHJld3JpdGVzXG4gICAgICAvLyBgb2JzaWRpYW4uanNvbmAgYXMgaXQgb3BlbnMgYSB2YXVsdCAoaXQgc3RhbXBzIHRoZSBlbnRyeSBgb3BlbjogdHJ1ZWApLCBzbyBhXG4gICAgICAvLyBSZWxhdW5jaCB0aGF0IGluaGVyaXRlZCB0aGUgcHJldmlvdXMgYXR0ZW1wdCdzIGZpbGUgd291bGQgc2FpbCBwYXN0IHRoZVxuICAgICAgLy8gU3RhcnRlciBzY3JlZW4gdGhlIG92ZXJyaWRlIG5lZWRzLlxuICAgICAgY29uc3Qgb2JzaWRpYW5Kc29uID0gYnVpbGRPd25lZE9ic2lkaWFuSnNvbih7IHNob3VsZEF1dG9PcGVuVmF1bHQsIHRzOiBEYXRlLm5vdygpLCB2YXVsdElkLCB2YXVsdFBhdGggfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5LCAnb2JzaWRpYW4uanNvbicpLCBKU09OLnN0cmluZ2lmeShvYnNpZGlhbkpzb24pKTtcblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2Uoe1xuICAgICAgICBjZHBIb3N0OiB0aGlzLmNkcEhvc3QsXG4gICAgICAgIGV4ZVBhdGg6IGNvbmZpZy5leGVQYXRoLFxuICAgICAgICBleHRyYUFyZ3VtZW50czogW1xuICAgICAgICAgIC4uLnJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyh0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlKSxcbiAgICAgICAgICAuLi5yZXNvbHZlU2FuZGJveExhdW5jaEFyZ3VtZW50cyh0aGlzLnNob3VsZERpc2FibGVTYW5kYm94KVxuICAgICAgICBdLFxuXG4gICAgICAgIHVzZXJEYXRhRGlyZWN0b3J5OiBjb25maWcudXNlckRhdGFEaXJlY3RvcnlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vd25lZEluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICB0aGlzLmNkcFBvcnQgPSBpbnN0YW5jZS5wb3J0O1xuICAgICAgdGhpcy5jZHBVcmwgPSBpbnN0YW5jZS5jZHBVcmw7XG5cbiAgICAgIGlmIChzaG91bGRIaWRlT2JzaWRpYW5BcHAodGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3ZlT3duZWRXaW5kb3dPZmZzY3JlZW4oKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFzaG91bGRBdXRvT3BlblZhdWx0KSB7XG4gICAgICAgICAgLy8gYHNob3VsZEF1dG9PcGVuVmF1bHRgIGlzIGEgYGNvbnN0YCBkZXJpdmVkIGZyb20gYHRoaXMuY29uZmlnRGlyZWN0b3J5ID09PSB1bmRlZmluZWRgLFxuICAgICAgICAgIC8vIFNvIFR5cGVTY3JpcHQgbmFycm93cyB0aGUgZmllbGQgdG8gYHN0cmluZ2AgaW4gdGhpcyBicmFuY2ggb24gaXRzIG93bi5cbiAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5WYXVsdEZyb21TdGFydGVyU2NyZWVuKHZhdWx0UGF0aCwgdmF1bHRJZCwgdGhpcy5jb25maWdEaXJlY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvck93bmVkVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFzc2VydFJlcXVlc3RlZENvbmZpZ0RpcmVjdG9yeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFybVBhcmVudExpdmVuZXNzV2F0Y2hkb2codmF1bHRQYXRoLCBpbnN0YW5jZS5wYXJlbnRMaXZlbmVzc1BvcnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAvLyBBIGNvbmZpZy1mb2xkZXIgZmFsbGJhY2sgaXMgZGV0ZXJtaW5pc3RpYyBcdTIwMTQgdGhlIG5hbWUgaXMgZWl0aGVyIG9uZSBPYnNpZGlhblxuICAgICAgICAvLyBBY2NlcHRzIG9yIGl0IGlzIG5vdCBcdTIwMTQgc28gcmVsYXVuY2hpbmcgb25seSBidXJucyBhbm90aGVyIGJvb3QuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JcbiAgICAgICAgICB8fCBlcnJvciBpbnN0YW5jZW9mIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yXG4gICAgICAgICAgfHwgZXJyb3IgaW5zdGFuY2VvZiBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPd25lZCB2YXVsdCBub3QgcmVhZHkgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFMpfSk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbGFzdEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBsYXN0RXJyb3IgOiBuZXcgRXJyb3IoYE93bmVkIHZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgQ0RQIGNvbW1hbmQgb3ZlciBXZWJTb2NrZXQgYW5kIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBwYXJhbSB3cyAtIFRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBDRFAgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUgQ0RQIHJlc3BvbnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kQ29tbWFuZCh3czogV2ViU29ja2V0LCBtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8Q2RwUmVzcG9uc2U+IHtcbiAgICBjb25zdCBpZCA9ICsrdGhpcy5tZXNzYWdlSWQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Q2RwUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICByZWplY3QobmV3IENkcENvbW1hbmRUaW1lb3V0RXJyb3IoeyBtZXRob2QsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzIH0pKTtcbiAgICAgIH0sIHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcFJlc3BvbnNlO1xuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gaWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IGlkLCBtZXRob2QsIHBhcmFtcyB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgYSBraWxsZWQgb3duZWQgaW5zdGFuY2UncyBDRFAgZW5kcG9pbnQgdW50aWwgaXQgc3RvcHMgcmVzcG9uZGluZyxcbiAgICogY29uZmlybWluZyB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBiZWZvcmUgYSBmcmVzaCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBpbnRvIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY2RwVXJsIC0gVGhlIENEUCBVUkwgb2YgdGhlIGluc3RhbmNlIHRoYXQgd2FzIGp1c3Qga2lsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9ySW5zdGFuY2VFeGl0KGNkcFVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgcHJldmlvdXMgb3duZWQgaW5zdGFuY2UgYXQgJHtjZHBVcmx9IHRvIGV4aXQuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uYCk7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBlbmRwb2ludCBpcyBnb25lOiB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCB0aGUgbG9jay5cbiAgICAgICAgYXdhaXQgZGVsYXkoSU5TVEFOQ0VfRVhJVF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBQcmV2aW91cyBpbnN0YW5jZSBzdGlsbCByZXNwb25kZWQgYmVmb3JlIHRpbWVvdXQ7IHJlbGF1bmNoaW5nIGFueXdheS4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIHZhdWx0J3MgYGFwcC53b3Jrc3BhY2VgIHRvIHJlYWNoIGxheW91dC1yZWFkeSBzdGF0ZS5cbiAgICpcbiAgICogYGZpbmRUYXJnZXRGb3JWYXVsdGAgcmV0dXJucyBhcyBzb29uIGFzIGBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpYFxuICAgKiBtYXRjaGVzIFx1MjAxNCB3aGljaCBpcyB0cnVlIHNob3J0bHkgYWZ0ZXIgdGhlIGBBcHBgIGNvbnN0cnVjdG9yIHJ1bnMsIGJlZm9yZVxuICAgKiBgcGx1Z2lucy5pbml0aWFsaXplKClgIChhbmQgYW55IHRydXN0IGRpYWxvZykgaGFzIGV4ZWN1dGVkLiBCb290c3RyYXBwaW5nXG4gICAqIHRoZSBuYW1lc3BhY2UgYW5kIGNhbGxpbmcgYHBvbGxWYXVsdEJhc2VQYXRoKClgIGF3YWl0cyBgbGF5b3V0UmVhZHlgLCBzb1xuICAgKiBieSB0aGUgdGltZSB0aGlzIHJldHVybnMgdGhlIGRpYWxvZyBoYXMgZWl0aGVyIHJlbmRlcmVkIG9yIGlzIG5vdCBnb2luZ1xuICAgKiB0byByZW5kZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZSgnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcucG9sbFZhdWx0QmFzZVBhdGgoKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIG93bmVkIGluc3RhbmNlIHVudGlsIHRoZSB2YXVsdCB0YXJnZXQgZXhpc3RzLCBsYXlvdXQgaXMgcmVhZHksIGFuZFxuICAgKiB0aGUgdHJ1c3QgZGlhbG9nIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogQmV0d2VlbiByZWFkaW5lc3MgYXR0ZW1wdHMgaXQgYWxzbyBjaGVja3MgZm9yIGEgKipkZWFkIGJvb3QqKiBcdTIwMTQgdGhlIHJlbmRlcmVyXG4gICAqIGxvYWRlZCAoYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkgYnV0IHRoZSBhcHAgbmV2ZXIgYm9vdHN0cmFwcGVkXG4gICAqIChlbXB0eSBgPGJvZHk+YCwgbm8gYHdpbmRvdy5hcHBgKSwgdGhlIHRlcm1pbmFsIHN0YXRlIHdoZW4gdGhlIGFzYXIgY2Fubm90XG4gICAqIHJ1biBvbiB0aGUgbGF1bmNoZWQgRWxlY3Ryb24gc2hlbGwuIE9uY2UgdGhhdCBzdGF0ZSBoYXMgaGVsZCBmb3IgdGhlXG4gICAqIGNvbmZpZ3VyZWQgZ3JhY2Ugd2luZG93IGl0IHRocm93cyBhIHtAbGluayBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yfVxuICAgKiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzcyB0aW1lb3V0LiBBIGdyYWNlIG9mXG4gICAqIGAwYCBkaXNhYmxlcyB0aGUgZmFzdC1mYWlsLiBUaGUgZ3JhY2UgY2xvY2sgc3RhcnRzIHdoZW4gdGhlIHJlbmRlcmVyIGZpcnN0XG4gICAqIHJlcG9ydHMgYGNvbXBsZXRlYCwgc28gYSBzbG93IGxvYWQgYmVmb3JlIHRoZW4gaXMgbmV2ZXIgY291bnRlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck93bmVkVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIG93bmVkIHZhdWx0IHRvIGJlY29tZSByZWFkeSAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBkb2N1bWVudENvbXBsZXRlU2luY2U6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICAgIGxldCBpc1JlYWR5ID0gZmFsc2U7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgaXNSZWFkeSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSB2YXVsdCBpcyBub3QgcmVhZHkgeWV0IFx1MjAxNCBhbHNvIGRyb3AgdGhlIGNhY2hlZCBDRFAgY29ubmVjdGlvbiBiZWZvcmVcbiAgICAgICAgLy8gUmV0cnlpbmcuIE9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiByZWxvYWRzIHRoZSBvd25lZCB3aW5kb3cgZHVyaW5nXG4gICAgICAgIC8vIEJvb3QsIHdoaWNoIGNhbiBsZWF2ZSB0aGUgY2FjaGVkIFdlYlNvY2tldCBwaW5uZWQgdG8gYSBzdGFsZSBleGVjdXRpb25cbiAgICAgICAgLy8gQ29udGV4dDsgcmVjb25uZWN0aW5nIGVhY2ggYXR0ZW1wdCByZS1iaW5kcyB0byB0aGUgbGl2ZSBjb250ZXh0LlxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBjb25zdCBvYnNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucHJvYmVSZW5kZXJlckJvb3RTdGF0ZSgpO1xuICAgICAgICBpZiAob2JzZXJ2YXRpb24pIHtcbiAgICAgICAgICBpZiAob2JzZXJ2YXRpb24uaXNEb2N1bWVudENvbXBsZXRlICYmIGRvY3VtZW50Q29tcGxldGVTaW5jZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaGFzR3JhY2VFbGFwc2VkID0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlICE9PSBudWxsXG4gICAgICAgICAgICAmJiBEYXRlLm5vdygpIC0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlID49IHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgIGlmIChyZXNvbHZlUmVuZGVyZXJCb290U3RhdGUoeyAuLi5vYnNlcnZhdGlvbiwgaGFzR3JhY2VFbGFwc2VkIH0pID09PSAnZGVhZCcpIHtcbiAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHJlbmRlcmVyIGZhaWxlZCB0byBpbml0aWFsaXplIChkZWFkIGJvb3QpOyBmYWlsaW5nIGZhc3QuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcih2YXVsdFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1JlYWR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE93bmVkIHZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmF1bHQgaXMgcmVhZHkuIFJ1biB0aGUgcG9zdC1ib290IGNvbXBhdGliaWxpdHkgY2hlY2tzIGhlcmUgXHUyMDE0IE9VVFNJREUgdGhlXG4gICAgLy8gUG9sbCdzIHRyeS9jYXRjaCBcdTIwMTQgc28gYSBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciBmYWlscyBmYXN0IGluc3RlYWQgb2YgYmVpbmdcbiAgICAvLyBTd2FsbG93ZWQgYXMgXCJub3QgcmVhZHkgeWV0XCIgYW5kIGxvb3BpbmcgdW50aWwgdGhlIHJlYWRpbmVzcyB0aW1lb3V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGgpO1xuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHZhdWx0IGlzIHJlYWR5LicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIHRoZSBzdGFydGVyIHNjcmVlbidzIHJlbmRlcmVyIGNhbiBhY2NlcHQgdGhlIGNvbmZpZy1mb2xkZXJcbiAgICogb3ZlcnJpZGUgXHUyMDE0IHRoYXQgaXMsIHVudGlsIGl0IGV4cG9zZXMgYm90aCBgbG9jYWxTdG9yYWdlYCBhbmRcbiAgICogYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luY2AuXG4gICAqXG4gICAqIEEgcGFnZSB0YXJnZXQgZXhpc3RzIGFzIHNvb24gYXMgdGhlIGxhdW5jaCByZXNvbHZlcywgc28gdGhpcyBpcyBub3Qgd2FpdGluZ1xuICAgKiBmb3IgYSB3aW5kb3c7IGl0IGlzIHdhaXRpbmcgZm9yIHRoYXQgd2luZG93J3Mgb3duIHNjcmlwdHMgdG8gZmluaXNoLiBXcml0aW5nXG4gICAqIGJlZm9yZSB0aGVuIHdvdWxkIGVpdGhlciB0aHJvdyBvciwgd29yc2UsIGxhbmQgaW4gYSByZW5kZXJlciB0aGF0IGlzIGFib3V0IHRvXG4gICAqIGJlIHJlcGxhY2VkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc3RhcnRlciBzY3JlZW4ncyBDRFAgdGFyZ2V0LlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBubyByZW5kZXJlciBiZWNvbWVzIHdyaXRhYmxlIHdpdGhpbiB0aGUgdGltZW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclN0YXJ0ZXJTY3JlZW5UYXJnZXQoKTogUHJvbWlzZTxDZHBUYXJnZXQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBTVEFSVEVSX1NDUkVFTl9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgICBleHByZXNzaW9uOiAndHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhISh3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyICYmIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyknLFxuICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBUaGUgcmVuZGVyZXIgaXMgbm90IGV2YWx1YXRpbmcgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoU1RBUlRFUl9TQ1JFRU5fUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgc3RhcnRlciBzY3JlZW4gZGlkIG5vdCBleHBvc2UgbG9jYWxTdG9yYWdlIGFuZCB0aGUgRWxlY3Ryb24gSVBDIGJyaWRnZSB3aXRoaW4gJHtTdHJpbmcoU1RBUlRFUl9TQ1JFRU5fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBgXG4gICAgICAgICsgJ3NvIHRoZSBjb25maWcgZm9sZGVyIG92ZXJyaWRlIGNvdWxkIG5vdCBiZSB3cml0dGVuLidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LCByZXR1cm5pbmcgd2hldGhlciBpdCBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgYHRydWVgIGlmIHJlbW92ZWQsIGBmYWxzZWAgaWYgdGhlIHJlbW92YWwgdGhyZXcgKGUuZy4gaGFuZGxlcyBoZWxkKS5cbiAqL1xuZnVuY3Rpb24gZGlkUmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcm1TeW5jKGRpcmVjdG9yeSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcgZW5hYmxlZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGluc3RhbGxlZCBPYnNpZGlhbiBleGVjdXRhYmxlIChjb3ZlcmluZyBpbnN0YWxsZXItYmFzZWRcbiAqIGFuZCBgUEFUSGAtYmFzZWQgaW5zdGFsbHMgc3VjaCBhcyBgc2Nvb3BgKSBhbmQgdmVyaWZpZXMgaXQgZXhpc3RzIGJlZm9yZVxuICogcmV0dXJuaW5nIGEgY29tbWFuZC4gVGhyb3dzIGlmIE9ic2lkaWFuIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiBPYnNpZGlhbiBjYW5ub3QgYmUgbG9jYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gIGNvbnN0IGZsYWcgPSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnQ9JHtTdHJpbmcocG9ydCl9YDtcblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7ZXhlUGF0aH1cIiAke2ZsYWd9YDtcbiAgfVxuXG4gIHJldHVybiBgXCIke2V4ZVBhdGh9XCIgJHtmbGFnfSAmYDtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBcUJBLHlCQUE0QjtBQUM1QixxQkFJTztBQUNQLHVCQUFxQjtBQUNyQiwwQkFBb0I7QUFhcEIscUNBQW9DO0FBQ3BDLGdDQUlPO0FBQ1AsdUNBQXVDO0FBQ3ZDLG1DQUEwQztBQUMxQyw2Q0FBNkM7QUFDN0Msa0NBQTBDO0FBQzFDLG9DQUE2QztBQUM3QyxxQ0FBcUM7QUFDckMsa0JBQXFCO0FBQ3JCLGlCQUFvQjtBQUNwQixpQ0FBNEM7QUFDNUMsNkJBSU87QUFDUCxpQ0FBMEM7QUFDMUMsK0JBQTRDO0FBQzVDLCtCQUFtQztBQUNuQyxxQ0FBcUM7QUFDckMsd0NBQTRDO0FBQzVDLHlDQUdPO0FBQ1AsOEJBQXVDO0FBQ3ZDLDZCQUFzRDtBQUN0RCxxQ0FHTztBQUNQLGlEQUFnRDtBQUNoRCx3Q0FBd0M7QUFDeEMseUJBQWtDO0FBQ2xDLDhCQUdPO0FBQ1Asb0NBQTBDO0FBQzFDLHdCQUlPO0FBMk1QLE1BQU0sa0NBQWtDO0FBQ3hDLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sdUNBQXVDO0FBQzdDLE1BQU0sOENBQThDO0FBQ3BELE1BQU0sWUFBWTtBQUNsQixNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUkzQyxNQUFNLDRCQUE0QjtBQUdsQyxNQUFNLHdDQUF3QztBQUM5QyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLDZDQUE2QztB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
|
|
1291
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUgeyBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlLFxuICBkZWNvZGVCYXNlNjRQbmcsXG4gIGlzUG5nXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgeyBDZHBDb21tYW5kVGltZW91dEVycm9yIH0gZnJvbSAnLi9jZHAtY29tbWFuZC10aW1lb3V0LWVycm9yLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnktZmFsbGJhY2stZXJyb3IuY2pzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgeyBFdmFsQ2FwRXhjZWVkZWRFcnJvciB9IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IuY2pzJztcbmltcG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCB9IGZyb20gJy4vbmFtZXNwYWNlLWJvb3RzdHJhcC5janMnO1xuaW1wb3J0IHtcbiAgZGlkUmVtb3ZlVmF1bHRGcm9tQ29uZmlnLFxuICBnZXRWYXVsdElkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZFxufSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5janMnO1xuaW1wb3J0IHsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSB9IGZyb20gJy4vb2JzaWRpYW4tZXhlY3V0YWJsZS5janMnO1xuaW1wb3J0IHsgbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlIH0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YW5jZS5janMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5janMnO1xuaW1wb3J0IHsgY29weUFzYXJJbnRvVXNlckRhdGEgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLmNqcyc7XG5pbXBvcnQgeyByZWFkT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIgfSBmcm9tICcuL293bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLmNqcyc7XG5pbXBvcnQge1xuICBidWlsZE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckZyb21NYXJrZXIsXG4gIE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvclxufSBmcm9tICcuL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci5janMnO1xuaW1wb3J0IHsgYnVpbGRPd25lZE9ic2lkaWFuSnNvbiB9IGZyb20gJy4vb3duZWQtdmF1bHQtc2VlZC5janMnO1xuaW1wb3J0IHsgYnVpbGRQYXJlbnRMaXZlbmVzc1dhdGNoZG9nRXhwcmVzc2lvbiB9IGZyb20gJy4vcGFyZW50LWxpdmVuZXNzLmNqcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFMsXG4gIHJlc29sdmVSZW5kZXJlckJvb3RTdGF0ZVxufSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgeyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yIH0gZnJvbSAnLi9yZW5kZXJlci1mYWlsZWQtdG8taW5pdGlhbGl6ZS1lcnJvci5janMnO1xuaW1wb3J0IHsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcbmltcG9ydCB7XG4gIGFyZVZhdWx0UGF0aHNNYXRjaGluZyxcbiAgbm9ybWFsaXplVmF1bHRQYXRoRm9yQ29tcGFyaXNvblxufSBmcm9tICcuL3ZhdWx0LXBhdGgtbWF0Y2guY2pzJztcbmltcG9ydCB7IHNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3cgfSBmcm9tICcuL3ZhdWx0LXRlYXJkb3duLXZlcmRpY3QuY2pzJztcbmltcG9ydCB7XG4gIHJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyxcbiAgcmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHMsXG4gIHNob3VsZEhpZGVPYnNpZGlhbkFwcFxufSBmcm9tICcuL3Zpc2liaWxpdHkuY2pzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIENEUCBob3N0LiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgLlxuICAgKi9cbiAgY2RwSG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgZm9yICoqYXR0YWNoKiogbW9kZSAodGhlIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgdGhlIHJ1bm5pbmdcbiAgICogT2JzaWRpYW4gd2FzIGxhdW5jaGVkIHdpdGgpLiBJbiBvd25lZC1pbnN0YW5jZSBtb2RlIHRoaXMgaXMgaWdub3JlZCBcdTIwMTQgYVxuICAgKiBmcmVlIHBvcnQgaXMgY2hvc2VuIGF0IGxhdW5jaC5cbiAgICovXG4gIGNkcFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICpcbiAgICogQSB0ZXN0J3MgY2xvc3VyZSB0cmF2ZWxzIGFzIG9uZSBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZCwgc28gdGhpcyBpcyBhbHNvXG4gICAqIHRoZSBkZXNrdG9wIHBlci1ldmFsIGNhcC4gVGhlIGRlZmF1bHQgaXMgYERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTYCxcbiAgICogZXhwb3J0ZWQgZnJvbSB0aGUgcGFja2FnZSByb290IFx1MjAxNCBpbXBvcnQgaXQgcmF0aGVyIHRoYW4gcmVzdGF0aW5nIHRoZSBudW1iZXIsXG4gICAqIHNvIGEgY2xvc3VyZSBzaXplZCBhZ2FpbnN0IHRoZSBjYXAgZm9sbG93cyBpdCBpZiBpdCBldmVyIG1vdmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMzAwMDBgXG4gICAqL1xuICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyBjb25maWcgZm9sZGVyIG92ZXJyaWRlIChPYnNpZGlhbidzICpPdmVycmlkZSBjb25maWcgZm9sZGVyKiksXG4gICAqIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLiBXaGVuIHNldCwgdGhlIG93bmVkIGluc3RhbmNlIGJvb3RzIHRvIHRoZVxuICAgKiBzdGFydGVyIHNjcmVlbiwgd3JpdGVzIGA8dmF1bHRJZD4tY29uZmlnYCBpbnRvIHRoYXQgcmVuZGVyZXInc1xuICAgKiBgbG9jYWxTdG9yYWdlYCwgYW5kIG9ubHkgdGhlbiBvcGVucyB0aGUgdmF1bHQgb3ZlciB0aGUgYHZhdWx0LW9wZW5gIElQQyBcdTIwMTRcbiAgICogdGhlIG92ZXJyaWRlIGlzIHJlYWQgb25jZSwgZHVyaW5nIHRoZSB2YXVsdCByZW5kZXJlcidzIG93biBzZXR1cCwgc28gaXQgaGFzXG4gICAqIHRvIGV4aXN0IGJlZm9yZSB0aGF0IHdpbmRvdyBpcyBjcmVhdGVkLiBUaGUgb3BlbmVkIHZhdWx0J3MgYWN0dWFsXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBpcyB0aGVuIHJlYWQgYmFjaywgYW5kIGEgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIHtAbGluayBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yfS4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgIChPYnNpZGlhbidzIG93biBkZWZhdWx0LCBgLm9ic2lkaWFuYClcbiAgICovXG4gIGNvbmZpZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgZGVhZCBib290IG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZSAoZW1wdHkgYDxib2R5PmAgd2l0aCBubyBgd2luZG93LmFwcGAgYWZ0ZXIgdGhlIHJlbmRlcmVyIHJlYWNoZWRcbiAgICogYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFN9LiBgMGAgZGlzYWJsZXMgZmFzdC1mYWlsLlxuICAgKi9cbiAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGF0dGFjaGluZyAoaS5lLiB7QGxpbmsgY2RwUG9ydH0gaXMgc2V0KSwgbWFya3MgdGhlIHRhcmdldCBhcyBhXG4gICAqICoqaGFybmVzcy1vd25lZCwgYWxyZWFkeS1wcmVwYXJlZCoqIGluc3RhbmNlLiBTdXBwcmVzc2VzIHRoZSB1c2VyLXNjb3BlXG4gICAqIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQsIHNpbmNlIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuXG4gICAqIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcgcmF0aGVyIHRoYW4gdGhlIHVzZXItc2NvcGUgcmVnaXN0cnkuXG4gICAqL1xuICBpc0hhcm5lc3NPd25lZEluc3RhbmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3duZWQgT2JzaWRpYW4gd2luZG93IGlzIHNob3duIG9uIHNjcmVlbi4gV2hlbiBgZmFsc2VgICh0aGVcbiAgICogZGVmYXVsdCksIHRoZSBvd25lZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCB3aXRoIGtlZXAtYWxpdmUgQ2hyb21pdW0gZmxhZ3MgYW5kXG4gICAqIGl0cyB3aW5kb3cgaXMgbW92ZWQgb2ZmLXNjcmVlbiBhZnRlciBsYXVuY2guIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlO1xuICAgKiBhdHRhY2ggbW9kZSBuZXZlciB0b3VjaGVzIHRoZSAodXNlcidzKSB3aW5kb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNPYnNpZGlhbkFwcFZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICAgKiBpbnN0ZWFkIG9mIGF0dGFjaGluZyB0byBhIHJ1bm5pbmcgb25lLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgbW9kZS5cbiAgICovXG4gIG93bmVkSW5zdGFuY2U/OiBPd25lZEluc3RhbmNlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS4gTmVlZGVkIHRvIGJvb3Qgb24gTGludXggd2l0aG91dCBhIGNvcnJlY3RseS1jb25maWd1cmVkXG4gICAqIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciAoZS5nLiBhbiBleHRyYWN0ZWQgcG9ydGFibGUgc2hlbGwsIG9yIENJIGFzIGFcbiAgICogbm9uLXJvb3QgdXNlcik7IGhhcm1sZXNzIG9uIFdpbmRvd3MvbWFjT1MuIE9ubHkgbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwb3N0LWJvb3QgKipzaWxlbnQgYXNhciBmYWxsYmFjayoqICh0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBkaWZmZXJzXG4gICAqIGZyb20gdGhlIHN3YXBwZWQtaW4gcGluKSBmYWlscyBmYXN0IHdpdGgge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfS4gVGhlXG4gICAqIHZlcmRpY3QgaXMgYWx3YXlzIGNvbXB1dGVkIGFuZCBzdXJmYWNlZCB2aWFcbiAgICoge0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnQuZ2V0QXNhckZhbGxiYWNrfTsgdGhpcyBnYXRlcyBvbmx5IHRoZSB0aHJvdy4gT25seVxuICAgKiBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUgcnVubmluZyBhIHN3YXBwZWQtaW4gYXNhci5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdC1ib290IHJ1bnRpbWUtRWxlY3Ryb24gY29tcGF0aWJpbGl0eSBuYWcgd2FybmluZyBpcyBlbWl0dGVkXG4gICAqIHdoZW4gdGhlIGxpdmUgRWxlY3Ryb24gaXMgYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkIG1pbmltdW0uIFRoZSB2ZXJkaWN0IGlzXG4gICAqIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eX07XG4gICAqIHRoaXMgb25seSBnYXRlcyB0aGUgbG9nLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBhc2FyIHRvIHByb3Zpc2lvbiBpbnRvIGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSdzIHVzZXItZGF0YSBkaXJlY3RvcnkgYmVmb3JlIGxhdW5jaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQXNhciB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQvc291cmNlIGFzYXIgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGFzYXIncyBgeC55LnpgIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZS5cbiAqXG4gKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgaXRzIG93biBPYnNpZGlhbiBwcm9jZXNzXG4gKiBhZ2FpbnN0IGFuIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VDb25maWcge1xuICAvKipcbiAgT3B0aW9uYWwgYXNhciB0byBwcm92aXNpb24gaW50byB7QGxpbmsgdXNlckRhdGFEaXJlY3Rvcnl9IGJlZm9yZSBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUFzYXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCB3aGVuIGl0IGNvdWxkIGJlIGRldGVybWluZWRcbiAgICogKGFuIGFzYXItc3dhcCBvbnRvIGEga25vd24gc2hlbGwgdmVyc2lvbikuIFN1cmZhY2VkIGJ5XG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldENvbXBhdGliaWxpdHl9LiBBbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHJlYWNoZXNcbiAgICogdGhpcyBzdXJmYWNlIG9ubHkgd2hlbiB0aGUgcHJvYWN0aXZlIHRocm93IGlzIGRpc2FibGVkXG4gICAqIChgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBiZWZvcmUgdGhlIGNvbmZpZyBpcyBidWlsdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhdGliaWxpdHk/OiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiBzaGVsbCBleGVjdXRhYmxlIHRvIGxhdW5jaC5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeS4gQ3JlYXRlZCBhbmQgb3duZWQgYnkgdGhlXG4gICAqIHRyYW5zcG9ydCwgYW5kIGRlbGV0ZWQgb24gZGlzcG9zZS5cbiAgICovXG5cbiAgcmVhZG9ubHkgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgQ0RQIGVuZHBvaW50IG9mIGEgbGF1bmNoZWQsIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUVuZHBvaW50IHtcbiAgLyoqXG4gIENEUCBob3N0IChlLmcuIGAnbG9jYWxob3N0J2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZnJlZSBDRFAgcG9ydCB0aGUgb3duZWQgaW5zdGFuY2Ugd2FzIGxhdW5jaGVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ2RwRXhjZXB0aW9uRGV0YWlscyB7XG4gIGV4Y2VwdGlvbj86IENkcEV4Y2VwdGlvbk9iamVjdDtcbiAgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwRXhjZXB0aW9uT2JqZWN0IHtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBSZXNwb25zZSB7XG4gIGlkOiBudW1iZXI7XG4gIHJlc3VsdD86IENkcFJlc3BvbnNlUmVzdWx0O1xufVxuXG5pbnRlcmZhY2UgQ2RwUmVzcG9uc2VSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGJhc2U2NC1lbmNvZGVkIGltYWdlIHJldHVybmVkIGJ5IGBQYWdlLmNhcHR1cmVTY3JlZW5zaG90YC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkRldGFpbHM/OiBDZHBFeGNlcHRpb25EZXRhaWxzO1xuICByZWFkb25seSByZXN1bHQ/OiBDZHBWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHdlYlNvY2tldERlYnVnZ2VyVXJsOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBWYWx1ZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIEEgY29tbWFuZCB3YWl0aW5nIGZvciBpdHMgcmVwbHk6IHNldHRsZXMgdGhlIGNhbGxlcidzIHByb21pc2UgYW5kIGNhbmNlbHMgdGhlXG4gKiB0aW1lb3V0IHRoYXQgd291bGQgb3RoZXJ3aXNlIGZhaWwgaXQuXG4gKi9cbnR5cGUgUGVuZGluZ0NvbW1hbmQgPSAocmVzcG9uc2U6IENkcFJlc3BvbnNlKSA9PiB2b2lkO1xuXG5jb25zdCBWQVVMVF9JRF9CWVRFX0xFTkdUSCA9IDg7XG5jb25zdCBVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5jb25zdCBVU0VSX0RBVEFfUk1fUkVUUllfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTk9fT1VUUFVUID0gJyhubyBvdXRwdXQpJztcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbi8vIE9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiBvY2Nhc2lvbmFsbHkgYm9vdHMgd2l0aG91dCB0aGUgd29ya3NwYWNlIGV2ZXJcbi8vIGluaXRpYWxpemluZywgc28gdGhlIHZhdWx0IG5ldmVyIGJlY29tZXMgcmVhZHkuIEEgZnJlc2ggaW5zdGFuY2UgaXMgYW5cbi8vIGluZGVwZW5kZW50IGNoYW5jZTsgcmVsYXVuY2ggdXAgdG8gdGhpcyBtYW55IHRpbWVzIGJlZm9yZSBnaXZpbmcgdXAuXG5jb25zdCBPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTID0gMztcbi8vIEJyaWVmIHNldHRsZSBiZWZvcmUgYSByZWxhdW5jaCBzbyB0aGUga2lsbGVkIGluc3RhbmNlJ3MgbWVtb3J5L2hhbmRsZXMgYXJlXG4vLyByZWNsYWltZWQgYmVmb3JlIHRoZSBuZXh0IGJvb3QgXHUyMDE0IGltcHJvdmVzIHRoZSBvZGRzIG9uIGEgbG9hZGVkIG1hY2hpbmUuXG5jb25zdCBPV05FRF9SRUxBVU5DSF9TRVRUTEVfSU5fTUlMTElTRUNPTkRTID0gMzAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBJTlNUQU5DRV9FWElUX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG4vLyBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc3RhcnRlciBzY3JlZW4ncyByZW5kZXJlciB0byBleHBvc2UgYGxvY2FsU3RvcmFnZWBcbi8vIGFuZCBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyYCBcdTIwMTQgdGhlIHR3byB0aGluZ3MgdGhlIGNvbmZpZy1mb2xkZXIgb3ZlcnJpZGVcbi8vIG5lZWRzLiBDRFAgYWxyZWFkeSBzZXJ2ZXMgYSBwYWdlIHRhcmdldCBieSB0aGUgdGltZSB0aGUgbGF1bmNoIHJlc29sdmVzLCBzb1xuLy8gdGhpcyBvbmx5IGNvdmVycyB0aGUgcmVuZGVyZXIgZmluaXNoaW5nIGl0cyBvd24gc2NyaXB0IGV2YWx1YXRpb24uXG5jb25zdCBTVEFSVEVSX1NDUkVFTl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IFNUQVJURVJfU0NSRUVOX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjUwO1xuY29uc3QgT1dORURfV0lORE9XX09GRlNDUkVFTl9NQVJHSU5fSU5fUElYRUxTID0gMjAwO1xuY29uc3QgT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAyMF8wMDA7XG5jb25zdCBPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDI1MDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKlxuICogQ29ubmVjdHMgdG8gT2JzaWRpYW4ncyBDRFAgV2ViU29ja2V0IGVuZHBvaW50LCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWBcbiAqIGNvbW1hbmRzLCBhbmQgcm91dGVzIGV4cHJlc3Npb25zIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDZHBUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBmb3IgYSBtb2JpbGUgcGxhdGZvcm0uIEFsd2F5cyBgZmFsc2VgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGl2ZVZhdWx0UGF0aDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgYXNhckZhbGxiYWNrOiBBc2FyRmFsbGJhY2sgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RwSG9zdDogc3RyaW5nO1xuICBwcml2YXRlIGNkcFBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjZHBVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnRGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgZWxlY3Ryb25Db21wYXRpYmlsaXR5OiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtZXNzYWdlSWQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IG93bmVkQ29uZmlnOiBPd25lZEluc3RhbmNlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bmVkSW5zdGFuY2U6IE93bmVkT2JzaWRpYW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBpbi1mbGlnaHQgY29tbWFuZHMgb2YgZXZlcnkgc29ja2V0IHRoaXMgdHJhbnNwb3J0IGhhcyBvcGVuZWQsIGtleWVkIGJ5XG4gICAqIHRoZSBDRFAgbWVzc2FnZSBpZCBlYWNoIGlzIHdhaXRpbmcgZm9yLiBPbmUgZW50cnkgcGVyIGNvbW1hbmQsIGFkZGVkIGJ5XG4gICAqIHtAbGluayBzZW5kQ29tbWFuZH0gYW5kIHJlbW92ZWQgYnkgd2hpY2hldmVyIG9mIHRoZSByZXBseSBhbmQgdGhlIHRpbWVvdXRcbiAgICogY29tZXMgZmlyc3QgXHUyMDE0IHNlZSB7QGxpbmsgZ2V0UGVuZGluZ0NvbW1hbmRzfSBmb3Igd2h5IHRoaXMgZXhpc3RzIGF0IGFsbC5cbiAgICpcbiAgICogV2VhayBieSBzb2NrZXQgc28gYSBjbG9zZWQgdGVtcG9yYXJ5IGNvbm5lY3Rpb24gaXMgY29sbGVjdGFibGUgd2l0aCBpdHNcbiAgICogcGVuZGluZyBtYXA7IHRoZSBkaXNwYXRjaGVyIGxpc3RlbmVyIGlzIHRoZSBzb2NrZXQncyBvd24sIHNvIG5vdGhpbmcgaGVyZVxuICAgKiBrZWVwcyBpdCBhbGl2ZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ0NvbW1hbmRzQnlTb2NrZXQgPSBuZXcgV2Vha01hcDxXZWJTb2NrZXQsIE1hcDxudW1iZXIsIFBlbmRpbmdDb21tYW5kPj4oKTtcbiAgLyoqXG4gICAqIFZhdWx0IHBhdGhzIFRISVMgdHJhbnNwb3J0IG9wZW5lZCB2aWEge0BsaW5rIHJlZ2lzdGVyVmF1bHR9LCBub3JtYWxpemVkIGJ5XG4gICAqIHtAbGluayBub3JtYWxpemVWYXVsdFBhdGhGb3JDb21wYXJpc29ufS4gQSB3b3JrZXIgYXR0YWNoZWQgdG8gYVxuICAgKiBoYXJuZXNzLW93bmVkIGluc3RhbmNlIG1heSB0ZWFyIGRvd24gb25seSB0aGVzZSBcdTIwMTQgZXZlcnkgb3RoZXIgdmF1bHQgaW4gdGhhdFxuICAgKiBpbnN0YW5jZSBiZWxvbmdzIHRvIHRoZSBnbG9iYWwgc2V0dXAgdGhhdCBsYXVuY2hlZCBpdCAoc2VlXG4gICAqIHtAbGluayBzaG91bGRUZWFyRG93blZhdWx0V2luZG93fSkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGZSZWdpc3RlcmVkVmF1bHRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZERpc2FibGVTYW5kYm94OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbiAgcHJpdmF0ZSB3czogbnVsbCB8IFdlYlNvY2tldCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQ0RQIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIENEUCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnPzogRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZykge1xuICAgIC8vIERlc3RydWN0dXJlIHdpdGggcGVyLWZpZWxkIGRlZmF1bHRzIChlYWNoIGFwcGxpZXMgd2hlbiB0aGUgZmllbGQgaXMgb21pdHRlZCxcbiAgICAvLyBleGFjdGx5IGxpa2UgdGhlIGZvcm1lciBgY29uZmlnPy54ID8/IGRlZmF1bHRgKSBzbyB0aGUgY29uc3RydWN0b3Igc3RheXNcbiAgICAvLyB1bmRlciB0aGUgY3ljbG9tYXRpYy1jb21wbGV4aXR5IGxpbWl0IGFzIGZpZWxkcyBhcmUgYWRkZWQuXG4gICAgY29uc3Qge1xuICAgICAgY2RwSG9zdCA9ICdsb2NhbGhvc3QnLFxuICAgICAgY2RwUG9ydCxcbiAgICAgIC8vIEEgdGVzdCdzIGNsb3N1cmUgdHJhdmVscyBhcyBvbmUgYFJ1bnRpbWUuZXZhbHVhdGVgIENEUCBjb21tYW5kLCBzbyB0aGVcbiAgICAgIC8vIGNvbW1hbmQgYnVkZ2V0IElTIHRoZSBwZXItZXZhbCBjYXAgb24gdGhpcyB0cmFuc3BvcnQgXHUyMDE0IGhlbmNlIHRoZSBzaGFyZWRcbiAgICAgIC8vIGNvbnN0YW50IHJhdGhlciB0aGFuIGEgZGVza3RvcC1zcGVjaWZpYyBudW1iZXIgdGhhdCBoYXBwZW5zIHRvIG1hdGNoLlxuICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgY29uZmlnRGlyZWN0b3J5LFxuICAgICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID0gREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA9IGZhbHNlLFxuICAgICAgaXNPYnNpZGlhbkFwcFZpc2libGUgPSB0cnVlLFxuICAgICAgb3duZWRJbnN0YW5jZSxcbiAgICAgIHNob3VsZERpc2FibGVTYW5kYm94ID0gZmFsc2UsXG4gICAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrID0gdHJ1ZSxcbiAgICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMgPSB0cnVlXG4gICAgfSA9IGNvbmZpZyA/PyB7fTtcbiAgICB0aGlzLmNkcEhvc3QgPSBjZHBIb3N0O1xuICAgIHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5jb25maWdEaXJlY3RvcnkgPSBjb25maWdEaXJlY3Rvcnk7XG4gICAgdGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlID0gaXNIYXJuZXNzT3duZWRJbnN0YW5jZTtcbiAgICB0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlID0gaXNPYnNpZGlhbkFwcFZpc2libGU7XG4gICAgdGhpcy5vd25lZENvbmZpZyA9IG93bmVkSW5zdGFuY2U7XG4gICAgdGhpcy5zaG91bGREaXNhYmxlU2FuZGJveCA9IHNob3VsZERpc2FibGVTYW5kYm94O1xuICAgIHRoaXMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayA9IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s7XG4gICAgdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzID0gc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcztcbiAgICAvLyBPd25lZCBtb2RlIHBpY2tzIGEgZnJlZSBwb3J0IGF0IGxhdW5jaCAoYXNzaWduZWQgaW4gcmVnaXN0ZXJWYXVsdCkuXG4gICAgLy8gQXR0YWNoIG1vZGUgY29ubmVjdHMgdG8gdGhlIGNvbmZpZ3VyZWQgcG9ydDsgbm8gcG9ydCBpcyBoYXJkY29kZWQuXG4gICAgdGhpcy5jZHBQb3J0ID0gY2RwUG9ydCA/PyAwO1xuICAgIHRoaXMuY2RwVXJsID0gY2RwUG9ydCA9PT0gdW5kZWZpbmVkID8gJycgOiBgaHR0cDovLyR7Y2RwSG9zdH06JHtTdHJpbmcoY2RwUG9ydCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlcyBhIFBORyBzY3JlZW5zaG90IG9mIHRoZSBPYnNpZGlhbiB3aW5kb3cgc2hvd2luZyB0aGUgZ2l2ZW4gdmF1bHQuXG4gICAqXG4gICAqIFdoZW4gYSBzaXplIGlzIHJlcXVlc3RlZCB0aGUgdmlld3BvcnQgaXMgcGlubmVkIHRvIGl0IHdpdGhcbiAgICogYEVtdWxhdGlvbi5zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGVgIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhcHR1cmUsIHNvIHRoZVxuICAgKiBlbWl0dGVkIFBORyBpcyBleGFjdGx5IHRoYXQgc2l6ZSB3aGF0ZXZlciBzaXplIHRoZSB3aW5kb3cgaGFwcGVucyB0byBiZSBcdTIwMTRcbiAgICogYW5kIHRoZSBvdmVycmlkZSBpcyBhbHdheXMgY2xlYXJlZCBhZnRlcndhcmRzLCBpbmNsdWRpbmcgd2hlbiB0aGUgY2FwdHVyZVxuICAgKiB0aHJvd3MsIHNvIGEgZmFpbGVkIGNhcHR1cmUgY2Fubm90IGxlYXZlIHRoZSB3aW5kb3cgc3R1Y2sgYXQgdGhlIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggdmF1bHQgd2luZG93IHRvIGNhcHR1cmUsIGFuZCB0aGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGl0IGF0LlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IFBORyBieXRlcy5cbiAgICogQHRocm93cyBFcnJvciBpZiBDRFAgcmV0dXJucyBubyBpbWFnZSBkYXRhLCBvciBkYXRhIHRoYXQgaXMgbm90IGEgUE5HLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYENhcHR1cmVTY3JlZW5zaG90UGFyYW1zYCBpcyBvbmUgYmFnIHNoYXJlZCBieSB0aGUgYGNhcHR1cmVTY3JlZW5zaG90YCBvZiBib3RoIHRyYW5zcG9ydHMsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG4gIHB1YmxpYyBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChwYXJhbXM6IENhcHR1cmVTY3JlZW5zaG90UGFyYW1zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24ocGFyYW1zLmN3ZCk7XG4gICAgY29uc3QgZGV2aWNlTWV0cmljc092ZXJyaWRlID0gYnVpbGREZXZpY2VNZXRyaWNzT3ZlcnJpZGUocGFyYW1zKTtcbiAgICBpZiAoZGV2aWNlTWV0cmljc092ZXJyaWRlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsIGRldmljZU1ldHJpY3NPdmVycmlkZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1BhZ2UuY2FwdHVyZVNjcmVlbnNob3QnLCB7XG4gICAgICAgIC8vIFRoZSBvdmVycmlkZSBhbHJlYWR5IHNpemVzIHRoZSB2aWV3cG9ydCwgc28gY2FwdHVyaW5nIGJleW9uZCBpdCB3b3VsZFxuICAgICAgICAvLyByZS1pbnRyb2R1Y2UgdGhlIHNjcm9sbCBoZWlnaHQgdGhlIG92ZXJyaWRlIGV4aXN0cyB0byBwaW4gZG93bi5cbiAgICAgICAgY2FwdHVyZUJleW9uZFZpZXdwb3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiAncG5nJ1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5yZXN1bHQ/LmRhdGE7XG4gICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ0RQIHNjcmVlbnNob3QgZXJyb3I6IFBhZ2UuY2FwdHVyZVNjcmVlbnNob3QgcmV0dXJuZWQgbm8gaW1hZ2UgZGF0YS4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnl0ZXMgPSBkZWNvZGVCYXNlNjRQbmcoZGF0YSk7XG4gICAgICBpZiAoIWlzUG5nKGJ5dGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUCBzY3JlZW5zaG90IGVycm9yOiBQYWdlLmNhcHR1cmVTY3JlZW5zaG90IHJldHVybmVkIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGRldmljZU1ldHJpY3NPdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlJywge30pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0aGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uIGFuZCwgaW4gb3duZWQtaW5zdGFuY2UgbW9kZSxcbiAgICoga2lsbHMgdGhlIG93bmVkIE9ic2lkaWFuIHByb2Nlc3MgYW5kIHJlbW92ZXMgaXRzIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gICAqXG4gICAqIFRoZSByZW1vdmFsIGlzIHJldHJpZWQgYmVjYXVzZSBXaW5kb3dzIGJyaWVmbHkgaG9sZHMgdGhlIGp1c3Qta2lsbGVkXG4gICAqIHByb2Nlc3MncyBmaWxlIGhhbmRsZXMsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBmYWlsIGBybVN5bmNgIHdpdGggYEVQRVJNYC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgIGNvbnN0IHsgdXNlckRhdGFEaXJlY3RvcnkgfSA9IHRoaXMub3duZWRDb25maWc7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGlmIChkaWRSZW1vdmVEaXJlY3RvcnkodXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBpZiAoIWRpZFJlbW92ZURpcmVjdG9yeSh1c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZW1vdmUgb3duZWQgdXNlci1kYXRhIGRpcmVjdG9yeSB3aXRoaW4gJHtTdHJpbmcoVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsKTogJHt1c2VyRGF0YURpcmVjdG9yeX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgZGlzcG9zYWwgXHUyMDE0IGtpbGxzIHRoZSBvd25lZCBpbnN0YW5jZSBhbmQgbWFrZXMgYSBiZXN0LWVmZm9ydFxuICAgKiByZW1vdmFsIG9mIGl0cyB1c2VyLWRhdGEgZGlyZWN0b3J5LiBTYWZlIHRvIGNhbGwgZnJvbSBhIHByb2Nlc3MgYGV4aXRgIGhhbmRsZXJcbiAgICogKHdoZXJlIGFzeW5jIHJldHJpZXMgYXJlIGltcG9zc2libGU7IGEgbGVmdG92ZXIgdGVtcCBkaXJlY3RvcnkgaXMgYWNjZXB0YWJsZSkuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgICAgaWYgKCFkaWRSZW1vdmVEaXJlY3RvcnkodGhpcy5vd25lZENvbmZpZy51c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT3duZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBub3QgcmVtb3ZlZCBzeW5jaHJvbm91c2x5IChwcm9jZXNzIG1heSBzdGlsbCBob2xkIGhhbmRsZXMpOiAke3RoaXMub3duZWRDb25maWcudXNlckRhdGFEaXJlY3Rvcnl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIENEUCBgUnVudGltZS5ldmFsdWF0ZWAuXG4gICAqXG4gICAqIFJvdXRlcyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQgYmFzZWQgb24gYG9wdGlvbnMuY3dkYC5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBUcmFuc3BvcnRFdmFsT3B0aW9uc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhlIGBldmFsdWF0ZWAgb2YgYm90aCB0cmFuc3BvcnRzLCBzbyBubyBwZXItb3duZXIgbmFtZSBjYW4gc2F0aXNmeSBib3RoLlxuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24ob3B0aW9ucy5jd2QpO1xuICAgIGxldCByZXNwb25zZTtcblxuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvKlxuICAgICAgICogT25seSBUSElTIGV2YWwgY2FycmllcyBhIGNhbGxlcidzIGNsb3N1cmUgXHUyMDE0IHRoZSBoYXJuZXNzJ3Mgb3duIGBSdW50aW1lLmV2YWx1YXRlYCBjYWxscyAodGhlIHRydXN0XG4gICAgICAgKiBEaWFsb2csIHRoZSB3YXRjaGRvZywgdGhlIGJvb3QgcHJvYmVzKSB0aW1lIG91dCBmb3IgcmVhc29ucyB0aGF0IGhhdmUgbm90aGluZyB0byBkbyB3aXRoIGEgdGVzdCdzXG4gICAgICAgKiBXYWl0aW5nLCBhbmQgcmVwb3J0aW5nIHRoZSBjYXAgZm9yIHRob3NlIHdvdWxkIGJlIHRoZSBzYW1lIG1pc2RpYWdub3NpcyBwb2ludGluZyB0aGUgb3RoZXIgd2F5LlxuICAgICAgICovXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDZHBDb21tYW5kVGltZW91dEVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFdmFsQ2FwRXhjZWVkZWRFcnJvcih7XG4gICAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgb3B0aW9uTmFtZTogJ2NvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMnLFxuICAgICAgICAgIHRyYW5zcG9ydE5hbWU6ICdkZXNrdG9wIChDRFApJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8uZXhjZXB0aW9uRGV0YWlscykge1xuICAgICAgY29uc3QgZGVzYyA9IHJlc3BvbnNlLnJlc3VsdC5leGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb25cbiAgICAgICAgPz8gcmVzcG9uc2UucmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMudGV4dDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ0RQIGV2YWx1YXRpb24gZXJyb3I6ICR7ZGVzY31gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRPYmplY3QgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdE9iamVjdCB8fCByZXN1bHRPYmplY3QudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhyZXN1bHRPYmplY3QudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbGVudC1hc2FyLWZhbGxiYWNrIHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0IHdoZXRoZXIgdGhlXG4gICAqIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yIHRoZSBpbnN0YWxsZXJcbiAgICogc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIgKHJlYWQgbGl2ZSBwb3N0LWJvb3QpLiBSZXR1cm5zXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90IGJvb3RlZFxuICAgKiB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChubyBhc2FyIHdhcyBzd2FwcGVkLCBvciB0aGUgbGl2ZVxuICAgKiB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlKS4gQSBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW5cbiAgICogdGhlIHRocm93IGlzIGRpc2FibGVkICh7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrfVxuICAgKiBgZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93cyBgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JgLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0QXNhckZhbGxiYWNrKCk6IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXNhckZhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWRcbiAgICogaW5zdGFuY2UsIHNvIGNhbGxlcnMgY2FuIGFzc2VydCBvbiBpdC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90XG4gICAqIGFuIG93bmVkIGluc3RhbmNlLCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoZS5nLiBhblxuICAgKiB1bmRldGVjdGFibGUgc2hlbGwgdmVyc2lvbiwgb3IgdGhlIGFwcCB2ZXJzaW9uIGlzIGFic2VudCBmcm9tIHRoZSB0YWJsZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb21wYXRpYmlsaXR5IHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldENvbXBhdGliaWxpdHkoKTogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3duZWRDb25maWc/LmNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0XG4gICAqIHdoZXRoZXIgdGhlIEVsZWN0cm9uIHZlcnNpb24gaXQgaXMgYWN0dWFsbHkgcnVubmluZyBpcyBuZXcgZW5vdWdoIGZvciB0aGVcbiAgICogcnVubmluZyBhcHAgdmVyc2lvbiAocmVhZCBsaXZlIHBvc3QtYm9vdDsgc2VlIHtAbGluayBPYnNpZGlhblZlcnNpb25NZXRhZGF0YS5taW5SZWNvbW1lbmRlZEVsZWN0cm9uVmVyc2lvbn0pLlxuICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90XG4gICAqIGJvb3RlZCB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICh0aGUgbGl2ZSB2ZXJzaW9uIHdhc1xuICAgKiB1bnJlYWRhYmxlLCBvciB0aGUgYXBwIHZlcnNpb24gY2FycmllcyBubyByZWNvbW1lbmRlZCBFbGVjdHJvbiB2ZXJzaW9uKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHkoKTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbGVjdHJvbkNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQ0RQIGVuZHBvaW50IG9mIHRoZSBvd25lZCwgbGF1bmNoZWQgaW5zdGFuY2Ugc28gdGhlIGdsb2JhbCBzZXR1cFxuICAgKiBjYW4gaGFuZCBpdCB0byB0ZXN0IHdvcmtlcnMgKHdoaWNoIHRoZW4gKiphdHRhY2gqKiB0byBpdCBpbnN0ZWFkIG9mXG4gICAqIGxhdW5jaGluZyB0aGVpciBvd24pLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyB0cmFuc3BvcnQgaXMgbm90IGFuXG4gICAqIG93bmVkIGluc3RhbmNlLCBvciBpdHMgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGxhdW5jaGVkIHlldC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG93bmVkIGluc3RhbmNlJ3MgQ0RQIGhvc3QgYW5kIHBvcnQsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpOiBPd25lZEluc3RhbmNlRW5kcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZyB8fCAhdGhpcy5vd25lZEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyBob3N0OiB0aGlzLmNkcEhvc3QsIHBvcnQ6IHRoaXMuY2RwUG9ydCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIENEUCBlbmRwb2ludCBpcyByZWFjaGFibGUgYW5kIGhhcyBPYnNpZGlhbiB0YXJnZXRzLlxuICAgKlxuICAgKiBJZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgYXR0ZW1wdHMgdG8gYXV0by1zdGFydCBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCBwb2xscyB1bnRpbCBDRFAgYmVjb21lcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCAodXNlZCBmb3IgdmF1bHQgcmVnaXN0cmF0aW9uIGNoZWNrKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmVmbGlnaHRDaGVjayh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnIHx8IHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgICAgLy8gT3duZWQgaW5zdGFuY2UgKGxhdW5jaGVkIGhlcmUpIG9yIGEgd29ya2VyIGF0dGFjaGVkIHRvIG9uZTogcmVhZGluZXNzIGlzXG4gICAgICAvLyBndWFyYW50ZWVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAncyByZWdpc3RlclZhdWx0LCBhbmQgdGhlIHZhdWx0IGxpdmVzIGluXG4gICAgICAvLyB0aGUgaXNvbGF0ZWQgY29uZmlnIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSB1c2VyLXNjb3BlXG4gICAgICAvLyByZWdpc3RyeS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyKCkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBhZ2UgdGFyZ2V0cycpO1xuICAgICAgfVxuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ0RQIHJlYWNoYWJsZSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCB2aWEgRWxlY3Ryb24gSVBDIGV2YWx1YXRlZCB0aHJvdWdoIENEUC5cbiAgICpcbiAgICogVXNlcyBhbiBleGlzdGluZyBPYnNpZGlhbiB0YXJnZXQgdG8gc2VuZCB0aGUgYHZhdWx0LW9wZW5gIElQQyBjb21tYW5kLFxuICAgKiB0aGVuIHBvbGxzIHVudGlsIHRoZSBuZXcgdmF1bHQncyB0YXJnZXQgYXBwZWFycy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aCk7XG4gICAgLy8gUmVjb3JkZWQgb25seSBvbiBzdWNjZXNzLCBhbmQgb25seSBoZXJlOiB0aGlzIGlzIHRoZSBvbmUgYnJhbmNoIHRoYXQgb3BlbnNcbiAgICAvLyBBIHdpbmRvdyBpbiBhbiBpbnN0YW5jZSB0aGlzIHRyYW5zcG9ydCBkaWQgbm90IGxhdW5jaCwgc28gaXQgaXMgdGhlIG9uZVxuICAgIC8vIGJyYW5jaCB0aGF0IGVhcm5zIHRoZSByaWdodCB0byBjbG9zZSBvbmUgKHNlZSBgdW5yZWdpc3RlclZhdWx0YCkuXG4gICAgdGhpcy5zZWxmUmVnaXN0ZXJlZFZhdWx0UGF0aHMuYWRkKG5vcm1hbGl6ZVZhdWx0UGF0aEZvckNvbXBhcmlzb24odmF1bHRQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBieSBkZXN0cm95aW5nIGl0cyB3aW5kb3cgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBSZWZ1c2VzIHdoZW4gdGhpcyB0cmFuc3BvcnQgZG9lcyBub3Qgb3duIHdoYXQgaXQgd291bGQgYmUgdGVhcmluZyBkb3duIFx1MjAxNFxuICAgKiBzZWUge0BsaW5rIHNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3d9IGZvciB3aGljaCBvZiB0aGUgdHdvIG93bmVyc2hpcCBmbGFnc1xuICAgKiBtZWFucyB3aGF0LCBhbmQgd2h5IHRoZXkgYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYXVsdFBhdGggPSBub3JtYWxpemVWYXVsdFBhdGhGb3JDb21wYXJpc29uKHZhdWx0UGF0aCk7XG4gICAgaWYgKFxuICAgICAgIXNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3coe1xuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UsXG4gICAgICAgIGlzT3duZWRJbnN0YW5jZTogQm9vbGVhbih0aGlzLm93bmVkQ29uZmlnKSxcbiAgICAgICAgaXNTZWxmUmVnaXN0ZXJlZDogdGhpcy5zZWxmUmVnaXN0ZXJlZFZhdWx0UGF0aHMuaGFzKG5vcm1hbGl6ZWRWYXVsdFBhdGgpXG4gICAgICB9KVxuICAgICkge1xuICAgICAgbG9nKFxuICAgICAgICB0aGlzLm93bmVkQ29uZmlnXG4gICAgICAgICAgPyBgW2NkcC10cmFuc3BvcnRdIFNraXBwaW5nIHBlci12YXVsdCB0ZWFyZG93bjsgdGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZTogJHt2YXVsdFBhdGh9YFxuICAgICAgICAgIDogYFtjZHAtdHJhbnNwb3J0XSBTa2lwcGluZyBwZXItdmF1bHQgdGVhcmRvd247IHRoaXMgd29ya2VyIGRpZCBub3QgcmVnaXN0ZXIgdGhlIHZhdWx0IGl0IHdhcyBhc2tlZCB0byB1bnJlZ2lzdGVyOiAke3ZhdWx0UGF0aH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZlJlZ2lzdGVyZWRWYXVsdFBhdGhzLmRlbGV0ZShub3JtYWxpemVkVmF1bHRQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB3aW5kb3dEZXN0cm95RXhwcmVzc2lvbiA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5kZXN0cm95Q3VycmVudFdpbmRvdygpJztcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IHdpbmRvd0Rlc3Ryb3lFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gV2luZG93IG1heSBhbHJlYWR5IGJlIGNsb3NlZC5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGB2YXVsdC1yZW1vdmVgIElQQyBpcyBzZW50IHRocm91Z2ggYSBzdGlsbC1vcGVuIHdpbmRvdyAoYHRhcmdldHNbMF1gKSBcdTIwMTRcbiAgICAgIC8vIGB2YXVsdFBhdGhgJ3Mgb3duIHdpbmRvdyB3YXMganVzdCBkZXN0cm95ZWQgYWJvdmUsIHNvIGJvb3RzdHJhcCB0aGUgbmFtZXNwYWNlXG4gICAgICAvLyBvbiB0aGUgZXhpc3Rpbmcgd2luZG93J3MgT1dOIGJhc2UgcGF0aCwgbm90IG9uIGB2YXVsdFBhdGhgICh3aGljaCBubyBsb25nZXIgaGFzXG4gICAgICAvLyBBIGxpdmUgdGFyZ2V0IHRvIG1hdGNoKS5cbiAgICAgIGNvbnN0IHJlbW92YWxUYXJnZXQgPSBlbnN1cmVOb25OdWxsYWJsZSh0YXJnZXRzWzBdKTtcbiAgICAgIGNvbnN0IHJlbW92YWxCYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgocmVtb3ZhbFRhcmdldCk7XG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHJlbW92YWxUYXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHJlbW92YWxCYXNlUGF0aCk7XG4gICAgICAgIGNvbnN0IHZhdWx0UmVtb3ZlRXhwcmVzc2lvbiA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbDogJ3ZhdWx0LXJlbW92ZScsIGNoYW5uZWxBcmd1bWVudHM6IFt2YXVsdFBhdGhdIH0pfSlgO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogdmF1bHRSZW1vdmVFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBObyBDRFAgdGFyZ2V0cyBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgIGRpZFJlbW92ZVZhdWx0RnJvbUNvbmZpZyh2YXVsdFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhbmQgc3RvcmVzIHRoZSBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCAob25cbiAgICoge0BsaW5rIGdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eX0pIGZyb20gYW4gYWxyZWFkeS1yZWFkIHZlcnNpb24gcGFpciwgd2FybmluZ1xuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBOZXZlciB0aHJvd3M7IGFcbiAgICogYm9vdCB3aG9zZSBydW5uaW5nIGFwcCB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlIGlzIHNraXBwZWQgKG5vdGhpbmcgdG8ganVkZ2UpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwVmVyc2lvbiAtIFRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICogQHBhcmFtIGFjdHVhbEVsZWN0cm9uVmVyc2lvbiAtIFRoZSBsaXZlIEVsZWN0cm9uIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlFbGVjdHJvbkNvbXBhdGliaWxpdHkoYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBhY3R1YWxFbGVjdHJvblZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSh7XG4gICAgICBhY3R1YWxFbGVjdHJvblZlcnNpb24sXG4gICAgICBhcHBWZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IGdldFZlcnNpb25NZXRhZGF0YShhcHBWZXJzaW9uKVxuICAgIH0pO1xuICAgIHRoaXMuZWxlY3Ryb25Db21wYXRpYmlsaXR5ID0gdmVyZGljdDtcbiAgICBpZiAodmVyZGljdC50aWVyID09PSAnbmFnZ2VkJyAmJiB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdICR7ZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9pbnRzIHRoZSBvd25lZCBpbnN0YW5jZSdzIHJlbmRlcmVyIGF0IHRoaXMgcHJvY2VzcydzIGxpdmVuZXNzIHNvY2tldCBzbyBpdFxuICAgKiBkZXN0cm95cyBpdHNlbGYgaWYgd2UgZGllIHdpdGhvdXQgcnVubmluZyB0ZWFyZG93biAoc2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgKS5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQgYnkgZGVzaWduLiBBIHJlbmRlcmVyIHdpdGhvdXQgTm9kZSBhY2Nlc3MgcmVwb3J0cyBgJ3VuYXZhaWxhYmxlJ2BcbiAgICogYW5kIGFuIGV2YWx1YXRpb24gZmFpbHVyZSBpcyBsb2dnZWQgYW5kIHN3YWxsb3dlZDogdGhlIHdhdGNoZG9nIGlzIGEgYmFja3N0b3BcbiAgICogZm9yIGFuIGFscmVhZHktYWJub3JtYWwgZXhpdCwgbmV2ZXIgYSByZWFzb24gdG8gZmFpbCBhbiBvdGhlcndpc2UgZ29vZCBsYXVuY2guXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICogQHBhcmFtIHBhcmVudExpdmVuZXNzUG9ydCAtIFRoZSBsb29wYmFjayBwb3J0IHRoZSByZW5kZXJlciBzaG91bGQgY29ubmVjdCBiYWNrIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcm1QYXJlbnRMaXZlbmVzc1dhdGNoZG9nKHZhdWx0UGF0aDogc3RyaW5nLCBwYXJlbnRMaXZlbmVzc1BvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24ocGFyZW50TGl2ZW5lc3NQb3J0KSwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBhcmVudC1saXZlbmVzcyB3YXRjaGRvZyBvbiBwb3J0ICR7U3RyaW5nKHBhcmVudExpdmVuZXNzUG9ydCl9OiAke3Jlc3VsdH0uYCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBhcm0gdGhlIHBhcmVudC1saXZlbmVzcyB3YXRjaGRvZyAoaW5zdGFuY2UgbWF5IG91dGxpdmUgYSBraWxsZWQgaGFybmVzcyk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHJlYWR5IHZhdWx0IGlzIGFjdHVhbGx5IHVzaW5nIHRoZSByZXF1ZXN0ZWQgY29uZmlnIGZvbGRlcixcbiAgICogdGhyb3dpbmcge0BsaW5rIENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3J9IHdoZW4gaXQgaXMgbm90LlxuICAgKlxuICAgKiBPYnNpZGlhbiBhcHBsaWVzIHRoZSBvdmVycmlkZSB3aXRoIGBzZXRDb25maWdEaXJgLCB3aGljaCBzdWJzdGl0dXRlc1xuICAgKiBgLm9ic2lkaWFuYCBmb3IgYW55IHZhbHVlIGl0cyBvd24gYHZhbGlkYXRlQ29uZmlnRGlyYCByZWplY3RzIFx1MjAxNCB3aXRob3V0IGFcbiAgICogd29yZCwgYW5kIHdpdGhvdXQgZmFpbGluZyB0aGUgYm9vdC4gVGhlIHJlc3VsdGluZyB2YXVsdCBvcGVucywgcmVhY2hlc1xuICAgKiBsYXlvdXQtcmVhZHksIGFuZCByZXBvcnRzIHN1Y2Nlc3M7IHdoYXQgaXQgbGFja3MgaXMgdGhlIHNldHRpbmdzIGFuZCBlbmFibGVkXG4gICAqIHBsdWdpbnMgb2YgdGhlIGZvbGRlciB0aGF0IHdhcyBhc2tlZCBmb3IuIFJlYWRpbmcgdGhlIGxpdmVcbiAgICogYGFwcC52YXVsdC5jb25maWdEaXJgIGJhY2sgaXMgdGhlIG9ubHkgd2F5IHRvIHRlbGwgdGhlIHR3byBhcGFydCwgYW5kIGl0XG4gICAqIGNvdmVycyBldmVyeSBjYXVzZSBhdCBvbmNlOiBhIG5hbWUgT2JzaWRpYW4gcmVqZWN0ZWQgKGluY2x1ZGluZyBpdHNcbiAgICogdW5yZWNvdmVyYWJsZSBjaGFyYWN0ZXIgYmxhY2tsaXN0LCB3aGljaCBgYXNzZXJ0VmFsaWRDb25maWdEaXJlY3RvcnlgIGRlbGliZXJhdGVseVxuICAgKiBkb2VzIG5vdCBndWVzcyBhdCksIGFuZCBhIHdyaXRlIHRoYXQgbmV2ZXIgcmVhY2hlZCB0aGUgdmF1bHQncyByZW5kZXJlci5cbiAgICpcbiAgICogQSBuby1vcCB3aGVuIG5vIG92ZXJyaWRlIHdhcyByZXF1ZXN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlcnRSZXF1ZXN0ZWRDb25maWdEaXJlY3RvcnkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb25maWdEaXJlY3RvcnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdHVhbENvbmZpZ0RpcmVjdG9yeSA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ2FwcC52YXVsdC5jb25maWdEaXInLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgIGlmIChhY3R1YWxDb25maWdEaXJlY3RvcnkgPT09IHRoaXMuY29uZmlnRGlyZWN0b3J5KSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBWYXVsdCBvcGVuZWQgd2l0aCB0aGUgcmVxdWVzdGVkIGNvbmZpZyBmb2xkZXIgJHt0aGlzLmNvbmZpZ0RpcmVjdG9yeX0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3Ioe1xuICAgICAgYWN0dWFsQ29uZmlnRGlyZWN0b3J5LFxuICAgICAgcmVxdWVzdGVkQ29uZmlnRGlyZWN0b3J5OiB0aGlzLmNvbmZpZ0RpcmVjdG9yeSxcbiAgICAgIHZhdWx0UGF0aFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZXJyb3IgZm9yIGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSB0aGF0IGlzIG5vIGxvbmdlciBzZXJ2aW5nIENEUCxcbiAgICogZnJvbSB0aGUgYmVzdCBldmlkZW5jZSB0aGlzIHByb2Nlc3MgaGFzLlxuICAgKlxuICAgKiBUd28gcHJvY2Vzc2VzIHNlZSB0d28gZGlmZmVyZW50IGhhbHZlcyBvZiB0aGUgZGVhdGguIFRoZSBvbmUgdGhhdCBsYXVuY2hlZFxuICAgKiB0aGUgaW5zdGFuY2UgaG9sZHMgdGhlIGNoaWxkIGFuZCBjYW4gcmVhZCB0aGUgZXhpdCBjb2RlIHN0cmFpZ2h0IG9mZiBpdDsgYVxuICAgKiB0ZXN0IHdvcmtlciBob2xkcyBub3RoaW5nIGJ1dCB0aGUgcG9ydCwgYW5kIHJlYWRzIHRoZSBzYW1lIGZhY3RzIGZyb20gdGhlXG4gICAqIGV4aXQgbWFya2VyIHRoZSBvd25lciB3cm90ZSAoYG93bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLnRzYCkuIFdpdGggbmVpdGhlclxuICAgKiBcdTIwMTQgdGhlIG1hcmtlciBsb3N0LCBvciBhIGtpbGwgc28gYWJydXB0IG5vdGhpbmcgcmVjb3JkZWQgaXQgXHUyMDE0IHRoZSBlcnJvciBzdGlsbFxuICAgKiBuYW1lcyB0aGUgaW5zdGFuY2UgYXMgdGhlIGNhdXNlLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgaXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdyBpbiBwbGFjZSBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IoKTogT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yIHtcbiAgICBjb25zdCBleGl0SW5mbyA9IHRoaXMub3duZWRJbnN0YW5jZT8ucmVhZEV4aXRJbmZvKCk7XG4gICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcih7XG4gICAgICAgIGNkcFVybDogdGhpcy5jZHBVcmwsXG4gICAgICAgIGNvZGU6IGV4aXRJbmZvLmNvZGUsXG4gICAgICAgIG91dHB1dFRhaWw6IHRoaXMub3duZWRJbnN0YW5jZT8ucmVhZE91dHB1dCgpLFxuICAgICAgICBzaWduYWw6IGV4aXRJbmZvLnNpZ25hbCxcbiAgICAgICAgc3Bhd25FcnJvcjogZXhpdEluZm8uc3Bhd25FcnJvclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlcih0aGlzLmNkcFVybCwgcmVhZE93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHRoaXMuY2RwUG9ydCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcCAoYXNhcikgdmVyc2lvbiBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiwgc3RvcmluZyB0aGVcbiAgICogdmVyZGljdCBvbiB7QGxpbmsgZ2V0QXNhckZhbGxiYWNrfS4gT24gYSAqKnNpbGVudCBmYWxsYmFjayoqICh0aGUgaW5zdGFsbGVyIHJhblxuICAgKiBpdHMgb3duIGJ1bmRsZWQgYXNhciBpbnN0ZWFkIG9mIHRoZSBwaW4pIGl0IHRocm93cyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9XG4gICAqIHdoZW4gdGhlIHRocm93IGlzIGVuYWJsZWQsIG90aGVyd2lzZSB3YXJucyAod2hlbiB3YXJuaW5ncyBhcmUgb24pIGFuZCBsZXRzIHRoZVxuICAgKiBib290IHByb2NlZWQuIEEgYm9vdCB3aXRoIG5vIHN3YXBwZWQtaW4gYXNhciwgb3IgYW4gdW5yZWFkYWJsZSBydW5uaW5nIHZlcnNpb24sXG4gICAqIGlzIGAndW5rbm93bidgIFx1MjAxNCBub3RoaW5nIGlzIHRocm93biBvciB3YXJuZWQuIFRoaXMgaXMgdGhlIGhlYWx0aHktVUkgY29tcGFuaW9uIHRvXG4gICAqIHRoZSBibGFjay1zY3JlZW4ge0BsaW5rIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3J9IGRlYWQtYm9vdCBmYXN0LWZhaWwuXG4gICAqXG4gICAqIEBwYXJhbSBydW5uaW5nQXBpVmVyc2lvbiAtIFRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tSdW50aW1lQXNhckZhbGxiYWNrKHJ1bm5pbmdBcGlWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUFzYXJGYWxsYmFjayh7XG4gICAgICByZXF1ZXN0ZWRWZXJzaW9uOiB0aGlzLm93bmVkQ29uZmlnPy5hc2FyPy52ZXJzaW9uLFxuICAgICAgcnVubmluZ0FwaVZlcnNpb25cbiAgICB9KTtcbiAgICB0aGlzLmFzYXJGYWxsYmFjayA9IHZlcmRpY3Q7XG5cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uKHtcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IHRoaXMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICAgIHRpZXI6IHZlcmRpY3QudGllclxuICAgIH0pO1xuICAgIGlmIChhY3Rpb24gPT09ICd0aHJvdycpIHtcbiAgICAgIHRocm93IG5ldyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcih7XG4gICAgICAgIHJlcXVlc3RlZFZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QucmVxdWVzdGVkVmVyc2lvbiksXG4gICAgICAgIHJ1bm5pbmdBcGlWZXJzaW9uOiBlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0LnJ1bm5pbmdBcGlWZXJzaW9uKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICd3YXJuJykge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gJHtlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0Lm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBwb3N0LWJvb3QgcnVudGltZSBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIG9uY2UgdGhlXG4gICAqIHZhdWx0IGlzIHJlYWR5LiBSZWFkcyB0aGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uIGFuZCBFbGVjdHJvbiB2ZXJzaW9uICoqb25jZSoqXG4gICAqIGZyb20gdGhlIGJvb3RlZCByZW5kZXJlcidzIG1haW4gcHJvY2VzcywgdGhlbjogKDEpIHZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcFxuICAgKiB2ZXJzaW9uIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluIFx1MjAxNCB0aHJvd2luZyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9IG9uXG4gICAqIGEgc2lsZW50IGZhbGxiYWNrICh3aGVuIGVuYWJsZWQpOyBhbmQgKDIpIHJ1bnMgdGhlIGJlc3QtZWZmb3J0IHJ1bnRpbWUtRWxlY3Ryb25cbiAgICogbmFnLiBPbmx5IHRoZSBhc2FyLWZhbGxiYWNrIGNoZWNrIGNhbiB0aHJvdywgc28gdGhpcyBtdXN0IHJ1biBvdXRzaWRlIHRoZVxuICAgKiByZWFkaW5lc3MgcG9sbCdzIHRyeS9jYXRjaCAoYSBzd2FsbG93ZWQgdGhyb3cgd291bGQgbG9vcCB1bnRpbCB0aW1lb3V0KS5cbiAgICpcbiAgICogQm90aCBhcmUgcmVhZCBhdCB0aGUgcmVuZGVyZXIgdG9wIGxldmVsOiBgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZlcnNpb24nKWAgKHRoZVxuICAgKiBydW5uaW5nIGFwcCB2ZXJzaW9uLCB0cnV0aGZ1bCBldmVuIHVuZGVyIGEgc2lsZW50IGFzYXIgZmFsbGJhY2spIGFuZFxuICAgKiBgcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbmAgKHRoZSBsaXZlIHNoZWxsIEVsZWN0cm9uKTsgbmVpdGhlciB1c2VzXG4gICAqIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggcmVzb2x2ZXMgb25seSBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBBIHJlYWRcbiAgICogZmFpbHVyZSBsZWF2ZXMgYm90aCB1bmtub3duIChsb2dnZWQsIG5vbi1mYXRhbCkgXHUyMDE0IGFuIHVucmVhZGFibGUgcnVubmluZyB2ZXJzaW9uXG4gICAqIGNhbm5vdCBiZSBqdWRnZWQgYSBmYWxsYmFjaywgc28gdGhlIGJvb3QgaXMgbm90IGJyb2tlbiBieSBhIGZsYWt5IHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFjdHVhbEVsZWN0cm9uVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdBcHBWZXJzaW9uID0gYXdhaXQgdGhpcy5ldmFsdWF0ZSgnU3RyaW5nKHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhcXCd2ZXJzaW9uXFwnKSknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgYXBwVmVyc2lvbiA9IHJhd0FwcFZlcnNpb24gPT09ICcnIHx8IHJhd0FwcFZlcnNpb24gPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogcmF3QXBwVmVyc2lvbjtcbiAgICAgIGFjdHVhbEVsZWN0cm9uVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyhwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZWFkIHJ1bnRpbWUgdmVyc2lvbnMgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGYWlscyBmYXN0ICh3aGVuIGVuYWJsZWQpIG9uIGEgc2lsZW50IGFzYXIgZmFsbGJhY2sgXHUyMDE0IE1VU1QgcnVuIGJlZm9yZSB0aGVcbiAgICAvLyBiZXN0LWVmZm9ydCBuYWcgYW5kIG91dHNpZGUgYW55IHRyeS9jYXRjaCBzbyB0aGUgdGhyb3cgZXNjYXBlcyB0aGUgcG9sbC5cbiAgICB0aGlzLmNoZWNrUnVudGltZUFzYXJGYWxsYmFjayhhcHBWZXJzaW9uKTtcbiAgICB0aGlzLmFwcGx5RWxlY3Ryb25Db21wYXRpYmlsaXR5KGFwcFZlcnNpb24sIGFjdHVhbEVsZWN0cm9uVmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdG8gYSBDRFAgdGFyZ2V0J3MgV2ViU29ja2V0IGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gY29ubmVjdCB0by5cbiAgICogQHJldHVybnMgVGhlIG9wZW4gV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RUb1RhcmdldCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8V2ViU29ja2V0PiB7XG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHRhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgdG8gQ0RQIHRhcmdldDogJHt0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmx9YCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHdzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMud3MgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQWN0cyBhcyBhIHNhZmV0eSBuZXQgd2hlbiBgZW5hYmxlLXBsdWdpbi08aWQ+YCBpcyB3cml0dGVuIGluIG9uZSByZW5kZXJlclxuICAgKiBidXQgbm90IHlldCB2aXNpYmxlIHRvIHRoZSBuZXdseS1vcGVuZWQgdmF1bHQncyByZW5kZXJlciAocmFjZSBvYnNlcnZlZFxuICAgKiBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gQW4gb3BlbiBXZWJTb2NrZXQgdG8gYW4gZXhpc3RpbmcgT2JzaWRpYW4gdGFyZ2V0LlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHdzOiBXZWJTb2NrZXQsIHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gKX0sICd0cnVlJyk7YCxcbiAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZXJlIGlzIGFuIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gICAqXG4gICAqIFJldXNlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBpdCB0YXJnZXRzIHRoZSByZXF1ZXN0ZWQgdmF1bHQuXG4gICAqIE90aGVyd2lzZSwgZmluZHMgdGhlIGNvcnJlY3QgdGFyZ2V0IGFuZCByZWNvbm5lY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdGFyZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4gJiYgdGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMud3M7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgIHRoaXMud3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gdmF1bHRQYXRoO1xuICAgIHJldHVybiB0aGlzLndzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIE9ic2lkaWFuIHdpdGggYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0RQIG5vdCByZWFjaGFibGUuIFN0YXJ0aW5nIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZy4uLicpO1xuXG4gICAgY29uc3QgbGF1bmNoQ29tbWFuZCA9IGF3YWl0IGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCh0aGlzLmNkcFBvcnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGxhdW5jaENvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBsYXVuY2ggY29tbWFuZCBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMgXHUyMDE0IHdlJ2xsIHN0aWxsIHRyeSBwb2xsaW5nLlxuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIENEUCBlbmRwb2ludCBhdCAke3RoaXMuY2RwVXJsfSAodGltZW91dD0ke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IGRlbGF5KEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCByZWFkeSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gQ0RQIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nLi4uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPYnNpZGlhbiBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgYWNjZXNzaWJsZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgQ0RQIHRhcmdldCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdmF1bHQgb3Blbi5cbiAgICpcbiAgICogUHJvYmVzIGV2ZXJ5IHRhcmdldCBieSBldmFsdWF0aW5nIGBnZXRCYXNlUGF0aCgpYCBhbmQgcmV0dXJucyB0aGUgb25lIHdob3NlXG4gICAqIGJhc2UgcGF0aCBtYXRjaGVzIGB2YXVsdFBhdGhgICh2aWEge0BsaW5rIGFyZVZhdWx0UGF0aHNNYXRjaGluZ30sIHRvbGVyYW50IG9mXG4gICAqIHNlcGFyYXRvci9jYXNlIGRpZmZlcmVuY2VzKS4gQSBzaW5nbGUgdGFyZ2V0IGlzICoqbm90KiogcmV0dXJuZWQgYmxpbmRseTogd2l0aFxuICAgKiBtb3JlIHRoYW4gb25lIHZhdWx0IG9wZW4gKGF0dGFjaCBtb2RlJ3Mgc2hhcmVkIGluc3RhbmNlKSwgdGhlIHNvbGUtdGFyZ2V0XG4gICAqIHNob3J0Y3V0IHdvdWxkIHJldHVybiB3aGljaGV2ZXIgd2luZG93IGhhcHBlbnMgdG8gYmUgb3BlbiByZWdhcmRsZXNzIG9mIHdoaWNoXG4gICAqIHZhdWx0IHdhcyByZXF1ZXN0ZWQgXHUyMDE0IHRoZSBleGFjdCBtaXMtcm91dGluZyB0aGlzIG1ldGhvZCBtdXN0IGF2b2lkLiBBIHRhcmdldFxuICAgKiB3aG9zZSBwcm9iZSB0aHJvd3MgaXMgdHJlYXRlZCBhcyBub3QtcmVhZHkgYW5kIHNraXBwZWQgKHRoZSBjYWxsZXIncyByZWFkaW5lc3NcbiAgICogcG9sbCByZXRyaWVzKTsgYSB0YXJnZXQgd2hvc2UgcHJvYmUgc3VjY2VlZHMgYnV0IGRvZXMgbm90IG1hdGNoIGlzIG5ldmVyXG4gICAqIHJldHVybmVkLiBXaGVuIG5vdGhpbmcgbWF0Y2hlcywgdGhyb3cgc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gbWF0Y2guXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBDRFAgdGFyZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENkcFRhcmdldD4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG5cbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgZm91bmQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgodGFyZ2V0KTtcbiAgICAgICAgaWYgKGFyZVZhdWx0UGF0aHNNYXRjaGluZyhiYXNlUGF0aCwgdmF1bHRQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBOb3QgYSB2YXVsdCB0YXJnZXQgb3Igbm90IHJlYWR5LlxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ0RQIHRhcmdldCBmb3VuZCBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgcGFnZS10eXBlIHRhcmdldHMgZnJvbSB0aGUgQ0RQIGAvanNvbmAgZW5kcG9pbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIHBhZ2UgdGFyZ2V0cy5cbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbm8gQ0RQIGVuZHBvaW50IGlzIGNvbmZpZ3VyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlVGFyZ2V0cygpOiBQcm9taXNlPENkcFRhcmdldFtdPiB7XG4gICAgaWYgKCF0aGlzLmNkcFVybCkge1xuICAgICAgLy8gQW4gb3duZWQgaW5zdGFuY2UgcGlja3MgaXRzIHBvcnQgYXQgbGF1bmNoLCBzbyBiZWZvcmUgYHJlZ2lzdGVyVmF1bHRgIHRoZXJlIGlzIG5vIGVuZHBvaW50IGFuZFxuICAgICAgLy8gYHRoaXMuY2RwVXJsYCBpcyBzdGlsbCBlbXB0eSAtLSB3aGljaCB1c2VkIHRvIG1ha2UgdGhpcyBhIGBmZXRjaCgnL2pzb24nKWAgYW5kIGZhaWwgd2l0aFxuICAgICAgLy8gYEZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAvanNvbmAsIGFuIGVycm9yIG5hbWluZyBuZWl0aGVyIHRoZSB0cmFuc3BvcnQgbm9yIHdoYXQgd2VudCB3cm9uZy5cbiAgICAgIC8vIEEgdHJhbnNwb3J0IGluIHRoaXMgc3RhdGUgaXMgYWx3YXlzIGEgc3ltcHRvbSBvZiBzb21ldGhpbmcgdXBzdHJlYW0gKGEgZmFpbGVkIGdsb2JhbCBzZXR1cCwgYVxuICAgICAgLy8gd29ya2VyIHdpdGggbm8gcmVnaXN0ZXJlZCByZXNvbHZlcnMgLS0gTDkpLCBzbyBzYXkgc28gcmF0aGVyIHRoYW4gcmVwb3J0IGEgbWFsZm9ybWVkIFVSTC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIENEUCBlbmRwb2ludCBjb25maWd1cmVkOiB0aGUgb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGxhdW5jaGVkIHlldCwgYW5kIG5vIGBwb3J0YCAnXG4gICAgICAgICAgKyAnd2FzIGdpdmVuIHRvIGF0dGFjaCB0byBhIHJ1bm5pbmcgb25lLiBBIHRlc3Qgd29ya2VyIGluIHRoaXMgc3RhdGUgdXN1YWxseSBtZWFucyBpdHMgZ2xvYmFsIHNldHVwICdcbiAgICAgICAgICArICdmYWlsZWQsIG9yIHRoZSBwcm9qZWN0IGlzIG1pc3NpbmcgdGhlIHBlci13b3JrZXIgc2V0dXAgZmlsZSBpbiBgc2V0dXBGaWxlc2AuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY2RwVXJsfS9qc29uYCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8qXG4gICAgICAgKiBBbiB1bnJlYWNoYWJsZSBlbmRwb2ludCBtZWFucyBkaWZmZXJlbnQgdGhpbmdzIGluIHRoZSB0d28gbW9kZXMsIGFuZFxuICAgICAgICogY29uZmxhdGluZyB0aGVtIGlzIHdoYXQgcHJvZHVjZWQgdGhlIGBFQ09OTlJFRlVTRURgIGNhc2NhZGVzLiBUaGVcbiAgICAgICAqIGhhcm5lc3Mgb3ducyB0aGlzIHBvcnQgYW5kIG5vdGhpbmcgZWxzZSBtYXkgaG9sZCBpdCwgc28gbm90aGluZ1xuICAgICAgICogYW5zd2VyaW5nIG1lYW5zIE9VUiBpbnN0YW5jZSBpcyBnb25lIFx1MjAxNCBzYXkgdGhhdCwgd2l0aCBpdHMgZXhpdCBjb2RlXG4gICAgICAgKiB3aGVuIGl0IGlzIGtub3duLiBJbiBwbGFpbiBhdHRhY2ggbW9kZSB0aGUgZW5kcG9pbnQgYmVsb25ncyB0byBhXG4gICAgICAgKiBmb3JlaWduIE9ic2lkaWFuIHRoYXQgaXMgc2ltcGx5IG5vdCBydW5uaW5nLCB3aGljaCBgZW5zdXJlT2JzaWRpYW5SdW5uaW5nYFxuICAgICAgICogaGFuZGxlcyBieSBzdGFydGluZyBvbmU7IHRoYXQgcGF0aCBtdXN0IGtlZXAgc2VlaW5nIHRoZSByYXcgZmFpbHVyZS5cbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMub3duZWRDb25maWcgfHwgdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlKSB7XG4gICAgICAgIHRocm93IHRoaXMuYnVpbGRPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgIHJldHVybiB0YXJnZXRzLmZpbHRlcigodCkgPT4gdC50eXBlID09PSAncGFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzb2NrZXQncyBpbi1mbGlnaHQgY29tbWFuZCBtYXAsIGluc3RhbGxpbmcgaXRzIHJlcGx5IGRpc3BhdGNoZXIgb25cbiAgICogZmlyc3QgdXNlLlxuICAgKlxuICAgKiBPTkUgYG1lc3NhZ2VgIGxpc3RlbmVyIHBlciBzb2NrZXQsIGZvciB0aGUgc29ja2V0J3Mgd2hvbGUgbGlmZSBcdTIwMTQgbm90IG9uZSBwZXJcbiAgICogY29tbWFuZC4gQSBsaXN0ZW5lciBwZXIgaW4tZmxpZ2h0IGNvbW1hbmQgbWFrZXMgdGhlIGNvdW50IHNjYWxlIHdpdGggaG93IG1hbnlcbiAgICogZXZhbHVhdGlvbnMgYSBzdWl0ZSBoYXMgaW4gZmxpZ2h0IGF0IG9uY2UsIHNvIGEgY29uc3VtZXIgdGhhdCBmaXJlcyBlbGV2ZW5cbiAgICogY29uY3VycmVudCBgZXZhbEluT2JzaWRpYW5gIGNhbGxzIGNyb3NzZXMgTm9kZSdzIGRlZmF1bHQgYG1heExpc3RlbmVyc2Agb2YgMTBcbiAgICogYW5kIGlzIHRvbGQgaXRzIHRyYW5zcG9ydCBpcyBsZWFraW5nIG1lbW9yeSwgd2hpY2ggaXQgaXMgbm90OiBtZWFzdXJlZFxuICAgKiAyMDI2LTA5LTE1LCBmaWZ0ZWVuIGNvbmN1cnJlbnQgZXZhbHVhdGlvbnMgcmVnaXN0ZXJlZCBmaWZ0ZWVuIGxpc3RlbmVycyBvbiB0aGVcbiAgICogb25lIGxvbmctbGl2ZWQgc29ja2V0IGFuZCB0aGUgY291bnQgZmVsbCBiYWNrIHRvIHplcm8gdGhlIG1vbWVudCB0aGV5IHNldHRsZWQuXG4gICAqIEEgd2FybmluZyB0aGF0IGZpcmVzIG9uIGNvcnJlY3QgdXNlIGlzIHdvcnNlIHRoYW4gbm8gd2FybmluZywgYmVjYXVzZSB0aGUgcmVhbFxuICAgKiBzaWduYWwgXHUyMDE0IGFuIGVudHJ5IHRoYXQgaXMgYWRkZWQgYW5kIG5ldmVyIHJlbW92ZWQgXHUyMDE0IGlzIHRoZW4gaW5kaXN0aW5ndWlzaGFibGVcbiAgICogZnJvbSBpdC4gV2l0aCBvbmUgZGlzcGF0Y2hlciB0aGUgbGlzdGVuZXIgY291bnQgaXMgYSBjb25zdGFudCwgYW5kIGEgZ2VudWluZVxuICAgKiBsZWFrIHNob3dzIGluc3RlYWQgYXMgYSBwZW5kaW5nIG1hcCB0aGF0IG5ldmVyIGVtcHRpZXMuXG4gICAqXG4gICAqIFRoZSBkaXNwYXRjaGVyIGlzIGRlbGliZXJhdGVseSBmb3JnaXZpbmcgYWJvdXQgd2hhdCBhcnJpdmVzOiBhIENEUCAqKmV2ZW50KipcbiAgICogY2FycmllcyBubyBgaWRgIGFuZCBiZWxvbmdzIHRvIG5vIGNvbW1hbmQsIGFuZCBhIGZyYW1lIHRoYXQgaXMgbm90IEpTT04gYXQgYWxsXG4gICAqIGJlbG9uZ3MgdG8gbm90aGluZyB0aGlzIHRyYW5zcG9ydCBzZW50LiBCb3RoIGFyZSBpZ25vcmVkLiBUaGUgb2xkIHBlci1jb21tYW5kXG4gICAqIGhhbmRsZXIgcGFyc2VkIHVuZ3VhcmRlZCwgc28gb25lIGZyYW1lIHRoYXQgaXMgbm90IEpTT04gdGhyZXcgb25jZSBwZXJcbiAgICogaW4tZmxpZ2h0IGNvbW1hbmQsIG91dCBvZiB0aGUgZXZlbnQgZGlzcGF0Y2gsIHdoZXJlIG5vdGhpbmcgY291bGQgY2F0Y2ggaXQuXG4gICAqXG4gICAqIEBwYXJhbSB3cyAtIFRoZSBzb2NrZXQgd2hvc2UgcmVwbGllcyBhcmUgYmVpbmcgYXdhaXRlZC5cbiAgICogQHJldHVybnMgVGhlIHNvY2tldCdzIG1hcCBvZiBpbi1mbGlnaHQgY29tbWFuZHMsIGtleWVkIGJ5IENEUCBtZXNzYWdlIGlkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQZW5kaW5nQ29tbWFuZHMod3M6IFdlYlNvY2tldCk6IE1hcDxudW1iZXIsIFBlbmRpbmdDb21tYW5kPiB7XG4gICAgY29uc3QgZXhpc3RpbmdQZW5kaW5nQ29tbWFuZHMgPSB0aGlzLnBlbmRpbmdDb21tYW5kc0J5U29ja2V0LmdldCh3cyk7XG4gICAgaWYgKGV4aXN0aW5nUGVuZGluZ0NvbW1hbmRzKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdQZW5kaW5nQ29tbWFuZHM7XG4gICAgfVxuXG4gICAgY29uc3QgcGVuZGluZ0NvbW1hbmRzID0gbmV3IE1hcDxudW1iZXIsIFBlbmRpbmdDb21tYW5kPigpO1xuICAgIHRoaXMucGVuZGluZ0NvbW1hbmRzQnlTb2NrZXQuc2V0KHdzLCBwZW5kaW5nQ29tbWFuZHMpO1xuICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2U6IENkcFJlc3BvbnNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04ucGFyc2UoU3RyaW5nKGV2ZW50LmRhdGEpKSBhcyBDZHBSZXNwb25zZTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlbmRpbmdDb21tYW5kID0gcGVuZGluZ0NvbW1hbmRzLmdldChtZXNzYWdlLmlkKTtcbiAgICAgIGlmICghcGVuZGluZ0NvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nQ29tbWFuZHMuZGVsZXRlKG1lc3NhZ2UuaWQpO1xuICAgICAgcGVuZGluZ0NvbW1hbmQobWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGVuZGluZ0NvbW1hbmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBjdXJyZW50bHktcnVubmluZyBvd25lZCBpbnN0YW5jZSAoaWYgYW55KSBhbmQgd2FpdHMgZm9yIGl0IHRvIGV4aXQsXG4gICAqIHNvIHRoZSBuZXh0IGxhdW5jaCBnZXRzIGEgcHJpc3RpbmUgc2luZ2xlLXdpbmRvdyBpbnN0YW5jZS5cbiAgICpcbiAgICogUmVsYXVuY2hpbmcgb3ZlciBhIGxpdmUgaW5zdGFuY2UgaXMgZm9yd2FyZGVkIGJ5IEVsZWN0cm9uJ3Mgc2luZ2xlLWluc3RhbmNlXG4gICAqIGxvY2sgb24gdGhlIHNoYXJlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGFuZCBzdXJmYWNlcyB0aGUgdmF1bHQgcGlja2VyLCBhbmQgb3BlbmluZyBhXG4gICAqIHNlY29uZCB3aW5kb3cgdmlhIElQQyBsZWF2ZXMgc3RhbGUgd2luZG93cyB0aGF0IGJyZWFrIHZhdWx0LXRhcmdldCByb3V0aW5nIFx1MjAxNFxuICAgKiBoZW5jZSBhIGZ1bGwga2lsbCArIHdhaXQtZm9yLWV4aXQgKHJlbGVhc2luZyB0aGUgbG9jaykgYmV0d2VlbiBsYXVuY2hlcy4gQVxuICAgKiBuby1vcCBvbiB0aGUgZmlyc3QgYXR0ZW1wdCwgd2hlbiBubyBpbnN0YW5jZSBpcyBydW5uaW5nIHlldC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMga2lsbFJ1bm5pbmdPd25lZEluc3RhbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vd25lZEluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIEtpbGxpbmcgcnVubmluZyBvd25lZCBpbnN0YW5jZSBiZWZvcmUgKHJlKWxhdW5jaC4nKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBjb25zdCBwcmV2aW91c0NkcFVybCA9IHRoaXMuY2RwVXJsO1xuICAgIHRoaXMub3duZWRJbnN0YW5jZS5raWxsKCk7XG4gICAgdGhpcy5vd25lZEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckluc3RhbmNlRXhpdChwcmV2aW91c0NkcFVybCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIG93bmVkIGluc3RhbmNlJ3Mgd2luZG93IG9mZi1zY3JlZW4gc28gYSBoaWRkZW4gcnVuIG5ldmVyIHN0ZWFsc1xuICAgKiBmb2N1cy4gVXNlcyBFbGVjdHJvbidzIHJlbW90ZSBicmlkZ2UgKGB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlYCkgXHUyMDE0IHRoZSBvbmx5XG4gICAqIGNyb3NzLXBsYXRmb3JtIHdheSB0byByZXBvc2l0aW9uIHRoZSB3aW5kb3cgXHUyMDE0IHBsYWNpbmcgaXQganVzdCBiZXlvbmQgdGhlXG4gICAqIHJpZ2h0IGVkZ2Ugb2YgYWxsIGRpc3BsYXlzLiBUaGUgd2luZG93IHN0YXlzIFwidmlzaWJsZVwiIHRvIENocm9taXVtIChzb1xuICAgKiB0aW1lcnMsIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLCBgOmhvdmVyYCwgYW5kIHRydXN0ZWQgaW5wdXQga2VlcCB3b3JraW5nKSxcbiAgICogdW5saWtlIG1pbmltaXppbmcsIHdoaWNoIHdvdWxkIGZyZWV6ZSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC5cbiAgICpcbiAgICogVGhlIHJlbW90ZSBicmlkZ2UgaXMgbm90IGF2YWlsYWJsZSB0aGUgaW5zdGFudCBDRFAgc3RhcnRzIHNlcnZpbmcsIHNvIHRoaXNcbiAgICogcG9sbHMgdW50aWwgdGhlIG1vdmUgc3VjY2VlZHMuIEJlc3QtZWZmb3J0OiBpZiB0aGUgd2luZG93IGNhbm5vdCBiZSBtb3ZlZFxuICAgKiB3aXRoaW4gdGhlIHRpbWVvdXQsIHRoZSBrZWVwLWFsaXZlIGxhdW5jaCBmbGFncyBzdGlsbCBhcHBseSBhbmQgdGhlIHJ1blxuICAgKiBwcm9jZWVkcyAod29yc3QgY2FzZSB0aGUgd2luZG93IGlzIGJyaWVmbHkgdmlzaWJsZSkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdmVPd25lZFdpbmRvd09mZnNjcmVlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBFbGVjdHJvbiByZW1vdGUgYnJpZGdlIHR3byB3YXlzIHNvIEJPVEggbW9kZXJuIGFuZCBvbGQgT2JzaWRpYW5cbiAgICAvLyBjYW4gYmUgbW92ZWQgb2ZmLXNjcmVlbjogbW9kZXJuIGluamVjdHMgYHdpbmRvdy5lbGVjdHJvbi5yZW1vdGVgOyBvbGRcbiAgICAvLyB2ZXJzaW9ucyAobm8gYHdpbmRvdy5lbGVjdHJvbmApIHN0aWxsIGV4cG9zZSB0aGUgYnVpbHQtaW4gYHJlbW90ZWAgbW9kdWxlIHZpYVxuICAgIC8vIGByZXF1aXJlKCdlbGVjdHJvbicpYCBpbiB0aGUgbm9kZS1pbnRlZ3JhdGVkIHJlbmRlcmVyIChyZW1vdmVkIGZyb20gRWxlY3Ryb25cbiAgICAvLyAxNCssIGJ1dCBwcmVzZW50IG9uIHRoZSBFbGVjdHJvbiA4LTEzIHNoZWxscyBvbGQgT2JzaWRpYW4gc2hpcHMpLiBSZXR1cm5pbmdcbiAgICAvLyBgbW92ZWRgIG9uIHRoZSBmaXJzdCBzdWNjZXNzIGlzIGltcG9ydGFudCBvbiBFbGVjdHJvbiAxMC1lcmEgYnVpbGRzOiBwb2xsaW5nXG4gICAgLy8gb24gd2l0aG91dCBhIHJlc29sdmFibGUgYnJpZGdlIGhhbW1lcnMgdGhlIHJlbmRlcmVyIHdpdGggQ0RQIHJvdW5kLXRyaXBzXG4gICAgLy8gZHVyaW5nIGJvb3QgYW5kIGludGVybWl0dGVudGx5IHByZXZlbnRzIHRoZSB3b3Jrc3BhY2UgZnJvbSBpbml0aWFsaXppbmcuXG4gICAgY29uc3QgbW92ZUV4cHJlc3Npb24gPSBgKCgpID0+IHtcbiAgICAgIGxldCByZW1vdGUgPSAod2luZG93LmVsZWN0cm9uICYmIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUpIHx8IG51bGw7XG4gICAgICBpZiAoIXJlbW90ZSkge1xuICAgICAgICB0cnkgeyByZW1vdGUgPSByZXF1aXJlKCdlbGVjdHJvbicpLnJlbW90ZSB8fCBudWxsOyB9IGNhdGNoIChyZXF1aXJlRXJyb3IpIHsgcmVtb3RlID0gbnVsbDsgfVxuICAgICAgfVxuICAgICAgaWYgKCFyZW1vdGUgfHwgdHlwZW9mIHJlbW90ZS5nZXRDdXJyZW50V2luZG93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHdpbmRvdy5hcHAgPT09ICd1bmRlZmluZWQnKSA/ICdub3QtcmVhZHknIDogJ25vLWJyaWRnZSc7XG4gICAgICB9XG4gICAgICBjb25zdCB3aW4gPSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpO1xuICAgICAgY29uc3QgZGlzcGxheXMgPSByZW1vdGUuc2NyZWVuLmdldEFsbERpc3BsYXlzKCk7XG4gICAgICBjb25zdCBtYXhSaWdodCA9IE1hdGgubWF4KC4uLmRpc3BsYXlzLm1hcCgoZGlzcGxheSkgPT4gZGlzcGxheS5ib3VuZHMueCArIGRpc3BsYXkuYm91bmRzLndpZHRoKSk7XG4gICAgICB3aW4uc2V0UG9zaXRpb24obWF4UmlnaHQgKyAke1N0cmluZyhPV05FRF9XSU5ET1dfT0ZGU0NSRUVOX01BUkdJTl9JTl9QSVhFTFMpfSwgMCk7XG4gICAgICByZXR1cm4gJ21vdmVkJztcbiAgICB9KSgpYDtcblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFt0YXJnZXRdID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgICAgICBleHByZXNzaW9uOiBtb3ZlRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlID09PSAnbW92ZWQnKSB7XG4gICAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE1vdmVkIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBvZmYtc2NyZWVuIChoaWRkZW4gbW9kZSkuJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDRFAgZW5kcG9pbnQgLyB0YXJnZXQgLyByZW1vdGUgYnJpZGdlIG5vdCByZWFkeSB5ZXQgXHUyMDE0IGtlZXAgcG9sbGluZy5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KE9XTkVEX1dJTkRPV19ISURFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IG1vdmUgb3duZWQgd2luZG93IG9mZi1zY3JlZW4gd2l0aGluICR7U3RyaW5nKE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsOyBrZWVwLWFsaXZlIGZsYWdzIHN0aWxsIGFwcGxpZWQpLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgY29uZmlnLWZvbGRlciBvdmVycmlkZSBpbnRvIHRoZSBzdGFydGVyIHNjcmVlbidzIGBsb2NhbFN0b3JhZ2VgXG4gICAqIGFuZCB0aGVuIG9wZW5zIHRoZSB2YXVsdCBmcm9tIHRoZXJlIG92ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMuXG4gICAqXG4gICAqIE9ic2lkaWFuIHJlYWRzIHRoZSBvdmVycmlkZSBleGFjdGx5IG9uY2UsIGluIHRoZSB2YXVsdCdzIG93biByZW5kZXJlciwgZHVyaW5nXG4gICAqIGBWYXVsdC5zZXR1cGAgXHUyMDE0IGBnZXRPdmVycmlkZUNvbmZpZ0RpcihhcHBJZClgIGlzIGBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShhcHBJZCArXG4gICAqICctY29uZmlnJylgLiBTbyB0aGVyZSBpcyBubyB3cml0aW5nIGl0IGludG8gdGhlIHZhdWx0J3Mgd2luZG93OiBieSB0aGUgdGltZVxuICAgKiB0aGF0IHdpbmRvdyBleGlzdHMgdGhlIHJlYWQgaGFzIGhhcHBlbmVkLiBUaGUgc3RhcnRlciBzY3JlZW4gaXMgdGhlIGVhcmxpZXJcbiAgICogcmVuZGVyZXIgdGhlIHdyaXRlIG5lZWRzLCBhbmQgaXQgcXVhbGlmaWVzIGJlY2F1c2UgaXQgaGFzIGBsb2NhbFN0b3JhZ2VgIGFuZFxuICAgKiBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyYCBidXQgbm8gYGFwcGAgKHZlcmlmaWVkIG9uIDEuMTMuNykuXG4gICAqXG4gICAqIFRoYXQgbWlzc2luZyBgYXBwYCBpcyBhbHNvIHdoeSB0aGlzIHRhbGtzIHJhdyBDRFAgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICAgKiB7QGxpbmsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkfSAvIHRoZSBgaXBjU2VuZFN5bmNgIGhlbHBlciBhc1xuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5vcGVuVmF1bHRJblJ1bm5pbmdJbnN0YW5jZX0gZG9lczogZXZlcnkgb25lIG9mXG4gICAqIHRob3NlIHBhdGhzIHByb2JlcyBgYXBwLnZhdWx0LmFkYXB0ZXJgIHRvIGlkZW50aWZ5IGl0cyB0YXJnZXQsIGFuZCB3b3VsZCBmYWlsXG4gICAqIG9uIHRoZSB2ZXJ5IHJlbmRlcmVyIHRoaXMgbmVlZHMuXG4gICAqXG4gICAqIFRoZSBrZXkgbmFtZSBpcyBrbm93biBhaGVhZCBvZiB0aGUgd3JpdGUgYmVjYXVzZSB0aGUgaGFybmVzcyByZWdpc3RlcmVkIHRoZVxuICAgKiB2YXVsdCB1bmRlciBhbiBpZCBpdCBnZW5lcmF0ZWQgaXRzZWxmLCBhbmQgYHZhdWx0LW9wZW5gIHJldXNlcyB0aGF0IGVudHJ5XG4gICAqIHJhdGhlciB0aGFuIG1pbnRpbmcgYSBuZXcgb25lLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICogQHBhcmFtIHZhdWx0SWQgLSBUaGUgaGFybmVzcy1nZW5lcmF0ZWQgdmF1bHQgaWQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQgdW5kZXIuXG4gICAqIEBwYXJhbSBjb25maWdEaXJlY3RvcnkgLSBUaGUgY29uZmlnIGZvbGRlciB0byBvdmVycmlkZSB0by5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3BlblZhdWx0RnJvbVN0YXJ0ZXJTY3JlZW4odmF1bHRQYXRoOiBzdHJpbmcsIHZhdWx0SWQ6IHN0cmluZywgY29uZmlnRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZWVkaW5nIGNvbmZpZyBmb2xkZXIgb3ZlcnJpZGUgJHtjb25maWdEaXJlY3Rvcnl9IG9uIHRoZSBzdGFydGVyIHNjcmVlbi4uLmApO1xuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0ZXJTY3JlZW5UYXJnZXQoKTtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBleHByZXNzaW9uOiBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgJHt2YXVsdElkfS1jb25maWdgKX0sICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnRGlyZWN0b3J5KX0pO2AsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gKX0sICd0cnVlJyk7YCxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZXQgJHt2YXVsdElkfS1jb25maWcgYW5kIGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBleHByZXNzaW9uOiBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgJHtKU09OLnN0cmluZ2lmeSh2YXVsdFBhdGgpfSwgZmFsc2UpYCxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZW50IHZhdWx0LW9wZW4gZm9yICR7dmF1bHRQYXRofSBmcm9tIHRoZSBzdGFydGVyIHNjcmVlbi5gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd3MuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSB2YXVsdCBpbiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIHRoZSBgdmF1bHQtb3BlbmBcbiAgICogRWxlY3Ryb24gSVBDIChldmFsdWF0ZWQgdGhyb3VnaCBDRFAgb24gYW4gZXhpc3RpbmcgdGFyZ2V0KSwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgbmV3IHZhdWx0J3Mgd2luZG93IHRhcmdldCBhcHBlYXJzLCBpcyBsYXlvdXQtcmVhZHksIGFuZCBpdHMgdHJ1c3QgZGlhbG9nXG4gICAqIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogU2hhcmVkIGJ5IHRoZSBhdHRhY2gtbW9kZSB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0gYW5kIHRoZSBvd25lZC1tb2RlXG4gICAqIFwiaW5zdGFuY2UgYWxyZWFkeSBsYXVuY2hlZFwiIHBhdGgsIHNvIG9wZW5pbmcgYW4gYWRkaXRpb25hbCB2YXVsdCBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSBwcm9jZXNzICh3aGljaCB3b3VsZCBzdXJmYWNlIHRoZSB2YXVsdCBwaWNrZXIpLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgYXZhaWxhYmxlLiBJcyBPYnNpZGlhbiBydW5uaW5nPycpO1xuICAgIH1cblxuICAgIC8vIFRoZSBgdmF1bHQtb3BlbmAgSVBDIGlzIHNlbnQgdGhyb3VnaCBhbiBFWElTVElORyB3aW5kb3cgKGB0YXJnZXRzWzBdYCksIHNvIHRoZVxuICAgIC8vIGhlbHBlciBuYW1lc3BhY2UgbXVzdCBiZSBib290c3RyYXBwZWQgb24gVEhBVCB3aW5kb3cgXHUyMDE0IG5vdCBvbiBgdmF1bHRQYXRoYCwgd2hvc2VcbiAgICAvLyB3aW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LiBCb290c3RyYXBwaW5nIGFnYWluc3QgYHZhdWx0UGF0aGAgaGVyZSB3b3VsZCByb3V0ZVxuICAgIC8vIHRocm91Z2ggYGZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpYCB3aXRoIG9ubHkgdGhlIGV4aXN0aW5nIHdpbmRvdyBwcmVzZW50IGFuZFxuICAgIC8vIHBvaXNvbiB0aGUgY29ubmVjdGlvbiBjYWNoZSAobGFiZWwgYHZhdWx0UGF0aGAsIHNvY2tldCBcdTIxOTIgdGhlIGV4aXN0aW5nIHdpbmRvdyksIHNvXG4gICAgLy8gZXZlcnkgbGF0ZXIgZXZhbCBmb3IgYHZhdWx0UGF0aGAgd291bGQgbWlzLXJvdXRlIHRvIHRoZSBleGlzdGluZyB3aW5kb3cuIFByb2JlIHRoZVxuICAgIC8vIGV4aXN0aW5nIHdpbmRvdydzIG93biBiYXNlIHBhdGggYW5kIGJvb3RzdHJhcCBhZ2FpbnN0IHRoYXQgaW5zdGVhZC5cbiAgICBjb25zdCBleGlzdGluZ1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHRhcmdldHNbMF0pO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gYXdhaXQgdGhpcy5wcm9iZVZhdWx0UGF0aChleGlzdGluZ1RhcmdldCk7XG4gICAgY29uc3QgaXBjV3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldChleGlzdGluZ1RhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG4gICAgICBjb25zdCBpcGNFeHByZXNzaW9uID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsOiAndmF1bHQtb3BlbicsIGNoYW5uZWxBcmd1bWVudHM6IFt2YXVsdFBhdGgsIGZhbHNlXSB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoaXBjV3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgIGV4cHJlc3Npb246IGlwY0V4cHJlc3Npb24sXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZShpcGNXcywgdmF1bHRQYXRoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXBjV3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCB0YXJnZXQgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBWYXVsdCB0YXJnZXQgZm91bmQuJyk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCB0YXJnZXQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogU2FtcGxlcyB0aGUgdmF1bHQgcmVuZGVyZXIncyBib290c3RyYXAgc3RhdGUgXHUyMDE0IHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzXG4gICAqIGBjb21wbGV0ZWAsIHdoZXRoZXIgYHdpbmRvdy5hcHBgIGV4aXN0cywgYW5kIHRoZSBgPGJvZHk+YCBjaGlsZCBjb3VudCBcdTIwMTQgZnJvbVxuICAgKiB0aGUgZmlyc3QgcGFnZSB0YXJnZXQsIGZvciBkZWFkLWJvb3QgZGV0ZWN0aW9uLiBUaGlzIHdvcmtzIGV2ZW4gd2hlbiB0aGUgYXBwXG4gICAqIG5ldmVyIGJvb3RzdHJhcHBlZCAodGhlIHJlbmRlcmVyIHBhZ2UgdGFyZ2V0IHN0aWxsIGV4aXN0cyksIHdoaWNoIGlzIGV4YWN0bHlcbiAgICogdGhlIHN0YXRlIGl0IG11c3Qgb2JzZXJ2ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNhbXBsZWQgb2JzZXJ2YXRpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdGFyZ2V0IGlzIHJlYWNoYWJsZVxuICAgKiAgIG9yIHRoZSBwcm9iZSBmYWlsZWQgKHNvIHRoZSBjYWxsZXIga2VlcHMgcG9sbGluZyByYXRoZXIgdGhhbiBmYXN0LWZhaWxpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk6IFByb21pc2U8UmVuZGVyZXJCb290T2JzZXJ2YXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgW3RhcmdldF0gPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9iZUV4cHJlc3Npb24gPSBgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGJvZHlDaGlsZEVsZW1lbnRDb3VudDogZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJvZHkuY2hpbGRFbGVtZW50Q291bnQgOiAwLFxuICAgICAgICAgIGhhc1dpbmRvd0FwcDogdHlwZW9mIHdpbmRvdy5hcHAgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgIGlzRG9jdW1lbnRDb21wbGV0ZTogZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJ1xuICAgICAgICB9KWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogcHJvYmVFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2JlcyBhIHRhcmdldCB0byBkaXNjb3ZlciB3aGljaCB2YXVsdCBwYXRoIGl0IGhhcyBvcGVuLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IFdlYlNvY2tldCBjb25uZWN0aW9uLCBldmFsdWF0ZXMgYGdldEJhc2VQYXRoKClgLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gcHJvYmUuXG4gICAqIEByZXR1cm5zIFRoZSB2YXVsdCdzIGJhc2UgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVWYXVsdFBhdGgodGFyZ2V0OiBDZHBUYXJnZXQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgLy8gT2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBwcmVkYXRlIHRoZSBgZ2V0QmFzZVBhdGgoKWAgbWV0aG9kIGJ1dFxuICAgICAgICAvLyBleHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICAgIGV4cHJlc3Npb246ICdhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKCkgOiBhcHAudmF1bHQuYWRhcHRlci5iYXNlUGF0aCcsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFN0cmluZyhyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBhbmQgY29ubmVjdHMgdG8gYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZSBmb3IgYVxuICAgKiB2YXVsdDogcHJvdmlzaW9ucyB0aGUgYXNhciAoaWYgYW55KSwgcHJlLXNlZWRzIHRoZSBpc29sYXRlZCBgb2JzaWRpYW4uanNvbmBcbiAgICogc28gdGhlIHZhdWx0IG9wZW5zIGRpcmVjdGx5LCBsYXVuY2hlcyB0aGUgaW5zdGFuY2Ugb24gYSBmcmVlIENEUCBwb3J0LCB0aGVuXG4gICAqIHdhaXRzIHVudGlsIHRoZSB2YXVsdCB3aW5kb3cgaXMgcmVhZHkgYW5kIGRpc21pc3NlcyB0aGUgdHJ1c3QgZGlhbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJWYXVsdEluT3duZWRJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGVuc3VyZU5vbk51bGxhYmxlKHRoaXMub3duZWRDb25maWcpO1xuXG4gICAgbWtkaXJTeW5jKGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgaWYgKGNvbmZpZy5hc2FyKSB7XG4gICAgICBjb3B5QXNhckludG9Vc2VyRGF0YShjb25maWcuYXNhci5wYXRoLCBjb25maWcuYXNhci52ZXJzaW9uLCBjb25maWcudXNlckRhdGFEaXJlY3RvcnkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhdWx0SWQgPSByYW5kb21CeXRlcyhWQVVMVF9JRF9CWVRFX0xFTkdUSCkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gQSBjb25maWctZm9sZGVyIG92ZXJyaWRlIGlzIGEgYGxvY2FsU3RvcmFnZWAgZW50cnksIGFuZCBgbG9jYWxTdG9yYWdlYCBuZWVkcyBhXG4gICAgLy8gcmVuZGVyZXIsIHNvIHRoZSB2YXVsdCBtdXN0IE5PVCBhdXRvLW9wZW46IHRoZSBpbnN0YW5jZSBib290cyB0byB0aGUgc3RhcnRlclxuICAgIC8vIHNjcmVlbiwgdGhlIG92ZXJyaWRlIGlzIHdyaXR0ZW4gdGhlcmUsIGFuZCB0aGUgdmF1bHQgaXMgb3BlbmVkIGZyb20gaXQgb3ZlclxuICAgIC8vIElQQy4gT2JzaWRpYW4gcmV1c2VzIHRoZSBwcmUtcmVnaXN0ZXJlZCBpZCBmb3IgdGhhdCBvcGVuICh2ZXJpZmllZCBvbiAxLjEzLjcpLFxuICAgIC8vIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGA8dmF1bHRJZD4tY29uZmlnYCBrZXkgbmFtZSBrbm93YWJsZSBiZWZvcmUgbGF1bmNoLlxuICAgIGNvbnN0IHNob3VsZEF1dG9PcGVuVmF1bHQgPSB0aGlzLmNvbmZpZ0RpcmVjdG9yeSA9PT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gUmVsYXVuY2gtcmV0cnk6IHNvbWUgb2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIGJ1aWxkcyBpbnRlcm1pdHRlbnRseVxuICAgIC8vIGJvb3Qgd2l0aCBgd2luZG93LmFwcGAgcHJlc2VudCBidXQgdGhlIHdvcmtzcGFjZSBuZXZlciBpbml0aWFsaXppbmcsIHNvIHRoZVxuICAgIC8vIHZhdWx0IG5ldmVyIGJlY29tZXMgcmVhZHkuIEEgZnJlc2ggaW5zdGFuY2UgaXMgYW4gaW5kZXBlbmRlbnQgY2hhbmNlLiBBXG4gICAgLy8gZGV0ZXJtaW5pc3RpYyBmYWlsdXJlIChkZWFkIGJvb3QsIHNpbGVudCBhc2FyIGZhbGxiYWNrKSBpcyByZS10aHJvd24gYXQgb25jZSBcdTIwMTRcbiAgICAvLyByZXRyeWluZyBpdCBvbmx5IHdhc3RlcyB0aGUgcmVhZGluZXNzIHRpbWVvdXQuXG4gICAgbGV0IGxhc3RFcnJvcjogdW5rbm93bjtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTOyBhdHRlbXB0KyspIHtcbiAgICAgIGF3YWl0IHRoaXMua2lsbFJ1bm5pbmdPd25lZEluc3RhbmNlKCk7XG4gICAgICBpZiAoYXR0ZW1wdCA+IDEpIHtcbiAgICAgICAgYXdhaXQgZGVsYXkoT1dORURfUkVMQVVOQ0hfU0VUVExFX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLXNlZWRlZCBldmVyeSBhdHRlbXB0IHJhdGhlciB0aGFuIG9uY2UgYmVmb3JlIHRoZSBsb29wOiBPYnNpZGlhbiByZXdyaXRlc1xuICAgICAgLy8gYG9ic2lkaWFuLmpzb25gIGFzIGl0IG9wZW5zIGEgdmF1bHQgKGl0IHN0YW1wcyB0aGUgZW50cnkgYG9wZW46IHRydWVgKSwgc28gYVxuICAgICAgLy8gcmVsYXVuY2ggdGhhdCBpbmhlcml0ZWQgdGhlIHByZXZpb3VzIGF0dGVtcHQncyBmaWxlIHdvdWxkIHNhaWwgcGFzdCB0aGVcbiAgICAgIC8vIHN0YXJ0ZXIgc2NyZWVuIHRoZSBvdmVycmlkZSBuZWVkcy5cbiAgICAgIGNvbnN0IG9ic2lkaWFuSnNvbiA9IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24oeyBzaG91bGRBdXRvT3BlblZhdWx0LCB0czogRGF0ZS5ub3coKSwgdmF1bHRJZCwgdmF1bHRQYXRoIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSwgJ29ic2lkaWFuLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkob2JzaWRpYW5Kc29uKSk7XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlKHtcbiAgICAgICAgY2RwSG9zdDogdGhpcy5jZHBIb3N0LFxuICAgICAgICBleGVQYXRoOiBjb25maWcuZXhlUGF0aCxcbiAgICAgICAgZXh0cmFBcmd1bWVudHM6IFtcbiAgICAgICAgICAuLi5yZXNvbHZlT3duZWRIaWRkZW5MYXVuY2hBcmd1bWVudHModGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSksXG4gICAgICAgICAgLi4ucmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHModGhpcy5zaG91bGREaXNhYmxlU2FuZGJveClcbiAgICAgICAgXSxcblxuICAgICAgICB1c2VyRGF0YURpcmVjdG9yeTogY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5XG4gICAgICB9KTtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgdGhpcy5jZHBQb3J0ID0gaW5zdGFuY2UucG9ydDtcbiAgICAgIHRoaXMuY2RwVXJsID0gaW5zdGFuY2UuY2RwVXJsO1xuXG4gICAgICBpZiAoc2hvdWxkSGlkZU9ic2lkaWFuQXBwKHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZU93bmVkV2luZG93T2Zmc2NyZWVuKCk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghc2hvdWxkQXV0b09wZW5WYXVsdCkge1xuICAgICAgICAgIC8vIGBzaG91bGRBdXRvT3BlblZhdWx0YCBpcyBhIGBjb25zdGAgZGVyaXZlZCBmcm9tIGB0aGlzLmNvbmZpZ0RpcmVjdG9yeSA9PT0gdW5kZWZpbmVkYCxcbiAgICAgICAgICAvLyBzbyBUeXBlU2NyaXB0IG5hcnJvd3MgdGhlIGZpZWxkIHRvIGBzdHJpbmdgIGluIHRoaXMgYnJhbmNoIG9uIGl0cyBvd24uXG4gICAgICAgICAgYXdhaXQgdGhpcy5vcGVuVmF1bHRGcm9tU3RhcnRlclNjcmVlbih2YXVsdFBhdGgsIHZhdWx0SWQsIHRoaXMuY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JPd25lZFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRSZXF1ZXN0ZWRDb25maWdEaXJlY3RvcnkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcm1QYXJlbnRMaXZlbmVzc1dhdGNoZG9nKHZhdWx0UGF0aCwgaW5zdGFuY2UucGFyZW50TGl2ZW5lc3NQb3J0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgLy8gQSBjb25maWctZm9sZGVyIGZhbGxiYWNrIGlzIGRldGVybWluaXN0aWMgXHUyMDE0IHRoZSBuYW1lIGlzIGVpdGhlciBvbmUgT2JzaWRpYW5cbiAgICAgICAgLy8gYWNjZXB0cyBvciBpdCBpcyBub3QgXHUyMDE0IHNvIHJlbGF1bmNoaW5nIG9ubHkgYnVybnMgYW5vdGhlciBib290LlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yXG4gICAgICAgICAgfHwgZXJyb3IgaW5zdGFuY2VvZiBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvclxuICAgICAgICAgIHx8IGVycm9yIGluc3RhbmNlb2YgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT3duZWQgdmF1bHQgbm90IHJlYWR5IChhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTKX0pOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGxhc3RFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbGFzdEVycm9yIDogbmV3IEVycm9yKGBPd25lZCB2YXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIENEUCBjb21tYW5kIG92ZXIgV2ViU29ja2V0IGFuZCB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0gd3MgLSBUaGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgQ0RQIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIENEUCBtZXRob2QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIENEUCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZENvbW1hbmQod3M6IFdlYlNvY2tldCwgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPENkcFJlc3BvbnNlPiB7XG4gICAgY29uc3QgaWQgPSArK3RoaXMubWVzc2FnZUlkO1xuICAgIGNvbnN0IHBlbmRpbmdDb21tYW5kcyA9IHRoaXMuZ2V0UGVuZGluZ0NvbW1hbmRzKHdzKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxDZHBSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBwZW5kaW5nQ29tbWFuZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KG5ldyBDZHBDb21tYW5kVGltZW91dEVycm9yKHsgbWV0aG9kLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSk7XG4gICAgICB9LCB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuXG4gICAgICBwZW5kaW5nQ29tbWFuZHMuc2V0KGlkLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHsgaWQsIG1ldGhvZCwgcGFyYW1zIH0pKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgd2lsbCBhbnN3ZXIgYSBzZW5kIHRoYXQgdGhyZXcsIHNvIGhvbGRpbmcgdGhlIGVudHJ5IGZvciB0aGUgZnVsbCBjb21tYW5kIHRpbWVvdXQgd291bGQgb25seSBkZWxheSB0aGUgZmFpbHVyZSBhbmQgdGhlbiBtaXNuYW1lIGl0LlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHBlbmRpbmdDb21tYW5kcy5kZWxldGUoaWQpO1xuICAgICAgICByZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyBhIGtpbGxlZCBvd25lZCBpbnN0YW5jZSdzIENEUCBlbmRwb2ludCB1bnRpbCBpdCBzdG9wcyByZXNwb25kaW5nLFxuICAgKiBjb25maXJtaW5nIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgYW5kIHJlbGVhc2VkIEVsZWN0cm9uJ3Mgc2luZ2xlLWluc3RhbmNlXG4gICAqIGxvY2sgb24gdGhlIHNoYXJlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBhIGZyZXNoIGluc3RhbmNlIGlzIGxhdW5jaGVkIGludG8gaXQuXG4gICAqXG4gICAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgQ0RQIFVSTCBvZiB0aGUgaW5zdGFuY2UgdGhhdCB3YXMganVzdCBraWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbnN0YW5jZUV4aXQoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBXYWl0aW5nIGZvciBwcmV2aW91cyBvd25lZCBpbnN0YW5jZSBhdCAke2NkcFVybH0gdG8gZXhpdC4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjZHBVcmx9L2pzb25gKTtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIGVuZHBvaW50IGlzIGdvbmU6IHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgYW5kIHJlbGVhc2VkIHRoZSBsb2NrLlxuICAgICAgICBhd2FpdCBkZWxheShJTlNUQU5DRV9FWElUX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIFByZXZpb3VzIGluc3RhbmNlIHN0aWxsIHJlc3BvbmRlZCBiZWZvcmUgdGltZW91dDsgcmVsYXVuY2hpbmcgYW55d2F5LicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgdmF1bHQncyBgYXBwLndvcmtzcGFjZWAgdG8gcmVhY2ggbGF5b3V0LXJlYWR5IHN0YXRlLlxuICAgKlxuICAgKiBgZmluZFRhcmdldEZvclZhdWx0YCByZXR1cm5zIGFzIHNvb24gYXMgYGFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKClgXG4gICAqIG1hdGNoZXMgXHUyMDE0IHdoaWNoIGlzIHRydWUgc2hvcnRseSBhZnRlciB0aGUgYEFwcGAgY29uc3RydWN0b3IgcnVucywgYmVmb3JlXG4gICAqIGBwbHVnaW5zLmluaXRpYWxpemUoKWAgKGFuZCBhbnkgdHJ1c3QgZGlhbG9nKSBoYXMgZXhlY3V0ZWQuIEJvb3RzdHJhcHBpbmdcbiAgICogdGhlIG5hbWVzcGFjZSBhbmQgY2FsbGluZyBgcG9sbFZhdWx0QmFzZVBhdGgoKWAgYXdhaXRzIGBsYXlvdXRSZWFkeWAsIHNvXG4gICAqIGJ5IHRoZSB0aW1lIHRoaXMgcmV0dXJucyB0aGUgZGlhbG9nIGhhcyBlaXRoZXIgcmVuZGVyZWQgb3IgaXMgbm90IGdvaW5nXG4gICAqIHRvIHJlbmRlci5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKCd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5wb2xsVmF1bHRCYXNlUGF0aCgpJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB0aGUgb3duZWQgaW5zdGFuY2UgdW50aWwgdGhlIHZhdWx0IHRhcmdldCBleGlzdHMsIGxheW91dCBpcyByZWFkeSwgYW5kXG4gICAqIHRoZSB0cnVzdCBkaWFsb2cgKGlmIGFueSkgaGFzIGJlZW4gZGlzbWlzc2VkLlxuICAgKlxuICAgKiBCZXR3ZWVuIHJlYWRpbmVzcyBhdHRlbXB0cyBpdCBhbHNvIGNoZWNrcyBmb3IgYSAqKmRlYWQgYm9vdCoqIFx1MjAxNCB0aGUgcmVuZGVyZXJcbiAgICogbG9hZGVkIChgZG9jdW1lbnQucmVhZHlTdGF0ZWAgYCdjb21wbGV0ZSdgKSBidXQgdGhlIGFwcCBuZXZlciBib290c3RyYXBwZWRcbiAgICogKGVtcHR5IGA8Ym9keT5gLCBubyBgd2luZG93LmFwcGApLCB0aGUgdGVybWluYWwgc3RhdGUgd2hlbiB0aGUgYXNhciBjYW5ub3RcbiAgICogcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbC4gT25jZSB0aGF0IHN0YXRlIGhhcyBoZWxkIGZvciB0aGVcbiAgICogY29uZmlndXJlZCBncmFjZSB3aW5kb3cgaXQgdGhyb3dzIGEge0BsaW5rIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3J9XG4gICAqIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzIHRpbWVvdXQuIEEgZ3JhY2Ugb2ZcbiAgICogYDBgIGRpc2FibGVzIHRoZSBmYXN0LWZhaWwuIFRoZSBncmFjZSBjbG9jayBzdGFydHMgd2hlbiB0aGUgcmVuZGVyZXIgZmlyc3RcbiAgICogcmVwb3J0cyBgY29tcGxldGVgLCBzbyBhIHNsb3cgbG9hZCBiZWZvcmUgdGhlbiBpcyBuZXZlciBjb3VudGVkIGFnYWluc3QgaXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yT3duZWRWYXVsdFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igb3duZWQgdmF1bHQgdG8gYmVjb21lIHJlYWR5ICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgbGV0IGRvY3VtZW50Q29tcGxldGVTaW5jZTogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gICAgbGV0IGlzUmVhZHkgPSBmYWxzZTtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgICBpc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHZhdWx0IGlzIG5vdCByZWFkeSB5ZXQgXHUyMDE0IGFsc28gZHJvcCB0aGUgY2FjaGVkIENEUCBjb25uZWN0aW9uIGJlZm9yZVxuICAgICAgICAvLyByZXRyeWluZy4gT2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIHJlbG9hZHMgdGhlIG93bmVkIHdpbmRvdyBkdXJpbmdcbiAgICAgICAgLy8gYm9vdCwgd2hpY2ggY2FuIGxlYXZlIHRoZSBjYWNoZWQgV2ViU29ja2V0IHBpbm5lZCB0byBhIHN0YWxlIGV4ZWN1dGlvblxuICAgICAgICAvLyBjb250ZXh0OyByZWNvbm5lY3RpbmcgZWFjaCBhdHRlbXB0IHJlLWJpbmRzIHRvIHRoZSBsaXZlIGNvbnRleHQuXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmF0aW9uID0gYXdhaXQgdGhpcy5wcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk7XG4gICAgICAgIGlmIChvYnNlcnZhdGlvbikge1xuICAgICAgICAgIGlmIChvYnNlcnZhdGlvbi5pc0RvY3VtZW50Q29tcGxldGUgJiYgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkb2N1bWVudENvbXBsZXRlU2luY2UgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBoYXNHcmFjZUVsYXBzZWQgPSBkb2N1bWVudENvbXBsZXRlU2luY2UgIT09IG51bGxcbiAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBkb2N1bWVudENvbXBsZXRlU2luY2UgPj0gdGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgaWYgKHJlc29sdmVSZW5kZXJlckJvb3RTdGF0ZSh7IC4uLm9ic2VydmF0aW9uLCBoYXNHcmFjZUVsYXBzZWQgfSkgPT09ICdkZWFkJykge1xuICAgICAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT3duZWQgcmVuZGVyZXIgZmFpbGVkIHRvIGluaXRpYWxpemUgKGRlYWQgYm9vdCk7IGZhaWxpbmcgZmFzdC4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yKHZhdWx0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUmVhZHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3duZWQgdmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YXVsdCBpcyByZWFkeS4gUnVuIHRoZSBwb3N0LWJvb3QgY29tcGF0aWJpbGl0eSBjaGVja3MgaGVyZSBcdTIwMTQgT1VUU0lERSB0aGVcbiAgICAvLyBwb2xsJ3MgdHJ5L2NhdGNoIFx1MjAxNCBzbyBhIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIGZhaWxzIGZhc3QgaW5zdGVhZCBvZiBiZWluZ1xuICAgIC8vIHN3YWxsb3dlZCBhcyBcIm5vdCByZWFkeSB5ZXRcIiBhbmQgbG9vcGluZyB1bnRpbCB0aGUgcmVhZGluZXNzIHRpbWVvdXQuXG4gICAgYXdhaXQgdGhpcy5jaGVja1J1bnRpbWVDb21wYXRpYmlsaXR5KHZhdWx0UGF0aCk7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT3duZWQgdmF1bHQgaXMgcmVhZHkuJyk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgdGhlIHN0YXJ0ZXIgc2NyZWVuJ3MgcmVuZGVyZXIgY2FuIGFjY2VwdCB0aGUgY29uZmlnLWZvbGRlclxuICAgKiBvdmVycmlkZSBcdTIwMTQgdGhhdCBpcywgdW50aWwgaXQgZXhwb3NlcyBib3RoIGBsb2NhbFN0b3JhZ2VgIGFuZFxuICAgKiBgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jYC5cbiAgICpcbiAgICogQSBwYWdlIHRhcmdldCBleGlzdHMgYXMgc29vbiBhcyB0aGUgbGF1bmNoIHJlc29sdmVzLCBzbyB0aGlzIGlzIG5vdCB3YWl0aW5nXG4gICAqIGZvciBhIHdpbmRvdzsgaXQgaXMgd2FpdGluZyBmb3IgdGhhdCB3aW5kb3cncyBvd24gc2NyaXB0cyB0byBmaW5pc2guIFdyaXRpbmdcbiAgICogYmVmb3JlIHRoZW4gd291bGQgZWl0aGVyIHRocm93IG9yLCB3b3JzZSwgbGFuZCBpbiBhIHJlbmRlcmVyIHRoYXQgaXMgYWJvdXQgdG9cbiAgICogYmUgcmVwbGFjZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdGFydGVyIHNjcmVlbidzIENEUCB0YXJnZXQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG5vIHJlbmRlcmVyIGJlY29tZXMgd3JpdGFibGUgd2l0aGluIHRoZSB0aW1lb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yU3RhcnRlclNjcmVlblRhcmdldCgpOiBQcm9taXNlPENkcFRhcmdldD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFNUQVJURVJfU0NSRUVOX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246ICd0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSBcInVuZGVmaW5lZFwiICYmICEhKHdpbmRvdy5lbGVjdHJvbiAmJiB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIgJiYgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKScsXG4gICAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFRoZSByZW5kZXJlciBpcyBub3QgZXZhbHVhdGluZyB5ZXQgXHUyMDE0IGtlZXAgcG9sbGluZy5cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShTVEFSVEVSX1NDUkVFTl9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBzdGFydGVyIHNjcmVlbiBkaWQgbm90IGV4cG9zZSBsb2NhbFN0b3JhZ2UgYW5kIHRoZSBFbGVjdHJvbiBJUEMgYnJpZGdlIHdpdGhpbiAke1N0cmluZyhTVEFSVEVSX1NDUkVFTl9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIGBcbiAgICAgICAgKyAnc28gdGhlIGNvbmZpZyBmb2xkZXIgb3ZlcnJpZGUgY291bGQgbm90IGJlIHdyaXR0ZW4uJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byByZW1vdmUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHksIHJldHVybmluZyB3aGV0aGVyIGl0IHN1Y2NlZWRlZC5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiB0aGUgcmVtb3ZhbCB0aHJldyAoZS5nLiBoYW5kbGVzIGhlbGQpLlxuICovXG5mdW5jdGlvbiBkaWRSZW1vdmVEaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBybVN5bmMoZGlyZWN0b3J5LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8gbGF1bmNoIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZyBlbmFibGVkLlxuICpcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgaW5zdGFsbGVkIE9ic2lkaWFuIGV4ZWN1dGFibGUgKGNvdmVyaW5nIGluc3RhbGxlci1iYXNlZFxuICogYW5kIGBQQVRIYC1iYXNlZCBpbnN0YWxscyBzdWNoIGFzIGBzY29vcGApIGFuZCB2ZXJpZmllcyBpdCBleGlzdHMgYmVmb3JlXG4gKiByZXR1cm5pbmcgYSBjb21tYW5kLiBUaHJvd3MgaWYgT2JzaWRpYW4gaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBDRFAgcG9ydCB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIE9ic2lkaWFuIGNhbm5vdCBiZSBsb2NhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQocG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcbiAgY29uc3QgZmxhZyA9IGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke1N0cmluZyhwb3J0KX1gO1xuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGBzdGFydCBcIlwiIFwiJHtleGVQYXRofVwiICR7ZmxhZ31gO1xuICB9XG5cbiAgcmV0dXJuIGBcIiR7ZXhlUGF0aH1cIiAke2ZsYWd9ICZgO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxQkEseUJBQTRCO0FBQzVCLHFCQUlPO0FBQ1AsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQWFwQixxQ0FBb0M7QUFDcEMsZ0NBSU87QUFDUCx1Q0FBdUM7QUFDdkMsbUNBQTBDO0FBQzFDLDZDQUE2QztBQUM3QyxrQ0FBMEM7QUFDMUMsb0NBQTZDO0FBQzdDLHFDQUFxQztBQUNyQyxzQkFBaUQ7QUFDakQsa0JBQXFCO0FBQ3JCLGlCQUFvQjtBQUNwQixpQ0FBNEM7QUFDNUMsNkJBSU87QUFDUCxpQ0FBMEM7QUFDMUMsK0JBQTRDO0FBQzVDLCtCQUFtQztBQUNuQyxxQ0FBcUM7QUFDckMsd0NBQTRDO0FBQzVDLHlDQUdPO0FBQ1AsOEJBQXVDO0FBQ3ZDLDZCQUFzRDtBQUN0RCxxQ0FHTztBQUNQLGlEQUFnRDtBQUNoRCx3Q0FBd0M7QUFDeEMseUJBQWtDO0FBQ2xDLDhCQUdPO0FBQ1Asb0NBQTBDO0FBQzFDLHdCQUlPO0FBdU5QLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sdUNBQXVDO0FBQzdDLE1BQU0sOENBQThDO0FBQ3BELE1BQU0sWUFBWTtBQUNsQixNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUkzQyxNQUFNLDRCQUE0QjtBQUdsQyxNQUFNLHdDQUF3QztBQUM5QyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLDZDQUE2QztBQUtuRCxNQUFNLHlDQUF5QztBQUMvQyxNQUFNLCtDQUErQztBQUNyRCxNQUFNLDBDQUEwQztBQUNoRCxNQUFNLDRDQUE0QztB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
|