@workflow/core 5.0.0-beta.28 → 5.0.0-beta.29
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/dist/runtime/run.d.ts +6 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +9 -2
- package/dist/runtime/runs.d.ts +11 -1
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +10 -4
- package/dist/runtime/step-executor.d.ts +10 -0
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +29 -1
- package/dist/runtime/step-latency.d.ts +125 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +135 -0
- package/dist/runtime/suspension-handler.d.ts +7 -0
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +5 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +91 -15
- package/dist/telemetry/semantic-conventions.d.ts +24 -0
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +19 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +4 -4
package/dist/runtime.js
CHANGED
|
@@ -10,7 +10,9 @@ import { runtimeLogger } from './logger.js';
|
|
|
10
10
|
import { getMaxQueueDeliveries, getReplayDivergenceMaxRetries, isTurboEnabled, } from './runtime/constants.js';
|
|
11
11
|
import { getQueueOverhead, getWorkflowQueueName, handleHealthCheckMessage, loadWorkflowRunEvents, memoizeEncryptionKey, parseHealthCheckPayload, queueMessage, withHealthCheck, } from './runtime/helpers.js';
|
|
12
12
|
import { handleReplayBudgetExhausted, ReplayBudget, } from './runtime/replay-budget.js';
|
|
13
|
+
import { runIdCreatedAt } from './runtime/run-id-time.js';
|
|
13
14
|
import { executeStep } from './runtime/step-executor.js';
|
|
15
|
+
import { computeStepLatencyTracking } from './runtime/step-latency.js';
|
|
14
16
|
import { handleSuspension } from './runtime/suspension-handler.js';
|
|
15
17
|
import { getWaitContinuationDispatch } from './runtime/wait-continuation.js';
|
|
16
18
|
import { getWorld, getWorldHandlers, } from './runtime/world.js';
|
|
@@ -319,6 +321,25 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
319
321
|
let workflowStartedAt = -1;
|
|
320
322
|
let preloadedEvents;
|
|
321
323
|
let preloadedEventsCursor;
|
|
324
|
+
// Latency telemetry (TTFS) state — see runtime/step-latency.ts.
|
|
325
|
+
// Whether this invocation's FIRST event snapshot contained
|
|
326
|
+
// nothing beyond run_created/run_started: anything else was
|
|
327
|
+
// written by an earlier invocation, whose contribution to
|
|
328
|
+
// time-to-first-step (including the queue hop back here)
|
|
329
|
+
// cannot be measured wall-clock, so TTFS is not reported.
|
|
330
|
+
// Set once, on the first iteration's loaded snapshot.
|
|
331
|
+
let invocationStartedClean;
|
|
332
|
+
// Wall-clock ms spent committing hook_created events before
|
|
333
|
+
// the first step ran, accumulated across suspension passes
|
|
334
|
+
// and subtracted from TTFS.
|
|
335
|
+
let preStepBlockingMs = 0;
|
|
336
|
+
// Snapshot of the accumulator as of the suspension that
|
|
337
|
+
// wrote the run's first attr_set (whose hook phase ran
|
|
338
|
+
// before its attr writes). When a pre-step setAttributes
|
|
339
|
+
// ends the TTFS measurement at the attr write, only hook
|
|
340
|
+
// time from BEFORE that point may be subtracted — later
|
|
341
|
+
// hook writes fall outside the measured window.
|
|
342
|
+
let preStepBlockingBeforeAttrMs;
|
|
322
343
|
// Turbo mode fast-paths the very first delivery of the very
|
|
323
344
|
// first invocation, where it is provably safe to: background
|
|
324
345
|
// `run_started`, skip the initial event-log load (nothing has
|
|
@@ -329,8 +350,11 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
329
350
|
// delivery; `incomingStepId` would mark a background-step
|
|
330
351
|
// invocation and `replayDivergence` a recovery replay — both
|
|
331
352
|
// ineligible. The single-handler guarantee that makes forced
|
|
332
|
-
// optimistic start safe ends once a hook
|
|
333
|
-
// so turbo exits at that
|
|
353
|
+
// optimistic start safe ends once a hook or wait is created
|
|
354
|
+
// (they introduce resume invocations), so turbo exits at that
|
|
355
|
+
// point (see `forceOptimisticStart`). Workflow attribute
|
|
356
|
+
// writes introduce no such invocation source — they resolve
|
|
357
|
+
// via an in-process replay and don't end turbo.
|
|
334
358
|
const turbo = isTurboEnabled() &&
|
|
335
359
|
runInput !== undefined &&
|
|
336
360
|
metadata.attempt === 1 &&
|
|
@@ -367,7 +391,7 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
367
391
|
// (e.g. graphile-worker) a reschedule comes back as delivery
|
|
368
392
|
// attempt 1 — so turbo re-engages, skips the event-log load
|
|
369
393
|
// again, replays against an empty log, never observes the
|
|
370
|
-
// hook
|
|
394
|
+
// hook event this invocation just wrote, and re-suspends
|
|
371
395
|
// forever (the run wedges). Under turbo we instead enqueue an
|
|
372
396
|
// explicit continuation that carries NO `runInput`, so the
|
|
373
397
|
// next delivery is a normal (non-turbo) load-and-replay that
|
|
@@ -905,6 +929,17 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
905
929
|
}
|
|
906
930
|
// Update cache reference (may have been set for first time)
|
|
907
931
|
cachedEvents = events;
|
|
932
|
+
// Latency telemetry: judge TTFS eligibility against the
|
|
933
|
+
// invocation's first snapshot. Waits completed above
|
|
934
|
+
// would already disqualify via the event-type check, so
|
|
935
|
+
// evaluating after the wait pass is equivalent.
|
|
936
|
+
// attr_set is permitted: a redelivery can land after a
|
|
937
|
+
// committed pre-step attr_set, and the detour it marks
|
|
938
|
+
// is subtracted via preStepAttrStartMs regardless of
|
|
939
|
+
// which invocation wrote it (see runtime/step-latency.ts).
|
|
940
|
+
invocationStartedClean ??= events.every((e) => e.eventType === 'run_created' ||
|
|
941
|
+
e.eventType === 'run_started' ||
|
|
942
|
+
e.eventType === 'attr_set');
|
|
908
943
|
// Snapshot the cursor as it stands for this iteration's
|
|
909
944
|
// event log, before any inline writes (step_created via
|
|
910
945
|
// handleSuspension, step_started/step_completed via
|
|
@@ -1040,6 +1075,11 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1040
1075
|
});
|
|
1041
1076
|
return;
|
|
1042
1077
|
}
|
|
1078
|
+
preStepBlockingMs += suspensionResult.hookCreationMs;
|
|
1079
|
+
if (suspensionResult.hasAttributeEvents &&
|
|
1080
|
+
preStepBlockingBeforeAttrMs === undefined) {
|
|
1081
|
+
preStepBlockingBeforeAttrMs = preStepBlockingMs;
|
|
1082
|
+
}
|
|
1043
1083
|
runtimeLogger.debug('Suspension handled', {
|
|
1044
1084
|
workflowRunId: runId,
|
|
1045
1085
|
suspensionMs: Date.now() - suspensionStart,
|
|
@@ -1053,13 +1093,22 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1053
1093
|
if (suspensionResult.hasHookConflict) {
|
|
1054
1094
|
return await reinvoke(0);
|
|
1055
1095
|
}
|
|
1056
|
-
// Native workflow attribute events are resolved
|
|
1057
|
-
// replay
|
|
1058
|
-
//
|
|
1059
|
-
//
|
|
1060
|
-
//
|
|
1096
|
+
// Native workflow attribute events are resolved
|
|
1097
|
+
// through replay: the next loop iteration reloads the
|
|
1098
|
+
// log (now holding the just-committed attr_set) and
|
|
1099
|
+
// replays, resolving the setAttributes promise. Skip
|
|
1100
|
+
// step processing for this pass so that replay decides
|
|
1101
|
+
// races first — in Promise.race([setAttributes(),
|
|
1102
|
+
// step()]), the durable attribute event must be able
|
|
1103
|
+
// to win without executing the losing step. The replay
|
|
1104
|
+
// happens in-process rather than via a queue
|
|
1105
|
+
// re-invocation: unlike hooks and waits, an attr_set
|
|
1106
|
+
// introduces no out-of-band invocation source that the
|
|
1107
|
+
// handler would need to yield the message for, so
|
|
1108
|
+
// paying a delivery round-trip here would only add
|
|
1109
|
+
// latency before the workflow's next step.
|
|
1061
1110
|
if (suspensionResult.hasAttributeEvents) {
|
|
1062
|
-
|
|
1111
|
+
continue;
|
|
1063
1112
|
}
|
|
1064
1113
|
const pendingSteps = suspensionResult.pendingSteps;
|
|
1065
1114
|
// Inline execution is gated on ownership. The
|
|
@@ -1212,14 +1261,17 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1212
1261
|
!hasOpenHookOrWait(cachedEvents ?? []);
|
|
1213
1262
|
// Turbo mode forces optimistic inline start for this
|
|
1214
1263
|
// batch — but only while the run is still "clean" (a pure
|
|
1215
|
-
// step suspension). The moment a hook or wait
|
|
1264
|
+
// step suspension). The moment a hook or wait is
|
|
1216
1265
|
// created, later resume/parallel invocations become
|
|
1217
1266
|
// possible, so the single-handler guarantee that makes
|
|
1218
1267
|
// forced optimistic start safe no longer holds — turbo
|
|
1219
1268
|
// exits and the steps take the normal (env-gated)
|
|
1220
|
-
// await-then-run path. The hook-conflict
|
|
1221
|
-
//
|
|
1222
|
-
//
|
|
1269
|
+
// await-then-run path. The hook-conflict case already
|
|
1270
|
+
// returned early above, the attr case continued into a
|
|
1271
|
+
// fresh replay (so a batch-scheduling suspension never
|
|
1272
|
+
// carries attr events), and the awaited-hook case
|
|
1273
|
+
// emptied lazyInlineSteps; the checks below are
|
|
1274
|
+
// defensive.
|
|
1223
1275
|
//
|
|
1224
1276
|
// The `suspensionResult.*` flags only reflect what THIS
|
|
1225
1277
|
// batch created, so they do not catch a hook/wait opened
|
|
@@ -1242,10 +1294,31 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1242
1294
|
// bounded by the platform's function maxDuration, not the
|
|
1243
1295
|
// replay timeout — so the budget check at the top of the
|
|
1244
1296
|
// next loop iteration doesn't charge the step bodies.
|
|
1297
|
+
// Latency telemetry: decide whether this batch's first
|
|
1298
|
+
// step qualifies for TTFS/STSO measurement. Only the
|
|
1299
|
+
// batch's first step carries the tracking so a
|
|
1300
|
+
// parallel batch emits one sample per scheduling gap,
|
|
1301
|
+
// not one per sibling. Turbo's synthesized run
|
|
1302
|
+
// snapshot has a local-clock createdAt, so under
|
|
1303
|
+
// turbo only the run-id ULID timestamp is trusted.
|
|
1304
|
+
const latencyTracking = computeStepLatencyTracking({
|
|
1305
|
+
events: cachedEvents ?? [],
|
|
1306
|
+
invocationStartedClean: invocationStartedClean === true,
|
|
1307
|
+
runCreatedAtMs: runIdCreatedAt(runId) ??
|
|
1308
|
+
(turbo ? undefined : +workflowRun.createdAt),
|
|
1309
|
+
preStepBlockingMs,
|
|
1310
|
+
preStepBlockingBeforeAttrMs,
|
|
1311
|
+
// This suspension's own hook/wait writes are not in
|
|
1312
|
+
// cachedEvents yet, so report them explicitly.
|
|
1313
|
+
suspensionHasWaits: err.waitCount > 0 ||
|
|
1314
|
+
suspensionResult.waitTimeout !== undefined,
|
|
1315
|
+
suspensionCreatedHooks: err.hookCount > 0 || suspensionResult.hasHookEvents,
|
|
1316
|
+
turbo,
|
|
1317
|
+
});
|
|
1245
1318
|
replayBudget.pause();
|
|
1246
1319
|
let stepResults;
|
|
1247
1320
|
try {
|
|
1248
|
-
stepResults = await Promise.all(lazyInlineSteps.map((s) => executeStep({
|
|
1321
|
+
stepResults = await Promise.all(lazyInlineSteps.map((s, stepIndex) => executeStep({
|
|
1249
1322
|
world,
|
|
1250
1323
|
workflowRunId: runId,
|
|
1251
1324
|
workflowDeploymentId: workflowRun.deploymentId,
|
|
@@ -1264,6 +1337,9 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1264
1337
|
// are undefined/false outside turbo.
|
|
1265
1338
|
forceOptimisticStart,
|
|
1266
1339
|
runReadyBarrier,
|
|
1340
|
+
...(stepIndex === 0 && latencyTracking
|
|
1341
|
+
? { latencyTracking }
|
|
1342
|
+
: {}),
|
|
1267
1343
|
...(requestInlineDelta && preInlineWriteCursor
|
|
1268
1344
|
? {
|
|
1269
1345
|
inlineDeltaSinceCursor: preInlineWriteCursor,
|
|
@@ -1603,4 +1679,4 @@ export function workflowEntrypoint(workflowCode, options) {
|
|
|
1603
1679
|
});
|
|
1604
1680
|
});
|
|
1605
1681
|
}
|
|
1606
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUNqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQiw2QkFBNkIsRUFDN0IsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixZQUFZLEdBQ2Is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QkFDSixDQUFDLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLHFCQUFxQixDQUFDLENBQUM7Z0JBQ25FLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQzFDLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQzthQUN4RDtTQUNGLEVBQ0QsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNuQixhQUFhLEdBQUcsTUFBTSxLQUFLLENBQUMscUJBQXFCLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQzVELE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUMvQixtQ0FBbUMsRUFDbkMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUMvQixDQUFDO29CQUNGLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLFFBQVEsWUFBWSxRQUFRLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxFQUFFLGFBQWEsQ0FDakIsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDbEQsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIFJlcGxheURpdmVyZ2VuY2VFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICB0eXBlIFJ1bkVycm9yQ29kZSxcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBzZXRXb3JrZmxvd0Jhc2VQYXRoIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50LFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICByZXNvbHZlUXVldWVOYW1lc3BhY2UsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG4gIFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYSxcbiAgdHlwZSBXb3JrZmxvd1J1bixcbiAgdHlwZSBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGNsYXNzaWZ5UnVuRXJyb3IsXG4gIGlzUmV0cnlhYmxlV29ybGRFcnJvcixcbiAgaXNXb3JsZENvbnRyYWN0RXJyb3IsXG59IGZyb20gJy4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldE1heFF1ZXVlRGVsaXZlcmllcyxcbiAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMsXG4gIGlzVHVyYm9FbmFibGVkLFxufSBmcm9tICcuL3J1bnRpbWUvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7XG4gIGdldFF1ZXVlT3ZlcmhlYWQsXG4gIGdldFdvcmtmbG93UXVldWVOYW1lLFxuICBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UsXG4gIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkLFxuICBSZXBsYXlCdWRnZXQsXG59IGZyb20gJy4vcnVudGltZS9yZXBsYXktYnVkZ2V0LmpzJztcbmltcG9ydCB7IGV4ZWN1dGVTdGVwIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi9ydW50aW1lL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICB0eXBlIFdvcmxkSGFuZGxlcnMsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyByZW1hcEVycm9yU3RhY2sgfSBmcm9tICcuL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlU3RlcEh5ZHJhdGlvbkNhY2hlLFxuICB0eXBlIFN0ZXBIeWRyYXRpb25DYWNoZSxcbn0gZnJvbSAnLi9zdGVwLWh5ZHJhdGlvbi1jYWNoZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzLFxuICBnZXROZXh0VHJhY2VDYXJyaWVyLFxuICBnZXRTcGFuS2luZCxcbiAgZ2V0V29ya2Zsb3dUcmFjZU1vZGUsXG4gIGlzVXNhYmxlVHJhY2VDYXJyaWVyLFxuICB0cmFjZSxcbiAgd2l0aFRyYWNlQ29udGV4dCxcbiAgd2l0aFdvcmtmbG93QmFnZ2FnZSxcbn0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHsgZ2V0RXJyb3JOYW1lLCBnZXRFcnJvclN0YWNrLCBub3JtYWxpemVVbmtub3duRXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgeyBydW5Xb3JrZmxvdyB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9O1xuZXhwb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBIZWFsdGhDaGVja0VuZHBvaW50LFxuICB0eXBlIEhlYWx0aENoZWNrT3B0aW9ucyxcbiAgdHlwZSBIZWFsdGhDaGVja1Jlc3VsdCxcbiAgaGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmV4cG9ydCB7XG4gIGdldEhvb2tCeVRva2VuLFxuICByZXN1bWVIb29rLFxuICByZXN1bWVXZWJob29rLFxufSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnO1xuZXhwb3J0IHtcbiAgZ2V0UnVuLFxuICBSdW4sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbSxcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyxcbn0gZnJvbSAnLi9ydW50aW1lL3J1bi5qcyc7XG5leHBvcnQge1xuICBjYW5jZWxSdW4sXG4gIGxpc3RTdHJlYW1zLFxuICB0eXBlIFJlYWRTdHJlYW1PcHRpb25zLFxuICB0eXBlIFJlY3JlYXRlUnVuT3B0aW9ucyxcbiAgcmVhZFN0cmVhbSxcbiAgcmVjcmVhdGVSdW5Gcm9tRXhpc3RpbmcsXG4gIHJlZW5xdWV1ZVJ1bixcbiAgdHlwZSBTdG9wU2xlZXBPcHRpb25zLFxuICB0eXBlIFN0b3BTbGVlcFJlc3VsdCxcbiAgd2FrZVVwUnVuLFxufSBmcm9tICcuL3J1bnRpbWUvcnVucy5qcyc7XG5leHBvcnQge1xuICB0eXBlIFN0YXJ0T3B0aW9ucyxcbiAgdHlwZSBTdGFydE9wdGlvbnNCYXNlLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCxcbiAgc3RhcnQsXG59IGZyb20gJy4vcnVudGltZS9zdGFydC5qcyc7XG4vLyBWMjogc3RlcEVudHJ5cG9pbnQgaXMgbm8gbG9uZ2VyIHJlLWV4cG9ydGVkIOKAlCB0aGUgY29tYmluZWQgaGFuZGxlclxuLy8gKHdvcmtmbG93RW50cnlwb2ludCkgZXhlY3V0ZXMgc3RlcHMgaW5saW5lLiBSZW1vdmluZyB0aGUgcmUtZXhwb3J0XG4vLyBwcmV2ZW50cyBUdXJib3BhY2sgZnJvbSB0cmFjaW5nIHN0ZXAtaGFuZGxlci5qcyDihpIgZ2V0LXBvcnQuanNcbi8vIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucyBpbnRvIHRoZSBmbG93IHJvdXRlIGJ1bmRsZS5cbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmxkLFxuICBjcmVhdGVXb3JsZEZyb21Nb2R1bGUsXG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICBzZXRXb3JsZCxcbiAgdHlwZSBXb3JsZEZhY3RvcnlNb2R1bGUsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHwgbnVsbCB7XG4gIGlmIChXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG5cbiAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICB3b3JsZCxcbiAgd29ya2Zsb3dSdW4sXG4gIHJ1bklkLFxuICByZXF1ZXN0SWQsXG4gIGVycixcbiAgZXJyb3JDb2RlLFxuICBsb2dNZXNzYWdlLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGVycjogdW5rbm93bjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIGxvZ01lc3NhZ2U6IHN0cmluZztcbn0pIHtcbiAgcnVudGltZUxvZ2dlci5lcnJvcihsb2dNZXNzYWdlLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXJyb3JDb2RlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1biA/PyBydW5JZCk7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgIHJ1bklkLFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICksXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgcmVxdWVzdElkIH1cbiAgICApO1xuICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihmYWlsRXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgIGVycm9yOiBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsRXJyLm1lc3NhZ2UgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGZhaWxFcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50czogRXZlbnRbXSwgcnVuSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBUZXJtaW5hbCBydW4gZXZlbnRzIGFyZSBhbHdheXMgbGFzdCBieSBjb25zdHJ1Y3Rpb24gKG5vIGV2ZW50IGNyZWF0aW9uXG4gIC8vIHN1Y2NlZWRzIGFnYWluc3QgYSB0ZXJtaW5hbCBydW4pLCBidXQgc2NhbiB0aGUgZnVsbCBhcnJheSBmb3JcbiAgLy8gZGVmZW5zZS1pbi1kZXB0aDogYSBXb3JsZC9iYWNrZW5kIG9yZGVyaW5nIGJ1ZyBzaG91bGRuJ3QgbWFrZSB1cyBtaXNzIGFuXG4gIC8vIGFjdHVhbCB0ZXJtaW5hdGlvbiBzaWduYWwuXG4gIGNvbnN0IHRlcm1pbmFsUnVuRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZSkgPT5cbiAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAoZS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICk7XG5cbiAgaWYgKCF0ZXJtaW5hbFJ1bkV2ZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUnVuIHJlYWNoZWQgdGVybWluYWwgZXZlbnQsIGV4aXRpbmcnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXZlbnRUeXBlOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50VHlwZSxcbiAgICBldmVudElkOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBydW4gaGFzIGFueSBob29rIG9yIHdhaXQgdGhhdCBhbiBvdXQtb2YtYmFuZCB3cml0ZXIgY291bGRcbiAqIGFwcGVuZCBhbiBldmVudCBmb3IgYmV0d2VlbiBhbiBpbmxpbmUgc3RlcCdzIGBzdGVwX2NvbXBsZXRlZGAgd3JpdGUgYW5kXG4gKiB0aGUgbmV4dCByZXBsYXkg4oCUIG5hbWVseSBhbiBvcGVuIGhvb2sgKGEgYGhvb2tfY3JlYXRlZGAgbm90IHlldFxuICogYGhvb2tfZGlzcG9zZWRgLCB3aGljaCBhIHdlYmhvb2sgcmVjZWl2ZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYGhvb2tfcmVjZWl2ZWRgKSBvciBhbiBvcGVuIHdhaXQgKGEgYHdhaXRfY3JlYXRlZGAgbm90IHlldFxuICogYHdhaXRfY29tcGxldGVkYCwgd2hpY2ggdGhlIHdhaXQgdGltZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYHdhaXRfY29tcGxldGVkYCkuXG4gKlxuICogVGhpcyBnYXRlcyB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aC4gVGhlIGRlbHRhIHJldHVybmVkIGJ5IHRoZVxuICogc3RlcC10ZXJtaW5hbCB3cml0ZSBpcyB0aGUgZXZlbnQgbG9nIGFzIG9mIHRoYXQgd3JpdGU7IGl0IGlzIGNvbnN1bWVkXG4gKiBvbiB0aGUgTkVYVCBsb29wIGl0ZXJhdGlvbiwgc28gYW55IGV2ZW50IGEgY29uY3VycmVudCB3cml0ZXIgYXBwZW5kcyBpblxuICogdGhhdCB3aW5kb3cgd291bGQgYmUgcHJlc2VudCBpbiBhIHJlYWwgYGV2ZW50cy5saXN0YCBmZXRjaCBidXQgYWJzZW50XG4gKiBmcm9tIHRoZSBzdGFsZSBkZWx0YS4gTWlzc2luZyBzdWNoIGFuIGV2ZW50IGZvciBvbmUgcmVwbGF5IGNhbiBkdXJhYmx5XG4gKiBjb21taXQgYSBzY2hlZHVsaW5nIGRlY2lzaW9uIChlLmcuIGlubGluZS1leGVjdXRpbmcgdGhlIGxvc2VyIG9mIGFcbiAqIGBQcm9taXNlLnJhY2UoW2hvb2ssIHN0ZXBdKWApIHRoYXQgdGhlIGV2ZW50dWFsIGZ1bGwgcmVwbGF5IGNhbm5vdFxuICogY29uc3VtZSDigJQgYSBgUmVwbGF5RGl2ZXJnZW5jZUVycm9yYC4gV2hlbiBubyBob29rIG9yIHdhaXQgaXMgb3BlbiwgdGhlXG4gKiBvbmx5IG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIGJlbmlnbiB0byBvYnNlcnZlIG9uZVxuICogaXRlcmF0aW9uIGxhdGUgKHRoZSBuZXh0IGVudGl0eSB3cml0ZSBpcyByZWplY3RlZCBhZ2FpbnN0IHRoZSB0ZXJtaW5hbFxuICogcnVuIGFuZCB0aGUgcnVuIGlzIGFscmVhZHkgdGVybWluYWwpLCBzbyB0aGUgZmFzdCBwYXRoIGlzIHNhZmUuXG4gKlxuICogU3RlcC1ib2R5IGBhdHRyX3NldGAgd3JpdGVzIGFyZSBOT1QgYSBjb25jZXJuOiB0aGV5IGxhbmQgYmVmb3JlIHRoZVxuICogc3RlcCdzIHRlcm1pbmFsIHdyaXRlIGFuZCBhcmUgdGhlcmVmb3JlIGFscmVhZHkgaW5zaWRlIHRoZSByZXR1cm5lZFxuICogZGVsdGEuXG4gKi9cbmZ1bmN0aW9uIGhhc09wZW5Ib29rT3JXYWl0KGV2ZW50czogRXZlbnRbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBkaXNwb3NlZEhvb2tJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKGUuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIGRpc3Bvc2VkSG9va0lkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICBlbHNlIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgY29tcGxldGVkV2FpdElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgIWRpc3Bvc2VkSG9va0lkcy5oYXMoZS5jb3JyZWxhdGlvbklkKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSByb3V0ZSB3aGljaCBoYW5kbGVzIHdvcmtmbG93IGV4ZWN1dGlvbiByZXF1ZXN0cyxcbiAqIGV4ZWN1dGluZyBzdGVwcyBpbmxpbmUgd2hlbiBwb3NzaWJsZSB0byByZWR1Y2UgZnVuY3Rpb24gaW52b2NhdGlvbnNcbiAqIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAqXG4gKiBUaGUgaGFuZGxlciBsb29wczogcmVwbGF5IHdvcmtmbG93IOKGkiBleGVjdXRlIHN0ZXAgaW5saW5lIOKGkiByZXBsYXkg4oaSIC4uLlxuICogdW50aWwgdGhlIHdvcmtmbG93IGNvbXBsZXRlcywgdGltZXMgb3V0LCBvciBlbmNvdW50ZXJzIG5vbi1zdGVwIHN1c3BlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB3b3JrZmxvd0NvZGUgLSBUaGUgd29ya2Zsb3cgYnVuZGxlIGNvZGUgY29udGFpbmluZyBhbGwgd29ya2Zsb3cgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBWZXJjZWwgQVBJIHJvdXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0VudHJ5cG9pbnQoXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIG5hbWVzcGFjZT86IHN0cmluZztcbiAgICByb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQ/OiBudW1iZXI7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIH1cbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgc2V0V29ya2Zsb3dCYXNlUGF0aChvcHRpb25zPy5iYXNlUGF0aCk7XG5cbiAgY29uc3QgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NUyA9XG4gICAgTnVtYmVyKHByb2Nlc3MuZW52LldPUktGTE9XX1YyX1RJTUVPVVRfTVMpIHx8IDEyMF8wMDA7XG5cbiAgY29uc3QgbmFtZXNwYWNlID0gcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG9wdGlvbnM/Lm5hbWVzcGFjZSk7XG4gIGNvbnN0IHdvcmtmbG93UHJlZml4ID0gZ2V0UXVldWVUb3BpY1ByZWZpeCgnd29ya2Zsb3cnLCBuYW1lc3BhY2UpO1xuXG4gIGNvbnN0IGhhbmRsZXIgPSAod29ybGRIYW5kbGVyczogV29ybGRIYW5kbGVycykgPT5cbiAgICB3b3JsZEhhbmRsZXJzLmNyZWF0ZVF1ZXVlSGFuZGxlcihcbiAgICAgIHdvcmtmbG93UHJlZml4LFxuICAgICAgYXN5bmMgKG1lc3NhZ2VfLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2VcbiAgICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgICAgLy8gVGhleSBvbmx5IHdyaXRlIGEgc2ltcGxlIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAgICd3b3JrZmxvdycsXG4gICAgICAgICAgICB3b3JsZEhhbmRsZXJzLnNwZWNWZXJzaW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdHJhY2VDYXJyaWVyOiBpbmNvbWluZ1RyYWNlQ2FycmllcixcbiAgICAgICAgICByZXF1ZXN0ZWRBdCxcbiAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2UsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgIH0gPSBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuICAgICAgICAvLyBgc3RhcnQoKWAgYWx3YXlzIGF0dGFjaGVzIGEgdHJhY2UgY2FycmllciwgYnV0XG4gICAgICAgIC8vIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgLy8gb3Igbm8gc3BhbiBpcyBhY3RpdmUg4oCUIHRyZWF0IGFuIGVtcHR5IGNhcnJpZXIgdGhlIHNhbWUgYXMgYW5cbiAgICAgICAgLy8gYWJzZW50IG9uZSBzbyBsaW5rZWQgbW9kZSBmYWxscyBiYWNrIHRvIGEgZnJlc2ggb3JpZ2luIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gZm9yd2FyZGluZyBhIHVzZWxlc3MgYHt9YCBmb3JldmVyLlxuICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ1RyYWNlQ2FycmllcilcbiAgICAgICAgICA/IGluY29taW5nVHJhY2VDYXJyaWVyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKHdvcmtmbG93UHJlZml4Lmxlbmd0aCk7XG5cbiAgICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBydW5hd2F5IHdvcmtmbG93cyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgICAvLyBTY29wZWQgbG9nZ2VyIGZvciB0aGlzIHJ1biDigJQgYXR0YWNoZXMgcnVuSWQvd29ya2Zsb3dOYW1lIHRvIGV2ZXJ5XG4gICAgICAgIC8vIGxvZyBsaW5lIGFuZCBjaGlsZCBsb2dnZXJzIGJlbG93LCBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgICAgY29uc3QgcnVuTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4ocnVuSWQsIHdvcmtmbG93TmFtZSk7XG5cbiAgICAgICAgY29uc3QgbWF4UXVldWVEZWxpdmVyaWVzID0gZ2V0TWF4UXVldWVEZWxpdmVyaWVzKCk7XG4gICAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gbWF4UXVldWVEZWxpdmVyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFdvcmtmbG93IGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yQ29kZTogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogbWF4RGVsaXZlcmllc0Rlc2NyaXB0aW9uLmF0dHJpYnV0aW9uLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuSWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEZhdGFsRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBleGNlZWRlZCBtYXhpbXVtIHF1ZXVlIGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHttYXhRdWV1ZURlbGl2ZXJpZXN9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZmluaXNoZWQsIGNvbnN1bWUgdGhlIG1lc3NhZ2Ugc2lsZW50bHlcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIG1hcmsgcnVuIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHJ1biBmcm9tIGJlaW5nIHRlcm1pbmF0ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgICBgb3IgYSBidWcgaW4gdGhlIHdvcmtmbG93IHJ1bnRpbWUgYW5kIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgV29ya2Zsb3cgdGVhbS5gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm5hbWUgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIFRyYWNlIGNvcnJlbGF0aW9uIG1vZGUgLS0tXG4gICAgICAgIC8vICdsaW5rZWQnIChkZWZhdWx0KTogdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvdyBzdGF5cyBhIENISUxEXG4gICAgICAgIC8vIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCwgc28gb25lIGludm9jYXRpb24g4oCUXG4gICAgICAgIC8vIHJvdXRlIGhhbmRsZXIsIHdvcmtmbG93IHJlcGxheSwgaW5saW5lIHN0ZXBzLCBldmVudCB3cml0ZXMg4oCUIGlzIGFcbiAgICAgICAgLy8gc2luZ2xlIGJvdW5kZWQgdHJhY2UuIFRoZSBydW4tb3JpZ2luIGNvbnRleHQgdHJhdmVscyBhcyBhIHNwYW5cbiAgICAgICAgLy8gTElOSyAobm90IGEgcGFyZW50KSwgYW5kIHJlLWVucXVldWVzIGZvcndhcmQgdGhlIG9yaWdpbmFsIGNhcnJpZXJcbiAgICAgICAgLy8gdW5jaGFuZ2VkLCBzbyBhIChwb3RlbnRpYWxseSBob3Vycy1sb25nKSBydW4gaXMgbmV2ZXIgc3RpdGNoZWRcbiAgICAgICAgLy8gaW50byBvbmUgZ2lhbnQgdHJhY2UgYWNyb3NzIGludm9jYXRpb25zLlxuICAgICAgICAvLyAnY29udGludW91cyc6IGxlZ2FjeSBiZWhhdmlvciDigJQgdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dFxuICAgICAgICAvLyBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgdGhpcyBpbnZvY2F0aW9uJ3Mgc3BhbnMuXG4gICAgICAgIGNvbnN0IHRyYWNlTW9kZSA9IGdldFdvcmtmbG93VHJhY2VNb2RlKCk7XG5cbiAgICAgICAgLy8gVHJhY2UgY2FycmllciB0byBhdHRhY2ggdG8gbWVzc2FnZXMgdGhpcyBpbnZvY2F0aW9uIGVucXVldWVzIOKAlFxuICAgICAgICAvLyBzZWUgZ2V0TmV4dFRyYWNlQ2FycmllciBmb3IgdGhlIGxpbmtlZC9jb250aW51b3VzIHNlbWFudGljcy5cbiAgICAgICAgY29uc3QgbmV4dFRyYWNlQ2FycmllciA9ICgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+XG4gICAgICAgICAgZ2V0TmV4dFRyYWNlQ2Fycmllcih0cmFjZU1vZGUsIHRyYWNlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gU3BhbiBsaW5rcyB0byB0aGUgaW5jb21pbmcgZGVsaXZlcnkgY29udGV4dCBhbmQgKGluIGxpbmtlZCBtb2RlKVxuICAgICAgICAvLyB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGZyb20gdGhlIHRyYWNlIGNhcnJpZXIuXG4gICAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyhcbiAgICAgICAgICB0cmFjZU1vZGUsXG4gICAgICAgICAgdHJhY2VDb250ZXh0XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gLS0tIFJlcGxheSBidWRnZXQgYm9va2tlZXBpbmcgLS0tXG4gICAgICAgIC8vIFRoZSByZXBsYXkgYnVkZ2V0IGJvdW5kcyB0aGUgKm5vbi1zdGVwKiBwb3J0aW9uIG9mIGEgc2luZ2xlXG4gICAgICAgIC8vIGhhbmRsZXIgaW52b2NhdGlvbjogZGV0ZXJtaW5pc3RpYyBldmVudC1sb2cgcmVwbGF5LCB3b3JrZmxvdy1WTVxuICAgICAgICAvLyBleGVjdXRpb24gYmV0d2VlbiBzdGVwIGJvdW5kYXJpZXMsIHN1c3BlbnNpb24gaGFuZGxpbmcsIHF1ZXVlXG4gICAgICAgIC8vIHJvdW5kLXRyaXBzLCBldGMuIElubGluZSBzdGVwIGJvZGllcyAoYFwidXNlIHN0ZXBcImAgZnVuY3Rpb25zXG4gICAgICAgIC8vIGludm9rZWQgdmlhIGBleGVjdXRlU3RlcGApIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkIOKAlCB0aGV5IGFyZVxuICAgICAgICAvLyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uIGBtYXhEdXJhdGlvbmAgYW5kIHRoZVxuICAgICAgICAvLyBgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU2AgZWFybHktcmV0dXJuIGd1YXJkIGJlbG93LlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgYnVkZ2V0IGlzIGNoZWNrZWQgYXQgbG9vcCBib3VuZGFyaWVzICh0b3Agb2YgZWFjaCBgd2hpbGVgXG4gICAgICAgIC8vIGl0ZXJhdGlvbikuIE5vdGUgdGhpcyBpcyAqbGVzcyByZXNwb25zaXZlKiB0aGFuIHRoZSBvbGRcbiAgICAgICAgLy8gYHNldFRpbWVvdXRgLWJhc2VkIGFwcHJvYWNoOiBhIHNpbmdsZSBwYXRob2xvZ2ljYWwgYHJ1bldvcmtmbG93YFxuICAgICAgICAvLyBjYWxsIHByb2Nlc3NpbmcgYSBodWdlIGV2ZW50IGxvZyBjYW4gb3ZlcnNob290IHRoZSBidWRnZXQgYnkgdXBcbiAgICAgICAgLy8gdG8gb25lIGl0ZXJhdGlvbiBiZWZvcmUgYmFpbGluZy4gSW4gcHJhY3RpY2UgdGhlIGhlYWRyb29tIGJ1aWx0XG4gICAgICAgIC8vIGludG8gYE1BWF9SRVBMQVlfVElNRU9VVF9NU2AgKGFuZCB0aGUgcGxhdGZvcm0gYG1heER1cmF0aW9uYFxuICAgICAgICAvLyBTSUdURVJNIGFzIHVsdGltYXRlIGJhY2tzdG9wKSBnaXZlcyB1cyBzbGFjayDigJQgdGhlIHByZXZpb3VzXG4gICAgICAgIC8vIGBzZXRUaW1lb3V0YCBhcHByb2FjaCBhbHNvIHJlbGllZCBvbiB0aGUgcGxhdGZvcm0ga2lsbCBhcyB0aGVcbiAgICAgICAgLy8gaGFyZCBiYWNrc3RvcC4gRG8gKm5vdCogXCJmaXhcIiB0aGlzIGJ5IGFkZGluZyBhIGBzZXRJbnRlcnZhbGA7XG4gICAgICAgIC8vIGl0IHdvdWxkIHJpc2sgdGhlIHNhbWUgYnVnIHdlIGp1c3QgcmVtb3ZlZCAoYm91bmRpbmcgc3RlcFxuICAgICAgICAvLyBib2RpZXMpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBFYXJsaWVyIHZlcnNpb25zIChwcmUtIzIwMDkgZml4KSB1c2VkIGEgc2luZ2xlIGBzZXRUaW1lb3V0YFxuICAgICAgICAvLyB0aGF0IGFsc28gYm91bmRlZCBzdGVwIGJvZGllcywgd2hpY2ggYnJva2UgYW55IHdvcmtmbG93IHdpdGggYVxuICAgICAgICAvLyBzaW5nbGUgc3RlcCBsb25nZXIgdGhhbiB0aGUgYnVkZ2V0LlxuICAgICAgICBjb25zdCByZXBsYXlCdWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG5cbiAgICAgICAgLy8gSW4gbGlua2VkIG1vZGUgdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBpcyBOT1QgcmVzdG9yZWQgYXMgdGhlXG4gICAgICAgIC8vIGFjdGl2ZSAocGFyZW50KSBjb250ZXh0IOKAlCBwYXNzaW5nIGB1bmRlZmluZWRgIG1ha2VzXG4gICAgICAgIC8vIHdpdGhUcmFjZUNvbnRleHQgYSBwYXNzdGhyb3VnaCwgc28gdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvd1xuICAgICAgICAvLyBzdGF5cyBhIGNoaWxkIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCBhbmQgdGhlXG4gICAgICAgIC8vIHJ1bi1vcmlnaW4gdHJhdmVscyBhcyBhIHNwYW4gbGluayBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBwYXJlbnRUcmFjZUNhcnJpZXIgPVxuICAgICAgICAgIHRyYWNlTW9kZSA9PT0gJ2NvbnRpbnVvdXMnID8gdHJhY2VDb250ZXh0IDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBRdWV1ZS1kZWxpdmVyZWQgaW52b2NhdGlvbjogQ09OU1VNRVIga2luZCwgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIHF1ZXVlLWRlbGl2ZXJlZCBzdGVwLmV4ZWN1dGUgc3Bhbi5cbiAgICAgICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnQ09OU1VNRVInKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUcmFjZUNvbnRleHQocGFyZW50VHJhY2VDYXJyaWVyLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhXb3JrZmxvd0JhZ2dhZ2UoXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCB3b3JrZmxvd05hbWUgfSxcbiAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuZ2V0X3dvcmxkJywgYXN5bmMgKCkgPT5cbiAgICAgICAgICAgICAgICBnZXRXb3JsZCgpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiB0cmFjZShcbiAgICAgICAgICAgICAgICBgd29ya2Zsb3cuZXhlY3V0ZSAke3dvcmtmbG93RGlzcGxheU5hbWUod29ya2Zsb3dOYW1lKX1gLFxuICAgICAgICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93T3BlcmF0aW9uKCdleGVjdXRlX3YyJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKG1ldGFkYXRhLnF1ZXVlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWV0YWRhdGEubWVzc2FnZUlkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3Byb2Nlc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZ2V0UXVldWVPdmVyaGVhZCh7IHJlcXVlc3RlZEF0IH0pLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlUHJvcGFnYXRlZCghIXRyYWNlQ29udGV4dCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1RyYWNlTW9kZSh0cmFjZU1vZGUpLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGludm9jYXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgbGV0IGxvb3BJdGVyYXRpb24gPSAwO1xuXG4gICAgICAgICAgICAgICAgICAvLyBFdmVudCBjYWNoZToga2VlcCBsb2FkZWQgZXZlbnRzIGluIG1lbW9yeSBhY3Jvc3MgbG9vcCBpdGVyYXRpb25zLlxuICAgICAgICAgICAgICAgICAgLy8gT24gdGhlIGZpcnN0IGl0ZXJhdGlvbiB3ZSBkbyBhIGZ1bGwgbG9hZDsgb24gc3Vic2VxdWVudCBpdGVyYXRpb25zXG4gICAgICAgICAgICAgICAgICAvLyB3ZSBmZXRjaCBvbmx5IGV2ZW50cyBjcmVhdGVkIGFmdGVyIHRoZSBsYXN0IGtub3duIGN1cnNvci5cbiAgICAgICAgICAgICAgICAgIGxldCBjYWNoZWRFdmVudHM6IEV2ZW50W10gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGxldCBldmVudHNDdXJzb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGNhY2hlIG9mIGh5ZHJhdGVkIHN0ZXAgcmV0dXJuIHZhbHVlcywgc2hhcmVkIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgcmVwbGF5IGl0ZXJhdGlvbiBvZiBUSElTIGludm9jYXRpb24uIEVhY2ggaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAvLyBidWlsZHMgYSBmcmVzaCB3b3JrZmxvdyBjb250ZXh0LCBzbyB0aGUgY2FjaGUgaXMgb3duZWQgaGVyZVxuICAgICAgICAgICAgICAgICAgLy8gKG91dHNpZGUgdGhhdCBjb250ZXh0KSBhbmQgdGhyZWFkZWQgaW50byBydW5Xb3JrZmxvdy4gSXRcbiAgICAgICAgICAgICAgICAgIC8vIHR1cm5zIHRoZSBvdGhlcndpc2UgTyhOwrIpIHJlLWRlY3J5cHQgKyByZS1wYXJzZSBvZiBjb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcmVzdWx0cyBhY3Jvc3MgTiByZXBsYXlzIGludG8gTyhOKS4gU2NvcGVkIHRvIHRoaXMgcnVuXG4gICAgICAgICAgICAgICAgICAvLyBvbmx5IOKAlCBuZXZlciByZXVzZWQgYWNyb3NzIHJ1bnMuIFNlZSBzdGVwLWh5ZHJhdGlvbi1jYWNoZS50cy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBIeWRyYXRpb25DYWNoZTogU3RlcEh5ZHJhdGlvbkNhY2hlID1cbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlU3RlcEh5ZHJhdGlvbkNhY2hlKCk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IHdoZW4gYW4gaW5saW5lIHN0ZXAncyB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmV0dXJucyB0aGUgZXZlbnQtbG9nIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciAoYSBzdXBwb3J0aW5nIFdvcmxkIG9ubHkpLCB3ZSBzdGFzaCBpdCBoZXJlIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBjb25zdW1lcyBpdCBpbiBwbGFjZSBvZiB0aGUgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cy5saXN0IHJvdW5kLXRyaXAuIEVhY2ggdmFsdWUgaXMgY29uc3VtZWQgZXhhY3RseSBvbmNlXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjbGVhcmVkLiBOdWxsIG1lYW5zIFwibm8gZGVsdGEgcGVuZGluZyDigJQgZmV0Y2hcbiAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5XCIuIFNlZSB0aGUgY29uc3VtZSBzaXRlIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3AgYW5kXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZHVjZSBzaXRlIGFmdGVyIGlubGluZSBleGVjdXRlU3RlcC5cbiAgICAgICAgICAgICAgICAgIGxldCBwZW5kaW5nSW5saW5lRGVsdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBFdmVudFtdO1xuICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFNoYXJlZCBzdGF0ZTogc2V0IGJ5IGVpdGhlciB0aGUgYmFja2dyb3VuZCBzdGVwIHBhdGhcbiAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dTdGFydGVkQXQgPSAtMTtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVsb2FkZWRFdmVudHM6IEV2ZW50W10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICBsZXQgcHJlbG9hZGVkRXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIHZlcnkgZmlyc3QgZGVsaXZlcnkgb2YgdGhlIHZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24sIHdoZXJlIGl0IGlzIHByb3ZhYmx5IHNhZmUgdG86IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAsIHNraXAgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzXG4gICAgICAgICAgICAgICAgICAvLyBiZWVuIHdyaXR0ZW4geWV0KSwgYW5kIGZvcmNlIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IChub1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBwZWVyIGhhbmRsZXIgZXhpc3RzIHRvIHJhY2UgdGhlIGNyZWF0ZS1jbGFpbSkuXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuSW5wdXRgIGlzIG9ubHkgcHJlc2VudCBvbiB0aGUgc3RhcnQoKS1lbnF1ZXVlZCBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgLy8gYW5kIGBhdHRlbXB0ID09PSAxYCAoMS1iYXNlZCkgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5OyBgaW5jb21pbmdTdGVwSWRgIHdvdWxkIG1hcmsgYSBiYWNrZ3JvdW5kLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gYW5kIGByZXBsYXlEaXZlcmdlbmNlYCBhIHJlY292ZXJ5IHJlcGxheSDigJQgYm90aFxuICAgICAgICAgICAgICAgICAgLy8gaW5lbGlnaWJsZS4gVGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBzdGFydCBzYWZlIGVuZHMgb25jZSBhIGhvb2svd2FpdC9hdHRyIGlzIGNyZWF0ZWQsXG4gICAgICAgICAgICAgICAgICAvLyBzbyB0dXJibyBleGl0cyBhdCB0aGF0IHBvaW50IChzZWUgYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCkuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0dXJibyA9XG4gICAgICAgICAgICAgICAgICAgIGlzVHVyYm9FbmFibGVkKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5hdHRlbXB0ID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIXJlcGxheURpdmVyZ2VuY2U7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5Xb3JrZmxvd1R1cmJvKHR1cmJvKSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIG1vZGUgb25seTogcmVzb2x2ZXMgb25jZSB0aGUgYmFja2dyb3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQgKG9yIHJlamVjdHMgaWYgaXQgZmFpbGVkKS4gVGhyZWFkZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludG8gaGFuZGxlU3VzcGVuc2lvbiBhbmQgZXhlY3V0ZVN0ZXAgc28gbm8gc3RlcC9ob29rL3dhaXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHJhY2VzIGFoZWFkIG9mIHRoZSBydW4ncyBjcmVhdGlvbi4gVW5kZWZpbmVkIG91dHNpZGVcbiAgICAgICAgICAgICAgICAgIC8vIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAgICAgICAgICAgICAgICBsZXQgcnVuUmVhZHlCYXJyaWVyOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBPcmRlciBhIHRlcm1pbmFsIHJ1biB3cml0ZSAocnVuX2NvbXBsZXRlZCAvIHJ1bl9mYWlsZWQpIGFmdGVyXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIGluIHR1cmJvIG1vZGUg4oCUIGEgbm8tc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2FuIG90aGVyd2lzZSByZWFjaCBydW5fY29tcGxldGVkIGJlZm9yZSB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAvLyBleGlzdHMuIEJlc3QtZWZmb3J0OiBhIGJhcnJpZXIgcmVqZWN0aW9uIGlzIHN3YWxsb3dlZCBmb3JcbiAgICAgICAgICAgICAgICAgIC8vIG9yZGVyaW5nIG9ubHk7IGlmIHJ1bl9zdGFydGVkIHRydWx5IGZhaWxlZCB0aGUgdGVybWluYWwgd3JpdGVcbiAgICAgICAgICAgICAgICAgIC8vIHN1cmZhY2VzIHRoZSByZWFsIGVycm9yIChydW4gbm90IGZvdW5kIC8gZ29uZSkgYW5kIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzLiBOby1vcCBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgY29uc3QgYXdhaXRSdW5SZWFkeSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blJlYWR5QmFycmllcikge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBydW5SZWFkeUJhcnJpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbDogb3JkZXJpbmcgYmFycmllciBvbmx5IOKAlCBzZWUgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIG9yY2hlc3RyYXRvci4gT3V0c2lkZSB0dXJibyB0aGlzIHJldHVybnNcbiAgICAgICAgICAgICAgICAgIC8vIGB7IHRpbWVvdXRTZWNvbmRzIH1gLCB3aGljaCBtYWtlcyB0aGUgcXVldWUgcmVzY2hlZHVsZSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgZGVsaXZlcnkncyBtZXNzYWdlLiBJbiB0dXJibyB0aGF0IGlzIGEgdHJhcDogdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgLCBhbmQgb24gYXN5bmMgcXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyAoZS5nLiBncmFwaGlsZS13b3JrZXIpIGEgcmVzY2hlZHVsZSBjb21lcyBiYWNrIGFzIGRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IDEg4oCUIHNvIHR1cmJvIHJlLWVuZ2FnZXMsIHNraXBzIHRoZSBldmVudC1sb2cgbG9hZFxuICAgICAgICAgICAgICAgICAgLy8gYWdhaW4sIHJlcGxheXMgYWdhaW5zdCBhbiBlbXB0eSBsb2csIG5ldmVyIG9ic2VydmVzIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gaG9vay9hdHRyIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBqdXN0IHdyb3RlLCBhbmQgcmUtc3VzcGVuZHNcbiAgICAgICAgICAgICAgICAgIC8vIGZvcmV2ZXIgKHRoZSBydW4gd2VkZ2VzKS4gVW5kZXIgdHVyYm8gd2UgaW5zdGVhZCBlbnF1ZXVlIGFuXG4gICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gdGhhdCBjYXJyaWVzIE5PIGBydW5JbnB1dGAsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBkZWxpdmVyeSBpcyBhIG5vcm1hbCAobm9uLXR1cmJvKSBsb2FkLWFuZC1yZXBsYXkgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIGNvbW1pdHRlZCBldmVudHMgYW5kIG1ha2VzIHByb2dyZXNzOyB3ZSB0aGVuXG4gICAgICAgICAgICAgICAgICAvLyByZXR1cm4gYHVuZGVmaW5lZGAgc28gdGhlIHF1ZXVlIHRyZWF0cyB0aGlzIGRlbGl2ZXJ5IGFzIGRvbmVcbiAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGFsc28gcmVzY2hlZHVsaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2UgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyXG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPHsgdGltZW91dFNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHVyYm8pIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBkZWxheVNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gSWYgaW5jb21pbmcgbWVzc2FnZSBoYXMgYSBzdGVwSWQsIHRoaXMgaXMgYSBiYWNrZ3JvdW5kIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbi4gRXhlY3V0ZSB0aGUgc3RlcCwgdGhlbiBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHNcbiAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGJhdGNoIGFyZSBkb25lLiBJZiBzbywgcmVwbGF5IGlubGluZSAoc2F2aW5nIGEgcXVldWVcbiAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcCkuIElmIG5vdCwgcmV0dXJuIOKAlCB0aGUgbGFzdCBoYW5kbGVyIHRvIGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAvLyB3aWxsIHBpY2sgdXAgdGhlIHJlcGxheS5cbiAgICAgICAgICAgICAgICAgIGlmIChpbmNvbWluZ1N0ZXBJZCAmJiBpbmNvbWluZ1N0ZXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdSdW4gPSBhd2FpdCB3b3JsZC5ydW5zLmdldChydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGJnUnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHN0YXR1czogYmdSdW4uc3RhdHVzIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnU3RhcnRlZEF0ID0gYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA/ICtiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSB0aGUgcmVwbGF5IGJ1ZGdldCB3aGlsZSB0aGUgc3RlcCBib2R5IHJ1bnMg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RHVyYXRpb24sIG5vdCBieSB0aGUgcmVwbGF5IHRpbWVvdXQuIFNlZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXlCdWRnZXQgZG9jcyBmb3IgdGhlIGNvbnRyYWN0LlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPj47XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQgPSBhd2FpdCBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IGJnUnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogYmdTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogYmdSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzdGVwIGhhZCBwZW5kaW5nIG9wcyAoc3RyZWFtIHdyaXRlcyksIGJyZWFrIGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0VW50aWwgZmx1c2ggdGhlbSDigJQgY2FuJ3QgY29udGludWUgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnc2tpcHBlZCdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgZXZlbnRzIHRvIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXJzb3ItYmFzZWQgbG9hZGluZyBzbyB0aGUgbWFpbiBsb29wIGNhbiBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWxseSBmcm9tIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBwZW5kaW5nIHN0ZXBzOiBhbnkgc3RlcF9jcmVhdGVkIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWF0Y2hpbmcgc3RlcF9jb21wbGV0ZWQgb3Igc3RlcF9mYWlsZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFRlcm1pbmFsSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgY2FjaGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwQ3JlYXRlZElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBUZXJtaW5hbElkcy5hZGQoZS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BlbmRpbmdTdGVwcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBzdGVwQ3JlYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBUZXJtaW5hbElkcy5oYXMoaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGVuZGluZ1N0ZXBzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHN0ZXBzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1aW5nIOKAlCB0aGUgbGFzdCBoYW5kbGVyIHRvIGNvbXBsZXRlIHdpbGwgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBkb25lIGFuZCByZXBsYXkgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWNrZ3JvdW5kIHN0ZXAgZG9uZSBidXQgb3RoZXIgc3RlcHMgcGVuZGluZywgcmV0dXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgc3RlcHMgZG9uZSDigJQgZmFsbCB0aHJvdWdoIHRvIHRoZSBtYWluIHJlcGxheSBsb29wLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwIHNoYXJlZCBzdGF0ZSBzbyB0aGUgbG9vcCBjYW4gY29udGludWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUsIHJlcGxheWluZyBpbmxpbmUgYWZ0ZXIgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSBiZ1J1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gYmdTdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZWRFdmVudHMgYW5kIGV2ZW50c0N1cnNvciBhbHJlYWR5IHNldCBmcm9tIGxvYWQgYWJvdmVcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIGVycm9yIHdoaWxlIHByZXBhcmluZyBiYWNrZ3JvdW5kIHdvcmtmbG93IHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyAtLS0gSW5mcmFzdHJ1Y3R1cmU6IHByZXBhcmUgdGhlIHJ1biBzdGF0ZSAtLS1cbiAgICAgICAgICAgICAgICAgIC8vIFNraXAgaWYgd29ya2Zsb3dSdW4gd2FzIGFscmVhZHkgc2V0IGJ5IHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwIHBhdGggKGlubGluZSByZXBsYXkgYWZ0ZXIgYWxsIHBhcmFsbGVsIHN0ZXBzIGRvbmUpLlxuICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd1J1bikge1xuICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgY2FsbCBydW5fc3RhcnRlZCBkaXJlY3RseSDigJQgdGhpcyBib3RoIHRyYW5zaXRpb25zXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gdG8gJ3J1bm5pbmcnIEFORCByZXR1cm5zIHRoZSBydW4gZW50aXR5LCBzYXZpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBzZXBhcmF0ZSBydW5zLmdldCByb3VuZC10cmlwLlxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cmFjdDogZXZlbnRzLmNyZWF0ZSgncnVuX3N0YXJ0ZWQnKSBtdXN0IGJlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJ1bnMgYWxyZWFkeSBpbiAncnVubmluZycgc3RhdHVzIChyZXR1cm4gdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGVycm9yKSwgbm90IGp1c3QgZm9yIHBlbmRpbmcg4oaSIHJ1bm5pbmcgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1blN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fc3RhcnRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzcGVjIHZlcnNpb24gZnJvbSB0aGUgb3JpZ2luYWwgc3RhcnQoKSBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhdmFpbGFibGUsIHNvIHRoZSByZXNpbGllbnQgc3RhcnQgcGF0aCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB3aXRoIHRoZSBjb3JyZWN0IHZlcnNpb24gKG5vdCBhbHdheXMgY3VycmVudCkuXG4gICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dD8uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBydW4gaW5wdXQgZnJvbSBxdWV1ZSBzbyB0aGUgc2VydmVyIGNhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcnVuIGlmIHJ1bl9jcmVhdGVkIHdhcyBtaXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVWludDhBcnJheSB2YWx1ZXMgc3Vydml2ZSB0aGUgcXVldWUgbmF0aXZlbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoQ0JPUiBvbiB3b3JsZC12ZXJjZWwsIEpTT04gcmV2aXZlciBvbiB3b3JsZC1sb2NhbCkuXG4gICAgICAgICAgICAgICAgICAgICAgLi4uKHJ1bklucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dC5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkUnVuU3RhcnRlZENyZWF0ZVN0YXJ0ID0gKFxuICAgICAgICAgICAgICAgICAgICAgIHNraXBQcmVsb2FkOiBib29sZWFuXG4gICAgICAgICAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50KCd3b3JrZmxvdy5ydW5fc3RhcnRlZC5jcmVhdGUuc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuc2tpcF9wcmVsb2FkJzogc2tpcFByZWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR1cmJvICYmIHJ1bklucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGJhY2tncm91bmQgYHJ1bl9zdGFydGVkYCBhbmQgc3ludGhlc2l6ZSB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXR5IGxvY2FsbHkgc28gcmVwbGF5IGNhbiBiZWdpbiB3aXRob3V0IHdhaXRpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJvdW5kLXRyaXAuIFNhZmUgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb2YgdGhlIGZpcnN0IGludm9jYXRpb24g4oCUIHN0YXJ0KCkgY3JlYXRlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gbW9tZW50cyBhZ28gYW5kIG5vIGV2ZW50cyBoYXZlIGJlZW4gd3JpdHRlbiB5ZXQuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcnJpZXIgaXMgY29uc3VtZWQgYnkgZXZlcnkgZG93bnN0cmVhbSB3cml0ZSAoc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIsIG9wdGltaXN0aWMgc3RlcF9zdGFydGVkLCB0ZXJtaW5hbCBydW4gd3JpdGVzKSBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3JkUnVuU3RhcnRlZENyZWF0ZVN0YXJ0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRQcm9taXNlID0gd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3RhcnRlZEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYmFja2dyb3VuZCB0aGlzIHB1cmVseSBhcyBhIHdyaXRlIGJhcnJpZXIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZWFkIGl0cyBwcmVsb2FkZWQgZXZlbnRzIChwcmVsb2FkZWRFdmVudHMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCB0byBbXSBiZWxvdyksIHNvIHRlbGwgdGhlIFdvcmxkIHRvIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBldmVudC1sb2cgcHJlbG9hZC4gVGhhdCB0cmltcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIHJlcXVlc3QgdGhlIGNoYWluZWQgZmlyc3Qgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0cyBvbiDigJQgc2hvcnRlbmluZyB0aW1lLXRvLXNlY29uZC1zdGVwIOKAlCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXN0ZWQgbGlzdCtyZXNvbHZlIGl0IHdvdWxkIG90aGVyd2lzZSBjb21wdXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQsIHNraXBQcmVsb2FkOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllciA9IHN0YXJ0ZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBhIG5vLW9wIHJlamVjdGlvbiBoYW5kbGVyIHNvIGFuIGVhcmx5IGZhaWx1cmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gYmVmb3JlIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYXdhaXQvdGhlbikgaXMgYXR0YWNoZWQ7IGNvbnN1bWVycyBzdGlsbCBvYnNlcnZlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0OiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIHlldCBvbiBhIGZpcnN0IGRlbGl2ZXJ5IChydW5fc3RhcnRlZCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCkuIEFuIGVtcHR5IHByZWxvYWRlZCBzZXQgcm91dGVzIGl0ZXJhdGlvbiAxIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm8tbG9hZCBwcmVsb2FkZWQgYnJhbmNoOyBpdGVyYXRpb24gMiB0aGVuIHRha2VzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBvc3QtcHJlbG9hZGVkIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyAobm8gc3B1cmlvdXMgXCJjdXJzb3IgbWlzc2luZ1wiIHdhcm5pbmcpLiBgW11gIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWxseSB0cnV0aHkgaGVyZSDigJQgZG8gbm90IGNoYW5nZSB0aGUgbG9hZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJyYW5jaGVzJyBgaWYgKHByZWxvYWRlZEV2ZW50cylgIGNoZWNrcyB0byB0ZXN0IGxlbmd0aC5cbiAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogcnVuSW5wdXQuc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlZCBhdHRyaWJ1dGVzIGZyb20gc3RhcnQoKSByaWRlIGFsb25nIGluIGBydW5JbnB1dGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGV5IGxpdmUgaW4gYHJ1bl9jcmVhdGVkYCdzIGV2ZW50RGF0YSwgbm90IHNlcGFyYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXR0cl9zZXRgIGV2ZW50cyksIHNvIHRoZSBzeW50aGVzaXplZCBzbmFwc2hvdCBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGV2ZW4gdGhvdWdoIHdlIHNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QgT05MWSB3aGlsZSBhdHRyaWJ1dGVzIGFyZSB3cml0ZS1vbmx5OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gaW4td29ya2Zsb3cgcmVhZCBBUEkgdG9kYXkgKHNlZSB3b3JrZmxvdy50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZFwiKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcmVsb2FkZWQgbG9nIGNhbid0IGRpdmVyZ2Ugb24gYSByZWFkLiBJZiBhIHJlYWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBldmVyIGFkZGVkIGl0IE1VU1QgcmVhZCBmcm9tIHRoaXMgc25hcHNob3QsIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGF5aW5nIHJ1bl9jcmVhdGVkL2F0dHJfc2V0IGV2ZW50cyDigJQgb3RoZXJ3aXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibydzIGVtcHR5IGluaXRpYWwgbG9nIHdvdWxkIHN1cmZhY2Ugc2VlZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBge31gIG9uIHRoZSBmaXJzdCBkZWxpdmVyeSBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK25vdztcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkUnVuU3RhcnRlZENyZWF0ZVN0YXJ0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5ydW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBjcmVhdGlvbiBmb3IgJ3J1bl9zdGFydGVkJyBkaWQgbm90IHJldHVybiB0aGUgcnVuIGVudGl0eSBmb3IgcnVuIFwiJHtydW5JZH1cImBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gcmVzdWx0LnJ1bjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGV2ZW50cywgdXNlIHRoZW0gdG8gc2tpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QgY2FsbCBhbmQgcmVkdWNlIFRURkIuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlICE9PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzID0gcmVzdWx0LmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZGVkRXZlbnRzQ3Vyc29yID0gcmVzdWx0LmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd1J1bi5zdGFydGVkQXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3J1bklkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB3YXMgY29uY3VycmVudGx5IGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3I6IHJ1biB3YXMgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkIGR1cmluZyBzZXR1cC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yOiBydW4gYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgc2tpcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyB3b3JrZmxvdyBzZXR1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArd29ya2Zsb3dSdW4uc3RhcnRlZEF0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMod29ya2Zsb3dSdW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogd29ya2Zsb3dSdW4uc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmb3IgYGNhbmNlbGAsIHdlIGFjdHVhbGx5IHdhbnQgdG8gcHJvcGFnYXRlIGEgV29ya2Zsb3dDYW5jZWxsZWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSB0aGUgd29ya2Zsb3cgY29udGV4dCBzbyB0aGUgdXNlciBjYW4gZ3JhY2VmdWxseSBleGl0LiB0aGlzIGlzIFNJR1RFUk1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXJtb3JlLCB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IG9yIGEgd2F5IHRvIGZvcmNlIGNhbmNlbCBTSUdLSUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGFjdHVhbGx5IGV4aXQgaGVyZSB3aXRob3V0IHJlcGxheWluZyB0aGUgd29ya2Zsb3cgYXQgYWxsLCBpbiB0aGUgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcGxheWluZyB0aGUgd29ya2Zsb3cgaXMgaXRzZWxmIGZhaWxpbmcuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKG5vbi10dXJibyBydW5fc3RhcnRlZClcbiAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmICghd29ya2Zsb3dSdW4pXG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bidzIGRlcGxveW1lbnQuXG4gICAgICAgICAgICAgICAgICAvLyBVc2VkIGVhZ2VybHkgaGVyZSBzaW5jZSBib3RoIHJ1bldvcmtmbG93IChpbnB1dFxuICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0aW9uIC8gaG9vayBwYXlsb2FkIGRlY3J5cHRpb24pIGFuZCB0aGUgcnVuX2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgLy8gZGVoeWRyYXRlIHBhdGggYmVsb3cgbmVlZCBpdC4gTWVtb2l6ZWQgYWNjZXNzb3I6IGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBjYWxsIHRyaWdnZXJzIHRoZSBhY3R1YWwgZmV0Y2ggLyBIS0RGIGRlcml2YXRpb24sXG4gICAgICAgICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGNhbGxzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTWFpbiByZXBsYXkgbG9vcFxuICAgICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3Mvbm9Db25zdGFudENvbmRpdGlvbjogaW50ZW50aW9uYWwgbG9vcFxuICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbisrO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheS1idWRnZXQgY2hlY2s6IGJhaWwgb3V0IChyZXRyeSBvciBmYWlsKSBpZlxuICAgICAgICAgICAgICAgICAgICAvLyBub24tc3RlcCB0aW1lIHdpdGhpbiB0aGlzIGludm9jYXRpb24gaGFzIGV4Y2VlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb25maWd1cmVkIGJ1ZGdldC4gU3RlcCBib2RpZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgcmVwbGF5QnVkZ2V0LnBhdXNlKCkvcmVzdW1lKCkgYnJhY2tldCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAvLyBgZXhlY3V0ZVN0ZXBgIGNhbGwuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBsYXlCdWRnZXQuaXNFeGhhdXN0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW1pdE1zOiByZXBsYXlCdWRnZXQuY29uZmlndXJlZExpbWl0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT24gVmVyY2VsLCBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQgYWx3YXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgdGhlIHByb2Nlc3MuIE9uIGxvY2FsIGRldiBpdCByZXR1cm5zOyB3ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCBhbmQgdGhlIHJlcXVlc3QgZW5kcyBub3JtYWxseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChydW5fZmFpbGVkIGhhcyBiZWVuIHdyaXR0ZW4gYmVzdC1lZmZvcnQpLlxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRpbWVvdXQgYmVmb3JlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUgPj1cbiAgICAgICAgICAgICAgICAgICAgICBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICdWMiB0aW1lb3V0IHJlYWNoZWQsIHJlLXNjaGVkdWxpbmcgd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZE1zOiBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ3Vyc29yIG9mIHRoaXMgaXRlcmF0aW9uJ3MgZXZlbnQgbG9nIGJlZm9yZSBhbnkgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBhZHZhbmNlIGl0IOKAlCBkZWNsYXJlZCBhdCB0cnkgc2NvcGUgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gY2F0Y2ggKHdoaWNoIHJ1bnMgdGhlIGlubGluZSBzdGVwKSBjYW4gcmVhZCBpdFxuICAgICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgYHNpbmNlQ3Vyc29yYCBmb3IgdGhlIGlubGluZS1kZWx0YSBvcHRpbWl6YXRpb24uXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVJbmxpbmVXcml0ZUN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMg4oCUIHVzZSBjYWNoZWQgZXZlbnRzIHdpdGggaW5jcmVtZW50YWwgZmV0Y2ggb24gc3Vic2VxdWVudCBpdGVyYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgYWx3YXlzIHJldHVybnMgYSBjdXJzb3Igd2hlbiB0aGVyZSBhcmUgZXZlbnRzIChldmVuIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIHBhZ2UpLCBzbyB3ZSBjYW4gcmVsaWFibHkgdXNlIGl0IGZvciBpbmNyZW1lbnRhbCBsb2FkaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudHM6IEV2ZW50W107XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdJbmxpbmVEZWx0YSAmJiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogdGhlIHByZXZpb3VzIGl0ZXJhdGlvbidzIGlubGluZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCB0aGUgYXV0aG9yaXRhdGl2ZSBldmVudC1sb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhIHNpbmNlIHRoZSBwcmUtd3JpdGUgY3Vyc29yLCBzbyB3ZSBjb25zdW1lIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIGluc3RlYWQgb2YgaXNzdWluZyBhbiBpbmNyZW1lbnRhbCBldmVudHMubGlzdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWx0YSBpcyBieXRlLWZvci1ieXRlIHdoYXQgZXZlbnRzLmxpc3QoY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgaGF2ZSByZXR1cm5lZCBhdCB3cml0ZSB0aW1lIOKAlCBpdCBpbmNsdWRlcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyJ3Mgb3duIHN0ZXAgZXZlbnRzLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXAgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkKSBhbm90aGVyIHdyaXRlciBhcHBlbmRlZCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciDigJQgc28gc2tpcHBpbmcgdGhlIGZldGNoIGNhbm5vdCBkcm9wIGV2ZW50cyBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tldyB0aGUgcHJlZml4IGZyb20gdGhlIHNlcnZlcidzIGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gcGVuZGluZ0lubGluZURlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YS5ldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0lkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzLm1hcCgoZSkgPT4gZS5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZGVsdGEuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZ0lkcy5oYXMoZS5ldmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZHMuYWRkKGUuZXZlbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGRlbHRhLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYWNoZWRFdmVudHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGl0ZXJhdGlvbjogdXNlIHByZWxvYWRlZCBldmVudHMgaWYgYXZhaWxhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGRvIGEgZnVsbCBsb2FkIHdpdGggY3Vyc29yLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWxvYWRlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBwcmVsb2FkZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IHByZWxvYWRlZEV2ZW50c0N1cnNvciA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c0N1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3Vic2VxdWVudCBpdGVyYXRpb246IGZldGNoIG9ubHkgbmV3IGV2ZW50cyBzaW5jZSBsYXN0IGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVkdXBlIGJ5IGV2ZW50SWQ6IGEgcHJldmlvdXMgaXRlcmF0aW9uIG1heSBoYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmRlZCBhIHJlZnJlc2hlZCB3YWl0LWNvbXBsZXRpb24gZGVsdGEgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBsb29wIG9ic2VydmVzIHRoZSBhZHZhbmNlZCBjdXJzb3IsIHNvIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbCBmZXRjaCBjYW4gcmV0dXJuIGV2ZW50cyB3ZSBhbHJlYWR5IGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVkLmV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMubWFwKChlKSA9PiBlLmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBsb2FkZWQuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZ0lkcy5oYXMoZS5ldmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZHMuYWRkKGUuZXZlbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3IgPz8gZXZlbnRzQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRpb24gMiBhZnRlciBpdGVyYXRpb24gMSB1c2VkIHByZWxvYWRlZCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGljaCBkb24ndCBjYXJyeSBhIGN1cnNvcikuIERvIGEgZnVsbCBsb2FkIG5vdyB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGljayB1cCBhbnkgZXZlbnRzIHdyaXR0ZW4gc2luY2UgdGhlIHByZWxvYWRlZCBzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBvYnRhaW4gYSBjdXJzb3IgZm9yIHN1YnNlcXVlbnQgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRzLiBUaGlzIGlzIHRoZSBleHBlY3RlZCBwYXRoLCBub3QgYSBidWcuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnTm8gY3Vyc29yIGFmdGVyIHByZWxvYWRlZC1ldmVudHMgZmlyc3QgaXRlcmF0aW9uOyBkb2luZyBmdWxsIHJlbG9hZCB0byBwaWNrIHVwIGN1cnNvci4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGN1cnNvciBhdmFpbGFibGUgZGVzcGl0ZSBoYXZpbmcgY2FjaGVkIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vIHByZWxvYWRlZC1ldmVudHMgZXhwbGFuYXRpb24uIEFsbCBXb3JsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb25zIGFyZSByZXF1aXJlZCB0byByZXR1cm4gYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlcmUgYXJlIGV2ZW50cywgc28gdGhpcyBzaWduYWxzIGEgYnVnIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQuIEZhbGwgYmFjayB0byBhIGZ1bGwgcmVsb2FkIHRvIGF2b2lkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFsZSBkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRXZlbnQgY3Vyc29yIG1pc3NpbmcgYWZ0ZXIgaW5pdGlhbCBsb2FkIOKAlCBmYWxsaW5nIGJhY2sgdG8gZnVsbCByZWxvYWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB0aGUgV29ybGQgaW1wbGVtZW50YXRpb24uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gY2FjaGVkRXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjb25jdXJyZW50IGNvbXBsZXRpb24gdmlhIHRoZSBldmVudCBsb2c6IGlmXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGhhbmRsZXIgd3JvdGUgYSB0ZXJtaW5hbCBydW4gZXZlbnQsIGV4aXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgcmVwbGF5IHdvcmsuIFRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZXNlIGV2ZW50cywgc28gY2hlY2tpbmcgdGhlIGxvZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdXMgdGhlIHNhbWUgc2lnbmFsIGFzIGEgcnVucy5nZXQoKSByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgZXh0cmEgcmVxdWVzdCBwZXIgbG9vcCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0c1RvQ29tcGxldGUgPSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk6IGUgaXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ICYgeyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPj0gKGUuZXZlbnREYXRhLnJlc3VtZUF0IGFzIERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGUuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lQXQ6IGUuZXZlbnREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0RXZlbnQgb2Ygd2FpdHNUb0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCB3YWl0RXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2FpdCBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRzVG9Db21wbGV0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZXZlbnQgbGlzdCBhYm92ZSBtYXkgYmUgc3RhbGUgYnkgdGhlIHRpbWUgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCBpcyBjb21taXR0ZWQuIExvYWQgb25seSBldmVudHMgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBjdXJzb3Igc28gY29uY3VycmVudCBkdXJhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMsIHN1Y2ggYXMgaG9va19yZWNlaXZlZCwga2VlcCB0aGVpciBvcmRlcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgdG8gd2FpdF9jb21wbGV0ZWQuIEZhbGwgYmFjayB0byBhIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbG9hZCBmb3Igb2xkZXIgd29ybGRzIHRoYXQgY2Fubm90IGdpdmUgdXMgYSBzdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciwgb3IgaWYgdGhlIGN1cnNvciBkZWx0YSBkb2VzIG5vdCBpbmNsdWRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBjb21wbGV0aW9uIHRoaXMgaGFuZGxlciBqdXN0IGF0dGVtcHRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudHNDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYXdBbGxXYWl0Q29tcGxldGlvbnMgPSB3YWl0c1RvQ29tcGxldGUuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhaXRFdmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvci5oYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRFdmVudC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhd0FsbFdhaXRDb21wbGV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5tYXAoKGUpID0+IGUuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgbG9hZGVkLmV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZ0lkcy5oYXMoZXZlbnQuZXZlbnRJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdJZHMuYWRkKGV2ZW50LmV2ZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3IgPz8gZXZlbnRzQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRpbmcgZWxhcHNlZCB3YWl0cyByZWZyZXNoZXMgdGhlIGV2ZW50IHNuYXBzaG90LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIG1heSBoYXZlIHdyaXR0ZW4gdGhlIHRlcm1pbmFsIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGFmdGVyIHRoZSBpbml0aWFsIHNuYXBzaG90IGJ1dCBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gT25jZSB0aGUgZXZlbnQgbG9nIHJlY29yZHMgdGhhdCBvdXRjb21lLCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgaXMgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHJlZmVyZW5jZSAobWF5IGhhdmUgYmVlbiBzZXQgZm9yIGZpcnN0IHRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gZXZlbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3QgdGhlIGN1cnNvciBhcyBpdCBzdGFuZHMgZm9yIHRoaXMgaXRlcmF0aW9uJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb2csIGJlZm9yZSBhbnkgaW5saW5lIHdyaXRlcyAoc3RlcF9jcmVhdGVkIHZpYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZVN1c3BlbnNpb24sIHN0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZCB2aWFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlU3RlcCkgYWR2YW5jZSBpdC4gVGhpcyBpcyB0aGUgYHNpbmNlQ3Vyc29yYFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRlZCB0byBhIHN1cHBvcnRpbmcgV29ybGQgb24gdGhlIGlubGluZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBzbyBpdCBjYW4gcmV0dXJuIHRoZSBldmVudC1sb2cgZGVsdGEg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGV0dGluZyB0aGUgbmV4dCBpdGVyYXRpb24gc2tpcCB0aGUgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdC4gQ2FwdHVyZWQgaGVyZSBiZWNhdXNlIG5vdGhpbmcgYmV0d2VlbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgYW5kIHRoZSBpbmxpbmUgZXhlY3V0ZVN0ZXAgbXV0YXRlcyBldmVudHNDdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgcHJlSW5saW5lV3JpdGVDdXJzb3IgPSBldmVudHNDdXJzb3I7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXkgd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGFydGluZyB3b3JrZmxvdyByZXBsYXknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Xb3JrZmxvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBIeWRyYXRpb25DYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiB0aGUgZW5kLW9mLXJ1biBkcmFpbiBpbnNpZGUgcnVuV29ya2Zsb3cgY29tbWl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgIGV2ZW50cyBiZWZvcmUgdGhlIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXdhaXRSdW5SZWFkeSgpYCBiZWxvdywgc28gZ2F0ZSB0aG9zZSB3cml0ZXMgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgdG9vLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgcmVwbGF5IGNvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZmxvdyBjb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGEgd29ya2Zsb3cgdGhhdCBmaW5pc2hlcyB3aXRoIG5vIHN0ZXBzIHJlYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQ7IG9yZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgYWZ0ZXIgaXQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgc3VzcGVuZGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXNwZW5zaW9uUmVzdWx0OiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBoYW5kbGVTdXNwZW5zaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3VzcGVuc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmF0YWxFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGZhaWx1cmVzIHByb3BhZ2F0ZSB0byB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIHNvIHRoZSBtZXNzYWdlIGlzIHJlZGVsaXZlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN1c3BlbnNpb25FcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24tcmV0cnlhYmxlIGZhaWx1cmUgd2hpbGUgY29tbWl0dGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbidzIGV2ZW50cyDigJQgZS5nLiBhbiBhdHRyaWJ1dGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkIHJlamVjdGVkIGFzIGludmFsaWQgKHRoZSBjdW11bGF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlci1ydW4gY2FwIGNhbiBvbmx5IGJlIGNoZWNrZWQgV29ybGQtc2lkZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGVsaXZlcnkgd291bGQgcmVwbGF5IHRoZSB3b3JrZmxvdyBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHdyaXRlIGFuZCB0aGUgc2FtZSByZWplY3Rpb24sIHNvIGZhaWwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHdlZGdpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgaW4gcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihzdXNwZW5zaW9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb24tcmV0cnlhYmxlIGVycm9yIHdoaWxlIGNvbW1pdHRpbmcgd29ya2Zsb3cgc3VzcGVuc2lvbjsgZmFpbGluZyBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdXNwZW5zaW9uRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JUeXBlKHN1c3BlbnNpb25FcnJvci5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N1c3BlbnNpb24gaGFuZGxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25NczogRGF0ZS5ub3coKSAtIHN1c3BlbnNpb25TdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzOiBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0Py5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNIb29rQ29uZmxpY3Q6IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBd2FpdGVkSG9va0NyZWF0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXR0cmlidXRlRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvb2sgY29uZmxpY3Q6IGJyZWFrIGxvb3AsIHJlLWludm9rZSB2aWEgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSB3b3JrZmxvdyBhdHRyaWJ1dGUgZXZlbnRzIGFyZSByZXNvbHZlZCB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIFJlLWludm9rZSBiZWZvcmUgcHJvY2Vzc2luZyBwZW5kaW5nIHN0ZXBzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gUHJvbWlzZS5yYWNlKFtzZXRBdHRyaWJ1dGVzKCksIHN0ZXAoKV0pLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmFibGUgYXR0cmlidXRlIGV2ZW50IGNhbiB3aW4gd2l0aG91dCBleGVjdXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb3Npbmcgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwcyA9IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgZXhlY3V0aW9uIGlzIGdhdGVkIG9uIG93bmVyc2hpcC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIHRvIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyAoYGxhenlJbmxpbmVTdGVwc2ApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcnVuIHRoZW0gaW5saW5lIOKAlCBpbiBwYXJhbGxlbCDigJQgdmlhIGxhenlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyB0aGF0IGNyZWF0ZSBlYWNoIHN0ZXAgb24gdGhlIGZseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmluZyBvbmUgd29ybGQgcm91bmQtdHJpcCBwZXIgaW5saW5lIHN0ZXAuIE93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgYXRvbWljIGFuZCBleGFjdGx5LW9uZSBwZXIgc3RlcDogdGhlIHdvcmxkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSBpbnNpZGUgZWFjaCBzdGVwX3N0YXJ0ZWQgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVudGl0eUNvbmZsaWN0RXJyb3JgICjihpIgZXhlY3V0ZVN0ZXAgYHNraXBwZWRgKSB0byBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgbG9zZXIsIHNvIG9ubHkgb25lIGhhbmRsZXIgZXZlciBydW5zIGEgZ2l2ZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZHkuIEV2ZXJ5IG90aGVyIHBlbmRpbmcgc3RlcCBrZWVwcyBpdHMgZWFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCAoaW4gYGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHNgKSBhbmQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIG9ubHkgZGVzaWduYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGxhenlJbmxpbmVTdGVwc2Agd2hlbiBubyBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBwcmVzZW50LiBUaGF0IGF3YWl0ZXIgY2FzZSBtdXN0IGV4ZWN1dGUgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lOiBhbiBpbmxpbmUgYGF3YWl0IGV4ZWN1dGVTdGVwKC4uLilgIGJsb2NrcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLCBzbyB0aGUgYXdhaXRlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gKHdoaWNoIG9ubHkgYWR2YW5jZXMgb24gdGhlIG5leHQgcmVwbGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgc2VyaWFsaXplZCBiZWhpbmQgdGhlIHN0ZXAg4oCUIGRlZmVhdGluZyB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ya2Zsb3cgZXhwcmVzc2VkIGFzIHBhcmFsbGVsIChlLmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgaG9vay5nZXRDb25mbGljdCgpLnRoZW4oKCkgPT4gc3RlcEIoKSlgIHJhY2luZyBgYXdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBBKClgKS4gSW4gdGhhdCBjYXNlIGBsYXp5SW5saW5lU3RlcHNgIGlzIGVtcHR5IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgc3RlcCBpcyBxdWV1ZWQgZm9yIHJlLWludm9jYXRpb24sIHdoaWNoIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyIHdoaWxlIHF1ZXVlZCBzdGVwcyBydW4gaW4gcGFyYWxsZWwgaW52b2NhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5SW5saW5lU3RlcHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmxhenlJbmxpbmVTdGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUNvcnJlbGF0aW9uSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT4gcy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZmllZCBxdWV1ZSBkaXNwYXRjaCBmb3IgZXZlcnl0aGluZyB3ZSBhcmUgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUtZXhlY3V0aW5nLiBTdGVwcyBhcmUgcXVldWVkIHdpdGggc3RlcElkIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVjZWl2ZXIgcnVucyB0aGVtOyB0aGUgd2FpdCB0aW1lciBpcyBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZ2VuZXJpYyBjb250aW51YXRpb24gdGhhdCBmaXJlcyBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZWxhcHNlcyBhbmQgbGV0cyB0aGUgbmV4dCByZXBsYXkgb2JzZXJ2ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCB2aWEgdGhlIFwiY29tcGxldGUgZWxhcHNlZCB3YWl0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgcXVldWVpbmcgaXMgdW5jb25kaXRpb25hbCAoY292ZXJzIGNyYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWYgYSBwcmlvciBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGNyYXNoZWQgYmVmb3JlIHF1ZXVlaW5nLCBhIGxhdGVyIGhhbmRsZXIgd2lsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlbTsgaWRlbXBvdGVuY3lLZXkgb24gY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVkdXBlcyByZWR1bmRhbnQgcXVldWVzIGFjcm9zcyBjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVycykuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3NlcyDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBwZW5kaW5nU3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChkaXNwYXRjaGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBleGVjdXRlIGlubGluZSDigJQgZXZlcnl0aGluZyBoYXMgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIChvciBubyB3b3JrIG5lZWRzIHNjaGVkdWxpbmcpLiBFeGl0IGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBkcml2ZSBzdWJzZXF1ZW50IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgYW4gaW1tZWRpYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWludm9jYXRpb246IHRoZSByZXBsYXkgY29uc3VtZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIuIFdpdGhvdXQgaXQgKG5vIGlubGluZSBzdGVwLCBhbGwgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgb3Igbm9uZSBwZW5kaW5nKSB0aGUgcnVuIHdvdWxkIHNpdCBpZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudGlsIHNvbWUgdW5yZWxhdGVkIG1lc3NhZ2Ugd29rZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgaW5saW5lIHN0ZXAuIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBzdGVwIGJvZHkg4oCUIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heER1cmF0aW9uLCBub3QgYnkgdGhlIHJlcGxheSB0aW1lb3V0LiBXaXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRoZSByZXBsYXktYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIHdvdWxkIChpbmNvcnJlY3RseSkgY2hhcmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCBib2R5IGFnYWluc3QgdGhlIGJ1ZGdldC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBmYXN0IHBhdGggZ2F0ZS4gV2UgcmVxdWVzdCB0aGUgZGVsdGEg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb24gdGhlIG5leHQgaXRlcmF0aW9uIGNvbnN1bWUgaXQgaW4gcGxhY2Ugb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCDigJQgb25seSB3aGVuIEFMTCBob2xkOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdlIGhhdmUgYSByZWFsIHByaW9yIGN1cnNvciB0byBkaWZmIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgcHJlSW5saW5lV3JpdGVDdXJzb3JgOyBhIFdvcmxkIG1heSByZXR1cm4gbm9uZSBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGluaXRpYWwgbG9hZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBUaGlzIGlzIHRoZSBjbGVhbiBzaW5nbGUtc3RlcCBzZXF1ZW50aWFsIGNhc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGlzIHN1c3BlbnNpb24gcHJvZHVjZWQgZXhhY3RseSBvbmUgc3RlcCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGhvb2tzIG9yIHdhaXRzIChgZXJyLntzdGVwLGhvb2ssd2FpdH1Db3VudGApLCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvbmUgc3RlcCBpcyB0aGUgbG9uZSBwZW5kaW5nIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMWApIGFuZCB0aGUgbG9uZSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHN0ZXAgKGBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxYCDigJQgbm8gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNpYmxpbmdzIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLCBhbmQgbm8gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlubGluZSBzdGVwIHdyaXRpbmcgaXRzIG93biBldmVudHMgb3V0IG9mIGJhbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gcGVuZGluZyB3YWl0IHRpbWVyIGZyb20gVEhJUyBzdXNwZW5zaW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhlIHJ1biBoYXMgTk8gcHJlLWV4aXN0aW5nIG9wZW4gaG9vayBvciB3YWl0LiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwbHVzIHRoZSBwZXItc3VzcGVuc2lvbiBjb3VudHMgYWJvdmUgaXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBsb2FkLWJlYXJpbmcgc2FmZXR5IGNoZWNrOiB0aGUgZGVsdGEgc25hcHNob3RzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgbG9nIGF0IHRoZSBzdGVwX2NvbXBsZXRlZCB3cml0ZSBidXQgaXMgY29uc3VtZWQgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBuZXh0IHJlcGxheSwgc28gYW4gb3V0LW9mLWJhbmQgaG9va19yZWNlaXZlZCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YWl0X2NvbXBsZXRlZCBsYW5kaW5nIGluIHRoYXQgd2luZG93IHdvdWxkIGJlIGluIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlYWwgZmV0Y2ggeWV0IGFic2VudCBmcm9tIHRoZSBzdGFsZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJpc2tpbmcgYSBkaXZlcmdlbnQgcmVwbGF5LiBXaXRoIG5vIGhvb2svd2FpdCBvcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAobmVpdGhlciBjYXJyaWVkIG92ZXIgbm9yIGNyZWF0ZWQgdGhpcyBzdXNwZW5zaW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBvbmx5IG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBzYWZlIHRvIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGhhc09wZW5Ib29rT3JXYWl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSBzdGVwIHJ1bnMgaW5saW5lLCBlYWNoIHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBldmVudHMgYW5kIHRoZSBwZXItd3JpdGUgZGVsdGEgd291bGQgYmUgcGFydGlhbCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBpcyBub3QgcmVxdWVzdGVkICh0aGUgZ2F0ZSBiZWxvdyBpcyBmYWxzZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpLXN0ZXApIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZG9lcyBhIG5vcm1hbCBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmxpbmVEZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcmVJbmxpbmVXcml0ZUN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNPcGVuSG9va09yV2FpdChjYWNoZWRFdmVudHMgPz8gW10pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGFydCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gg4oCUIGJ1dCBvbmx5IHdoaWxlIHRoZSBydW4gaXMgc3RpbGwgXCJjbGVhblwiIChhIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbikuIFRoZSBtb21lbnQgYSBob29rIG9yIHdhaXQgKG9yIGF0dHIpIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBsYXRlciByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYmVjb21lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSwgc28gdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydCBzYWZlIG5vIGxvbmdlciBob2xkcyDigJQgdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIGFuZCB0aGUgc3RlcHMgdGFrZSB0aGUgbm9ybWFsIChlbnYtZ2F0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdC10aGVuLXJ1biBwYXRoLiBUaGUgaG9vay1jb25mbGljdCAvIGF0dHIgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgcmV0dXJuZWQgZWFybHkgYWJvdmUgYW5kIHRoZSBhd2FpdGVkLWhvb2sgY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1wdGllZCBsYXp5SW5saW5lU3RlcHM7IHRoZSBjaGVja3MgYmVsb3cgYXJlIGRlZmVuc2l2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYHN1c3BlbnNpb25SZXN1bHQuKmAgZmxhZ3Mgb25seSByZWZsZWN0IHdoYXQgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggY3JlYXRlZCwgc28gdGhleSBkbyBub3QgY2F0Y2ggYSBob29rL3dhaXQgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlYXJsaWVyIGl0ZXJhdGlvbiBvZiB0aGUgc2FtZSBkZWxpdmVyeSAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soLi4uKWAgdGhhdCBkb2Vzbid0IGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3csIGxldHRpbmcgdGhlIHJlcGxheSBsb29wIGNvbnRpbnVlIHRvIGxhdGVyIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbnMpLiBPbmNlIGFueSBob29rIG9yIHdhaXQgaXMgb3BlbiBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgbG9nLCByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYXJlIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biwgc28gdHVyYm8gbXVzdCBsYXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm1hbmVudGx5IOKAlCBjaGVja2VkIGhlcmUgdmlhIGBoYXNPcGVuSG9va09yV2FpdGAgb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1bXVsYXRpdmUgYGNhY2hlZEV2ZW50c2AuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JjZU9wdGltaXN0aWNTdGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc09wZW5Ib29rT3JXYWl0KGNhY2hlZEV2ZW50cyA/PyBbXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIGlubGluZSBzdGVwcyBpbiBwYXJhbGxlbC4gVGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnVkZ2V0IGlzIHBhdXNlZCBmb3IgdGhlIHdob2xlIGJhdGNoIOKAlCBzdGVwIGR1cmF0aW9uIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uIG1heER1cmF0aW9uLCBub3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgdGltZW91dCDigJQgc28gdGhlIGJ1ZGdldCBjaGVjayBhdCB0aGUgdG9wIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBsb29wIGl0ZXJhdGlvbiBkb2Vzbid0IGNoYXJnZSB0aGUgc3RlcCBib2RpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0czogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA+W107XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIHN0YXJ0OiBzZW5kIHRoZSBkZWZlcnJlZCBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgb24gc3RlcF9zdGFydGVkIHNvIHRoZSB3b3JsZCBjcmVhdGVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIG9uIHRoZSBmbHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMuZGVoeWRyYXRlZElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogZm9yY2Ugb3B0aW1pc3RpYyBzdGFydCBhbmQgaG9sZCB0aGUgbGF6eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgdW50aWwgdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYW5kcyAodGhlIGJvZHkgc3RpbGwgcnVucyBpbW1lZGlhdGVseSkuIEJvdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHVuZGVmaW5lZC9mYWxzZSBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVxdWVzdElubGluZURlbHRhICYmIHByZUlubGluZVdyaXRlQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZURlbHRhU2luY2VDdXJzb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlSW5saW5lV3JpdGVDdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHRoZSBiYXRjaCByZXN1bHRzLiBgcmV0cnlgIHN0ZXBzICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBleGlzdCDigJQgdGhlaXIgYHN0ZXBfc3RhcnRlZGAgc3VjY2VlZGVkKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXF1ZXVlZCBwZXItc3RlcCBhcyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheTsgYHRocm90dGxlZGAgc3RlcHMgKHJlamVjdGVkIG9uIHRoZSBjcmVhdGUtY2xhaW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBuZXZlciBjcmVhdGVkKSBpbnN0ZWFkIGRlZmVyIHJlZGVsaXZlcnkgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2Ugc28gdGhleSByZS1ydW4gaW5saW5lIHdpdGggaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlcGxheTsgY29tcGxldGVkL2ZhaWxlZCBzdGVwcyBhbHJlYWR5IHdyb3RlIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudHMuIFdlIG9ubHkgbG9vcCBiYWNrIHRvIHJlcGxheSB3aGVuIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUg4oCUIG90aGVyd2lzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXBlbmRpbmcgc3RlcHMgd2lsbCBiZSByZS1ydW4gYnkgdGhlaXIgcXVldWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlcyBhbmQgdGhlIGJhY2tncm91bmQtc3RlcCBoYW5kbGVyIHJlcGxheXMgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiAodHlwZW9mIGxhenlJbmxpbmVTdGVwcylbbnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbnlQZW5kaW5nT3BzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHRocm90dGxlZCBpbmxpbmUgc3RlcCBkZWxheXMgcmVkZWxpdmVyeSBvZiBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgbWVzc2FnZSByYXRoZXIgdGhhbiBiZWluZyByZS1xdWV1ZWQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwLiBDcnVjaWFsbHksIGEgYHRocm90dGxlZGAgcmVzdWx0IG1lYW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGF6eSBgc3RlcF9zdGFydGVkYCB3YXMgcmVqZWN0ZWQgb24gdGhlIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIOKAlCBzbyB0aGUgc3RlcCB3YXMgTkVWRVIgY3JlYXRlZCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX2NyZWF0ZWRgLCBubyBzdGVwIGVudGl0eSkuIFJlLXF1ZXVpbmcgaXQgYXMgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwIHdvdWxkIHNlbmQgYSBiYXJlIGBzdGVwX3N0YXJ0ZWRgIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQpLCB3aGljaCB0aGUgd29ybGQgcmVqZWN0cyB3aXRoIGBTdGVwIFwiPGlkPlwiIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmRgIGJlY2F1c2UgaXQgY2Fubm90IGxhemlseSBjcmVhdGUgdGhlIHN0ZXAgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGlucHV0OyB0aGF0IGVycm9yIGlzbid0IHRyYW5zbGF0YWJsZSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHJlZGVsaXZlcnMgdW50aWwgTUFYX1FVRVVFX0RFTElWRVJJRVMgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCAoYW5kIHJ1bikgZmFpbC4gRGVmZXJyaW5nIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcmNoZXN0cmF0b3IgaW5zdGVhZCByZS1hdHRlbXB0cyB0aGUgdGhyb3R0bGVkIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBXSVRIIGl0cyBpbnB1dCBvbiByZXBsYXkuIFdlIHRyYWNrIHRoZSBsb25nZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrb2ZmIHNvIGEgYmF0Y2ggd2l0aCBtdWx0aXBsZSB0aHJvdHRsZXMgd2FpdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXguIE5vdGU6IGByZXRyeWAgcmVzdWx0cyBhcmUgc2FmZSB0byByZS1xdWV1ZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyBiZWNhdXNlIGEgcmV0cnkgaW1wbGllcyBgc3RlcF9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzdWNjZWVkZWQgYW5kIHRoZSBzdGVwIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aHJvdHRsZVRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF6eUlubGluZVN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBzdGVwUmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGxhenlJbmxpbmVTdGVwc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiByLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlQZW5kaW5nT3BzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXIgcmVkZWxpdmVyeSBvZiB0aGUgb3JjaGVzdHJhdG9yIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdHRsZSBiYWNrb2ZmLiBPbiByZXBsYXkgZXZlcnkgbm9uLXRlcm1pbmFsIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcmUtZGlzcGF0Y2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtdGhyb3R0bGVkIHN0ZXBzIHJ1biBpbmxpbmUgYWdhaW4gV0lUSCB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCAodGhlaXIgYHN0ZXBfY3JlYXRlZGAgaXMgZGVmZXJyZWQgYW5ldyksIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgYHJldHJ5YCBzdGVwcyBpbiB0aGlzIGJhdGNoIGFyZSBxdWV1ZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93biByZXRyeUFmdGVyIGhvbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmFsIHN0ZXBzIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVkIGZyb20gdGhlaXIgZXZlbnRzIGFuZCBub3QgcmUtcnVuLiBCZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXkgZHJpdmVzIGFsbCByZW1haW5pbmcgd29yaywgd2UgbXVzdCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyByZS1xdWV1ZSBgdG9SZXRyeWAgaGVyZSDigJQgdGhhdCB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGUtZGlzcGF0Y2ggdGhvc2Ugc3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmV0dXJucyBCRUZPUkUgdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3csIHNvIGEgYmF0Y2ggdGhhdCBtaXhlcyBhIHRocm90dGxlIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc3RlcCB0aGF0IGxlZnQgdW5mbHVzaGVkIG9wcyBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGUgZXhwbGljaXQgZmx1c2ggY29udGludWF0aW9uLiBUaGF0IGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdGhyb3R0bGUgYmFja29mZiAoPj0gMXMpIGFsd2F5cyBleGNlZWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1pbnZvY2F0aW9uIGZsdXNoIHdpbmRvdyAoPD0gNTAwbXMgKyB3YWl0VW50aWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBvcHMgc2V0dGxlIGJlZm9yZSB0aGUgcG9zdC1iYWNrb2ZmIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cyBhbmQgcmVhZHMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKHRocm90dGxlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlUcmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkubWFwKCh7IHN0ZXAsIGRlbGF5U2Vjb25kcyB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXRyeVRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgdGhlIGRlbGF5ZWQgcmV0cnkgb24gdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlbGF0aW9uSWQgc28gaXQgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWVkIHJlLWRpc3BhdGNoIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJmb3JtcyBvbiByZXBsYXkgKGl0IGFsc28gdXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkYCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGEgbWl4ZWQgYmF0Y2ggd2hlcmUgb25lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY29tcGxldGVkYCB3aXRoIHVuZmx1c2hlZCBiYWNrZ3JvdW5kIG9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChgYW55UGVuZGluZ09wc2ApIGFuZCBhbm90aGVyIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyB3b3VsZCBkb3VibGUtZGlzcGF0Y2ggdGhlIHJldHJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoIGJlbG93IHF1ZXVlcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSBwbGFpbiBjb250aW51YXRpb24sIHdob3NlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIHN0aWxsLWByZXRyeWluZ2Agc3RlcCBhcyBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJlLWRpc3BhdGNoZXMgaXQgKmltbWVkaWF0ZWx5KiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqd2l0aCogYSBrZXkuIFNpbmNlIHRoaXMgZGVsYXllZCByZXRyeSBoYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBrZXksIHRoZSB0d28gbWVzc2FnZXMgd291bGRuJ3QgZGVkdXBlIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIHdvdWxkIHJ1biB0d2ljZSwgdGhlIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBiYWNrb2ZmIHdvdWxkIGJlIGlnbm9yZWQgKHBsYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVycm9yYCByZXRyaWVzIHBlcnNpc3Qgbm8gYHJldHJ5QWZ0ZXJgLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JsZCBoYXMgbm8gYFRvb0Vhcmx5YCBndWFyZCksIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBib2R5IGNvdWxkIHJ1biBlYXJseS9jb25jdXJyZW50bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhcmluZyB0aGUga2V5IGxldHMgdGhlIGVhcmxpZXIgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2Ugd2luLCBob25vcmluZyB0aGUgYmFja29mZi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbnkgaW5saW5lIHN0ZXAgaGFkIHBlbmRpbmcgYmFja2dyb3VuZCBvcHMgKGUuZy4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gd3JpdGVzIHRvIFMzKSwgYnJlYWsgdGhlIGxvb3AgYW5kIHF1ZXVlIGEgcGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBzbyB3YWl0VW50aWwgY2FuIGZsdXNoIHRoZW0gYmVmb3JlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCByZXBsYXkgcmVhZHMgdGhlbS4gVGhpcyBtYXRjaGVzIFYxIGJlaGF2aW9yIHdoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHN0ZXAgcmFuIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbnlQZW5kaW5nT3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JyZWFraW5nIGxvb3A6IGlubGluZSBzdGVwIGhhcyBwZW5kaW5nIG9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbG9vcEl0ZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgaW5saW5lIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIHZpYSB0aGVpciBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgbWVzc2FnZXM7IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgaGFuZGxlciByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYWxsIHN0ZXBzIGFyZSB0ZXJtaW5hbC4gRG9uJ3QgbG9vcCBoZXJlIOKAlCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgc3RlcHMgaGF2ZSBubyB0ZXJtaW5hbCBldmVudCB0byBvYnNlcnZlIHlldC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgaW5saW5lIHN0ZXBzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSDigJQgbG9vcCBiYWNrIHRvIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSB3b3JrZmxvdyBvYnNlcnZlcyB0aGUgdGVybWluYWwgZXZlbnRzIG9uIHJlcGxheSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNpbmdsZSBpbmxpbmUgc3RlcCdzIHRlcm1pbmFsIHdyaXRlIHJldHVybmVkIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgZGVsdGEgKHN1cHBvcnRpbmcgV29ybGQgKyB0aGUgc2luZ2xlLXN0ZXAgZ2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdmUpLCBzdGFzaCBpdCBzbyB0aGUgbmV4dCBpdGVyYXRpb24ncyBsb2FkIGNvbnN1bWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnN0ZWFkIG9mIGlzc3VpbmcgYW4gaW5jcmVtZW50YWwgZXZlbnRzLmxpc3QuIE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wbGV0ZWQgcGF0aCBjYXJyaWVzIGEgZGVsdGE7IG11bHRpLXN0ZXAgYmF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV2ZXIgcmVxdWVzdCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbmx5ID0gc3RlcFJlc3VsdHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnR5cGUgPT09ICdjb21wbGV0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS5pbmxpbmVEZWx0YSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvbmx5LmlubGluZURlbHRhLmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0lubGluZURlbHRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBvbmx5LmlubGluZURlbHRhLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogb25seS5pbmxpbmVEZWx0YS5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZXMgdGFsa2luZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkICh3b3JrZmxvdy1zZXJ2ZXIpIOKAlCBhbiBleGhhdXN0ZWQgUmV0cnlBZ2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFVORF9FUlJfUkVRX1JFVFJZIGZyb20gYSBzdXN0YWluZWQgNDI5LzUwMyBzdG9ybSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGRyb3BwZWQgc29ja2V0LCBhIGNvbm5lY3QvRE5TIGZhaWx1cmUsIG9yIGEgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IOKAlCBtdXN0IE5PVCBmYWlsIHRoZSBydW4uIFJldGhyb3cgc28gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzIGFuZCBhIGZyZXNoIGludm9jYXRpb24gcmV0cmllcyB0aGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIHRoZSBiYWNrZW5kIHJlY292ZXJzLiBUaGUgQHZlcmNlbC9xdWV1ZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIGEgZmFzdCAoMXPihpI2MHMpIGJhY2tvZmYgYnkgZGVsaXZlcnkgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZGluZyB0aGUgfjVtaW4gZGVmYXVsdCB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBuZXZlciBraWxsaW5nIHRoZSBwcm9jZXNzIHZpYSBydW5fZmFpbGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJhbnNpZW50IHdvcmxkIGVycm9yIGR1cmluZyByZXBsYXk7IHJlZGVsaXZlcmluZyB2aWEgcXVldWUgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm1pbmFsRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVwbGF5RGl2ZXJnZW5jZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGl2ZXJnZW5jZUNvdW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGF5RGl2ZXJnZW5jZT8uY291bnQgPz8gMCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhSZWNvdmVyeVJlcGxheXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpdmVyZ2VuY2VDb3VudCA8PSBtYXhSZWNvdmVyeVJlcGxheXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQ7IHF1ZXVlaW5nIGEgcmVjb3ZlcnkgcmVwbGF5IGJlZm9yZSBkZWNsYXJpbmcgdGhlIGV2ZW50IGxvZyBjb3JydXB0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfRElWRVJHRU5DRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUV2ZW50SWQ6IGVyci5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvckRpdmVyZ2VuY2VFdmVudElkOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U/LmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWNvdmVyeVJlcGxheXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IGVyci5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yID0gbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJlcGxheSBkaXZlcmdlZCAke2RpdmVyZ2VuY2VDb3VudH0gdGltZXMgYWZ0ZXIgJHttYXhSZWNvdmVyeVJlcGxheXN9IHJlY292ZXJ5IHJlcGxheXM7IGxhdGVzdCBkaXZlcmdlbnQgZXZlbnQgd2FzICR7ZXJyLmV2ZW50SWR9LiBMYXN0IGRpdmVyZ2VuY2U6ICR7ZXJyLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiBlcnIgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIGNvZGUgZXJyb3JzIGFuZCB0ZXJtaW5hbCBydW50aW1lIGVycm9ycyBmYWlsIHRoZSBydW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVybWluYWxFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnJlY29yZEV4Y2VwdGlvbj8uKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IodGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3IubmFtZSB8fCBnZXRFcnJvck5hbWUodGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBub3JtYWxpemVkRXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLnN0YWNrIHx8IGdldEVycm9yU3RhY2sodGVybWluYWxFcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayA9IHJlbWFwRXJyb3JTdGFjayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzc2lmeSB0aGUgZXJyb3I6IFdvcmtmbG93UnVudGltZUVycm9yIGluZGljYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gU0RLL3J1bnRpbWUgaXNzdWUsIGFuZCBzZWxlY3RlZCBzdWJjbGFzc2VzIHVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBzcGVjaWZpYyBjb2RlcyBmb3IgYmFja2VuZCB0cmFja2luZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGNsYXNzaWZ5UnVuRXJyb3IodGVybWluYWxFcnJvcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ0Vycm9yIHdoaWxlIHJ1bm5pbmcgd29ya2Zsb3cnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSB0aGUgc291cmNlLW1hcC1yZW1hcHBlZCBzdGFjayB0byB0aGUgdGhyb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBzbyB0aGF0IHRoZSBzZXJpYWxpemVkIGVycm9yIHByZXNlcnZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGNvbnN1bWVycy4gYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgaXMgdXNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBgZXJyIGluc3RhbmNlb2YgRXJyb3JgIGJlY2F1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBydW5zIGluIGEgc2VwYXJhdGUgVk0gcmVhbG0g4oCUIGl0cyBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3MgaXMgZGlzdGluY3QgZnJvbSB0aGUgaG9zdCdzLCBzbyBgaW5zdGFuY2VvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3JgIGlzIGBmYWxzZWAgZm9yIFZNLXRocm93biBlcnJvcnMuIFRoZSBWOFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSB0YWcgd29ya3MgYWNyb3NzIHJlYWxtcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pc05hdGl2ZUVycm9yKHRlcm1pbmFsRXJyb3IpICYmIGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlcm1pbmFsRXJyb3IgYXMgRXJyb3IpLnN0YWNrID0gZXJyb3JTdGFjaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgd29ya2Zsb3cgcnVuIHZpYSBldmVudCAoZXZlbnQtc291cmNlZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBzbyBpdHMgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBpZGVudGl0eSBhbmQgY3VzdG9tIHByb3BlcnRpZXMgcm91bmQtdHJpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFpbEVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IC8vIEVuZCB3aGlsZSBsb29wXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApOyAvLyBFbmQgdHJhY2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApOyAvLyBFbmQgd2l0aFdvcmtmbG93QmFnZ2FnZVxuICAgICAgICB9KTsgLy8gRW5kIHdpdGhUcmFjZUNvbnRleHRcbiAgICAgIH1cbiAgICApO1xuXG4gIGxldCBjYWNoZWRIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuICBsZXQgaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgY29uc3QgZW50cnlwb2ludENyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvdXRlTW9kdWxlQm9keUluaXRNcyA9XG4gICAgdHlwZW9mIG9wdGlvbnM/LnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9PT0gJ251bWJlcidcbiAgICAgID8gZW50cnlwb2ludENyZWF0ZWRBdCAtIG9wdGlvbnMucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpbnZvY2F0aW9uQ291bnQgKz0gMTtcbiAgICBjb25zdCBoYW5kbGVyQ2FjaGVkID0gY2FjaGVkSGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ1NFUlZFUicpO1xuXG4gICAgcmV0dXJuIHRyYWNlKFxuICAgICAgJ3dvcmtmbG93LnJvdXRlLmZsb3cnLFxuICAgICAge1xuICAgICAgICBraW5kOiBzcGFuS2luZCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlVHlwZSgnZmxvdycpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSGFuZGxlckNhY2hlZChoYW5kbGVyQ2FjaGVkKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUludm9jYXRpb25Db3VudChpbnZvY2F0aW9uQ291bnQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlRW50cnlwb2ludEFnZU1zKFxuICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGVudHJ5cG9pbnRDcmVhdGVkQXRcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLihyb3V0ZU1vZHVsZUJvZHlJbml0TXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgOiBBdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlJbml0TXMocm91dGVNb2R1bGVCb2R5SW5pdE1zKSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSZXF1ZXN0TWV0aG9kKHJlcS5tZXRob2QpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUm91dGUoJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9mbG93JyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgaWYgKCFjYWNoZWRIYW5kbGVyKSB7XG4gICAgICAgICAgY2FjaGVkSGFuZGxlciA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5pbml0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ybGRIYW5kbGVycyA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAgICAgICAnd29ya2Zsb3cucm91dGUuZ2V0X3dvcmxkX2hhbmRsZXJzJyxcbiAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gZ2V0V29ybGRIYW5kbGVycygpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIod29ybGRIYW5kbGVycyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNhY2hlZEhhbmRsZXIocmVxKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgQXR0cmlidXRlLkh0dHBSZXNwb25zZVN0YXR1c0NvZGUocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl19
|
|
1682
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsbUJBQW1CLEdBQ3BCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxFQUNqQywyQkFBMkIsR0FHNUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixvQkFBb0IsR0FDckIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQiw2QkFBNkIsRUFDN0IsY0FBYyxHQUNmLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixvQkFBb0IsRUFDcEIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLFlBQVksRUFDWixlQUFlLEdBQ2hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixZQUFZLEdBQ2Is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YUFDeEQ7U0FDRixFQUNELEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFO29CQUM1RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FDL0IsbUNBQW1DLEVBQ25DLEtBQUssSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FDL0IsQ0FBQztvQkFDRixPQUFPLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsSUFBSSxRQUFRLFlBQVksUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksRUFBRSxhQUFhLENBQ2pCLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ2xELENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBDb3JydXB0ZWRFdmVudExvZ0Vycm9yLFxuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgc2V0V29ya2Zsb3dCYXNlUGF0aCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQge1xuICBwYXJzZVdvcmtmbG93TmFtZSxcbiAgd29ya2Zsb3dEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJ1bkVycm9yLFxuICBpc1JldHJ5YWJsZVdvcmxkRXJyb3IsXG4gIGlzV29ybGRDb250cmFjdEVycm9yLFxufSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGRlc2NyaWJlRXJyb3IgfSBmcm9tICcuL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMsXG4gIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzLFxuICBpc1R1cmJvRW5hYmxlZCxcbn0gZnJvbSAnLi9ydW50aW1lL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBsb2FkV29ya2Zsb3dSdW5FdmVudHMsXG4gIG1lbW9pemVFbmNyeXB0aW9uS2V5LFxuICBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZCxcbiAgcXVldWVNZXNzYWdlLFxuICB3aXRoSGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCxcbiAgUmVwbGF5QnVkZ2V0LFxufSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LWJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBydW5JZENyZWF0ZWRBdCB9IGZyb20gJy4vcnVudGltZS9ydW4taWQtdGltZS5qcyc7XG5pbXBvcnQgeyBleGVjdXRlU3RlcCB9IGZyb20gJy4vcnVudGltZS9zdGVwLWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nIH0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtbGF0ZW5jeS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVTdXNwZW5zaW9uIH0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyBnZXRXYWl0Q29udGludWF0aW9uRGlzcGF0Y2ggfSBmcm9tICcuL3J1bnRpbWUvd2FpdC1jb250aW51YXRpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHR5cGUgV29ybGRIYW5kbGVycyxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcbmltcG9ydCB7IGRlaHlkcmF0ZVJ1bkVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHJlbWFwRXJyb3JTdGFjayB9IGZyb20gJy4vc291cmNlLW1hcC5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVTdGVwSHlkcmF0aW9uQ2FjaGUsXG4gIHR5cGUgU3RlcEh5ZHJhdGlvbkNhY2hlLFxufSBmcm9tICcuL3N0ZXAtaHlkcmF0aW9uLWNhY2hlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQge1xuICBidWlsZEludm9jYXRpb25TcGFuTGlua3MsXG4gIGdldE5leHRUcmFjZUNhcnJpZXIsXG4gIGdldFNwYW5LaW5kLFxuICBnZXRXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaXNVc2FibGVUcmFjZUNhcnJpZXIsXG4gIHRyYWNlLFxuICB3aXRoVHJhY2VDb250ZXh0LFxuICB3aXRoV29ya2Zsb3dCYWdnYWdlLFxufSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRFcnJvck5hbWUsIGdldEVycm9yU3RhY2ssIG5vcm1hbGl6ZVVua25vd25FcnJvciB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRXb3JrZmxvd1N1c3BlbnNpb25NZXNzYWdlIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IHJ1bldvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH07XG5leHBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5leHBvcnQge1xuICB0eXBlIEhlYWx0aENoZWNrRW5kcG9pbnQsXG4gIHR5cGUgSGVhbHRoQ2hlY2tPcHRpb25zLFxuICB0eXBlIEhlYWx0aENoZWNrUmVzdWx0LFxuICBoZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9ydW50aW1lL2hlbHBlcnMuanMnO1xuZXhwb3J0IHtcbiAgZ2V0SG9va0J5VG9rZW4sXG4gIHJlc3VtZUhvb2ssXG4gIHJlc3VtZVdlYmhvb2ssXG59IGZyb20gJy4vcnVudGltZS9yZXN1bWUtaG9vay5qcyc7XG5leHBvcnQge1xuICBnZXRSdW4sXG4gIFJ1bixcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxufSBmcm9tICcuL3J1bnRpbWUvcnVuLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQ2FuY2VsUnVuT3B0aW9ucyxcbiAgY2FuY2VsUnVuLFxuICBsaXN0U3RyZWFtcyxcbiAgdHlwZSBSZWFkU3RyZWFtT3B0aW9ucyxcbiAgdHlwZSBSZWNyZWF0ZVJ1bk9wdGlvbnMsXG4gIHJlYWRTdHJlYW0sXG4gIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nLFxuICByZWVucXVldWVSdW4sXG4gIHR5cGUgU3RvcFNsZWVwT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBSZXN1bHQsXG4gIHdha2VVcFJ1bixcbn0gZnJvbSAnLi9ydW50aW1lL3J1bnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBTdGFydE9wdGlvbnMsXG4gIHR5cGUgU3RhcnRPcHRpb25zQmFzZSxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQsXG4gIHN0YXJ0LFxufSBmcm9tICcuL3J1bnRpbWUvc3RhcnQuanMnO1xuLy8gVjI6IHN0ZXBFbnRyeXBvaW50IGlzIG5vIGxvbmdlciByZS1leHBvcnRlZCDigJQgdGhlIGNvbWJpbmVkIGhhbmRsZXJcbi8vICh3b3JrZmxvd0VudHJ5cG9pbnQpIGV4ZWN1dGVzIHN0ZXBzIGlubGluZS4gUmVtb3ZpbmcgdGhlIHJlLWV4cG9ydFxuLy8gcHJldmVudHMgVHVyYm9wYWNrIGZyb20gdHJhY2luZyBzdGVwLWhhbmRsZXIuanMg4oaSIGdldC1wb3J0LmpzXG4vLyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMgaW50byB0aGUgZmxvdyByb3V0ZSBidW5kbGUuXG5leHBvcnQge1xuICBjcmVhdGVXb3JsZCxcbiAgY3JlYXRlV29ybGRGcm9tTW9kdWxlLFxuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgc2V0V29ybGQsXG4gIHR5cGUgV29ybGRGYWN0b3J5TW9kdWxlLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycjogdW5rbm93bik6IFJ1bkVycm9yQ29kZSB8IG51bGwge1xuICBpZiAoV29ya2Zsb3dSdW50aW1lRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUjtcbiAgfVxuXG4gIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gVGVybWluYWwgcnVuIGV2ZW50cyBhcmUgYWx3YXlzIGxhc3QgYnkgY29uc3RydWN0aW9uIChubyBldmVudCBjcmVhdGlvblxuICAvLyBzdWNjZWVkcyBhZ2FpbnN0IGEgdGVybWluYWwgcnVuKSwgYnV0IHNjYW4gdGhlIGZ1bGwgYXJyYXkgZm9yXG4gIC8vIGRlZmVuc2UtaW4tZGVwdGg6IGEgV29ybGQvYmFja2VuZCBvcmRlcmluZyBidWcgc2hvdWxkbid0IG1ha2UgdXMgbWlzcyBhblxuICAvLyBhY3R1YWwgdGVybWluYXRpb24gc2lnbmFsLlxuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGUpID0+XG4gICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICApO1xuXG4gIGlmICghdGVybWluYWxSdW5FdmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1J1biByZWFjaGVkIHRlcm1pbmFsIGV2ZW50LCBleGl0aW5nJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGV2ZW50VHlwZTogdGVybWluYWxSdW5FdmVudC5ldmVudFR5cGUsXG4gICAgZXZlbnRJZDogdGVybWluYWxSdW5FdmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcnVuIGhhcyBhbnkgaG9vayBvciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5IOKAlCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFRoaXMgZ2F0ZXMgdGhlIGlubGluZS1kZWx0YSBmYXN0IHBhdGguIFRoZSBkZWx0YSByZXR1cm5lZCBieSB0aGVcbiAqIHN0ZXAtdGVybWluYWwgd3JpdGUgaXMgdGhlIGV2ZW50IGxvZyBhcyBvZiB0aGF0IHdyaXRlOyBpdCBpcyBjb25zdW1lZFxuICogb24gdGhlIE5FWFQgbG9vcCBpdGVyYXRpb24sIHNvIGFueSBldmVudCBhIGNvbmN1cnJlbnQgd3JpdGVyIGFwcGVuZHMgaW5cbiAqIHRoYXQgd2luZG93IHdvdWxkIGJlIHByZXNlbnQgaW4gYSByZWFsIGBldmVudHMubGlzdGAgZmV0Y2ggYnV0IGFic2VudFxuICogZnJvbSB0aGUgc3RhbGUgZGVsdGEuIE1pc3Npbmcgc3VjaCBhbiBldmVudCBmb3Igb25lIHJlcGxheSBjYW4gZHVyYWJseVxuICogY29tbWl0IGEgc2NoZWR1bGluZyBkZWNpc2lvbiAoZS5nLiBpbmxpbmUtZXhlY3V0aW5nIHRoZSBsb3NlciBvZiBhXG4gKiBgUHJvbWlzZS5yYWNlKFtob29rLCBzdGVwXSlgKSB0aGF0IHRoZSBldmVudHVhbCBmdWxsIHJlcGxheSBjYW5ub3RcbiAqIGNvbnN1bWUg4oCUIGEgYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuIFdoZW4gbm8gaG9vayBvciB3YWl0IGlzIG9wZW4sIHRoZVxuICogb25seSBvdXQtb2YtYmFuZCB3cml0ZXIgaXMgY2FuY2VsbGF0aW9uLCB3aGljaCBpcyBiZW5pZ24gdG8gb2JzZXJ2ZSBvbmVcbiAqIGl0ZXJhdGlvbiBsYXRlICh0aGUgbmV4dCBlbnRpdHkgd3JpdGUgaXMgcmVqZWN0ZWQgYWdhaW5zdCB0aGUgdGVybWluYWxcbiAqIHJ1biBhbmQgdGhlIHJ1biBpcyBhbHJlYWR5IHRlcm1pbmFsKSwgc28gdGhlIGZhc3QgcGF0aCBpcyBzYWZlLlxuICpcbiAqIFN0ZXAtYm9keSBgYXR0cl9zZXRgIHdyaXRlcyBhcmUgTk9UIGEgY29uY2VybjogdGhleSBsYW5kIGJlZm9yZSB0aGVcbiAqIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSBhbmQgYXJlIHRoZXJlZm9yZSBhbHJlYWR5IGluc2lkZSB0aGUgcmV0dXJuZWRcbiAqIGRlbHRhLlxuICovXG5mdW5jdGlvbiBoYXNPcGVuSG9va09yV2FpdChldmVudHM6IEV2ZW50W10pOiBib29sZWFuIHtcbiAgY29uc3QgZGlzcG9zZWRIb29rSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSBkaXNwb3NlZEhvb2tJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgZWxzZSBpZiAoZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgIGNvbXBsZXRlZFdhaXRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICFkaXNwb3NlZEhvb2tJZHMuaGFzKGUuY29ycmVsYXRpb25JZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiZcbiAgICAgICFjb21wbGV0ZWRXYWl0SWRzLmhhcyhlLmNvcnJlbGF0aW9uSWQpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgcm91dGUgd2hpY2ggaGFuZGxlcyB3b3JrZmxvdyBleGVjdXRpb24gcmVxdWVzdHMsXG4gKiBleGVjdXRpbmcgc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUgdG8gcmVkdWNlIGZ1bmN0aW9uIGludm9jYXRpb25zXG4gKiBhbmQgcXVldWUgb3ZlcmhlYWQuXG4gKlxuICogVGhlIGhhbmRsZXIgbG9vcHM6IHJlcGxheSB3b3JrZmxvdyDihpIgZXhlY3V0ZSBzdGVwIGlubGluZSDihpIgcmVwbGF5IOKGkiAuLi5cbiAqIHVudGlsIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMsIHRpbWVzIG91dCwgb3IgZW5jb3VudGVycyBub24tc3RlcCBzdXNwZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3dDb2RlIC0gVGhlIHdvcmtmbG93IGJ1bmRsZSBjb2RlIGNvbnRhaW5pbmcgYWxsIHdvcmtmbG93IGZ1bmN0aW9uc1xuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgVmVyY2VsIEFQSSByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dFbnRyeXBvaW50KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0PzogbnVtYmVyO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICB9XG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHNldFdvcmtmbG93QmFzZVBhdGgob3B0aW9ucz8uYmFzZVBhdGgpO1xuXG4gIGNvbnN0IE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVMgPVxuICAgIE51bWJlcihwcm9jZXNzLmVudi5XT1JLRkxPV19WMl9USU1FT1VUX01TKSB8fCAxMjBfMDAwO1xuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpO1xuICBjb25zdCB3b3JrZmxvd1ByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgbmFtZXNwYWNlKTtcblxuICBjb25zdCBoYW5kbGVyID0gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoXG4gICAgICB3b3JrZmxvd1ByZWZpeCxcbiAgICAgIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAgIC8vIFRoZSBzdHJlYW0gbmFtZSBpbmNsdWRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbklkIHRoYXQgbXVzdCBiZSBrbm93biBieSB0aGUgY2FsbGVyLlxuICAgICAgICBjb25zdCBoZWFsdGhDaGVjayA9IHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKG1lc3NhZ2VfKTtcbiAgICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgICAgYXdhaXQgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICAgICAgICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICAgICAgICAnd29ya2Zsb3cnLFxuICAgICAgICAgICAgd29ybGRIYW5kbGVycy5zcGVjVmVyc2lvblxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHRyYWNlQ2FycmllcjogaW5jb21pbmdUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgcmVxdWVzdGVkQXQsXG4gICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlLFxuICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICB9ID0gV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcbiAgICAgICAgLy8gYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyBhIHRyYWNlIGNhcnJpZXIsIGJ1dFxuICAgICAgICAvLyBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpcyByZWdpc3RlcmVkXG4gICAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlIOKAlCB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuXG4gICAgICAgIC8vIGFic2VudCBvbmUgc28gbGlua2VkIG1vZGUgZmFsbHMgYmFjayB0byBhIGZyZXNoIG9yaWdpbiBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZvcndhcmRpbmcgYSB1c2VsZXNzIGB7fWAgZm9yZXZlci5cbiAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgICAgPyBpbmNvbWluZ1RyYWNlQ2FycmllclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IG1ldGFkYXRhLnF1ZXVlTmFtZS5zbGljZSh3b3JrZmxvd1ByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgIC8vIC0tLSBNYXggZGVsaXZlcnkgY2hlY2sgLS0tXG4gICAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSB3b3JrZmxvd3MgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBydW4g4oCUIGF0dGFjaGVzIHJ1bklkL3dvcmtmbG93TmFtZSB0byBldmVyeVxuICAgICAgICAvLyBsb2cgbGluZSBhbmQgY2hpbGQgbG9nZ2VycyBiZWxvdywgc28gY2FsbGVycyBkb24ndCByZXBlYXQgaXQuXG4gICAgICAgIGNvbnN0IHJ1bkxvZ2dlciA9IHJ1bnRpbWVMb2dnZXIuZm9yUnVuKHJ1bklkLCB3b3JrZmxvd05hbWUpO1xuXG4gICAgICAgIGNvbnN0IG1heFF1ZXVlRGVsaXZlcmllcyA9IGdldE1heFF1ZXVlRGVsaXZlcmllcygpO1xuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IG1heFF1ZXVlRGVsaXZlcmllcykge1xuICAgICAgICAgIGNvbnN0IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERURcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBXb3JrZmxvdyBoYW5kbGVyIGV4Y2VlZGVkIG1heCBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICBlcnJvckNvZGU6IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5lcnJvckNvZGUsXG4gICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uIOKAlFxuICAgICAgICAvLyByb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzIOKAlCBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJRcbiAgICAgICAgLy8gc2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIC0tLSBSZXBsYXkgYnVkZ2V0IGJvb2trZWVwaW5nIC0tLVxuICAgICAgICAvLyBUaGUgcmVwbGF5IGJ1ZGdldCBib3VuZHMgdGhlICpub24tc3RlcCogcG9ydGlvbiBvZiBhIHNpbmdsZVxuICAgICAgICAvLyBoYW5kbGVyIGludm9jYXRpb246IGRldGVybWluaXN0aWMgZXZlbnQtbG9nIHJlcGxheSwgd29ya2Zsb3ctVk1cbiAgICAgICAgLy8gZXhlY3V0aW9uIGJldHdlZW4gc3RlcCBib3VuZGFyaWVzLCBzdXNwZW5zaW9uIGhhbmRsaW5nLCBxdWV1ZVxuICAgICAgICAvLyByb3VuZC10cmlwcywgZXRjLiBJbmxpbmUgc3RlcCBib2RpZXMgKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9uc1xuICAgICAgICAvLyBpbnZva2VkIHZpYSBgZXhlY3V0ZVN0ZXBgKSBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZCDigJQgdGhleSBhcmVcbiAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBgbWF4RHVyYXRpb25gIGFuZCB0aGVcbiAgICAgICAgLy8gYE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNgIGVhcmx5LXJldHVybiBndWFyZCBiZWxvdy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGJ1ZGdldCBpcyBjaGVja2VkIGF0IGxvb3AgYm91bmRhcmllcyAodG9wIG9mIGVhY2ggYHdoaWxlYFxuICAgICAgICAvLyBpdGVyYXRpb24pLiBOb3RlIHRoaXMgaXMgKmxlc3MgcmVzcG9uc2l2ZSogdGhhbiB0aGUgb2xkXG4gICAgICAgIC8vIGBzZXRUaW1lb3V0YC1iYXNlZCBhcHByb2FjaDogYSBzaW5nbGUgcGF0aG9sb2dpY2FsIGBydW5Xb3JrZmxvd2BcbiAgICAgICAgLy8gY2FsbCBwcm9jZXNzaW5nIGEgaHVnZSBldmVudCBsb2cgY2FuIG92ZXJzaG9vdCB0aGUgYnVkZ2V0IGJ5IHVwXG4gICAgICAgIC8vIHRvIG9uZSBpdGVyYXRpb24gYmVmb3JlIGJhaWxpbmcuIEluIHByYWN0aWNlIHRoZSBoZWFkcm9vbSBidWlsdFxuICAgICAgICAvLyBpbnRvIGBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgIChhbmQgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAgICAgICAgLy8gU0lHVEVSTSBhcyB1bHRpbWF0ZSBiYWNrc3RvcCkgZ2l2ZXMgdXMgc2xhY2sg4oCUIHRoZSBwcmV2aW91c1xuICAgICAgICAvLyBgc2V0VGltZW91dGAgYXBwcm9hY2ggYWxzbyByZWxpZWQgb24gdGhlIHBsYXRmb3JtIGtpbGwgYXMgdGhlXG4gICAgICAgIC8vIGhhcmQgYmFja3N0b3AuIERvICpub3QqIFwiZml4XCIgdGhpcyBieSBhZGRpbmcgYSBgc2V0SW50ZXJ2YWxgO1xuICAgICAgICAvLyBpdCB3b3VsZCByaXNrIHRoZSBzYW1lIGJ1ZyB3ZSBqdXN0IHJlbW92ZWQgKGJvdW5kaW5nIHN0ZXBcbiAgICAgICAgLy8gYm9kaWVzKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRWFybGllciB2ZXJzaW9ucyAocHJlLSMyMDA5IGZpeCkgdXNlZCBhIHNpbmdsZSBgc2V0VGltZW91dGBcbiAgICAgICAgLy8gdGhhdCBhbHNvIGJvdW5kZWQgc3RlcCBib2RpZXMsIHdoaWNoIGJyb2tlIGFueSB3b3JrZmxvdyB3aXRoIGFcbiAgICAgICAgLy8gc2luZ2xlIHN0ZXAgbG9uZ2VyIHRoYW4gdGhlIGJ1ZGdldC5cbiAgICAgICAgY29uc3QgcmVwbGF5QnVkZ2V0ID0gbmV3IFJlcGxheUJ1ZGdldCgpO1xuXG4gICAgICAgIC8vIEluIGxpbmtlZCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgTk9UIHJlc3RvcmVkIGFzIHRoZVxuICAgICAgICAvLyBhY3RpdmUgKHBhcmVudCkgY29udGV4dCDigJQgcGFzc2luZyBgdW5kZWZpbmVkYCBtYWtlc1xuICAgICAgICAvLyB3aXRoVHJhY2VDb250ZXh0IGEgcGFzc3Rocm91Z2gsIHNvIHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3dcbiAgICAgICAgLy8gc3RheXMgYSBjaGlsZCBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQgYW5kIHRoZVxuICAgICAgICAvLyBydW4tb3JpZ2luIHRyYXZlbHMgYXMgYSBzcGFuIGxpbmsgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgcGFyZW50VHJhY2VDYXJyaWVyID1cbiAgICAgICAgICB0cmFjZU1vZGUgPT09ICdjb250aW51b3VzJyA/IHRyYWNlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gUXVldWUtZGVsaXZlcmVkIGludm9jYXRpb246IENPTlNVTUVSIGtpbmQsIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBxdWV1ZS1kZWxpdmVyZWQgc3RlcC5leGVjdXRlIHNwYW4uXG4gICAgICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ0NPTlNVTUVSJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHBhcmVudFRyYWNlQ2FycmllciwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB3aXRoV29ya2Zsb3dCYWdnYWdlKFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgd29ya2Zsb3dOYW1lIH0sXG4gICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZCcsIGFzeW5jICgpID0+XG4gICAgICAgICAgICAgICAgZ2V0V29ybGQoKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGxldCBsb29wSXRlcmF0aW9uID0gMDtcblxuICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgY2FjaGU6IGtlZXAgbG9hZGVkIGV2ZW50cyBpbiBtZW1vcnkgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucy5cbiAgICAgICAgICAgICAgICAgIC8vIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24gd2UgZG8gYSBmdWxsIGxvYWQ7IG9uIHN1YnNlcXVlbnQgaXRlcmF0aW9uc1xuICAgICAgICAgICAgICAgICAgLy8gd2UgZmV0Y2ggb25seSBldmVudHMgY3JlYXRlZCBhZnRlciB0aGUgbGFzdCBrbm93biBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICBsZXQgY2FjaGVkRXZlbnRzOiBFdmVudFtdIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICBsZXQgZXZlbnRzQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBjYWNoZSBvZiBoeWRyYXRlZCBzdGVwIHJldHVybiB2YWx1ZXMsIHNoYXJlZCBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHJlcGxheSBpdGVyYXRpb24gb2YgVEhJUyBpbnZvY2F0aW9uLiBFYWNoIGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gYnVpbGRzIGEgZnJlc2ggd29ya2Zsb3cgY29udGV4dCwgc28gdGhlIGNhY2hlIGlzIG93bmVkIGhlcmVcbiAgICAgICAgICAgICAgICAgIC8vIChvdXRzaWRlIHRoYXQgY29udGV4dCkgYW5kIHRocmVhZGVkIGludG8gcnVuV29ya2Zsb3cuIEl0XG4gICAgICAgICAgICAgICAgICAvLyB0dXJucyB0aGUgb3RoZXJ3aXNlIE8oTsKyKSByZS1kZWNyeXB0ICsgcmUtcGFyc2Ugb2YgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwIHJlc3VsdHMgYWNyb3NzIE4gcmVwbGF5cyBpbnRvIE8oTikuIFNjb3BlZCB0byB0aGlzIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gb25seSDigJQgbmV2ZXIgcmV1c2VkIGFjcm9zcyBydW5zLiBTZWUgc3RlcC1oeWRyYXRpb24tY2FjaGUudHMuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzdGVwSHlkcmF0aW9uQ2FjaGU6IFN0ZXBIeWRyYXRpb25DYWNoZSA9XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0ZXBIeWRyYXRpb25DYWNoZSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtZGVsdGEgb3B0aW1pemF0aW9uOiB3aGVuIGFuIGlubGluZSBzdGVwJ3MgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHJldHVybnMgdGhlIGV2ZW50LWxvZyBkZWx0YSBzaW5jZSB0aGUgcHJlLXdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBjdXJzb3IgKGEgc3VwcG9ydGluZyBXb3JsZCBvbmx5KSwgd2Ugc3Rhc2ggaXQgaGVyZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gY29uc3VtZXMgaXQgaW4gcGxhY2Ugb2YgdGhlIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCByb3VuZC10cmlwLiBFYWNoIHZhbHVlIGlzIGNvbnN1bWVkIGV4YWN0bHkgb25jZVxuICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gY2xlYXJlZC4gTnVsbCBtZWFucyBcIm5vIGRlbHRhIHBlbmRpbmcg4oCUIGZldGNoXG4gICAgICAgICAgICAgICAgICAvLyBub3JtYWxseVwiLiBTZWUgdGhlIGNvbnN1bWUgc2l0ZSBhdCB0aGUgdG9wIG9mIHRoZSBsb29wIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb2R1Y2Ugc2l0ZSBhZnRlciBpbmxpbmUgZXhlY3V0ZVN0ZXAuXG4gICAgICAgICAgICAgICAgICBsZXQgcGVuZGluZ0lubGluZURlbHRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50czogRXZlbnRbXTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgICAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgc3RhdGU6IHNldCBieSBlaXRoZXIgdGhlIGJhY2tncm91bmQgc3RlcCBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBvciB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93U3RhcnRlZEF0ID0gLTE7XG4gICAgICAgICAgICAgICAgICBsZXQgcHJlbG9hZGVkRXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZWxvYWRlZEV2ZW50c0N1cnNvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnkgKFRURlMpIHN0YXRlIOKAlCBzZWUgcnVudGltZS9zdGVwLWxhdGVuY3kudHMuXG4gICAgICAgICAgICAgICAgICAvLyBXaGV0aGVyIHRoaXMgaW52b2NhdGlvbidzIEZJUlNUIGV2ZW50IHNuYXBzaG90IGNvbnRhaW5lZFxuICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBiZXlvbmQgcnVuX2NyZWF0ZWQvcnVuX3N0YXJ0ZWQ6IGFueXRoaW5nIGVsc2Ugd2FzXG4gICAgICAgICAgICAgICAgICAvLyB3cml0dGVuIGJ5IGFuIGVhcmxpZXIgaW52b2NhdGlvbiwgd2hvc2UgY29udHJpYnV0aW9uIHRvXG4gICAgICAgICAgICAgICAgICAvLyB0aW1lLXRvLWZpcnN0LXN0ZXAgKGluY2x1ZGluZyB0aGUgcXVldWUgaG9wIGJhY2sgaGVyZSlcbiAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBiZSBtZWFzdXJlZCB3YWxsLWNsb2NrLCBzbyBUVEZTIGlzIG5vdCByZXBvcnRlZC5cbiAgICAgICAgICAgICAgICAgIC8vIFNldCBvbmNlLCBvbiB0aGUgZmlyc3QgaXRlcmF0aW9uJ3MgbG9hZGVkIHNuYXBzaG90LlxuICAgICAgICAgICAgICAgICAgbGV0IGludm9jYXRpb25TdGFydGVkQ2xlYW46IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBXYWxsLWNsb2NrIG1zIHNwZW50IGNvbW1pdHRpbmcgaG9va19jcmVhdGVkIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzdGVwIHJhbiwgYWNjdW11bGF0ZWQgYWNyb3NzIHN1c3BlbnNpb24gcGFzc2VzXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgc3VidHJhY3RlZCBmcm9tIFRURlMuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlU3RlcEJsb2NraW5nTXMgPSAwO1xuICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3Qgb2YgdGhlIGFjY3VtdWxhdG9yIGFzIG9mIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyb3RlIHRoZSBydW4ncyBmaXJzdCBhdHRyX3NldCAod2hvc2UgaG9vayBwaGFzZSByYW5cbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdHMgYXR0ciB3cml0ZXMpLiBXaGVuIGEgcHJlLXN0ZXAgc2V0QXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgLy8gZW5kcyB0aGUgVFRGUyBtZWFzdXJlbWVudCBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rXG4gICAgICAgICAgICAgICAgICAvLyB0aW1lIGZyb20gQkVGT1JFIHRoYXQgcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHdyaXRlcyBmYWxsIG91dHNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmYXN0LXBhdGhzIHRoZSB2ZXJ5IGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSB2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBmaXJzdCBpbnZvY2F0aW9uLCB3aGVyZSBpdCBpcyBwcm92YWJseSBzYWZlIHRvOiBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgLCBza2lwIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhc1xuICAgICAgICAgICAgICAgICAgLy8gYmVlbiB3cml0dGVuIHlldCksIGFuZCBmb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCAobm9cbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcGVlciBoYW5kbGVyIGV4aXN0cyB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0pLlxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bklucHV0YCBpcyBvbmx5IHByZXNlbnQgb24gdGhlIHN0YXJ0KCktZW5xdWV1ZWQgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBgYXR0ZW1wdCA9PT0gMWAgKDEtYmFzZWQpIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeTsgYGluY29taW5nU3RlcElkYCB3b3VsZCBtYXJrIGEgYmFja2dyb3VuZC1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGFuZCBgcmVwbGF5RGl2ZXJnZW5jZWAgYSByZWNvdmVyeSByZXBsYXkg4oCUIGJvdGhcbiAgICAgICAgICAgICAgICAgIC8vIGluZWxpZ2libGUuIFRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlcyBmb3JjZWRcbiAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBlbmRzIG9uY2UgYSBob29rIG9yIHdhaXQgaXMgY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgaW50cm9kdWNlIHJlc3VtZSBpbnZvY2F0aW9ucyksIHNvIHR1cmJvIGV4aXRzIGF0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHBvaW50IChzZWUgYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCkuIFdvcmtmbG93IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGludHJvZHVjZSBubyBzdWNoIGludm9jYXRpb24gc291cmNlIOKAlCB0aGV5IHJlc29sdmVcbiAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbiBpbi1wcm9jZXNzIHJlcGxheSBhbmQgZG9uJ3QgZW5kIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgY29uc3QgdHVyYm8gPVxuICAgICAgICAgICAgICAgICAgICBpc1R1cmJvRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXBsYXlEaXZlcmdlbmNlO1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuV29ya2Zsb3dUdXJibyh0dXJibykpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkIChvciByZWplY3RzIGlmIGl0IGZhaWxlZCkuIFRocmVhZGVkXG4gICAgICAgICAgICAgICAgICAvLyBpbnRvIGhhbmRsZVN1c3BlbnNpb24gYW5kIGV4ZWN1dGVTdGVwIHNvIG5vIHN0ZXAvaG9vay93YWl0XG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByYWNlcyBhaGVhZCBvZiB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAvLyB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blJlYWR5QmFycmllcjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gT3JkZXIgYSB0ZXJtaW5hbCBydW4gd3JpdGUgKHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkKSBhZnRlclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBpbiB0dXJibyBtb2RlIOKAlCBhIG5vLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBvdGhlcndpc2UgcmVhY2ggcnVuX2NvbXBsZXRlZCBiZWZvcmUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLiBCZXN0LWVmZm9ydDogYSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBvcmRlcmluZyBvbmx5OyBpZiBydW5fc3RhcnRlZCB0cnVseSBmYWlsZWQgdGhlIHRlcm1pbmFsIHdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycy4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0UnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSDigJQgc2VlIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSBvcmNoZXN0cmF0b3IuIE91dHNpZGUgdHVyYm8gdGhpcyByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCwgd2hpY2ggbWFrZXMgdGhlIHF1ZXVlIHJlc2NoZWR1bGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIGRlbGl2ZXJ5J3MgbWVzc2FnZS4gSW4gdHVyYm8gdGhhdCBpcyBhIHRyYXA6IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCwgYW5kIG9uIGFzeW5jIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gZ3JhcGhpbGUtd29ya2VyKSBhIHJlc2NoZWR1bGUgY29tZXMgYmFjayBhcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCAxIOKAlCBzbyB0dXJibyByZS1lbmdhZ2VzLCBza2lwcyB0aGUgZXZlbnQtbG9nIGxvYWRcbiAgICAgICAgICAgICAgICAgIC8vIGFnYWluLCByZXBsYXlzIGFnYWluc3QgYW4gZW1wdHkgbG9nLCBuZXZlciBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZSA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIHN0ZXBJZCwgdGhpcyBpcyBhIGJhY2tncm91bmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBFeGVjdXRlIHRoZSBzdGVwLCB0aGVuIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmF0Y2ggYXJlIGRvbmUuIElmIHNvLCByZXBsYXkgaW5saW5lIChzYXZpbmcgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwKS4gSWYgbm90LCByZXR1cm4g4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGljayB1cCB0aGUgcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgaWYgKGluY29taW5nU3RlcElkICYmIGluY29taW5nU3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1J1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgc3RhdHVzOiBiZ1J1bi5zdGF0dXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdTdGFydGVkQXQgPSBiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gK2JnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0IHdoaWxlIHRoZSBzdGVwIGJvZHkgcnVucyDigJRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhEdXJhdGlvbiwgbm90IGJ5IHRoZSByZXBsYXkgdGltZW91dC4gU2VlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGxheUJ1ZGdldCBkb2NzIGZvciB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+PjtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVTdGVwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogYmdSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBiZ1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNwZWNWZXJzaW9uOiBiZ1J1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBzdGVwUmVzdWx0LnRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHN0ZXAgaGFkIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzKSwgYnJlYWsgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRVbnRpbCBmbHVzaCB0aGVtIOKAlCBjYW4ndCBjb250aW51ZSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC5oYXNQZW5kaW5nT3BzXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0LnR5cGUgPT09ICdza2lwcGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBldmVudHMgdG8gY2hlY2sgaWYgYWxsIHBhcmFsbGVsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGN1cnNvci1iYXNlZCBsb2FkaW5nIHNvIHRoZSBtYWluIGxvb3AgY2FuIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbGx5IGZyb20gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlbmRpbmcgc3RlcHM6IGFueSBzdGVwX2NyZWF0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBtYXRjaGluZyBzdGVwX2NvbXBsZXRlZCBvciBzdGVwX2ZhaWxlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwVGVybWluYWxJZHMgPSBuZXcgU2V0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBjYWNoZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBDcmVhdGVkSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFRlcm1pbmFsSWRzLmFkZChlLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzUGVuZGluZ1N0ZXBzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQZW5kaW5nU3RlcHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQZW5kaW5nU3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXIgc3RlcHMgc3RpbGwgaW4gcHJvZ3Jlc3MuIFJldHVybiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVpbmcg4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGUgd2lsbCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGRvbmUgYW5kIHJlcGxheSBpbmxpbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nLCByZXR1cm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCBzdGVwcyBkb25lIOKAlCBmYWxsIHRocm91Z2ggdG8gdGhlIG1haW4gcmVwbGF5IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgc2hhcmVkIHN0YXRlIHNvIHRoZSBsb29wIGNhbiBjb250aW51ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdBbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSwgcmVwbGF5aW5nIGlubGluZSBhZnRlciBiYWNrZ3JvdW5kIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1biA9IGJnUnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSBiZ1N0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyBhbmQgZXZlbnRzQ3Vyc29yIGFscmVhZHkgc2V0IGZyb20gbG9hZCBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnZXRXb3JrZmxvd1NldHVwRXJyb3JDb2RlKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAnRmF0YWwgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIGJhY2tncm91bmQgd29ya2Zsb3cgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogcHJlcGFyZSB0aGUgcnVuIHN0YXRlIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiB3b3JrZmxvd1J1biB3YXMgYWxyZWFkeSBzZXQgYnkgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCAoaW5saW5lIHJlcGxheSBhZnRlciBhbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSkuXG4gICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIHJ1bl9zdGFydGVkIGRpcmVjdGx5IOKAlCB0aGlzIGJvdGggdHJhbnNpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB0byAncnVubmluZycgQU5EIHJldHVybnMgdGhlIHJ1biBlbnRpdHksIHNhdmluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHNlcGFyYXRlIHJ1bnMuZ2V0IHJvdW5kLXRyaXAuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyYWN0OiBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpIG11c3QgYmUgaWRlbXBvdGVudFxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcnVucyBhbHJlYWR5IGluICdydW5uaW5nJyBzdGF0dXMgKHJldHVybiB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgZXJyb3IpLCBub3QganVzdCBmb3IgcGVuZGluZyDihpIgcnVubmluZyB0cmFuc2l0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9zdGFydGVkJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHNwZWMgdmVyc2lvbiBmcm9tIHRoZSBvcmlnaW5hbCBzdGFydCgpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGF2YWlsYWJsZSwgc28gdGhlIHJlc2lsaWVudCBzdGFydCBwYXRoIGNyZWF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcnVuIHdpdGggdGhlIGNvcnJlY3QgdmVyc2lvbiAobm90IGFsd2F5cyBjdXJyZW50KS5cbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0Py5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHJ1biBpbnB1dCBmcm9tIHF1ZXVlIHNvIHRoZSBzZXJ2ZXIgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBydW4gaWYgcnVuX2NyZWF0ZWQgd2FzIG1pc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVaW50OEFycmF5IHZhbHVlcyBzdXJ2aXZlIHRoZSBxdWV1ZSBuYXRpdmVseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIChDQk9SIG9uIHdvcmxkLXZlcmNlbCwgSlNPTiByZXZpdmVyIG9uIHdvcmxkLWxvY2FsKS5cbiAgICAgICAgICAgICAgICAgICAgICAuLi4ocnVuSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0LmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgc2tpcFByZWxvYWQ6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ydW5fc3RhcnRlZC5za2lwX3ByZWxvYWQnOiBza2lwUHJlbG9hZCxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHVyYm8gJiYgcnVuSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYmFja2dyb3VuZCBgcnVuX3N0YXJ0ZWRgIGFuZCBzeW50aGVzaXplIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpdHkgbG9jYWxseSBzbyByZXBsYXkgY2FuIGJlZ2luIHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcm91bmQtdHJpcC4gU2FmZSBoZXJlIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiDigJQgc3RhcnQoKSBjcmVhdGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBtb21lbnRzIGFnbyBhbmQgbm8gZXZlbnRzIGhhdmUgYmVlbiB3cml0dGVuIHlldC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllciBpcyBjb25zdW1lZCBieSBldmVyeSBkb3duc3RyZWFtIHdyaXRlIChzdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciwgb3B0aW1pc3RpYyBzdGVwX3N0YXJ0ZWQsIHRlcm1pbmFsIHJ1biB3cml0ZXMpIHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRlZFByb21pc2UgPSB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBiYWNrZ3JvdW5kIHRoaXMgcHVyZWx5IGFzIGEgd3JpdGUgYmFycmllciBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlYWQgaXRzIHByZWxvYWRlZCBldmVudHMgKHByZWxvYWRlZEV2ZW50cyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2VkIHRvIFtdIGJlbG93KSwgc28gdGVsbCB0aGUgV29ybGQgdG8gc2tpcCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIGV2ZW50LWxvZyBwcmVsb2FkLiBUaGF0IHRyaW1zIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgcmVxdWVzdCB0aGUgY2hhaW5lZCBmaXJzdCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXRzIG9uIOKAlCBzaG9ydGVuaW5nIHRpbWUtdG8tc2Vjb25kLXN0ZXAg4oCUIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhc3RlZCBsaXN0K3Jlc29sdmUgaXQgd291bGQgb3RoZXJ3aXNlIGNvbXB1dGUuXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCwgc2tpcFByZWxvYWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyID0gc3RhcnRlZFByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIGEgbm8tb3AgcmVqZWN0aW9uIGhhbmRsZXIgc28gYW4gZWFybHkgZmFpbHVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHN1cmZhY2VzIGFzIGFuIHVuaGFuZGxlZFJlamVjdGlvbiBiZWZvcmUgYSBjb25zdW1lclxuICAgICAgICAgICAgICAgICAgICAgIC8vIChhd2FpdC90aGVuKSBpcyBhdHRhY2hlZDsgY29uc3VtZXJzIHN0aWxsIG9ic2VydmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZFByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGluaXRpYWwgZXZlbnRzLmxpc3Q6IG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB0b1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgeWV0IG9uIGEgZmlyc3QgZGVsaXZlcnkgKHJ1bl9zdGFydGVkIGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0KS4gQW4gZW1wdHkgcHJlbG9hZGVkIHNldCByb3V0ZXMgaXRlcmF0aW9uIDEgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuby1sb2FkIHByZWxvYWRlZCBicmFuY2g7IGl0ZXJhdGlvbiAyIHRoZW4gdGFrZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcG9zdC1wcmVsb2FkZWQgZnVsbCByZWxvYWQgdG8gcGljayB1cCBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgIC8vIChubyBzcHVyaW91cyBcImN1cnNvciBtaXNzaW5nXCIgd2FybmluZykuIGBbXWAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IHRydXRoeSBoZXJlIOKAlCBkbyBub3QgY2hhbmdlIHRoZSBsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYnJhbmNoZXMnIGBpZiAocHJlbG9hZGVkRXZlbnRzKWAgY2hlY2tzIHRvIHRlc3QgbGVuZ3RoLlxuICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRlZEV2ZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW5JbnB1dC5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVkIGF0dHJpYnV0ZXMgZnJvbSBzdGFydCgpIHJpZGUgYWxvbmcgaW4gYHJ1bklucHV0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgbGl2ZSBpbiBgcnVuX2NyZWF0ZWRgJ3MgZXZlbnREYXRhLCBub3Qgc2VwYXJhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBhdHRyX3NldGAgZXZlbnRzKSwgc28gdGhlIHN5bnRoZXNpemVkIHNuYXBzaG90IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gZXZlbiB0aG91Z2ggd2Ugc2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCBPTkxZIHdoaWxlIGF0dHJpYnV0ZXMgYXJlIHdyaXRlLW9ubHk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBpbi13b3JrZmxvdyByZWFkIEFQSSB0b2RheSAoc2VlIHdvcmtmbG93LnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkXCIpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByZWxvYWRlZCBsb2cgY2FuJ3QgZGl2ZXJnZSBvbiBhIHJlYWQuIElmIGEgcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIGlzIGV2ZXIgYWRkZWQgaXQgTVVTVCByZWFkIGZyb20gdGhpcyBzbmFwc2hvdCwgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSByZXBsYXlpbmcgcnVuX2NyZWF0ZWQvYXR0cl9zZXQgZXZlbnRzIOKAlCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvJ3MgZW1wdHkgaW5pdGlhbCBsb2cgd291bGQgc3VyZmFjZSBzZWVkIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGB7fWAgb24gdGhlIGZpcnN0IGRlbGl2ZXJ5IG9ubHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdydW5uaW5nJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSdW5TdGFydGVkQ3JlYXRlU3RhcnQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LnJ1bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGNyZWF0aW9uIGZvciAncnVuX3N0YXJ0ZWQnIGRpZCBub3QgcmV0dXJuIHRoZSBydW4gZW50aXR5IGZvciBydW4gXCIke3J1bklkfVwiYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2UgaW5jbHVkZXMgZXZlbnRzLCB1c2UgdGhlbSB0byBza2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5pdGlhbCBldmVudHMubGlzdCBjYWxsIGFuZCByZWR1Y2UgVFRGQi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhhc01vcmUgIT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHMgPSByZXN1bHQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDdXJzb3IgPSByZXN1bHQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdvcmtmbG93UnVuLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHdhcyBjb25jdXJyZW50bHkgY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvcjogcnVuIHdhcyBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkL2ZhaWxlZC9jYW5jZWxsZWQgZHVyaW5nIHNldHVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW5FeHBpcmVkRXJyb3I6IHJ1biBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBzZXR1cCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHdvcmtmbG93IHNldHVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCA9ICt3b3JrZmxvd1J1bi5zdGFydGVkQXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1J1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgaGFzIGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB3b3JrZmxvd1J1bi5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZvciBgY2FuY2VsYCwgd2UgYWN0dWFsbHkgd2FudCB0byBwcm9wYWdhdGUgYSBXb3JrZmxvd0NhbmNlbGxlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIHRoZSB3b3JrZmxvdyBjb250ZXh0IHNvIHRoZSB1c2VyIGNhbiBncmFjZWZ1bGx5IGV4aXQuIHRoaXMgaXMgU0lHVEVSTVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZnVydGhlcm1vcmUsIHRoZXJlIHNob3VsZCBiZSBhIHRpbWVvdXQgb3IgYSB3YXkgdG8gZm9yY2UgY2FuY2VsIFNJR0tJTExcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgYWN0dWFsbHkgZXhpdCBoZXJlIHdpdGhvdXQgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBhdCBhbGwsIGluIHRoZSBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBpcyBpdHNlbGYgZmFpbGluZy5cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSAobm9uLXR1cmJvIHJ1bl9zdGFydGVkKVxuICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWYgKCF3b3JrZmxvd1J1bilcblxuICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoaXMgcnVuJ3MgZGVwbG95bWVudC5cbiAgICAgICAgICAgICAgICAgIC8vIFVzZWQgZWFnZXJseSBoZXJlIHNpbmNlIGJvdGggcnVuV29ya2Zsb3cgKGlucHV0XG4gICAgICAgICAgICAgICAgICAvLyBoeWRyYXRpb24gLyBob29rIHBheWxvYWQgZGVjcnlwdGlvbikgYW5kIHRoZSBydW5fZmFpbGVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWh5ZHJhdGUgcGF0aCBiZWxvdyBuZWVkIGl0LiBNZW1vaXplZCBhY2Nlc3NvcjogZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIC8vIHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBNYWluIHJlcGxheSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy9ub0NvbnN0YW50Q29uZGl0aW9uOiBpbnRlbnRpb25hbCBsb29wXG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5LWJ1ZGdldCBjaGVjazogYmFpbCBvdXQgKHJldHJ5IG9yIGZhaWwpIGlmXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGVwIHRpbWUgd2l0aGluIHRoaXMgaW52b2NhdGlvbiBoYXMgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgYnVkZ2V0LiBTdGVwIGJvZGllcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSByZXBsYXlCdWRnZXQucGF1c2UoKS9yZXN1bWUoKSBicmFja2V0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBleGVjdXRlU3RlcGAgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxheUJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TXM6IHJlcGxheUJ1ZGdldC5jb25maWd1cmVkTGltaXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBWZXJjZWwsIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCBhbHdheXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGl0cyB0aGUgcHJvY2Vzcy4gT24gbG9jYWwgZGV2IGl0IHJldHVybnM7IHdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGFuZCB0aGUgcmVxdWVzdCBlbmRzIG5vcm1hbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHJ1bl9mYWlsZWQgaGFzIGJlZW4gd3JpdHRlbiBiZXN0LWVmZm9ydCkuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGltZW91dCBiZWZvcmUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSA+PVxuICAgICAgICAgICAgICAgICAgICAgIE5PX0lOTElORV9SRVBMQVlfQUZURVJfTVNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1YyIHRpbWVvdXQgcmVhY2hlZCwgcmUtc2NoZWR1bGluZyB3b3JrZmxvdycsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBpbnZvY2F0aW9uU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5U3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJzb3Igb2YgdGhpcyBpdGVyYXRpb24ncyBldmVudCBsb2cgYmVmb3JlIGFueSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGFkdmFuY2UgaXQg4oCUIGRlY2xhcmVkIGF0IHRyeSBzY29wZSBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBjYXRjaCAod2hpY2ggcnVucyB0aGUgaW5saW5lIHN0ZXApIGNhbiByZWFkIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBgc2luY2VDdXJzb3JgIGZvciB0aGUgaW5saW5lLWRlbHRhIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZUlubGluZVdyaXRlQ3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGV2ZW50cyDigJQgdXNlIGNhY2hlZCBldmVudHMgd2l0aCBpbmNyZW1lbnRhbCBmZXRjaCBvbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZlciBhbHdheXMgcmV0dXJucyBhIGN1cnNvciB3aGVuIHRoZXJlIGFyZSBldmVudHMgKGV2ZW4gb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWwgcGFnZSksIHNvIHdlIGNhbiByZWxpYWJseSB1c2UgaXQgZm9yIGluY3JlbWVudGFsIGxvYWRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50czogRXZlbnRbXTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGVuZGluZ0lubGluZURlbHRhICYmIGNhY2hlZEV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uJ3MgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHdyaXRlIHJldHVybmVkIHRoZSBhdXRob3JpdGF0aXZlIGV2ZW50LWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgc2luY2UgdGhlIHByZS13cml0ZSBjdXJzb3IsIHNvIHdlIGNvbnN1bWUgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlbHRhIGlzIGJ5dGUtZm9yLWJ5dGUgd2hhdCBldmVudHMubGlzdChjdXJzb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBoYXZlIHJldHVybmVkIGF0IHdyaXRlIHRpbWUg4oCUIGl0IGluY2x1ZGVzIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIncyBvd24gc3RlcCBldmVudHMsIGFueSBhdHRyX3NldCB0aGUgc3RlcCBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSwgYW5kIGFueSBpbi1iYW5kIGV2ZW50cyAoZS5nLiBob29rX3JlY2VpdmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yIOKAlCBzbyBza2lwcGluZyB0aGUgZmV0Y2ggY2Fubm90IGRyb3AgZXZlbnRzIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2V3IHRoZSBwcmVmaXggZnJvbSB0aGUgc2VydmVyJ3MgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBwZW5kaW5nSW5saW5lRGVsdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nSW5saW5lRGVsdGEgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhLmV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMubWFwKChlKSA9PiBlLmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBkZWx0YS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gZGVsdGEuY3Vyc29yID8/IGV2ZW50c0N1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhY2hlZEV2ZW50cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgaXRlcmF0aW9uOiB1c2UgcHJlbG9hZGVkIGV2ZW50cyBpZiBhdmFpbGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZG8gYSBmdWxsIGxvYWQgd2l0aCBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlbG9hZGVkRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IHByZWxvYWRlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gcHJlbG9hZGVkRXZlbnRzQ3Vyc29yID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3IgPSBsb2FkZWQuY3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJzZXF1ZW50IGl0ZXJhdGlvbjogZmV0Y2ggb25seSBuZXcgZXZlbnRzIHNpbmNlIGxhc3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWR1cGUgYnkgZXZlbnRJZDogYSBwcmV2aW91cyBpdGVyYXRpb24gbWF5IGhhdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZGVkIGEgcmVmcmVzaGVkIHdhaXQtY29tcGxldGlvbiBkZWx0YSBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxvb3Agb2JzZXJ2ZXMgdGhlIGFkdmFuY2VkIGN1cnNvciwgc28gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFsIGZldGNoIGNhbiByZXR1cm4gZXZlbnRzIHdlIGFscmVhZHkgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYWxseS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWQuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5tYXAoKGUpID0+IGUuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGxvYWRlZC5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhlLmV2ZW50SWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZS5ldmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50cy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVsb2FkZWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGlvbiAyIGFmdGVyIGl0ZXJhdGlvbiAxIHVzZWQgcHJlbG9hZGVkIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHdoaWNoIGRvbid0IGNhcnJ5IGEgY3Vyc29yKS4gRG8gYSBmdWxsIGxvYWQgbm93IHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIHVwIGFueSBldmVudHMgd3JpdHRlbiBzaW5jZSB0aGUgcHJlbG9hZGVkIHNldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9idGFpbiBhIGN1cnNvciBmb3Igc3Vic2VxdWVudCBpbmNyZW1lbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZHMuIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHBhdGgsIG5vdCBhIGJ1Zy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdObyBjdXJzb3IgYWZ0ZXIgcHJlbG9hZGVkLWV2ZW50cyBmaXJzdCBpdGVyYXRpb247IGRvaW5nIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgY3Vyc29yLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGNhY2hlZEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gY3Vyc29yIGF2YWlsYWJsZSBkZXNwaXRlIGhhdmluZyBjYWNoZWQgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gcHJlbG9hZGVkLWV2ZW50cyBleHBsYW5hdGlvbi4gQWxsIFdvcmxkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlcXVpcmVkIHRvIHJldHVybiBhIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgZXZlbnRzLCBzbyB0aGlzIHNpZ25hbHMgYSBidWcgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBXb3JsZC4gRmFsbCBiYWNrIHRvIGEgZnVsbCByZWxvYWQgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlIGRhdGEuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdFdmVudCBjdXJzb3IgbWlzc2luZyBhZnRlciBpbml0aWFsIGxvYWQg4oCUIGZhbGxpbmcgYmFjayB0byBmdWxsIHJlbG9hZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvbi4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRXZlbnRzID0gbG9hZGVkLmV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBjYWNoZWRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbmN1cnJlbnQgY29tcGxldGlvbiB2aWEgdGhlIGV2ZW50IGxvZzogaWZcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgaGFuZGxlciB3cm90ZSBhIHRlcm1pbmFsIHJ1biBldmVudCwgZXhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkb2luZyByZXBsYXkgd29yay4gVGhlIHJ1biBlbnRpdHkncyBzdGF0dXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gdGhlc2UgZXZlbnRzLCBzbyBjaGVja2luZyB0aGUgbG9nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlcyB1cyB0aGUgc2FtZSBzaWduYWwgYXMgYSBydW5zLmdldCgpIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBleHRyYSByZXF1ZXN0IHBlciBsb29wIGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgZWxhcHNlZCB3YWl0c1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRzVG9Db21wbGV0ZSA9IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTogZSBpcyBFeHRyYWN0PFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID4gJiB7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+PSAoZS5ldmVudERhdGEucmVzdW1lQXQgYXMgRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVBdDogZS5ldmVudERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdhaXRFdmVudCBvZiB3YWl0c1RvQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUocnVuSWQsIHdhaXRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYWl0IGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdHNUb0NvbXBsZXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IGlzIGNvbW1pdHRlZC4gTG9hZCBvbmx5IGV2ZW50cyBhZnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHNuYXBzaG90IGN1cnNvciBzbyBjb25jdXJyZW50IGR1cmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cywgc3VjaCBhcyBob29rX3JlY2VpdmVkLCBrZWVwIHRoZWlyIG9yZGVyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGl2ZSB0byB3YWl0X2NvbXBsZXRlZC4gRmFsbCBiYWNrIHRvIGEgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsb2FkIGZvciBvbGRlciB3b3JsZHMgdGhhdCBjYW5ub3QgZ2l2ZSB1cyBhIHN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3Vyc29yLCBvciBpZiB0aGUgY3Vyc29yIGRlbHRhIGRvZXMgbm90IGluY2x1ZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGNvbXBsZXRpb24gdGhpcyBoYW5kbGVyIGp1c3QgYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50c0N1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvciA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhd0FsbFdhaXRDb21wbGV0aW9ucyA9IHdhaXRzVG9Db21wbGV0ZS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2FpdEV2ZW50KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkV2FpdElkc0FmdGVyQ3Vyc29yLmhhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QWxsV2FpdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLm1hcCgoZSkgPT4gZS5ldmVudElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBsb2FkZWQuZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nSWRzLmhhcyhldmVudC5ldmVudElkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0lkcy5hZGQoZXZlbnQuZXZlbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQ3Vyc29yID0gbG9hZGVkLmN1cnNvciA/PyBldmVudHNDdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBsb2FkZWQuZXZlbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IGxvYWRlZC5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0N1cnNvciA9IGxvYWRlZC5jdXJzb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGluZyBlbGFwc2VkIHdhaXRzIHJlZnJlc2hlcyB0aGUgZXZlbnQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgbWF5IGhhdmUgd3JpdHRlbiB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYWZ0ZXIgdGhlIGluaXRpYWwgc25hcHNob3QgYnV0IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBPbmNlIHRoZSBldmVudCBsb2cgcmVjb3JkcyB0aGF0IG91dGNvbWUsIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBpcyBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY2FjaGUgcmVmZXJlbmNlIChtYXkgaGF2ZSBiZWVuIHNldCBmb3IgZmlyc3QgdGltZSlcbiAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRFdmVudHMgPSBldmVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeToganVkZ2UgVFRGUyBlbGlnaWJpbGl0eSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBmaXJzdCBzbmFwc2hvdC4gV2FpdHMgY29tcGxldGVkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYWxyZWFkeSBkaXNxdWFsaWZ5IHZpYSB0aGUgZXZlbnQtdHlwZSBjaGVjaywgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW5nIGFmdGVyIHRoZSB3YWl0IHBhc3MgaXMgZXF1aXZhbGVudC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyX3NldCBpcyBwZXJtaXR0ZWQ6IGEgcmVkZWxpdmVyeSBjYW4gbGFuZCBhZnRlciBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkIHByZS1zdGVwIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN1YnRyYWN0ZWQgdmlhIHByZVN0ZXBBdHRyU3RhcnRNcyByZWdhcmRsZXNzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW52b2NhdGlvbiB3cm90ZSBpdCAoc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID8/PSBldmVudHMuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCdcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3QgdGhlIGN1cnNvciBhcyBpdCBzdGFuZHMgZm9yIHRoaXMgaXRlcmF0aW9uJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBsb2csIGJlZm9yZSBhbnkgaW5saW5lIHdyaXRlcyAoc3RlcF9jcmVhdGVkIHZpYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZVN1c3BlbnNpb24sIHN0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZCB2aWFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRlU3RlcCkgYWR2YW5jZSBpdC4gVGhpcyBpcyB0aGUgYHNpbmNlQ3Vyc29yYFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRlZCB0byBhIHN1cHBvcnRpbmcgV29ybGQgb24gdGhlIGlubGluZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBzbyBpdCBjYW4gcmV0dXJuIHRoZSBldmVudC1sb2cgZGVsdGEg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGV0dGluZyB0aGUgbmV4dCBpdGVyYXRpb24gc2tpcCB0aGUgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdC4gQ2FwdHVyZWQgaGVyZSBiZWNhdXNlIG5vdGhpbmcgYmV0d2VlbiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgYW5kIHRoZSBpbmxpbmUgZXhlY3V0ZVN0ZXAgbXV0YXRlcyBldmVudHNDdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgcHJlSW5saW5lV3JpdGVDdXJzb3IgPSBldmVudHNDdXJzb3I7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXkgd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGFydGluZyB3b3JrZmxvdyByZXBsYXknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Xb3JrZmxvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBIeWRyYXRpb25DYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiB0aGUgZW5kLW9mLXJ1biBkcmFpbiBpbnNpZGUgcnVuV29ya2Zsb3cgY29tbWl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgIGV2ZW50cyBiZWZvcmUgdGhlIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgYXdhaXRSdW5SZWFkeSgpYCBiZWxvdywgc28gZ2F0ZSB0aG9zZSB3cml0ZXMgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgdG9vLiBVbmRlZmluZWQgb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgcmVwbGF5IGNvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZmxvdyBjb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGEgd29ya2Zsb3cgdGhhdCBmaW5pc2hlcyB3aXRoIG5vIHN0ZXBzIHJlYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQ7IG9yZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgYWZ0ZXIgaXQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgc3VzcGVuZGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TXM6IERhdGUubm93KCkgLSByZXBsYXlTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdXNwZW5zaW9uUmVzdWx0OiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBoYW5kbGVTdXNwZW5zaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQgPSBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3VzcGVuc2lvbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmF0YWxFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGZhaWx1cmVzIHByb3BhZ2F0ZSB0byB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIHNvIHRoZSBtZXNzYWdlIGlzIHJlZGVsaXZlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN1c3BlbnNpb25FcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb24tcmV0cnlhYmxlIGZhaWx1cmUgd2hpbGUgY29tbWl0dGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbidzIGV2ZW50cyDigJQgZS5nLiBhbiBhdHRyaWJ1dGUgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdvcmxkIHJlamVjdGVkIGFzIGludmFsaWQgKHRoZSBjdW11bGF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlci1ydW4gY2FwIGNhbiBvbmx5IGJlIGNoZWNrZWQgV29ybGQtc2lkZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZGVsaXZlcnkgd291bGQgcmVwbGF5IHRoZSB3b3JrZmxvdyBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHdyaXRlIGFuZCB0aGUgc2FtZSByZWplY3Rpb24sIHNvIGZhaWwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biB3aXRoIHRoZSBlcnJvciBpbnN0ZWFkIG9mIHdlZGdpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgaW4gcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcihzdXNwZW5zaW9uRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb24tcmV0cnlhYmxlIGVycm9yIHdoaWxlIGNvbW1pdHRpbmcgd29ya2Zsb3cgc3VzcGVuc2lvbjsgZmFpbGluZyBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdXNwZW5zaW9uRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3VzcGVuc2lvbkVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJ1bl9zdGFydGVkIHNvIHRoZSBydW4gZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JUeXBlKHN1c3BlbnNpb25FcnJvci5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ01zICs9IHN1c3BlbnNpb25SZXN1bHQuaG9va0NyZWF0aW9uTXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zID0gcHJlU3RlcEJsb2NraW5nTXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdXNwZW5zaW9uIGhhbmRsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uTXM6IERhdGUubm93KCkgLSBzdXNwZW5zaW9uU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwczogc3VzcGVuc2lvblJlc3VsdC5wZW5kaW5nU3RlcHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kczogc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dD8uc2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSG9va0NvbmZsaWN0OiBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tDb25mbGljdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXdhaXRlZEhvb2tDcmVhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F0dHJpYnV0ZUV2ZW50czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rIGNvbmZsaWN0OiBicmVhayBsb29wLCByZS1pbnZva2UgdmlhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgd29ya2Zsb3cgYXR0cmlidXRlIGV2ZW50cyBhcmUgcmVzb2x2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggcmVwbGF5OiB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbiByZWxvYWRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIChub3cgaG9sZGluZyB0aGUganVzdC1jb21taXR0ZWQgYXR0cl9zZXQpIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cywgcmVzb2x2aW5nIHRoZSBzZXRBdHRyaWJ1dGVzIHByb21pc2UuIFNraXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcHJvY2Vzc2luZyBmb3IgdGhpcyBwYXNzIHNvIHRoYXQgcmVwbGF5IGRlY2lkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhY2VzIGZpcnN0IOKAlCBpbiBQcm9taXNlLnJhY2UoW3NldEF0dHJpYnV0ZXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAoKV0pLCB0aGUgZHVyYWJsZSBhdHRyaWJ1dGUgZXZlbnQgbXVzdCBiZSBhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byB3aW4gd2l0aG91dCBleGVjdXRpbmcgdGhlIGxvc2luZyBzdGVwLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXBwZW5zIGluLXByb2Nlc3MgcmF0aGVyIHRoYW4gdmlhIGEgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWludm9jYXRpb246IHVubGlrZSBob29rcyBhbmQgd2FpdHMsIGFuIGF0dHJfc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRyb2R1Y2VzIG5vIG91dC1vZi1iYW5kIGludm9jYXRpb24gc291cmNlIHRoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIHdvdWxkIG5lZWQgdG8geWllbGQgdGhlIG1lc3NhZ2UgZm9yLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF5aW5nIGEgZGVsaXZlcnkgcm91bmQtdHJpcCBoZXJlIHdvdWxkIG9ubHkgYWRkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRlbmN5IGJlZm9yZSB0aGUgd29ya2Zsb3cncyBuZXh0IHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwcyA9IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgZXhlY3V0aW9uIGlzIGdhdGVkIG9uIG93bmVyc2hpcC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQgdGhlIHN0ZXBfY3JlYXRlZCB3cml0ZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIHRvIGBnZXRNYXhJbmxpbmVTdGVwcygpYCBzdGVwcyAoYGxhenlJbmxpbmVTdGVwc2ApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcnVuIHRoZW0gaW5saW5lIOKAlCBpbiBwYXJhbGxlbCDigJQgdmlhIGxhenlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyB0aGF0IGNyZWF0ZSBlYWNoIHN0ZXAgb24gdGhlIGZseSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmluZyBvbmUgd29ybGQgcm91bmQtdHJpcCBwZXIgaW5saW5lIHN0ZXAuIE93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgYXRvbWljIGFuZCBleGFjdGx5LW9uZSBwZXIgc3RlcDogdGhlIHdvcmxkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSBpbnNpZGUgZWFjaCBzdGVwX3N0YXJ0ZWQgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVudGl0eUNvbmZsaWN0RXJyb3JgICjihpIgZXhlY3V0ZVN0ZXAgYHNraXBwZWRgKSB0byBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgbG9zZXIsIHNvIG9ubHkgb25lIGhhbmRsZXIgZXZlciBydW5zIGEgZ2l2ZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvZHkuIEV2ZXJ5IG90aGVyIHBlbmRpbmcgc3RlcCBrZWVwcyBpdHMgZWFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCAoaW4gYGNyZWF0ZWRTdGVwQ29ycmVsYXRpb25JZHNgKSBhbmQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3VzcGVuc2lvbiBoYW5kbGVyIG9ubHkgZGVzaWduYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGxhenlJbmxpbmVTdGVwc2Agd2hlbiBubyBgaG9vay5nZXRDb25mbGljdCgpYCBhd2FpdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBwcmVzZW50LiBUaGF0IGF3YWl0ZXIgY2FzZSBtdXN0IGV4ZWN1dGUgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lOiBhbiBpbmxpbmUgYGF3YWl0IGV4ZWN1dGVTdGVwKC4uLilgIGJsb2NrcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGZvciB0aGUgZnVsbCBzdGVwIGR1cmF0aW9uLCBzbyB0aGUgYXdhaXRlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gKHdoaWNoIG9ubHkgYWR2YW5jZXMgb24gdGhlIG5leHQgcmVwbGF5KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgc2VyaWFsaXplZCBiZWhpbmQgdGhlIHN0ZXAg4oCUIGRlZmVhdGluZyB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ya2Zsb3cgZXhwcmVzc2VkIGFzIHBhcmFsbGVsIChlLmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgaG9vay5nZXRDb25mbGljdCgpLnRoZW4oKCkgPT4gc3RlcEIoKSlgIHJhY2luZyBgYXdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBBKClgKS4gSW4gdGhhdCBjYXNlIGBsYXp5SW5saW5lU3RlcHNgIGlzIGVtcHR5IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgc3RlcCBpcyBxdWV1ZWQgZm9yIHJlLWludm9jYXRpb24sIHdoaWNoIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdGVyIHdoaWxlIHF1ZXVlZCBzdGVwcyBydW4gaW4gcGFyYWxsZWwgaW52b2NhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXp5SW5saW5lU3RlcHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LmxhenlJbmxpbmVTdGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUNvcnJlbGF0aW9uSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT4gcy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZmllZCBxdWV1ZSBkaXNwYXRjaCBmb3IgZXZlcnl0aGluZyB3ZSBhcmUgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUtZXhlY3V0aW5nLiBTdGVwcyBhcmUgcXVldWVkIHdpdGggc3RlcElkIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVjZWl2ZXIgcnVucyB0aGVtOyB0aGUgd2FpdCB0aW1lciBpcyBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGEgZ2VuZXJpYyBjb250aW51YXRpb24gdGhhdCBmaXJlcyBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZWxhcHNlcyBhbmQgbGV0cyB0aGUgbmV4dCByZXBsYXkgb2JzZXJ2ZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCB2aWEgdGhlIFwiY29tcGxldGUgZWxhcHNlZCB3YWl0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgcXVldWVpbmcgaXMgdW5jb25kaXRpb25hbCAoY292ZXJzIGNyYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyeTogaWYgYSBwcmlvciBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGNyYXNoZWQgYmVmb3JlIHF1ZXVlaW5nLCBhIGxhdGVyIGhhbmRsZXIgd2lsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlbTsgaWRlbXBvdGVuY3lLZXkgb24gY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVkdXBlcyByZWR1bmRhbnQgcXVldWVzIGFjcm9zcyBjb25jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVycykuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3NlcyDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBwZW5kaW5nU3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChkaXNwYXRjaGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBleGVjdXRlIGlubGluZSDigJQgZXZlcnl0aGluZyBoYXMgYmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIChvciBubyB3b3JrIG5lZWRzIHNjaGVkdWxpbmcpLiBFeGl0IGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBxdWV1ZSBkcml2ZSBzdWJzZXF1ZW50IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgYW4gaW1tZWRpYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWludm9jYXRpb246IHRoZSByZXBsYXkgY29uc3VtZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIuIFdpdGhvdXQgaXQgKG5vIGlubGluZSBzdGVwLCBhbGwgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgb3Igbm9uZSBwZW5kaW5nKSB0aGUgcnVuIHdvdWxkIHNpdCBpZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudGlsIHNvbWUgdW5yZWxhdGVkIG1lc3NhZ2Ugd29rZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgaW5saW5lIHN0ZXAuIFBhdXNlIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBzdGVwIGJvZHkg4oCUIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cmF0aW9uIGlzIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heER1cmF0aW9uLCBub3QgYnkgdGhlIHJlcGxheSB0aW1lb3V0LiBXaXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHRoZSByZXBsYXktYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIHdvdWxkIChpbmNvcnJlY3RseSkgY2hhcmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCBib2R5IGFnYWluc3QgdGhlIGJ1ZGdldC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBmYXN0IHBhdGggZ2F0ZS4gV2UgcmVxdWVzdCB0aGUgZGVsdGEg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb24gdGhlIG5leHQgaXRlcmF0aW9uIGNvbnN1bWUgaXQgaW4gcGxhY2Ugb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCDigJQgb25seSB3aGVuIEFMTCBob2xkOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdlIGhhdmUgYSByZWFsIHByaW9yIGN1cnNvciB0byBkaWZmIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgcHJlSW5saW5lV3JpdGVDdXJzb3JgOyBhIFdvcmxkIG1heSByZXR1cm4gbm9uZSBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGluaXRpYWwgbG9hZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBUaGlzIGlzIHRoZSBjbGVhbiBzaW5nbGUtc3RlcCBzZXF1ZW50aWFsIGNhc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGlzIHN1c3BlbnNpb24gcHJvZHVjZWQgZXhhY3RseSBvbmUgc3RlcCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGhvb2tzIG9yIHdhaXRzIChgZXJyLntzdGVwLGhvb2ssd2FpdH1Db3VudGApLCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvbmUgc3RlcCBpcyB0aGUgbG9uZSBwZW5kaW5nIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMWApIGFuZCB0aGUgbG9uZSBpbmxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHN0ZXAgKGBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxYCDigJQgbm8gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNpYmxpbmdzIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLCBhbmQgbm8gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlubGluZSBzdGVwIHdyaXRpbmcgaXRzIG93biBldmVudHMgb3V0IG9mIGJhbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gcGVuZGluZyB3YWl0IHRpbWVyIGZyb20gVEhJUyBzdXNwZW5zaW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gVGhlIHJ1biBoYXMgTk8gcHJlLWV4aXN0aW5nIG9wZW4gaG9vayBvciB3YWl0LiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwbHVzIHRoZSBwZXItc3VzcGVuc2lvbiBjb3VudHMgYWJvdmUgaXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBsb2FkLWJlYXJpbmcgc2FmZXR5IGNoZWNrOiB0aGUgZGVsdGEgc25hcHNob3RzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgbG9nIGF0IHRoZSBzdGVwX2NvbXBsZXRlZCB3cml0ZSBidXQgaXMgY29uc3VtZWQgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBuZXh0IHJlcGxheSwgc28gYW4gb3V0LW9mLWJhbmQgaG9va19yZWNlaXZlZCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YWl0X2NvbXBsZXRlZCBsYW5kaW5nIGluIHRoYXQgd2luZG93IHdvdWxkIGJlIGluIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlYWwgZmV0Y2ggeWV0IGFic2VudCBmcm9tIHRoZSBzdGFsZSBkZWx0YSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJpc2tpbmcgYSBkaXZlcmdlbnQgcmVwbGF5LiBXaXRoIG5vIGhvb2svd2FpdCBvcGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAobmVpdGhlciBjYXJyaWVkIG92ZXIgbm9yIGNyZWF0ZWQgdGhpcyBzdXNwZW5zaW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBvbmx5IG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBzYWZlIHRvIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGhhc09wZW5Ib29rT3JXYWl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSBzdGVwIHJ1bnMgaW5saW5lLCBlYWNoIHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBldmVudHMgYW5kIHRoZSBwZXItd3JpdGUgZGVsdGEgd291bGQgYmUgcGFydGlhbCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBpcyBub3QgcmVxdWVzdGVkICh0aGUgZ2F0ZSBiZWxvdyBpcyBmYWxzZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpLXN0ZXApIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZG9lcyBhIG5vcm1hbCBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmxpbmVEZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwcmVJbmxpbmVXcml0ZUN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNPcGVuSG9va09yV2FpdChjYWNoZWRFdmVudHMgPz8gW10pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGFydCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gg4oCUIGJ1dCBvbmx5IHdoaWxlIHRoZSBydW4gaXMgc3RpbGwgXCJjbGVhblwiIChhIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbikuIFRoZSBtb21lbnQgYSBob29rIG9yIHdhaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIGxhdGVyIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBiZWNvbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlLCBzbyB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgbm8gbG9uZ2VyIGhvbGRzIOKAlCB0dXJib1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgYW5kIHRoZSBzdGVwcyB0YWtlIHRoZSBub3JtYWwgKGVudi1nYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0LXRoZW4tcnVuIHBhdGguIFRoZSBob29rLWNvbmZsaWN0IGNhc2UgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgZWFybHkgYWJvdmUsIHRoZSBhdHRyIGNhc2UgY29udGludWVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlc2ggcmVwbGF5IChzbyBhIGJhdGNoLXNjaGVkdWxpbmcgc3VzcGVuc2lvbiBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmllcyBhdHRyIGV2ZW50cyksIGFuZCB0aGUgYXdhaXRlZC1ob29rIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHRpZWQgbGF6eUlubGluZVN0ZXBzOyB0aGUgY2hlY2tzIGJlbG93IGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgc3VzcGVuc2lvblJlc3VsdC4qYCBmbGFncyBvbmx5IHJlZmxlY3Qgd2hhdCBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBjcmVhdGVkLCBzbyB0aGV5IGRvIG5vdCBjYXRjaCBhIGhvb2svd2FpdCBvcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFuIGVhcmxpZXIgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIGRlbGl2ZXJ5IChlLmcuIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vayguLi4pYCB0aGF0IGRvZXNuJ3QgYmxvY2sgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdywgbGV0dGluZyB0aGUgcmVwbGF5IGxvb3AgY29udGludWUgdG8gbGF0ZXIgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9ucykuIE9uY2UgYW55IGhvb2sgb3Igd2FpdCBpcyBvcGVuIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VtdWxhdGl2ZSBsb2csIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBhcmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLCBzbyB0dXJibyBtdXN0IGxhdGNoIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWFuZW50bHkg4oCUIGNoZWNrZWQgaGVyZSB2aWEgYGhhc09wZW5Ib29rT3JXYWl0YCBvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VtdWxhdGl2ZSBgY2FjaGVkRXZlbnRzYC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzT3Blbkhvb2tPcldhaXQoY2FjaGVkRXZlbnRzID8/IFtdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIHN0ZXBzIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWRnZXQgaXMgcGF1c2VkIGZvciB0aGUgd2hvbGUgYmF0Y2gg4oCUIHN0ZXAgZHVyYXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb24gbWF4RHVyYXRpb24sIG5vdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aW1lb3V0IOKAlCBzbyB0aGUgYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGRvZXNuJ3QgY2hhcmdlIHRoZSBzdGVwIGJvZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5OiBkZWNpZGUgd2hldGhlciB0aGlzIGJhdGNoJ3MgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcXVhbGlmaWVzIGZvciBUVEZTL1NUU08gbWVhc3VyZW1lbnQuIE9ubHkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCdzIGZpcnN0IHN0ZXAgY2FycmllcyB0aGUgdHJhY2tpbmcgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWwgYmF0Y2ggZW1pdHMgb25lIHNhbXBsZSBwZXIgc2NoZWR1bGluZyBnYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgb25lIHBlciBzaWJsaW5nLiBUdXJibydzIHN5bnRoZXNpemVkIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgaGFzIGEgbG9jYWwtY2xvY2sgY3JlYXRlZEF0LCBzbyB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gb25seSB0aGUgcnVuLWlkIFVMSUQgdGltZXN0YW1wIGlzIHRydXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXRlbmN5VHJhY2tpbmcgPSBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogY2FjaGVkRXZlbnRzID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW4gPT09IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNyZWF0ZWRBdE1zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkQ3JlYXRlZEF0KHJ1bklkKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXJibyA/IHVuZGVmaW5lZCA6ICt3b3JrZmxvd1J1bi5jcmVhdGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmUgbm90IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZEV2ZW50cyB5ZXQsIHNvIHJlcG9ydCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25IYXNXYWl0czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fCBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXBSZXN1bHRzOiBBd2FpdGVkPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD5cbiAgICAgICAgICAgICAgICAgICAgICAgID5bXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLm1hcCgocywgc3RlcEluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGlubGluZSBzdGFydDogc2VuZCB0aGUgZGVmZXJyZWQgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IG9uIHN0ZXBfc3RhcnRlZCBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBvbiB0aGUgZmx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGZvcmNlIG9wdGltaXN0aWMgc3RhcnQgYW5kIGhvbGQgdGhlIGxhenlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIHVudGlsIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFuZHMgKHRoZSBib2R5IHN0aWxsIHJ1bnMgaW1tZWRpYXRlbHkpLiBCb3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSB1bmRlZmluZWQvZmFsc2Ugb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBJbmRleCA9PT0gMCAmJiBsYXRlbmN5VHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgbGF0ZW5jeVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBwcmVJbmxpbmVXcml0ZUN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVEZWx0YVNpbmNlQ3Vyc29yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUlubGluZVdyaXRlQ3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgYmF0Y2ggcmVzdWx0cy4gYHJldHJ5YCBzdGVwcyAod2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZXhpc3Qg4oCUIHRoZWlyIGBzdGVwX3N0YXJ0ZWRgIHN1Y2NlZWRlZCkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1xdWV1ZWQgcGVyLXN0ZXAgYXMgYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXk7IGB0aHJvdHRsZWRgIHN0ZXBzIChyZWplY3RlZCBvbiB0aGUgY3JlYXRlLWNsYWltLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbmV2ZXIgY3JlYXRlZCkgaW5zdGVhZCBkZWZlciByZWRlbGl2ZXJ5IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHNvIHRoZXkgcmUtcnVuIGlubGluZSB3aXRoIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZXBsYXk7IGNvbXBsZXRlZC9mYWlsZWQgc3RlcHMgYWxyZWFkeSB3cm90ZSB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnRzLiBXZSBvbmx5IGxvb3AgYmFjayB0byByZXBsYXkgd2hlbiBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIOKAlCBvdGhlcndpc2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC1wZW5kaW5nIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIGJ5IHRoZWlyIHF1ZXVlZCByZXRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMgYW5kIHRoZSBiYWNrZ3JvdW5kLXN0ZXAgaGFuZGxlciByZXBsYXlzIG9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogKHR5cGVvZiBsYXp5SW5saW5lU3RlcHMpW251bWJlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW55UGVuZGluZ09wcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB0aHJvdHRsZWQgaW5saW5lIHN0ZXAgZGVsYXlzIHJlZGVsaXZlcnkgb2YgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYmVpbmcgcmUtcXVldWVkIGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcC4gQ3J1Y2lhbGx5LCBhIGB0aHJvdHRsZWRgIHJlc3VsdCBtZWFuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgd2FzIHJlamVjdGVkIG9uIHRoZSBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSDigJQgc28gdGhlIHN0ZXAgd2FzIE5FVkVSIGNyZWF0ZWQgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgbm8gc3RlcCBlbnRpdHkpLiBSZS1xdWV1aW5nIGl0IGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcCB3b3VsZCBzZW5kIGEgYmFyZSBgc3RlcF9zdGFydGVkYCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0KSwgd2hpY2ggdGhlIHdvcmxkIHJlamVjdHMgd2l0aCBgU3RlcCBcIjxpZD5cIiBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kYCBiZWNhdXNlIGl0IGNhbm5vdCBsYXppbHkgY3JlYXRlIHRoZSBzdGVwIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbnB1dDsgdGhhdCBlcnJvciBpc24ndCB0cmFuc2xhdGFibGUsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZWRlbGl2ZXJzIHVudGlsIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGFuZCBydW4pIGZhaWwuIERlZmVycmluZyByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIGluc3RlYWQgcmUtYXR0ZW1wdHMgdGhlIHRocm90dGxlZCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgV0lUSCBpdHMgaW5wdXQgb24gcmVwbGF5LiBXZSB0cmFjayB0aGUgbG9uZ2VzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja29mZiBzbyBhIGJhdGNoIHdpdGggbXVsdGlwbGUgdGhyb3R0bGVzIHdhaXRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4LiBOb3RlOiBgcmV0cnlgIHJlc3VsdHMgYXJlIHNhZmUgdG8gcmUtcXVldWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgYmVjYXVzZSBhIHJldHJ5IGltcGxpZXMgYHN0ZXBfc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgc3VjY2VlZGVkIGFuZCB0aGUgc3RlcCBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGVUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhenlJbmxpbmVTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gc3RlcFJlc3VsdHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBsYXp5SW5saW5lU3RlcHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogci50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudGltZW91dFNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55UGVuZGluZ09wcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVyIHJlZGVsaXZlcnkgb2YgdGhlIG9yY2hlc3RyYXRvciBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3R0bGUgYmFja29mZi4gT24gcmVwbGF5IGV2ZXJ5IG5vbi10ZXJtaW5hbCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlLWRpc3BhdGNoZWQgYnkgdGhlIHN1c3BlbnNpb24gaGFuZGxlcjogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXRocm90dGxlZCBzdGVwcyBydW4gaW5saW5lIGFnYWluIFdJVEggdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgKHRoZWlyIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkIGFuZXcpLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGByZXRyeWAgc3RlcHMgaW4gdGhpcyBiYXRjaCBhcmUgcXVldWVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd24gcmV0cnlBZnRlciBob25vcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBzdGVwcyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlZCBmcm9tIHRoZWlyIGV2ZW50cyBhbmQgbm90IHJlLXJ1bi4gQmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGRyaXZlcyBhbGwgcmVtYWluaW5nIHdvcmssIHdlIG11c3QgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gcmUtcXVldWUgYHRvUmV0cnlgIGhlcmUg4oCUIHRoYXQgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlLWRpc3BhdGNoIHRob3NlIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJldHVybnMgQkVGT1JFIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LCBzbyBhIGJhdGNoIHRoYXQgbWl4ZXMgYSB0aHJvdHRsZSB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkIHN0ZXAgdGhhdCBsZWZ0IHVuZmx1c2hlZCBvcHMgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlIGV4cGxpY2l0IGZsdXNoIGNvbnRpbnVhdGlvbi4gVGhhdCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRocm90dGxlIGJhY2tvZmYgKD49IDFzKSBhbHdheXMgZXhjZWVkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4taW52b2NhdGlvbiBmbHVzaCB3aW5kb3cgKDw9IDUwMG1zICsgd2FpdFVudGlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb3BzIHNldHRsZSBiZWZvcmUgdGhlIHBvc3QtYmFja29mZiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMgYW5kIHJlYWRzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSh0aHJvdHRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5VHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5Lm1hcCgoeyBzdGVwLCBkZWxheVNlY29uZHMgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmV0cnlUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IHRoZSBkZWxheWVkIHJldHJ5IG9uIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWxhdGlvbklkIHNvIGl0IGRlZHVwZXMgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXllZCByZS1kaXNwYXRjaCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyZm9ybXMgb24gcmVwbGF5IChpdCBhbHNvIHVzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZGApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIG1peGVkIGJhdGNoIHdoZXJlIG9uZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbXBsZXRlZGAgd2l0aCB1bmZsdXNoZWQgYmFja2dyb3VuZCBvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoYGFueVBlbmRpbmdPcHNgKSBhbmQgYW5vdGhlciBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgd291bGQgZG91YmxlLWRpc3BhdGNoIHRoZSByZXRyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYGFueVBlbmRpbmdPcHNgIGJyYW5jaCBiZWxvdyBxdWV1ZXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGUgcGxhaW4gY29udGludWF0aW9uLCB3aG9zZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVzIHRoZSBzdGlsbC1gcmV0cnlpbmdgIHN0ZXAgYXMgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByZS1kaXNwYXRjaGVzIGl0ICppbW1lZGlhdGVseSogYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndpdGgqIGEga2V5LiBTaW5jZSB0aGlzIGRlbGF5ZWQgcmV0cnkgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8ga2V5LCB0aGUgdHdvIG1lc3NhZ2VzIHdvdWxkbid0IGRlZHVwZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCB3b3VsZCBydW4gdHdpY2UsIHRoZSBjb25maWd1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYmFja29mZiB3b3VsZCBiZSBpZ25vcmVkIChwbGFpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFcnJvcmAgcmV0cmllcyBwZXJzaXN0IG5vIGByZXRyeUFmdGVyYCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd29ybGQgaGFzIG5vIGBUb29FYXJseWAgZ3VhcmQpLCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgYm9keSBjb3VsZCBydW4gZWFybHkvY29uY3VycmVudGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNoYXJpbmcgdGhlIGtleSBsZXRzIHRoZSBlYXJsaWVyIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHdpbiwgaG9ub3JpbmcgdGhlIGJhY2tvZmYuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW55IGlubGluZSBzdGVwIGhhZCBwZW5kaW5nIGJhY2tncm91bmQgb3BzIChlLmcuLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIHdyaXRlcyB0byBTMyksIGJyZWFrIHRoZSBsb29wIGFuZCBxdWV1ZSBhIHBsYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gc28gd2FpdFVudGlsIGNhbiBmbHVzaCB0aGVtIGJlZm9yZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgcmVwbGF5IHJlYWRzIHRoZW0uIFRoaXMgbWF0Y2hlcyBWMSBiZWhhdmlvciB3aGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCBzdGVwIHJhbiBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uIGludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55UGVuZGluZ09wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCcmVha2luZyBsb29wOiBpbmxpbmUgc3RlcCBoYXMgcGVuZGluZyBvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGxvb3BJdGVyYXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGlubGluZSBzdGVwcyB3aWxsIGJlIHJlLXJ1biB2aWEgdGhlaXIgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IG1lc3NhZ2VzOyB0aGUgYmFja2dyb3VuZC1zdGVwIGhhbmRsZXIgcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFsbCBzdGVwcyBhcmUgdGVybWluYWwuIERvbid0IGxvb3AgaGVyZSDigJQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHN0ZXBzIGhhdmUgbm8gdGVybWluYWwgZXZlbnQgdG8gb2JzZXJ2ZSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGlubGluZSBzdGVwcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkg4oCUIGxvb3AgYmFjayB0byByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgd29ya2Zsb3cgb2JzZXJ2ZXMgdGhlIHRlcm1pbmFsIGV2ZW50cyBvbiByZXBsYXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaW5nbGUgaW5saW5lIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSByZXR1cm5lZCBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIGRlbHRhIChzdXBwb3J0aW5nIFdvcmxkICsgdGhlIHNpbmdsZS1zdGVwIGdhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlKSwgc3Rhc2ggaXQgc28gdGhlIG5leHQgaXRlcmF0aW9uJ3MgbG9hZCBjb25zdW1lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaW5zdGVhZCBvZiBpc3N1aW5nIGFuIGluY3JlbWVudGFsIGV2ZW50cy5saXN0LiBPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGxldGVkIHBhdGggY2FycmllcyBhIGRlbHRhOyBtdWx0aS1zdGVwIGJhdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlcXVlc3Qgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25seSA9IHN0ZXBSZXN1bHRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuaW5saW5lRGVsdGEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb25seS5pbmxpbmVEZWx0YS5oYXNNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdJbmxpbmVEZWx0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogb25seS5pbmxpbmVEZWx0YS5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IG9ubHkuaW5saW5lRGVsdGEuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IGluZnJhc3RydWN0dXJlIGZhaWx1cmVzIHRhbGtpbmcgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JsZCAod29ya2Zsb3ctc2VydmVyKSDigJQgYW4gZXhoYXVzdGVkIFJldHJ5QWdlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChVTkRfRVJSX1JFUV9SRVRSWSBmcm9tIGEgc3VzdGFpbmVkIDQyOS81MDMgc3Rvcm0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBkcm9wcGVkIHNvY2tldCwgYSBjb25uZWN0L0ROUyBmYWlsdXJlLCBvciBhIGNsaWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dCDigJQgbXVzdCBOT1QgZmFpbCB0aGUgcnVuLiBSZXRocm93IHNvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycyBhbmQgYSBmcmVzaCBpbnZvY2F0aW9uIHJldHJpZXMgdGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSB0aGUgYmFja2VuZCByZWNvdmVycy4gVGhlIEB2ZXJjZWwvcXVldWUgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGllcyBhIGZhc3QgKDFz4oaSNjBzKSBiYWNrb2ZmIGJ5IGRlbGl2ZXJ5IGNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWRpbmcgdGhlIH41bWluIGRlZmF1bHQgdmlzaWJpbGl0eS10aW1lb3V0IHJlZHJpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChhbmQgbmV2ZXIga2lsbGluZyB0aGUgcHJvY2VzcyB2aWEgcnVuX2ZhaWxlZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyYW5zaWVudCB3b3JsZCBlcnJvciBkdXJpbmcgcmVwbGF5OyByZWRlbGl2ZXJpbmcgdmlhIHF1ZXVlIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcnVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVjb3ZlcnlSZXBsYXlzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXZlcmdlbmNlQ291bnQgPD0gbWF4UmVjb3ZlcnlSZXBsYXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkOyBxdWV1ZWluZyBhIHJlY292ZXJ5IHJlcGxheSBiZWZvcmUgZGVjbGFyaW5nIHRoZSBldmVudCBsb2cgY29ycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX0RJVkVSR0VOQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JEaXZlcmdlbmNlRXZlbnRJZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjb3ZlcnlSZXBsYXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQgJHtkaXZlcmdlbmNlQ291bnR9IHRpbWVzIGFmdGVyICR7bWF4UmVjb3ZlcnlSZXBsYXlzfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtIOKAlCBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVSdW5FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSAvLyBFbmQgd2hpbGUgbG9vcFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTsgLy8gRW5kIHRyYWNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTsgLy8gRW5kIHdpdGhXb3JrZmxvd0JhZ2dhZ2VcbiAgICAgICAgfSk7IC8vIEVuZCB3aXRoVHJhY2VDb250ZXh0XG4gICAgICB9XG4gICAgKTtcblxuICBsZXQgY2FjaGVkSGFuZGxlcjogKChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+KSB8IHVuZGVmaW5lZDtcbiAgbGV0IGludm9jYXRpb25Db3VudCA9IDA7XG4gIGNvbnN0IGVudHJ5cG9pbnRDcmVhdGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCByb3V0ZU1vZHVsZUJvZHlJbml0TXMgPVxuICAgIHR5cGVvZiBvcHRpb25zPy5yb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQgPT09ICdudW1iZXInXG4gICAgICA/IGVudHJ5cG9pbnRDcmVhdGVkQXQgLSBvcHRpb25zLnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdFxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHdpdGhIZWFsdGhDaGVjayhhc3luYyAocmVxKSA9PiB7XG4gICAgaW52b2NhdGlvbkNvdW50ICs9IDE7XG4gICAgY29uc3QgaGFuZGxlckNhY2hlZCA9IGNhY2hlZEhhbmRsZXIgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzcGFuS2luZCA9IGF3YWl0IGdldFNwYW5LaW5kKCdTRVJWRVInKTtcblxuICAgIHJldHVybiB0cmFjZShcbiAgICAgICd3b3JrZmxvdy5yb3V0ZS5mbG93JyxcbiAgICAgIHtcbiAgICAgICAga2luZDogc3BhbktpbmQsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZVR5cGUoJ2Zsb3cnKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUhhbmRsZXJDYWNoZWQoaGFuZGxlckNhY2hlZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQoaW52b2NhdGlvbkNvdW50KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUVudHJ5cG9pbnRBZ2VNcyhcbiAgICAgICAgICAgIERhdGUubm93KCkgLSBlbnRyeXBvaW50Q3JlYXRlZEF0XG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi4ocm91dGVNb2R1bGVCb2R5SW5pdE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogQXR0cmlidXRlLldvcmtmbG93Um91dGVNb2R1bGVCb2R5SW5pdE1zKHJvdXRlTW9kdWxlQm9keUluaXRNcykpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUmVxdWVzdE1ldGhvZChyZXEubWV0aG9kKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJvdXRlKCcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIGlmICghY2FjaGVkSGFuZGxlcikge1xuICAgICAgICAgIGNhY2hlZEhhbmRsZXIgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuaW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkSGFuZGxlcnMgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgICAgICAgJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZF9oYW5kbGVycycsXG4gICAgICAgICAgICAgIGFzeW5jICgpID0+IGdldFdvcmxkSGFuZGxlcnMoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHdvcmxkSGFuZGxlcnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWNoZWRIYW5kbGVyKHJlcSk7XG4gICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgIEF0dHJpYnV0ZS5IdHRwUmVzcG9uc2VTdGF0dXNDb2RlKHJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cbiJdfQ==
|