@workflow/world-local 5.0.0-beta.23 → 5.0.0-beta.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -5
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -5
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +7 -8
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +164 -20
- package/dist/storage/helpers.d.ts +37 -0
- package/dist/storage/helpers.d.ts.map +1 -1
- package/dist/storage/helpers.js +73 -2
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +18 -6
- package/dist/streamer.d.ts.map +1 -1
- package/dist/streamer.js +79 -62
- package/package.json +4 -4
|
@@ -6,7 +6,7 @@ import { z } from 'zod';
|
|
|
6
6
|
import { DEFAULT_RESOLVE_DATA_OPTION } from '../config.js';
|
|
7
7
|
import { assertSafeEntityId, deleteJSON, jsonReplacer, jsonReviver, listJSONFiles, paginatedFileSystemQuery, readJSON, readJSONWithFallback, resolveWithinBase, taggedPath, write, writeExclusive, writeJSON, } from '../fs.js';
|
|
8
8
|
import { stripEventDataRefs } from './filters.js';
|
|
9
|
-
import { getObjectCreatedAt,
|
|
9
|
+
import { getObjectCreatedAt, hookDisposeLockPath, hookRecoveryMarkerPath, hookTokenClaimPath, isHookDisposalCommitted, monotonicUlid, releaseHookTokenClaimIfOwnedBy, } from './helpers.js';
|
|
10
10
|
import { deleteAllHooksForRun, rebuildLiveHookByTokenFromEventLog, } from './hooks-storage.js';
|
|
11
11
|
import { handleLegacyEvent } from './legacy.js';
|
|
12
12
|
import { withRunFileLock } from './runs-storage.js';
|
|
@@ -82,6 +82,33 @@ async function readHookTokenClaim(constraintPath) {
|
|
|
82
82
|
throw error;
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Whether a token claim held by another `(runId, hookId)` can never become
|
|
87
|
+
* live again and may therefore be released by a new claimant:
|
|
88
|
+
*
|
|
89
|
+
* - the claimed hook's disposal is committed (its dispose lock exists —
|
|
90
|
+
* the durable release of the claim file just hasn't landed yet, or was
|
|
91
|
+
* lost to a crash between the lock write and the claim delete), or
|
|
92
|
+
* - the owning run is terminal (the run-completion cleanup releases all
|
|
93
|
+
* of the run's claims, but a claimant can observe the claim in the
|
|
94
|
+
* window before that cleanup lands — or the cleanup crashed), or
|
|
95
|
+
* - the owning run does not exist (a claim can only be written during a
|
|
96
|
+
* suspension of an existing run, so an ownerless claim is debris).
|
|
97
|
+
*
|
|
98
|
+
* A claim from a mid-creation writer is never releasable: its owning run
|
|
99
|
+
* exists and is non-terminal, and its dispose lock does not exist.
|
|
100
|
+
*/
|
|
101
|
+
async function isHookTokenClaimReleasable(basedir, claim, tag) {
|
|
102
|
+
if (claim.hookId &&
|
|
103
|
+
(await isHookDisposalCommitted(basedir, claim.hookId, tag))) {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
const owningRun = await readJSONWithFallback(basedir, 'runs', claim.runId, WorkflowRunSchema, tag);
|
|
107
|
+
if (!owningRun) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return isTerminalWorkflowRunStatus(owningRun.status);
|
|
111
|
+
}
|
|
85
112
|
async function readHookRecoveryMarker(markerPath) {
|
|
86
113
|
try {
|
|
87
114
|
return await readJSON(markerPath, HookRecoveryMarkerSchema);
|
|
@@ -420,7 +447,20 @@ export function createEventsStorage(basedir, tag) {
|
|
|
420
447
|
// observe a claim with no matching hook entity — which the
|
|
421
448
|
// crash-recovery path below would misinterpret as a prior crash
|
|
422
449
|
// and incorrectly fall through to a second hook entity write.
|
|
423
|
-
|
|
450
|
+
//
|
|
451
|
+
// `hook_received` and `hook_disposed` share the same per-hook lock
|
|
452
|
+
// so a resume's "hook exists and is not disposed, then append"
|
|
453
|
+
// sequence is atomic with respect to the disposer's "write dispose
|
|
454
|
+
// lock, delete entity, then append" sequence. Without this, a
|
|
455
|
+
// resume that passed its existence check before the disposal began
|
|
456
|
+
// could append its `hook_received` AFTER `hook_disposed` — an
|
|
457
|
+
// ordering that is journaled durably and makes every subsequent
|
|
458
|
+
// replay of the owning run diverge at that event
|
|
459
|
+
// (https://github.com/vercel/workflow/issues/2781).
|
|
460
|
+
const isHookLifecycleEvent = data.eventType === 'hook_created' ||
|
|
461
|
+
data.eventType === 'hook_received' ||
|
|
462
|
+
data.eventType === 'hook_disposed';
|
|
463
|
+
if (isHookLifecycleEvent && runId && data.correlationId) {
|
|
424
464
|
const lockKey = tag
|
|
425
465
|
? `${runId}-${data.correlationId}.hook.${tag}`
|
|
426
466
|
: `${runId}-${data.correlationId}.hook`;
|
|
@@ -666,6 +706,19 @@ export function createEventsStorage(basedir, tag) {
|
|
|
666
706
|
const hookEventsRequiringExistence = ['hook_disposed', 'hook_received'];
|
|
667
707
|
if (hookEventsRequiringExistence.includes(data.eventType) &&
|
|
668
708
|
data.correlationId) {
|
|
709
|
+
// A resume must never be journaled after the hook's disposal.
|
|
710
|
+
// The disposer's durable order is: dispose lock → claim/entity
|
|
711
|
+
// delete → `hook_disposed` append, so the hook entity can still
|
|
712
|
+
// exist (or the disposer may have crashed mid-teardown) while
|
|
713
|
+
// disposal is already committed. Re-validate the dispose lock
|
|
714
|
+
// here — under the per-hook in-process lock taken above — so
|
|
715
|
+
// acceptance observes the same order replay will: once disposal
|
|
716
|
+
// has committed, the resume is rejected exactly like one that
|
|
717
|
+
// arrived after teardown finished.
|
|
718
|
+
if (data.eventType === 'hook_received' &&
|
|
719
|
+
(await isHookDisposalCommitted(basedir, data.correlationId, tag))) {
|
|
720
|
+
throw new HookNotFoundError(data.correlationId);
|
|
721
|
+
}
|
|
669
722
|
const existingHook = await readJSONWithFallback(basedir, 'hooks', data.correlationId, HookSchema, tag);
|
|
670
723
|
if (!existingHook) {
|
|
671
724
|
throw new HookNotFoundError(data.correlationId);
|
|
@@ -1123,22 +1176,97 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1123
1176
|
const hookData = data.eventData;
|
|
1124
1177
|
// Atomically claim the token using an exclusive-create constraint file.
|
|
1125
1178
|
// This avoids the TOCTOU race of the previous read-all-then-check approach.
|
|
1126
|
-
const constraintPath =
|
|
1127
|
-
// When the claim is absent, the event log is the only durable source
|
|
1128
|
-
// that can distinguish a first hook from a crash-lost token cache.
|
|
1129
|
-
if (!(await readHookTokenClaim(constraintPath))) {
|
|
1130
|
-
await rebuildLiveHookByTokenFromEventLog(basedir, hookData.token, tag);
|
|
1131
|
-
}
|
|
1179
|
+
const constraintPath = hookTokenClaimPath(basedir, hookData.token);
|
|
1132
1180
|
// Persist `eventId` in the claim so concurrent / cross-
|
|
1133
1181
|
// process retries can converge on a single canonical
|
|
1134
1182
|
// `hook_created` event path. See the recovery comment
|
|
1135
1183
|
// below.
|
|
1136
|
-
const
|
|
1184
|
+
const claimContent = JSON.stringify({
|
|
1137
1185
|
token: hookData.token,
|
|
1138
1186
|
hookId: data.correlationId,
|
|
1139
1187
|
runId: effectiveRunId,
|
|
1140
1188
|
eventId,
|
|
1141
|
-
})
|
|
1189
|
+
});
|
|
1190
|
+
// Bounded claim loop. A same-token claim can be observed in the
|
|
1191
|
+
// short window where its release is already committed but the
|
|
1192
|
+
// claim file itself is still on disk (or was just deleted):
|
|
1193
|
+
//
|
|
1194
|
+
// - the claim vanished between the exclusive-create attempt
|
|
1195
|
+
// and the ownership read → retry immediately;
|
|
1196
|
+
// - the claim is held by a disposed hook or a terminal/missing
|
|
1197
|
+
// run (`isHookTokenClaimReleasable`) → wait briefly for the
|
|
1198
|
+
// in-flight releaser (the hook_disposed handler or the
|
|
1199
|
+
// run-completion cleanup) to delete it, then reclaim; if it
|
|
1200
|
+
// never does (the releaser crashed after committing its
|
|
1201
|
+
// dispose lock / terminal status), release the stale claim
|
|
1202
|
+
// ourselves and reclaim.
|
|
1203
|
+
//
|
|
1204
|
+
// Without this, a run claiming a token right after the previous
|
|
1205
|
+
// owner disposed it records a durable, spurious hook_conflict
|
|
1206
|
+
// (issue #2778). A genuinely live claim exits the loop on the
|
|
1207
|
+
// first iteration and falls through to the dedup / conflict
|
|
1208
|
+
// handling below.
|
|
1209
|
+
let tokenClaimed = false;
|
|
1210
|
+
let existingClaim = null;
|
|
1211
|
+
let releasableObservations = 0;
|
|
1212
|
+
// A claim file that exists (exclusive-create keeps failing) but never
|
|
1213
|
+
// parses is debris: `writeExclusive` writes atomically, so a live
|
|
1214
|
+
// claim is always valid JSON — an unparseable one at the canonical
|
|
1215
|
+
// path is a corrupt/partial leftover. The releaser leaves it alone
|
|
1216
|
+
// (ownership is undeterminable), so nothing else reaps it and it would
|
|
1217
|
+
// block the token forever. Force-delete it after a few observations.
|
|
1218
|
+
let unparseableObservations = 0;
|
|
1219
|
+
for (let attempt = 0; attempt < 10; attempt++) {
|
|
1220
|
+
// When the claim is absent, the event log is the only durable
|
|
1221
|
+
// source that can distinguish a first hook from a crash-lost
|
|
1222
|
+
// token cache.
|
|
1223
|
+
if (!(await readHookTokenClaim(constraintPath))) {
|
|
1224
|
+
await rebuildLiveHookByTokenFromEventLog(basedir, hookData.token, tag);
|
|
1225
|
+
}
|
|
1226
|
+
tokenClaimed = await writeExclusive(constraintPath, claimContent);
|
|
1227
|
+
if (tokenClaimed)
|
|
1228
|
+
break;
|
|
1229
|
+
existingClaim = await readHookTokenClaim(constraintPath);
|
|
1230
|
+
if (!existingClaim) {
|
|
1231
|
+
// The claim either vanished (raced a releaser between the
|
|
1232
|
+
// exclusive-create attempt and this read → retry resolves it) or
|
|
1233
|
+
// exists but is unparseable. `readHookTokenClaim` can't tell them
|
|
1234
|
+
// apart, so count consecutive misses; once we're confident it is
|
|
1235
|
+
// not a transient race, delete the (presumed corrupt) file so the
|
|
1236
|
+
// token isn't blocked forever. `deleteJSON` is a no-op if it was
|
|
1237
|
+
// in fact a vanished-claim race.
|
|
1238
|
+
unparseableObservations++;
|
|
1239
|
+
if (unparseableObservations >= 3) {
|
|
1240
|
+
await deleteJSON(constraintPath);
|
|
1241
|
+
}
|
|
1242
|
+
continue;
|
|
1243
|
+
}
|
|
1244
|
+
if (existingClaim.runId === effectiveRunId &&
|
|
1245
|
+
existingClaim.hookId === data.correlationId) {
|
|
1246
|
+
// Our own prior claim — dedup-recovery handling below.
|
|
1247
|
+
break;
|
|
1248
|
+
}
|
|
1249
|
+
if (!(await isHookTokenClaimReleasable(basedir, existingClaim, tag))) {
|
|
1250
|
+
// Genuinely live claim — conflict handling below.
|
|
1251
|
+
break;
|
|
1252
|
+
}
|
|
1253
|
+
releasableObservations++;
|
|
1254
|
+
if (releasableObservations < 3) {
|
|
1255
|
+
// Give the in-flight releaser a moment to delete the claim.
|
|
1256
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
1257
|
+
}
|
|
1258
|
+
else {
|
|
1259
|
+
// The releaser is not coming. Release the stale claim and
|
|
1260
|
+
// the hook entity it points at, mirroring the hook_disposed
|
|
1261
|
+
// cleanup.
|
|
1262
|
+
await deleteJSON(constraintPath);
|
|
1263
|
+
if (existingClaim.hookId) {
|
|
1264
|
+
await deleteJSON(taggedPath(basedir, 'hooks', existingClaim.hookId, tag));
|
|
1265
|
+
await deleteJSON(hookRecoveryMarkerPath(basedir, hookData.token, existingClaim.runId, existingClaim.hookId));
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
existingClaim = null;
|
|
1269
|
+
}
|
|
1142
1270
|
// Recovery shape: the durable record of a successful hook
|
|
1143
1271
|
// creation is the `hook_created` event in the event log. The
|
|
1144
1272
|
// claim file and hook entity are written before the event,
|
|
@@ -1176,7 +1304,6 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1176
1304
|
// is what closes the cross-process race.
|
|
1177
1305
|
let writeHookEntityWithOverwrite = false;
|
|
1178
1306
|
if (!tokenClaimed) {
|
|
1179
|
-
const existingClaim = await readHookTokenClaim(constraintPath);
|
|
1180
1307
|
if (existingClaim?.runId === effectiveRunId &&
|
|
1181
1308
|
existingClaim.hookId === data.correlationId) {
|
|
1182
1309
|
// Adopt a canonical eventId for the recovery write. The
|
|
@@ -1335,10 +1462,11 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1335
1462
|
// hook_disposed: Deletes hook entity, rejects duplicates.
|
|
1336
1463
|
// Uses writeExclusive on a lock file to atomically prevent concurrent
|
|
1337
1464
|
// invocations from both disposing the same hook (TOCTOU race).
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1465
|
+
// The lock doubles as the durable disposal marker consulted by the
|
|
1466
|
+
// hook_created claim path and the event-log rebuild (see
|
|
1467
|
+
// `isHookDisposalCommitted`), which is why it must be written
|
|
1468
|
+
// before any of the destructive deletes below.
|
|
1469
|
+
const lockPath = hookDisposeLockPath(basedir, data.correlationId, tag);
|
|
1342
1470
|
const claimed = await writeExclusive(lockPath, '');
|
|
1343
1471
|
if (!claimed) {
|
|
1344
1472
|
throw new EntityConflictError(`Hook "${data.correlationId}" already disposed`);
|
|
@@ -1347,14 +1475,18 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1347
1475
|
const hookPath = taggedPath(basedir, 'hooks', data.correlationId, tag);
|
|
1348
1476
|
const existingHook = await readJSONWithFallback(basedir, 'hooks', data.correlationId, HookSchema, tag);
|
|
1349
1477
|
if (existingHook) {
|
|
1350
|
-
//
|
|
1351
|
-
//
|
|
1478
|
+
// Release the token claim to free up the token for reuse —
|
|
1479
|
+
// but only if it still points at this hook. A claimant that
|
|
1480
|
+
// force-released this hook's stale claim (see
|
|
1481
|
+
// `isHookTokenClaimReleasable`) may already hold a fresh
|
|
1482
|
+
// claim for the token; deleting unconditionally here would
|
|
1483
|
+
// destroy that live claim and transiently break token
|
|
1484
|
+
// uniqueness. Also delete this hook's recovery marker (if
|
|
1352
1485
|
// any) for disk hygiene. The marker's filename hash
|
|
1353
1486
|
// includes `(token, runId, hookId)` so different
|
|
1354
1487
|
// lifetimes never collide, but cleaning up reduces disk
|
|
1355
1488
|
// leak for hooks that go through the recovery path.
|
|
1356
|
-
|
|
1357
|
-
await deleteJSON(disposedConstraintPath);
|
|
1489
|
+
await releaseHookTokenClaimIfOwnedBy(basedir, existingHook.token, existingHook.runId, existingHook.hookId);
|
|
1358
1490
|
await deleteJSON(hookRecoveryMarkerPath(basedir, existingHook.token, existingHook.runId, existingHook.hookId));
|
|
1359
1491
|
}
|
|
1360
1492
|
await deleteJSON(hookPath);
|
|
@@ -1433,6 +1565,18 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1433
1565
|
// collision indicates a real bug and EntityConflictError is
|
|
1434
1566
|
// also the right surface — same shape as step_created's
|
|
1435
1567
|
// claim-file behavior.
|
|
1568
|
+
// Last-instant re-validation for `hook_received` (see the acceptance
|
|
1569
|
+
// check above). The per-hook in-process lock already serializes
|
|
1570
|
+
// resume vs. dispose within one storage instance; this second check
|
|
1571
|
+
// narrows the cross-instance window (independent lock maps, shared
|
|
1572
|
+
// filesystem) to the single event write below, matching the
|
|
1573
|
+
// module's convention that the on-disk lock file — not the
|
|
1574
|
+
// in-process mutex — is the durable source of truth.
|
|
1575
|
+
if (data.eventType === 'hook_received' &&
|
|
1576
|
+
data.correlationId &&
|
|
1577
|
+
(await isHookDisposalCommitted(basedir, data.correlationId, tag))) {
|
|
1578
|
+
throw new HookNotFoundError(data.correlationId);
|
|
1579
|
+
}
|
|
1436
1580
|
const compositeKey = `${effectiveRunId}-${eventId}`;
|
|
1437
1581
|
const eventPath = taggedPath(basedir, 'events', compositeKey, tag);
|
|
1438
1582
|
// Capture the serialized payload before the write's `await` so the
|
|
@@ -1622,4 +1766,4 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1622
1766
|
},
|
|
1623
1767
|
};
|
|
1624
1768
|
}
|
|
1625
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLHdCQUF3QixFQUN4QixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsS0FBSyxFQUNMLGNBQWMsRUFDZCxTQUFTLEdBQ1YsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsU0FBUyxFQUNULHNCQUFzQixFQUN0QixhQUFhLEdBQ2QsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQ0FBa0MsR0FDbkMsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsdURBQXVEO0FBQ3ZELG1FQUFtRTtBQUNuRSxrRUFBa0U7QUFDbEUsK0RBQStEO0FBQy9ELGdFQUFnRTtBQUNoRSwrREFBK0Q7QUFDL0QsbUVBQW1FO0FBQ25FLGtFQUFrRTtBQUNsRSwrREFBK0Q7QUFDL0QsMkNBQTJDO0FBRTNDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNwQyxrRUFBa0U7SUFDbEUsaUVBQWlFO0lBQ2pFLGtFQUFrRTtJQUNsRSxrRUFBa0U7SUFDbEUsZ0VBQWdFO0lBQ2hFLG1EQUFtRDtJQUNuRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM3QixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNqQixnRUFBZ0U7SUFDaEUsK0RBQStEO0lBQy9ELCtEQUErRDtJQUMvRCxrRUFBa0U7SUFDbEUsK0RBQStEO0lBQy9ELG1FQUFtRTtJQUNuRSxpRUFBaUU7SUFDakUsa0RBQWtEO0lBQ2xELE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQy9CLENBQUMsQ0FBQztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3hDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0NBQ3BCLENBQUMsQ0FBQztBQUVILEtBQUssVUFBVSxrQkFBa0IsQ0FDL0IsY0FBc0I7SUFFdEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLFFBQVEsQ0FBQyxjQUFjLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksS0FBSyxZQUFZLFdBQVcsSUFBSSxLQUFLLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsc0JBQXNCLENBQ25DLFVBQWtCO0lBRWxCLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxXQUFXLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsS0FBSyxVQUFVLDhCQUE4QixDQUMzQyxPQUFlLEVBQ2YsS0FBYSxFQUNiLGFBQXFCO0lBRXJCLE1BQU0sTUFBTSxHQUFHLE1BQU0sd0JBQXdCLENBQUM7UUFDNUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUN2QyxNQUFNLEVBQUUsV0FBVztRQUNuQixVQUFVLEVBQUUsR0FBRyxLQUFLLEdBQUc7UUFDdkIsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEIsS0FBSyxDQUFDLFNBQVMsS0FBSyxjQUFjO1lBQ2xDLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYTtRQUN2QyxLQUFLLEVBQUUsQ0FBQztRQUNSLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDeEMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTztLQUNoQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxLQUFLLFVBQVUsa0NBQWtDLENBQy9DLE9BQWUsRUFDZixLQUFhLEVBQ2IsTUFBYyxFQUNkLGdCQUF3QixFQUN4QixHQUF1QjtJQUV2QixNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUssSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3BELE1BQU0sY0FBYyxHQUFHLE1BQU0sb0JBQW9CLENBQy9DLE9BQU8sRUFDUCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFdBQVcsRUFDWCxHQUFHLENBQ0osQ0FBQztJQUNGLElBQ0UsQ0FBQyxjQUFjO1FBQ2YsY0FBYyxDQUFDLFNBQVMsS0FBSyxjQUFjO1FBQzNDLGNBQWMsQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUN2QyxDQUFDO1FBQ0Qsc0NBQXNDO1FBQ3RDLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxvQkFBb0IsQ0FDN0MsT0FBTyxFQUNQLE9BQU8sRUFDUCxNQUFNLEVBQ04sVUFBVSxFQUNWLEdBQUcsQ0FDSixDQUFDO0lBQ0YsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQiw4REFBOEQ7UUFDOUQsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUtoRCxDQUFDO0lBQ0YsSUFBSSxPQUFPLFNBQVMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEMsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLElBQUksR0FBUztRQUNqQixLQUFLO1FBQ0wsTUFBTTtRQUNOLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztRQUN0QixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7UUFDNUIsT0FBTyxFQUFFLGFBQWE7UUFDdEIsU0FBUyxFQUFFLGVBQWU7UUFDMUIsV0FBVyxFQUFFLE9BQU87UUFDcEIsU0FBUyxFQUFFLGNBQWMsQ0FBQyxTQUFTO1FBQ25DLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVztRQUN2QyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJO1FBQ3RDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxJQUFJLEtBQUs7S0FDdEMsQ0FBQztJQUNGLE1BQU0sY0FBYyxDQUNsQixVQUFVLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FDdEMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILEtBQUssVUFBVSxpQ0FBaUMsQ0FDOUMsT0FBZSxFQUNmLEtBQWEsRUFDYixLQUFhLEVBQ2IsTUFBYyxFQUNkLGdCQUF3QjtJQUV4QixNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztJQUNwRSxNQUFNLEdBQUcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDNUQsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNSLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsT0FBTyxRQUFRLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBb0MsRUFDcEMsR0FBVyxFQUNYLEVBQW9CO0lBRXBCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsTUFBTSxPQUFPLEdBQTBCLEVBQUUsQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ3ZCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxrRUFBa0U7WUFDbEUsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDTCxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNwQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyQixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLE9BQWUsRUFDZixLQUFhO0lBRWIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixzRUFBc0U7UUFDdEUsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUM7WUFDckQsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILEtBQUssVUFBVSwwQkFBMEIsQ0FDdkMsT0FBZSxFQUNmLEtBQWEsRUFDYixHQUF1QixFQUN2QixRQUFXO0lBRVgsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUMxQixVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQ3ZDLGlCQUFpQixDQUNsQixDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQU07WUFDZCxHQUFHLFFBQVE7WUFDWCxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsSUFBSSxRQUFRLENBQUMsVUFBVTtTQUNyRCxDQUFDO1FBQ0YsTUFBTSxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRTtZQUM3RCxTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVVELE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsT0FBZSxFQUNmLEdBQVk7SUFFWiw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLHdFQUF3RTtJQUN4RSwwREFBMEQ7SUFDMUQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUM1QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUNuQyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ25ELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDMUQsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7SUFFOUIsU0FBUyxpQkFBaUIsQ0FBQyxTQUFpQjtRQUMxQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU87UUFDVCxDQUFDO1FBQ0QsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixxQkFBcUIsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsSUFBSSxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFhO1FBQ2xDLEtBQUssTUFBTSxVQUFVLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzdELGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsU0FBUyxVQUFVO1FBQ2pCLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixxQkFBcUIsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFNBQVMsVUFBVSxDQUNqQixTQUFpQixFQUNqQixXQUFrQixFQUNsQixlQUF1QjtRQUV2QixJQUFJLGVBQWUsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFDLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FDRSxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUM7WUFDbkIsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLHFCQUFxQjtnQkFDdkMscUJBQXFCLEdBQUcsZUFBZSxHQUFHLG1CQUFtQixDQUFDLEVBQ2hFLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBZSxDQUFDO1lBQzVELGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2QyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2pELHFCQUFxQixJQUFJLGVBQWUsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FDZixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFVLENBQUM7UUFDakUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLHdFQUF3RTtJQUN4RSx1RUFBdUU7SUFDdkUscUVBQXFFO0lBQ3JFLHFFQUFxRTtJQUNyRSxzREFBc0Q7SUFDdEQsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBWSxFQUNaLFNBQWlCLEVBQ2pCLGVBQXVCO1FBRXZCLGlFQUFpRTtRQUNqRSxnREFBZ0Q7UUFDaEQsSUFBSSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRCxJQUFJLGVBQWUsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1lBQzFDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQ3pDLENBQUM7UUFDRixJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixVQUFVLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLFVBQVUsVUFBVSxDQUFDLEtBQVk7UUFDcEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUMxQixPQUFPLEVBQ1AsUUFBUSxFQUNSLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQ2pDLEdBQUcsQ0FDSixDQUFDO1FBQ0YsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN4QyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxpRUFBaUU7SUFDakUsaUVBQWlFO0lBQ2pFLHlEQUF5RDtJQUN6RCxnRUFBZ0U7SUFDaEUsK0RBQStEO0lBQy9ELDhEQUE4RDtJQUM5RCxnQkFBZ0I7SUFDaEIsRUFBRTtJQUNGLDREQUE0RDtJQUM1RCwwREFBMEQ7SUFDMUQsd0JBQXdCO0lBQ3hCLEVBQUU7SUFDRiwyREFBMkQ7SUFDM0QsOERBQThEO0lBQzlELDZEQUE2RDtJQUM3RCxpREFBaUQ7SUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFFdEQsT0FBTztRQUNMLFVBQVU7UUFDVixLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTTtZQUM5QixpRUFBaUU7WUFDakUsdUVBQXVFO1lBQ3ZFLG9FQUFvRTtZQUNwRSxzRUFBc0U7WUFDdEUsc0VBQXNFO1lBQ3RFLEVBQUU7WUFDRixpRUFBaUU7WUFDakUsNkRBQTZEO1lBQzdELDBEQUEwRDtZQUMxRCxrRUFBa0U7WUFDbEUsa0NBQWtDO1lBQ2xDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ2xDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsSUFBSSxlQUFlLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdEUsa0JBQWtCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsd0VBQXdFO1lBQ3hFLG1FQUFtRTtZQUNuRSx1RUFBdUU7WUFDdkUsaUVBQWlFO1lBQ2pFLGtDQUFrQztZQUNsQyxNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYztnQkFDakMsSUFBSSxDQUFDLFNBQVMsS0FBSyxnQkFBZ0I7Z0JBQ25DLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYTtnQkFDaEMsSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLENBQUM7WUFDckMsSUFBSSxXQUFXLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxPQUFPLEdBQUcsR0FBRztvQkFDakIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksR0FBRyxFQUFFO29CQUN6QyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBQ0QsMERBQTBEO1lBQzFELGlFQUFpRTtZQUNqRSw2REFBNkQ7WUFDN0QsaUVBQWlFO1lBQ2pFLGdFQUFnRTtZQUNoRSw4REFBOEQ7WUFDOUQsMkRBQTJEO1lBQzNELGdFQUFnRTtZQUNoRSw4REFBOEQ7WUFDOUQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyRSxNQUFNLE9BQU8sR0FBRyxHQUFHO29CQUNqQixDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsU0FBUyxHQUFHLEVBQUU7b0JBQzlDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsYUFBYSxPQUFPLENBQUM7Z0JBQzFDLE9BQU8saUJBQWlCLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFDRCxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBRXBCLEtBQUssVUFBVSxVQUFVO2dCQUN2Qiw4REFBOEQ7Z0JBQzlELDREQUE0RDtnQkFDNUQsNkRBQTZEO2dCQUM3RCw2REFBNkQ7Z0JBQzdELG9CQUFvQjtnQkFDcEIsSUFBSSxPQUFPLEdBQUcsUUFBUSxhQUFhLEVBQUUsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUV2QixnRkFBZ0Y7Z0JBQ2hGLElBQUksY0FBc0IsQ0FBQztnQkFDM0IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGFBQWEsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUNqRSxjQUFjLEdBQUcsUUFBUSxhQUFhLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxDQUFDO3FCQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFDekIsQ0FBQztnQkFFRCwwRUFBMEU7Z0JBQzFFLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhLElBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztvQkFDOUQsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQzNDLGNBQWMsRUFDZCxPQUFPLENBQ1IsQ0FBQztvQkFDRixJQUFJLGVBQWUsRUFBRSxDQUFDO3dCQUNwQixNQUFNLElBQUksa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2hELENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxrRkFBa0Y7Z0JBQ2xGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxvQkFBb0IsQ0FBQztnQkFFdEUsbUVBQW1FO2dCQUNuRSwrRUFBK0U7Z0JBQy9FLDhFQUE4RTtnQkFDOUUseUVBQXlFO2dCQUN6RSxJQUFJLFVBQVUsR0FBdUIsSUFBSSxDQUFDO2dCQUMxQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ3BFLElBQ0UsSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhO29CQUNoQyxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ2pELENBQUM7b0JBQ0QsVUFBVSxHQUFHLE1BQU0sb0JBQW9CLENBQ3JDLE9BQU8sRUFDUCxNQUFNLEVBQ04sY0FBYyxFQUNkLGlCQUFpQixFQUNqQixHQUFHLENBQ0osQ0FBQztvQkFFRixrRUFBa0U7b0JBQ2xFLCtEQUErRDtvQkFDL0QsbUNBQW1DO29CQUNuQyxJQUNFLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYTt3QkFDaEMsQ0FBQyxVQUFVO3dCQUNYLFdBQVcsSUFBSSxJQUFJO3dCQUNuQixJQUFJLENBQUMsU0FBUyxFQUNkLENBQUM7d0JBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBT3pCLENBQUM7d0JBQ0YsSUFDRSxZQUFZLENBQUMsWUFBWTs0QkFDekIsWUFBWSxDQUFDLFlBQVk7NEJBQ3pCLFlBQVksQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUNoQyxDQUFDOzRCQUNELHdCQUF3QixDQUN0QixNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUMvQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ25DLEVBQ0Q7Z0NBQ0UsdUJBQXVCLEVBQ3JCLFlBQVksQ0FBQyx1QkFBdUIsS0FBSyxJQUFJOzZCQUNoRCxDQUNGLENBQUM7NEJBQ0YsNkRBQTZEOzRCQUM3RCwyREFBMkQ7NEJBQzNELDBEQUEwRDs0QkFDMUQscUNBQXFDOzRCQUNyQyxNQUFNLFVBQVUsR0FBZ0I7Z0NBQzlCLEtBQUssRUFBRSxjQUFjO2dDQUNyQixZQUFZLEVBQUUsWUFBWSxDQUFDLFlBQVk7Z0NBQ3ZDLE1BQU0sRUFBRSxTQUFTO2dDQUNqQixZQUFZLEVBQUUsWUFBWSxDQUFDLFlBQVk7Z0NBQ3ZDLFdBQVcsRUFBRSxvQkFBb0I7Z0NBQ2pDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxnQkFBZ0I7Z0NBQy9DLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztnQ0FDekIsTUFBTSxFQUFFLFNBQVM7Z0NBQ2pCLEtBQUssRUFBRSxTQUFTO2dDQUNoQixTQUFTLEVBQUUsU0FBUztnQ0FDcEIsV0FBVyxFQUFFLFNBQVM7Z0NBQ3RCLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxJQUFJLEVBQUU7Z0NBQ3pDLFNBQVMsRUFBRSxHQUFHO2dDQUNkLFNBQVMsRUFBRSxHQUFHOzZCQUNmLENBQUM7NEJBQ0YsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FDbEMsT0FBTyxFQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUN6QyxDQUFDOzRCQUVGLElBQUksT0FBTyxFQUFFLENBQUM7Z0NBQ1oseURBQXlEO2dDQUN6RCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQ0FDcEQsTUFBTSxlQUFlLEdBQVU7b0NBQzdCLFNBQVMsRUFBRSxhQUFhO29DQUN4QixLQUFLLEVBQUUsY0FBYztvQ0FDckIsT0FBTyxFQUFFLGlCQUFpQjtvQ0FDMUIsU0FBUyxFQUFFLEdBQUc7b0NBQ2QsV0FBVyxFQUFFLG9CQUFvQjtvQ0FDakMsU0FBUyxFQUFFO3dDQUNULFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWTt3Q0FDdkMsWUFBWSxFQUFFLFlBQVksQ0FBQyxZQUFZO3dDQUN2QyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7d0NBQ3pCLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxnQkFBZ0I7d0NBQy9DLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVTt3Q0FDbkMsdUJBQXVCLEVBQ3JCLFlBQVksQ0FBQyx1QkFBdUI7cUNBQ3ZDO2lDQUNGLENBQUM7Z0NBQ0YsTUFBTSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7Z0NBQ2xDLFVBQVUsR0FBRyxVQUFVLENBQUM7NEJBQzFCLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixxREFBcUQ7Z0NBQ3JELDZEQUE2RDtnQ0FDN0QsVUFBVSxHQUFHLE1BQU0sb0JBQW9CLENBQ3JDLE9BQU8sRUFDUCxNQUFNLEVBQ04sY0FBYyxFQUNkLGlCQUFpQixFQUNqQixHQUFHLENBQ0osQ0FBQzs0QkFDSixDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELDREQUE0RDtnQkFDNUQsMkRBQTJEO2dCQUMzRCw4REFBOEQ7Z0JBQzlELDBDQUEwQztnQkFDMUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNuRCxNQUFNLElBQUksd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNqRCxNQUFNLElBQUksd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3JELENBQUM7Z0JBRUQsK0RBQStEO2dCQUMvRCxnREFBZ0Q7Z0JBQ2hELCtEQUErRDtnQkFDL0QscUVBQXFFO2dCQUNyRSw2RkFBNkY7Z0JBQzdGLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YsOENBQThDO29CQUM5QyxJQUFJLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO3dCQUMvQyxNQUFNLElBQUksb0JBQW9CLENBQzVCLFVBQVUsQ0FBQyxXQUFZLEVBQ3ZCLG9CQUFvQixDQUNyQixDQUFDO29CQUNKLENBQUM7b0JBRUQsc0RBQXNEO29CQUN0RCxJQUFJLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO3dCQUNoRCxPQUFPLGlCQUFpQixDQUN0QixPQUFPLEVBQ1AsY0FBYyxFQUNkLElBQUksRUFDSixVQUFVLEVBQ1YsTUFBTSxDQUNQLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO2dCQUVELCtEQUErRDtnQkFDL0QsdURBQXVEO2dCQUN2RCwrREFBK0Q7Z0JBRS9ELDhEQUE4RDtnQkFDOUQscUVBQXFFO2dCQUNyRSxrRUFBa0U7Z0JBQ2xFLHNFQUFzRTtnQkFDdEUsc0VBQXNFO2dCQUN0RSw4REFBOEQ7Z0JBQzlELE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWM7b0JBQ2pDLFdBQVcsSUFBSSxJQUFJO29CQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7b0JBQ2hCLE9BQVEsSUFBSSxDQUFDLFNBQW9DLENBQUMsUUFBUTt3QkFDeEQsUUFBUTtvQkFDVCxJQUFJLENBQUMsU0FBaUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDO2dCQUU5RCxnQ0FBZ0M7Z0JBQ2hDLElBQUksVUFBVSxJQUFJLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUNqRSxNQUFNLGlCQUFpQixHQUFHO3dCQUN4QixhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsWUFBWTtxQkFDYixDQUFDO29CQUVGLDBFQUEwRTtvQkFDMUUsSUFDRSxJQUFJLENBQUMsU0FBUyxLQUFLLGVBQWU7d0JBQ2xDLFVBQVUsQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUNqQyxDQUFDO3dCQUNELHFDQUFxQzt3QkFDckMsTUFBTSxLQUFLLEdBQVU7NEJBQ25CLEdBQUcsSUFBSTs0QkFDUCxLQUFLLEVBQUUsY0FBYzs0QkFDckIsT0FBTzs0QkFDUCxTQUFTLEVBQUUsR0FBRzs0QkFDZCxXQUFXLEVBQUUsb0JBQW9CO3lCQUNsQyxDQUFDO3dCQUNGLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN4QixNQUFNLFdBQVcsR0FDZixNQUFNLEVBQUUsV0FBVyxJQUFJLDJCQUEyQixDQUFDO3dCQUNyRCxPQUFPOzRCQUNMLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDOzRCQUM3QyxHQUFHLEVBQUUsVUFBVTt5QkFDaEIsQ0FBQztvQkFDSixDQUFDO29CQUVELCtEQUErRDtvQkFDL0QsMENBQTBDO29CQUMxQyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssYUFBYSxFQUFFLENBQUM7d0JBQ3JDLE1BQU0sSUFBSSxlQUFlLENBQ3ZCLGlCQUFpQixjQUFjLG1DQUFtQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQ3ZGLENBQUM7b0JBQ0osQ0FBQztvQkFFRCwrREFBK0Q7b0JBQy9ELElBQ0UsaUJBQWlCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQzFDLElBQUksQ0FBQyxTQUFTLEtBQUssZUFBZSxFQUNsQyxDQUFDO3dCQUNELE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsOENBQThDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FDbkUsQ0FBQztvQkFDSixDQUFDO29CQUVELGdFQUFnRTtvQkFDaEUsbUVBQW1FO29CQUNuRSwrREFBK0Q7b0JBQy9ELDZEQUE2RDtvQkFDN0QsSUFDRSxJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWM7d0JBQ2pDLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYzt3QkFDakMsSUFBSSxDQUFDLFNBQVMsS0FBSyxjQUFjO3dCQUNqQyxhQUFhLEVBQ2IsQ0FBQzt3QkFDRCxNQUFNLElBQUksbUJBQW1CLENBQzNCLHdEQUF3RCxVQUFVLENBQUMsTUFBTSxHQUFHLENBQzdFLENBQUM7b0JBQ0osQ0FBQztvQkFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7d0JBQ2xDLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsbURBQW1ELFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FDeEUsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7Z0JBRUQsOERBQThEO2dCQUM5RCxrRUFBa0U7Z0JBQ2xFLElBQUksYUFBYSxHQUFnQixJQUFJLENBQUM7Z0JBQ3RDLE1BQU0sVUFBVSxHQUFHO29CQUNqQixjQUFjO29CQUNkLGdCQUFnQjtvQkFDaEIsYUFBYTtvQkFDYixlQUFlO2lCQUNoQixDQUFDO2dCQUNGLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUM5RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDbkUsYUFBYSxHQUFHLE1BQU0sb0JBQW9CLENBQ3hDLE9BQU8sRUFDUCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixHQUFHLENBQ0osQ0FBQztvQkFFRixrRUFBa0U7b0JBQ2xFLG1FQUFtRTtvQkFDbkUsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNyQyxNQUFNLElBQUksa0JBQWtCLENBQzFCLFNBQVMsSUFBSSxDQUFDLGFBQWEsYUFBYSxDQUN6QyxDQUFDO29CQUNKLENBQUM7b0JBRUQsbUVBQW1FO29CQUNuRSxrRUFBa0U7b0JBQ2xFLHNFQUFzRTtvQkFDdEUscUVBQXFFO29CQUNyRSw4REFBOEQ7b0JBQzlELHNFQUFzRTtvQkFDdEUsb0VBQW9FO29CQUNwRSwrREFBK0Q7b0JBQy9ELCtDQUErQztvQkFDL0MsSUFBSSxhQUFhLElBQUksYUFBYSxFQUFFLENBQUM7d0JBQ25DLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsU0FBUyxJQUFJLENBQUMsYUFBYSxtQkFBbUIsQ0FDL0MsQ0FBQztvQkFDSixDQUFDO29CQUVELG9FQUFvRTtvQkFDcEUsbUVBQW1FO29CQUNuRSwyREFBMkQ7b0JBQzNELElBQUksYUFBYSxFQUFFLENBQUM7d0JBQ2xCLElBQUksb0JBQW9CLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7NEJBQy9DLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IseUNBQXlDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FDakUsQ0FBQzt3QkFDSixDQUFDO3dCQUVELG9FQUFvRTt3QkFDcEUsSUFBSSxVQUFVLElBQUksMkJBQTJCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7NEJBQ2pFLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQ0FDdkMsTUFBTSxJQUFJLGVBQWUsQ0FDdkIsNERBQTRELFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FDakYsQ0FBQzs0QkFDSixDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELDJDQUEyQztnQkFDM0MsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDeEUsSUFDRSw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDckQsSUFBSSxDQUFDLGFBQWEsRUFDbEIsQ0FBQztvQkFDRCxNQUFNLFlBQVksR0FBRyxNQUFNLG9CQUFvQixDQUM3QyxPQUFPLEVBQ1AsT0FBTyxFQUNQLElBQUksQ0FBQyxhQUFhLEVBQ2xCLFVBQVUsRUFDVixHQUFHLENBQ0osQ0FBQztvQkFFRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ2xELENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCx3REFBd0Q7Z0JBQ3hELHlEQUF5RDtnQkFDekQsb0RBQW9EO2dCQUNwRCwwREFBMEQ7Z0JBQzFELG9CQUFvQjtnQkFDcEIsSUFBSSxLQUFLLEdBQVU7b0JBQ2pCLEdBQUcsSUFBSTtvQkFDUCxLQUFLLEVBQUUsY0FBYztvQkFDckIsT0FBTztvQkFDUCxTQUFTLEVBQUUsR0FBRztvQkFDZCxXQUFXLEVBQUUsb0JBQW9CO2lCQUNsQyxDQUFDO2dCQUNGLHFFQUFxRTtnQkFDckUsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGFBQWEsSUFBSSxXQUFXLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQzdELE9BQVEsS0FBYSxDQUFDLFNBQVMsQ0FBQztnQkFDbEMsQ0FBQztnQkFDRCxxRUFBcUU7Z0JBQ3JFLHNFQUFzRTtnQkFDdEUsa0VBQWtFO2dCQUNsRSxxQ0FBcUM7Z0JBQ3JDLElBQ0UsYUFBYTtvQkFDYixXQUFXLElBQUksS0FBSztvQkFDbkIsS0FBaUQsQ0FBQyxTQUFTLEVBQzVELENBQUM7b0JBQ0QsTUFBTSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FDdEMsS0FDRCxDQUFDLFNBQVMsQ0FBQztvQkFDWCxLQUFnRCxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3JFLENBQUM7Z0JBRUQsK0NBQStDO2dCQUMvQyxJQUFJLEdBQTRCLENBQUM7Z0JBQ2pDLElBQUksSUFBc0IsQ0FBQztnQkFDM0IsSUFBSSxJQUFzQixDQUFDO2dCQUMzQixJQUFJLElBQXNCLENBQUM7Z0JBQzNCLHNFQUFzRTtnQkFDdEUsc0VBQXNFO2dCQUN0RSxrREFBa0Q7Z0JBQ2xELElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2dCQUM5Qiw4REFBOEQ7Z0JBQzlELDBEQUEwRDtnQkFDMUQsNkRBQTZEO2dCQUM3RCwyREFBMkQ7Z0JBQzNELDREQUE0RDtnQkFDNUQsMkRBQTJEO2dCQUMzRCw0REFBNEQ7Z0JBQzVELDJDQUEyQztnQkFDM0MsSUFBSSxzQkFBMEQsQ0FBQztnQkFFL0Qsd0VBQXdFO2dCQUN4RSx1QkFBdUI7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUM1RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FPcEIsQ0FBQztvQkFDRix3QkFBd0IsQ0FDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUM5RCxHQUFHO3dCQUNILEtBQUs7cUJBQ04sQ0FBQyxDQUFDLEVBQ0g7d0JBQ0UsdUJBQXVCLEVBQUUsT0FBTyxDQUFDLHVCQUF1QixLQUFLLElBQUk7cUJBQ2xFLENBQ0YsQ0FBQztvQkFDRixHQUFHLEdBQUc7d0JBQ0osS0FBSyxFQUFFLGNBQWM7d0JBQ3JCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTt3QkFDbEMsTUFBTSxFQUFFLFNBQVM7d0JBQ2pCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTt3QkFDbEMseURBQXlEO3dCQUN6RCxXQUFXLEVBQUUsb0JBQW9CO3dCQUNqQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO3dCQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7d0JBQ3BCLE1BQU0sRUFBRSxTQUFTO3dCQUNqQixLQUFLLEVBQUUsU0FBUzt3QkFDaEIsU0FBUyxFQUFFLFNBQVM7d0JBQ3BCLFdBQVcsRUFBRSxTQUFTO3dCQUN0QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxFQUFFO3dCQUNwQyxTQUFTLEVBQUUsR0FBRzt3QkFDZCxTQUFTLEVBQUUsR0FBRztxQkFDZixDQUFDO29CQUNGLGdFQUFnRTtvQkFDaEUsa0VBQWtFO29CQUNsRSxvRUFBb0U7b0JBQ3BFLGlEQUFpRDtvQkFDakQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FDbEMsT0FBTyxFQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FDckMsQ0FBQztvQkFDRixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2IsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixpQkFBaUIsY0FBYyxrQkFBa0IsQ0FDbEQsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGFBQWEsRUFBRSxDQUFDO29CQUM1Qyx3REFBd0Q7b0JBQ3hELElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2YseURBQXlEO3dCQUN6RCwwREFBMEQ7d0JBQzFELHlEQUF5RDt3QkFDekQsMkRBQTJEO3dCQUMzRCx5Q0FBeUM7d0JBQ3pDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQzs0QkFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQzt3QkFDN0IsQ0FBQzt3QkFFRCxHQUFHLEdBQUcsTUFBTSwwQkFBMEIsQ0FDcEMsT0FBTyxFQUNQLGNBQWMsRUFDZCxHQUFHLEVBQ0g7NEJBQ0UsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLOzRCQUN2QixZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVk7NEJBQ3JDLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTs0QkFDckMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXOzRCQUNuQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCOzRCQUM3QyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7NEJBQ3ZCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUzs0QkFDL0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTOzRCQUMvQixNQUFNLEVBQUUsU0FBUzs0QkFDakIsTUFBTSxFQUFFLFNBQVM7NEJBQ2pCLEtBQUssRUFBRSxTQUFTOzRCQUNoQixXQUFXLEVBQUUsU0FBUzs0QkFDdEIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLElBQUksR0FBRzs0QkFDdEMsU0FBUyxFQUFFLEdBQUc7NEJBQ2QsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVO3lCQUNsQyxDQUNGLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNyRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBNkIsQ0FBQztvQkFDekQsd0RBQXdEO29CQUN4RCxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNmLEdBQUcsR0FBRyxNQUFNLDBCQUEwQixDQUNwQyxPQUFPLEVBQ1AsY0FBYyxFQUNkLEdBQUcsRUFDSDs0QkFDRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7NEJBQ3ZCLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTs0QkFDckMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZOzRCQUNyQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7NEJBQ25DLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7NEJBQzdDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSzs0QkFDdkIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTOzRCQUMvQixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7NEJBQy9CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUzs0QkFDL0IsTUFBTSxFQUFFLFdBQVc7NEJBQ25CLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTs0QkFDNUIsS0FBSyxFQUFFLFNBQVM7NEJBQ2hCLFdBQVcsRUFBRSxHQUFHOzRCQUNoQixTQUFTLEVBQUUsR0FBRzs0QkFDZCxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVU7eUJBQ2xDLENBQ0YsQ0FBQzt3QkFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7NEJBQ2hCLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUM7NEJBQzdDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUM7eUJBQzlDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVksSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUd2QixDQUFDO29CQUNGLHdEQUF3RDtvQkFDeEQsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZiw2REFBNkQ7d0JBQzdELGlFQUFpRTt3QkFDakUsZ0VBQWdFO3dCQUNoRSxHQUFHLEdBQUcsTUFBTSwwQkFBMEIsQ0FDcEMsT0FBTyxFQUNQLGNBQWMsRUFDZCxHQUFHLEVBQ0g7NEJBQ0UsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLOzRCQUN2QixZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVk7NEJBQ3JDLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTs0QkFDckMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXOzRCQUNuQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCOzRCQUM3QyxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7NEJBQ3ZCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUzs0QkFDL0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTOzRCQUMvQixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7NEJBQy9CLE1BQU0sRUFBRSxRQUFROzRCQUNoQixNQUFNLEVBQUUsU0FBUzs0QkFDakIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFtQjs0QkFDckMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTOzRCQUMvQixXQUFXLEVBQUUsR0FBRzs0QkFDaEIsU0FBUyxFQUFFLEdBQUc7NEJBQ2QsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVO3lCQUNsQyxDQUNGLENBQUM7d0JBQ0YsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDOzRCQUNoQixvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDOzRCQUM3QyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDO3lCQUM5QyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQUUsQ0FBQztvQkFDOUMsd0RBQXdEO29CQUN4RCxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNmLEdBQUcsR0FBRyxNQUFNLDBCQUEwQixDQUNwQyxPQUFPLEVBQ1AsY0FBYyxFQUNkLEdBQUcsRUFDSDs0QkFDRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7NEJBQ3ZCLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTs0QkFDckMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxZQUFZOzRCQUNyQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVc7NEJBQ25DLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0I7NEJBQzdDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSzs0QkFDdkIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTOzRCQUMvQixTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7NEJBQy9CLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUzs0QkFDL0IsTUFBTSxFQUFFLFdBQVc7NEJBQ25CLE1BQU0sRUFBRSxTQUFTOzRCQUNqQixLQUFLLEVBQUUsU0FBUzs0QkFDaEIsV0FBVyxFQUFFLEdBQUc7NEJBQ2hCLFNBQVMsRUFBRSxHQUFHOzRCQUNkLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVTt5QkFDbEMsQ0FDRixDQUFDO3dCQUNGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQzs0QkFDaEIsb0JBQW9CLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQzs0QkFDN0Msb0JBQW9CLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQzt5QkFDOUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUN2RCxHQUFHLEdBQUcsTUFBTSxlQUFlLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FDMUIsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxFQUNoRCxpQkFBaUIsQ0FDbEIsQ0FBQzt3QkFDRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7NEJBQ1gsTUFBTSxJQUFJLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUNyRCxDQUFDO3dCQUNELHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFOzRCQUMvQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDOzRCQUMzQyx1QkFBdUIsRUFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsS0FBSyxJQUFJO3lCQUNsRCxDQUFDLENBQUM7d0JBQ0gsNERBQTREO3dCQUM1RCwrREFBK0Q7d0JBQy9ELDhEQUE4RDt3QkFDOUQsMERBQTBEO3dCQUMxRCw4REFBOEQ7d0JBQzlELGVBQWU7d0JBQ2YsSUFDRSxJQUFJLENBQUMsYUFBYTs0QkFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFDekMsQ0FBQzs0QkFDRCxNQUFNLFlBQVksR0FBRyxHQUFHO2dDQUN0QixDQUFDLENBQUMsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsWUFBWSxHQUFHLEVBQUU7Z0NBQzFELENBQUMsQ0FBQyxHQUFHLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxVQUFVLENBQUM7NEJBQ3RELE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUNwQyxPQUFPLEVBQ1AsUUFBUSxFQUNSLFlBQVksRUFDWixZQUFZLENBQ2IsQ0FBQzs0QkFDRixNQUFNLFdBQVcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQzNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQ0FDakIsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixvQkFBb0IsSUFBSSxDQUFDLGFBQWEsa0JBQWtCLENBQ3pELENBQUM7NEJBQ0osQ0FBQzt3QkFDSCxDQUFDO3dCQUNELE1BQU0sSUFBSSxHQUFHOzRCQUNYLEdBQUcsS0FBSzs0QkFDUixVQUFVLEVBQUUscUJBQXFCLENBQy9CLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUN2Qjs0QkFDRCxTQUFTLEVBQUUsR0FBRzt5QkFDQSxDQUFDO3dCQUNqQixNQUFNLFNBQVMsQ0FDYixVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLEVBQ2hELElBQUksRUFDSixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FDcEIsQ0FBQzt3QkFDRixPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNO2dCQUNMLHdCQUF3QjtnQkFDeEIsSUFBSSxDQUFDLFNBQVMsS0FBSyxjQUFjO29CQUNqQyxXQUFXLElBQUksSUFBSSxFQUNuQixDQUFDO29CQUNELHFGQUFxRjtvQkFDckYscUVBQXFFO29CQUNyRSxrRUFBa0U7b0JBQ2xFLG9FQUFvRTtvQkFDcEUseURBQXlEO29CQUN6RCw4REFBOEQ7b0JBQzlELDhEQUE4RDtvQkFDOUQscUVBQXFFO29CQUNyRSwrREFBK0Q7b0JBQy9ELGtFQUFrRTtvQkFDbEUsUUFBUTtvQkFDUixNQUFNLG1CQUFtQixHQUFHLEdBQUc7d0JBQzdCLENBQUMsQ0FBQyxHQUFHLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxZQUFZLEdBQUcsRUFBRTt3QkFDMUQsQ0FBQyxDQUFDLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLFVBQVUsQ0FBQztvQkFDdEQsTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FDM0MsT0FBTyxFQUNQLFFBQVEsRUFDUixPQUFPLEVBQ1AsbUJBQW1CLENBQ3BCLENBQUM7b0JBQ0YsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGNBQWMsQ0FDN0MsbUJBQW1CLEVBQ25CLEVBQUUsQ0FDSCxDQUFDO29CQUNGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO3dCQUN4QixNQUFNLElBQUksbUJBQW1CLENBQzNCLFNBQVMsSUFBSSxDQUFDLGFBQWEsbUJBQW1CLENBQy9DLENBQUM7b0JBQ0osQ0FBQztvQkFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FHckIsQ0FBQztvQkFDRixJQUFJLEdBQUc7d0JBQ0wsS0FBSyxFQUFFLGNBQWM7d0JBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTt3QkFDMUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO3dCQUMzQixNQUFNLEVBQUUsU0FBUzt3QkFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO3dCQUNyQixNQUFNLEVBQUUsU0FBUzt3QkFDakIsS0FBSyxFQUFFLFNBQVM7d0JBQ2hCLE9BQU8sRUFBRSxDQUFDO3dCQUNWLFNBQVMsRUFBRSxTQUFTO3dCQUNwQixXQUFXLEVBQUUsU0FBUzt3QkFDdEIsU0FBUyxFQUFFLEdBQUc7d0JBQ2QsU0FBUyxFQUFFLEdBQUc7d0JBQ2QsMERBQTBEO3dCQUMxRCxXQUFXLEVBQUUsb0JBQW9CO3FCQUNsQyxDQUFDO29CQUNGLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNuRSxNQUFNLFNBQVMsQ0FDYixVQUFVLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsRUFDbkQsSUFBSSxDQUNMLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQzdDLDZEQUE2RDtvQkFDN0Qsa0VBQWtFO29CQUNsRSwyREFBMkQ7b0JBRTNELGtFQUFrRTtvQkFDbEUsbUVBQW1FO29CQUNuRSxrRUFBa0U7b0JBQ2xFLG9FQUFvRTtvQkFDcEUscUVBQXFFO29CQUNyRSxvRUFBb0U7b0JBQ3BFLElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxFQUFFLENBQUM7d0JBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUdyQixDQUFDO3dCQUNGLE1BQU0sbUJBQW1CLEdBQUcsR0FBRzs0QkFDN0IsQ0FBQyxDQUFDLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLFlBQVksR0FBRyxFQUFFOzRCQUMxRCxDQUFDLENBQUMsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsVUFBVSxDQUFDO3dCQUN0RCxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUMzQyxPQUFPLEVBQ1AsUUFBUSxFQUNSLE9BQU8sRUFDUCxtQkFBbUIsQ0FDcEIsQ0FBQzt3QkFDRixNQUFNLGtCQUFrQixHQUFHLE1BQU0sY0FBYyxDQUM3QyxtQkFBbUIsRUFDbkIsRUFBRSxDQUNILENBQUM7d0JBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7NEJBQ3hCLDJEQUEyRDs0QkFDM0QsNkRBQTZEOzRCQUM3RCxtREFBbUQ7NEJBQ25ELCtEQUErRDs0QkFDL0QsK0RBQStEOzRCQUMvRCwwREFBMEQ7NEJBQzFELDREQUE0RDs0QkFDNUQsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixTQUFTLElBQUksQ0FBQyxhQUFhLG1CQUFtQixDQUMvQyxDQUFDO3dCQUNKLENBQUM7NkJBQU0sQ0FBQzs0QkFDTixNQUFNLFdBQVcsR0FBUztnQ0FDeEIsS0FBSyxFQUFFLGNBQWM7Z0NBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtnQ0FDMUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dDQUMzQixNQUFNLEVBQUUsU0FBUztnQ0FDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO2dDQUNyQixNQUFNLEVBQUUsU0FBUztnQ0FDakIsS0FBSyxFQUFFLFNBQVM7Z0NBQ2hCLE9BQU8sRUFBRSxDQUFDO2dDQUNWLFNBQVMsRUFBRSxTQUFTO2dDQUNwQixXQUFXLEVBQUUsU0FBUztnQ0FDdEIsU0FBUyxFQUFFLEdBQUc7Z0NBQ2QsU0FBUyxFQUFFLEdBQUc7Z0NBQ2QsV0FBVyxFQUFFLG9CQUFvQjs2QkFDbEMsQ0FBQzs0QkFDRixNQUFNLFNBQVMsQ0FDYixVQUFVLENBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxHQUFHLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3pDLEdBQUcsQ0FDSixFQUNELFdBQVcsQ0FDWixDQUFDOzRCQUNGLCtEQUErRDs0QkFDL0QsMkRBQTJEOzRCQUMzRCw4REFBOEQ7NEJBQzlELDBEQUEwRDs0QkFDMUQsNkRBQTZEOzRCQUM3RCw4REFBOEQ7NEJBQzlELDBEQUEwRDs0QkFDMUQsb0RBQW9EOzRCQUNwRCxNQUFNLGtCQUFrQixHQUFHLFFBQVEsYUFBYSxFQUFFLEVBQUUsQ0FBQzs0QkFDckQsTUFBTSxnQkFBZ0IsR0FBVTtnQ0FDOUIsU0FBUyxFQUFFLGNBQWM7Z0NBQ3pCLEtBQUssRUFBRSxjQUFjO2dDQUNyQixPQUFPLEVBQUUsa0JBQWtCO2dDQUMzQixTQUFTLEVBQUUsR0FBRztnQ0FDZCxXQUFXLEVBQUUsb0JBQW9CO2dDQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0NBQ2pDLFNBQVMsRUFBRTtvQ0FDVCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7b0NBQzNCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztpQ0FDdEI7NkJBQ0YsQ0FBQzs0QkFDRixNQUFNLFNBQVMsQ0FDYixVQUFVLENBQ1IsT0FBTyxFQUNQLFFBQVEsRUFDUixHQUFHLGNBQWMsSUFBSSxrQkFBa0IsRUFBRSxFQUN6QyxHQUFHLENBQ0osRUFDRCxnQkFBZ0IsQ0FDakIsQ0FBQzs0QkFDRixhQUFhLEdBQUcsV0FBVyxDQUFDOzRCQUM1QixpQkFBaUIsR0FBRyxJQUFJLENBQUM7d0JBQzNCLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQix3REFBd0Q7d0JBQ3hELElBQ0UsYUFBYSxDQUFDLFVBQVU7NEJBQ3hCLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUMvQyxDQUFDOzRCQUNELE1BQU0sSUFBSSxhQUFhLENBQ3JCLHNCQUFzQixJQUFJLENBQUMsYUFBYSxrREFBa0QsRUFDMUY7Z0NBQ0UsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQ25CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQ3pEOzZCQUNGLENBQ0YsQ0FBQzt3QkFDSixDQUFDO3dCQUVELDREQUE0RDt3QkFDNUQsOERBQThEO3dCQUM5RCxpRUFBaUU7d0JBQ2pFLDhEQUE4RDt3QkFDOUQsc0RBQXNEO3dCQUN0RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkUsTUFBTSxTQUFTLEdBQUcsTUFBTSxvQkFBb0IsQ0FDMUMsT0FBTyxFQUNQLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLEdBQUcsQ0FDSixDQUFDO3dCQUNGLElBQUksU0FBUyxJQUFJLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDOzRCQUN4RCxNQUFNLElBQUksbUJBQW1CLENBQzNCLHlDQUF5QyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQzdELENBQUM7d0JBQ0osQ0FBQzt3QkFFRCxJQUFJLEdBQUc7NEJBQ0wsR0FBRyxhQUFhOzRCQUNoQixNQUFNLEVBQUUsU0FBUzs0QkFDakIsd0NBQXdDOzRCQUN4QyxTQUFTLEVBQUUsYUFBYSxDQUFDLFNBQVMsSUFBSSxHQUFHOzRCQUN6QywyQ0FBMkM7NEJBQzNDLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUM7NEJBQ2xDLGlEQUFpRDs0QkFDakQsVUFBVSxFQUFFLFNBQVM7NEJBQ3JCLFNBQVMsRUFBRSxHQUFHO3lCQUNmLENBQUM7d0JBQ0YsTUFBTSxTQUFTLENBQ2IsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLEVBQ25ELElBQUksRUFDSixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FDcEIsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGdCQUFnQixJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDdEUsNkNBQTZDO29CQUM3QyxzRUFBc0U7b0JBQ3RFLGdFQUFnRTtvQkFDaEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQTRCLENBQUM7b0JBQ3hELElBQUksYUFBYSxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNuRSxNQUFNLFFBQVEsR0FBRyxHQUFHOzRCQUNsQixDQUFDLENBQUMsR0FBRyxnQkFBZ0IsYUFBYSxHQUFHLEVBQUU7NEJBQ3ZDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixXQUFXLENBQUM7d0JBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsaUJBQWlCLENBQ3hDLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFFBQVEsQ0FDVCxDQUFDO3dCQUNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUMzRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQ2IsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixzQ0FBc0MsQ0FDdkMsQ0FBQzt3QkFDSixDQUFDO3dCQUNELElBQUksR0FBRzs0QkFDTCxHQUFHLGFBQWE7NEJBQ2hCLE1BQU0sRUFBRSxXQUFXOzRCQUNuQixNQUFNLEVBQUUsYUFBYSxDQUFDLE1BQU07NEJBQzVCLFdBQVcsRUFBRSxHQUFHOzRCQUNoQixTQUFTLEVBQUUsR0FBRzt5QkFDZixDQUFDO3dCQUNGLE1BQU0sU0FBUyxDQUNiLFVBQVUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUNuRCxJQUFJLEVBQ0osRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQ3BCLENBQUM7b0JBQ0osQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNuRSx5Q0FBeUM7b0JBQ3pDLHNFQUFzRTtvQkFDdEUsNkRBQTZEO29CQUM3RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FFdkIsQ0FBQztvQkFDRixJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixNQUFNLGdCQUFnQixHQUFHLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkUsTUFBTSxRQUFRLEdBQUcsR0FBRzs0QkFDbEIsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLGFBQWEsR0FBRyxFQUFFOzRCQUN2QyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsV0FBVyxDQUFDO3dCQUNuQyxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUN4QyxPQUFPLEVBQ1AsUUFBUSxFQUNSLE9BQU8sRUFDUCxRQUFRLENBQ1QsQ0FBQzt3QkFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUNiLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0Isc0NBQXNDLENBQ3ZDLENBQUM7d0JBQ0osQ0FBQzt3QkFDRCw2REFBNkQ7d0JBQzdELGtFQUFrRTt3QkFDbEUsaUVBQWlFO3dCQUNqRSxJQUFJLEdBQUc7NEJBQ0wsR0FBRyxhQUFhOzRCQUNoQixNQUFNLEVBQUUsUUFBUTs0QkFDaEIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFtQjs0QkFDckMsV0FBVyxFQUFFLEdBQUc7NEJBQ2hCLFNBQVMsRUFBRSxHQUFHO3lCQUNmLENBQUM7d0JBQ0YsTUFBTSxTQUFTLENBQ2IsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLEVBQ25ELElBQUksRUFDSixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FDcEIsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGVBQWUsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3JFLDhEQUE4RDtvQkFDOUQsMkRBQTJEO29CQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FHdEIsQ0FBQztvQkFDRixJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixNQUFNLGdCQUFnQixHQUFHLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkUsSUFBSSxHQUFHOzRCQUNMLEdBQUcsYUFBYTs0QkFDaEIsTUFBTSxFQUFFLFNBQVM7NEJBQ2pCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBbUI7NEJBQ3BDLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTs0QkFDaEMsU0FBUyxFQUFFLEdBQUc7eUJBQ2YsQ0FBQzt3QkFDRixNQUFNLFNBQVMsQ0FDYixVQUFVLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsRUFDbkQsSUFBSSxFQUNKLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUNwQixDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTTtnQkFDTCx3QkFBd0I7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYztvQkFDakMsV0FBVyxJQUFJLElBQUksRUFDbkIsQ0FBQztvQkFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FLckIsQ0FBQztvQkFFRix3RUFBd0U7b0JBQ3hFLDRFQUE0RTtvQkFDNUUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDOUIsT0FBTyxFQUNQLE9BQU8sRUFDUCxRQUFRLEVBQ1IsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQ3BDLENBQUM7b0JBQ0YscUVBQXFFO29CQUNyRSxtRUFBbUU7b0JBQ25FLElBQUksQ0FBQyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNoRCxNQUFNLGtDQUFrQyxDQUN0QyxPQUFPLEVBQ1AsUUFBUSxDQUFDLEtBQUssRUFDZCxHQUFHLENBQ0osQ0FBQztvQkFDSixDQUFDO29CQUNELHdEQUF3RDtvQkFDeEQscURBQXFEO29CQUNyRCxzREFBc0Q7b0JBQ3RELFNBQVM7b0JBQ1QsTUFBTSxZQUFZLEdBQUcsTUFBTSxjQUFjLENBQ3ZDLGNBQWMsRUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNiLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSzt3QkFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUMxQixLQUFLLEVBQUUsY0FBYzt3QkFDckIsT0FBTztxQkFDUixDQUFDLENBQ0gsQ0FBQztvQkFFRiwwREFBMEQ7b0JBQzFELDZEQUE2RDtvQkFDN0QsMkRBQTJEO29CQUMzRCx5REFBeUQ7b0JBQ3pELHlEQUF5RDtvQkFDekQsc0RBQXNEO29CQUN0RCw0REFBNEQ7b0JBQzVELHlDQUF5QztvQkFDekMsRUFBRTtvQkFDRiw4REFBOEQ7b0JBQzlELDBEQUEwRDtvQkFDMUQsNERBQTREO29CQUM1RCwyREFBMkQ7b0JBQzNELDJEQUEyRDtvQkFDM0QsMERBQTBEO29CQUMxRCxnQ0FBZ0M7b0JBQ2hDLDJEQUEyRDtvQkFDM0QsMkRBQTJEO29CQUMzRCwyREFBMkQ7b0JBQzNELHNEQUFzRDtvQkFDdEQseURBQXlEO29CQUN6RCw2REFBNkQ7b0JBQzdELEVBQUU7b0JBQ0YsMERBQTBEO29CQUMxRCwyREFBMkQ7b0JBQzNELDJEQUEyRDtvQkFDM0QseURBQXlEO29CQUN6RCwwREFBMEQ7b0JBQzFELDBCQUEwQjtvQkFDMUIsRUFBRTtvQkFDRiw0REFBNEQ7b0JBQzVELDREQUE0RDtvQkFDNUQscURBQXFEO29CQUNyRCw0REFBNEQ7b0JBQzVELHlDQUF5QztvQkFDekMsSUFBSSw0QkFBNEIsR0FBRyxLQUFLLENBQUM7b0JBRXpDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDbEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFFL0QsSUFDRSxhQUFhLEVBQUUsS0FBSyxLQUFLLGNBQWM7NEJBQ3ZDLGFBQWEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFDM0MsQ0FBQzs0QkFDRCx3REFBd0Q7NEJBQ3hELG9EQUFvRDs0QkFDcEQsbURBQW1EOzRCQUNuRCxpREFBaUQ7NEJBQ2pELDRDQUE0Qzs0QkFDNUMsK0NBQStDOzRCQUMvQyxvREFBb0Q7NEJBQ3BELHNEQUFzRDs0QkFDdEQscUJBQXFCOzRCQUNyQixFQUFFOzRCQUNGLHNEQUFzRDs0QkFDdEQsRUFBRTs0QkFDRixvREFBb0Q7NEJBQ3BELGtEQUFrRDs0QkFDbEQsb0RBQW9EOzRCQUNwRCwyQ0FBMkM7NEJBQzNDLHFEQUFxRDs0QkFDckQsb0RBQW9EOzRCQUNwRCxnREFBZ0Q7NEJBQ2hELEVBQUU7NEJBQ0Ysb0RBQW9EOzRCQUNwRCxvREFBb0Q7NEJBQ3BELDJDQUEyQzs0QkFDM0Msb0RBQW9EOzRCQUNwRCxvREFBb0Q7NEJBQ3BELG9EQUFvRDs0QkFDcEQsb0RBQW9EOzRCQUNwRCw2Q0FBNkM7NEJBQzdDLHFEQUFxRDs0QkFDckQsb0NBQW9DOzRCQUNwQyxFQUFFOzRCQUNGLHFEQUFxRDs0QkFDckQsc0RBQXNEOzRCQUN0RCxtREFBbUQ7NEJBQ25ELGtEQUFrRDs0QkFDbEQsc0RBQXNEOzRCQUN0RCxzREFBc0Q7NEJBQ3RELG1EQUFtRDs0QkFDbkQsa0RBQWtEOzRCQUNsRCxzREFBc0Q7NEJBQ3RELElBQUksZ0JBQXdCLENBQUM7NEJBQzdCLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dDQUMxQixnQkFBZ0IsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDOzRCQUMzQyxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sTUFBTSx1QkFBdUIsR0FDM0IsTUFBTSw4QkFBOEIsQ0FDbEMsT0FBTyxFQUNQLGNBQWMsRUFDZCxJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO2dDQUNKLElBQUksdUJBQXVCLEtBQUssSUFBSSxFQUFFLENBQUM7b0NBQ3JDLGtEQUFrRDtvQ0FDbEQsZ0RBQWdEO29DQUNoRCwrQ0FBK0M7b0NBQy9DLGlEQUFpRDtvQ0FDakQsTUFBTSxrQ0FBa0MsQ0FDdEMsT0FBTyxFQUNQLGNBQWMsRUFDZCxJQUFJLENBQUMsYUFBYSxFQUNsQix1QkFBdUIsRUFDdkIsR0FBRyxDQUNKLENBQUM7b0NBQ0YsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixTQUFTLElBQUksQ0FBQyxhQUFhLG1CQUFtQixDQUMvQyxDQUFDO2dDQUNKLENBQUM7Z0NBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQ0FBaUMsQ0FDcEQsT0FBTyxFQUNQLFFBQVEsQ0FBQyxLQUFLLEVBQ2QsY0FBYyxFQUNkLElBQUksQ0FBQyxhQUFhLEVBQ2xCLE9BQU8sQ0FDUixDQUFDO2dDQUNGLElBQUksTUFBTSxLQUFLLElBQUksRUFBRSxDQUFDO29DQUNwQiw4Q0FBOEM7b0NBQzlDLCtDQUErQztvQ0FDL0MsNkNBQTZDO29DQUM3Qyw2Q0FBNkM7b0NBQzdDLHVDQUF1QztvQ0FDdkMsZUFBZTtvQ0FDZixNQUFNLElBQUksbUJBQW1CLENBQzNCLFNBQVMsSUFBSSxDQUFDLGFBQWEsbUJBQW1CLENBQy9DLENBQUM7Z0NBQ0osQ0FBQztnQ0FDRCxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7NEJBQzVCLENBQUM7NEJBRUQsbURBQW1EOzRCQUNuRCxxREFBcUQ7NEJBQ3JELGlEQUFpRDs0QkFDakQsa0NBQWtDOzRCQUNsQyxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7NEJBQzNCLE1BQU0sa0JBQWtCLEdBQ3RCLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQzs0QkFDbkQsS0FBSyxHQUFHO2dDQUNOLEdBQUcsSUFBSTtnQ0FDUCxLQUFLLEVBQUUsY0FBYztnQ0FDckIsT0FBTztnQ0FDUCxTQUFTLEVBQUUsa0JBQWtCO2dDQUM3QixXQUFXLEVBQUUsb0JBQW9COzZCQUNsQyxDQUFDOzRCQUNGLDRCQUE0QixHQUFHLElBQUksQ0FBQzt3QkFDdEMsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLCtDQUErQzs0QkFDL0MsNkNBQTZDOzRCQUM3QywrQ0FBK0M7NEJBQy9DLHVDQUF1Qzs0QkFDdkMsTUFBTSxhQUFhLEdBQVU7Z0NBQzNCLFNBQVMsRUFBRSxlQUFlO2dDQUMxQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0NBQ2pDLFNBQVMsRUFBRTtvQ0FDVCxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7b0NBQ3JCLEdBQUcsQ0FBQyxhQUFhO3dDQUNmLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxLQUFLLEVBQUU7d0NBQzNDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUNBQ1I7Z0NBQ0QsS0FBSyxFQUFFLGNBQWM7Z0NBQ3JCLE9BQU87Z0NBQ1AsU0FBUyxFQUFFLEdBQUc7Z0NBQ2QsV0FBVyxFQUFFLG9CQUFvQjs2QkFDbEMsQ0FBQzs0QkFFRixxREFBcUQ7NEJBQ3JELG9EQUFvRDs0QkFDcEQsbURBQW1EOzRCQUNuRCxNQUFNLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFFaEMsTUFBTSxXQUFXLEdBQ2YsTUFBTSxFQUFFLFdBQVcsSUFBSSwyQkFBMkIsQ0FBQzs0QkFDckQsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQ3RDLGFBQWEsRUFDYixXQUFXLENBQ1osQ0FBQzs0QkFFRixrRUFBa0U7NEJBQ2xFLE9BQU87Z0NBQ0wsS0FBSyxFQUFFLGFBQWE7Z0NBQ3BCLEdBQUc7Z0NBQ0gsSUFBSTtnQ0FDSixJQUFJLEVBQUUsU0FBUzs2QkFDaEIsQ0FBQzt3QkFDSixDQUFDO29CQUNILENBQUM7b0JBRUQseURBQXlEO29CQUN6RCxzREFBc0Q7b0JBQ3RELHlEQUF5RDtvQkFDekQsb0RBQW9EO29CQUNwRCxnREFBZ0Q7b0JBQ2hELHVEQUF1RDtvQkFDdkQsb0RBQW9EO29CQUNwRCxzREFBc0Q7b0JBQ3RELDBEQUEwRDtvQkFDMUQsb0RBQW9EO29CQUNwRCxxREFBcUQ7b0JBQ3JELHVEQUF1RDtvQkFDdkQseURBQXlEO29CQUN6RCxzREFBc0Q7b0JBQ3RELDBEQUEwRDtvQkFDMUQsMkJBQTJCO29CQUMzQixJQUFJLEdBQUc7d0JBQ0wsS0FBSyxFQUFFLGNBQWM7d0JBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTt3QkFDMUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO3dCQUNyQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7d0JBQzNCLE9BQU8sRUFBRSxhQUFhO3dCQUN0QixTQUFTLEVBQUUsZUFBZTt3QkFDMUIsV0FBVyxFQUFFLE9BQU87d0JBQ3BCLHdEQUF3RDt3QkFDeEQscURBQXFEO3dCQUNyRCx3Q0FBd0M7d0JBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUzt3QkFDMUIsMERBQTBEO3dCQUMxRCxXQUFXLEVBQUUsb0JBQW9CO3dCQUNqQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVMsSUFBSSxLQUFLO3dCQUN0QyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxLQUFLO3FCQUNyQyxDQUFDO29CQUNGLHNCQUFzQixHQUFHLDRCQUE0Qjt3QkFDbkQsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRTt3QkFDckIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDaEIsQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssZUFBZSxFQUFFLENBQUM7b0JBQzlDLDBEQUEwRDtvQkFDMUQsc0VBQXNFO29CQUN0RSwrREFBK0Q7b0JBQy9ELE1BQU0sWUFBWSxHQUFHLEdBQUc7d0JBQ3RCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLGFBQWEsR0FBRyxFQUFFO3dCQUN6QyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxXQUFXLENBQUM7b0JBQ3JDLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUNoQyxPQUFPLEVBQ1AsUUFBUSxFQUNSLE9BQU8sRUFDUCxZQUFZLENBQ2IsQ0FBQztvQkFDRixNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ25ELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDYixNQUFNLElBQUksbUJBQW1CLENBQzNCLFNBQVMsSUFBSSxDQUFDLGFBQWEsb0JBQW9CLENBQ2hELENBQUM7b0JBQ0osQ0FBQztvQkFDRCxpREFBaUQ7b0JBQ2pELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FDekIsT0FBTyxFQUNQLE9BQU8sRUFDUCxJQUFJLENBQUMsYUFBYSxFQUNsQixHQUFHLENBQ0osQ0FBQztvQkFDRixNQUFNLFlBQVksR0FBRyxNQUFNLG9CQUFvQixDQUM3QyxPQUFPLEVBQ1AsT0FBTyxFQUNQLElBQUksQ0FBQyxhQUFhLEVBQ2xCLFVBQVUsRUFDVixHQUFHLENBQ0osQ0FBQztvQkFDRixJQUFJLFlBQVksRUFBRSxDQUFDO3dCQUNqQix3REFBd0Q7d0JBQ3hELHdEQUF3RDt3QkFDeEQsb0RBQW9EO3dCQUNwRCxpREFBaUQ7d0JBQ2pELHdEQUF3RDt3QkFDeEQsb0RBQW9EO3dCQUNwRCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3RDLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUN4QyxDQUFDO3dCQUNGLE1BQU0sVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUM7d0JBQ3pDLE1BQU0sVUFBVSxDQUNkLHNCQUFzQixDQUNwQixPQUFPLEVBQ1AsWUFBWSxDQUFDLEtBQUssRUFDbEIsWUFBWSxDQUFDLEtBQUssRUFDbEIsWUFBWSxDQUFDLE1BQU0sQ0FDcEIsQ0FDRixDQUFDO29CQUNKLENBQUM7b0JBQ0QsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGNBQWMsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3BFLDJEQUEyRDtvQkFDM0QsK0RBQStEO29CQUMvRCw2REFBNkQ7b0JBQzdELDJEQUEyRDtvQkFDM0Qsd0RBQXdEO29CQUN4RCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDbkUsTUFBTSxtQkFBbUIsR0FBRyxHQUFHO3dCQUM3QixDQUFDLENBQUMsR0FBRyxnQkFBZ0IsWUFBWSxHQUFHLEVBQUU7d0JBQ3RDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixVQUFVLENBQUM7b0JBQ2xDLE1BQU0sbUJBQW1CLEdBQUcsaUJBQWlCLENBQzNDLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLG1CQUFtQixDQUNwQixDQUFDO29CQUNGLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxjQUFjLENBQzdDLG1CQUFtQixFQUNuQixFQUFFLENBQ0gsQ0FBQztvQkFDRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixTQUFTLElBQUksQ0FBQyxhQUFhLGtCQUFrQixDQUM5QyxDQUFDO29CQUNKLENBQUM7b0JBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBRXJCLENBQUM7b0JBQ0YsSUFBSSxHQUFHO3dCQUNMLE1BQU0sRUFBRSxnQkFBZ0I7d0JBQ3hCLEtBQUssRUFBRSxjQUFjO3dCQUNyQixNQUFNLEVBQUUsU0FBUzt3QkFDakIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO3dCQUMzQixXQUFXLEVBQUUsU0FBUzt3QkFDdEIsU0FBUyxFQUFFLEdBQUc7d0JBQ2QsU0FBUyxFQUFFLEdBQUc7d0JBQ2QsV0FBVyxFQUFFLG9CQUFvQjtxQkFDbEMsQ0FBQztvQkFDRixNQUFNLFNBQVMsQ0FDYixVQUFVLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsRUFDbkQsSUFBSSxDQUNMLENBQUM7Z0JBQ0osQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztvQkFDL0MsdUVBQXVFO29CQUN2RSxzRUFBc0U7b0JBQ3RFLGdFQUFnRTtvQkFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLGNBQWMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ25FLE1BQU0sWUFBWSxHQUFHLEdBQUc7d0JBQ3RCLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixjQUFjLEdBQUcsRUFBRTt3QkFDeEMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLFlBQVksQ0FBQztvQkFDcEMsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQ2hDLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksQ0FDYixDQUFDO29CQUNGLE1BQU0sT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDbkQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNiLE1BQU0sSUFBSSxtQkFBbUIsQ0FDM0IsU0FBUyxJQUFJLENBQUMsYUFBYSxxQkFBcUIsQ0FDakQsQ0FBQztvQkFDSixDQUFDO29CQUNELE1BQU0sWUFBWSxHQUFHLE1BQU0sb0JBQW9CLENBQzdDLE9BQU8sRUFDUCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixHQUFHLENBQ0osQ0FBQztvQkFDRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ2xCLGtFQUFrRTt3QkFDbEUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQzt3QkFDMUMsTUFBTSxJQUFJLGtCQUFrQixDQUMxQixTQUFTLElBQUksQ0FBQyxhQUFhLGFBQWEsQ0FDekMsQ0FBQztvQkFDSixDQUFDO29CQUNELG1FQUFtRTtvQkFDbkUsbURBQW1EO29CQUNuRCxJQUFJLEdBQUc7d0JBQ0wsR0FBRyxZQUFZO3dCQUNmLE1BQU0sRUFBRSxXQUFXO3dCQUNuQixXQUFXLEVBQUUsR0FBRzt3QkFDaEIsU0FBUyxFQUFFLEdBQUc7cUJBQ2YsQ0FBQztvQkFDRixNQUFNLFNBQVMsQ0FDYixVQUFVLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsRUFDbkQsSUFBSSxFQUNKLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUNwQixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsbUVBQW1FO2dCQUNuRSw4REFBOEQ7Z0JBRTlELHFEQUFxRDtnQkFDckQsRUFBRTtnQkFDRiw4REFBOEQ7Z0JBQzlELDZEQUE2RDtnQkFDN0QsNkRBQTZEO2dCQUM3RCw4REFBOEQ7Z0JBQzlELDhEQUE4RDtnQkFDOUQsMERBQTBEO2dCQUMxRCx5REFBeUQ7Z0JBQ3pELDREQUE0RDtnQkFDNUQsdURBQXVEO2dCQUN2RCx5REFBeUQ7Z0JBQ3pELDREQUE0RDtnQkFDNUQsd0RBQXdEO2dCQUN4RCx1QkFBdUI7Z0JBQ3ZCLE1BQU0sWUFBWSxHQUFHLEdBQUcsY0FBYyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNwRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLG1FQUFtRTtnQkFDbkUsc0RBQXNEO2dCQUN0RCx3QkFBd0I7Z0JBQ3hCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxjQUFjLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3BCLHlEQUF5RDtvQkFDekQsd0RBQXdEO29CQUN4RCx3REFBd0Q7b0JBQ3hELHVEQUF1RDtvQkFDdkQseURBQXlEO29CQUN6RCx5REFBeUQ7b0JBQ3pELDBEQUEwRDtvQkFDMUQsdURBQXVEO29CQUN2RCx5REFBeUQ7b0JBQ3pELHNEQUFzRDtvQkFDdEQsMkRBQTJEO29CQUMzRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDNUQsTUFBTSxrQ0FBa0MsQ0FDdEMsT0FBTyxFQUNQLGNBQWMsRUFDZCxJQUFJLENBQUMsYUFBYSxFQUNsQixPQUFPLEVBQ1AsR0FBRyxDQUNKLENBQUM7b0JBQ0osQ0FBQztvQkFDRCxNQUFNLElBQUksbUJBQW1CLENBQzNCLFVBQVUsT0FBTyw2QkFBNkIsY0FBYyxHQUFHLENBQ2hFLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxrRUFBa0U7Z0JBQ2xFLG1EQUFtRDtnQkFDbkQsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFFdkQsNERBQTREO2dCQUM1RCx1REFBdUQ7Z0JBQ3ZELHVEQUF1RDtnQkFDdkQsMkRBQTJEO2dCQUMzRCw0REFBNEQ7Z0JBQzVELDhEQUE4RDtnQkFDOUQsMERBQTBEO2dCQUMxRCx5QkFBeUI7Z0JBQ3pCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQzlDLE1BQU0sU0FBUyxDQUNiLFVBQVUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQzlDLElBQUksRUFDSixzQkFBc0IsQ0FDdkIsQ0FBQztnQkFDSixDQUFDO2dCQUVELE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxXQUFXLElBQUksMkJBQTJCLENBQUM7Z0JBQ3ZFLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFFN0Qsc0VBQXNFO2dCQUN0RSxzREFBc0Q7Z0JBQ3RELElBQUksTUFBMkIsQ0FBQztnQkFDaEMsSUFBSSxNQUFpQyxDQUFDO2dCQUN0QyxJQUFJLE9BQTRCLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQzVDLE1BQU0sU0FBUyxHQUFHLE1BQU0sd0JBQXdCLENBQUM7d0JBQy9DLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7d0JBQ3ZDLE1BQU0sRUFBRSxXQUFXO3dCQUNuQixXQUFXLEVBQUUsVUFBVTt3QkFDdkIsVUFBVSxFQUFFLEdBQUcsY0FBYyxHQUFHO3dCQUNoQyxTQUFTLEVBQUUsS0FBSzt3QkFDaEIsS0FBSyxFQUFFLElBQUk7d0JBQ1gsWUFBWSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQzt3QkFDeEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTztxQkFDeEIsQ0FBQyxDQUFDO29CQUNILE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUN4QixNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztvQkFDMUIsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQzlCLENBQUM7Z0JBRUQsaUVBQWlFO2dCQUNqRSxpRUFBaUU7Z0JBQ2pFLDREQUE0RDtnQkFDNUQsOERBQThEO2dCQUM5RCxpRUFBaUU7Z0JBQ2pFLGtFQUFrRTtnQkFDbEUsRUFBRTtnQkFDRiw4REFBOEQ7Z0JBQzlELGdFQUFnRTtnQkFDaEUsa0VBQWtFO2dCQUNsRSwwREFBMEQ7Z0JBQzFELGlFQUFpRTtnQkFDakUsK0RBQStEO2dCQUMvRCwrREFBK0Q7Z0JBQy9ELFNBQVM7Z0JBQ1QsRUFBRTtnQkFDRixtRUFBbUU7Z0JBQ25FLCtEQUErRDtnQkFDL0Qsb0VBQW9FO2dCQUNwRSxtRUFBbUU7Z0JBQ25FLElBQ0UsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLGdCQUFnQjtvQkFDbEMsSUFBSSxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUM7b0JBQ25DLE9BQU8sTUFBTSxFQUFFLFdBQVcsS0FBSyxRQUFRLEVBQ3ZDLENBQUM7b0JBQ0QscUVBQXFFO29CQUNyRSxpRUFBaUU7b0JBQ2pFLG1FQUFtRTtvQkFDbkUsOERBQThEO29CQUM5RCxxREFBcUQ7b0JBQ3JELHFFQUFxRTtvQkFDckUsaUVBQWlFO29CQUNqRSxtRUFBbUU7b0JBQ25FLHNFQUFzRTtvQkFDdEUsaUVBQWlFO29CQUNqRSxNQUFNLEtBQUssR0FBRyxNQUFNLHdCQUF3QixDQUFDO3dCQUMzQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO3dCQUN2QyxNQUFNLEVBQUUsV0FBVzt3QkFDbkIsVUFBVSxFQUFFLEdBQUcsY0FBYyxHQUFHO3dCQUNoQyxTQUFTLEVBQUUsS0FBSzt3QkFDaEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO3dCQUMxQixZQUFZLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDO3dCQUN4QyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPO3FCQUN4QixDQUFDLENBQUM7b0JBQ0gsTUFBTTt3QkFDSixXQUFXLEtBQUssTUFBTTs0QkFDcEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7NEJBQzNELENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO29CQUNqQixNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDdEIsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQzFCLENBQUM7Z0JBRUQsK0RBQStEO2dCQUMvRCxPQUFPO29CQUNMLEtBQUssRUFBRSxhQUFhO29CQUNwQixHQUFHO29CQUNILElBQUk7b0JBQ0osSUFBSTtvQkFDSixJQUFJO29CQUNKLE1BQU07b0JBQ04sTUFBTTtvQkFDTixPQUFPO29CQUNQLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztpQkFDcEQsQ0FBQztZQUNKLENBQUMsQ0FBQyxpQkFBaUI7UUFDckIsQ0FBQztRQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNO1lBQzlCLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNuQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDdkMsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxvQkFBb0IsQ0FDdEMsT0FBTyxFQUNQLFFBQVEsRUFDUixZQUFZLEVBQ1osV0FBVyxFQUNYLEdBQUcsQ0FDSixDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxPQUFPLFdBQVcsS0FBSyxZQUFZLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLFdBQVcsSUFBSSwyQkFBMkIsQ0FBQztZQUN2RSxPQUFPLGtCQUFrQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ2YsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQztZQUN6QixrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSwyQkFBMkIsQ0FBQztZQUN0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLHdCQUF3QixDQUFDO2dCQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsV0FBVztnQkFDbkIsV0FBVyxFQUFFLFVBQVU7Z0JBQ3ZCLFVBQVUsRUFBRSxHQUFHLEtBQUssR0FBRztnQkFDdkIsMkRBQTJEO2dCQUMzRCxtREFBbUQ7Z0JBQ25ELFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxLQUFLO2dCQUNoRCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLO2dCQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNO2dCQUNqQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPO2FBQ2hDLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxJQUFJLFdBQVcsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsT0FBTztvQkFDTCxHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDOUIsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUN2QztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQUMsTUFBTTtZQUM5QixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQzNDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLDJCQUEyQixDQUFDO1lBQ3RFLE1BQU0sTUFBTSxHQUFHLE1BQU0sd0JBQXdCLENBQUM7Z0JBQzVDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7Z0JBQ3ZDLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsb0NBQW9DO2dCQUNwQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYTtnQkFDeEQsMkRBQTJEO2dCQUMzRCxtREFBbUQ7Z0JBQ25ELFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxLQUFLO2dCQUNoRCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLO2dCQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNO2dCQUNqQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPO2FBQ2hDLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxJQUFJLFdBQVcsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsT0FBTztvQkFDTCxHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDOUIsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUN2QztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBSdW5Ob3RTdXBwb3J0ZWRFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhvb2ssXG4gIFNlcmlhbGl6ZWREYXRhLFxuICBTdGVwLFxuICBTdG9yYWdlLFxuICBXYWl0LFxuICBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGFwcGx5QXR0cmlidXRlQ2hhbmdlcyxcbiAgRXZlbnRTY2hlbWEsXG4gIEhvb2tTY2hlbWEsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzVGVybWluYWxSdW5FdmVudFR5cGUsXG4gIGlzVGVybWluYWxTdGVwU3RhdHVzLFxuICBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMsXG4gIHJlcXVpcmVzTmV3ZXJXb3JsZCxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFN0ZXBTY2hlbWEsXG4gIHVsaWRUb0RhdGUsXG4gIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyxcbiAgdmFsaWRhdGVVbGlkVGltZXN0YW1wLFxuICBXYWl0U2NoZW1hLFxuICBXb3JrZmxvd1J1blNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OIH0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgZGVsZXRlSlNPTixcbiAganNvblJlcGxhY2VyLFxuICBqc29uUmV2aXZlcixcbiAgbGlzdEpTT05GaWxlcyxcbiAgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5LFxuICByZWFkSlNPTixcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHJlc29sdmVXaXRoaW5CYXNlLFxuICB0YWdnZWRQYXRoLFxuICB3cml0ZSxcbiAgd3JpdGVFeGNsdXNpdmUsXG4gIHdyaXRlSlNPTixcbn0gZnJvbSAnLi4vZnMuanMnO1xuaW1wb3J0IHsgc3RyaXBFdmVudERhdGFSZWZzIH0gZnJvbSAnLi9maWx0ZXJzLmpzJztcbmltcG9ydCB7XG4gIGdldE9iamVjdENyZWF0ZWRBdCxcbiAgaGFzaFRva2VuLFxuICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoLFxuICBtb25vdG9uaWNVbGlkLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlQWxsSG9va3NGb3JSdW4sXG4gIHJlYnVpbGRMaXZlSG9va0J5VG9rZW5Gcm9tRXZlbnRMb2csXG59IGZyb20gJy4vaG9va3Mtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVMZWdhY3lFdmVudCB9IGZyb20gJy4vbGVnYWN5LmpzJztcbmltcG9ydCB7IHdpdGhSdW5GaWxlTG9jayB9IGZyb20gJy4vcnVucy1zdG9yYWdlLmpzJztcblxuLyoqXG4gKiBQZXItc3RlcCBpbi1wcm9jZXNzIGFzeW5jIG11dGV4LiBTZXJpYWxpemVzIGNvbmN1cnJlbnQgYGV2ZW50cy5jcmVhdGVgIGNhbGxzXG4gKiB0aGF0IHRhcmdldCB0aGUgc2FtZSBzdGVwLCBzbyB0aGF0IHRoZSBcImNoZWNrIHRlcm1pbmFsIHN0YXRlLCB0aGVuIHdyaXRlIHN0ZXBcbiAqIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgaXMgYXRvbWljLiBXaXRob3V0IHRoaXMsIHR3byBjb25jdXJyZW50IHN0ZXBfc3RhcnRlZFxuICogY2FsbHMgY2FuIGJvdGggcGFzcyB0aGUgbm90LXRlcm1pbmFsIGNoZWNrIGFuZCBib3RoIHdyaXRlIHN0ZXBfc3RhcnRlZCBldmVudHNcbiAqIOKAlCBvciBhIHN0ZXBfc3RhcnRlZCBjYW4gbGFuZCBpbiB0aGUgbG9nIGFmdGVyIHN0ZXBfY29tcGxldGVkIGhhcyBhbHJlYWR5XG4gKiB3cml0dGVuLCBwcm9kdWNpbmcgdW5jb25zdW1lZCBldmVudHMgb24gcmVwbGF5LlxuICpcbiAqIER1cGxpY2F0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzIGZvciBhIG5vbi10ZXJtaW5hbCBzdGVwIGFyZSBzdGlsbCBhbGxvd2VkXG4gKiAocmV0cmllcyBsZWdpdGltYXRlbHkgcmUtc3RhcnQgYSBzdGVwKSwgb25seSB3cml0ZXMgdG8gYW4gYWxyZWFkeS10ZXJtaW5hbFxuICogc3RlcCBhcmUgcmVqZWN0ZWQuXG4gKi9cbi8vIGBzdGVwTG9ja3NgIGFuZCBgaG9va0xvY2tzYCBhcmUgbm93IGluc3RhbnRpYXRlZCBwZXJcbi8vIGBjcmVhdGVFdmVudHNTdG9yYWdlYCBjYWxsIChzZWUgaW5zaWRlIHRoZSBmdW5jdGlvbikgcmF0aGVyIHRoYW5cbi8vIGJlaW5nIG1vZHVsZS1sZXZlbC4gVGhlIG9uLWRpc2sgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIHJlbWFpblxuLy8gdGhlIGR1cmFibGUgc291cmNlIG9mIHRydXRoIGFjcm9zcyBwcm9jZXNzZXM7IHRoZSBpbi1wcm9jZXNzXG4vLyBtdXRleCBpcyBhIHBlci1pbnN0YW5jZSBvcHRpbWl6YXRpb24gdGhhdCBjbG9zZXMgYSBzaG9ydCByYWNlXG4vLyB3aW5kb3cgaW4gdGhlIGRlZHVwLXJlY292ZXJ5IHBhdGguIFBlci1pbnN0YW5jZSBzY29waW5nIGxldHNcbi8vIHRlc3RzIHNpbXVsYXRlIGNyb3NzLXByb2Nlc3MgYmVoYXZpb3Igd2l0aCB0d28gc3RvcmFnZSBpbnN0YW5jZXNcbi8vIHNoYXJpbmcgb25lIGRhdGEgZGlyZWN0b3J5IChlYWNoIGluc3RhbmNlIGhhcyBpbmRlcGVuZGVudCBsb2Nrc1xuLy8gYnV0IGEgc2hhcmVkIGZpbGVzeXN0ZW0pLCBleGFjdGx5IG1hdGNoaW5nIHRoZSBjcm9zcy1wcm9jZXNzXG4vLyBzZW1hbnRpY3Mgd2l0aG91dCBzcGF3bmluZyBzdWJwcm9jZXNzZXMuXG5cbmNvbnN0IEhvb2tUb2tlbkNsYWltU2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBUaGUgdG9rZW4tY2xhaW0gd3JpdGVyIGJlbG93IGhhcyBhbHdheXMgcGVyc2lzdGVkIGBob29rSWRgLCBidXRcbiAgLy8gdGhpcyByZWFkIHNjaGVtYSBwcmV2aW91c2x5IG9taXR0ZWQgaXQsIHdoaWNoIGlzIHRoZSBidWcgZml4ZWRcbiAgLy8gYnkgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC93b3JrZmxvdy9pc3N1ZXMvMjI4My4gYG9wdGlvbmFsKClgXG4gIC8vIGlzIGRlZmVuc2l2ZTogYW55IGNsYWltIGZpbGUgdGhhdCBzb21laG93IGxhY2tzIHRoZSBmaWVsZCBzdGlsbFxuICAvLyBwYXJzZXMgKHlpZWxkaW5nIGB1bmRlZmluZWRgKSBhbmQgZmFsbHMgdGhyb3VnaCB0byB0aGUgY3Jvc3MtXG4gIC8vIGhvb2sgY29uZmxpY3QgYnJhbmNoLCBtYXRjaGluZyBwcmUtZml4IGJlaGF2aW9yLlxuICBob29rSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCksXG4gIC8vIGBldmVudElkYCBpcyB0aGUgY2Fub25pY2FsIGhvb2tfY3JlYXRlZCBldmVudCBJRCB0aGUgY2xhaW1pbmdcbiAgLy8gd29ya2VyIGNvbW1pdHRlZCB0byBwdWJsaXNoaW5nLiBQZXJzaXN0aW5nIGl0IGhlcmUgdHVybnMgdGhlXG4gIC8vIGNsYWltIGZpbGUgaW50byBhIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IGZvciBjcm9zcy13b3JrZXIgL1xuICAvLyBjcm9zcy1wcm9jZXNzIHJldHJpZXMgKHNlZSBjb21tZW50IG9uIHRoZSBob29rX2NyZWF0ZWQgYnJhbmNoKS5cbiAgLy8gYG9wdGlvbmFsKClgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGxlZ2FjeSBjbGFpbSBmaWxlXG4gIC8vIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgZXhpc3RlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSByZWNvdmVyeS1cbiAgLy8gbWFya2VyIHVwZ3JhZGUgcGF0aCwgd2hpY2ggYXRvbWljYWxseSBwaW5zIGEgY2Fub25pY2FsIGV2ZW50SWRcbiAgLy8gdmlhIGEgc2lkZWNhciBtYXJrZXIgKGFsc28gYSBgd3JpdGVFeGNsdXNpdmVgKS5cbiAgZXZlbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogU2lkZWNhciByZWNvdmVyeSBtYXJrZXIgdGhhdCBwaW5zIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgXG4gKiBldmVudElkIGZvciBhIGxlZ2FjeSB0b2tlbiBjbGFpbSDigJQgb25lIHdyaXR0ZW4gYnkgYSB2ZXJzaW9uIG9mXG4gKiB0aGlzIHN0b3JhZ2UgdGhhdCBkaWQgbm90IHlldCBwZXJzaXN0IGBldmVudElkYCBpbmxpbmUgaW4gdGhlXG4gKiBjbGFpbSBmaWxlLiBXaXRob3V0IHRoaXMgbWFya2VyLCB0d28gY3Jvc3MtcHJvY2VzcyByZXRyaWVzXG4gKiByZWFkaW5nIGEgbGVnYWN5IGNsYWltIGVhY2ggZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmRcbiAqIHRoZWlyIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnQgcGF0aHMsIGFuZFxuICogYXBwZW5kIHR3byBgaG9va19jcmVhdGVkYCBldmVudHMgZm9yIHRoZSBzYW1lIGAocnVuSWQsIGhvb2tJZClgLlxuICpcbiAqIFRoZSBtYXJrZXIgaXMgd3JpdHRlbiB2aWEgYHdyaXRlRXhjbHVzaXZlYCDigJQgdGhlIGZpcnN0IHJldHJ5IHRvXG4gKiBsYW5kIGl0IHBpbnMgaXRzIGNhbmRpZGF0ZSBldmVudElkIGFzIGNhbm9uaWNhbCwgYW5kIGV2ZXJ5XG4gKiBzdWJzZXF1ZW50IHJldHJ5IHJlYWRzIGFuZCBhZG9wdHMgdGhhdCBldmVudElkIGJlZm9yZSB0aGUgY29tbW9uXG4gKiBldmVudCBwdWJsaXNoLiBTY2hlbWEgaXMganVzdCBgeyBldmVudElkIH1gIGJlY2F1c2UgaWRlbnRpdHkgaXNcbiAqIGFscmVhZHkgZW5jb2RlZCBpbiB0aGUgbWFya2VyJ3MgZmlsZW5hbWUgaGFzaCwgc28gZGlmZmVyZW50IHRva2VuXG4gKiBsaWZldGltZXMgY2FuIG5ldmVyIHNoYXJlIG9uZSBtYXJrZXIgKHNlZVxuICogYGhvb2tSZWNvdmVyeU1hcmtlclBhdGhgKS5cbiAqL1xuY29uc3QgSG9va1JlY292ZXJ5TWFya2VyU2NoZW1hID0gei5vYmplY3Qoe1xuICBldmVudElkOiB6LnN0cmluZygpLFxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rVG9rZW5DbGFpbShcbiAgY29uc3RyYWludFBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rVG9rZW5DbGFpbVNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKGNvbnN0cmFpbnRQYXRoLCBIb29rVG9rZW5DbGFpbVNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEhvb2tSZWNvdmVyeU1hcmtlcihcbiAgbWFya2VyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHouaW5mZXI8dHlwZW9mIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKG1hcmtlclBhdGgsIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9iZSB0aGUgcnVuJ3MgZXZlbnQgbG9nIGZvciBhbiBleGlzdGluZyBgaG9va19jcmVhdGVkYCBldmVudFxuICogd2l0aCB0aGUgZ2l2ZW4gY29ycmVsYXRpb25JZC4gVXNlZCBieSB0aGUgbGVnYWN5LWNsYWltIHJlY292ZXJ5XG4gKiBwYXRoIHRvIGRldGVjdCBcImFscmVhZHkgcHVibGlzaGVkIGJ5IGEgcHJlLXVwZ3JhZGUgd3JpdGVcIiBiZWZvcmVcbiAqIHBpbm5pbmcgYSBjYW5vbmljYWwgZXZlbnRJZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBhIHBvc3QtdXBncmFkZVxuICogcmV0cnkgZW5jb3VudGVyaW5nIGEgbGVnYWN5IGNsYWltIHdob3NlIGBob29rX2NyZWF0ZWRgIHdhc1xuICogYWxyZWFkeSB3cml0dGVuICh3aXRoIHRoZSBwcmUtdXBncmFkZSB3cml0ZXIncyBvd24gZXZlbnRJZCkgd291bGRcbiAqIHBpbiBhICpkaWZmZXJlbnQqIGV2ZW50SWQgdmlhIHRoZSBtYXJrZXIgYW5kIHB1Ymxpc2ggYSBkdXBsaWNhdGVcbiAqIGV2ZW50IGF0IHRoZSBtYXJrZXIncyBwYXRoLlxuICpcbiAqIFRoZSBpbmxpbmUtYGV2ZW50SWRgIGZhc3QgcGF0aCBkb2VzIE5PVCBuZWVkIHRoaXMgcHJvYmU6IHRoZVxuICogY2Fub25pY2FsIGV2ZW50SWQgaXMgZHVyYWJsZSBpbiB0aGUgY2xhaW0gZmlsZSwgc28gdGhlIGV4aXN0aW5nXG4gKiBwdWJsaXNoIChgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWApIHdpbGwgZmFpbCBpZmYgdGhlIGV2ZW50XG4gKiBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGV4YWN0IHBhdGgg4oCUIHdoaWNoIGlzIHRoZSBjb3JyZWN0XG4gKiBcImFscmVhZHktcHVibGlzaGVkXCIgc2VtYW50aWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgIGZpbGVQcmVmaXg6IGAke3J1bklkfS1gLFxuICAgIGZpbHRlcjogKGV2ZW50KSA9PlxuICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICBsaW1pdDogMSxcbiAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gcmVzdWx0LmRhdGFbMF0/LmV2ZW50SWQgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYW4gXCJldmVudC1maXJzdCBvcnBoYW5cIjogdGhlIGhvb2sgZW50aXR5IHdyaXRlIGlzIGRlZmVycmVkXG4gKiB1bnRpbCBhZnRlciB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgcHVibGlzaCBjb21taXRzIChzbyBhIGZhaWxlZFxuICogcHVibGlzaCBjYW5ub3QgbXV0YXRlIGFscmVhZHktY29tbWl0dGVkIHN0YXRlIOKAlCBzZWUgdGhlIGNvbW1lbnQgb25cbiAqIHRoZSBkZWZlcnJlZCB3cml0ZSksIHdoaWNoIG9wZW5zIHRoZSBpbnZlcnNlIGNyYXNoIHdpbmRvdyDigJQgYVxuICogY3Jhc2ggQUZURVIgdGhlIGV2ZW50IHB1Ymxpc2ggYnV0IEJFRk9SRSB0aGUgZGVmZXJyZWQgZW50aXR5IHdyaXRlXG4gKiBsZWF2ZXMgdGhlIGV2ZW50IGluIHRoZSBsb2cgd2l0aCB0aGUgaG9vayBlbnRpdHkgbWlzc2luZy4gQSByZXRyeVxuICogdGhlbiBjb2xsaWRlcyBhdCB0aGUgZXZlbnQgcHVibGlzaCBhbmQgdGhyb3dzXG4gKiBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKGNvcnJlY3Qg4oCUIHRoZSBldmVudCBJUyBjb21taXR0ZWQpLCBidXRcbiAqIHdpdGhvdXQgdGhpcyByZXBhaXIgdGhlIGVudGl0eSB3b3VsZCBzdGF5IG1pc3NpbmcgZm9yZXZlciBhbmQgdGhlXG4gKiBob29rIHdvdWxkIGJlIHVucmVzb2x2YWJsZS5cbiAqXG4gKiBUaGUgZW50aXR5IE1VU1QgYmUgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBwZXJzaXN0ZWQgY2Fub25pY2FsXG4gKiBldmVudCdzIHBheWxvYWQg4oCUIE5PVCB0aGUgcmV0cnkncyBgZXZlbnREYXRhYCDigJQgb3RoZXJ3aXNlIGEgcmV0cnlcbiAqIGNhcnJ5aW5nIGRpZmZlcmVudCBgbWV0YWRhdGFgIC8gYGlzV2ViaG9va2Agd291bGQgc2lsZW50bHkgY2hhbmdlXG4gKiBjb21taXR0ZWQgc3RhdGUuIFRoZSB3cml0ZSB1c2VzIGB3cml0ZUV4Y2x1c2l2ZWAgKGNyZWF0ZS1pZi1hYnNlbnQpXG4gKiBzbyBhIGNvbmN1cnJlbnQgd3JpdGVyIHJhY2luZyB0aGlzIHJlcGFpciBjYW5ub3QgYmUgb3ZlcndyaXR0ZW47XG4gKiB3aGljaGV2ZXIgd3JpdGUgbGFuZHMgZmlyc3QsIHRoZSBjb250ZW50IGlzIGlkZW50aWNhbCBiZWNhdXNlIGJvdGhcbiAqIGRlcml2ZSBmcm9tIHRoZSBzYW1lIHBlcnNpc3RlZCBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgcGVyc2lzdGVkRXZlbnRJZDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke3BlcnNpc3RlZEV2ZW50SWR9YDtcbiAgY29uc3QgcGVyc2lzdGVkRXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICBiYXNlZGlyLFxuICAgICdldmVudHMnLFxuICAgIGNvbXBvc2l0ZUtleSxcbiAgICBFdmVudFNjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKFxuICAgICFwZXJzaXN0ZWRFdmVudCB8fFxuICAgIHBlcnNpc3RlZEV2ZW50LmV2ZW50VHlwZSAhPT0gJ2hvb2tfY3JlYXRlZCcgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5jb3JyZWxhdGlvbklkICE9PSBob29rSWRcbiAgKSB7XG4gICAgLy8gTm90aGluZyB0cnVzdHdvcnRoeSB0byByZXBhaXIgZnJvbS5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnaG9va3MnLFxuICAgIGhvb2tJZCxcbiAgICBIb29rU2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgLy8gRW50aXR5IGFscmVhZHkgcHJlc2VudCDigJQgbm90IGFuIG9ycGhhbiwgbGVhdmUgaXQgdW50b3VjaGVkLlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBldmVudERhdGEgPSAocGVyc2lzdGVkRXZlbnQuZXZlbnREYXRhID8/IHt9KSBhcyB7XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBTZXJpYWxpemVkRGF0YTtcbiAgICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgfTtcbiAgaWYgKHR5cGVvZiBldmVudERhdGEudG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhvb2s6IEhvb2sgPSB7XG4gICAgcnVuSWQsXG4gICAgaG9va0lkLFxuICAgIHRva2VuOiBldmVudERhdGEudG9rZW4sXG4gICAgbWV0YWRhdGE6IGV2ZW50RGF0YS5tZXRhZGF0YSxcbiAgICBvd25lcklkOiAnbG9jYWwtb3duZXInLFxuICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgIGNyZWF0ZWRBdDogcGVyc2lzdGVkRXZlbnQuY3JlYXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBwZXJzaXN0ZWRFdmVudC5zcGVjVmVyc2lvbixcbiAgICBpc1dlYmhvb2s6IGV2ZW50RGF0YS5pc1dlYmhvb2sgPz8gdHJ1ZSxcbiAgICBpc1N5c3RlbTogZXZlbnREYXRhLmlzU3lzdGVtID8/IGZhbHNlLFxuICB9O1xuICBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdob29rcycsIGhvb2tJZCwgdGFnKSxcbiAgICBKU09OLnN0cmluZ2lmeShob29rLCBqc29uUmVwbGFjZXIsIDIpXG4gICk7XG59XG5cbi8qKlxuICogQXRvbWljYWxseSBwaW4gYSBjYW5vbmljYWwgYGhvb2tfY3JlYXRlZGAgZXZlbnRJZCBmb3IgYSBsZWdhY3lcbiAqIGNsYWltIChvbmUgd2l0aG91dCBhbiBpbmxpbmUgYGV2ZW50SWRgKS4gVGhlIGZpcnN0IHJldHJ5IHRvXG4gKiBgd3JpdGVFeGNsdXNpdmVgIHRoZSByZWNvdmVyeSBtYXJrZXIgd2luczsgaXRzIGBjYW5kaWRhdGVFdmVudElkYFxuICogYmVjb21lcyBjYW5vbmljYWwuIFN1YnNlcXVlbnQgcmV0cmllcyByZWFkIHRoZSBtYXJrZXIgYW5kIGFkb3B0XG4gKiBpdHMgYGV2ZW50SWRgLiBUb2dldGhlciB3aXRoIHRoZSBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgaW5cbiAqIHRoZSBvdXRlciBldmVudCBwdWJsaXNoLCB0aGlzIGdpdmVzIHRoZSBsZWdhY3ktZmFsbGJhY2sgcGF0aCB0aGVcbiAqIHNhbWUgc2luZ2xlLWV2ZW50IGNvbnZlcmdlbmNlIGd1YXJhbnRlZSBhcyB0aGUgaW5saW5lLWBldmVudElkYFxuICogZmFzdCBwYXRoLlxuICpcbiAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBldmVudElkIGZvciB0aGUgY2FsbGVyIHRvIGFkb3B0LCBvciBgbnVsbGBcbiAqIGlmIHdlIGxvc3QgdGhlIG1hcmtlciByYWNlIEFORCB0aGUgcmVzdWx0aW5nIG1hcmtlciBmaWxlIGlzXG4gKiB1bnJlYWRhYmxlIChleHRyZW1lbHkgcmFyZTsgY29ycnVwdGVkIGRpc2spLiBDYWxsZXJzIHRyZWF0IGBudWxsYFxuICogYXMgXCJnaXZlIHVwLCB0aHJvdyBgRW50aXR5Q29uZmxpY3RFcnJvcmBcIiBzbyB0aGUgcnVudGltZSdzXG4gKiBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoIHN3YWxsb3dzIHRoaXMgYXR0ZW1wdCBhbmQgbGV0c1xuICogYW5vdGhlciBvbmUgdGhyb3VnaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGluQ2Fub25pY2FsRXZlbnRJZEZvckxlZ2FjeUNsYWltKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhvb2tJZDogc3RyaW5nLFxuICBjYW5kaWRhdGVFdmVudElkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBtYXJrZXJQYXRoID0gaG9va1JlY292ZXJ5TWFya2VyUGF0aChiYXNlZGlyLCB0b2tlbiwgcnVuSWQsIGhvb2tJZCk7XG4gIGNvbnN0IG1hcmtlckNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7IGV2ZW50SWQ6IGNhbmRpZGF0ZUV2ZW50SWQgfSk7XG4gIGNvbnN0IHdvbiA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKG1hcmtlclBhdGgsIG1hcmtlckNvbnRlbnQpO1xuICBpZiAod29uKSB7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZUV2ZW50SWQ7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZWFkSG9va1JlY292ZXJ5TWFya2VyKG1hcmtlclBhdGgpO1xuICByZXR1cm4gZXhpc3Rpbmc/LmV2ZW50SWQgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBJbi1wcm9jZXNzIHBlci1rZXkgYXN5bmMgbXV0ZXggYmFja2VkIGJ5IGEgY2FsbGVyLXN1cHBsaWVkIGBNYXBgLlxuICogVXNlZCBieSBgY3JlYXRlRXZlbnRzU3RvcmFnZWAgdG8gc2VyaWFsaXplIHNhbWUta2V5IGV2ZW50IHdyaXRlc1xuICogKGBzdGVwXypgIGZvciB0aGUgc2FtZSBzdGVwLCBgaG9va19jcmVhdGVkYCBmb3IgdGhlIHNhbWUgaG9vaykuXG4gKiBUaGUgbWFwIGlzIGluc3RhbnRpYXRlZCBwZXItc3RvcmFnZS1pbnN0YW5jZSDigJQgZGlmZmVyZW50XG4gKiBpbnN0YW5jZXMgZG8gTk9UIHNoYXJlIGxvY2tzLCBzbyB0d28gaW5zdGFuY2VzIHNoYXJpbmcgb25lIGRhdGFcbiAqIGRpcmVjdG9yeSBiZWhhdmUgZXhhY3RseSBsaWtlIHR3byBzZXBhcmF0ZSBPUyBwcm9jZXNzZXMgZnJvbSB0aGVcbiAqIGxvY2tpbmcgc3RhbmRwb2ludC4gQ3Jvc3MtaW5zdGFuY2UgLyBjcm9zcy1wcm9jZXNzIGFyYml0cmF0aW9uXG4gKiByZWxpZXMgb24gdGhlIG9uLWRpc2sgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIHdpdGhJblByb2Nlc3NMb2NrPFQ+KFxuICBsb2NrczogTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4sXG4gIGtleTogc3RyaW5nLFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHByZXYgPSBsb2Nrcy5nZXQoa2V5KTtcbiAgY29uc3QgdGFza0JveDogeyB0YXNrPzogUHJvbWlzZTxUPiB9ID0ge307XG4gIGNvbnN0IHRhc2sgPSAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwcmV2KSB7XG4gICAgICAvLyBXYWl0IGZvciB0aGUgcHJldmlvdXMgdGFzayB0byBzZXR0bGU7IGRvbid0IGluaGVyaXQgaXRzIGVycm9ycy5cbiAgICAgIGF3YWl0IHByZXYuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAobG9ja3MuZ2V0KGtleSkgPT09IHRhc2tCb3gudGFzaykge1xuICAgICAgICBsb2Nrcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKCk7XG4gIHRhc2tCb3gudGFzayA9IHRhc2s7XG4gIGxvY2tzLnNldChrZXksIHRhc2spO1xuICByZXR1cm4gdGFzaztcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVsZXRlIGFsbCB3YWl0cyBhc3NvY2lhdGVkIHdpdGggYSB3b3JrZmxvdyBydW4uXG4gKiBDYWxsZWQgd2hlbiBhIHJ1biByZWFjaGVzIGEgdGVybWluYWwgc3RhdGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3YWl0c0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnd2FpdHMnKTtcbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBsaXN0SlNPTkZpbGVzKHdhaXRzRGlyKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAvLyBmaWxlSWRzIG1heSBjb250YWluIHRhZyBzdWZmaXhlcyAoZS5nLiwgXCJ3cnVuX0FCQy1jb3JySWQudml0ZXN0LTBcIilcbiAgICAvLyBidXQgc3RhcnRzV2l0aCBzdGlsbCBtYXRjaGVzIGNvcnJlY3RseSBzaW5jZSB0aGUgdGFnIGlzIGEgc3VmZml4LlxuICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoYCR7cnVuSWR9LWApKSB7XG4gICAgICBjb25zdCB3YWl0UGF0aCA9IHBhdGguam9pbih3YWl0c0RpciwgYCR7ZmlsZX0uanNvbmApO1xuICAgICAgYXdhaXQgZGVsZXRlSlNPTih3YWl0UGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGVyc2lzdCBhIGxpZmVjeWNsZS1kcml2ZW4gcnVuIHVwZGF0ZSAocnVuX3N0YXJ0ZWQgLyBydW5fY29tcGxldGVkIC9cbiAqIHJ1bl9mYWlsZWQgLyBydW5fY2FuY2VsbGVkKSB1bmRlciB0aGUgc2hhcmVkIHBlci1ydW4gZmlsZSBsb2NrLFxuICogcmUtcmVhZGluZyB0aGUgb24tZGlzayBydW4gaW5zaWRlIHRoZSBsb2NrIHNvIGFueSBhdHRyaWJ1dGUgd3JpdGVzXG4gKiB0aGF0IGxhbmRlZCBiZXR3ZWVuIHRoZSBwcmUtdmFsaWRhdGlvbiBgY3VycmVudFJ1bmAgcmVhZCBhbmQgdGhpc1xuICogd3JpdGUgYXJlIHByZXNlcnZlZC4gV2l0aG91dCB0aGUgcmUtcmVhZCwgYW4gYGV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXNgXG4gKiBjYWxsIHNhbmR3aWNoZWQgYmV0d2VlbiB0aGUgbGlmZWN5Y2xlIHJlYWQgYW5kIHdyaXRlIHdvdWxkIGJlXG4gKiBzaWxlbnRseSBvdmVyd3JpdHRlbiBieSB0aGUgbGlmZWN5Y2xlIHdyaXRlJ3Mgc3RhbGUgYXR0cmlidXRlIHNuYXBzaG90LlxuICpcbiAqIGBwcm9wb3NlZGAgaXMgdGhlIGZ1bGx5LWNvbnN0cnVjdGVkIHJ1biByb3cgdGhlIGNhbGxlciB3YW50cyB0b1xuICogd3JpdGUgKHdpdGggdGhlIGNvcnJlY3QgZGlzY3JpbWluYXRlZC11bmlvbiBzdGF0dXMgYnJhbmNoKS4gT25seSB0aGVcbiAqIGBhdHRyaWJ1dGVzYCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmcmVzaGVzdCB2ZXJzaW9uIGluc2lkZSB0aGVcbiAqIGxvY2suXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrPFQgZXh0ZW5kcyBXb3JrZmxvd1J1bj4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHByb3Bvc2VkOiBUXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHdpdGhSdW5GaWxlTG9jayhydW5JZCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZyZXNoID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgcnVuSWQsIHRhZyksXG4gICAgICBXb3JrZmxvd1J1blNjaGVtYVxuICAgICk7XG4gICAgY29uc3QgbmV4dDogVCA9IHtcbiAgICAgIC4uLnByb3Bvc2VkLFxuICAgICAgYXR0cmlidXRlczogZnJlc2g/LmF0dHJpYnV0ZXMgPz8gcHJvcG9zZWQuYXR0cmlidXRlcyxcbiAgICB9O1xuICAgIGF3YWl0IHdyaXRlSlNPTih0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgcnVuSWQsIHRhZyksIG5leHQsIHtcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZXZlbnRzIHN0b3JhZ2UgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIGZpbGVzeXN0ZW0uXG4gKiBJbXBsZW1lbnRzIHRoZSBTdG9yYWdlWydldmVudHMnXSBpbnRlcmZhY2Ugd2l0aCBjcmVhdGUsIGxpc3QsIGFuZCBsaXN0QnlDb3JyZWxhdGlvbklkIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsRXZlbnRzU3RvcmFnZSA9IFN0b3JhZ2VbJ2V2ZW50cyddICYge1xuICBjbGVhckNhY2hlKCk6IHZvaWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IExvY2FsRXZlbnRzU3RvcmFnZSB7XG4gIC8vIEV2ZW50cyBhcmUgYXBwZW5kLW9ubHkuIEtlZXAgYSBib3VuZGVkIHdpbmRvdyBvZiBsb2NhbGx5IHBlcnNpc3RlZCBldmVudHNcbiAgLy8gYXZhaWxhYmxlIHRvIGltbWVkaWF0ZSByZXBsYXkgd2l0aG91dCByZXJlYWRpbmcgSlNPTiBmaWxlcy4gUGF5bG9hZCBieXRlc1xuICAvLyBhbmQgZW50cnkgY291bnQgYXJlIGJvdGggYm91bmRlZCBzbyBhY3RpdmUvd2FpdGluZyBydW5zIGNhbm5vdCByZXRhaW5cbiAgLy8gdW5ib3VuZGVkIGhpc3RvcmllcyBpbiBhIGxvbmctbGl2ZWQgZGV2ZWxvcG1lbnQgc2VydmVyLlxuICBjb25zdCBtYXhDYWNoZWRFdmVudEJ5dGVzID0gNCAqIDEwMjQgKiAxMDI0O1xuICBjb25zdCBtYXhDYWNoZWRFdmVudEVudHJpZXMgPSAxMDAwO1xuICBjb25zdCBldmVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEV2ZW50PigpO1xuICBjb25zdCBjYWNoZWRFdmVudEJ5dGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3QgY2FjaGVkUGF0aHNCeVJ1bklkID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBsZXQgdG90YWxDYWNoZWRFdmVudEJ5dGVzID0gMDtcblxuICBmdW5jdGlvbiBkZWxldGVDYWNoZWRFdmVudChldmVudFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRDYWNoZS5nZXQoZXZlbnRQYXRoKTtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50Q2FjaGUuZGVsZXRlKGV2ZW50UGF0aCk7XG4gICAgdG90YWxDYWNoZWRFdmVudEJ5dGVzIC09IGNhY2hlZEV2ZW50Qnl0ZXMuZ2V0KGV2ZW50UGF0aCkgPz8gMDtcbiAgICBjYWNoZWRFdmVudEJ5dGVzLmRlbGV0ZShldmVudFBhdGgpO1xuICAgIGNvbnN0IGNhY2hlZFBhdGhzID0gY2FjaGVkUGF0aHNCeVJ1bklkLmdldChldmVudC5ydW5JZCk7XG4gICAgY2FjaGVkUGF0aHM/LmRlbGV0ZShldmVudFBhdGgpO1xuICAgIGlmIChjYWNoZWRQYXRocz8uc2l6ZSA9PT0gMCkge1xuICAgICAgY2FjaGVkUGF0aHNCeVJ1bklkLmRlbGV0ZShldmVudC5ydW5JZCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJSdW5DYWNoZShydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjYWNoZWRQYXRoIG9mIGNhY2hlZFBhdGhzQnlSdW5JZC5nZXQocnVuSWQpID8/IFtdKSB7XG4gICAgICBkZWxldGVDYWNoZWRFdmVudChjYWNoZWRQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIGV2ZW50Q2FjaGUuY2xlYXIoKTtcbiAgICBjYWNoZWRFdmVudEJ5dGVzLmNsZWFyKCk7XG4gICAgY2FjaGVkUGF0aHNCeVJ1bklkLmNsZWFyKCk7XG4gICAgdG90YWxDYWNoZWRFdmVudEJ5dGVzID0gMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhY2hlRXZlbnQoXG4gICAgZXZlbnRQYXRoOiBzdHJpbmcsXG4gICAgY2FjaGVkRXZlbnQ6IEV2ZW50LFxuICAgIHNlcmlhbGl6ZWRCeXRlczogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGlmIChzZXJpYWxpemVkQnl0ZXMgPiBtYXhDYWNoZWRFdmVudEJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2hpbGUgKFxuICAgICAgZXZlbnRDYWNoZS5zaXplID4gMCAmJlxuICAgICAgKGV2ZW50Q2FjaGUuc2l6ZSA+PSBtYXhDYWNoZWRFdmVudEVudHJpZXMgfHxcbiAgICAgICAgdG90YWxDYWNoZWRFdmVudEJ5dGVzICsgc2VyaWFsaXplZEJ5dGVzID4gbWF4Q2FjaGVkRXZlbnRCeXRlcylcbiAgICApIHtcbiAgICAgIGNvbnN0IG9sZGVzdFBhdGggPSBldmVudENhY2hlLmtleXMoKS5uZXh0KCkudmFsdWUgYXMgc3RyaW5nO1xuICAgICAgZGVsZXRlQ2FjaGVkRXZlbnQob2xkZXN0UGF0aCk7XG4gICAgfVxuXG4gICAgZXZlbnRDYWNoZS5zZXQoZXZlbnRQYXRoLCBjYWNoZWRFdmVudCk7XG4gICAgY2FjaGVkRXZlbnRCeXRlcy5zZXQoZXZlbnRQYXRoLCBzZXJpYWxpemVkQnl0ZXMpO1xuICAgIHRvdGFsQ2FjaGVkRXZlbnRCeXRlcyArPSBzZXJpYWxpemVkQnl0ZXM7XG4gICAgY29uc3QgY2FjaGVkUGF0aHMgPVxuICAgICAgY2FjaGVkUGF0aHNCeVJ1bklkLmdldChjYWNoZWRFdmVudC5ydW5JZCkgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY2FjaGVkUGF0aHMuYWRkKGV2ZW50UGF0aCk7XG4gICAgY2FjaGVkUGF0aHNCeVJ1bklkLnNldChjYWNoZWRFdmVudC5ydW5JZCwgY2FjaGVkUGF0aHMpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBpbi1tZW1vcnkgY2FjaGUgZm9yIGFuIGV2ZW50IHRoYXQgd2FzIGp1c3QgcGVyc2lzdGVkIGF0XG4gIC8vIGBldmVudFBhdGhgLiBgc2VyaWFsaXplZEV2ZW50YCBtdXN0IGJlIHRoZSBleGFjdCBieXRlIHBheWxvYWQgd3JpdHRlblxuICAvLyB0byBkaXNrOiBkZWNvZGluZyBpdCAoaW5zdGVhZCBvZiB0aGUgY2FsbGVyJ3MgYGV2ZW50YCkgYm90aCBkZXRhY2hlc1xuICAvLyBjYWxsZXItb3duZWQgcGF5bG9hZHMgYW5kIG1hdGNoZXMgZGlzay1yZWFkIG5vcm1hbGl6YXRpb24uIENhbGxlcnNcbiAgLy8gbXVzdCBjYXB0dXJlIGBzZXJpYWxpemVkRXZlbnRgICpiZWZvcmUqIHRoZSB3cml0ZSdzIGBhd2FpdGAgc28gdGhlXG4gIC8vIGNhY2hlZCBzbmFwc2hvdCBjYW4gbmV2ZXIgb2JzZXJ2ZSBhIGxhdGVyIG11dGF0aW9uLlxuICBmdW5jdGlvbiByZW1lbWJlclN0b3JlZEV2ZW50KFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBldmVudFBhdGg6IHN0cmluZyxcbiAgICBzZXJpYWxpemVkRXZlbnQ6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICAvLyBUZXJtaW5hbCBydW5zIHJlbGVhc2UgdGhlaXIgY2FjaGVkIGhpc3Rvcnkgc28gYSBsb25nLWxpdmVkIGRldlxuICAgIC8vIHNlcnZlciBkb2Vzbid0IHJldGFpbiBjb21wbGV0ZWQgcnVucyBmb3JldmVyLlxuICAgIGlmIChpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlKGV2ZW50LmV2ZW50VHlwZSkpIHtcbiAgICAgIGNsZWFyUnVuQ2FjaGUoZXZlbnQucnVuSWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmlhbGl6ZWRCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHNlcmlhbGl6ZWRFdmVudCk7XG4gICAgaWYgKHNlcmlhbGl6ZWRCeXRlcyA+IG1heENhY2hlZEV2ZW50Qnl0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjYWNoZWRFdmVudCA9IEV2ZW50U2NoZW1hLnNhZmVQYXJzZShcbiAgICAgIEpTT04ucGFyc2Uoc2VyaWFsaXplZEV2ZW50LCBqc29uUmV2aXZlcilcbiAgICApO1xuICAgIGlmIChjYWNoZWRFdmVudC5zdWNjZXNzKSB7XG4gICAgICBjYWNoZUV2ZW50KGV2ZW50UGF0aCwgY2FjaGVkRXZlbnQuZGF0YSwgc2VyaWFsaXplZEJ5dGVzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzdG9yZUV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV2ZW50UGF0aCA9IHRhZ2dlZFBhdGgoXG4gICAgICBiYXNlZGlyLFxuICAgICAgJ2V2ZW50cycsXG4gICAgICBgJHtldmVudC5ydW5JZH0tJHtldmVudC5ldmVudElkfWAsXG4gICAgICB0YWdcbiAgICApO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRFdmVudCA9IEpTT04uc3RyaW5naWZ5KGV2ZW50LCBqc29uUmVwbGFjZXIsIDIpO1xuICAgIGF3YWl0IHdyaXRlKGV2ZW50UGF0aCwgc2VyaWFsaXplZEV2ZW50KTtcbiAgICByZW1lbWJlclN0b3JlZEV2ZW50KGV2ZW50LCBldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG4gIH1cblxuICAvLyBQZXItaW5zdGFuY2UgaW4tcHJvY2VzcyBtdXRleGVzLiBUd28gc3RvcmFnZSBpbnN0YW5jZXMgc2hhcmluZ1xuICAvLyBvbmUgZGF0YSBkaXJlY3RvcnkgZ2V0IGluZGVwZW5kZW50IGxvY2sgbWFwcywgd2hpY2ggbWFrZXMgdGhlbVxuICAvLyBiZWhhdmUgbGlrZSB0d28gc2VwYXJhdGUgT1MgcHJvY2Vzc2VzIGZyb20gdGhlIGxvY2tpbmdcbiAgLy8gc3RhbmRwb2ludCDigJQgY3Jvc3MtaW5zdGFuY2UgYXJiaXRyYXRpb24gcmVsaWVzIG9uIHRoZSBvbi1kaXNrXG4gIC8vIGB3cml0ZUV4Y2x1c2l2ZWAgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIGluc3RlYWQuIFRlc3RzIHVzZVxuICAvLyB0aGlzIHRvIGV4ZXJjaXNlIGNyb3NzLXByb2Nlc3MgY29udmVyZ2VuY2Ugd2l0aG91dCBzcGF3bmluZ1xuICAvLyBzdWJwcm9jZXNzZXMuXG4gIC8vXG4gIC8vIGBzdGVwTG9ja3NgIHNlcmlhbGl6ZXMgc3RlcCBsaWZlY3ljbGUgZXZlbnRzIGZvciB0aGUgc2FtZVxuICAvLyAocnVuSWQsIGNvcnJlbGF0aW9uSWQpOiBzZWUgY29tbWVudCBmdXJ0aGVyIGRvd24gaW4gdGhlXG4gIC8vIGBpc1N0ZXBFdmVudGAgYnJhbmNoLlxuICAvL1xuICAvLyBgaG9va0xvY2tzYCBzZXJpYWxpemVzIGBob29rX2NyZWF0ZWRgIGNhbGxzIGZvciB0aGUgc2FtZVxuICAvLyAocnVuSWQsIGNvcnJlbGF0aW9uSWQpIHNvIHRoZSBcImNsYWltIHRva2VuLCB0aGVuIHdyaXRlIGhvb2tcbiAgLy8gZW50aXR5ICsgZXZlbnRcIiBzZXF1ZW5jZSBydW5zIHRvIGNvbXBsZXRpb24gYmVmb3JlIGFub3RoZXJcbiAgLy8gaW4tcHJvY2VzcyBpbnZvY2F0aW9uIGVudGVycyB0aGUgZGVkdXAgYnJhbmNoLlxuICBjb25zdCBzdGVwTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcbiAgY29uc3QgaG9va0xvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhckNhY2hlLFxuICAgIGFzeW5jIGNyZWF0ZShydW5JZCwgZGF0YSwgcGFyYW1zKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgLy8gVmFsaWRhdGUgcmVxdWVzdC1zdXBwbGllZCBJRHMgYmVmb3JlIHRoZXkncmUgY29uY2F0ZW5hdGVkIGludG9cbiAgICAgIC8vIGZpbGVzeXN0ZW0gcGF0aHMuIFRoaXMgaXMgdGhlIHByaW1hcnkgZGVmZW5zZSBhZ2FpbnN0IHBhdGggdHJhdmVyc2FsXG4gICAgICAvLyBhdHRhY2tzIHdoZXJlIGEgY2xpZW50IHN1cHBsaWVzIHJ1bklkIC8gY29ycmVsYXRpb25JZCB2YWx1ZXMgbGlrZVxuICAgICAgLy8gXCIuLi8uLi8uLi9wYWNrYWdlXCIgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gICAgICAvLyBSdW4gYmVmb3JlIHRha2luZyB0aGUgcGVyLXN0ZXAgbXV0ZXggc28gbWFsZm9ybWVkIGlucHV0cyBmYWlsIGZhc3QuXG4gICAgICAvL1xuICAgICAgLy8gRW1wdHkgYGNvcnJlbGF0aW9uSWRgIHZhbHVlcyBhcmUgYWxzbyByZWplY3RlZCBoZXJlOiB0aGUgZXZlbnRcbiAgICAgIC8vIHNjaGVtYXMgb25seSByZXF1aXJlIGB6LnN0cmluZygpYCwgc28gd2l0aG91dCB0aGlzIGNoZWNrIGFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIHdhaXRfY3JlYXRlZCByZXF1ZXN0IHdpdGhcbiAgICAgIC8vIGBjb3JyZWxhdGlvbklkOiAnJ2Agd291bGQgc2lsZW50bHkgYmUgd3JpdHRlbiB1bmRlciBhIG1hbGZvcm1lZFxuICAgICAgLy8gY29tcG9zaXRlIGtleSBsaWtlIGAke3J1bklkfS1gLlxuICAgICAgaWYgKHJ1bklkICE9IG51bGwgJiYgcnVuSWQgIT09ICcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICB9XG4gICAgICBpZiAoJ2NvcnJlbGF0aW9uSWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBzZXJpYWxpemVkIHBlci1zdGVwIHZpYSBhbiBpbi1wcm9jZXNzIG11dGV4XG4gICAgICAvLyBzbyB0aGF0IHRoZSBcImNoZWNrIHN0YXRlLCB0aGVuIHdyaXRlXCIgc2VxdWVuY2UgaW4gc3RlcF9zdGFydGVkIC9cbiAgICAgIC8vIHN0ZXBfY29tcGxldGVkIC8gc3RlcF9mYWlsZWQgLyBzdGVwX3JldHJ5aW5nIGlzIGF0b21pYy4gc3RlcF9jcmVhdGVkXG4gICAgICAvLyBpcyBhbHNvIHNlcmlhbGl6ZWQgc28gZHVwbGljYXRlLWNyZWF0ZSByYWNlcyBkb24ndCBsZWF2ZSBleHRyYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50cyBpbiB0aGUgbG9nLlxuICAgICAgY29uc3QgaXNTdGVwRXZlbnQgPVxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZyc7XG4gICAgICBpZiAoaXNTdGVwRXZlbnQgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgIHJldHVybiB3aXRoSW5Qcm9jZXNzTG9jayhzdGVwTG9ja3MsIGxvY2tLZXksICgpID0+IGNyZWF0ZUltcGwoKSk7XG4gICAgICB9XG4gICAgICAvLyBgaG9va19jcmVhdGVkYCBpcyBzZXJpYWxpemVkIHBlci0ocnVuSWQsIGhvb2tJZCkgc28gdGhlXG4gICAgICAvLyBcImNsYWltIHRva2VuLCB3cml0ZSBob29rIGVudGl0eSwgd3JpdGUgZXZlbnRcIiBzZXF1ZW5jZSBydW5zIHRvXG4gICAgICAvLyBjb21wbGV0aW9uIGJlZm9yZSBhbm90aGVyIGluLXByb2Nlc3MgaW52b2NhdGlvbiBlbnRlcnMgdGhlXG4gICAgICAvLyBzYW1lLWhvb2sgZGVkdXAgYnJhbmNoLiBXaXRob3V0IHRoaXMsIHR3byBzYW1lLXRpY2sgY29uY3VycmVudFxuICAgICAgLy8gY2FsbGVycyBjYW4gcmFjZSBiZXR3ZWVuIHRoZSB3aW5uZXIncyBgd3JpdGVFeGNsdXNpdmUoY2xhaW0pYFxuICAgICAgLy8gYW5kIGB3cml0ZUpTT04oaG9vaylgLCBtYWtpbmcgdGhlIHNlY29uZCBjYWxsZXIgbW9tZW50YXJpbHlcbiAgICAgIC8vIG9ic2VydmUgYSBjbGFpbSB3aXRoIG5vIG1hdGNoaW5nIGhvb2sgZW50aXR5IOKAlCB3aGljaCB0aGVcbiAgICAgIC8vIGNyYXNoLXJlY292ZXJ5IHBhdGggYmVsb3cgd291bGQgbWlzaW50ZXJwcmV0IGFzIGEgcHJpb3IgY3Jhc2hcbiAgICAgIC8vIGFuZCBpbmNvcnJlY3RseSBmYWxsIHRocm91Z2ggdG8gYSBzZWNvbmQgaG9vayBlbnRpdHkgd3JpdGUuXG4gICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmIHJ1bklkICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBsb2NrS2V5ID0gdGFnXG4gICAgICAgICAgPyBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2suJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5ob29rYDtcbiAgICAgICAgcmV0dXJuIHdpdGhJblByb2Nlc3NMb2NrKGhvb2tMb2NrcywgbG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbXBsKCk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUltcGwoKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgICAvLyBNb3N0IHBhdGhzIHVzZSB0aGUgZnJlc2hseS1nZW5lcmF0ZWQgY2FuZGlkYXRlIGV2ZW50SWQuIFRoZVxuICAgICAgICAvLyBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgcGF0aCBiZWxvdyBtYXkgcmVhc3NpZ24gaXQgdG9cbiAgICAgICAgLy8gdGhlIGNhbm9uaWNhbCBldmVudElkIHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbVxuICAgICAgICAvLyBzbyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICAvLyBGb3IgcnVuX2NyZWF0ZWQgZXZlbnRzLCB1c2UgY2xpZW50LXByb3ZpZGVkIHJ1bklkIG9yIGdlbmVyYXRlIG9uZSBzZXJ2ZXItc2lkZVxuICAgICAgICBsZXQgZWZmZWN0aXZlUnVuSWQ6IHN0cmluZztcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICghcnVuSWQgfHwgcnVuSWQgPT09ICcnKSkge1xuICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkID0gYHdydW5fJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgfSBlbHNlIGlmICghcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3J1bklkIGlzIHJlcXVpcmVkIGZvciBub24tcnVuX2NyZWF0ZWQgZXZlbnRzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBydW5JZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNsaWVudC1wcm92aWRlZCBydW5JZCB0aW1lc3RhbXAgaXMgd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiBydW5JZCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAoXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICd3cnVuXydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IodmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzcGVjVmVyc2lvbiBpcyBhbHdheXMgc2VudCBieSB0aGUgcnVudGltZSwgYnV0IHdlIHByb3ZpZGUgYSBmYWxsYmFjayBmb3Igc2FmZXR5XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNwZWNWZXJzaW9uID0gZGF0YS5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVDtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBydW4gc3RhdGUgZm9yIHZhbGlkYXRpb24gKGlmIG5vdCBjcmVhdGluZyBhIG5ldyBydW4pXG4gICAgICAgIC8vIFNraXAgcnVuIHZhbGlkYXRpb24gZm9yIHN0ZXBfY29tcGxldGVkIGFuZCBzdGVwX3JldHJ5aW5nIC0gdGhleSBvbmx5IG9wZXJhdGVcbiAgICAgICAgLy8gb24gcnVubmluZyBzdGVwcywgYW5kIHJ1bm5pbmcgc3RlcHMgYXJlIGFsd2F5cyBhbGxvd2VkIHRvIG1vZGlmeSByZWdhcmRsZXNzXG4gICAgICAgIC8vIG9mIHJ1biBzdGF0ZS4gVGhpcyBvcHRpbWl6YXRpb24gc2F2ZXMgZmlsZXN5c3RlbSByZWFkcyBwZXIgc3RlcCBldmVudC5cbiAgICAgICAgbGV0IGN1cnJlbnRSdW46IFdvcmtmbG93UnVuIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHNraXBSdW5WYWxpZGF0aW9uRXZlbnRzID0gWydzdGVwX2NvbXBsZXRlZCcsICdzdGVwX3JldHJ5aW5nJ107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSAhPT0gJ3J1bl9jcmVhdGVkJyAmJlxuICAgICAgICAgICFza2lwUnVuVmFsaWRhdGlvbkV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0YXJ0OiBydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuIHdpdGggZXZlbnREYXRhXG4gICAgICAgICAgLy8gY3JlYXRlcyB0aGUgcnVuIGZpcnN0LCBzbyB0aGUgcXVldWUgY2FuIGJvb3RzdHJhcCBhIHJ1biB0aGF0XG4gICAgICAgICAgLy8gZmFpbGVkIHRvIGNyZWF0ZSBkdXJpbmcgc3RhcnQoKS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJlxuICAgICAgICAgICAgIWN1cnJlbnRSdW4gJiZcbiAgICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGEgJiZcbiAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBydW5JbnB1dERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZD86IHN0cmluZztcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICBpbnB1dD86IGFueTtcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuZGVwbG95bWVudElkICYmXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmlucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcChcbiAgICAgICAgICAgICAgICAgIChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBBdG9taWNhbGx5IHRyeSB0byBwdWJsaXNoIHRoZSBydW4gZW50aXR5IHNvIG9ubHkgdGhlIGZpcnN0XG4gICAgICAgICAgICAgIC8vIHdyaXRlciB3aW5zLCBwcmV2ZW50aW5nIGEgVE9DVE9VIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50XG4gICAgICAgICAgICAgIC8vIHJ1bl9jcmVhdGVkIGZyb20gc3RhcnQoKSBjb3VsZCBvdmVyd3JpdGUgYSBydW4gdGhhdCB3YXNcbiAgICAgICAgICAgICAgLy8gYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gJ3J1bm5pbmcnLlxuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkUnVuOiBXb3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXREYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGNvbnN0IHJ1blBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgICAgICBydW5QYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNyZWF0ZWRSdW4sIGpzb25SZXBsYWNlcilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZWQgdGhlIHJ1biDigJQgYWxzbyB3cml0ZSB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBldmVudElkOiBydW5DcmVhdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdG9yZUV2ZW50KHJ1bkNyZWF0ZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGNyZWF0ZWRSdW47XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZXhpc3RzIChjb25jdXJyZW50IHJ1bl9jcmVhdGVkIHdvbiB0aGVcbiAgICAgICAgICAgICAgICAvLyByYWNlKS4gUmUtcmVhZCBpdCBzbyBkb3duc3RyZWFtIGxvZ2ljIHNlZXMgdGhlIHJlYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcnVuX2ZhaWxlZCBvbiBhIG5vbi1leGlzdGVudCBydW4gaXMgcmVqZWN0ZWQgdG8gbWF0Y2ggdGhlXG4gICAgICAgIC8vIHBvc3RncmVzIGFuZCB2ZXJjZWwgd29ybGRzLCB3aGljaCBib3RoIHN1cmZhY2UgdGhpcyBhcyBhXG4gICAgICAgIC8vIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciByYXRoZXIgdGhhbiBzaWxlbnRseSBwZXJzaXN0aW5nIGFuXG4gICAgICAgIC8vIGV2ZW50IGZvciBhIHJ1biB0aGF0IHdhcyBuZXZlciBjcmVhdGVkLlxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZFUlNJT04gQ09NUEFUSUJJTElUWTogQ2hlY2sgcnVuIHNwZWMgdmVyc2lvblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRm9yIGV2ZW50cyB0aGF0IGhhdmUgZmV0Y2hlZCB0aGUgcnVuLCBjaGVjayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIC8vIFNraXAgZm9yIHJ1bl9jcmVhdGVkIChubyBleGlzdGluZyBydW4pIGFuZCBydW50aW1lIGV2ZW50cyAoc3RlcF9jb21wbGV0ZWQsIHN0ZXBfcmV0cnlpbmcpLlxuICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHJ1biByZXF1aXJlcyBhIG5ld2VyIHdvcmxkIHZlcnNpb25cbiAgICAgICAgICBpZiAocmVxdWlyZXNOZXdlcldvcmxkKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuTm90U3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICAgIGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24hLFxuICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fQ1VSUkVOVFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSb3V0ZSB0byBsZWdhY3kgaGFuZGxlciBmb3IgcHJlLWV2ZW50LXNvdXJjaW5nIHJ1bnNcbiAgICAgICAgICBpZiAoaXNMZWdhY3lTcGVjVmVyc2lvbihjdXJyZW50UnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUxlZ2FjeUV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY3VycmVudFJ1bixcbiAgICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBWQUxJREFUSU9OOiBUZXJtaW5hbCBzdGF0ZSBhbmQgZXZlbnQgb3JkZXJpbmcgY2hlY2tzXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAgIC8vIExhenkgc3RlcCBzdGFydDogYSBzdGVwX3N0YXJ0ZWQgY2Fycnlpbmcgc3RlcC1jcmVhdGlvbiBkYXRhXG4gICAgICAgIC8vIChzdGVwTmFtZSArIGlucHV0KSBpcyBhbGxvd2VkIHRvIGFycml2ZSB3aXRoIG5vIHByaW9yIHN0ZXBfY3JlYXRlZFxuICAgICAgICAvLyDigJQgaXQgY3JlYXRlcyB0aGUgc3RlcCBvbiB0aGUgZmx5IChzZWUgdGhlIG1hdGVyaWFsaXphdGlvbiBibG9ja1xuICAgICAgICAvLyBiZWxvdykuIFRoaXMgbWlycm9ycyB0aGUgcmVzaWxpZW50IHJ1bl9zdGFydGVkIHBhdGguIERldGVjdCBpdCBoZXJlXG4gICAgICAgIC8vIHNvIHRoZSBlbnRpdHktY3JlYXRpb24gdGVybWluYWwtcnVuIGd1YXJkIHRyZWF0cyBpdCBsaWtlIGEgY3JlYXRpb25cbiAgICAgICAgLy8gYW5kIHRoZSBcInN0ZXAgbXVzdCBleGlzdFwiIG9yZGVyaW5nIGd1YXJkIGRvZXNuJ3QgcmVqZWN0IGl0LlxuICAgICAgICBjb25zdCBsYXp5U3RlcFN0YXJ0ID1cbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhICYmXG4gICAgICAgICAgISFkYXRhLmV2ZW50RGF0YSAmJlxuICAgICAgICAgIHR5cGVvZiAoZGF0YS5ldmVudERhdGEgYXMgeyBzdGVwTmFtZT86IHVua25vd24gfSkuc3RlcE5hbWUgPT09XG4gICAgICAgICAgICAnc3RyaW5nJyAmJlxuICAgICAgICAgIChkYXRhLmV2ZW50RGF0YSBhcyB7IGlucHV0PzogdW5rbm93biB9KS5pbnB1dCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIFJ1biB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyhjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICBjb25zdCBydW5UZXJtaW5hbEV2ZW50cyA9IFtcbiAgICAgICAgICAgICdydW5fc3RhcnRlZCcsXG4gICAgICAgICAgICAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIElkZW1wb3RlbnQgb3BlcmF0aW9uOiBydW5fY2FuY2VsbGVkIG9uIGFscmVhZHkgY2FuY2VsbGVkIHJ1biBpcyBhbGxvd2VkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJyAmJlxuICAgICAgICAgICAgY3VycmVudFJ1bi5zdGF0dXMgPT09ICdjYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgc3RhdGUgKGlkZW1wb3RlbnQpXG4gICAgICAgICAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCBzdG9yZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID1cbiAgICAgICAgICAgICAgcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBldmVudDogc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSksXG4gICAgICAgICAgICAgIHJ1bjogY3VycmVudFJ1bixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9yIHJ1bl9zdGFydGVkIG9uIHRlcm1pbmFsIHJ1bnMsIHVzZSBSdW5FeHBpcmVkRXJyb3Igc28gdGhlXG4gICAgICAgICAgLy8gcnVudGltZSBrbm93cyB0byBleGl0IHdpdGhvdXQgcmV0cnlpbmcuXG4gICAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cIiBpcyBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT3RoZXIgcnVuIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBub3QgYWxsb3dlZCBvbiB0ZXJtaW5hbCBydW5zXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcnVuVGVybWluYWxFdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCB0cmFuc2l0aW9uIHJ1biBmcm9tIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ3JlYXRpbmcgbmV3IGVudGl0aWVzIG9uIHRlcm1pbmFsIHJ1bnMgaXMgbm90IGFsbG93ZWQuIEEgbGF6eVxuICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBjcmVhdGVzIGEgc3RlcCwgc28gaXQgaXMgcmVqZWN0ZWQgaGVyZSB0b28g4oCUIGEgYmFyZVxuICAgICAgICAgIC8vIChub24tbGF6eSkgc3RlcF9zdGFydGVkIGZhbGxzIHRocm91Z2ggdG8gdGhlIHN0ZXAtdmFsaWRhdGlvblxuICAgICAgICAgIC8vIGJsb2NrIGJlbG93LCB3aGljaCB1c2VzIFJ1bkV4cGlyZWRFcnJvciBmb3IgdGVybWluYWwgcnVucy5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBsYXp5U3RlcFN0YXJ0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBjcmVhdGUgbmV3IGVudGl0aWVzIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3Qgc2V0IGF0dHJpYnV0ZXMgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcC1yZWxhdGVkIGV2ZW50IHZhbGlkYXRpb24gKG9yZGVyaW5nIGFuZCB0ZXJtaW5hbCBzdGF0ZSlcbiAgICAgICAgLy8gU3RvcmUgZXhpc3RpbmdTdGVwIHNvIHdlIGNhbiByZXVzZSBpdCBsYXRlciAoYXZvaWQgZG91YmxlIHJlYWQpXG4gICAgICAgIGxldCB2YWxpZGF0ZWRTdGVwOiBTdGVwIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHN0ZXBFdmVudHMgPSBbXG4gICAgICAgICAgJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHN0ZXBFdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICB2YWxpZGF0ZWRTdGVwID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgIHN0ZXBDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBTdGVwU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEV2ZW50IG9yZGVyaW5nOiBzdGVwIG11c3QgZXhpc3QgYmVmb3JlIHRoZXNlIGV2ZW50cyDigJQgZXhjZXB0IG9uXG4gICAgICAgICAgLy8gdGhlIGxhenktc3RhcnQgcGF0aCwgd2hlcmUgc3RlcF9zdGFydGVkIGNyZWF0ZXMgdGhlIHN0ZXAgaXRzZWxmLlxuICAgICAgICAgIGlmICghdmFsaWRhdGVkU3RlcCAmJiAhbGF6eVN0ZXBTdGFydCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBub3QgZm91bmRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIExhenkgc3RhcnQgZXhhY3RseS1vbmNlIGdhdGU6IGEgbGF6eSBzdGVwX3N0YXJ0ZWQgYWx3YXlzIENSRUFURVNcbiAgICAgICAgICAvLyB0aGUgc3RlcCAodGhlIG93bmVkLWlubGluZSBwYXRoIG9ubHkgc2VuZHMgb25lIGZvciBhIHN0ZXAgd2hvc2VcbiAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgaXQgZGVmZXJyZWQpLiBJZiB0aGUgc3RlcCBhbHJlYWR5IGV4aXN0cywgYSBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaGFuZGxlciB3b24gdGhlIGNyZWF0ZSDigJQgdGhpcyBjYWxsZXIgaXMgYSBsb3NlciBhbmQgbXVzdCBub3Qgc3RhcnRcbiAgICAgICAgICAvLyBvciBydW4gdGhlIHN0ZXAuIFRocm93IEVudGl0eUNvbmZsaWN0RXJyb3Igc28gdGhlIHJ1bnRpbWUnc1xuICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwIG1hcHMgaXQgdG8gYHNraXBwZWRgLiBUaGlzIGlzIGNyaXRpY2FsOiB0aGUgcGxhaW4gc3RhcnRcbiAgICAgICAgICAvLyB0cmFuc2l0aW9uIGJlbG93IHBlcm1pdHMgcmUtc3RhcnRpbmcgYSBub24tdGVybWluYWwgc3RlcCAocmV0cmllc1xuICAgICAgICAgIC8vIHJlbHkgb24gdGhhdCksIHNvIHdpdGhvdXQgdGhpcyBnYXRlIGEgbG9zZXIgd291bGQgcmUtc3RhcnQgYVxuICAgICAgICAgIC8vIHJ1bm5pbmcgc3RlcCBhbmQgcnVuIHRoZSBib2R5IGEgc2Vjb25kIHRpbWUuXG4gICAgICAgICAgaWYgKGxhenlTdGVwU3RhcnQgJiYgdmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdGVwIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb24uIHZhbGlkYXRlZFN0ZXAgY2FuIGJlIG51bGwgb25seSBvblxuICAgICAgICAgIC8vIHRoZSBsYXp5LXN0YXJ0IHBhdGggKG5vIHN0ZXAgeWV0KSDigJQgdGhlcmUgaXMgbm90aGluZyB0ZXJtaW5hbCB0b1xuICAgICAgICAgIC8vIGd1YXJkIGFnYWluc3QgaW4gdGhhdCBjYXNlLCBzbyB0aGVzZSBjaGVja3MgYXJlIHNraXBwZWQuXG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGlmIChpc1Rlcm1pbmFsU3RlcFN0YXR1cyh2YWxpZGF0ZWRTdGVwLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7dmFsaWRhdGVkU3RlcC5zdGF0dXN9XCJgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9uIHRlcm1pbmFsIHJ1bnM6IG9ubHkgYWxsb3cgY29tcGxldGluZy9mYWlsaW5nIGluLXByb2dyZXNzIHN0ZXBzXG4gICAgICAgICAgICBpZiAoY3VycmVudFJ1biAmJiBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMoY3VycmVudFJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IG5vbi1ydW5uaW5nIHN0ZXAgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSG9vay1yZWxhdGVkIGV2ZW50IHZhbGlkYXRpb24gKG9yZGVyaW5nKVxuICAgICAgICBjb25zdCBob29rRXZlbnRzUmVxdWlyaW5nRXhpc3RlbmNlID0gWydob29rX2Rpc3Bvc2VkJywgJ2hvb2tfcmVjZWl2ZWQnXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpICYmXG4gICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBIb29rU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghZXhpc3RpbmdIb29rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYGV2ZW50YCBtYXkgYmUgcmVhc3NpZ25lZCBsYXRlciBpbiB0aGUgYGhvb2tfY3JlYXRlZGBcbiAgICAgICAgLy8gZGVkdXAtcmVjb3ZlcnkgYnJhbmNoIHRvIHN3YXAgaW4gYSBjYW5vbmljYWwgZXZlbnRJZCAvXG4gICAgICAgIC8vIGNyZWF0ZWRBdCBwZXJzaXN0ZWQgaW4gdGhlIGR1cmFibGUgdG9rZW4gY2xhaW0gc29cbiAgICAgICAgLy8gY29uY3VycmVudCAvIGNyb3NzLXByb2Nlc3Mgd29ya2VycyBjb252ZXJnZSBvbiBhIHNpbmdsZVxuICAgICAgICAvLyBldmVudCBpbiB0aGUgbG9nLlxuICAgICAgICBsZXQgZXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICB9O1xuICAgICAgICAvLyBTdHJpcCBldmVudERhdGEgZnJvbSBydW5fc3RhcnRlZCDigJQgaXQgYmVsb25ncyBvbiBydW5fY3JlYXRlZCBvbmx5LlxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZXZlbnQpIHtcbiAgICAgICAgICBkZWxldGUgKGV2ZW50IGFzIGFueSkuZXZlbnREYXRhO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cmlwIG9ubHkgdGhlIHN0ZXAgYGlucHV0YCBmcm9tIHRoZSBsYXp5IHN0ZXBfc3RhcnRlZCBldmVudCByb3cg4oCUXG4gICAgICAgIC8vIGl0IGJlbG9uZ3Mgb24gdGhlIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgd3JpdHRlbiBhYm92ZS4gc3RlcE5hbWUgaXNcbiAgICAgICAgLy8gcHJlc2VydmVkIGZvciB0aGUgY2xpZW50IHJlcGxheSBjb25zdW1lcidzIHN0ZXAtbmFtZSBkaXZlcmdlbmNlXG4gICAgICAgIC8vIGNoZWNrIChwYWNrYWdlcy9jb3JlL3NyYy9zdGVwLnRzKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhenlTdGVwU3RhcnQgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBldmVudCAmJlxuICAgICAgICAgIChldmVudCBhcyB7IGV2ZW50RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLmV2ZW50RGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB7IGlucHV0OiBfc3RyaXBwZWRJbnB1dCwgLi4ucmVzdCB9ID0gKFxuICAgICAgICAgICAgZXZlbnQgYXMgeyBldmVudERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH1cbiAgICAgICAgICApLmV2ZW50RGF0YTtcbiAgICAgICAgICAoZXZlbnQgYXMgeyBldmVudERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pLmV2ZW50RGF0YSA9IHJlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBlbnRpdHkgY3JlYXRlZC91cGRhdGVkIGZvciBFdmVudFJlc3VsdFxuICAgICAgICBsZXQgcnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHN0ZXA6IFN0ZXAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob29rOiBIb29rIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgd2FpdDogV2FpdCB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBzZXQgdHJ1ZSB3aGVuIHRoaXMgc3RlcF9zdGFydGVkIGF0b21pY2FsbHkgY3JlYXRlZFxuICAgICAgICAvLyB0aGUgc3RlcCAodGhlIGNhbGxlciB3b24gdGhlIGNyZWF0ZS1jbGFpbSkuIFN1cmZhY2VkIG9uIEV2ZW50UmVzdWx0XG4gICAgICAgIC8vIGFzIHRoZSBydW50aW1lJ3MgZXhhY3RseS1vbmNlIG93bmVyc2hpcCBzaWduYWwuXG4gICAgICAgIGxldCBzdGVwQ3JlYXRlZExhemlseSA9IGZhbHNlO1xuICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIHRoZSBob29rIGVudGl0eSB3cml0ZSBpcyBkZWZlcnJlZCB1bnRpbFxuICAgICAgICAvLyBBRlRFUiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCBzdWNjZWVkcywgc28gYSByZXRyeSB0aGF0XG4gICAgICAgIC8vIGNvbGxpZGVzIHdpdGggYW4gYWxyZWFkeS1wdWJsaXNoZWQgYGhvb2tfY3JlYXRlZGAgZG9lcyBub3RcbiAgICAgICAgLy8gbXV0YXRlIHRoZSBkdXJhYmxlIGhvb2sgZW50aXR5IHdpdGggdGhlIHJldHJ5J3MgcGF5bG9hZC5cbiAgICAgICAgLy8gYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGNhcnJpZXMgdGhlIGB7IG92ZXJ3cml0ZSB9YCBtb2RlXG4gICAgICAgIC8vIGNob3NlbiBieSB0aGUgZGVkdXAtcmVjb3ZlcnkgYnJhbmNoIGFib3ZlICh1bmRlZmluZWQgZm9yXG4gICAgICAgIC8vIGZpcnN0IHdyaXRlcnMsIGB7IG92ZXJ3cml0ZTogdHJ1ZSB9YCBmb3IgcmV0cmllcyB0aGF0IG1heVxuICAgICAgICAvLyBiZSByZXBhaXJpbmcgYW4gb3JwaGFuZWQgcGFydGlhbCB3cml0ZSkuXG4gICAgICAgIGxldCBob29rRW50aXR5V3JpdGVPcHRpb25zOiB7IG92ZXJ3cml0ZTogYm9vbGVhbiB9IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENyZWF0ZS91cGRhdGUgZW50aXR5IGJhc2VkIG9uIGV2ZW50IHR5cGUgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgICAvLyBSdW4gbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHJ1bkRhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IFNlcmlhbGl6ZWREYXRhO1xuICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogdHJ1ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJ1bkRhdGEuYXR0cmlidXRlcyA/PyB7fSkubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiBydW5EYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5EYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5EYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgcnVuIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuRGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgaW5wdXQ6IHJ1bkRhdGEuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5EYXRhLmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gQXRvbWljYWxseSBwdWJsaXNoIHRoZSBydW4gZW50aXR5IGZpbGUgd2l0aG91dCBvdmVyd3JpdGluZyBhblxuICAgICAgICAgIC8vIGV4aXN0aW5nIHdpbm5lci4gVGhpcyBwcmV2ZW50cyBhIFRPQ1RPVSByYWNlIHdpdGggdGhlIHJlc2lsaWVudFxuICAgICAgICAgIC8vIHN0YXJ0IHBhdGggKHJ1bl9zdGFydGVkIG9uIG5vbi1leGlzdGVudCBydW4pIHRoYXQgY291bGQgcmVzdWx0IGluXG4gICAgICAgICAgLy8gZHVwbGljYXRlIHJ1bl9jcmVhdGVkIGV2ZW50cyBpbiB0aGUgZXZlbnQgbG9nLlxuICAgICAgICAgIGNvbnN0IHJ1blBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgcnVuUGF0aCxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJ1biwganNvblJlcGxhY2VyLCAyKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFjcmVhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7ZWZmZWN0aXZlUnVuSWR9XCIgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJykge1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIC8vIElmIGFscmVhZHkgcnVubmluZywgcmV0dXJuIHRoZSBydW4gd2l0aG91dCBpbnNlcnRpbmcgYVxuICAgICAgICAgICAgLy8gZHVwbGljYXRlIGV2ZW50LiAgVGhpcyBtYWtlcyBydW5fc3RhcnRlZCBpZGVtcG90ZW50IGZvclxuICAgICAgICAgICAgLy8gY29uY3VycmVudCBpbnZvY2F0aW9ucy4gIFdlIG9taXQgcHJlbG9hZGVkIGV2ZW50cyBoZXJlXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoaXMgaXMgYSByYXJlIHJhY2UtY29uZGl0aW9uIHBhdGgg4oCUIHRoZSBydW50aW1lXG4gICAgICAgICAgICAvLyBmYWxscyBiYWNrIHRvIGxvYWRXb3JrZmxvd1J1bkV2ZW50cygpLlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSdW4uc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcnVuOiBjdXJyZW50UnVuIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQgPz8gbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHsgb3V0cHV0PzogYW55IH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBjb21wbGV0ZWREYXRhLm91dHB1dCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBmYWlsZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgZmllbGQgaXMgU2VyaWFsaXplZERhdGEgKFVpbnQ4QXJyYXkpIHByb2R1Y2VkIGJ5XG4gICAgICAgICAgICAvLyBkZWh5ZHJhdGVSdW5FcnJvci4gV2Ugc3RvcmUgaXQgdmVyYmF0aW0g4oCUIGNvbnN1bWVycyBoeWRyYXRlIGl0XG4gICAgICAgICAgICAvLyB2aWEgaHlkcmF0ZVJ1bkVycm9yIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZmFpbGVkRGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgIGVycm9yQ29kZTogZmFpbGVkRGF0YS5lcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbEhvb2tzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgICAgZGVsZXRlQWxsV2FpdHNGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnY2FuY2VsbGVkJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJiBjdXJyZW50UnVuKSB7XG4gICAgICAgICAgcnVuID0gYXdhaXQgd2l0aFJ1bkZpbGVMb2NrKGVmZmVjdGl2ZVJ1bklkLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmVzaCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyksXG4gICAgICAgICAgICAgIFdvcmtmbG93UnVuU2NoZW1hXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFmcmVzaCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yKGVmZmVjdGl2ZVJ1bklkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyhkYXRhLmV2ZW50RGF0YS5jaGFuZ2VzLCB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nS2V5czogT2JqZWN0LmtleXMoZnJlc2guYXR0cmlidXRlcyksXG4gICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDbGFpbSB0aGUgY29ycmVsYXRpb24gZGVkdXAgbG9jayBvbmx5IGFmdGVyIHZhbGlkYXRpb246IGFcbiAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gZmFpbHVyZSBtdXN0IGxlYXZlIHRoZSBjb3JyZWxhdGlvbklkIHVuY2xhaW1lZCBzb1xuICAgICAgICAgICAgLy8gdGhlIHJ1bnRpbWUncyByZXRyeSBvZiB0aGUgc2FtZSBldmVudCBpcyBub3QgbWlzcmVwb3J0ZWQgYXNcbiAgICAgICAgICAgIC8vIFwiYWxyZWFkeSBleGlzdHNcIiB3aGlsZSB0aGUgZXZlbnQgd2FzIG5ldmVyIHdyaXR0ZW4gKHRoZVxuICAgICAgICAgICAgLy8gZGlzcGF0Y2hlciB3b3VsZCB0aGVuIHdhaXQgZm9yZXZlciBmb3IgYW4gZXZlbnQgdGhhdCBpcyBub3RcbiAgICAgICAgICAgIC8vIGluIHRoZSBsb2cpLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEud3JpdGVyLnR5cGUgPT09ICd3b3JrZmxvdydcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBhdHRyTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICAgICAgOiBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWRgO1xuICAgICAgICAgICAgICBjb25zdCBhdHRyTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVzJyxcbiAgICAgICAgICAgICAgICBhdHRyTG9ja05hbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShhdHRyTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgICAgaWYgKCFhdHRyQ2xhaW1lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgYEF0dHJpYnV0ZSBldmVudCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB7XG4gICAgICAgICAgICAgIC4uLmZyZXNoLFxuICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBhcHBseUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICAgICAgZnJlc2guYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS5jaGFuZ2VzXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfSBhcyBXb3JrZmxvd1J1bjtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpLFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQ6IENyZWF0ZXMgc3RlcCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3BlbmRpbmcnLCBhdHRlbXB0PTAsIGNyZWF0ZWRBdCBzZXQuXG4gICAgICAgICAgLy8gVHdvIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgd2l0aCBpZGVudGljYWwgY29ycmVsYXRpb25JZHMgKGUuZy4gdGhlXG4gICAgICAgICAgLy8gc25hcHNob3QgcnVudGltZSdzIGRldGVybWluaXN0aWMgY29ycmVsYXRpb25JZHMgYWNyb3NzIHJlcGxheXMpXG4gICAgICAgICAgLy8gbXVzdCBiZSBkZWR1cGVkIOKAlCBvdGhlcndpc2UgYm90aCB3cml0ZXMgc3VjY2VlZCBhbmQgdGhlIGV2ZW50IGxvZ1xuICAgICAgICAgIC8vIGVuZHMgdXAgd2l0aCBkdXBsaWNhdGUgc3RlcF9jcmVhdGVkIGVudHJpZXMuIFRoZSBvdXRlclxuICAgICAgICAgIC8vIHdpdGhTdGVwTG9jayBtdXRleCBzZXJpYWxpemVzIHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzOyB0aGlzXG4gICAgICAgICAgLy8gVGhlIGV4Y2x1c2l2ZSBjb25zdHJhaW50IGZpbGUgYWRkaXRpb25hbGx5IHByb3RlY3RzIGFnYWluc3RcbiAgICAgICAgICAvLyBjcm9zcy1wcm9jZXNzIHJhY2VzICh0d28gcG5wbSB3b3JrZXJzLCByZWRlbGl2ZXJlZCBxdWV1ZSBtZXNzYWdlcyxcbiAgICAgICAgICAvLyBldGMuKS4gVGhlIGxvc2VyIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAvLyBleGlzdGluZyBjYXRjaCBwYXRoIGNhbiBzd2FsbG93IGl0IGFuZCBhdm9pZCBkb3VibGUtcXVldWluZyB0aGVcbiAgICAgICAgICAvLyBzdGVwLlxuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc3RlcENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdGVwRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBpbnB1dDogYW55O1xuICAgICAgICAgIH07XG4gICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXBEYXRhLnN0ZXBOYW1lLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICBpbnB1dDogc3RlcERhdGEuaW5wdXQsXG4gICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhdHRlbXB0OiAwLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgc3RlcCBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICBzdGVwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQ6IEluY3JlbWVudHMgYXR0ZW1wdCwgc2V0cyBzdGF0dXMgdG8gJ3J1bm5pbmcnXG4gICAgICAgICAgLy8gU2V0cyBzdGFydGVkQXQgb25seSBvbiB0aGUgZmlyc3Qgc3RhcnQgKG5vdCB1cGRhdGVkIG9uIHJldHJpZXMpXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcblxuICAgICAgICAgIC8vIExhenkgc3RlcCBzdGFydDogbm8gcHJpb3Igc3RlcF9jcmVhdGVkIOKAlCBjcmVhdGUgdGhlIHN0ZXAgZW50aXR5XG4gICAgICAgICAgLy8gYW5kIGEgc3ludGhldGljIHN0ZXBfY3JlYXRlZCBldmVudCBub3csIHRoZW4gZmFsbCB0aHJvdWdoIHRvIHRoZVxuICAgICAgICAgIC8vIHN0YXJ0IHRyYW5zaXRpb24gYmVsb3cuIE1pcnJvcnMgdGhlIHJlc2lsaWVudCBydW5fc3RhcnRlZCBwYXRoOlxuICAgICAgICAgIC8vIHRoZSBzdGVwIGVudGl0eSBpcyBjbGFpbWVkIGF0b21pY2FsbHkgKGZpcnN0IHdyaXRlciB3aW5zKSBhbmQgdGhlXG4gICAgICAgICAgLy8gc3ludGhldGljIHN0ZXBfY3JlYXRlZCBldmVudCBrZWVwcyByZXBsYXkgY29ycmVjdCAodGhlIGNsaWVudCBzdGVwXG4gICAgICAgICAgLy8gY29uc3VtZXIgbWFya3MgaGFzQ3JlYXRlZEV2ZW50IG9ubHkgd2hlbiBpdCBvYnNlcnZlcyB0aGF0IGV2ZW50KS5cbiAgICAgICAgICBpZiAoIXZhbGlkYXRlZFN0ZXAgJiYgbGF6eVN0ZXBTdGFydCkge1xuICAgICAgICAgICAgY29uc3QgbGF6eURhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlucHV0OiBhbnk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZENsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXN0ZXBDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgICAvLyBBIGNvbmN1cnJlbnQgaGFuZGxlciBhbHJlYWR5IGNsYWltZWQgdGhlIGNyZWF0ZSBmb3IgdGhpc1xuICAgICAgICAgICAgICAvLyBzdGVwLiBUaGUgYXRvbWljIGNsYWltIGlzIHRoZSBleGFjdGx5LW9uY2Ugb3duZXJzaGlwIGdhdGU6XG4gICAgICAgICAgICAgIC8vIG9ubHkgdGhlIHdpbm5lciBydW5zIHRoZSBzdGVwIGJvZHkgaW5saW5lLiBUaHJvd1xuICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIOKAlCB0aGUgcnVudGltZSdzIGV4ZWN1dGVTdGVwIG1hcHMgdGhpcyB0b1xuICAgICAgICAgICAgICAvLyBgc2tpcHBlZGAsIHNvIHRoZSBsb3NlciBkb2VzIG5vdCBzdGFydCBvciBydW4gdGhlIHN0ZXAuIFRoaXNcbiAgICAgICAgICAgICAgLy8gcHJlc2VydmVzIHRoZSBzYW1lIFwiZXhhY3RseSBvbmUgaGFuZGxlciBvd25zIGVhY2ggc3RlcFwiXG4gICAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGUgc2VwYXJhdGUgc3RlcF9jcmVhdGVkIGNsYWltIHByb3ZpZGVzIHRvZGF5LlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRTdGVwOiBTdGVwID0ge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBzdGVwTmFtZTogbGF6eURhdGEuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGxhenlEYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogMCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgICAgIGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gLFxuICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkU3RlcFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgc3ludGhldGljIHN0ZXBfY3JlYXRlZCBldmVudCBzbyByZXBsYXkgb2JzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgLy8gKHRoZSBjbGllbnQgc3RlcCBjb25zdW1lciBzZXRzIGhhc0NyZWF0ZWRFdmVudCBvbmx5IG9uIGFcbiAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50KS4gSXRzIGV2ZW50SWQgaXMgYSBmcmVzaCBtb25vdG9uaWMgVUxJRC5cbiAgICAgICAgICAgICAgLy8gT3JkZXJpbmcgdnMuIHRoZSBzdGVwX3N0YXJ0ZWQgZXZlbnQgcm93IGRvZXMgbm90IGFmZmVjdFxuICAgICAgICAgICAgICAvLyBjb3JyZWN0bmVzczogdGhlIHN0ZXBfc3RhcnRlZCBjb25zdW1lciBpcyBhIG5vLW9wIGFuZCBvbmx5XG4gICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBmbGlwcyBoYXNDcmVhdGVkRXZlbnQsIHNvIHRoZSBlbmQgc3RhdGUgaXMgdGhlXG4gICAgICAgICAgICAgIC8vIHNhbWUgd2hpY2hldmVyIHNvcnRzIGZpcnN0IOKAlCB0aGlzIG1hdGNoZXMgdGhlIHJlc2lsaWVudFxuICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCDihpIgcnVuX2NyZWF0ZWQgcHJlY2VkZW50IGluIHRoaXMgZmlsZS5cbiAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRFdmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZDogc3RlcENyZWF0ZWRFdmVudElkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZTogbGF6eURhdGEuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICBpbnB1dDogbGF6eURhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICAgICAgICAgICBgJHtlZmZlY3RpdmVSdW5JZH0tJHtzdGVwQ3JlYXRlZEV2ZW50SWR9YCxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRFdmVudFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwID0gY3JlYXRlZFN0ZXA7XG4gICAgICAgICAgICAgIHN0ZXBDcmVhdGVkTGF6aWx5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcmV0cnlBZnRlciB0aW1lc3RhbXAgaGFzbid0IGJlZW4gcmVhY2hlZCB5ZXRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgPiBEYXRlLm5vdygpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb0Vhcmx5RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBzdGFydCBzdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCI6IHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldGAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlcjogTWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgICAgICAodmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGd1YXJkOiByZS1yZWFkIHRoZSBzdGVwIGVudGl0eSB0byBjaGVjayBpZiBpdFxuICAgICAgICAgICAgLy8gcmVhY2hlZCB0ZXJtaW5hbCBzdGF0ZSBiZXR3ZWVuIHRoZSB2YWxpZGF0aW9uIHJlYWQgYW5kIG5vdy5cbiAgICAgICAgICAgIC8vIFRoaXMgbmFycm93cyB0aGUgVE9DVE9VIHdpbmRvdyBidXQgZG9lcyBub3QgZnVsbHkgZWxpbWluYXRlIGl0XG4gICAgICAgICAgICAvLyAodGhlIGxvY2FsIHdvcmxkIGlzIHNpbmdsZS1wcm9jZXNzIC8gZGV2LW9ubHk7IHRoZSBwb3N0Z3Jlc1xuICAgICAgICAgICAgLy8gd29ybGQgdXNlcyBTUUwtbGV2ZWwgYXRvbWljIGd1YXJkcyBmb3IgcHJvZHVjdGlvbikuXG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBmcmVzaFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGZyZXNoU3RlcCAmJiBpc1Rlcm1pbmFsU3RlcFN0YXR1cyhmcmVzaFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtmcmVzaFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgLy8gT25seSBzZXQgc3RhcnRlZEF0IG9uIHRoZSBmaXJzdCBzdGFydFxuICAgICAgICAgICAgICBzdGFydGVkQXQ6IHZhbGlkYXRlZFN0ZXAuc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGF0dGVtcHQgY291bnRlciBvbiBldmVyeSBzdGFydFxuICAgICAgICAgICAgICBhdHRlbXB0OiB2YWxpZGF0ZWRTdGVwLmF0dGVtcHQgKyAxLFxuICAgICAgICAgICAgICAvLyBDbGVhciByZXRyeUFmdGVyIG5vdyB0aGF0IHRoZSBzdGVwIGhhcyBzdGFydGVkXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZDogVGVybWluYWwgc3RhdGUgd2l0aCBvdXRwdXRcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGNvbXBsZXRpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IHJlc3VsdDogYW55IH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgb3V0cHV0OiBjb21wbGV0ZWREYXRhLnJlc3VsdCxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX2ZhaWxlZDogVGVybWluYWwgc3RhdGUgd2l0aCBlcnJvclxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZmFpbGluZyB0aGUgc2FtZSBzdGVwIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWwuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsYDtcbiAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIGxvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKHRlcm1pbmFsTG9ja1BhdGgsICcnKTtcbiAgICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlU3RlcEVycm9yLiBXZSBzdG9yZSBpdCB2ZXJiYXRpbSDigJQgY29uc3VtZXJzIGh5ZHJhdGUgaXRcbiAgICAgICAgICAgIC8vIHZpYSBoeWRyYXRlU3RlcEVycm9yIHRvIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUuXG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICBlcnJvcjogZmFpbGVkRGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9yZXRyeWluZzogU2V0cyBzdGF0dXMgYmFjayB0byAncGVuZGluZycsIHJlY29yZHMgZXJyb3JcbiAgICAgICAgICAvLyBSZXVzZSB2YWxpZGF0ZWRTdGVwIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGNvbnN0IHJldHJ5RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgcmV0cnlBZnRlcj86IERhdGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgIGVycm9yOiByZXRyeURhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgcmV0cnlBZnRlcjogcmV0cnlEYXRhLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBIb29rIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGhvb2tEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgdG9rZW46IHN0cmluZztcbiAgICAgICAgICAgIG1ldGFkYXRhPzogYW55O1xuICAgICAgICAgICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICAgICAgICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gQXRvbWljYWxseSBjbGFpbSB0aGUgdG9rZW4gdXNpbmcgYW4gZXhjbHVzaXZlLWNyZWF0ZSBjb25zdHJhaW50IGZpbGUuXG4gICAgICAgICAgLy8gVGhpcyBhdm9pZHMgdGhlIFRPQ1RPVSByYWNlIG9mIHRoZSBwcmV2aW91cyByZWFkLWFsbC10aGVuLWNoZWNrIGFwcHJvYWNoLlxuICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICAndG9rZW5zJyxcbiAgICAgICAgICAgIGAke2hhc2hUb2tlbihob29rRGF0YS50b2tlbil9Lmpzb25gXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBXaGVuIHRoZSBjbGFpbSBpcyBhYnNlbnQsIHRoZSBldmVudCBsb2cgaXMgdGhlIG9ubHkgZHVyYWJsZSBzb3VyY2VcbiAgICAgICAgICAvLyB0aGF0IGNhbiBkaXN0aW5ndWlzaCBhIGZpcnN0IGhvb2sgZnJvbSBhIGNyYXNoLWxvc3QgdG9rZW4gY2FjaGUuXG4gICAgICAgICAgaWYgKCEoYXdhaXQgcmVhZEhvb2tUb2tlbkNsYWltKGNvbnN0cmFpbnRQYXRoKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlYnVpbGRMaXZlSG9va0J5VG9rZW5Gcm9tRXZlbnRMb2coXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFBlcnNpc3QgYGV2ZW50SWRgIGluIHRoZSBjbGFpbSBzbyBjb25jdXJyZW50IC8gY3Jvc3MtXG4gICAgICAgICAgLy8gcHJvY2VzcyByZXRyaWVzIGNhbiBjb252ZXJnZSBvbiBhIHNpbmdsZSBjYW5vbmljYWxcbiAgICAgICAgICAvLyBgaG9va19jcmVhdGVkYCBldmVudCBwYXRoLiBTZWUgdGhlIHJlY292ZXJ5IGNvbW1lbnRcbiAgICAgICAgICAvLyBiZWxvdy5cbiAgICAgICAgICBjb25zdCB0b2tlbkNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIGNvbnN0cmFpbnRQYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZWNvdmVyeSBzaGFwZTogdGhlIGR1cmFibGUgcmVjb3JkIG9mIGEgc3VjY2Vzc2Z1bCBob29rXG4gICAgICAgICAgLy8gY3JlYXRpb24gaXMgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgICAgICAgIC8vIGNsYWltIGZpbGUgYW5kIGhvb2sgZW50aXR5IGFyZSB3cml0dGVuIGJlZm9yZSB0aGUgZXZlbnQsXG4gICAgICAgICAgLy8gYW5kIHRoZSB0aHJlZSB3cml0ZXMgYXJlIE5PVCBhdG9taWMsIHNvIGEgY3Jhc2ggYXQgYW55XG4gICAgICAgICAgLy8gcG9pbnQgY2FuIGxlYXZlIG9uZSBvciB0d28gb2YgdGhlbSBvbiBkaXNrIHdpdGhvdXQgdGhlXG4gICAgICAgICAgLy8gZXZlbnQuIFRyZWF0aW5nIHRob3NlIGFzIFwiY29tcGxldGVkXCIgd291bGQgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgc3dhbGxvdyB0aGUgcmV0cnkgYW5kIHBlcm1hbmVudGx5IGxvc2VcbiAgICAgICAgICAvLyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZnJvbSB0aGUgbG9nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2hlbiB0aGUgZGVkdXAgYnJhbmNoIGZpcmVzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYCxcbiAgICAgICAgICAvLyB3ZSBjb252ZXJnZSBvbiB0aGUgY2Fub25pY2FsIGBldmVudElkYCBwZXJzaXN0ZWQgaW4gdGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBieSB0aGUgb3JpZ2luYWwgKHdpbm5pbmcpIGB3cml0ZUV4Y2x1c2l2ZWAuIEJ5XG4gICAgICAgICAgLy8gYWRvcHRpbmcgdGhhdCBldmVudElkIGZvciB0aGlzIHJldHJ5J3MgZXZlbnQgd3JpdGUg4oCUIGFuZFxuICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG91dGVyIG5vLW92ZXJ3cml0ZSBgd3JpdGVKU09OYCBmb3IgdGhlIGV2ZW50XG4gICAgICAgICAgLy8gdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgIG9uIGNvbGxpc2lvbiDigJQgY29uY3VycmVudCAvXG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGVpdGhlcjpcbiAgICAgICAgICAvLyAgIC0gcHVibGlzaCB0aGUgc2FtZSBldmVudCBhdCB0aGUgc2FtZSBwYXRoIGV4YWN0bHkgb25jZVxuICAgICAgICAgIC8vICAgICAodGhlIGxvc2VyJ3MgYHdyaXRlSlNPTmAgdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gICAgICAgICAgLy8gICAgIHdoaWNoIHRoZSBydW50aW1lJ3MgZXhpc3RpbmcgY29uY3VycmVudC1yZXBsYXkgY2F0Y2hcbiAgICAgICAgICAvLyAgICAgcGF0aCBhdCBzdXNwZW5zaW9uLWhhbmRsZXIudHM6MTQyIHN3YWxsb3dzKSwgb3JcbiAgICAgICAgICAvLyAgIC0gY29udmVyZ2Ugb24gYSBzaW5nbGUgcmVjb3Zlcnkgd3JpdGUgd2hlbiB0aGUgcHJpb3JcbiAgICAgICAgICAvLyAgICAgY2xhaW0gd2FzIG9ycGhhbmVkIGJ5IGEgY3Jhc2ggYmVmb3JlIHRoZSBldmVudCBsYW5kZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgbGVnYWN5IGZhbGxiYWNrIChgZXhpc3RpbmdDbGFpbS5ldmVudElkYCB1bmRlZmluZWQpXG4gICAgICAgICAgLy8gaXMgZm9yIGNsYWltIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgd2FzIGFkZGVkIOKAlFxuICAgICAgICAgIC8vIHRob3NlIHByb2JlIHRoZSBldmVudCBsb2cgZGlyZWN0bHkgYW5kIGZhbGwgdGhyb3VnaCB0byBhXG4gICAgICAgICAgLy8gZnJlc2gtZXZlbnRJZCByZWNvdmVyeSB3cml0ZS4gVGhlIGxlZ2FjeSBwYXRoIGRvZXMgbm90XG4gICAgICAgICAgLy8gY29udmVyZ2UgYWNyb3NzIHdvcmtlcnMgYnV0IGNhbm5vdCByZWdyZXNzIGJlaGF2aW9yIGZvclxuICAgICAgICAgIC8vIGZyZXNobHktd3JpdHRlbiBjbGFpbXMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgYHdpdGhIb29rTG9ja2AgaW4tcHJvY2VzcyBtdXRleCBhYm92ZSBrZWVwcyB0d28gc2FtZS1cbiAgICAgICAgICAvLyB0aWNrIGluLXByb2Nlc3MgY2FsbGVycyBmcm9tIHJhY2luZyBpbnRvIHRoaXMgYnJhbmNoIHdpdGhcbiAgICAgICAgICAvLyB0aGUgd2lubmVyIG1pZC13cml0ZSwgYnV0IGlzIG5vdCBzdWZmaWNpZW50IGFjcm9zc1xuICAgICAgICAgIC8vIHByb2Nlc3NlcyDigJQgdGhlIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IChgY2xhaW0uZXZlbnRJZGApXG4gICAgICAgICAgLy8gaXMgd2hhdCBjbG9zZXMgdGhlIGNyb3NzLXByb2Nlc3MgcmFjZS5cbiAgICAgICAgICBsZXQgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCF0b2tlbkNsYWltZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW0gPSBhd2FpdCByZWFkSG9va1Rva2VuQ2xhaW0oY29uc3RyYWludFBhdGgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0/LnJ1bklkID09PSBlZmZlY3RpdmVSdW5JZCAmJlxuICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLmhvb2tJZCA9PT0gZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRvcHQgYSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIHJlY292ZXJ5IHdyaXRlLiBUaGVcbiAgICAgICAgICAgICAgLy8gb3V0ZXIgZXZlbnQgcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKVxuICAgICAgICAgICAgICAvLyBlaXRoZXIgc3VjY2VlZHMgKHdlIHB1Ymxpc2ggdGhlIGNhbm9uaWNhbCBldmVudCxcbiAgICAgICAgICAgICAgLy8gcmVwYWlyaW5nIGEgcGFydGlhbCB3cml0ZSBsZWZ0IGJ5IHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAvLyBjbGFpbWFudCkgb3IgcmV0dXJucyBgZmFsc2VgIGFuZCB3ZSB0aHJvd1xuICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKHRoZSBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAvLyBwdWJsaXNoZWQg4oCUIGEgcmVhbCBkdXBsaWNhdGUpLiBFaXRoZXIgd2F5IHRoZSBsb2dcbiAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIGV4YWN0bHkgb25lIGBob29rX2NyZWF0ZWRgIGV2ZW50IGZvciB0aGlzXG4gICAgICAgICAgICAgIC8vIGAocnVuSWQsIGhvb2tJZClgLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgY2Fub25pY2FsIGV2ZW50SWQgY29tZXMgZnJvbSBvbmUgb2YgdHdvIHBsYWNlczpcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIGBleGlzdGluZ0NsYWltLmV2ZW50SWRgIGZvciBjbGFpbXMgd3JpdHRlbiBieVxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyB2ZXJzaW9uICh0aGUgd3JpdGVyIGFib3ZlIHBlcnNpc3RzIHRoZVxuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXRvbWljYWxseSB3aXRoIHRoZSBjbGFpbSkuXG4gICAgICAgICAgICAgIC8vICAgICBUaGUgZXZlbnRJZCBpcyBkdXJhYmxlLCBzbyB0aGUgb3V0ZXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBhbG9uZSBpcyBlbm91Z2ggdG9cbiAgICAgICAgICAgICAgLy8gICAgIGFyYml0cmF0ZSBwdWJsaWNhdGlvbjogaXQgZmFpbHMgaWZmIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgd2FzIGFscmVhZHkgcHVibGlzaGVkIGF0IHRoYXQgZXhhY3QgcGF0aC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIFRoZSByZWNvdmVyeS1tYXJrZXIgc2lkZWNhciBmb3IgbGVnYWN5IGNsYWltc1xuICAgICAgICAgICAgICAvLyAgICAgd3JpdHRlbiBiZWZvcmUgYGV2ZW50SWRgIHdhcyBwZXJzaXN0ZWQgaW5saW5lXG4gICAgICAgICAgICAgIC8vICAgICBpbiB0aGUgY2xhaW0uIFRoZSBtYXJrZXIgaXMgaXRzZWxmIGFcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZWAsIHNvIHRoZSBmaXJzdCByZXRyeSBwaW5zIGl0c1xuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXMgY2Fub25pY2FsIGFuZCBzdWJzZXF1ZW50XG4gICAgICAgICAgICAgIC8vICAgICByZXRyaWVzIGFkb3B0IGl0LiBXaXRob3V0IHRoaXMsIHR3byBwcm9jZXNzZXNcbiAgICAgICAgICAgICAgLy8gICAgIGJvdGggcmVhZGluZyB0aGUgc2FtZSBsZWdhY3kgY2xhaW0gd291bGQgZWFjaFxuICAgICAgICAgICAgICAvLyAgICAgZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmQgdGhlaXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHBhdGhzLCBhbmQgYXBwZW5kIHR3byBldmVudHMuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vICAgICBGb3IgbGVnYWN5IGNsYWltcyB3ZSBhbHNvIG11c3QgcHJvYmUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICBsb2cgZm9yIGFuIGV4aXN0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50IEJFRk9SRVxuICAgICAgICAgICAgICAvLyAgICAgcGlubmluZyBhIGNhbm9uaWNhbCBldmVudElkOiB0aGUgcHJlLXVwZ3JhZGVcbiAgICAgICAgICAgICAgLy8gICAgIHdyaXRlciBtYXkgaGF2ZSBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHdpdGggaXRzIG93biBldmVudElkLCBhbmQgdGhlIG1hcmtlciBoYXMgbm8gd2F5XG4gICAgICAgICAgICAgIC8vICAgICBvZiBrbm93aW5nIHRoYXQgZXZlbnRJZCBhZnRlciB0aGUgZmFjdC4gV2l0aG91dFxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyBwcm9iZSwgYSBwb3N0LXVwZ3JhZGUgcmV0cnkgd291bGQgcGluIGFcbiAgICAgICAgICAgICAgLy8gICAgIGRpZmZlcmVudCBldmVudElkLCB3cml0ZSBhIGhvb2sgZW50aXR5LCBhbmRcbiAgICAgICAgICAgICAgLy8gICAgIHB1Ymxpc2ggYSBkdXBsaWNhdGUgZXZlbnQgYXQgdGhlIG1hcmtlcidzIHBhdGguXG4gICAgICAgICAgICAgIGxldCBjYW5vbmljYWxFdmVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZ0NsYWltLmV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWxFdmVudElkID0gZXhpc3RpbmdDbGFpbS5ldmVudElkO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlQdWJsaXNoZWRFdmVudElkID1cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmUtdXBncmFkZSB3cml0ZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgZXZlbnQgcHVibGlzaCBhbmQgaXRzIGhvb2sgZW50aXR5IHdyaXRlIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gcmVwYWlyIHRoZSBlbnRpdHkgZnJvbSB0aGUgcGVyc2lzdGVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgIC8vIHBheWxvYWQgYmVmb3JlIHN1cmZhY2luZyB0aGUgYmVuaWduIGR1cGxpY2F0ZS5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlQdWJsaXNoZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWQgPSBhd2FpdCBwaW5DYW5vbmljYWxFdmVudElkRm9yTGVnYWN5Q2xhaW0oXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChwaW5uZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIExvc3QgdGhlIG1hcmtlciByYWNlIGFuZCB0aGUgbWFya2VyIGZpbGUgaXNcbiAgICAgICAgICAgICAgICAgIC8vIHVucmVhZGFibGUgKGV4dHJlbWVseSByYXJlOyBjb3JydXB0ZWQgZGlzaykuXG4gICAgICAgICAgICAgICAgICAvLyBUcmVhdCBhcyBhIHJlYWwgZHVwbGljYXRlIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggc3dhbGxvd3MgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCBpbnN0ZWFkIG9mIHJpc2tpbmcgZGl2ZXJnZW50XG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaWNhdGlvbi5cbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbm9uaWNhbEV2ZW50SWQgPSBwaW5uZWQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZWJ1aWxkIGBldmVudGAgd2l0aCB0aGUgY2Fub25pY2FsIGV2ZW50SWQgYW5kIGFcbiAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBgY3JlYXRlZEF0YCBkZXJpdmVkIGZyb20gdGhlIGV2ZW50SWRcbiAgICAgICAgICAgICAgLy8gKGEgVUxJRCkgc28gdHdvIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBldmVudFxuICAgICAgICAgICAgICAvLyBwcm9kdWNlIGJ5dGUtaWRlbnRpY2FsIGNvbnRlbnQuXG4gICAgICAgICAgICAgIGV2ZW50SWQgPSBjYW5vbmljYWxFdmVudElkO1xuICAgICAgICAgICAgICBjb25zdCBjYW5vbmljYWxDcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAgIHVsaWRUb0RhdGUoZXZlbnRJZC5yZXBsYWNlKC9eZXZudF8vLCAnJykpID8/IG5vdztcbiAgICAgICAgICAgICAgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGNhbm9uaWNhbENyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3Jvc3MtaG9vayAvIGNyb3NzLXJ1biBjb25mbGljdDogYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gKHJ1bklkLCBob29rSWQpIGhvbGRzIHRoaXMgdG9rZW4uIENyZWF0ZSBhXG4gICAgICAgICAgICAgIC8vIGhvb2tfY29uZmxpY3QgZXZlbnQgc28gdGhlIHdvcmtmbG93IGNhbiBmYWlsXG4gICAgICAgICAgICAgIC8vIGdyYWNlZnVsbHkgd2hlbiB0aGUgaG9vayBpcyBhd2FpdGVkLlxuICAgICAgICAgICAgICBjb25zdCBjb25mbGljdEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NvbmZsaWN0JyxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdDbGFpbVxuICAgICAgICAgICAgICAgICAgICA/IHsgY29uZmxpY3RpbmdSdW5JZDogZXhpc3RpbmdDbGFpbS5ydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIC8vIFBlcnNpc3QgYW5kIGNhY2hlIHRoZSBjb25mbGljdCBldmVudCAoY3JlYXRlLW9ubHksXG4gICAgICAgICAgICAgIC8vIHNhbWUgcGF0aCB0aGUgcmVhZCBjYWNoZSBrZXlzIG9uKSBzbyBhbiBpbW1lZGlhdGVcbiAgICAgICAgICAgICAgLy8gcmVwbGF5IGNhbiBzZXJ2ZSBpdCB3aXRob3V0IHJlcmVhZGluZyBmcm9tIGRpc2suXG4gICAgICAgICAgICAgIGF3YWl0IHN0b3JlRXZlbnQoY29uZmxpY3RFdmVudCk7XG5cbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEV2ZW50ID0gc3RyaXBFdmVudERhdGFSZWZzKFxuICAgICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZURhdGFcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBjb25mbGljdCBldmVudCAobm8gaG9vayBlbnRpdHkgY3JlYXRlZClcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgICBob29rOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaG9vayBlbnRpdHkgbm93LCBidXQgZGVmZXIgaXRzIHdyaXRlIHVudGlsXG4gICAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggYXQgdGhlIGJvdHRvbSBvZiB0aGlzXG4gICAgICAgICAgLy8gZnVuY3Rpb24gY29tbWl0cy4gVGhlIHJldHJ5IHBhdGggY2FuIHJlYWNoIHRoaXMgYnJhbmNoXG4gICAgICAgICAgLy8gZm9yIGEgaG9vayB3aG9zZSBgaG9va19jcmVhdGVkYCBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkgKGFuIFwiYWxyZWFkeS1jb21taXR0ZWRcbiAgICAgICAgICAvLyBkdXBsaWNhdGVcIik7IGluIHRoYXQgY2FzZSB0aGUgb3V0ZXIgYHdyaXRlRXhjbHVzaXZlYFxuICAgICAgICAgIC8vIGZvciB0aGUgZXZlbnQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIHdlIHdpbGwgdGhyb3dcbiAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAuIFdyaXRpbmcgdGhlIGhvb2sgZW50aXR5IGhlcmVcbiAgICAgICAgICAvLyBmaXJzdCB3b3VsZCBtdXRhdGUgYWxyZWFkeS1jb21taXR0ZWQgZHVyYWJsZSBzdGF0ZSB3aXRoXG4gICAgICAgICAgLy8gdGhlIHJldHJ5J3MgcGF5bG9hZCAoZS5nLiBkaWZmZXJlbnQgYG1ldGFkYXRhYCBvclxuICAgICAgICAgIC8vIGBpc1dlYmhvb2tgKSBiZWZvcmUgdGhlIGV2ZW50IHB1Ymxpc2ggcHJvdmVkIHdoaWNoXG4gICAgICAgICAgLy8gb3V0Y29tZSB3ZSBhcmUgaW4g4oCUIGxlYXZpbmcgdGhlIGVudGl0eSBhbmQgZXZlbnQgbG9nXG4gICAgICAgICAgLy8gaW5jb25zaXN0ZW50LiBCeSBkZWZlcnJpbmcsIHRoZSBlbnRpdHkgaXMgb25seSB3cml0dGVuXG4gICAgICAgICAgLy8gd2hlbiB0aGUgcHVibGlzaCBhY3R1YWxseSBzdWNjZWVkcyAoZmlyc3Qgd3JpdGVyIG9yXG4gICAgICAgICAgLy8gb3JwaGFuIHJlY292ZXJ5KS4gU2VlIHByYW5heWdwJ3MgcmV2aWV3IG9uIFBSICMyMjk1IGZvclxuICAgICAgICAgIC8vIHRoZSBrYXJ0aGlrc2NhbGUzIHJlcHJvLlxuICAgICAgICAgIGhvb2sgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBob29rSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBob29rRGF0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIG93bmVySWQ6ICdsb2NhbC1vd25lcicsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgICAgICAgICAgLy8gVXNlIHRoZSAocG9zc2libHkgY2Fub25pY2FsKSBldmVudCdzIGNyZWF0ZWRBdCBzbyB0d29cbiAgICAgICAgICAgIC8vIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBob29rIGVudGl0eSBwcm9kdWNlIGJ5dGUtXG4gICAgICAgICAgICAvLyBpZGVudGljYWwgY29udGVudCBkdXJpbmcgY29udmVyZ2VuY2UuXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgaG9vayBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGlzV2ViaG9vazogaG9va0RhdGEuaXNXZWJob29rID8/IGZhbHNlLFxuICAgICAgICAgICAgaXNTeXN0ZW06IGhvb2tEYXRhLmlzU3lzdGVtID8/IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaG9va0VudGl0eVdyaXRlT3B0aW9ucyA9IHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGVcbiAgICAgICAgICAgID8geyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAgIC8vIGhvb2tfZGlzcG9zZWQ6IERlbGV0ZXMgaG9vayBlbnRpdHksIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGRpc3Bvc2luZyB0aGUgc2FtZSBob29rIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgaG9va0xvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2RhdGEuY29ycmVsYXRpb25JZH0uZGlzcG9zZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmRpc3Bvc2VkYDtcbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGhvb2tMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGRpc3Bvc2VkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVhZCB0aGUgaG9vayB0byBnZXQgaXRzIHRva2VuIGJlZm9yZSBkZWxldGluZ1xuICAgICAgICAgIGNvbnN0IGhvb2tQYXRoID0gdGFnZ2VkUGF0aChcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSB0b2tlbiBjb25zdHJhaW50IGZpbGUgdG8gZnJlZSB1cCB0aGUgdG9rZW5cbiAgICAgICAgICAgIC8vIGZvciByZXVzZSwgYW5kIGRlbGV0ZSB0aGlzIGhvb2sncyByZWNvdmVyeSBtYXJrZXIgKGlmXG4gICAgICAgICAgICAvLyBhbnkpIGZvciBkaXNrIGh5Z2llbmUuIFRoZSBtYXJrZXIncyBmaWxlbmFtZSBoYXNoXG4gICAgICAgICAgICAvLyBpbmNsdWRlcyBgKHRva2VuLCBydW5JZCwgaG9va0lkKWAgc28gZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBsaWZldGltZXMgbmV2ZXIgY29sbGlkZSwgYnV0IGNsZWFuaW5nIHVwIHJlZHVjZXMgZGlza1xuICAgICAgICAgICAgLy8gbGVhayBmb3IgaG9va3MgdGhhdCBnbyB0aHJvdWdoIHRoZSByZWNvdmVyeSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgZGlzcG9zZWRDb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICAgIGAke2hhc2hUb2tlbihleGlzdGluZ0hvb2sudG9rZW4pfS5qc29uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oZGlzcG9zZWRDb25zdHJhaW50UGF0aCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2suaG9va0lkXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gd2FpdF9jcmVhdGVkOiBDcmVhdGVzIHdhaXQgZW50aXR5IHdpdGggc3RhdHVzICd3YWl0aW5nJy5cbiAgICAgICAgICAvLyBBdG9taWMgY2xhaW0gb24gYSBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBjb25zdHJhaW50IGZpbGVcbiAgICAgICAgICAvLyBlbnN1cmVzIGR1cGxpY2F0ZSB3YWl0X2NyZWF0ZWQgZnJvbSBjb25jdXJyZW50IGludm9jYXRpb25zXG4gICAgICAgICAgLy8gc3VyZmFjZXMgYXMgRW50aXR5Q29uZmxpY3RFcnJvciAocmVwbGFjZXMgYSBwcmlvciBUT0NUT1VcbiAgICAgICAgICAvLyByZWFkLXRoZW4tY2hlY2sgdGhhdCBjb3VsZCBsZXQgYm90aCB3cml0ZXJzIHRocm91Z2gpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd2FpdENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdhaXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgcmVzdW1lQXQ/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIHdhaXRJZDogd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgICAgICAgcmVzdW1lQXQ6IHdhaXREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkOiBUcmFuc2l0aW9ucyB3YWl0IHRvICdjb21wbGV0ZWQnLCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHdhaXQgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0TG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjb21wbGV0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1dhaXQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFdhaXRTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdXYWl0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9jayBmaWxlIHdlIGp1c3QgY2xhaW1lZCDigJQgdGhlIHdhaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2tQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBsb2NrIGZpbGUgKHdyaXRlRXhjbHVzaXZlIGFib3ZlKSBhbHJlYWR5IHByZXZlbnRzIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBjb21wbGV0aW9ucyDigJQgbm8gYWRkaXRpb25hbCBzdGF0dXMgY2hlY2sgbmVlZGVkLlxuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1dhaXQsXG4gICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdCxcbiAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGV2ZW50IGxvZyBidXQgZG9uJ3RcbiAgICAgICAgLy8gbW9kaWZ5IHRoZSBIb29rIGVudGl0eSAod2hpY2ggZG9lc24ndCBoYXZlIGEgcGF5bG9hZCBmaWVsZClcblxuICAgICAgICAvLyBTdG9yZSBldmVudCB1c2luZyBjb21wb3NpdGUga2V5IHtydW5JZH0te2V2ZW50SWR9LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgd3JpdGVFeGNsdXNpdmVgIChPX0NSRUFUfE9fRVhDTCB2aWEgdGVtcC1maWxlICsgaGFyZC1saW5rKVxuICAgICAgICAvLyBpcyB0aGUgY3Jvc3MtcHJvY2VzcyBhdG9taWMgcHVibGlzaCBwcmltaXRpdmU6IGlmIHRoZSBmaWxlXG4gICAgICAgIC8vIGFscmVhZHkgZXhpc3RzLCByZXR1cm5zIGZhbHNlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcuIFRoaXNcbiAgICAgICAgLy8gaXMgY3JpdGljYWwgZm9yIHRoZSBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgY29udmVyZ2VuY2VcbiAgICAgICAgLy8gKGFib3ZlKSDigJQgdHdvIHdvcmtlcnMgdGhhdCBhZG9wdCB0aGUgc2FtZSBjYW5vbmljYWwgZXZlbnRJZFxuICAgICAgICAvLyByYWNlIGhlcmU7IHdob2V2ZXIgbGlua3MgdGhlIGZpbGUgZmlyc3Qgd2lucywgdGhlIGxvc2VyXG4gICAgICAgIC8vIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yLCBhbmQgdGhlIHJ1bnRpbWUncyBleGlzdGluZ1xuICAgICAgICAvLyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoIGF0IHN1c3BlbnNpb24taGFuZGxlci50czoxNDJcbiAgICAgICAgLy8gc3dhbGxvd3MgaXQuIEZvciBhbGwgb3RoZXIgZXZlbnQgdHlwZXMsIGV2ZW50SWRzIGFyZVxuICAgICAgICAvLyBtb25vdG9uaWMgVUxJRHMgKGdsb2JhbGx5IHVuaXF1ZSBieSBjb25zdHJ1Y3Rpb24pIHNvIGFcbiAgICAgICAgLy8gY29sbGlzaW9uIGluZGljYXRlcyBhIHJlYWwgYnVnIGFuZCBFbnRpdHlDb25mbGljdEVycm9yIGlzXG4gICAgICAgIC8vIGFsc28gdGhlIHJpZ2h0IHN1cmZhY2Ug4oCUIHNhbWUgc2hhcGUgYXMgc3RlcF9jcmVhdGVkJ3NcbiAgICAgICAgLy8gY2xhaW0tZmlsZSBiZWhhdmlvci5cbiAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICBjb25zdCBldmVudFBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjb21wb3NpdGVLZXksIHRhZyk7XG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBiZWZvcmUgdGhlIHdyaXRlJ3MgYGF3YWl0YCBzbyB0aGVcbiAgICAgICAgLy8gY2FjaGVkIHNuYXBzaG90IGNhbid0IG9ic2VydmUgYSBsYXRlciBtdXRhdGlvbiAoc2VlXG4gICAgICAgIC8vIHJlbWVtYmVyU3RvcmVkRXZlbnQpLlxuICAgICAgICBjb25zdCBzZXJpYWxpemVkRXZlbnQgPSBKU09OLnN0cmluZ2lmeShldmVudCwganNvblJlcGxhY2VyLCAyKTtcbiAgICAgICAgY29uc3QgZXZlbnRQdWJsaXNoZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG4gICAgICAgIGlmICghZXZlbnRQdWJsaXNoZWQpIHtcbiAgICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIGxvc2luZyB0aGUgZXZlbnQgcHVibGlzaCBtZWFucyB0aGVcbiAgICAgICAgICAvLyBldmVudCB3YXMgYWxyZWFkeSBjb21taXR0ZWQgYXQgdGhpcyBleGFjdCAoY2Fub25pY2FsKVxuICAgICAgICAgIC8vIHBhdGguIFRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgLy8gaXRzIGV2ZW50IHB1Ymxpc2ggYW5kIGl0cyBkZWZlcnJlZCBob29rLWVudGl0eSB3cml0ZVxuICAgICAgICAgIC8vICh0aGUgaW52ZXJzZSBvZiB0aGUgY3Jhc2ggd2luZG93IHRoZSBkZWZlcnJhbCBjbG9zZXMpLFxuICAgICAgICAgIC8vIGxlYXZpbmcgYW4gZXZlbnQtZmlyc3Qgb3JwaGFuOiB0aGUgZXZlbnQgaXMgaW4gdGhlIGxvZ1xuICAgICAgICAgIC8vIGJ1dCB0aGUgZW50aXR5IGlzIG1pc3NpbmcgYW5kIHRoZSBob29rIGlzIHVucmVzb2x2YWJsZS5cbiAgICAgICAgICAvLyBSZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBQRVJTSVNURUQgZXZlbnQncyBwYXlsb2FkXG4gICAgICAgICAgLy8gKG5ldmVyIHRoZSByZXRyeSdzIOKAlCBkaWZmZXJlbnQgcmV0cnkgbWV0YWRhdGEgbXVzdCBub3RcbiAgICAgICAgICAvLyBjaGFuZ2UgY29tbWl0dGVkIHN0YXRlKSBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ25cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgdG8gdGhlIHJ1bnRpbWUncyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICBhd2FpdCByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IFwiJHtldmVudElkfVwiIGFscmVhZHkgZXhpc3RzIGZvciBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZXZlbnQgaXMgbm93IGNvbW1pdHRlZDsgY2FjaGUgaXQgc28gYW4gaW1tZWRpYXRlIHNlcXVlbnRpYWxcbiAgICAgICAgLy8gcmVwbGF5IGNhbiBzZXJ2ZSBpdCB3aXRob3V0IHJlcmVhZGluZyBmcm9tIGRpc2suXG4gICAgICAgIHJlbWVtYmVyU3RvcmVkRXZlbnQoZXZlbnQsIGV2ZW50UGF0aCwgc2VyaWFsaXplZEV2ZW50KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaG9vayBlbnRpdHkgT05MWSBub3cgdGhhdCB0aGUgZXZlbnQgcHVibGlzaCBoYXNcbiAgICAgICAgLy8gY29tbWl0dGVkLiBEb2luZyB0aGlzIGVhcmxpZXIgKGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBicmFuY2ggYWJvdmUpIHdvdWxkIG11dGF0ZSBhbiBhbHJlYWR5LWNvbW1pdHRlZCBob29rXG4gICAgICAgIC8vIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoXG4gICAgICAgIC8vIHByb3ZlZCB3aGV0aGVyIHRoaXMgYXR0ZW1wdCB3YXMgcmVwYWlyaW5nIGEgbWlzc2luZyBldmVudFxuICAgICAgICAvLyBvciBqdXN0IGNvbGxpZGluZyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgLlxuICAgICAgICAvLyBUaGUgYnJhbmNoIHNldHMgYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGlmZiB0aGlzIGV2ZW50XG4gICAgICAgIC8vIHR5cGUgd3JpdGVzIGFuIGVudGl0eS5cbiAgICAgICAgaWYgKGhvb2sgJiYgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rLmhvb2tJZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgICAgICBmaWxlUHJlZml4OiBgJHtlZmZlY3RpdmVSdW5JZH0tYCxcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgICAgICBnZXRJZDogKGUpID0+IGUuZXZlbnRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudHMgPSBhbGxFdmVudHMuZGF0YTtcbiAgICAgICAgICBjdXJzb3IgPSBhbGxFdmVudHMuY3Vyc29yO1xuICAgICAgICAgIGhhc01vcmUgPSBhbGxFdmVudHMuaGFzTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IG9uIGEgc3RlcC10ZXJtaW5hbCB3cml0ZSB0aGUgaW5saW5lXG4gICAgICAgIC8vIHJ1bnRpbWUgbG9vcCBjYW4gcGFzcyBgc2luY2VDdXJzb3JgICh0aGUgY3Vyc29yIGZyb20gYmVmb3JlIGl0XG4gICAgICAgIC8vIGJlZ2FuIHdyaXRpbmcgdGhpcyBzdGVwJ3MgZXZlbnRzKS4gV2UgcmV0dXJuIHRoZSBkZWx0YSBvZlxuICAgICAgICAvLyBldmVudHMgd3JpdHRlbiBzdHJpY3RseSBhZnRlciB0aGF0IGN1cnNvciDigJQgZXhhY3RseSB3aGF0IGFuXG4gICAgICAgIC8vIGBldmVudHMubGlzdCh7IGN1cnNvcjogc2luY2VDdXJzb3IsIHNvcnRPcmRlcjogJ2FzYycgfSlgIHdvdWxkXG4gICAgICAgIC8vIHJldHVybiByaWdodCBub3cg4oCUIHNvIHRoZSBsb29wIGNhbiBza2lwIGEgcmVkdW5kYW50IHJvdW5kLXRyaXAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgaXMgY29tcHV0ZWQgYWdhaW5zdCB0aGUgc2FtZSBvbi1kaXNrIGxvZyB0aGUgbGlzdCBwYXRoXG4gICAgICAgIC8vIHJlYWRzLCBzbyBpdCBjYXB0dXJlcyBldmVyeXRoaW5nIHRoZSBmZXRjaCB3b3VsZDogdGhpcyBzdGVwJ3NcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkL3N0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZCwgYW55IGF0dHJfc2V0IHRoZSBzdGVwXG4gICAgICAgIC8vIGJvZHkgd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZSBjdXJzb3IuIFRoYXRcbiAgICAgICAgLy8gZXF1aXZhbGVuY2UgaXMgd2hhdCBtYWtlcyBza2lwcGluZyB0aGUgZmV0Y2ggc2FmZSDigJQgYSBtaXNzZWRcbiAgICAgICAgLy8gaW4tYmFuZCBldmVudCBjYW5ub3QgZGl2ZXJnZSByZXBsYXkgYmVjYXVzZSB0aGUgZGVsdGEgaXMgdGhlXG4gICAgICAgIC8vIGZldGNoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbmx5IHN0ZXAtdGVybWluYWwgZXZlbnRzIHF1YWxpZnk6IHN0ZXBfY3JlYXRlZC9zdGVwX3N0YXJ0ZWQgYXJlXG4gICAgICAgIC8vIG5vdCBsb29wIGJvdW5kYXJpZXMgKHRoZSBsb29wIGZldGNoZXMgYWZ0ZXIgc3RlcF9jb21wbGV0ZWQgL1xuICAgICAgICAvLyBzdGVwX2ZhaWxlZCksIGFuZCBydW4tdGVybWluYWwgZXZlbnRzIGVuZCB0aGUgbG9vcC4gYHJlc29sdmVEYXRhYFxuICAgICAgICAvLyBtYXRjaGVzIHRoZSBsaXN0IHBhdGggc28gZXZlbnREYXRhIHJlZnMgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKSAmJlxuICAgICAgICAgIHR5cGVvZiBwYXJhbXM/LnNpbmNlQ3Vyc29yID09PSAnc3RyaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vIGBsaW1pdGA6IHRoaXMgcmV0dXJucyBhIHNpbmdsZSBkZWZhdWx0LXNpemUgcGFnZSxcbiAgICAgICAgICAvLyB1bmxpa2UgdGhlIGBldmVudHMubGlzdGAgcGF0aCB3aGljaCBsb29wcyBgd2hpbGUgKGhhc01vcmUpYCB0b1xuICAgICAgICAgIC8vIGV4aGF1c3Rpb24uIFRoYXQgaXMgc2FmZSDigJQgYW5kIG11c3QgTk9UIGJlIFwiZml4ZWRcIiBieSBwYWdpbmF0aW5nXG4gICAgICAgICAgLy8gaGVyZSDigJQgYmVjYXVzZSB0aGUgY29udHJhY3QgaXMgc2luZ2xlLXBhZ2Utb3ItZmFsbGJhY2ssIG5vdFxuICAgICAgICAgIC8vIGNvbXBsZXRlLWRlbHRhLiBXaGVuIHRoZSBkZWx0YSBvdmVyZmxvd3Mgb25lIHBhZ2UsXG4gICAgICAgICAgLy8gcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5IHNldHMgYGhhc01vcmU6IHRydWVgIGFuZCBzbGljZXMgYGRhdGFgIHRvXG4gICAgICAgICAgLy8gdGhlIHBhZ2UgKHNlZSBmcy50cyksIHdoaWNoIHdlIGZvcndhcmQgdmVyYmF0aW0gYmVsb3cuIFRoZSBTREtcbiAgICAgICAgICAvLyBjb25zdW1lIHNpZGUgKHJ1bnRpbWUudHMpIG9ubHkgc3Rhc2hlcyB0aGUgZGVsdGEgd2hlbiBgIWhhc01vcmVgXG4gICAgICAgICAgLy8gYW5kIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHRoZSBleGhhdXN0aXZlIGBldmVudHMubGlzdGAgbG9vcCwgc28gYVxuICAgICAgICAgIC8vIHRydW5jYXRlZCBwYWdlIGlzIG5ldmVyIGNvbnN1bWVkIGFzIGlmIGl0IHdlcmUgdGhlIGZ1bGwgZGVsdGEuXG4gICAgICAgICAgY29uc3QgZGVsdGEgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgICAgIGZpbGVQcmVmaXg6IGAke2VmZmVjdGl2ZVJ1bklkfS1gLFxuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGN1cnNvcjogcGFyYW1zLnNpbmNlQ3Vyc29yLFxuICAgICAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgICAgIGdldElkOiAoZSkgPT4gZS5ldmVudElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cyA9XG4gICAgICAgICAgICByZXNvbHZlRGF0YSA9PT0gJ25vbmUnXG4gICAgICAgICAgICAgID8gZGVsdGEuZGF0YS5tYXAoKGUpID0+IHN0cmlwRXZlbnREYXRhUmVmcyhlLCByZXNvbHZlRGF0YSkpXG4gICAgICAgICAgICAgIDogZGVsdGEuZGF0YTtcbiAgICAgICAgICBjdXJzb3IgPSBkZWx0YS5jdXJzb3I7XG4gICAgICAgICAgaGFzTW9yZSA9IGRlbHRhLmhhc01vcmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBldmVudCBhbmQgYW55IGNyZWF0ZWQvdXBkYXRlZCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICAgIC4uLihzdGVwQ3JlYXRlZExhemlseSA/IHsgc3RlcENyZWF0ZWQ6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gZW5kIGNyZWF0ZUltcGxcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KHJ1bklkLCBldmVudElkLCBwYXJhbXMpIHtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2V2ZW50SWQnLCBldmVudElkKTtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgIGJhc2VkaXIsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICBjb21wb3NpdGVLZXksXG4gICAgICAgIEV2ZW50U2NoZW1hLFxuICAgICAgICB0YWdcbiAgICAgICk7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlbnQgJHtldmVudElkfSBpbiBydW4gJHtydW5JZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgcmV0dXJuIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0KHBhcmFtcykge1xuICAgICAgY29uc3QgeyBydW5JZCB9ID0gcGFyYW1zO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zLnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgIGZpbGVQcmVmaXg6IGAke3J1bklkfS1gLFxuICAgICAgICAvLyBFdmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlciAob2xkZXN0IGZpcnN0KSBieSBkZWZhdWx0LFxuICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBmb3Igb3RoZXIgbGlzdCBjYWxscy5cbiAgICAgICAgc29ydE9yZGVyOiBwYXJhbXMucGFnaW5hdGlvbj8uc29ydE9yZGVyID8/ICdhc2MnLFxuICAgICAgICBsaW1pdDogcGFyYW1zLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICBjdXJzb3I6IHBhcmFtcy5wYWdpbmF0aW9uPy5jdXJzb3IsXG4gICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgcmVzb2x2ZURhdGEgaXMgXCJub25lXCIsIHJlbW92ZSBldmVudERhdGEgZnJvbSBldmVudHNcbiAgICAgIGlmIChyZXNvbHZlRGF0YSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZXZlbnQpID0+XG4gICAgICAgICAgICBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RCeUNvcnJlbGF0aW9uSWQocGFyYW1zKSB7XG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcGFyYW1zLmNvcnJlbGF0aW9uSWQ7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2NvcnJlbGF0aW9uSWQnLCBjb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zLnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
1769
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLHdCQUF3QixFQUN4QixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsS0FBSyxFQUNMLGNBQWMsRUFDZCxTQUFTLEdBQ1YsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVB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QyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzlCLGtCQUFrQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FDdkM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgUnVuTm90U3VwcG9ydGVkRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIb29rLFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RlcCxcbiAgU3RvcmFnZSxcbiAgV2FpdCxcbiAgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBhcHBseUF0dHJpYnV0ZUNoYW5nZXMsXG4gIEV2ZW50U2NoZW1hLFxuICBIb29rU2NoZW1hLFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlLFxuICBpc1Rlcm1pbmFsU3RlcFN0YXR1cyxcbiAgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzLFxuICByZXF1aXJlc05ld2VyV29ybGQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTdGVwU2NoZW1hLFxuICB1bGlkVG9EYXRlLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG4gIHZhbGlkYXRlVWxpZFRpbWVzdGFtcCxcbiAgV2FpdFNjaGVtYSxcbiAgV29ya2Zsb3dSdW5TY2hlbWEsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTiB9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBhc3NlcnRTYWZlRW50aXR5SWQsXG4gIGRlbGV0ZUpTT04sXG4gIGpzb25SZXBsYWNlcixcbiAganNvblJldml2ZXIsXG4gIGxpc3RKU09ORmlsZXMsXG4gIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSxcbiAgcmVhZEpTT04sXG4gIHJlYWRKU09OV2l0aEZhbGxiYWNrLFxuICByZXNvbHZlV2l0aGluQmFzZSxcbiAgdGFnZ2VkUGF0aCxcbiAgd3JpdGUsXG4gIHdyaXRlRXhjbHVzaXZlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4uL2ZzLmpzJztcbmltcG9ydCB7IHN0cmlwRXZlbnREYXRhUmVmcyB9IGZyb20gJy4vZmlsdGVycy5qcyc7XG5pbXBvcnQge1xuICBnZXRPYmplY3RDcmVhdGVkQXQsXG4gIGhvb2tEaXNwb3NlTG9ja1BhdGgsXG4gIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgsXG4gIGhvb2tUb2tlbkNsYWltUGF0aCxcbiAgaXNIb29rRGlzcG9zYWxDb21taXR0ZWQsXG4gIG1vbm90b25pY1VsaWQsXG4gIHJlbGVhc2VIb29rVG9rZW5DbGFpbUlmT3duZWRCeSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGRlbGV0ZUFsbEhvb2tzRm9yUnVuLFxuICByZWJ1aWxkTGl2ZUhvb2tCeVRva2VuRnJvbUV2ZW50TG9nLFxufSBmcm9tICcuL2hvb2tzLXN0b3JhZ2UuanMnO1xuaW1wb3J0IHsgaGFuZGxlTGVnYWN5RXZlbnQgfSBmcm9tICcuL2xlZ2FjeS5qcyc7XG5pbXBvcnQgeyB3aXRoUnVuRmlsZUxvY2sgfSBmcm9tICcuL3J1bnMtc3RvcmFnZS5qcyc7XG5cbi8qKlxuICogUGVyLXN0ZXAgaW4tcHJvY2VzcyBhc3luYyBtdXRleC4gU2VyaWFsaXplcyBjb25jdXJyZW50IGBldmVudHMuY3JlYXRlYCBjYWxsc1xuICogdGhhdCB0YXJnZXQgdGhlIHNhbWUgc3RlcCwgc28gdGhhdCB0aGUgXCJjaGVjayB0ZXJtaW5hbCBzdGF0ZSwgdGhlbiB3cml0ZSBzdGVwXG4gKiBlbnRpdHkgKyBldmVudFwiIHNlcXVlbmNlIGlzIGF0b21pYy4gV2l0aG91dCB0aGlzLCB0d28gY29uY3VycmVudCBzdGVwX3N0YXJ0ZWRcbiAqIGNhbGxzIGNhbiBib3RoIHBhc3MgdGhlIG5vdC10ZXJtaW5hbCBjaGVjayBhbmQgYm90aCB3cml0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzXG4gKiDigJQgb3IgYSBzdGVwX3N0YXJ0ZWQgY2FuIGxhbmQgaW4gdGhlIGxvZyBhZnRlciBzdGVwX2NvbXBsZXRlZCBoYXMgYWxyZWFkeVxuICogd3JpdHRlbiwgcHJvZHVjaW5nIHVuY29uc3VtZWQgZXZlbnRzIG9uIHJlcGxheS5cbiAqXG4gKiBEdXBsaWNhdGUgc3RlcF9zdGFydGVkIGV2ZW50cyBmb3IgYSBub24tdGVybWluYWwgc3RlcCBhcmUgc3RpbGwgYWxsb3dlZFxuICogKHJldHJpZXMgbGVnaXRpbWF0ZWx5IHJlLXN0YXJ0IGEgc3RlcCksIG9ubHkgd3JpdGVzIHRvIGFuIGFscmVhZHktdGVybWluYWxcbiAqIHN0ZXAgYXJlIHJlamVjdGVkLlxuICovXG4vLyBgc3RlcExvY2tzYCBhbmQgYGhvb2tMb2Nrc2AgYXJlIG5vdyBpbnN0YW50aWF0ZWQgcGVyXG4vLyBgY3JlYXRlRXZlbnRzU3RvcmFnZWAgY2FsbCAoc2VlIGluc2lkZSB0aGUgZnVuY3Rpb24pIHJhdGhlciB0aGFuXG4vLyBiZWluZyBtb2R1bGUtbGV2ZWwuIFRoZSBvbi1kaXNrIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyByZW1haW5cbi8vIHRoZSBkdXJhYmxlIHNvdXJjZSBvZiB0cnV0aCBhY3Jvc3MgcHJvY2Vzc2VzOyB0aGUgaW4tcHJvY2Vzc1xuLy8gbXV0ZXggaXMgYSBwZXItaW5zdGFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgY2xvc2VzIGEgc2hvcnQgcmFjZVxuLy8gd2luZG93IGluIHRoZSBkZWR1cC1yZWNvdmVyeSBwYXRoLiBQZXItaW5zdGFuY2Ugc2NvcGluZyBsZXRzXG4vLyB0ZXN0cyBzaW11bGF0ZSBjcm9zcy1wcm9jZXNzIGJlaGF2aW9yIHdpdGggdHdvIHN0b3JhZ2UgaW5zdGFuY2VzXG4vLyBzaGFyaW5nIG9uZSBkYXRhIGRpcmVjdG9yeSAoZWFjaCBpbnN0YW5jZSBoYXMgaW5kZXBlbmRlbnQgbG9ja3Ncbi8vIGJ1dCBhIHNoYXJlZCBmaWxlc3lzdGVtKSwgZXhhY3RseSBtYXRjaGluZyB0aGUgY3Jvc3MtcHJvY2Vzc1xuLy8gc2VtYW50aWNzIHdpdGhvdXQgc3Bhd25pbmcgc3VicHJvY2Vzc2VzLlxuXG5jb25zdCBIb29rVG9rZW5DbGFpbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gVGhlIHRva2VuLWNsYWltIHdyaXRlciBiZWxvdyBoYXMgYWx3YXlzIHBlcnNpc3RlZCBgaG9va0lkYCwgYnV0XG4gIC8vIHRoaXMgcmVhZCBzY2hlbWEgcHJldmlvdXNseSBvbWl0dGVkIGl0LCB3aGljaCBpcyB0aGUgYnVnIGZpeGVkXG4gIC8vIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvaXNzdWVzLzIyODMuIGBvcHRpb25hbCgpYFxuICAvLyBpcyBkZWZlbnNpdmU6IGFueSBjbGFpbSBmaWxlIHRoYXQgc29tZWhvdyBsYWNrcyB0aGUgZmllbGQgc3RpbGxcbiAgLy8gcGFyc2VzICh5aWVsZGluZyBgdW5kZWZpbmVkYCkgYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGNyb3NzLVxuICAvLyBob29rIGNvbmZsaWN0IGJyYW5jaCwgbWF0Y2hpbmcgcHJlLWZpeCBiZWhhdmlvci5cbiAgaG9va0lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHJ1bklkOiB6LnN0cmluZygpLFxuICAvLyBgZXZlbnRJZGAgaXMgdGhlIGNhbm9uaWNhbCBob29rX2NyZWF0ZWQgZXZlbnQgSUQgdGhlIGNsYWltaW5nXG4gIC8vIHdvcmtlciBjb21taXR0ZWQgdG8gcHVibGlzaGluZy4gUGVyc2lzdGluZyBpdCBoZXJlIHR1cm5zIHRoZVxuICAvLyBjbGFpbSBmaWxlIGludG8gYSBkdXJhYmxlIGNvbnZlcmdlbmNlIGtleSBmb3IgY3Jvc3Mtd29ya2VyIC9cbiAgLy8gY3Jvc3MtcHJvY2VzcyByZXRyaWVzIChzZWUgY29tbWVudCBvbiB0aGUgaG9va19jcmVhdGVkIGJyYW5jaCkuXG4gIC8vIGBvcHRpb25hbCgpYCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eTogYSBsZWdhY3kgY2xhaW0gZmlsZVxuICAvLyB3cml0dGVuIGJlZm9yZSB0aGlzIGZpZWxkIGV4aXN0ZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgcmVjb3ZlcnktXG4gIC8vIG1hcmtlciB1cGdyYWRlIHBhdGgsIHdoaWNoIGF0b21pY2FsbHkgcGlucyBhIGNhbm9uaWNhbCBldmVudElkXG4gIC8vIHZpYSBhIHNpZGVjYXIgbWFya2VyIChhbHNvIGEgYHdyaXRlRXhjbHVzaXZlYCkuXG4gIGV2ZW50SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFNpZGVjYXIgcmVjb3ZlcnkgbWFya2VyIHRoYXQgcGlucyBhIGNhbm9uaWNhbCBgaG9va19jcmVhdGVkYFxuICogZXZlbnRJZCBmb3IgYSBsZWdhY3kgdG9rZW4gY2xhaW0g4oCUIG9uZSB3cml0dGVuIGJ5IGEgdmVyc2lvbiBvZlxuICogdGhpcyBzdG9yYWdlIHRoYXQgZGlkIG5vdCB5ZXQgcGVyc2lzdCBgZXZlbnRJZGAgaW5saW5lIGluIHRoZVxuICogY2xhaW0gZmlsZS4gV2l0aG91dCB0aGlzIG1hcmtlciwgdHdvIGNyb3NzLXByb2Nlc3MgcmV0cmllc1xuICogcmVhZGluZyBhIGxlZ2FjeSBjbGFpbSBlYWNoIGdlbmVyYXRlIHRoZWlyIG93biBldmVudElkLCBsYW5kXG4gKiB0aGVpciBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgY2FsbHMgYXQgZGlmZmVyZW50IHBhdGhzLCBhbmRcbiAqIGFwcGVuZCB0d28gYGhvb2tfY3JlYXRlZGAgZXZlbnRzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYC5cbiAqXG4gKiBUaGUgbWFya2VyIGlzIHdyaXR0ZW4gdmlhIGB3cml0ZUV4Y2x1c2l2ZWAg4oCUIHRoZSBmaXJzdCByZXRyeSB0b1xuICogbGFuZCBpdCBwaW5zIGl0cyBjYW5kaWRhdGUgZXZlbnRJZCBhcyBjYW5vbmljYWwsIGFuZCBldmVyeVxuICogc3Vic2VxdWVudCByZXRyeSByZWFkcyBhbmQgYWRvcHRzIHRoYXQgZXZlbnRJZCBiZWZvcmUgdGhlIGNvbW1vblxuICogZXZlbnQgcHVibGlzaC4gU2NoZW1hIGlzIGp1c3QgYHsgZXZlbnRJZCB9YCBiZWNhdXNlIGlkZW50aXR5IGlzXG4gKiBhbHJlYWR5IGVuY29kZWQgaW4gdGhlIG1hcmtlcidzIGZpbGVuYW1lIGhhc2gsIHNvIGRpZmZlcmVudCB0b2tlblxuICogbGlmZXRpbWVzIGNhbiBuZXZlciBzaGFyZSBvbmUgbWFya2VyIChzZWVcbiAqIGBob29rUmVjb3ZlcnlNYXJrZXJQYXRoYCkuXG4gKi9cbmNvbnN0IEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXZlbnRJZDogei5zdHJpbmcoKSxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkSG9va1Rva2VuQ2xhaW0oXG4gIGNvbnN0cmFpbnRQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgSG9va1Rva2VuQ2xhaW1TY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihjb25zdHJhaW50UGF0aCwgSG9va1Rva2VuQ2xhaW1TY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIHRva2VuIGNsYWltIGhlbGQgYnkgYW5vdGhlciBgKHJ1bklkLCBob29rSWQpYCBjYW4gbmV2ZXIgYmVjb21lXG4gKiBsaXZlIGFnYWluIGFuZCBtYXkgdGhlcmVmb3JlIGJlIHJlbGVhc2VkIGJ5IGEgbmV3IGNsYWltYW50OlxuICpcbiAqICAgLSB0aGUgY2xhaW1lZCBob29rJ3MgZGlzcG9zYWwgaXMgY29tbWl0dGVkIChpdHMgZGlzcG9zZSBsb2NrIGV4aXN0cyDigJRcbiAqICAgICB0aGUgZHVyYWJsZSByZWxlYXNlIG9mIHRoZSBjbGFpbSBmaWxlIGp1c3QgaGFzbid0IGxhbmRlZCB5ZXQsIG9yIHdhc1xuICogICAgIGxvc3QgdG8gYSBjcmFzaCBiZXR3ZWVuIHRoZSBsb2NrIHdyaXRlIGFuZCB0aGUgY2xhaW0gZGVsZXRlKSwgb3JcbiAqICAgLSB0aGUgb3duaW5nIHJ1biBpcyB0ZXJtaW5hbCAodGhlIHJ1bi1jb21wbGV0aW9uIGNsZWFudXAgcmVsZWFzZXMgYWxsXG4gKiAgICAgb2YgdGhlIHJ1bidzIGNsYWltcywgYnV0IGEgY2xhaW1hbnQgY2FuIG9ic2VydmUgdGhlIGNsYWltIGluIHRoZVxuICogICAgIHdpbmRvdyBiZWZvcmUgdGhhdCBjbGVhbnVwIGxhbmRzIOKAlCBvciB0aGUgY2xlYW51cCBjcmFzaGVkKSwgb3JcbiAqICAgLSB0aGUgb3duaW5nIHJ1biBkb2VzIG5vdCBleGlzdCAoYSBjbGFpbSBjYW4gb25seSBiZSB3cml0dGVuIGR1cmluZyBhXG4gKiAgICAgc3VzcGVuc2lvbiBvZiBhbiBleGlzdGluZyBydW4sIHNvIGFuIG93bmVybGVzcyBjbGFpbSBpcyBkZWJyaXMpLlxuICpcbiAqIEEgY2xhaW0gZnJvbSBhIG1pZC1jcmVhdGlvbiB3cml0ZXIgaXMgbmV2ZXIgcmVsZWFzYWJsZTogaXRzIG93bmluZyBydW5cbiAqIGV4aXN0cyBhbmQgaXMgbm9uLXRlcm1pbmFsLCBhbmQgaXRzIGRpc3Bvc2UgbG9jayBkb2VzIG5vdCBleGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNIb29rVG9rZW5DbGFpbVJlbGVhc2FibGUoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgY2xhaW06IHouaW5mZXI8dHlwZW9mIEhvb2tUb2tlbkNsYWltU2NoZW1hPixcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKFxuICAgIGNsYWltLmhvb2tJZCAmJlxuICAgIChhd2FpdCBpc0hvb2tEaXNwb3NhbENvbW1pdHRlZChiYXNlZGlyLCBjbGFpbS5ob29rSWQsIHRhZykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IG93bmluZ1J1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ3J1bnMnLFxuICAgIGNsYWltLnJ1bklkLFxuICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICBpZiAoIW93bmluZ1J1bikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMob3duaW5nUnVuLnN0YXR1cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rUmVjb3ZlcnlNYXJrZXIoXG4gIG1hcmtlclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihtYXJrZXJQYXRoLCBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJvYmUgdGhlIHJ1bidzIGV2ZW50IGxvZyBmb3IgYW4gZXhpc3RpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnRcbiAqIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uSWQuIFVzZWQgYnkgdGhlIGxlZ2FjeS1jbGFpbSByZWNvdmVyeVxuICogcGF0aCB0byBkZXRlY3QgXCJhbHJlYWR5IHB1Ymxpc2hlZCBieSBhIHByZS11cGdyYWRlIHdyaXRlXCIgYmVmb3JlXG4gKiBwaW5uaW5nIGEgY2Fub25pY2FsIGV2ZW50SWQg4oCUIHdpdGhvdXQgdGhpcyBjaGVjaywgYSBwb3N0LXVwZ3JhZGVcbiAqIHJldHJ5IGVuY291bnRlcmluZyBhIGxlZ2FjeSBjbGFpbSB3aG9zZSBgaG9va19jcmVhdGVkYCB3YXNcbiAqIGFscmVhZHkgd3JpdHRlbiAod2l0aCB0aGUgcHJlLXVwZ3JhZGUgd3JpdGVyJ3Mgb3duIGV2ZW50SWQpIHdvdWxkXG4gKiBwaW4gYSAqZGlmZmVyZW50KiBldmVudElkIHZpYSB0aGUgbWFya2VyIGFuZCBwdWJsaXNoIGEgZHVwbGljYXRlXG4gKiBldmVudCBhdCB0aGUgbWFya2VyJ3MgcGF0aC5cbiAqXG4gKiBUaGUgaW5saW5lLWBldmVudElkYCBmYXN0IHBhdGggZG9lcyBOT1QgbmVlZCB0aGlzIHByb2JlOiB0aGVcbiAqIGNhbm9uaWNhbCBldmVudElkIGlzIGR1cmFibGUgaW4gdGhlIGNsYWltIGZpbGUsIHNvIHRoZSBleGlzdGluZ1xuICogcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKSB3aWxsIGZhaWwgaWZmIHRoZSBldmVudFxuICogYWxyZWFkeSBleGlzdHMgYXQgdGhhdCBleGFjdCBwYXRoIOKAlCB3aGljaCBpcyB0aGUgY29ycmVjdFxuICogXCJhbHJlYWR5LXB1Ymxpc2hlZFwiIHNlbWFudGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRXhpc3RpbmdIb29rQ3JlYXRlZEV2ZW50SWQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICBmaWx0ZXI6IChldmVudCkgPT5cbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQsXG4gICAgbGltaXQ6IDEsXG4gICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdC5kYXRhWzBdPy5ldmVudElkID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVwYWlyIGFuIFwiZXZlbnQtZmlyc3Qgb3JwaGFuXCI6IHRoZSBob29rIGVudGl0eSB3cml0ZSBpcyBkZWZlcnJlZFxuICogdW50aWwgYWZ0ZXIgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IHB1Ymxpc2ggY29tbWl0cyAoc28gYSBmYWlsZWRcbiAqIHB1Ymxpc2ggY2Fubm90IG11dGF0ZSBhbHJlYWR5LWNvbW1pdHRlZCBzdGF0ZSDigJQgc2VlIHRoZSBjb21tZW50IG9uXG4gKiB0aGUgZGVmZXJyZWQgd3JpdGUpLCB3aGljaCBvcGVucyB0aGUgaW52ZXJzZSBjcmFzaCB3aW5kb3cg4oCUIGFcbiAqIGNyYXNoIEFGVEVSIHRoZSBldmVudCBwdWJsaXNoIGJ1dCBCRUZPUkUgdGhlIGRlZmVycmVkIGVudGl0eSB3cml0ZVxuICogbGVhdmVzIHRoZSBldmVudCBpbiB0aGUgbG9nIHdpdGggdGhlIGhvb2sgZW50aXR5IG1pc3NpbmcuIEEgcmV0cnlcbiAqIHRoZW4gY29sbGlkZXMgYXQgdGhlIGV2ZW50IHB1Ymxpc2ggYW5kIHRocm93c1xuICogYEVudGl0eUNvbmZsaWN0RXJyb3JgIChjb3JyZWN0IOKAlCB0aGUgZXZlbnQgSVMgY29tbWl0dGVkKSwgYnV0XG4gKiB3aXRob3V0IHRoaXMgcmVwYWlyIHRoZSBlbnRpdHkgd291bGQgc3RheSBtaXNzaW5nIGZvcmV2ZXIgYW5kIHRoZVxuICogaG9vayB3b3VsZCBiZSB1bnJlc29sdmFibGUuXG4gKlxuICogVGhlIGVudGl0eSBNVVNUIGJlIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgcGVyc2lzdGVkIGNhbm9uaWNhbFxuICogZXZlbnQncyBwYXlsb2FkIOKAlCBOT1QgdGhlIHJldHJ5J3MgYGV2ZW50RGF0YWAg4oCUIG90aGVyd2lzZSBhIHJldHJ5XG4gKiBjYXJyeWluZyBkaWZmZXJlbnQgYG1ldGFkYXRhYCAvIGBpc1dlYmhvb2tgIHdvdWxkIHNpbGVudGx5IGNoYW5nZVxuICogY29tbWl0dGVkIHN0YXRlLiBUaGUgd3JpdGUgdXNlcyBgd3JpdGVFeGNsdXNpdmVgIChjcmVhdGUtaWYtYWJzZW50KVxuICogc28gYSBjb25jdXJyZW50IHdyaXRlciByYWNpbmcgdGhpcyByZXBhaXIgY2Fubm90IGJlIG92ZXJ3cml0dGVuO1xuICogd2hpY2hldmVyIHdyaXRlIGxhbmRzIGZpcnN0LCB0aGUgY29udGVudCBpcyBpZGVudGljYWwgYmVjYXVzZSBib3RoXG4gKiBkZXJpdmUgZnJvbSB0aGUgc2FtZSBwZXJzaXN0ZWQgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIHBlcnNpc3RlZEV2ZW50SWQ6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtydW5JZH0tJHtwZXJzaXN0ZWRFdmVudElkfWA7XG4gIGNvbnN0IHBlcnNpc3RlZEV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnZXZlbnRzJyxcbiAgICBjb21wb3NpdGVLZXksXG4gICAgRXZlbnRTY2hlbWEsXG4gICAgdGFnXG4gICk7XG4gIGlmIChcbiAgICAhcGVyc2lzdGVkRXZlbnQgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5ldmVudFR5cGUgIT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgcGVyc2lzdGVkRXZlbnQuY29ycmVsYXRpb25JZCAhPT0gaG9va0lkXG4gICkge1xuICAgIC8vIE5vdGhpbmcgdHJ1c3R3b3J0aHkgdG8gcmVwYWlyIGZyb20uXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ2hvb2tzJyxcbiAgICBob29rSWQsXG4gICAgSG9va1NjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgIC8vIEVudGl0eSBhbHJlYWR5IHByZXNlbnQg4oCUIG5vdCBhbiBvcnBoYW4sIGxlYXZlIGl0IHVudG91Y2hlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXZlbnREYXRhID0gKHBlcnNpc3RlZEV2ZW50LmV2ZW50RGF0YSA/PyB7fSkgYXMge1xuICAgIHRva2VuPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogU2VyaWFsaXplZERhdGE7XG4gICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gIH07XG4gIGlmICh0eXBlb2YgZXZlbnREYXRhLnRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBob29rOiBIb29rID0ge1xuICAgIHJ1bklkLFxuICAgIGhvb2tJZCxcbiAgICB0b2tlbjogZXZlbnREYXRhLnRva2VuLFxuICAgIG1ldGFkYXRhOiBldmVudERhdGEubWV0YWRhdGEsXG4gICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICBlbnZpcm9ubWVudDogJ2xvY2FsJyxcbiAgICBjcmVhdGVkQXQ6IHBlcnNpc3RlZEV2ZW50LmNyZWF0ZWRBdCxcbiAgICBzcGVjVmVyc2lvbjogcGVyc2lzdGVkRXZlbnQuc3BlY1ZlcnNpb24sXG4gICAgaXNXZWJob29rOiBldmVudERhdGEuaXNXZWJob29rID8/IHRydWUsXG4gICAgaXNTeXN0ZW06IGV2ZW50RGF0YS5pc1N5c3RlbSA/PyBmYWxzZSxcbiAgfTtcbiAgYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rSWQsIHRhZyksXG4gICAgSlNPTi5zdHJpbmdpZnkoaG9vaywganNvblJlcGxhY2VyLCAyKVxuICApO1xufVxuXG4vKipcbiAqIEF0b21pY2FsbHkgcGluIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgIGV2ZW50SWQgZm9yIGEgbGVnYWN5XG4gKiBjbGFpbSAob25lIHdpdGhvdXQgYW4gaW5saW5lIGBldmVudElkYCkuIFRoZSBmaXJzdCByZXRyeSB0b1xuICogYHdyaXRlRXhjbHVzaXZlYCB0aGUgcmVjb3ZlcnkgbWFya2VyIHdpbnM7IGl0cyBgY2FuZGlkYXRlRXZlbnRJZGBcbiAqIGJlY29tZXMgY2Fub25pY2FsLiBTdWJzZXF1ZW50IHJldHJpZXMgcmVhZCB0aGUgbWFya2VyIGFuZCBhZG9wdFxuICogaXRzIGBldmVudElkYC4gVG9nZXRoZXIgd2l0aCB0aGUgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGluXG4gKiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCwgdGhpcyBnaXZlcyB0aGUgbGVnYWN5LWZhbGxiYWNrIHBhdGggdGhlXG4gKiBzYW1lIHNpbmdsZS1ldmVudCBjb252ZXJnZW5jZSBndWFyYW50ZWUgYXMgdGhlIGlubGluZS1gZXZlbnRJZGBcbiAqIGZhc3QgcGF0aC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIGNhbGxlciB0byBhZG9wdCwgb3IgYG51bGxgXG4gKiBpZiB3ZSBsb3N0IHRoZSBtYXJrZXIgcmFjZSBBTkQgdGhlIHJlc3VsdGluZyBtYXJrZXIgZmlsZSBpc1xuICogdW5yZWFkYWJsZSAoZXh0cmVtZWx5IHJhcmU7IGNvcnJ1cHRlZCBkaXNrKS4gQ2FsbGVycyB0cmVhdCBgbnVsbGBcbiAqIGFzIFwiZ2l2ZSB1cCwgdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgXCIgc28gdGhlIHJ1bnRpbWUnc1xuICogY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBzd2FsbG93cyB0aGlzIGF0dGVtcHQgYW5kIGxldHNcbiAqIGFub3RoZXIgb25lIHRocm91Z2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbkNhbm9uaWNhbEV2ZW50SWRGb3JMZWdhY3lDbGFpbShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0b2tlbjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgY2FuZGlkYXRlRXZlbnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgbWFya2VyUGF0aCA9IGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoYmFzZWRpciwgdG9rZW4sIHJ1bklkLCBob29rSWQpO1xuICBjb25zdCBtYXJrZXJDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoeyBldmVudElkOiBjYW5kaWRhdGVFdmVudElkIH0pO1xuICBjb25zdCB3b24gPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShtYXJrZXJQYXRoLCBtYXJrZXJDb250ZW50KTtcbiAgaWYgKHdvbikge1xuICAgIHJldHVybiBjYW5kaWRhdGVFdmVudElkO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEhvb2tSZWNvdmVyeU1hcmtlcihtYXJrZXJQYXRoKTtcbiAgcmV0dXJuIGV4aXN0aW5nPy5ldmVudElkID8/IG51bGw7XG59XG5cbi8qKlxuICogSW4tcHJvY2VzcyBwZXIta2V5IGFzeW5jIG11dGV4IGJhY2tlZCBieSBhIGNhbGxlci1zdXBwbGllZCBgTWFwYC5cbiAqIFVzZWQgYnkgYGNyZWF0ZUV2ZW50c1N0b3JhZ2VgIHRvIHNlcmlhbGl6ZSBzYW1lLWtleSBldmVudCB3cml0ZXNcbiAqIChgc3RlcF8qYCBmb3IgdGhlIHNhbWUgc3RlcCwgYGhvb2tfY3JlYXRlZGAgZm9yIHRoZSBzYW1lIGhvb2spLlxuICogVGhlIG1hcCBpcyBpbnN0YW50aWF0ZWQgcGVyLXN0b3JhZ2UtaW5zdGFuY2Ug4oCUIGRpZmZlcmVudFxuICogaW5zdGFuY2VzIGRvIE5PVCBzaGFyZSBsb2Nrcywgc28gdHdvIGluc3RhbmNlcyBzaGFyaW5nIG9uZSBkYXRhXG4gKiBkaXJlY3RvcnkgYmVoYXZlIGV4YWN0bHkgbGlrZSB0d28gc2VwYXJhdGUgT1MgcHJvY2Vzc2VzIGZyb20gdGhlXG4gKiBsb2NraW5nIHN0YW5kcG9pbnQuIENyb3NzLWluc3RhbmNlIC8gY3Jvc3MtcHJvY2VzcyBhcmJpdHJhdGlvblxuICogcmVsaWVzIG9uIHRoZSBvbi1kaXNrIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiB3aXRoSW5Qcm9jZXNzTG9jazxUPihcbiAgbG9ja3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+LFxuICBrZXk6IHN0cmluZyxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBwcmV2ID0gbG9ja3MuZ2V0KGtleSk7XG4gIGNvbnN0IHRhc2tCb3g6IHsgdGFzaz86IFByb21pc2U8VD4gfSA9IHt9O1xuICBjb25zdCB0YXNrID0gKGFzeW5jICgpID0+IHtcbiAgICBpZiAocHJldikge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHRhc2sgdG8gc2V0dGxlOyBkb24ndCBpbmhlcml0IGl0cyBlcnJvcnMuXG4gICAgICBhd2FpdCBwcmV2LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGxvY2tzLmdldChrZXkpID09PSB0YXNrQm94LnRhc2spIHtcbiAgICAgICAgbG9ja3MuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuICB0YXNrQm94LnRhc2sgPSB0YXNrO1xuICBsb2Nrcy5zZXQoa2V5LCB0YXNrKTtcbiAgcmV0dXJuIHRhc2s7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgd2FpdHMgYXNzb2NpYXRlZCB3aXRoIGEgd29ya2Zsb3cgcnVuLlxuICogQ2FsbGVkIHdoZW4gYSBydW4gcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBbGxXYWl0c0ZvclJ1bihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd2FpdHNEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3dhaXRzJyk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyh3YWl0c0Rpcik7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgLy8gZmlsZUlkcyBtYXkgY29udGFpbiB0YWcgc3VmZml4ZXMgKGUuZy4sIFwid3J1bl9BQkMtY29ycklkLnZpdGVzdC0wXCIpXG4gICAgLy8gYnV0IHN0YXJ0c1dpdGggc3RpbGwgbWF0Y2hlcyBjb3JyZWN0bHkgc2luY2UgdGhlIHRhZyBpcyBhIHN1ZmZpeC5cbiAgICBpZiAoZmlsZS5zdGFydHNXaXRoKGAke3J1bklkfS1gKSkge1xuICAgICAgY29uc3Qgd2FpdFBhdGggPSBwYXRoLmpvaW4od2FpdHNEaXIsIGAke2ZpbGV9Lmpzb25gKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUpTT04od2FpdFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgYSBsaWZlY3ljbGUtZHJpdmVuIHJ1biB1cGRhdGUgKHJ1bl9zdGFydGVkIC8gcnVuX2NvbXBsZXRlZCAvXG4gKiBydW5fZmFpbGVkIC8gcnVuX2NhbmNlbGxlZCkgdW5kZXIgdGhlIHNoYXJlZCBwZXItcnVuIGZpbGUgbG9jayxcbiAqIHJlLXJlYWRpbmcgdGhlIG9uLWRpc2sgcnVuIGluc2lkZSB0aGUgbG9jayBzbyBhbnkgYXR0cmlidXRlIHdyaXRlc1xuICogdGhhdCBsYW5kZWQgYmV0d2VlbiB0aGUgcHJlLXZhbGlkYXRpb24gYGN1cnJlbnRSdW5gIHJlYWQgYW5kIHRoaXNcbiAqIHdyaXRlIGFyZSBwcmVzZXJ2ZWQuIFdpdGhvdXQgdGhlIHJlLXJlYWQsIGFuIGBleHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzYFxuICogY2FsbCBzYW5kd2ljaGVkIGJldHdlZW4gdGhlIGxpZmVjeWNsZSByZWFkIGFuZCB3cml0ZSB3b3VsZCBiZVxuICogc2lsZW50bHkgb3ZlcndyaXR0ZW4gYnkgdGhlIGxpZmVjeWNsZSB3cml0ZSdzIHN0YWxlIGF0dHJpYnV0ZSBzbmFwc2hvdC5cbiAqXG4gKiBgcHJvcG9zZWRgIGlzIHRoZSBmdWxseS1jb25zdHJ1Y3RlZCBydW4gcm93IHRoZSBjYWxsZXIgd2FudHMgdG9cbiAqIHdyaXRlICh3aXRoIHRoZSBjb3JyZWN0IGRpc2NyaW1pbmF0ZWQtdW5pb24gc3RhdHVzIGJyYW5jaCkuIE9ubHkgdGhlXG4gKiBgYXR0cmlidXRlc2AgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgZnJlc2hlc3QgdmVyc2lvbiBpbnNpZGUgdGhlXG4gKiBsb2NrLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jazxUIGV4dGVuZHMgV29ya2Zsb3dSdW4+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwcm9wb3NlZDogVFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiB3aXRoUnVuRmlsZUxvY2socnVuSWQsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLFxuICAgICAgV29ya2Zsb3dSdW5TY2hlbWFcbiAgICApO1xuICAgIGNvbnN0IG5leHQ6IFQgPSB7XG4gICAgICAuLi5wcm9wb3NlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGZyZXNoPy5hdHRyaWJ1dGVzID8/IHByb3Bvc2VkLmF0dHJpYnV0ZXMsXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZUpTT04odGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLCBuZXh0LCB7XG4gICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGV2ZW50cyBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogSW1wbGVtZW50cyB0aGUgU3RvcmFnZVsnZXZlbnRzJ10gaW50ZXJmYWNlIHdpdGggY3JlYXRlLCBsaXN0LCBhbmQgbGlzdEJ5Q29ycmVsYXRpb25JZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgdHlwZSBMb2NhbEV2ZW50c1N0b3JhZ2UgPSBTdG9yYWdlWydldmVudHMnXSAmIHtcbiAgY2xlYXJDYWNoZSgpOiB2b2lkO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50c1N0b3JhZ2UoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBMb2NhbEV2ZW50c1N0b3JhZ2Uge1xuICAvLyBFdmVudHMgYXJlIGFwcGVuZC1vbmx5LiBLZWVwIGEgYm91bmRlZCB3aW5kb3cgb2YgbG9jYWxseSBwZXJzaXN0ZWQgZXZlbnRzXG4gIC8vIGF2YWlsYWJsZSB0byBpbW1lZGlhdGUgcmVwbGF5IHdpdGhvdXQgcmVyZWFkaW5nIEpTT04gZmlsZXMuIFBheWxvYWQgYnl0ZXNcbiAgLy8gYW5kIGVudHJ5IGNvdW50IGFyZSBib3RoIGJvdW5kZWQgc28gYWN0aXZlL3dhaXRpbmcgcnVucyBjYW5ub3QgcmV0YWluXG4gIC8vIHVuYm91bmRlZCBoaXN0b3JpZXMgaW4gYSBsb25nLWxpdmVkIGRldmVsb3BtZW50IHNlcnZlci5cbiAgY29uc3QgbWF4Q2FjaGVkRXZlbnRCeXRlcyA9IDQgKiAxMDI0ICogMTAyNDtcbiAgY29uc3QgbWF4Q2FjaGVkRXZlbnRFbnRyaWVzID0gMTAwMDtcbiAgY29uc3QgZXZlbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudD4oKTtcbiAgY29uc3QgY2FjaGVkRXZlbnRCeXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGNvbnN0IGNhY2hlZFBhdGhzQnlSdW5JZCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgbGV0IHRvdGFsQ2FjaGVkRXZlbnRCeXRlcyA9IDA7XG5cbiAgZnVuY3Rpb24gZGVsZXRlQ2FjaGVkRXZlbnQoZXZlbnRQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBldmVudCA9IGV2ZW50Q2FjaGUuZ2V0KGV2ZW50UGF0aCk7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudENhY2hlLmRlbGV0ZShldmVudFBhdGgpO1xuICAgIHRvdGFsQ2FjaGVkRXZlbnRCeXRlcyAtPSBjYWNoZWRFdmVudEJ5dGVzLmdldChldmVudFBhdGgpID8/IDA7XG4gICAgY2FjaGVkRXZlbnRCeXRlcy5kZWxldGUoZXZlbnRQYXRoKTtcbiAgICBjb25zdCBjYWNoZWRQYXRocyA9IGNhY2hlZFBhdGhzQnlSdW5JZC5nZXQoZXZlbnQucnVuSWQpO1xuICAgIGNhY2hlZFBhdGhzPy5kZWxldGUoZXZlbnRQYXRoKTtcbiAgICBpZiAoY2FjaGVkUGF0aHM/LnNpemUgPT09IDApIHtcbiAgICAgIGNhY2hlZFBhdGhzQnlSdW5JZC5kZWxldGUoZXZlbnQucnVuSWQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyUnVuQ2FjaGUocnVuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2FjaGVkUGF0aCBvZiBjYWNoZWRQYXRoc0J5UnVuSWQuZ2V0KHJ1bklkKSA/PyBbXSkge1xuICAgICAgZGVsZXRlQ2FjaGVkRXZlbnQoY2FjaGVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICBldmVudENhY2hlLmNsZWFyKCk7XG4gICAgY2FjaGVkRXZlbnRCeXRlcy5jbGVhcigpO1xuICAgIGNhY2hlZFBhdGhzQnlSdW5JZC5jbGVhcigpO1xuICAgIHRvdGFsQ2FjaGVkRXZlbnRCeXRlcyA9IDA7XG4gIH1cblxuICBmdW5jdGlvbiBjYWNoZUV2ZW50KFxuICAgIGV2ZW50UGF0aDogc3RyaW5nLFxuICAgIGNhY2hlZEV2ZW50OiBFdmVudCxcbiAgICBzZXJpYWxpemVkQnl0ZXM6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBpZiAoc2VyaWFsaXplZEJ5dGVzID4gbWF4Q2FjaGVkRXZlbnRCeXRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChcbiAgICAgIGV2ZW50Q2FjaGUuc2l6ZSA+IDAgJiZcbiAgICAgIChldmVudENhY2hlLnNpemUgPj0gbWF4Q2FjaGVkRXZlbnRFbnRyaWVzIHx8XG4gICAgICAgIHRvdGFsQ2FjaGVkRXZlbnRCeXRlcyArIHNlcmlhbGl6ZWRCeXRlcyA+IG1heENhY2hlZEV2ZW50Qnl0ZXMpXG4gICAgKSB7XG4gICAgICBjb25zdCBvbGRlc3RQYXRoID0gZXZlbnRDYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlIGFzIHN0cmluZztcbiAgICAgIGRlbGV0ZUNhY2hlZEV2ZW50KG9sZGVzdFBhdGgpO1xuICAgIH1cblxuICAgIGV2ZW50Q2FjaGUuc2V0KGV2ZW50UGF0aCwgY2FjaGVkRXZlbnQpO1xuICAgIGNhY2hlZEV2ZW50Qnl0ZXMuc2V0KGV2ZW50UGF0aCwgc2VyaWFsaXplZEJ5dGVzKTtcbiAgICB0b3RhbENhY2hlZEV2ZW50Qnl0ZXMgKz0gc2VyaWFsaXplZEJ5dGVzO1xuICAgIGNvbnN0IGNhY2hlZFBhdGhzID1cbiAgICAgIGNhY2hlZFBhdGhzQnlSdW5JZC5nZXQoY2FjaGVkRXZlbnQucnVuSWQpID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNhY2hlZFBhdGhzLmFkZChldmVudFBhdGgpO1xuICAgIGNhY2hlZFBhdGhzQnlSdW5JZC5zZXQoY2FjaGVkRXZlbnQucnVuSWQsIGNhY2hlZFBhdGhzKTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSB0aGUgaW4tbWVtb3J5IGNhY2hlIGZvciBhbiBldmVudCB0aGF0IHdhcyBqdXN0IHBlcnNpc3RlZCBhdFxuICAvLyBgZXZlbnRQYXRoYC4gYHNlcmlhbGl6ZWRFdmVudGAgbXVzdCBiZSB0aGUgZXhhY3QgYnl0ZSBwYXlsb2FkIHdyaXR0ZW5cbiAgLy8gdG8gZGlzazogZGVjb2RpbmcgaXQgKGluc3RlYWQgb2YgdGhlIGNhbGxlcidzIGBldmVudGApIGJvdGggZGV0YWNoZXNcbiAgLy8gY2FsbGVyLW93bmVkIHBheWxvYWRzIGFuZCBtYXRjaGVzIGRpc2stcmVhZCBub3JtYWxpemF0aW9uLiBDYWxsZXJzXG4gIC8vIG11c3QgY2FwdHVyZSBgc2VyaWFsaXplZEV2ZW50YCAqYmVmb3JlKiB0aGUgd3JpdGUncyBgYXdhaXRgIHNvIHRoZVxuICAvLyBjYWNoZWQgc25hcHNob3QgY2FuIG5ldmVyIG9ic2VydmUgYSBsYXRlciBtdXRhdGlvbi5cbiAgZnVuY3Rpb24gcmVtZW1iZXJTdG9yZWRFdmVudChcbiAgICBldmVudDogRXZlbnQsXG4gICAgZXZlbnRQYXRoOiBzdHJpbmcsXG4gICAgc2VyaWFsaXplZEV2ZW50OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgLy8gVGVybWluYWwgcnVucyByZWxlYXNlIHRoZWlyIGNhY2hlZCBoaXN0b3J5IHNvIGEgbG9uZy1saXZlZCBkZXZcbiAgICAvLyBzZXJ2ZXIgZG9lc24ndCByZXRhaW4gY29tcGxldGVkIHJ1bnMgZm9yZXZlci5cbiAgICBpZiAoaXNUZXJtaW5hbFJ1bkV2ZW50VHlwZShldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICBjbGVhclJ1bkNhY2hlKGV2ZW50LnJ1bklkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJpYWxpemVkQnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkRXZlbnQpO1xuICAgIGlmIChzZXJpYWxpemVkQnl0ZXMgPiBtYXhDYWNoZWRFdmVudEJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVkRXZlbnQgPSBFdmVudFNjaGVtYS5zYWZlUGFyc2UoXG4gICAgICBKU09OLnBhcnNlKHNlcmlhbGl6ZWRFdmVudCwganNvblJldml2ZXIpXG4gICAgKTtcbiAgICBpZiAoY2FjaGVkRXZlbnQuc3VjY2Vzcykge1xuICAgICAgY2FjaGVFdmVudChldmVudFBhdGgsIGNhY2hlZEV2ZW50LmRhdGEsIHNlcmlhbGl6ZWRCeXRlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc3RvcmVFdmVudChldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudFBhdGggPSB0YWdnZWRQYXRoKFxuICAgICAgYmFzZWRpcixcbiAgICAgICdldmVudHMnLFxuICAgICAgYCR7ZXZlbnQucnVuSWR9LSR7ZXZlbnQuZXZlbnRJZH1gLFxuICAgICAgdGFnXG4gICAgKTtcbiAgICBjb25zdCBzZXJpYWxpemVkRXZlbnQgPSBKU09OLnN0cmluZ2lmeShldmVudCwganNvblJlcGxhY2VyLCAyKTtcbiAgICBhd2FpdCB3cml0ZShldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG4gICAgcmVtZW1iZXJTdG9yZWRFdmVudChldmVudCwgZXZlbnRQYXRoLCBzZXJpYWxpemVkRXZlbnQpO1xuICB9XG5cbiAgLy8gUGVyLWluc3RhbmNlIGluLXByb2Nlc3MgbXV0ZXhlcy4gVHdvIHN0b3JhZ2UgaW5zdGFuY2VzIHNoYXJpbmdcbiAgLy8gb25lIGRhdGEgZGlyZWN0b3J5IGdldCBpbmRlcGVuZGVudCBsb2NrIG1hcHMsIHdoaWNoIG1ha2VzIHRoZW1cbiAgLy8gYmVoYXZlIGxpa2UgdHdvIHNlcGFyYXRlIE9TIHByb2Nlc3NlcyBmcm9tIHRoZSBsb2NraW5nXG4gIC8vIHN0YW5kcG9pbnQg4oCUIGNyb3NzLWluc3RhbmNlIGFyYml0cmF0aW9uIHJlbGllcyBvbiB0aGUgb24tZGlza1xuICAvLyBgd3JpdGVFeGNsdXNpdmVgIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyBpbnN0ZWFkLiBUZXN0cyB1c2VcbiAgLy8gdGhpcyB0byBleGVyY2lzZSBjcm9zcy1wcm9jZXNzIGNvbnZlcmdlbmNlIHdpdGhvdXQgc3Bhd25pbmdcbiAgLy8gc3VicHJvY2Vzc2VzLlxuICAvL1xuICAvLyBgc3RlcExvY2tzYCBzZXJpYWxpemVzIHN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhlIHNhbWVcbiAgLy8gKHJ1bklkLCBjb3JyZWxhdGlvbklkKTogc2VlIGNvbW1lbnQgZnVydGhlciBkb3duIGluIHRoZVxuICAvLyBgaXNTdGVwRXZlbnRgIGJyYW5jaC5cbiAgLy9cbiAgLy8gYGhvb2tMb2Nrc2Agc2VyaWFsaXplcyBgaG9va19jcmVhdGVkYCBjYWxscyBmb3IgdGhlIHNhbWVcbiAgLy8gKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBzbyB0aGUgXCJjbGFpbSB0b2tlbiwgdGhlbiB3cml0ZSBob29rXG4gIC8vIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgcnVucyB0byBjb21wbGV0aW9uIGJlZm9yZSBhbm90aGVyXG4gIC8vIGluLXByb2Nlc3MgaW52b2NhdGlvbiBlbnRlcnMgdGhlIGRlZHVwIGJyYW5jaC5cbiAgY29uc3Qgc3RlcExvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIGNvbnN0IGhvb2tMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG4gIHJldHVybiB7XG4gICAgY2xlYXJDYWNoZSxcbiAgICBhc3luYyBjcmVhdGUocnVuSWQsIGRhdGEsIHBhcmFtcyk6IFByb21pc2U8RXZlbnRSZXN1bHQ+IHtcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVlc3Qtc3VwcGxpZWQgSURzIGJlZm9yZSB0aGV5J3JlIGNvbmNhdGVuYXRlZCBpbnRvXG4gICAgICAvLyBmaWxlc3lzdGVtIHBhdGhzLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UgYWdhaW5zdCBwYXRoIHRyYXZlcnNhbFxuICAgICAgLy8gYXR0YWNrcyB3aGVyZSBhIGNsaWVudCBzdXBwbGllcyBydW5JZCAvIGNvcnJlbGF0aW9uSWQgdmFsdWVzIGxpa2VcbiAgICAgIC8vIFwiLi4vLi4vLi4vcGFja2FnZVwiIHRvIHJlYWQgb3Igd3JpdGUgZmlsZXMgb3V0c2lkZSB0aGUgc3RvcmFnZSByb290LlxuICAgICAgLy8gUnVuIGJlZm9yZSB0YWtpbmcgdGhlIHBlci1zdGVwIG11dGV4IHNvIG1hbGZvcm1lZCBpbnB1dHMgZmFpbCBmYXN0LlxuICAgICAgLy9cbiAgICAgIC8vIEVtcHR5IGBjb3JyZWxhdGlvbklkYCB2YWx1ZXMgYXJlIGFsc28gcmVqZWN0ZWQgaGVyZTogdGhlIGV2ZW50XG4gICAgICAvLyBzY2hlbWFzIG9ubHkgcmVxdWlyZSBgei5zdHJpbmcoKWAsIHNvIHdpdGhvdXQgdGhpcyBjaGVjayBhXG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgLyBob29rX2NyZWF0ZWQgLyB3YWl0X2NyZWF0ZWQgcmVxdWVzdCB3aXRoXG4gICAgICAvLyBgY29ycmVsYXRpb25JZDogJydgIHdvdWxkIHNpbGVudGx5IGJlIHdyaXR0ZW4gdW5kZXIgYSBtYWxmb3JtZWRcbiAgICAgIC8vIGNvbXBvc2l0ZSBrZXkgbGlrZSBgJHtydW5JZH0tYC5cbiAgICAgIGlmIChydW5JZCAhPSBudWxsICYmIHJ1bklkICE9PSAnJykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgfVxuICAgICAgaWYgKCdjb3JyZWxhdGlvbklkJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLmNvcnJlbGF0aW9uSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnY29ycmVsYXRpb25JZCcsIGRhdGEuY29ycmVsYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBhcmUgc2VyaWFsaXplZCBwZXItc3RlcCB2aWEgYW4gaW4tcHJvY2VzcyBtdXRleFxuICAgICAgLy8gc28gdGhhdCB0aGUgXCJjaGVjayBzdGF0ZSwgdGhlbiB3cml0ZVwiIHNlcXVlbmNlIGluIHN0ZXBfc3RhcnRlZCAvXG4gICAgICAvLyBzdGVwX2NvbXBsZXRlZCAvIHN0ZXBfZmFpbGVkIC8gc3RlcF9yZXRyeWluZyBpcyBhdG9taWMuIHN0ZXBfY3JlYXRlZFxuICAgICAgLy8gaXMgYWxzbyBzZXJpYWxpemVkIHNvIGR1cGxpY2F0ZS1jcmVhdGUgcmFjZXMgZG9uJ3QgbGVhdmUgZXh0cmFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudHMgaW4gdGhlIGxvZy5cbiAgICAgIGNvbnN0IGlzU3RlcEV2ZW50ID1cbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnO1xuICAgICAgaWYgKGlzU3RlcEV2ZW50ICYmIHJ1bklkICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBsb2NrS2V5ID0gdGFnXG4gICAgICAgICAgPyBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LiR7dGFnfWBcbiAgICAgICAgICA6IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICByZXR1cm4gd2l0aEluUHJvY2Vzc0xvY2soc3RlcExvY2tzLCBsb2NrS2V5LCAoKSA9PiBjcmVhdGVJbXBsKCkpO1xuICAgICAgfVxuICAgICAgLy8gYGhvb2tfY3JlYXRlZGAgaXMgc2VyaWFsaXplZCBwZXItKHJ1bklkLCBob29rSWQpIHNvIHRoZVxuICAgICAgLy8gXCJjbGFpbSB0b2tlbiwgd3JpdGUgaG9vayBlbnRpdHksIHdyaXRlIGV2ZW50XCIgc2VxdWVuY2UgcnVucyB0b1xuICAgICAgLy8gY29tcGxldGlvbiBiZWZvcmUgYW5vdGhlciBpbi1wcm9jZXNzIGludm9jYXRpb24gZW50ZXJzIHRoZVxuICAgICAgLy8gc2FtZS1ob29rIGRlZHVwIGJyYW5jaC4gV2l0aG91dCB0aGlzLCB0d28gc2FtZS10aWNrIGNvbmN1cnJlbnRcbiAgICAgIC8vIGNhbGxlcnMgY2FuIHJhY2UgYmV0d2VlbiB0aGUgd2lubmVyJ3MgYHdyaXRlRXhjbHVzaXZlKGNsYWltKWBcbiAgICAgIC8vIGFuZCBgd3JpdGVKU09OKGhvb2spYCwgbWFraW5nIHRoZSBzZWNvbmQgY2FsbGVyIG1vbWVudGFyaWx5XG4gICAgICAvLyBvYnNlcnZlIGEgY2xhaW0gd2l0aCBubyBtYXRjaGluZyBob29rIGVudGl0eSDigJQgd2hpY2ggdGhlXG4gICAgICAvLyBjcmFzaC1yZWNvdmVyeSBwYXRoIGJlbG93IHdvdWxkIG1pc2ludGVycHJldCBhcyBhIHByaW9yIGNyYXNoXG4gICAgICAvLyBhbmQgaW5jb3JyZWN0bHkgZmFsbCB0aHJvdWdoIHRvIGEgc2Vjb25kIGhvb2sgZW50aXR5IHdyaXRlLlxuICAgICAgLy9cbiAgICAgIC8vIGBob29rX3JlY2VpdmVkYCBhbmQgYGhvb2tfZGlzcG9zZWRgIHNoYXJlIHRoZSBzYW1lIHBlci1ob29rIGxvY2tcbiAgICAgIC8vIHNvIGEgcmVzdW1lJ3MgXCJob29rIGV4aXN0cyBhbmQgaXMgbm90IGRpc3Bvc2VkLCB0aGVuIGFwcGVuZFwiXG4gICAgICAvLyBzZXF1ZW5jZSBpcyBhdG9taWMgd2l0aCByZXNwZWN0IHRvIHRoZSBkaXNwb3NlcidzIFwid3JpdGUgZGlzcG9zZVxuICAgICAgLy8gbG9jaywgZGVsZXRlIGVudGl0eSwgdGhlbiBhcHBlbmRcIiBzZXF1ZW5jZS4gV2l0aG91dCB0aGlzLCBhXG4gICAgICAvLyByZXN1bWUgdGhhdCBwYXNzZWQgaXRzIGV4aXN0ZW5jZSBjaGVjayBiZWZvcmUgdGhlIGRpc3Bvc2FsIGJlZ2FuXG4gICAgICAvLyBjb3VsZCBhcHBlbmQgaXRzIGBob29rX3JlY2VpdmVkYCBBRlRFUiBgaG9va19kaXNwb3NlZGAg4oCUIGFuXG4gICAgICAvLyBvcmRlcmluZyB0aGF0IGlzIGpvdXJuYWxlZCBkdXJhYmx5IGFuZCBtYWtlcyBldmVyeSBzdWJzZXF1ZW50XG4gICAgICAvLyByZXBsYXkgb2YgdGhlIG93bmluZyBydW4gZGl2ZXJnZSBhdCB0aGF0IGV2ZW50XG4gICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC93b3JrZmxvdy9pc3N1ZXMvMjc4MSkuXG4gICAgICBjb25zdCBpc0hvb2tMaWZlY3ljbGVFdmVudCA9XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCc7XG4gICAgICBpZiAoaXNIb29rTGlmZWN5Y2xlRXZlbnQgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uaG9vay4ke3RhZ31gXG4gICAgICAgICAgOiBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2tgO1xuICAgICAgICByZXR1cm4gd2l0aEluUHJvY2Vzc0xvY2soaG9va0xvY2tzLCBsb2NrS2V5LCAoKSA9PiBjcmVhdGVJbXBsKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZUltcGwoKTtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSW1wbCgpOiBQcm9taXNlPEV2ZW50UmVzdWx0PiB7XG4gICAgICAgIC8vIE1vc3QgcGF0aHMgdXNlIHRoZSBmcmVzaGx5LWdlbmVyYXRlZCBjYW5kaWRhdGUgZXZlbnRJZC4gVGhlXG4gICAgICAgIC8vIGhvb2tfY3JlYXRlZCBkZWR1cC1yZWNvdmVyeSBwYXRoIGJlbG93IG1heSByZWFzc2lnbiBpdCB0b1xuICAgICAgICAvLyB0aGUgY2Fub25pY2FsIGV2ZW50SWQgcGVyc2lzdGVkIGluIHRoZSBkdXJhYmxlIHRva2VuIGNsYWltXG4gICAgICAgIC8vIHNvIGNvbmN1cnJlbnQgLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgY29udmVyZ2Ugb24gYSBzaW5nbGVcbiAgICAgICAgLy8gZXZlbnQgaW4gdGhlIGxvZy5cbiAgICAgICAgbGV0IGV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIC8vIEZvciBydW5fY3JlYXRlZCBldmVudHMsIHVzZSBjbGllbnQtcHJvdmlkZWQgcnVuSWQgb3IgZ2VuZXJhdGUgb25lIHNlcnZlci1zaWRlXG4gICAgICAgIGxldCBlZmZlY3RpdmVSdW5JZDogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgKCFydW5JZCB8fCBydW5JZCA9PT0gJycpKSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBgd3J1bl8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICB9IGVsc2UgaWYgKCFydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncnVuSWQgaXMgcmVxdWlyZWQgZm9yIG5vbi1ydW5fY3JlYXRlZCBldmVudHMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZmZlY3RpdmVSdW5JZCA9IHJ1bklkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY2xpZW50LXByb3ZpZGVkIHJ1bklkIHRpbWVzdGFtcCBpcyB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGRcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmIHJ1bklkICYmIHJ1bklkICE9PSAnJykge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRlVWxpZFRpbWVzdGFtcChcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgJ3dydW5fJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcih2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwZWNWZXJzaW9uIGlzIGFsd2F5cyBzZW50IGJ5IHRoZSBydW50aW1lLCBidXQgd2UgcHJvdmlkZSBhIGZhbGxiYWNrIGZvciBzYWZldHlcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU3BlY1ZlcnNpb24gPSBkYXRhLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5UO1xuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJ1biBzdGF0ZSBmb3IgdmFsaWRhdGlvbiAoaWYgbm90IGNyZWF0aW5nIGEgbmV3IHJ1bilcbiAgICAgICAgLy8gU2tpcCBydW4gdmFsaWRhdGlvbiBmb3Igc3RlcF9jb21wbGV0ZWQgYW5kIHN0ZXBfcmV0cnlpbmcgLSB0aGV5IG9ubHkgb3BlcmF0ZVxuICAgICAgICAvLyBvbiBydW5uaW5nIHN0ZXBzLCBhbmQgcnVubmluZyBzdGVwcyBhcmUgYWx3YXlzIGFsbG93ZWQgdG8gbW9kaWZ5IHJlZ2FyZGxlc3NcbiAgICAgICAgLy8gb2YgcnVuIHN0YXRlLiBUaGlzIG9wdGltaXphdGlvbiBzYXZlcyBmaWxlc3lzdGVtIHJlYWRzIHBlciBzdGVwIGV2ZW50LlxuICAgICAgICBsZXQgY3VycmVudFJ1bjogV29ya2Zsb3dSdW4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2tpcFJ1blZhbGlkYXRpb25FdmVudHMgPSBbJ3N0ZXBfY29tcGxldGVkJywgJ3N0ZXBfcmV0cnlpbmcnXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlICE9PSAncnVuX2NyZWF0ZWQnICYmXG4gICAgICAgICAgIXNraXBSdW5WYWxpZGF0aW9uRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZXNpbGllbnQgc3RhcnQ6IHJ1bl9zdGFydGVkIG9uIG5vbi1leGlzdGVudCBydW4gd2l0aCBldmVudERhdGFcbiAgICAgICAgICAvLyBjcmVhdGVzIHRoZSBydW4gZmlyc3QsIHNvIHRoZSBxdWV1ZSBjYW4gYm9vdHN0cmFwIGEgcnVuIHRoYXRcbiAgICAgICAgICAvLyBmYWlsZWQgdG8gY3JlYXRlIGR1cmluZyBzdGFydCgpLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmXG4gICAgICAgICAgICAhY3VycmVudFJ1biAmJlxuICAgICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YSAmJlxuICAgICAgICAgICAgZGF0YS5ldmVudERhdGFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bklucHV0RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlucHV0PzogYW55O1xuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSAmJlxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuaW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhydW5JbnB1dERhdGEuYXR0cmlidXRlcyA/PyB7fSkubWFwKFxuICAgICAgICAgICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEF0b21pY2FsbHkgdHJ5IHRvIHB1Ymxpc2ggdGhlIHJ1biBlbnRpdHkgc28gb25seSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgLy8gd3JpdGVyIHdpbnMsIHByZXZlbnRpbmcgYSBUT0NUT1UgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgLy8gcnVuX2NyZWF0ZWQgZnJvbSBzdGFydCgpIGNvdWxkIG92ZXJ3cml0ZSBhIHJ1biB0aGF0IHdhc1xuICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byAncnVubmluZycuXG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRSdW46IFdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dERhdGEuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgY29uc3QgcnVuUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKTtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY3JlYXRlZFJ1biwganNvblJlcGxhY2VyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmIChjcmVhdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlZCB0aGUgcnVuIOKAlCBhbHNvIHdyaXRlIHRoZSBydW5fY3JlYXRlZCBldmVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnRJZCA9IGBldm50XyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IHJ1bkNyZWF0ZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dERhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0RGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dERhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlRXZlbnQocnVuQ3JlYXRlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gY3JlYXRlZFJ1bjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSdW4gYWxyZWFkeSBleGlzdHMgKGNvbmN1cnJlbnQgcnVuX2NyZWF0ZWQgd29uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHJhY2UpLiBSZS1yZWFkIGl0IHNvIGRvd25zdHJlYW0gbG9naWMgc2VlcyB0aGUgcmVhbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW5fZmFpbGVkIG9uIGEgbm9uLWV4aXN0ZW50IHJ1biBpcyByZWplY3RlZCB0byBtYXRjaCB0aGVcbiAgICAgICAgLy8gcG9zdGdyZXMgYW5kIHZlcmNlbCB3b3JsZHMsIHdoaWNoIGJvdGggc3VyZmFjZSB0aGlzIGFzIGFcbiAgICAgICAgLy8gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIHJhdGhlciB0aGFuIHNpbGVudGx5IHBlcnNpc3RpbmcgYW5cbiAgICAgICAgLy8gZXZlbnQgZm9yIGEgcnVuIHRoYXQgd2FzIG5ldmVyIGNyZWF0ZWQuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gVkVSU0lPTiBDT01QQVRJQklMSVRZOiBDaGVjayBydW4gc3BlYyB2ZXJzaW9uXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBGb3IgZXZlbnRzIHRoYXQgaGF2ZSBmZXRjaGVkIHRoZSBydW4sIGNoZWNrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy8gU2tpcCBmb3IgcnVuX2NyZWF0ZWQgKG5vIGV4aXN0aW5nIHJ1bikgYW5kIHJ1bnRpbWUgZXZlbnRzIChzdGVwX2NvbXBsZXRlZCwgc3RlcF9yZXRyeWluZykuXG4gICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgcnVuIHJlcXVpcmVzIGEgbmV3ZXIgd29ybGQgdmVyc2lvblxuICAgICAgICAgIGlmIChyZXF1aXJlc05ld2VyV29ybGQoY3VycmVudFJ1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5Ob3RTdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgICAgY3VycmVudFJ1bi5zcGVjVmVyc2lvbiEsXG4gICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9DVVJSRU5UXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJvdXRlIHRvIGxlZ2FjeSBoYW5kbGVyIGZvciBwcmUtZXZlbnQtc291cmNpbmcgcnVuc1xuICAgICAgICAgIGlmIChpc0xlZ2FjeVNwZWNWZXJzaW9uKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlTGVnYWN5RXZlbnQoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjdXJyZW50UnVuLFxuICAgICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZBTElEQVRJT046IFRlcm1pbmFsIHN0YXRlIGFuZCBldmVudCBvcmRlcmluZyBjaGVja3NcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBhIHN0ZXBfc3RhcnRlZCBjYXJyeWluZyBzdGVwLWNyZWF0aW9uIGRhdGFcbiAgICAgICAgLy8gKHN0ZXBOYW1lICsgaW5wdXQpIGlzIGFsbG93ZWQgdG8gYXJyaXZlIHdpdGggbm8gcHJpb3Igc3RlcF9jcmVhdGVkXG4gICAgICAgIC8vIOKAlCBpdCBjcmVhdGVzIHRoZSBzdGVwIG9uIHRoZSBmbHkgKHNlZSB0aGUgbWF0ZXJpYWxpemF0aW9uIGJsb2NrXG4gICAgICAgIC8vIGJlbG93KS4gVGhpcyBtaXJyb3JzIHRoZSByZXNpbGllbnQgcnVuX3N0YXJ0ZWQgcGF0aC4gRGV0ZWN0IGl0IGhlcmVcbiAgICAgICAgLy8gc28gdGhlIGVudGl0eS1jcmVhdGlvbiB0ZXJtaW5hbC1ydW4gZ3VhcmQgdHJlYXRzIGl0IGxpa2UgYSBjcmVhdGlvblxuICAgICAgICAvLyBhbmQgdGhlIFwic3RlcCBtdXN0IGV4aXN0XCIgb3JkZXJpbmcgZ3VhcmQgZG9lc24ndCByZWplY3QgaXQuXG4gICAgICAgIGNvbnN0IGxhenlTdGVwU3RhcnQgPVxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGEgJiZcbiAgICAgICAgICAhIWRhdGEuZXZlbnREYXRhICYmXG4gICAgICAgICAgdHlwZW9mIChkYXRhLmV2ZW50RGF0YSBhcyB7IHN0ZXBOYW1lPzogdW5rbm93biB9KS5zdGVwTmFtZSA9PT1cbiAgICAgICAgICAgICdzdHJpbmcnICYmXG4gICAgICAgICAgKGRhdGEuZXZlbnREYXRhIGFzIHsgaW5wdXQ/OiB1bmtub3duIH0pLmlucHV0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gUnVuIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKGN1cnJlbnRSdW4uc3RhdHVzKSkge1xuICAgICAgICAgIGNvbnN0IHJ1blRlcm1pbmFsRXZlbnRzID0gW1xuICAgICAgICAgICAgJ3J1bl9zdGFydGVkJyxcbiAgICAgICAgICAgICdydW5fY29tcGxldGVkJyxcbiAgICAgICAgICAgICdydW5fZmFpbGVkJyxcbiAgICAgICAgICBdO1xuXG4gICAgICAgICAgLy8gSWRlbXBvdGVudCBvcGVyYXRpb246IHJ1bl9jYW5jZWxsZWQgb24gYWxyZWFkeSBjYW5jZWxsZWQgcnVuIGlzIGFsbG93ZWRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnICYmXG4gICAgICAgICAgICBjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ2NhbmNlbGxlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFJldHVybiBleGlzdGluZyBzdGF0ZSAoaWRlbXBvdGVudClcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JlRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICBwYXJhbXM/LnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGV2ZW50OiBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKSxcbiAgICAgICAgICAgICAgcnVuOiBjdXJyZW50UnVuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQgb24gdGVybWluYWwgcnVucywgdXNlIFJ1bkV4cGlyZWRFcnJvciBzbyB0aGVcbiAgICAgICAgICAvLyBydW50aW1lIGtub3dzIHRvIGV4aXQgd2l0aG91dCByZXRyeWluZy5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5FeHBpcmVkRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGlzIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPdGhlciBydW4gc3RhdGUgdHJhbnNpdGlvbnMgYXJlIG5vdCBhbGxvd2VkIG9uIHRlcm1pbmFsIHJ1bnNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBydW5UZXJtaW5hbEV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IHRyYW5zaXRpb24gcnVuIGZyb20gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGluZyBuZXcgZW50aXRpZXMgb24gdGVybWluYWwgcnVucyBpcyBub3QgYWxsb3dlZC4gQSBsYXp5XG4gICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGNyZWF0ZXMgYSBzdGVwLCBzbyBpdCBpcyByZWplY3RlZCBoZXJlIHRvbyDigJQgYSBiYXJlXG4gICAgICAgICAgLy8gKG5vbi1sYXp5KSBzdGVwX3N0YXJ0ZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgc3RlcC12YWxpZGF0aW9uXG4gICAgICAgICAgLy8gYmxvY2sgYmVsb3csIHdoaWNoIHVzZXMgUnVuRXhwaXJlZEVycm9yIGZvciB0ZXJtaW5hbCBydW5zLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGxhenlTdGVwU3RhcnRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IGNyZWF0ZSBuZXcgZW50aXRpZXMgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBzZXQgYXR0cmlidXRlcyBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcgYW5kIHRlcm1pbmFsIHN0YXRlKVxuICAgICAgICAvLyBTdG9yZSBleGlzdGluZ1N0ZXAgc28gd2UgY2FuIHJldXNlIGl0IGxhdGVyIChhdm9pZCBkb3VibGUgcmVhZClcbiAgICAgICAgbGV0IHZhbGlkYXRlZFN0ZXA6IFN0ZXAgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc3RlcEV2ZW50cyA9IFtcbiAgICAgICAgICAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc3RlcEV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIHZhbGlkYXRlZFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gRXZlbnQgb3JkZXJpbmc6IHN0ZXAgbXVzdCBleGlzdCBiZWZvcmUgdGhlc2UgZXZlbnRzIOKAlCBleGNlcHQgb25cbiAgICAgICAgICAvLyB0aGUgbGF6eS1zdGFydCBwYXRoLCB3aGVyZSBzdGVwX3N0YXJ0ZWQgY3JlYXRlcyB0aGUgc3RlcCBpdHNlbGYuXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZWRTdGVwICYmICFsYXp5U3RlcFN0YXJ0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTGF6eSBzdGFydCBleGFjdGx5LW9uY2UgZ2F0ZTogYSBsYXp5IHN0ZXBfc3RhcnRlZCBhbHdheXMgQ1JFQVRFU1xuICAgICAgICAgIC8vIHRoZSBzdGVwICh0aGUgb3duZWQtaW5saW5lIHBhdGggb25seSBzZW5kcyBvbmUgZm9yIGEgc3RlcCB3aG9zZVxuICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBpdCBkZWZlcnJlZCkuIElmIHRoZSBzdGVwIGFscmVhZHkgZXhpc3RzLCBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBoYW5kbGVyIHdvbiB0aGUgY3JlYXRlIOKAlCB0aGlzIGNhbGxlciBpcyBhIGxvc2VyIGFuZCBtdXN0IG5vdCBzdGFydFxuICAgICAgICAgIC8vIG9yIHJ1biB0aGUgc3RlcC4gVGhyb3cgRW50aXR5Q29uZmxpY3RFcnJvciBzbyB0aGUgcnVudGltZSdzXG4gICAgICAgICAgLy8gZXhlY3V0ZVN0ZXAgbWFwcyBpdCB0byBgc2tpcHBlZGAuIFRoaXMgaXMgY3JpdGljYWw6IHRoZSBwbGFpbiBzdGFydFxuICAgICAgICAgIC8vIHRyYW5zaXRpb24gYmVsb3cgcGVybWl0cyByZS1zdGFydGluZyBhIG5vbi10ZXJtaW5hbCBzdGVwIChyZXRyaWVzXG4gICAgICAgICAgLy8gcmVseSBvbiB0aGF0KSwgc28gd2l0aG91dCB0aGlzIGdhdGUgYSBsb3NlciB3b3VsZCByZS1zdGFydCBhXG4gICAgICAgICAgLy8gcnVubmluZyBzdGVwIGFuZCBydW4gdGhlIGJvZHkgYSBzZWNvbmQgdGltZS5cbiAgICAgICAgICBpZiAobGF6eVN0ZXBTdGFydCAmJiB2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN0ZXAgdGVybWluYWwgc3RhdGUgdmFsaWRhdGlvbi4gdmFsaWRhdGVkU3RlcCBjYW4gYmUgbnVsbCBvbmx5IG9uXG4gICAgICAgICAgLy8gdGhlIGxhenktc3RhcnQgcGF0aCAobm8gc3RlcCB5ZXQpIOKAlCB0aGVyZSBpcyBub3RoaW5nIHRlcm1pbmFsIHRvXG4gICAgICAgICAgLy8gZ3VhcmQgYWdhaW5zdCBpbiB0aGF0IGNhc2UsIHNvIHRoZXNlIGNoZWNrcyBhcmUgc2tpcHBlZC5cbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgaWYgKGlzVGVybWluYWxTdGVwU3RhdHVzKHZhbGlkYXRlZFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IG1vZGlmeSBzdGVwIGluIHRlcm1pbmFsIHN0YXRlIFwiJHt2YWxpZGF0ZWRTdGVwLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT24gdGVybWluYWwgcnVuczogb25seSBhbGxvdyBjb21wbGV0aW5nL2ZhaWxpbmcgaW4tcHJvZ3Jlc3Mgc3RlcHNcbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyhjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXAuc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgbm9uLXJ1bm5pbmcgc3RlcCBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIb29rLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcpXG4gICAgICAgIGNvbnN0IGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UgPSBbJ2hvb2tfZGlzcG9zZWQnLCAnaG9va19yZWNlaXZlZCddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZS5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiZcbiAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQSByZXN1bWUgbXVzdCBuZXZlciBiZSBqb3VybmFsZWQgYWZ0ZXIgdGhlIGhvb2sncyBkaXNwb3NhbC5cbiAgICAgICAgICAvLyBUaGUgZGlzcG9zZXIncyBkdXJhYmxlIG9yZGVyIGlzOiBkaXNwb3NlIGxvY2sg4oaSIGNsYWltL2VudGl0eVxuICAgICAgICAgIC8vIGRlbGV0ZSDihpIgYGhvb2tfZGlzcG9zZWRgIGFwcGVuZCwgc28gdGhlIGhvb2sgZW50aXR5IGNhbiBzdGlsbFxuICAgICAgICAgIC8vIGV4aXN0IChvciB0aGUgZGlzcG9zZXIgbWF5IGhhdmUgY3Jhc2hlZCBtaWQtdGVhcmRvd24pIHdoaWxlXG4gICAgICAgICAgLy8gZGlzcG9zYWwgaXMgYWxyZWFkeSBjb21taXR0ZWQuIFJlLXZhbGlkYXRlIHRoZSBkaXNwb3NlIGxvY2tcbiAgICAgICAgICAvLyBoZXJlIOKAlCB1bmRlciB0aGUgcGVyLWhvb2sgaW4tcHJvY2VzcyBsb2NrIHRha2VuIGFib3ZlIOKAlCBzb1xuICAgICAgICAgIC8vIGFjY2VwdGFuY2Ugb2JzZXJ2ZXMgdGhlIHNhbWUgb3JkZXIgcmVwbGF5IHdpbGw6IG9uY2UgZGlzcG9zYWxcbiAgICAgICAgICAvLyBoYXMgY29tbWl0dGVkLCB0aGUgcmVzdW1lIGlzIHJlamVjdGVkIGV4YWN0bHkgbGlrZSBvbmUgdGhhdFxuICAgICAgICAgIC8vIGFycml2ZWQgYWZ0ZXIgdGVhcmRvd24gZmluaXNoZWQuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgICAgKGF3YWl0IGlzSG9va0Rpc3Bvc2FsQ29tbWl0dGVkKGJhc2VkaXIsIGRhdGEuY29ycmVsYXRpb25JZCwgdGFnKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIWV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGRhdGEuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGBldmVudGAgbWF5IGJlIHJlYXNzaWduZWQgbGF0ZXIgaW4gdGhlIGBob29rX2NyZWF0ZWRgXG4gICAgICAgIC8vIGRlZHVwLXJlY292ZXJ5IGJyYW5jaCB0byBzd2FwIGluIGEgY2Fub25pY2FsIGV2ZW50SWQgL1xuICAgICAgICAvLyBjcmVhdGVkQXQgcGVyc2lzdGVkIGluIHRoZSBkdXJhYmxlIHRva2VuIGNsYWltIHNvXG4gICAgICAgIC8vIGNvbmN1cnJlbnQgLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgY29udmVyZ2Ugb24gYSBzaW5nbGVcbiAgICAgICAgLy8gZXZlbnQgaW4gdGhlIGxvZy5cbiAgICAgICAgbGV0IGV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICBldmVudElkLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU3RyaXAgZXZlbnREYXRhIGZyb20gcnVuX3N0YXJ0ZWQg4oCUIGl0IGJlbG9uZ3Mgb24gcnVuX2NyZWF0ZWQgb25seS5cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmICdldmVudERhdGEnIGluIGV2ZW50KSB7XG4gICAgICAgICAgZGVsZXRlIChldmVudCBhcyBhbnkpLmV2ZW50RGF0YTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpcCBvbmx5IHRoZSBzdGVwIGBpbnB1dGAgZnJvbSB0aGUgbGF6eSBzdGVwX3N0YXJ0ZWQgZXZlbnQgcm93IOKAlFxuICAgICAgICAvLyBpdCBiZWxvbmdzIG9uIHRoZSBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIHdyaXR0ZW4gYWJvdmUuIHN0ZXBOYW1lIGlzXG4gICAgICAgIC8vIHByZXNlcnZlZCBmb3IgdGhlIGNsaWVudCByZXBsYXkgY29uc3VtZXIncyBzdGVwLW5hbWUgZGl2ZXJnZW5jZVxuICAgICAgICAvLyBjaGVjayAocGFja2FnZXMvY29yZS9zcmMvc3RlcC50cykuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBsYXp5U3RlcFN0YXJ0ICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnQgJiZcbiAgICAgICAgICAoZXZlbnQgYXMgeyBldmVudERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS5ldmVudERhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgeyBpbnB1dDogX3N0cmlwcGVkSW5wdXQsIC4uLnJlc3QgfSA9IChcbiAgICAgICAgICAgIGV2ZW50IGFzIHsgZXZlbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9XG4gICAgICAgICAgKS5ldmVudERhdGE7XG4gICAgICAgICAgKGV2ZW50IGFzIHsgZXZlbnREYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9KS5ldmVudERhdGEgPSByZXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgZW50aXR5IGNyZWF0ZWQvdXBkYXRlZCBmb3IgRXZlbnRSZXN1bHRcbiAgICAgICAgbGV0IHJ1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBzdGVwOiBTdGVwIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9vazogSG9vayB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHdhaXQ6IFdhaXQgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIExhenkgc3RlcCBzdGFydDogc2V0IHRydWUgd2hlbiB0aGlzIHN0ZXBfc3RhcnRlZCBhdG9taWNhbGx5IGNyZWF0ZWRcbiAgICAgICAgLy8gdGhlIHN0ZXAgKHRoZSBjYWxsZXIgd29uIHRoZSBjcmVhdGUtY2xhaW0pLiBTdXJmYWNlZCBvbiBFdmVudFJlc3VsdFxuICAgICAgICAvLyBhcyB0aGUgcnVudGltZSdzIGV4YWN0bHktb25jZSBvd25lcnNoaXAgc2lnbmFsLlxuICAgICAgICBsZXQgc3RlcENyZWF0ZWRMYXppbHkgPSBmYWxzZTtcbiAgICAgICAgLy8gRm9yIGBob29rX2NyZWF0ZWRgLCB0aGUgaG9vayBlbnRpdHkgd3JpdGUgaXMgZGVmZXJyZWQgdW50aWxcbiAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggc3VjY2VlZHMsIHNvIGEgcmV0cnkgdGhhdFxuICAgICAgICAvLyBjb2xsaWRlcyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgIGRvZXMgbm90XG4gICAgICAgIC8vIG11dGF0ZSB0aGUgZHVyYWJsZSBob29rIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQuXG4gICAgICAgIC8vIGBob29rRW50aXR5V3JpdGVPcHRpb25zYCBjYXJyaWVzIHRoZSBgeyBvdmVyd3JpdGUgfWAgbW9kZVxuICAgICAgICAvLyBjaG9zZW4gYnkgdGhlIGRlZHVwLXJlY292ZXJ5IGJyYW5jaCBhYm92ZSAodW5kZWZpbmVkIGZvclxuICAgICAgICAvLyBmaXJzdCB3cml0ZXJzLCBgeyBvdmVyd3JpdGU6IHRydWUgfWAgZm9yIHJldHJpZXMgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVwYWlyaW5nIGFuIG9ycGhhbmVkIHBhcnRpYWwgd3JpdGUpLlxuICAgICAgICBsZXQgaG9va0VudGl0eVdyaXRlT3B0aW9uczogeyBvdmVyd3JpdGU6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBDcmVhdGUvdXBkYXRlIGVudGl0eSBiYXNlZCBvbiBldmVudCB0eXBlIChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgLy8gUnVuIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBydW5EYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhydW5EYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogcnVuRGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1biA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuRGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuRGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHJ1biBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bkRhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgIGlucHV0OiBydW5EYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0cmlidXRlczogcnVuRGF0YS5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIEF0b21pY2FsbHkgcHVibGlzaCB0aGUgcnVuIGVudGl0eSBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW5cbiAgICAgICAgICAvLyBleGlzdGluZyB3aW5uZXIuIFRoaXMgcHJldmVudHMgYSBUT0NUT1UgcmFjZSB3aXRoIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAvLyBzdGFydCBwYXRoIChydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuKSB0aGF0IGNvdWxkIHJlc3VsdCBpblxuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBydW5fY3JlYXRlZCBldmVudHMgaW4gdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShydW4sIGpzb25SZXBsYWNlciwgMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVuIHdpdGhvdXQgaW5zZXJ0aW5nIGFcbiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudC4gIFRoaXMgbWFrZXMgcnVuX3N0YXJ0ZWQgaWRlbXBvdGVudCBmb3JcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMuICBXZSBvbWl0IHByZWxvYWRlZCBldmVudHMgaGVyZVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIGEgcmFyZSByYWNlLWNvbmRpdGlvbiBwYXRoIOKAlCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBsb2FkV29ya2Zsb3dSdW5FdmVudHMoKS5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHJ1bjogY3VycmVudFJ1biB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IG91dHB1dD86IGFueSB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlUnVuRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVSdW5FcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IGZhaWxlZERhdGEuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcgJiYgY3VycmVudFJ1bikge1xuICAgICAgICAgIHJ1biA9IGF3YWl0IHdpdGhSdW5GaWxlTG9jayhlZmZlY3RpdmVSdW5JZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJlc2ggPSBhd2FpdCByZWFkSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpLFxuICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghZnJlc2gpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoZGF0YS5ldmVudERhdGEuY2hhbmdlcywge1xuICAgICAgICAgICAgICBleGlzdGluZ0tleXM6IE9iamVjdC5rZXlzKGZyZXNoLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xhaW0gdGhlIGNvcnJlbGF0aW9uIGRlZHVwIGxvY2sgb25seSBhZnRlciB2YWxpZGF0aW9uOiBhXG4gICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGZhaWx1cmUgbXVzdCBsZWF2ZSB0aGUgY29ycmVsYXRpb25JZCB1bmNsYWltZWQgc29cbiAgICAgICAgICAgIC8vIHRoZSBydW50aW1lJ3MgcmV0cnkgb2YgdGhlIHNhbWUgZXZlbnQgaXMgbm90IG1pc3JlcG9ydGVkIGFzXG4gICAgICAgICAgICAvLyBcImFscmVhZHkgZXhpc3RzXCIgd2hpbGUgdGhlIGV2ZW50IHdhcyBuZXZlciB3cml0dGVuICh0aGVcbiAgICAgICAgICAgIC8vIGRpc3BhdGNoZXIgd291bGQgdGhlbiB3YWl0IGZvcmV2ZXIgZm9yIGFuIGV2ZW50IHRoYXQgaXMgbm90XG4gICAgICAgICAgICAvLyBpbiB0aGUgbG9nKS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLndyaXRlci50eXBlID09PSAnd29ya2Zsb3cnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgICAgPyBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgICAnYXR0cmlidXRlcycsXG4gICAgICAgICAgICAgICAgYXR0ckxvY2tOYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoYXR0ckxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICAgIGlmICghYXR0ckNsYWltZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBBdHRyaWJ1dGUgZXZlbnQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0ge1xuICAgICAgICAgICAgICAuLi5mcmVzaCxcbiAgICAgICAgICAgICAgYXR0cmlidXRlczogYXBwbHlBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgIGZyZXNoLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEuY2hhbmdlc1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH0gYXMgV29ya2Zsb3dSdW47XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKSxcbiAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gc3RlcF9jcmVhdGVkOiBDcmVhdGVzIHN0ZXAgZW50aXR5IHdpdGggc3RhdHVzICdwZW5kaW5nJywgYXR0ZW1wdD0wLCBjcmVhdGVkQXQgc2V0LlxuICAgICAgICAgIC8vIFR3byBjb25jdXJyZW50IGludm9jYXRpb25zIHdpdGggaWRlbnRpY2FsIGNvcnJlbGF0aW9uSWRzIChlLmcuIHRoZVxuICAgICAgICAgIC8vIHNuYXBzaG90IHJ1bnRpbWUncyBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzIGFjcm9zcyByZXBsYXlzKVxuICAgICAgICAgIC8vIG11c3QgYmUgZGVkdXBlZCDigJQgb3RoZXJ3aXNlIGJvdGggd3JpdGVzIHN1Y2NlZWQgYW5kIHRoZSBldmVudCBsb2dcbiAgICAgICAgICAvLyBlbmRzIHVwIHdpdGggZHVwbGljYXRlIHN0ZXBfY3JlYXRlZCBlbnRyaWVzLiBUaGUgb3V0ZXJcbiAgICAgICAgICAvLyB3aXRoU3RlcExvY2sgbXV0ZXggc2VyaWFsaXplcyB3aXRoaW4gYSBzaW5nbGUgcHJvY2VzczsgdGhpc1xuICAgICAgICAgIC8vIFRoZSBleGNsdXNpdmUgY29uc3RyYWludCBmaWxlIGFkZGl0aW9uYWxseSBwcm90ZWN0cyBhZ2FpbnN0XG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyByYWNlcyAodHdvIHBucG0gd29ya2VycywgcmVkZWxpdmVyZWQgcXVldWUgbWVzc2FnZXMsXG4gICAgICAgICAgLy8gZXRjLikuIFRoZSBsb3NlciB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvciBzbyB0aGUgcnVudGltZSdzXG4gICAgICAgICAgLy8gZXhpc3RpbmcgY2F0Y2ggcGF0aCBjYW4gc3dhbGxvdyBpdCBhbmQgYXZvaWQgZG91YmxlLXF1ZXVpbmcgdGhlXG4gICAgICAgICAgLy8gc3RlcC5cbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXN0ZXBDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3RlcERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwRGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgaW5wdXQ6IHN0ZXBEYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0ZW1wdDogMCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHN0ZXAgZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgc3RlcFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gc3RlcF9zdGFydGVkOiBJbmNyZW1lbnRzIGF0dGVtcHQsIHNldHMgc3RhdHVzIHRvICdydW5uaW5nJ1xuICAgICAgICAgIC8vIFNldHMgc3RhcnRlZEF0IG9ubHkgb24gdGhlIGZpcnN0IHN0YXJ0IChub3QgdXBkYXRlZCBvbiByZXRyaWVzKVxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG5cbiAgICAgICAgICAvLyBMYXp5IHN0ZXAgc3RhcnQ6IG5vIHByaW9yIHN0ZXBfY3JlYXRlZCDigJQgY3JlYXRlIHRoZSBzdGVwIGVudGl0eVxuICAgICAgICAgIC8vIGFuZCBhIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgZXZlbnQgbm93LCB0aGVuIGZhbGwgdGhyb3VnaCB0byB0aGVcbiAgICAgICAgICAvLyBzdGFydCB0cmFuc2l0aW9uIGJlbG93LiBNaXJyb3JzIHRoZSByZXNpbGllbnQgcnVuX3N0YXJ0ZWQgcGF0aDpcbiAgICAgICAgICAvLyB0aGUgc3RlcCBlbnRpdHkgaXMgY2xhaW1lZCBhdG9taWNhbGx5IChmaXJzdCB3cml0ZXIgd2lucykgYW5kIHRoZVxuICAgICAgICAgIC8vIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgZXZlbnQga2VlcHMgcmVwbGF5IGNvcnJlY3QgKHRoZSBjbGllbnQgc3RlcFxuICAgICAgICAgIC8vIGNvbnN1bWVyIG1hcmtzIGhhc0NyZWF0ZWRFdmVudCBvbmx5IHdoZW4gaXQgb2JzZXJ2ZXMgdGhhdCBldmVudCkuXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZWRTdGVwICYmIGxhenlTdGVwU3RhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhenlEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICBpbnB1dDogYW55O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgPyBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tOYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja1BhdGgsXG4gICAgICAgICAgICAgICcnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFzdGVwQ3JlYXRlZENsYWltZWQpIHtcbiAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgYWxyZWFkeSBjbGFpbWVkIHRoZSBjcmVhdGUgZm9yIHRoaXNcbiAgICAgICAgICAgICAgLy8gc3RlcC4gVGhlIGF0b21pYyBjbGFpbSBpcyB0aGUgZXhhY3RseS1vbmNlIG93bmVyc2hpcCBnYXRlOlxuICAgICAgICAgICAgICAvLyBvbmx5IHRoZSB3aW5uZXIgcnVucyB0aGUgc3RlcCBib2R5IGlubGluZS4gVGhyb3dcbiAgICAgICAgICAgICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciDigJQgdGhlIHJ1bnRpbWUncyBleGVjdXRlU3RlcCBtYXBzIHRoaXMgdG9cbiAgICAgICAgICAgICAgLy8gYHNraXBwZWRgLCBzbyB0aGUgbG9zZXIgZG9lcyBub3Qgc3RhcnQgb3IgcnVuIHRoZSBzdGVwLiBUaGlzXG4gICAgICAgICAgICAgIC8vIHByZXNlcnZlcyB0aGUgc2FtZSBcImV4YWN0bHkgb25lIGhhbmRsZXIgb3ducyBlYWNoIHN0ZXBcIlxuICAgICAgICAgICAgICAvLyBndWFyYW50ZWUgdGhlIHNlcGFyYXRlIHN0ZXBfY3JlYXRlZCBjbGFpbSBwcm92aWRlcyB0b2RheS5cbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkU3RlcDogU3RlcCA9IHtcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgc3RlcE5hbWU6IGxhenlEYXRhLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIGlucHV0OiBsYXp5RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IDAsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgICB0YWdnZWRQYXRoKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgICAgICBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YCxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgY3JlYXRlZFN0ZXBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgZXZlbnQgc28gcmVwbGF5IG9ic2VydmVzIGl0XG4gICAgICAgICAgICAgIC8vICh0aGUgY2xpZW50IHN0ZXAgY29uc3VtZXIgc2V0cyBoYXNDcmVhdGVkRXZlbnQgb25seSBvbiBhXG4gICAgICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZCBldmVudCkuIEl0cyBldmVudElkIGlzIGEgZnJlc2ggbW9ub3RvbmljIFVMSUQuXG4gICAgICAgICAgICAgIC8vIE9yZGVyaW5nIHZzLiB0aGUgc3RlcF9zdGFydGVkIGV2ZW50IHJvdyBkb2VzIG5vdCBhZmZlY3RcbiAgICAgICAgICAgICAgLy8gY29ycmVjdG5lc3M6IHRoZSBzdGVwX3N0YXJ0ZWQgY29uc3VtZXIgaXMgYSBuby1vcCBhbmQgb25seVxuICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgZmxpcHMgaGFzQ3JlYXRlZEV2ZW50LCBzbyB0aGUgZW5kIHN0YXRlIGlzIHRoZVxuICAgICAgICAgICAgICAvLyBzYW1lIHdoaWNoZXZlciBzb3J0cyBmaXJzdCDigJQgdGhpcyBtYXRjaGVzIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQg4oaSIHJ1bl9jcmVhdGVkIHByZWNlZGVudCBpbiB0aGlzIGZpbGUuXG4gICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkRXZlbnRJZCA9IGBldm50XyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkRXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGV2ZW50SWQ6IHN0ZXBDcmVhdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGxhenlEYXRhLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgaW5wdXQ6IGxhenlEYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgICB0YWdnZWRQYXRoKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICdldmVudHMnLFxuICAgICAgICAgICAgICAgICAgYCR7ZWZmZWN0aXZlUnVuSWR9LSR7c3RlcENyZWF0ZWRFdmVudElkfWAsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHN0ZXBDcmVhdGVkRXZlbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcCA9IGNyZWF0ZWRTdGVwO1xuICAgICAgICAgICAgICBzdGVwQ3JlYXRlZExhemlseSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhc24ndCBiZWVuIHJlYWNoZWQgeWV0XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlciAmJlxuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpID4gRGF0ZS5ub3coKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUb29FYXJseUVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3Qgc3RhcnQgc3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiOiByZXRyeUFmdGVyIHRpbWVzdGFtcCBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXRgLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IE1hdGguY2VpbChcbiAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDBcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBndWFyZDogcmUtcmVhZCB0aGUgc3RlcCBlbnRpdHkgdG8gY2hlY2sgaWYgaXRcbiAgICAgICAgICAgIC8vIHJlYWNoZWQgdGVybWluYWwgc3RhdGUgYmV0d2VlbiB0aGUgdmFsaWRhdGlvbiByZWFkIGFuZCBub3cuXG4gICAgICAgICAgICAvLyBUaGlzIG5hcnJvd3MgdGhlIFRPQ1RPVSB3aW5kb3cgYnV0IGRvZXMgbm90IGZ1bGx5IGVsaW1pbmF0ZSBpdFxuICAgICAgICAgICAgLy8gKHRoZSBsb2NhbCB3b3JsZCBpcyBzaW5nbGUtcHJvY2VzcyAvIGRldi1vbmx5OyB0aGUgcG9zdGdyZXNcbiAgICAgICAgICAgIC8vIHdvcmxkIHVzZXMgU1FMLWxldmVsIGF0b21pYyBndWFyZHMgZm9yIHByb2R1Y3Rpb24pLlxuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgZnJlc2hTdGVwID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIHN0ZXBDb21wb3NpdGVLZXksXG4gICAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChmcmVzaFN0ZXAgJiYgaXNUZXJtaW5hbFN0ZXBTdGF0dXMoZnJlc2hTdGVwLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7ZnJlc2hTdGVwLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2V0IHN0YXJ0ZWRBdCBvbiB0aGUgZmlyc3Qgc3RhcnRcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiB2YWxpZGF0ZWRTdGVwLnN0YXJ0ZWRBdCA/PyBub3csXG4gICAgICAgICAgICAgIC8vIEluY3JlbWVudCBhdHRlbXB0IGNvdW50ZXIgb24gZXZlcnkgc3RhcnRcbiAgICAgICAgICAgICAgYXR0ZW1wdDogdmFsaWRhdGVkU3RlcC5hdHRlbXB0ICsgMSxcbiAgICAgICAgICAgICAgLy8gQ2xlYXIgcmV0cnlBZnRlciBub3cgdGhhdCB0aGUgc3RlcCBoYXMgc3RhcnRlZFxuICAgICAgICAgICAgICByZXRyeUFmdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9jb21wbGV0ZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggb3V0cHV0XG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHN0ZXAgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMgeyByZXN1bHQ6IGFueSB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5yZXN1bHQsXG4gICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9mYWlsZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggZXJyb3JcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGZhaWxpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGZhaWxlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBmaWVsZCBpcyBTZXJpYWxpemVkRGF0YSAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgICAgICAgICAgIC8vIGRlaHlkcmF0ZVN0ZXBFcnJvci4gV2Ugc3RvcmUgaXQgdmVyYmF0aW0g4oCUIGNvbnN1bWVycyBoeWRyYXRlIGl0XG4gICAgICAgICAgICAvLyB2aWEgaHlkcmF0ZVN0ZXBFcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmc6IFNldHMgc3RhdHVzIGJhY2sgdG8gJ3BlbmRpbmcnLCByZWNvcmRzIGVycm9yXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBjb25zdCByZXRyeURhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICAgIHJldHJ5QWZ0ZXI/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICBlcnJvcjogcmV0cnlEYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5RGF0YS5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gSG9vayBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBob29rRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHRva2VuOiBzdHJpbmc7XG4gICAgICAgICAgICBtZXRhZGF0YT86IGFueTtcbiAgICAgICAgICAgIGlzV2ViaG9vaz86IGJvb2xlYW47XG4gICAgICAgICAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEF0b21pY2FsbHkgY2xhaW0gdGhlIHRva2VuIHVzaW5nIGFuIGV4Y2x1c2l2ZS1jcmVhdGUgY29uc3RyYWludCBmaWxlLlxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIHRoZSBUT0NUT1UgcmFjZSBvZiB0aGUgcHJldmlvdXMgcmVhZC1hbGwtdGhlbi1jaGVjayBhcHByb2FjaC5cbiAgICAgICAgICBjb25zdCBjb25zdHJhaW50UGF0aCA9IGhvb2tUb2tlbkNsYWltUGF0aChiYXNlZGlyLCBob29rRGF0YS50b2tlbik7XG4gICAgICAgICAgLy8gUGVyc2lzdCBgZXZlbnRJZGAgaW4gdGhlIGNsYWltIHNvIGNvbmN1cnJlbnQgLyBjcm9zcy1cbiAgICAgICAgICAvLyBwcm9jZXNzIHJldHJpZXMgY2FuIGNvbnZlcmdlIG9uIGEgc2luZ2xlIGNhbm9uaWNhbFxuICAgICAgICAgIC8vIGBob29rX2NyZWF0ZWRgIGV2ZW50IHBhdGguIFNlZSB0aGUgcmVjb3ZlcnkgY29tbWVudFxuICAgICAgICAgIC8vIGJlbG93LlxuICAgICAgICAgIGNvbnN0IGNsYWltQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJvdW5kZWQgY2xhaW0gbG9vcC4gQSBzYW1lLXRva2VuIGNsYWltIGNhbiBiZSBvYnNlcnZlZCBpbiB0aGVcbiAgICAgICAgICAvLyBzaG9ydCB3aW5kb3cgd2hlcmUgaXRzIHJlbGVhc2UgaXMgYWxyZWFkeSBjb21taXR0ZWQgYnV0IHRoZVxuICAgICAgICAgIC8vIGNsYWltIGZpbGUgaXRzZWxmIGlzIHN0aWxsIG9uIGRpc2sgKG9yIHdhcyBqdXN0IGRlbGV0ZWQpOlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gICAtIHRoZSBjbGFpbSB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBleGNsdXNpdmUtY3JlYXRlIGF0dGVtcHRcbiAgICAgICAgICAvLyAgICAgYW5kIHRoZSBvd25lcnNoaXAgcmVhZCDihpIgcmV0cnkgaW1tZWRpYXRlbHk7XG4gICAgICAgICAgLy8gICAtIHRoZSBjbGFpbSBpcyBoZWxkIGJ5IGEgZGlzcG9zZWQgaG9vayBvciBhIHRlcm1pbmFsL21pc3NpbmdcbiAgICAgICAgICAvLyAgICAgcnVuIChgaXNIb29rVG9rZW5DbGFpbVJlbGVhc2FibGVgKSDihpIgd2FpdCBicmllZmx5IGZvciB0aGVcbiAgICAgICAgICAvLyAgICAgaW4tZmxpZ2h0IHJlbGVhc2VyICh0aGUgaG9va19kaXNwb3NlZCBoYW5kbGVyIG9yIHRoZVxuICAgICAgICAgIC8vICAgICBydW4tY29tcGxldGlvbiBjbGVhbnVwKSB0byBkZWxldGUgaXQsIHRoZW4gcmVjbGFpbTsgaWYgaXRcbiAgICAgICAgICAvLyAgICAgbmV2ZXIgZG9lcyAodGhlIHJlbGVhc2VyIGNyYXNoZWQgYWZ0ZXIgY29tbWl0dGluZyBpdHNcbiAgICAgICAgICAvLyAgICAgZGlzcG9zZSBsb2NrIC8gdGVybWluYWwgc3RhdHVzKSwgcmVsZWFzZSB0aGUgc3RhbGUgY2xhaW1cbiAgICAgICAgICAvLyAgICAgb3Vyc2VsdmVzIGFuZCByZWNsYWltLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2l0aG91dCB0aGlzLCBhIHJ1biBjbGFpbWluZyBhIHRva2VuIHJpZ2h0IGFmdGVyIHRoZSBwcmV2aW91c1xuICAgICAgICAgIC8vIG93bmVyIGRpc3Bvc2VkIGl0IHJlY29yZHMgYSBkdXJhYmxlLCBzcHVyaW91cyBob29rX2NvbmZsaWN0XG4gICAgICAgICAgLy8gKGlzc3VlICMyNzc4KS4gQSBnZW51aW5lbHkgbGl2ZSBjbGFpbSBleGl0cyB0aGUgbG9vcCBvbiB0aGVcbiAgICAgICAgICAvLyBmaXJzdCBpdGVyYXRpb24gYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGRlZHVwIC8gY29uZmxpY3RcbiAgICAgICAgICAvLyBoYW5kbGluZyBiZWxvdy5cbiAgICAgICAgICBsZXQgdG9rZW5DbGFpbWVkID0gZmFsc2U7XG4gICAgICAgICAgbGV0IGV4aXN0aW5nQ2xhaW06IHouaW5mZXI8dHlwZW9mIEhvb2tUb2tlbkNsYWltU2NoZW1hPiB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGxldCByZWxlYXNhYmxlT2JzZXJ2YXRpb25zID0gMDtcbiAgICAgICAgICAvLyBBIGNsYWltIGZpbGUgdGhhdCBleGlzdHMgKGV4Y2x1c2l2ZS1jcmVhdGUga2VlcHMgZmFpbGluZykgYnV0IG5ldmVyXG4gICAgICAgICAgLy8gcGFyc2VzIGlzIGRlYnJpczogYHdyaXRlRXhjbHVzaXZlYCB3cml0ZXMgYXRvbWljYWxseSwgc28gYSBsaXZlXG4gICAgICAgICAgLy8gY2xhaW0gaXMgYWx3YXlzIHZhbGlkIEpTT04g4oCUIGFuIHVucGFyc2VhYmxlIG9uZSBhdCB0aGUgY2Fub25pY2FsXG4gICAgICAgICAgLy8gcGF0aCBpcyBhIGNvcnJ1cHQvcGFydGlhbCBsZWZ0b3Zlci4gVGhlIHJlbGVhc2VyIGxlYXZlcyBpdCBhbG9uZVxuICAgICAgICAgIC8vIChvd25lcnNoaXAgaXMgdW5kZXRlcm1pbmFibGUpLCBzbyBub3RoaW5nIGVsc2UgcmVhcHMgaXQgYW5kIGl0IHdvdWxkXG4gICAgICAgICAgLy8gYmxvY2sgdGhlIHRva2VuIGZvcmV2ZXIuIEZvcmNlLWRlbGV0ZSBpdCBhZnRlciBhIGZldyBvYnNlcnZhdGlvbnMuXG4gICAgICAgICAgbGV0IHVucGFyc2VhYmxlT2JzZXJ2YXRpb25zID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDEwOyBhdHRlbXB0KyspIHtcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNsYWltIGlzIGFic2VudCwgdGhlIGV2ZW50IGxvZyBpcyB0aGUgb25seSBkdXJhYmxlXG4gICAgICAgICAgICAvLyBzb3VyY2UgdGhhdCBjYW4gZGlzdGluZ3Vpc2ggYSBmaXJzdCBob29rIGZyb20gYSBjcmFzaC1sb3N0XG4gICAgICAgICAgICAvLyB0b2tlbiBjYWNoZS5cbiAgICAgICAgICAgIGlmICghKGF3YWl0IHJlYWRIb29rVG9rZW5DbGFpbShjb25zdHJhaW50UGF0aCkpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHJlYnVpbGRMaXZlSG9va0J5VG9rZW5Gcm9tRXZlbnRMb2coXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2VuQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGNvbnN0cmFpbnRQYXRoLCBjbGFpbUNvbnRlbnQpO1xuICAgICAgICAgICAgaWYgKHRva2VuQ2xhaW1lZCkgYnJlYWs7XG5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0gPSBhd2FpdCByZWFkSG9va1Rva2VuQ2xhaW0oY29uc3RyYWludFBhdGgpO1xuICAgICAgICAgICAgaWYgKCFleGlzdGluZ0NsYWltKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBjbGFpbSBlaXRoZXIgdmFuaXNoZWQgKHJhY2VkIGEgcmVsZWFzZXIgYmV0d2VlbiB0aGVcbiAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlLWNyZWF0ZSBhdHRlbXB0IGFuZCB0aGlzIHJlYWQg4oaSIHJldHJ5IHJlc29sdmVzIGl0KSBvclxuICAgICAgICAgICAgICAvLyBleGlzdHMgYnV0IGlzIHVucGFyc2VhYmxlLiBgcmVhZEhvb2tUb2tlbkNsYWltYCBjYW4ndCB0ZWxsIHRoZW1cbiAgICAgICAgICAgICAgLy8gYXBhcnQsIHNvIGNvdW50IGNvbnNlY3V0aXZlIG1pc3Nlczsgb25jZSB3ZSdyZSBjb25maWRlbnQgaXQgaXNcbiAgICAgICAgICAgICAgLy8gbm90IGEgdHJhbnNpZW50IHJhY2UsIGRlbGV0ZSB0aGUgKHByZXN1bWVkIGNvcnJ1cHQpIGZpbGUgc28gdGhlXG4gICAgICAgICAgICAgIC8vIHRva2VuIGlzbid0IGJsb2NrZWQgZm9yZXZlci4gYGRlbGV0ZUpTT05gIGlzIGEgbm8tb3AgaWYgaXQgd2FzXG4gICAgICAgICAgICAgIC8vIGluIGZhY3QgYSB2YW5pc2hlZC1jbGFpbSByYWNlLlxuICAgICAgICAgICAgICB1bnBhcnNlYWJsZU9ic2VydmF0aW9ucysrO1xuICAgICAgICAgICAgICBpZiAodW5wYXJzZWFibGVPYnNlcnZhdGlvbnMgPj0gMykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oY29uc3RyYWludFBhdGgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLnJ1bklkID09PSBlZmZlY3RpdmVSdW5JZCAmJlxuICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLmhvb2tJZCA9PT0gZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gT3VyIG93biBwcmlvciBjbGFpbSDigJQgZGVkdXAtcmVjb3ZlcnkgaGFuZGxpbmcgYmVsb3cuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhKGF3YWl0IGlzSG9va1Rva2VuQ2xhaW1SZWxlYXNhYmxlKGJhc2VkaXIsIGV4aXN0aW5nQ2xhaW0sIHRhZykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gR2VudWluZWx5IGxpdmUgY2xhaW0g4oCUIGNvbmZsaWN0IGhhbmRsaW5nIGJlbG93LlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbGVhc2FibGVPYnNlcnZhdGlvbnMrKztcbiAgICAgICAgICAgIGlmIChyZWxlYXNhYmxlT2JzZXJ2YXRpb25zIDwgMykge1xuICAgICAgICAgICAgICAvLyBHaXZlIHRoZSBpbi1mbGlnaHQgcmVsZWFzZXIgYSBtb21lbnQgdG8gZGVsZXRlIHRoZSBjbGFpbS5cbiAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRoZSByZWxlYXNlciBpcyBub3QgY29taW5nLiBSZWxlYXNlIHRoZSBzdGFsZSBjbGFpbSBhbmRcbiAgICAgICAgICAgICAgLy8gdGhlIGhvb2sgZW50aXR5IGl0IHBvaW50cyBhdCwgbWlycm9yaW5nIHRoZSBob29rX2Rpc3Bvc2VkXG4gICAgICAgICAgICAgIC8vIGNsZWFudXAuXG4gICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oY29uc3RyYWludFBhdGgpO1xuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdDbGFpbS5ob29rSWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBleGlzdGluZ0NsYWltLmhvb2tJZCwgdGFnKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgICAgIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoXG4gICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAgIGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLnJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLmhvb2tJZFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0gPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlY292ZXJ5IHNoYXBlOiB0aGUgZHVyYWJsZSByZWNvcmQgb2YgYSBzdWNjZXNzZnVsIGhvb2tcbiAgICAgICAgICAvLyBjcmVhdGlvbiBpcyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgaW4gdGhlIGV2ZW50IGxvZy4gVGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBhbmQgaG9vayBlbnRpdHkgYXJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBldmVudCxcbiAgICAgICAgICAvLyBhbmQgdGhlIHRocmVlIHdyaXRlcyBhcmUgTk9UIGF0b21pYywgc28gYSBjcmFzaCBhdCBhbnlcbiAgICAgICAgICAvLyBwb2ludCBjYW4gbGVhdmUgb25lIG9yIHR3byBvZiB0aGVtIG9uIGRpc2sgd2l0aG91dCB0aGVcbiAgICAgICAgICAvLyBldmVudC4gVHJlYXRpbmcgdGhvc2UgYXMgXCJjb21wbGV0ZWRcIiB3b3VsZCBoYXZlIHRoZVxuICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBzd2FsbG93IHRoZSByZXRyeSBhbmQgcGVybWFuZW50bHkgbG9zZVxuICAgICAgICAgIC8vIHRoZSBgaG9va19jcmVhdGVkYCBldmVudCBmcm9tIHRoZSBsb2cuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXaGVuIHRoZSBkZWR1cCBicmFuY2ggZmlyZXMgZm9yIHRoZSBzYW1lIGAocnVuSWQsIGhvb2tJZClgLFxuICAgICAgICAgIC8vIHdlIGNvbnZlcmdlIG9uIHRoZSBjYW5vbmljYWwgYGV2ZW50SWRgIHBlcnNpc3RlZCBpbiB0aGVcbiAgICAgICAgICAvLyBjbGFpbSBmaWxlIGJ5IHRoZSBvcmlnaW5hbCAod2lubmluZykgYHdyaXRlRXhjbHVzaXZlYC4gQnlcbiAgICAgICAgICAvLyBhZG9wdGluZyB0aGF0IGV2ZW50SWQgZm9yIHRoaXMgcmV0cnkncyBldmVudCB3cml0ZSDigJQgYW5kXG4gICAgICAgICAgLy8gbGV0dGluZyB0aGUgb3V0ZXIgbm8tb3ZlcndyaXRlIGB3cml0ZUpTT05gIGZvciB0aGUgZXZlbnRcbiAgICAgICAgICAvLyB0aHJvdyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgb24gY29sbGlzaW9uIOKAlCBjb25jdXJyZW50IC9cbiAgICAgICAgICAvLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgZWl0aGVyOlxuICAgICAgICAgIC8vICAgLSBwdWJsaXNoIHRoZSBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIHBhdGggZXhhY3RseSBvbmNlXG4gICAgICAgICAgLy8gICAgICh0aGUgbG9zZXIncyBgd3JpdGVKU09OYCB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgICAgICAgICAvLyAgICAgd2hpY2ggdGhlIHJ1bnRpbWUncyBleGlzdGluZyBjb25jdXJyZW50LXJlcGxheSBjYXRjaFxuICAgICAgICAgIC8vICAgICBwYXRoIGF0IHN1c3BlbnNpb24taGFuZGxlci50czoxNDIgc3dhbGxvd3MpLCBvclxuICAgICAgICAgIC8vICAgLSBjb252ZXJnZSBvbiBhIHNpbmdsZSByZWNvdmVyeSB3cml0ZSB3aGVuIHRoZSBwcmlvclxuICAgICAgICAgIC8vICAgICBjbGFpbSB3YXMgb3JwaGFuZWQgYnkgYSBjcmFzaCBiZWZvcmUgdGhlIGV2ZW50IGxhbmRlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBsZWdhY3kgZmFsbGJhY2sgKGBleGlzdGluZ0NsYWltLmV2ZW50SWRgIHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBpcyBmb3IgY2xhaW0gZmlsZXMgd3JpdHRlbiBiZWZvcmUgdGhpcyBmaWVsZCB3YXMgYWRkZWQg4oCUXG4gICAgICAgICAgLy8gdGhvc2UgcHJvYmUgdGhlIGV2ZW50IGxvZyBkaXJlY3RseSBhbmQgZmFsbCB0aHJvdWdoIHRvIGFcbiAgICAgICAgICAvLyBmcmVzaC1ldmVudElkIHJlY292ZXJ5IHdyaXRlLiBUaGUgbGVnYWN5IHBhdGggZG9lcyBub3RcbiAgICAgICAgICAvLyBjb252ZXJnZSBhY3Jvc3Mgd29ya2VycyBidXQgY2Fubm90IHJlZ3Jlc3MgYmVoYXZpb3IgZm9yXG4gICAgICAgICAgLy8gZnJlc2hseS13cml0dGVuIGNsYWltcy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBgd2l0aEhvb2tMb2NrYCBpbi1wcm9jZXNzIG11dGV4IGFib3ZlIGtlZXBzIHR3byBzYW1lLVxuICAgICAgICAgIC8vIHRpY2sgaW4tcHJvY2VzcyBjYWxsZXJzIGZyb20gcmFjaW5nIGludG8gdGhpcyBicmFuY2ggd2l0aFxuICAgICAgICAgIC8vIHRoZSB3aW5uZXIgbWlkLXdyaXRlLCBidXQgaXMgbm90IHN1ZmZpY2llbnQgYWNyb3NzXG4gICAgICAgICAgLy8gcHJvY2Vzc2VzIOKAlCB0aGUgZHVyYWJsZSBjb252ZXJnZW5jZSBrZXkgKGBjbGFpbS5ldmVudElkYClcbiAgICAgICAgICAvLyBpcyB3aGF0IGNsb3NlcyB0aGUgY3Jvc3MtcHJvY2VzcyByYWNlLlxuICAgICAgICAgIGxldCB3cml0ZUhvb2tFbnRpdHlXaXRoT3ZlcndyaXRlID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAoIXRva2VuQ2xhaW1lZCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBleGlzdGluZ0NsYWltPy5ydW5JZCA9PT0gZWZmZWN0aXZlUnVuSWQgJiZcbiAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbS5ob29rSWQgPT09IGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEFkb3B0IGEgY2Fub25pY2FsIGV2ZW50SWQgZm9yIHRoZSByZWNvdmVyeSB3cml0ZS4gVGhlXG4gICAgICAgICAgICAgIC8vIG91dGVyIGV2ZW50IHB1Ymxpc2ggKGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYClcbiAgICAgICAgICAgICAgLy8gZWl0aGVyIHN1Y2NlZWRzICh3ZSBwdWJsaXNoIHRoZSBjYW5vbmljYWwgZXZlbnQsXG4gICAgICAgICAgICAgIC8vIHJlcGFpcmluZyBhIHBhcnRpYWwgd3JpdGUgbGVmdCBieSB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgLy8gY2xhaW1hbnQpIG9yIHJldHVybnMgYGZhbHNlYCBhbmQgd2UgdGhyb3dcbiAgICAgICAgICAgICAgLy8gYEVudGl0eUNvbmZsaWN0RXJyb3JgICh0aGUgZXZlbnQgd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAgLy8gcHVibGlzaGVkIOKAlCBhIHJlYWwgZHVwbGljYXRlKS4gRWl0aGVyIHdheSB0aGUgbG9nXG4gICAgICAgICAgICAgIC8vIGVuZHMgd2l0aCBleGFjdGx5IG9uZSBgaG9va19jcmVhdGVkYCBldmVudCBmb3IgdGhpc1xuICAgICAgICAgICAgICAvLyBgKHJ1bklkLCBob29rSWQpYC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBldmVudElkIGNvbWVzIGZyb20gb25lIG9mIHR3byBwbGFjZXM6XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vICAgLSBgZXhpc3RpbmdDbGFpbS5ldmVudElkYCBmb3IgY2xhaW1zIHdyaXR0ZW4gYnlcbiAgICAgICAgICAgICAgLy8gICAgIHRoaXMgdmVyc2lvbiAodGhlIHdyaXRlciBhYm92ZSBwZXJzaXN0cyB0aGVcbiAgICAgICAgICAgICAgLy8gICAgIGNhbmRpZGF0ZSBldmVudElkIGF0b21pY2FsbHkgd2l0aCB0aGUgY2xhaW0pLlxuICAgICAgICAgICAgICAvLyAgICAgVGhlIGV2ZW50SWQgaXMgZHVyYWJsZSwgc28gdGhlIG91dGVyXG4gICAgICAgICAgICAgIC8vICAgICBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgYWxvbmUgaXMgZW5vdWdoIHRvXG4gICAgICAgICAgICAgIC8vICAgICBhcmJpdHJhdGUgcHVibGljYXRpb246IGl0IGZhaWxzIGlmZiB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHdhcyBhbHJlYWR5IHB1Ymxpc2hlZCBhdCB0aGF0IGV4YWN0IHBhdGguXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vICAgLSBUaGUgcmVjb3ZlcnktbWFya2VyIHNpZGVjYXIgZm9yIGxlZ2FjeSBjbGFpbXNcbiAgICAgICAgICAgICAgLy8gICAgIHdyaXR0ZW4gYmVmb3JlIGBldmVudElkYCB3YXMgcGVyc2lzdGVkIGlubGluZVxuICAgICAgICAgICAgICAvLyAgICAgaW4gdGhlIGNsYWltLiBUaGUgbWFya2VyIGlzIGl0c2VsZiBhXG4gICAgICAgICAgICAgIC8vICAgICBgd3JpdGVFeGNsdXNpdmVgLCBzbyB0aGUgZmlyc3QgcmV0cnkgcGlucyBpdHNcbiAgICAgICAgICAgICAgLy8gICAgIGNhbmRpZGF0ZSBldmVudElkIGFzIGNhbm9uaWNhbCBhbmQgc3Vic2VxdWVudFxuICAgICAgICAgICAgICAvLyAgICAgcmV0cmllcyBhZG9wdCBpdC4gV2l0aG91dCB0aGlzLCB0d28gcHJvY2Vzc2VzXG4gICAgICAgICAgICAgIC8vICAgICBib3RoIHJlYWRpbmcgdGhlIHNhbWUgbGVnYWN5IGNsYWltIHdvdWxkIGVhY2hcbiAgICAgICAgICAgICAgLy8gICAgIGdlbmVyYXRlIHRoZWlyIG93biBldmVudElkLCBsYW5kIHRoZWlyXG4gICAgICAgICAgICAgIC8vICAgICBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgY2FsbHMgYXQgZGlmZmVyZW50XG4gICAgICAgICAgICAgIC8vICAgICBwYXRocywgYW5kIGFwcGVuZCB0d28gZXZlbnRzLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyAgICAgRm9yIGxlZ2FjeSBjbGFpbXMgd2UgYWxzbyBtdXN0IHByb2JlIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgbG9nIGZvciBhbiBleGlzdGluZyBgaG9va19jcmVhdGVkYCBldmVudCBCRUZPUkVcbiAgICAgICAgICAgICAgLy8gICAgIHBpbm5pbmcgYSBjYW5vbmljYWwgZXZlbnRJZDogdGhlIHByZS11cGdyYWRlXG4gICAgICAgICAgICAgIC8vICAgICB3cml0ZXIgbWF5IGhhdmUgYWxyZWFkeSBwdWJsaXNoZWQgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICB3aXRoIGl0cyBvd24gZXZlbnRJZCwgYW5kIHRoZSBtYXJrZXIgaGFzIG5vIHdheVxuICAgICAgICAgICAgICAvLyAgICAgb2Yga25vd2luZyB0aGF0IGV2ZW50SWQgYWZ0ZXIgdGhlIGZhY3QuIFdpdGhvdXRcbiAgICAgICAgICAgICAgLy8gICAgIHRoaXMgcHJvYmUsIGEgcG9zdC11cGdyYWRlIHJldHJ5IHdvdWxkIHBpbiBhXG4gICAgICAgICAgICAgIC8vICAgICBkaWZmZXJlbnQgZXZlbnRJZCwgd3JpdGUgYSBob29rIGVudGl0eSwgYW5kXG4gICAgICAgICAgICAgIC8vICAgICBwdWJsaXNoIGEgZHVwbGljYXRlIGV2ZW50IGF0IHRoZSBtYXJrZXIncyBwYXRoLlxuICAgICAgICAgICAgICBsZXQgY2Fub25pY2FsRXZlbnRJZDogc3RyaW5nO1xuICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdDbGFpbS5ldmVudElkKSB7XG4gICAgICAgICAgICAgICAgY2Fub25pY2FsRXZlbnRJZCA9IGV4aXN0aW5nQ2xhaW0uZXZlbnRJZDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbHJlYWR5UHVibGlzaGVkRXZlbnRJZCA9XG4gICAgICAgICAgICAgICAgICBhd2FpdCBmaW5kRXhpc3RpbmdIb29rQ3JlYXRlZEV2ZW50SWQoXG4gICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGFscmVhZHlQdWJsaXNoZWRFdmVudElkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGUgcHJlLXVwZ3JhZGUgd3JpdGVyIG1heSBoYXZlIGNyYXNoZWQgYmV0d2VlblxuICAgICAgICAgICAgICAgICAgLy8gaXRzIGV2ZW50IHB1Ymxpc2ggYW5kIGl0cyBob29rIGVudGl0eSB3cml0ZSDigJRcbiAgICAgICAgICAgICAgICAgIC8vIHJlcGFpciB0aGUgZW50aXR5IGZyb20gdGhlIHBlcnNpc3RlZCBldmVudCdzXG4gICAgICAgICAgICAgICAgICAvLyBwYXlsb2FkIGJlZm9yZSBzdXJmYWNpbmcgdGhlIGJlbmlnbiBkdXBsaWNhdGUuXG4gICAgICAgICAgICAgICAgICBhd2FpdCByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICAgICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICBhbHJlYWR5UHVibGlzaGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBIb29rIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGlubmVkID0gYXdhaXQgcGluQ2Fub25pY2FsRXZlbnRJZEZvckxlZ2FjeUNsYWltKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgIGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBldmVudElkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAocGlubmVkID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBMb3N0IHRoZSBtYXJrZXIgcmFjZSBhbmQgdGhlIG1hcmtlciBmaWxlIGlzXG4gICAgICAgICAgICAgICAgICAvLyB1bnJlYWRhYmxlIChleHRyZW1lbHkgcmFyZTsgY29ycnVwdGVkIGRpc2spLlxuICAgICAgICAgICAgICAgICAgLy8gVHJlYXQgYXMgYSByZWFsIGR1cGxpY2F0ZSBzbyB0aGUgcnVudGltZSdzXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoIHN3YWxsb3dzIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgaW5zdGVhZCBvZiByaXNraW5nIGRpdmVyZ2VudFxuICAgICAgICAgICAgICAgICAgLy8gcHVibGljYXRpb24uXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYW5vbmljYWxFdmVudElkID0gcGlubmVkO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVidWlsZCBgZXZlbnRgIHdpdGggdGhlIGNhbm9uaWNhbCBldmVudElkIGFuZCBhXG4gICAgICAgICAgICAgIC8vIGRldGVybWluaXN0aWMgYGNyZWF0ZWRBdGAgZGVyaXZlZCBmcm9tIHRoZSBldmVudElkXG4gICAgICAgICAgICAgIC8vIChhIFVMSUQpIHNvIHR3byB3b3JrZXJzIHdyaXRpbmcgdGhlIHNhbWUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gcHJvZHVjZSBieXRlLWlkZW50aWNhbCBjb250ZW50LlxuICAgICAgICAgICAgICBldmVudElkID0gY2Fub25pY2FsRXZlbnRJZDtcbiAgICAgICAgICAgICAgY29uc3QgY2Fub25pY2FsQ3JlYXRlZEF0ID1cbiAgICAgICAgICAgICAgICB1bGlkVG9EYXRlKGV2ZW50SWQucmVwbGFjZSgvXmV2bnRfLywgJycpKSA/PyBub3c7XG4gICAgICAgICAgICAgIGV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjYW5vbmljYWxDcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB3cml0ZUhvb2tFbnRpdHlXaXRoT3ZlcndyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIENyb3NzLWhvb2sgLyBjcm9zcy1ydW4gY29uZmxpY3Q6IGEgZGlmZmVyZW50XG4gICAgICAgICAgICAgIC8vIChydW5JZCwgaG9va0lkKSBob2xkcyB0aGlzIHRva2VuLiBDcmVhdGUgYVxuICAgICAgICAgICAgICAvLyBob29rX2NvbmZsaWN0IGV2ZW50IHNvIHRoZSB3b3JrZmxvdyBjYW4gZmFpbFxuICAgICAgICAgICAgICAvLyBncmFjZWZ1bGx5IHdoZW4gdGhlIGhvb2sgaXMgYXdhaXRlZC5cbiAgICAgICAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnaG9va19jb25mbGljdCcsXG4gICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgICAgICAgLi4uKGV4aXN0aW5nQ2xhaW1cbiAgICAgICAgICAgICAgICAgICAgPyB7IGNvbmZsaWN0aW5nUnVuSWQ6IGV4aXN0aW5nQ2xhaW0ucnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAvLyBQZXJzaXN0IGFuZCBjYWNoZSB0aGUgY29uZmxpY3QgZXZlbnQgKGNyZWF0ZS1vbmx5LFxuICAgICAgICAgICAgICAvLyBzYW1lIHBhdGggdGhlIHJlYWQgY2FjaGUga2V5cyBvbikgc28gYW4gaW1tZWRpYXRlXG4gICAgICAgICAgICAgIC8vIHJlcGxheSBjYW4gc2VydmUgaXQgd2l0aG91dCByZXJlYWRpbmcgZnJvbSBkaXNrLlxuICAgICAgICAgICAgICBhd2FpdCBzdG9yZUV2ZW50KGNvbmZsaWN0RXZlbnQpO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID1cbiAgICAgICAgICAgICAgICBwYXJhbXM/LnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRFdmVudCA9IHN0cmlwRXZlbnREYXRhUmVmcyhcbiAgICAgICAgICAgICAgICBjb25mbGljdEV2ZW50LFxuICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gUmV0dXJuIEV2ZW50UmVzdWx0IHdpdGggY29uZmxpY3QgZXZlbnQgKG5vIGhvb2sgZW50aXR5IGNyZWF0ZWQpXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IGZpbHRlcmVkRXZlbnQsXG4gICAgICAgICAgICAgICAgcnVuLFxuICAgICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgICAgaG9vazogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENvbXB1dGUgdGhlIGhvb2sgZW50aXR5IG5vdywgYnV0IGRlZmVyIGl0cyB3cml0ZSB1bnRpbFxuICAgICAgICAgIC8vIEFGVEVSIHRoZSBvdXRlciBldmVudCBwdWJsaXNoIGF0IHRoZSBib3R0b20gb2YgdGhpc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uIGNvbW1pdHMuIFRoZSByZXRyeSBwYXRoIGNhbiByZWFjaCB0aGlzIGJyYW5jaFxuICAgICAgICAgIC8vIGZvciBhIGhvb2sgd2hvc2UgYGhvb2tfY3JlYXRlZGAgZXZlbnQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBwdWJsaXNoZWQgc3VjY2Vzc2Z1bGx5IChhbiBcImFscmVhZHktY29tbWl0dGVkXG4gICAgICAgICAgLy8gZHVwbGljYXRlXCIpOyBpbiB0aGF0IGNhc2UgdGhlIG91dGVyIGB3cml0ZUV4Y2x1c2l2ZWBcbiAgICAgICAgICAvLyBmb3IgdGhlIGV2ZW50IHdpbGwgcmV0dXJuIGZhbHNlIGFuZCB3ZSB3aWxsIHRocm93XG4gICAgICAgICAgLy8gYEVudGl0eUNvbmZsaWN0RXJyb3JgLiBXcml0aW5nIHRoZSBob29rIGVudGl0eSBoZXJlXG4gICAgICAgICAgLy8gZmlyc3Qgd291bGQgbXV0YXRlIGFscmVhZHktY29tbWl0dGVkIGR1cmFibGUgc3RhdGUgd2l0aFxuICAgICAgICAgIC8vIHRoZSByZXRyeSdzIHBheWxvYWQgKGUuZy4gZGlmZmVyZW50IGBtZXRhZGF0YWAgb3JcbiAgICAgICAgICAvLyBgaXNXZWJob29rYCkgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoIHByb3ZlZCB3aGljaFxuICAgICAgICAgIC8vIG91dGNvbWUgd2UgYXJlIGluIOKAlCBsZWF2aW5nIHRoZSBlbnRpdHkgYW5kIGV2ZW50IGxvZ1xuICAgICAgICAgIC8vIGluY29uc2lzdGVudC4gQnkgZGVmZXJyaW5nLCB0aGUgZW50aXR5IGlzIG9ubHkgd3JpdHRlblxuICAgICAgICAgIC8vIHdoZW4gdGhlIHB1Ymxpc2ggYWN0dWFsbHkgc3VjY2VlZHMgKGZpcnN0IHdyaXRlciBvclxuICAgICAgICAgIC8vIG9ycGhhbiByZWNvdmVyeSkuIFNlZSBwcmFuYXlncCdzIHJldmlldyBvbiBQUiAjMjI5NSBmb3JcbiAgICAgICAgICAvLyB0aGUga2FydGhpa3NjYWxlMyByZXByby5cbiAgICAgICAgICBob29rID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgaG9va0lkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICBtZXRhZGF0YTogaG9va0RhdGEubWV0YWRhdGEsXG4gICAgICAgICAgICBvd25lcklkOiAnbG9jYWwtb3duZXInLFxuICAgICAgICAgICAgcHJvamVjdElkOiAnbG9jYWwtcHJvamVjdCcsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogJ2xvY2FsJyxcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgKHBvc3NpYmx5IGNhbm9uaWNhbCkgZXZlbnQncyBjcmVhdGVkQXQgc28gdHdvXG4gICAgICAgICAgICAvLyB3b3JrZXJzIHdyaXRpbmcgdGhlIHNhbWUgaG9vayBlbnRpdHkgcHJvZHVjZSBieXRlLVxuICAgICAgICAgICAgLy8gaWRlbnRpY2FsIGNvbnRlbnQgZHVyaW5nIGNvbnZlcmdlbmNlLlxuICAgICAgICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIGhvb2sgZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBpc1dlYmhvb2s6IGhvb2tEYXRhLmlzV2ViaG9vayA/PyBmYWxzZSxcbiAgICAgICAgICAgIGlzU3lzdGVtOiBob29rRGF0YS5pc1N5c3RlbSA/PyBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGhvb2tFbnRpdHlXcml0ZU9wdGlvbnMgPSB3cml0ZUhvb2tFbnRpdHlXaXRoT3ZlcndyaXRlXG4gICAgICAgICAgICA/IHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgICAvLyBob29rX2Rpc3Bvc2VkOiBEZWxldGVzIGhvb2sgZW50aXR5LCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBkaXNwb3NpbmcgdGhlIHNhbWUgaG9vayAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIC8vIFRoZSBsb2NrIGRvdWJsZXMgYXMgdGhlIGR1cmFibGUgZGlzcG9zYWwgbWFya2VyIGNvbnN1bHRlZCBieSB0aGVcbiAgICAgICAgICAvLyBob29rX2NyZWF0ZWQgY2xhaW0gcGF0aCBhbmQgdGhlIGV2ZW50LWxvZyByZWJ1aWxkIChzZWVcbiAgICAgICAgICAvLyBgaXNIb29rRGlzcG9zYWxDb21taXR0ZWRgKSwgd2hpY2ggaXMgd2h5IGl0IG11c3QgYmUgd3JpdHRlblxuICAgICAgICAgIC8vIGJlZm9yZSBhbnkgb2YgdGhlIGRlc3RydWN0aXZlIGRlbGV0ZXMgYmVsb3cuXG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSBob29rRGlzcG9zZUxvY2tQYXRoKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGRpc3Bvc2VkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVhZCB0aGUgaG9vayB0byBnZXQgaXRzIHRva2VuIGJlZm9yZSBkZWxldGluZ1xuICAgICAgICAgIGNvbnN0IGhvb2tQYXRoID0gdGFnZ2VkUGF0aChcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgdG9rZW4gY2xhaW0gdG8gZnJlZSB1cCB0aGUgdG9rZW4gZm9yIHJldXNlIOKAlFxuICAgICAgICAgICAgLy8gYnV0IG9ubHkgaWYgaXQgc3RpbGwgcG9pbnRzIGF0IHRoaXMgaG9vay4gQSBjbGFpbWFudCB0aGF0XG4gICAgICAgICAgICAvLyBmb3JjZS1yZWxlYXNlZCB0aGlzIGhvb2sncyBzdGFsZSBjbGFpbSAoc2VlXG4gICAgICAgICAgICAvLyBgaXNIb29rVG9rZW5DbGFpbVJlbGVhc2FibGVgKSBtYXkgYWxyZWFkeSBob2xkIGEgZnJlc2hcbiAgICAgICAgICAgIC8vIGNsYWltIGZvciB0aGUgdG9rZW47IGRlbGV0aW5nIHVuY29uZGl0aW9uYWxseSBoZXJlIHdvdWxkXG4gICAgICAgICAgICAvLyBkZXN0cm95IHRoYXQgbGl2ZSBjbGFpbSBhbmQgdHJhbnNpZW50bHkgYnJlYWsgdG9rZW5cbiAgICAgICAgICAgIC8vIHVuaXF1ZW5lc3MuIEFsc28gZGVsZXRlIHRoaXMgaG9vaydzIHJlY292ZXJ5IG1hcmtlciAoaWZcbiAgICAgICAgICAgIC8vIGFueSkgZm9yIGRpc2sgaHlnaWVuZS4gVGhlIG1hcmtlcidzIGZpbGVuYW1lIGhhc2hcbiAgICAgICAgICAgIC8vIGluY2x1ZGVzIGAodG9rZW4sIHJ1bklkLCBob29rSWQpYCBzbyBkaWZmZXJlbnRcbiAgICAgICAgICAgIC8vIGxpZmV0aW1lcyBuZXZlciBjb2xsaWRlLCBidXQgY2xlYW5pbmcgdXAgcmVkdWNlcyBkaXNrXG4gICAgICAgICAgICAvLyBsZWFrIGZvciBob29rcyB0aGF0IGdvIHRocm91Z2ggdGhlIHJlY292ZXJ5IHBhdGguXG4gICAgICAgICAgICBhd2FpdCByZWxlYXNlSG9va1Rva2VuQ2xhaW1JZk93bmVkQnkoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGV4aXN0aW5nSG9vay50b2tlbixcbiAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnJ1bklkLFxuICAgICAgICAgICAgICBleGlzdGluZ0hvb2suaG9va0lkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgaG9va1JlY292ZXJ5TWFya2VyUGF0aChcbiAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay50b2tlbixcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2sucnVuSWQsXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLmhvb2tJZFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKGhvb2tQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHdhaXRfY3JlYXRlZDogQ3JlYXRlcyB3YWl0IGVudGl0eSB3aXRoIHN0YXR1cyAnd2FpdGluZycuXG4gICAgICAgICAgLy8gQXRvbWljIGNsYWltIG9uIGEgcGVyLShydW5JZCwgY29ycmVsYXRpb25JZCkgY29uc3RyYWludCBmaWxlXG4gICAgICAgICAgLy8gZW5zdXJlcyBkdXBsaWNhdGUgd2FpdF9jcmVhdGVkIGZyb20gY29uY3VycmVudCBpbnZvY2F0aW9uc1xuICAgICAgICAgIC8vIHN1cmZhY2VzIGFzIEVudGl0eUNvbmZsaWN0RXJyb3IgKHJlcGxhY2VzIGEgcHJpb3IgVE9DVE9VXG4gICAgICAgICAgLy8gcmVhZC10aGVuLWNoZWNrIHRoYXQgY291bGQgbGV0IGJvdGggd3JpdGVycyB0aHJvdWdoKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7d2FpdENvbXBvc2l0ZUtleX0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXdhaXRDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3YWl0RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHJlc3VtZUF0PzogRGF0ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICB3YWl0SWQ6IHdhaXRDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGF0dXM6ICd3YWl0aW5nJyxcbiAgICAgICAgICAgIHJlc3VtZUF0OiB3YWl0RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZDogVHJhbnNpdGlvbnMgd2FpdCB0byAnY29tcGxldGVkJywgcmVqZWN0cyBkdXBsaWNhdGVzLlxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggY29tcGxldGluZyB0aGUgc2FtZSB3YWl0IChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3Qgd2FpdENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGNvbnN0IHdhaXRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jb21wbGV0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jb21wbGV0ZWRgO1xuICAgICAgICAgIGNvbnN0IGxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobG9ja1BhdGgsICcnKTtcbiAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY29tcGxldGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdXYWl0ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBXYWl0U2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nV2FpdCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGxvY2sgZmlsZSB3ZSBqdXN0IGNsYWltZWQg4oCUIHRoZSB3YWl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhsb2NrUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBub3QgZm91bmRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUaGUgbG9jayBmaWxlICh3cml0ZUV4Y2x1c2l2ZSBhYm92ZSkgYWxyZWFkeSBwcmV2ZW50cyBjb25jdXJyZW50XG4gICAgICAgICAgLy8gY29tcGxldGlvbnMg4oCUIG5vIGFkZGl0aW9uYWwgc3RhdHVzIGNoZWNrIG5lZWRlZC5cbiAgICAgICAgICB3YWl0ID0ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdXYWl0LFxuICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3dhaXRzJywgd2FpdENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBob29rX3JlY2VpdmVkIGV2ZW50cyBhcmUgc3RvcmVkIGluIHRoZSBldmVudCBsb2cgYnV0IGRvbid0XG4gICAgICAgIC8vIG1vZGlmeSB0aGUgSG9vayBlbnRpdHkgKHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIHBheWxvYWQgZmllbGQpXG5cbiAgICAgICAgLy8gU3RvcmUgZXZlbnQgdXNpbmcgY29tcG9zaXRlIGtleSB7cnVuSWR9LXtldmVudElkfS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYHdyaXRlRXhjbHVzaXZlYCAoT19DUkVBVHxPX0VYQ0wgdmlhIHRlbXAtZmlsZSArIGhhcmQtbGluaylcbiAgICAgICAgLy8gaXMgdGhlIGNyb3NzLXByb2Nlc3MgYXRvbWljIHB1Ymxpc2ggcHJpbWl0aXZlOiBpZiB0aGUgZmlsZVxuICAgICAgICAvLyBhbHJlYWR5IGV4aXN0cywgcmV0dXJucyBmYWxzZSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nLiBUaGlzXG4gICAgICAgIC8vIGlzIGNyaXRpY2FsIGZvciB0aGUgaG9va19jcmVhdGVkIGRlZHVwLXJlY292ZXJ5IGNvbnZlcmdlbmNlXG4gICAgICAgIC8vIChhYm92ZSkg4oCUIHR3byB3b3JrZXJzIHRoYXQgYWRvcHQgdGhlIHNhbWUgY2Fub25pY2FsIGV2ZW50SWRcbiAgICAgICAgLy8gcmFjZSBoZXJlOyB3aG9ldmVyIGxpbmtzIHRoZSBmaWxlIGZpcnN0IHdpbnMsIHRoZSBsb3NlclxuICAgICAgICAvLyB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvciwgYW5kIHRoZSBydW50aW1lJ3MgZXhpc3RpbmdcbiAgICAgICAgLy8gY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBhdCBzdXNwZW5zaW9uLWhhbmRsZXIudHM6MTQyXG4gICAgICAgIC8vIHN3YWxsb3dzIGl0LiBGb3IgYWxsIG90aGVyIGV2ZW50IHR5cGVzLCBldmVudElkcyBhcmVcbiAgICAgICAgLy8gbW9ub3RvbmljIFVMSURzIChnbG9iYWxseSB1bmlxdWUgYnkgY29uc3RydWN0aW9uKSBzbyBhXG4gICAgICAgIC8vIGNvbGxpc2lvbiBpbmRpY2F0ZXMgYSByZWFsIGJ1ZyBhbmQgRW50aXR5Q29uZmxpY3RFcnJvciBpc1xuICAgICAgICAvLyBhbHNvIHRoZSByaWdodCBzdXJmYWNlIOKAlCBzYW1lIHNoYXBlIGFzIHN0ZXBfY3JlYXRlZCdzXG4gICAgICAgIC8vIGNsYWltLWZpbGUgYmVoYXZpb3IuXG4gICAgICAgIC8vIExhc3QtaW5zdGFudCByZS12YWxpZGF0aW9uIGZvciBgaG9va19yZWNlaXZlZGAgKHNlZSB0aGUgYWNjZXB0YW5jZVxuICAgICAgICAvLyBjaGVjayBhYm92ZSkuIFRoZSBwZXItaG9vayBpbi1wcm9jZXNzIGxvY2sgYWxyZWFkeSBzZXJpYWxpemVzXG4gICAgICAgIC8vIHJlc3VtZSB2cy4gZGlzcG9zZSB3aXRoaW4gb25lIHN0b3JhZ2UgaW5zdGFuY2U7IHRoaXMgc2Vjb25kIGNoZWNrXG4gICAgICAgIC8vIG5hcnJvd3MgdGhlIGNyb3NzLWluc3RhbmNlIHdpbmRvdyAoaW5kZXBlbmRlbnQgbG9jayBtYXBzLCBzaGFyZWRcbiAgICAgICAgLy8gZmlsZXN5c3RlbSkgdG8gdGhlIHNpbmdsZSBldmVudCB3cml0ZSBiZWxvdywgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIG1vZHVsZSdzIGNvbnZlbnRpb24gdGhhdCB0aGUgb24tZGlzayBsb2NrIGZpbGUg4oCUIG5vdCB0aGVcbiAgICAgICAgLy8gaW4tcHJvY2VzcyBtdXRleCDigJQgaXMgdGhlIGR1cmFibGUgc291cmNlIG9mIHRydXRoLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCAmJlxuICAgICAgICAgIChhd2FpdCBpc0hvb2tEaXNwb3NhbENvbW1pdHRlZChiYXNlZGlyLCBkYXRhLmNvcnJlbGF0aW9uSWQsIHRhZykpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICBjb25zdCBldmVudFBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjb21wb3NpdGVLZXksIHRhZyk7XG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBiZWZvcmUgdGhlIHdyaXRlJ3MgYGF3YWl0YCBzbyB0aGVcbiAgICAgICAgLy8gY2FjaGVkIHNuYXBzaG90IGNhbid0IG9ic2VydmUgYSBsYXRlciBtdXRhdGlvbiAoc2VlXG4gICAgICAgIC8vIHJlbWVtYmVyU3RvcmVkRXZlbnQpLlxuICAgICAgICBjb25zdCBzZXJpYWxpemVkRXZlbnQgPSBKU09OLnN0cmluZ2lmeShldmVudCwganNvblJlcGxhY2VyLCAyKTtcbiAgICAgICAgY29uc3QgZXZlbnRQdWJsaXNoZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG4gICAgICAgIGlmICghZXZlbnRQdWJsaXNoZWQpIHtcbiAgICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIGxvc2luZyB0aGUgZXZlbnQgcHVibGlzaCBtZWFucyB0aGVcbiAgICAgICAgICAvLyBldmVudCB3YXMgYWxyZWFkeSBjb21taXR0ZWQgYXQgdGhpcyBleGFjdCAoY2Fub25pY2FsKVxuICAgICAgICAgIC8vIHBhdGguIFRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgLy8gaXRzIGV2ZW50IHB1Ymxpc2ggYW5kIGl0cyBkZWZlcnJlZCBob29rLWVudGl0eSB3cml0ZVxuICAgICAgICAgIC8vICh0aGUgaW52ZXJzZSBvZiB0aGUgY3Jhc2ggd2luZG93IHRoZSBkZWZlcnJhbCBjbG9zZXMpLFxuICAgICAgICAgIC8vIGxlYXZpbmcgYW4gZXZlbnQtZmlyc3Qgb3JwaGFuOiB0aGUgZXZlbnQgaXMgaW4gdGhlIGxvZ1xuICAgICAgICAgIC8vIGJ1dCB0aGUgZW50aXR5IGlzIG1pc3NpbmcgYW5kIHRoZSBob29rIGlzIHVucmVzb2x2YWJsZS5cbiAgICAgICAgICAvLyBSZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBQRVJTSVNURUQgZXZlbnQncyBwYXlsb2FkXG4gICAgICAgICAgLy8gKG5ldmVyIHRoZSByZXRyeSdzIOKAlCBkaWZmZXJlbnQgcmV0cnkgbWV0YWRhdGEgbXVzdCBub3RcbiAgICAgICAgICAvLyBjaGFuZ2UgY29tbWl0dGVkIHN0YXRlKSBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ25cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgdG8gdGhlIHJ1bnRpbWUncyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICBhd2FpdCByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IFwiJHtldmVudElkfVwiIGFscmVhZHkgZXhpc3RzIGZvciBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZXZlbnQgaXMgbm93IGNvbW1pdHRlZDsgY2FjaGUgaXQgc28gYW4gaW1tZWRpYXRlIHNlcXVlbnRpYWxcbiAgICAgICAgLy8gcmVwbGF5IGNhbiBzZXJ2ZSBpdCB3aXRob3V0IHJlcmVhZGluZyBmcm9tIGRpc2suXG4gICAgICAgIHJlbWVtYmVyU3RvcmVkRXZlbnQoZXZlbnQsIGV2ZW50UGF0aCwgc2VyaWFsaXplZEV2ZW50KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaG9vayBlbnRpdHkgT05MWSBub3cgdGhhdCB0aGUgZXZlbnQgcHVibGlzaCBoYXNcbiAgICAgICAgLy8gY29tbWl0dGVkLiBEb2luZyB0aGlzIGVhcmxpZXIgKGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBicmFuY2ggYWJvdmUpIHdvdWxkIG11dGF0ZSBhbiBhbHJlYWR5LWNvbW1pdHRlZCBob29rXG4gICAgICAgIC8vIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoXG4gICAgICAgIC8vIHByb3ZlZCB3aGV0aGVyIHRoaXMgYXR0ZW1wdCB3YXMgcmVwYWlyaW5nIGEgbWlzc2luZyBldmVudFxuICAgICAgICAvLyBvciBqdXN0IGNvbGxpZGluZyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgLlxuICAgICAgICAvLyBUaGUgYnJhbmNoIHNldHMgYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGlmZiB0aGlzIGV2ZW50XG4gICAgICAgIC8vIHR5cGUgd3JpdGVzIGFuIGVudGl0eS5cbiAgICAgICAgaWYgKGhvb2sgJiYgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rLmhvb2tJZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgICAgICBmaWxlUHJlZml4OiBgJHtlZmZlY3RpdmVSdW5JZH0tYCxcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgICAgICBnZXRJZDogKGUpID0+IGUuZXZlbnRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudHMgPSBhbGxFdmVudHMuZGF0YTtcbiAgICAgICAgICBjdXJzb3IgPSBhbGxFdmVudHMuY3Vyc29yO1xuICAgICAgICAgIGhhc01vcmUgPSBhbGxFdmVudHMuaGFzTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IG9uIGEgc3RlcC10ZXJtaW5hbCB3cml0ZSB0aGUgaW5saW5lXG4gICAgICAgIC8vIHJ1bnRpbWUgbG9vcCBjYW4gcGFzcyBgc2luY2VDdXJzb3JgICh0aGUgY3Vyc29yIGZyb20gYmVmb3JlIGl0XG4gICAgICAgIC8vIGJlZ2FuIHdyaXRpbmcgdGhpcyBzdGVwJ3MgZXZlbnRzKS4gV2UgcmV0dXJuIHRoZSBkZWx0YSBvZlxuICAgICAgICAvLyBldmVudHMgd3JpdHRlbiBzdHJpY3RseSBhZnRlciB0aGF0IGN1cnNvciDigJQgZXhhY3RseSB3aGF0IGFuXG4gICAgICAgIC8vIGBldmVudHMubGlzdCh7IGN1cnNvcjogc2luY2VDdXJzb3IsIHNvcnRPcmRlcjogJ2FzYycgfSlgIHdvdWxkXG4gICAgICAgIC8vIHJldHVybiByaWdodCBub3cg4oCUIHNvIHRoZSBsb29wIGNhbiBza2lwIGEgcmVkdW5kYW50IHJvdW5kLXRyaXAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgaXMgY29tcHV0ZWQgYWdhaW5zdCB0aGUgc2FtZSBvbi1kaXNrIGxvZyB0aGUgbGlzdCBwYXRoXG4gICAgICAgIC8vIHJlYWRzLCBzbyBpdCBjYXB0dXJlcyBldmVyeXRoaW5nIHRoZSBmZXRjaCB3b3VsZDogdGhpcyBzdGVwJ3NcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkL3N0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZCwgYW55IGF0dHJfc2V0IHRoZSBzdGVwXG4gICAgICAgIC8vIGJvZHkgd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZSBjdXJzb3IuIFRoYXRcbiAgICAgICAgLy8gZXF1aXZhbGVuY2UgaXMgd2hhdCBtYWtlcyBza2lwcGluZyB0aGUgZmV0Y2ggc2FmZSDigJQgYSBtaXNzZWRcbiAgICAgICAgLy8gaW4tYmFuZCBldmVudCBjYW5ub3QgZGl2ZXJnZSByZXBsYXkgYmVjYXVzZSB0aGUgZGVsdGEgaXMgdGhlXG4gICAgICAgIC8vIGZldGNoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbmx5IHN0ZXAtdGVybWluYWwgZXZlbnRzIHF1YWxpZnk6IHN0ZXBfY3JlYXRlZC9zdGVwX3N0YXJ0ZWQgYXJlXG4gICAgICAgIC8vIG5vdCBsb29wIGJvdW5kYXJpZXMgKHRoZSBsb29wIGZldGNoZXMgYWZ0ZXIgc3RlcF9jb21wbGV0ZWQgL1xuICAgICAgICAvLyBzdGVwX2ZhaWxlZCksIGFuZCBydW4tdGVybWluYWwgZXZlbnRzIGVuZCB0aGUgbG9vcC4gYHJlc29sdmVEYXRhYFxuICAgICAgICAvLyBtYXRjaGVzIHRoZSBsaXN0IHBhdGggc28gZXZlbnREYXRhIHJlZnMgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnKSAmJlxuICAgICAgICAgIHR5cGVvZiBwYXJhbXM/LnNpbmNlQ3Vyc29yID09PSAnc3RyaW5nJ1xuICAgICAgICApIHtcbiAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vIGBsaW1pdGA6IHRoaXMgcmV0dXJucyBhIHNpbmdsZSBkZWZhdWx0LXNpemUgcGFnZSxcbiAgICAgICAgICAvLyB1bmxpa2UgdGhlIGBldmVudHMubGlzdGAgcGF0aCB3aGljaCBsb29wcyBgd2hpbGUgKGhhc01vcmUpYCB0b1xuICAgICAgICAgIC8vIGV4aGF1c3Rpb24uIFRoYXQgaXMgc2FmZSDigJQgYW5kIG11c3QgTk9UIGJlIFwiZml4ZWRcIiBieSBwYWdpbmF0aW5nXG4gICAgICAgICAgLy8gaGVyZSDigJQgYmVjYXVzZSB0aGUgY29udHJhY3QgaXMgc2luZ2xlLXBhZ2Utb3ItZmFsbGJhY2ssIG5vdFxuICAgICAgICAgIC8vIGNvbXBsZXRlLWRlbHRhLiBXaGVuIHRoZSBkZWx0YSBvdmVyZmxvd3Mgb25lIHBhZ2UsXG4gICAgICAgICAgLy8gcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5IHNldHMgYGhhc01vcmU6IHRydWVgIGFuZCBzbGljZXMgYGRhdGFgIHRvXG4gICAgICAgICAgLy8gdGhlIHBhZ2UgKHNlZSBmcy50cyksIHdoaWNoIHdlIGZvcndhcmQgdmVyYmF0aW0gYmVsb3cuIFRoZSBTREtcbiAgICAgICAgICAvLyBjb25zdW1lIHNpZGUgKHJ1bnRpbWUudHMpIG9ubHkgc3Rhc2hlcyB0aGUgZGVsdGEgd2hlbiBgIWhhc01vcmVgXG4gICAgICAgICAgLy8gYW5kIG90aGVyd2lzZSBmYWxscyBiYWNrIHRvIHRoZSBleGhhdXN0aXZlIGBldmVudHMubGlzdGAgbG9vcCwgc28gYVxuICAgICAgICAgIC8vIHRydW5jYXRlZCBwYWdlIGlzIG5ldmVyIGNvbnN1bWVkIGFzIGlmIGl0IHdlcmUgdGhlIGZ1bGwgZGVsdGEuXG4gICAgICAgICAgY29uc3QgZGVsdGEgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgICAgIGZpbGVQcmVmaXg6IGAke2VmZmVjdGl2ZVJ1bklkfS1gLFxuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGN1cnNvcjogcGFyYW1zLnNpbmNlQ3Vyc29yLFxuICAgICAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgICAgIGdldElkOiAoZSkgPT4gZS5ldmVudElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cyA9XG4gICAgICAgICAgICByZXNvbHZlRGF0YSA9PT0gJ25vbmUnXG4gICAgICAgICAgICAgID8gZGVsdGEuZGF0YS5tYXAoKGUpID0+IHN0cmlwRXZlbnREYXRhUmVmcyhlLCByZXNvbHZlRGF0YSkpXG4gICAgICAgICAgICAgIDogZGVsdGEuZGF0YTtcbiAgICAgICAgICBjdXJzb3IgPSBkZWx0YS5jdXJzb3I7XG4gICAgICAgICAgaGFzTW9yZSA9IGRlbHRhLmhhc01vcmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBldmVudCBhbmQgYW55IGNyZWF0ZWQvdXBkYXRlZCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICAgIC4uLihzdGVwQ3JlYXRlZExhemlseSA/IHsgc3RlcENyZWF0ZWQ6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gZW5kIGNyZWF0ZUltcGxcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0KHJ1bklkLCBldmVudElkLCBwYXJhbXMpIHtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2V2ZW50SWQnLCBldmVudElkKTtcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgIGJhc2VkaXIsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICBjb21wb3NpdGVLZXksXG4gICAgICAgIEV2ZW50U2NoZW1hLFxuICAgICAgICB0YWdcbiAgICAgICk7XG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXZlbnQgJHtldmVudElkfSBpbiBydW4gJHtydW5JZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgcmV0dXJuIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpO1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0KHBhcmFtcykge1xuICAgICAgY29uc3QgeyBydW5JZCB9ID0gcGFyYW1zO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zLnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgIGZpbGVQcmVmaXg6IGAke3J1bklkfS1gLFxuICAgICAgICAvLyBFdmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlciAob2xkZXN0IGZpcnN0KSBieSBkZWZhdWx0LFxuICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBmb3Igb3RoZXIgbGlzdCBjYWxscy5cbiAgICAgICAgc29ydE9yZGVyOiBwYXJhbXMucGFnaW5hdGlvbj8uc29ydE9yZGVyID8/ICdhc2MnLFxuICAgICAgICBsaW1pdDogcGFyYW1zLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICBjdXJzb3I6IHBhcmFtcy5wYWdpbmF0aW9uPy5jdXJzb3IsXG4gICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgcmVzb2x2ZURhdGEgaXMgXCJub25lXCIsIHJlbW92ZSBldmVudERhdGEgZnJvbSBldmVudHNcbiAgICAgIGlmIChyZXNvbHZlRGF0YSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZXZlbnQpID0+XG4gICAgICAgICAgICBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3RCeUNvcnJlbGF0aW9uSWQocGFyYW1zKSB7XG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcGFyYW1zLmNvcnJlbGF0aW9uSWQ7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2NvcnJlbGF0aW9uSWQnLCBjb3JyZWxhdGlvbklkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zLnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|