@workflow/world-local 5.0.0-beta.24 → 5.0.0-beta.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +26 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -1
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +15 -1
- package/dist/storage/helpers.d.ts.map +1 -1
- package/dist/storage/helpers.js +23 -20
- package/dist/storage/hook-index.d.ts +50 -0
- package/dist/storage/hook-index.d.ts.map +1 -0
- package/dist/storage/hook-index.js +259 -0
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +80 -74
- package/dist/storage/runs-storage.d.ts.map +1 -1
- package/dist/storage/runs-storage.js +6 -3
- package/package.json +2 -2
|
@@ -7,6 +7,7 @@ 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
9
|
import { getObjectCreatedAt, hookDisposeLockPath, hookRecoveryMarkerPath, hookTokenClaimPath, isHookDisposalCommitted, monotonicUlid, releaseHookTokenClaimIfOwnedBy, } from './helpers.js';
|
|
10
|
+
import { deleteHookByRunMarker, writeHookByRunMarker, writeHookCreatedIndexEntries, } from './hook-index.js';
|
|
10
11
|
import { deleteAllHooksForRun, rebuildLiveHookByTokenFromEventLog, } from './hooks-storage.js';
|
|
11
12
|
import { handleLegacyEvent } from './legacy.js';
|
|
12
13
|
import { withRunFileLock } from './runs-storage.js';
|
|
@@ -200,6 +201,10 @@ async function repairHookEntityFromPersistedEvent(basedir, runId, hookId, persis
|
|
|
200
201
|
isWebhook: eventData.isWebhook ?? true,
|
|
201
202
|
isSystem: eventData.isSystem ?? false,
|
|
202
203
|
};
|
|
204
|
+
// This path can repair events published by pre-index writers, so
|
|
205
|
+
// (idempotently) index the persisted event before the entity write.
|
|
206
|
+
await writeHookCreatedIndexEntries(basedir, eventData.token, runId, hookId, persistedEventId, tag);
|
|
207
|
+
await writeHookByRunMarker(basedir, runId, hookId, tag);
|
|
203
208
|
await writeExclusive(taggedPath(basedir, 'hooks', hookId, tag), JSON.stringify(hook, jsonReplacer, 2));
|
|
204
209
|
}
|
|
205
210
|
/**
|
|
@@ -1457,6 +1462,11 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1457
1462
|
hookEntityWriteOptions = writeHookEntityWithOverwrite
|
|
1458
1463
|
? { overwrite: true }
|
|
1459
1464
|
: undefined;
|
|
1465
|
+
// Index entries before the event publish (see hook-index.ts
|
|
1466
|
+
// crash-ordering invariant). `eventId` is final here — the
|
|
1467
|
+
// dedup-recovery branch above already reassigned it to the
|
|
1468
|
+
// canonical id when applicable.
|
|
1469
|
+
await writeHookCreatedIndexEntries(basedir, hookData.token, effectiveRunId, data.correlationId, eventId, tag);
|
|
1460
1470
|
}
|
|
1461
1471
|
else if (data.eventType === 'hook_disposed') {
|
|
1462
1472
|
// hook_disposed: Deletes hook entity, rejects duplicates.
|
|
@@ -1490,6 +1500,7 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1490
1500
|
await deleteJSON(hookRecoveryMarkerPath(basedir, existingHook.token, existingHook.runId, existingHook.hookId));
|
|
1491
1501
|
}
|
|
1492
1502
|
await deleteJSON(hookPath);
|
|
1503
|
+
await deleteHookByRunMarker(basedir, effectiveRunId, data.correlationId, tag);
|
|
1493
1504
|
}
|
|
1494
1505
|
else if (data.eventType === 'wait_created' && 'eventData' in data) {
|
|
1495
1506
|
// wait_created: Creates wait entity with status 'waiting'.
|
|
@@ -1613,6 +1624,9 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1613
1624
|
// The branch sets `hookEntityWriteOptions` iff this event
|
|
1614
1625
|
// type writes an entity.
|
|
1615
1626
|
if (hook && data.eventType === 'hook_created') {
|
|
1627
|
+
// Marker before entity (see hook-index.ts crash-ordering
|
|
1628
|
+
// invariant).
|
|
1629
|
+
await writeHookByRunMarker(basedir, hook.runId, hook.hookId, tag);
|
|
1616
1630
|
await writeJSON(taggedPath(basedir, 'hooks', hook.hookId, tag), hook, hookEntityWriteOptions);
|
|
1617
1631
|
}
|
|
1618
1632
|
const resolveData = params?.resolveData ?? DEFAULT_RESOLVE_DATA_OPTION;
|
|
@@ -1766,4 +1780,4 @@ export function createEventsStorage(basedir, tag) {
|
|
|
1766
1780
|
},
|
|
1767
1781
|
};
|
|
1768
1782
|
}
|
|
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=
|
|
1783
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsYUFBYSxFQUNiLHdCQUF3QixFQUN4QixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsS0FBSyxFQUNMLGNBQWMsRUFDZCxTQUFTLEdBQ1YsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVB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QUEyQixDQUFDO1lBQ3RFLE1BQU0sTUFBTSxHQUFHLE1BQU0sd0JBQXdCLENBQUM7Z0JBQzVDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7Z0JBQ3ZDLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsb0NBQW9DO2dCQUNwQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssYUFBYTtnQkFDeEQsMkRBQTJEO2dCQUMzRCxtREFBbUQ7Z0JBQ25ELFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxLQUFLO2dCQUNoRCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLO2dCQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNO2dCQUNqQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxDQUFDO2dCQUN4QyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPO2FBQ2hDLENBQUMsQ0FBQztZQUVILHlEQUF5RDtZQUN6RCxJQUFJLFdBQVcsS0FBSyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsT0FBTztvQkFDTCxHQUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDOUIsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUN2QztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBSdW5Ob3RTdXBwb3J0ZWRFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhvb2ssXG4gIFNlcmlhbGl6ZWREYXRhLFxuICBTdGVwLFxuICBTdG9yYWdlLFxuICBXYWl0LFxuICBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGFwcGx5QXR0cmlidXRlQ2hhbmdlcyxcbiAgRXZlbnRTY2hlbWEsXG4gIEhvb2tTY2hlbWEsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzVGVybWluYWxSdW5FdmVudFR5cGUsXG4gIGlzVGVybWluYWxTdGVwU3RhdHVzLFxuICBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMsXG4gIHJlcXVpcmVzTmV3ZXJXb3JsZCxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFN0ZXBTY2hlbWEsXG4gIHVsaWRUb0RhdGUsXG4gIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyxcbiAgdmFsaWRhdGVVbGlkVGltZXN0YW1wLFxuICBXYWl0U2NoZW1hLFxuICBXb3JrZmxvd1J1blNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OIH0gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCxcbiAgZGVsZXRlSlNPTixcbiAganNvblJlcGxhY2VyLFxuICBqc29uUmV2aXZlcixcbiAgbGlzdEpTT05GaWxlcyxcbiAgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5LFxuICByZWFkSlNPTixcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHJlc29sdmVXaXRoaW5CYXNlLFxuICB0YWdnZWRQYXRoLFxuICB3cml0ZSxcbiAgd3JpdGVFeGNsdXNpdmUsXG4gIHdyaXRlSlNPTixcbn0gZnJvbSAnLi4vZnMuanMnO1xuaW1wb3J0IHsgc3RyaXBFdmVudERhdGFSZWZzIH0gZnJvbSAnLi9maWx0ZXJzLmpzJztcbmltcG9ydCB7XG4gIGdldE9iamVjdENyZWF0ZWRBdCxcbiAgaG9va0Rpc3Bvc2VMb2NrUGF0aCxcbiAgaG9va1JlY292ZXJ5TWFya2VyUGF0aCxcbiAgaG9va1Rva2VuQ2xhaW1QYXRoLFxuICBpc0hvb2tEaXNwb3NhbENvbW1pdHRlZCxcbiAgbW9ub3RvbmljVWxpZCxcbiAgcmVsZWFzZUhvb2tUb2tlbkNsYWltSWZPd25lZEJ5LFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlSG9va0J5UnVuTWFya2VyLFxuICB3cml0ZUhvb2tCeVJ1bk1hcmtlcixcbiAgd3JpdGVIb29rQ3JlYXRlZEluZGV4RW50cmllcyxcbn0gZnJvbSAnLi9ob29rLWluZGV4LmpzJztcbmltcG9ydCB7XG4gIGRlbGV0ZUFsbEhvb2tzRm9yUnVuLFxuICByZWJ1aWxkTGl2ZUhvb2tCeVRva2VuRnJvbUV2ZW50TG9nLFxufSBmcm9tICcuL2hvb2tzLXN0b3JhZ2UuanMnO1xuaW1wb3J0IHsgaGFuZGxlTGVnYWN5RXZlbnQgfSBmcm9tICcuL2xlZ2FjeS5qcyc7XG5pbXBvcnQgeyB3aXRoUnVuRmlsZUxvY2sgfSBmcm9tICcuL3J1bnMtc3RvcmFnZS5qcyc7XG5cbi8qKlxuICogUGVyLXN0ZXAgaW4tcHJvY2VzcyBhc3luYyBtdXRleC4gU2VyaWFsaXplcyBjb25jdXJyZW50IGBldmVudHMuY3JlYXRlYCBjYWxsc1xuICogdGhhdCB0YXJnZXQgdGhlIHNhbWUgc3RlcCwgc28gdGhhdCB0aGUgXCJjaGVjayB0ZXJtaW5hbCBzdGF0ZSwgdGhlbiB3cml0ZSBzdGVwXG4gKiBlbnRpdHkgKyBldmVudFwiIHNlcXVlbmNlIGlzIGF0b21pYy4gV2l0aG91dCB0aGlzLCB0d28gY29uY3VycmVudCBzdGVwX3N0YXJ0ZWRcbiAqIGNhbGxzIGNhbiBib3RoIHBhc3MgdGhlIG5vdC10ZXJtaW5hbCBjaGVjayBhbmQgYm90aCB3cml0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzXG4gKiDigJQgb3IgYSBzdGVwX3N0YXJ0ZWQgY2FuIGxhbmQgaW4gdGhlIGxvZyBhZnRlciBzdGVwX2NvbXBsZXRlZCBoYXMgYWxyZWFkeVxuICogd3JpdHRlbiwgcHJvZHVjaW5nIHVuY29uc3VtZWQgZXZlbnRzIG9uIHJlcGxheS5cbiAqXG4gKiBEdXBsaWNhdGUgc3RlcF9zdGFydGVkIGV2ZW50cyBmb3IgYSBub24tdGVybWluYWwgc3RlcCBhcmUgc3RpbGwgYWxsb3dlZFxuICogKHJldHJpZXMgbGVnaXRpbWF0ZWx5IHJlLXN0YXJ0IGEgc3RlcCksIG9ubHkgd3JpdGVzIHRvIGFuIGFscmVhZHktdGVybWluYWxcbiAqIHN0ZXAgYXJlIHJlamVjdGVkLlxuICovXG4vLyBgc3RlcExvY2tzYCBhbmQgYGhvb2tMb2Nrc2AgYXJlIG5vdyBpbnN0YW50aWF0ZWQgcGVyXG4vLyBgY3JlYXRlRXZlbnRzU3RvcmFnZWAgY2FsbCAoc2VlIGluc2lkZSB0aGUgZnVuY3Rpb24pIHJhdGhlciB0aGFuXG4vLyBiZWluZyBtb2R1bGUtbGV2ZWwuIFRoZSBvbi1kaXNrIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyByZW1haW5cbi8vIHRoZSBkdXJhYmxlIHNvdXJjZSBvZiB0cnV0aCBhY3Jvc3MgcHJvY2Vzc2VzOyB0aGUgaW4tcHJvY2Vzc1xuLy8gbXV0ZXggaXMgYSBwZXItaW5zdGFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgY2xvc2VzIGEgc2hvcnQgcmFjZVxuLy8gd2luZG93IGluIHRoZSBkZWR1cC1yZWNvdmVyeSBwYXRoLiBQZXItaW5zdGFuY2Ugc2NvcGluZyBsZXRzXG4vLyB0ZXN0cyBzaW11bGF0ZSBjcm9zcy1wcm9jZXNzIGJlaGF2aW9yIHdpdGggdHdvIHN0b3JhZ2UgaW5zdGFuY2VzXG4vLyBzaGFyaW5nIG9uZSBkYXRhIGRpcmVjdG9yeSAoZWFjaCBpbnN0YW5jZSBoYXMgaW5kZXBlbmRlbnQgbG9ja3Ncbi8vIGJ1dCBhIHNoYXJlZCBmaWxlc3lzdGVtKSwgZXhhY3RseSBtYXRjaGluZyB0aGUgY3Jvc3MtcHJvY2Vzc1xuLy8gc2VtYW50aWNzIHdpdGhvdXQgc3Bhd25pbmcgc3VicHJvY2Vzc2VzLlxuXG5jb25zdCBIb29rVG9rZW5DbGFpbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gVGhlIHRva2VuLWNsYWltIHdyaXRlciBiZWxvdyBoYXMgYWx3YXlzIHBlcnNpc3RlZCBgaG9va0lkYCwgYnV0XG4gIC8vIHRoaXMgcmVhZCBzY2hlbWEgcHJldmlvdXNseSBvbWl0dGVkIGl0LCB3aGljaCBpcyB0aGUgYnVnIGZpeGVkXG4gIC8vIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvaXNzdWVzLzIyODMuIGBvcHRpb25hbCgpYFxuICAvLyBpcyBkZWZlbnNpdmU6IGFueSBjbGFpbSBmaWxlIHRoYXQgc29tZWhvdyBsYWNrcyB0aGUgZmllbGQgc3RpbGxcbiAgLy8gcGFyc2VzICh5aWVsZGluZyBgdW5kZWZpbmVkYCkgYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGNyb3NzLVxuICAvLyBob29rIGNvbmZsaWN0IGJyYW5jaCwgbWF0Y2hpbmcgcHJlLWZpeCBiZWhhdmlvci5cbiAgaG9va0lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHJ1bklkOiB6LnN0cmluZygpLFxuICAvLyBgZXZlbnRJZGAgaXMgdGhlIGNhbm9uaWNhbCBob29rX2NyZWF0ZWQgZXZlbnQgSUQgdGhlIGNsYWltaW5nXG4gIC8vIHdvcmtlciBjb21taXR0ZWQgdG8gcHVibGlzaGluZy4gUGVyc2lzdGluZyBpdCBoZXJlIHR1cm5zIHRoZVxuICAvLyBjbGFpbSBmaWxlIGludG8gYSBkdXJhYmxlIGNvbnZlcmdlbmNlIGtleSBmb3IgY3Jvc3Mtd29ya2VyIC9cbiAgLy8gY3Jvc3MtcHJvY2VzcyByZXRyaWVzIChzZWUgY29tbWVudCBvbiB0aGUgaG9va19jcmVhdGVkIGJyYW5jaCkuXG4gIC8vIGBvcHRpb25hbCgpYCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eTogYSBsZWdhY3kgY2xhaW0gZmlsZVxuICAvLyB3cml0dGVuIGJlZm9yZSB0aGlzIGZpZWxkIGV4aXN0ZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgcmVjb3ZlcnktXG4gIC8vIG1hcmtlciB1cGdyYWRlIHBhdGgsIHdoaWNoIGF0b21pY2FsbHkgcGlucyBhIGNhbm9uaWNhbCBldmVudElkXG4gIC8vIHZpYSBhIHNpZGVjYXIgbWFya2VyIChhbHNvIGEgYHdyaXRlRXhjbHVzaXZlYCkuXG4gIGV2ZW50SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFNpZGVjYXIgcmVjb3ZlcnkgbWFya2VyIHRoYXQgcGlucyBhIGNhbm9uaWNhbCBgaG9va19jcmVhdGVkYFxuICogZXZlbnRJZCBmb3IgYSBsZWdhY3kgdG9rZW4gY2xhaW0g4oCUIG9uZSB3cml0dGVuIGJ5IGEgdmVyc2lvbiBvZlxuICogdGhpcyBzdG9yYWdlIHRoYXQgZGlkIG5vdCB5ZXQgcGVyc2lzdCBgZXZlbnRJZGAgaW5saW5lIGluIHRoZVxuICogY2xhaW0gZmlsZS4gV2l0aG91dCB0aGlzIG1hcmtlciwgdHdvIGNyb3NzLXByb2Nlc3MgcmV0cmllc1xuICogcmVhZGluZyBhIGxlZ2FjeSBjbGFpbSBlYWNoIGdlbmVyYXRlIHRoZWlyIG93biBldmVudElkLCBsYW5kXG4gKiB0aGVpciBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgY2FsbHMgYXQgZGlmZmVyZW50IHBhdGhzLCBhbmRcbiAqIGFwcGVuZCB0d28gYGhvb2tfY3JlYXRlZGAgZXZlbnRzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYC5cbiAqXG4gKiBUaGUgbWFya2VyIGlzIHdyaXR0ZW4gdmlhIGB3cml0ZUV4Y2x1c2l2ZWAg4oCUIHRoZSBmaXJzdCByZXRyeSB0b1xuICogbGFuZCBpdCBwaW5zIGl0cyBjYW5kaWRhdGUgZXZlbnRJZCBhcyBjYW5vbmljYWwsIGFuZCBldmVyeVxuICogc3Vic2VxdWVudCByZXRyeSByZWFkcyBhbmQgYWRvcHRzIHRoYXQgZXZlbnRJZCBiZWZvcmUgdGhlIGNvbW1vblxuICogZXZlbnQgcHVibGlzaC4gU2NoZW1hIGlzIGp1c3QgYHsgZXZlbnRJZCB9YCBiZWNhdXNlIGlkZW50aXR5IGlzXG4gKiBhbHJlYWR5IGVuY29kZWQgaW4gdGhlIG1hcmtlcidzIGZpbGVuYW1lIGhhc2gsIHNvIGRpZmZlcmVudCB0b2tlblxuICogbGlmZXRpbWVzIGNhbiBuZXZlciBzaGFyZSBvbmUgbWFya2VyIChzZWVcbiAqIGBob29rUmVjb3ZlcnlNYXJrZXJQYXRoYCkuXG4gKi9cbmNvbnN0IEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXZlbnRJZDogei5zdHJpbmcoKSxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkSG9va1Rva2VuQ2xhaW0oXG4gIGNvbnN0cmFpbnRQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgSG9va1Rva2VuQ2xhaW1TY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihjb25zdHJhaW50UGF0aCwgSG9va1Rva2VuQ2xhaW1TY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIHRva2VuIGNsYWltIGhlbGQgYnkgYW5vdGhlciBgKHJ1bklkLCBob29rSWQpYCBjYW4gbmV2ZXIgYmVjb21lXG4gKiBsaXZlIGFnYWluIGFuZCBtYXkgdGhlcmVmb3JlIGJlIHJlbGVhc2VkIGJ5IGEgbmV3IGNsYWltYW50OlxuICpcbiAqICAgLSB0aGUgY2xhaW1lZCBob29rJ3MgZGlzcG9zYWwgaXMgY29tbWl0dGVkIChpdHMgZGlzcG9zZSBsb2NrIGV4aXN0cyDigJRcbiAqICAgICB0aGUgZHVyYWJsZSByZWxlYXNlIG9mIHRoZSBjbGFpbSBmaWxlIGp1c3QgaGFzbid0IGxhbmRlZCB5ZXQsIG9yIHdhc1xuICogICAgIGxvc3QgdG8gYSBjcmFzaCBiZXR3ZWVuIHRoZSBsb2NrIHdyaXRlIGFuZCB0aGUgY2xhaW0gZGVsZXRlKSwgb3JcbiAqICAgLSB0aGUgb3duaW5nIHJ1biBpcyB0ZXJtaW5hbCAodGhlIHJ1bi1jb21wbGV0aW9uIGNsZWFudXAgcmVsZWFzZXMgYWxsXG4gKiAgICAgb2YgdGhlIHJ1bidzIGNsYWltcywgYnV0IGEgY2xhaW1hbnQgY2FuIG9ic2VydmUgdGhlIGNsYWltIGluIHRoZVxuICogICAgIHdpbmRvdyBiZWZvcmUgdGhhdCBjbGVhbnVwIGxhbmRzIOKAlCBvciB0aGUgY2xlYW51cCBjcmFzaGVkKSwgb3JcbiAqICAgLSB0aGUgb3duaW5nIHJ1biBkb2VzIG5vdCBleGlzdCAoYSBjbGFpbSBjYW4gb25seSBiZSB3cml0dGVuIGR1cmluZyBhXG4gKiAgICAgc3VzcGVuc2lvbiBvZiBhbiBleGlzdGluZyBydW4sIHNvIGFuIG93bmVybGVzcyBjbGFpbSBpcyBkZWJyaXMpLlxuICpcbiAqIEEgY2xhaW0gZnJvbSBhIG1pZC1jcmVhdGlvbiB3cml0ZXIgaXMgbmV2ZXIgcmVsZWFzYWJsZTogaXRzIG93bmluZyBydW5cbiAqIGV4aXN0cyBhbmQgaXMgbm9uLXRlcm1pbmFsLCBhbmQgaXRzIGRpc3Bvc2UgbG9jayBkb2VzIG5vdCBleGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNIb29rVG9rZW5DbGFpbVJlbGVhc2FibGUoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgY2xhaW06IHouaW5mZXI8dHlwZW9mIEhvb2tUb2tlbkNsYWltU2NoZW1hPixcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKFxuICAgIGNsYWltLmhvb2tJZCAmJlxuICAgIChhd2FpdCBpc0hvb2tEaXNwb3NhbENvbW1pdHRlZChiYXNlZGlyLCBjbGFpbS5ob29rSWQsIHRhZykpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IG93bmluZ1J1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ3J1bnMnLFxuICAgIGNsYWltLnJ1bklkLFxuICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICBpZiAoIW93bmluZ1J1bikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBpc1Rlcm1pbmFsV29ya2Zsb3dSdW5TdGF0dXMob3duaW5nUnVuLnN0YXR1cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rUmVjb3ZlcnlNYXJrZXIoXG4gIG1hcmtlclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihtYXJrZXJQYXRoLCBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJvYmUgdGhlIHJ1bidzIGV2ZW50IGxvZyBmb3IgYW4gZXhpc3RpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnRcbiAqIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uSWQuIFVzZWQgYnkgdGhlIGxlZ2FjeS1jbGFpbSByZWNvdmVyeVxuICogcGF0aCB0byBkZXRlY3QgXCJhbHJlYWR5IHB1Ymxpc2hlZCBieSBhIHByZS11cGdyYWRlIHdyaXRlXCIgYmVmb3JlXG4gKiBwaW5uaW5nIGEgY2Fub25pY2FsIGV2ZW50SWQg4oCUIHdpdGhvdXQgdGhpcyBjaGVjaywgYSBwb3N0LXVwZ3JhZGVcbiAqIHJldHJ5IGVuY291bnRlcmluZyBhIGxlZ2FjeSBjbGFpbSB3aG9zZSBgaG9va19jcmVhdGVkYCB3YXNcbiAqIGFscmVhZHkgd3JpdHRlbiAod2l0aCB0aGUgcHJlLXVwZ3JhZGUgd3JpdGVyJ3Mgb3duIGV2ZW50SWQpIHdvdWxkXG4gKiBwaW4gYSAqZGlmZmVyZW50KiBldmVudElkIHZpYSB0aGUgbWFya2VyIGFuZCBwdWJsaXNoIGEgZHVwbGljYXRlXG4gKiBldmVudCBhdCB0aGUgbWFya2VyJ3MgcGF0aC5cbiAqXG4gKiBUaGUgaW5saW5lLWBldmVudElkYCBmYXN0IHBhdGggZG9lcyBOT1QgbmVlZCB0aGlzIHByb2JlOiB0aGVcbiAqIGNhbm9uaWNhbCBldmVudElkIGlzIGR1cmFibGUgaW4gdGhlIGNsYWltIGZpbGUsIHNvIHRoZSBleGlzdGluZ1xuICogcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKSB3aWxsIGZhaWwgaWZmIHRoZSBldmVudFxuICogYWxyZWFkeSBleGlzdHMgYXQgdGhhdCBleGFjdCBwYXRoIOKAlCB3aGljaCBpcyB0aGUgY29ycmVjdFxuICogXCJhbHJlYWR5LXB1Ymxpc2hlZFwiIHNlbWFudGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRXhpc3RpbmdIb29rQ3JlYXRlZEV2ZW50SWQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICBmaWx0ZXI6IChldmVudCkgPT5cbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQsXG4gICAgbGltaXQ6IDEsXG4gICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdC5kYXRhWzBdPy5ldmVudElkID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVwYWlyIGFuIFwiZXZlbnQtZmlyc3Qgb3JwaGFuXCI6IHRoZSBob29rIGVudGl0eSB3cml0ZSBpcyBkZWZlcnJlZFxuICogdW50aWwgYWZ0ZXIgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IHB1Ymxpc2ggY29tbWl0cyAoc28gYSBmYWlsZWRcbiAqIHB1Ymxpc2ggY2Fubm90IG11dGF0ZSBhbHJlYWR5LWNvbW1pdHRlZCBzdGF0ZSDigJQgc2VlIHRoZSBjb21tZW50IG9uXG4gKiB0aGUgZGVmZXJyZWQgd3JpdGUpLCB3aGljaCBvcGVucyB0aGUgaW52ZXJzZSBjcmFzaCB3aW5kb3cg4oCUIGFcbiAqIGNyYXNoIEFGVEVSIHRoZSBldmVudCBwdWJsaXNoIGJ1dCBCRUZPUkUgdGhlIGRlZmVycmVkIGVudGl0eSB3cml0ZVxuICogbGVhdmVzIHRoZSBldmVudCBpbiB0aGUgbG9nIHdpdGggdGhlIGhvb2sgZW50aXR5IG1pc3NpbmcuIEEgcmV0cnlcbiAqIHRoZW4gY29sbGlkZXMgYXQgdGhlIGV2ZW50IHB1Ymxpc2ggYW5kIHRocm93c1xuICogYEVudGl0eUNvbmZsaWN0RXJyb3JgIChjb3JyZWN0IOKAlCB0aGUgZXZlbnQgSVMgY29tbWl0dGVkKSwgYnV0XG4gKiB3aXRob3V0IHRoaXMgcmVwYWlyIHRoZSBlbnRpdHkgd291bGQgc3RheSBtaXNzaW5nIGZvcmV2ZXIgYW5kIHRoZVxuICogaG9vayB3b3VsZCBiZSB1bnJlc29sdmFibGUuXG4gKlxuICogVGhlIGVudGl0eSBNVVNUIGJlIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgcGVyc2lzdGVkIGNhbm9uaWNhbFxuICogZXZlbnQncyBwYXlsb2FkIOKAlCBOT1QgdGhlIHJldHJ5J3MgYGV2ZW50RGF0YWAg4oCUIG90aGVyd2lzZSBhIHJldHJ5XG4gKiBjYXJyeWluZyBkaWZmZXJlbnQgYG1ldGFkYXRhYCAvIGBpc1dlYmhvb2tgIHdvdWxkIHNpbGVudGx5IGNoYW5nZVxuICogY29tbWl0dGVkIHN0YXRlLiBUaGUgd3JpdGUgdXNlcyBgd3JpdGVFeGNsdXNpdmVgIChjcmVhdGUtaWYtYWJzZW50KVxuICogc28gYSBjb25jdXJyZW50IHdyaXRlciByYWNpbmcgdGhpcyByZXBhaXIgY2Fubm90IGJlIG92ZXJ3cml0dGVuO1xuICogd2hpY2hldmVyIHdyaXRlIGxhbmRzIGZpcnN0LCB0aGUgY29udGVudCBpcyBpZGVudGljYWwgYmVjYXVzZSBib3RoXG4gKiBkZXJpdmUgZnJvbSB0aGUgc2FtZSBwZXJzaXN0ZWQgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIHBlcnNpc3RlZEV2ZW50SWQ6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtydW5JZH0tJHtwZXJzaXN0ZWRFdmVudElkfWA7XG4gIGNvbnN0IHBlcnNpc3RlZEV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnZXZlbnRzJyxcbiAgICBjb21wb3NpdGVLZXksXG4gICAgRXZlbnRTY2hlbWEsXG4gICAgdGFnXG4gICk7XG4gIGlmIChcbiAgICAhcGVyc2lzdGVkRXZlbnQgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5ldmVudFR5cGUgIT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgcGVyc2lzdGVkRXZlbnQuY29ycmVsYXRpb25JZCAhPT0gaG9va0lkXG4gICkge1xuICAgIC8vIE5vdGhpbmcgdHJ1c3R3b3J0aHkgdG8gcmVwYWlyIGZyb20uXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ2hvb2tzJyxcbiAgICBob29rSWQsXG4gICAgSG9va1NjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgIC8vIEVudGl0eSBhbHJlYWR5IHByZXNlbnQg4oCUIG5vdCBhbiBvcnBoYW4sIGxlYXZlIGl0IHVudG91Y2hlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXZlbnREYXRhID0gKHBlcnNpc3RlZEV2ZW50LmV2ZW50RGF0YSA/PyB7fSkgYXMge1xuICAgIHRva2VuPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogU2VyaWFsaXplZERhdGE7XG4gICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gIH07XG4gIGlmICh0eXBlb2YgZXZlbnREYXRhLnRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBob29rOiBIb29rID0ge1xuICAgIHJ1bklkLFxuICAgIGhvb2tJZCxcbiAgICB0b2tlbjogZXZlbnREYXRhLnRva2VuLFxuICAgIG1ldGFkYXRhOiBldmVudERhdGEubWV0YWRhdGEsXG4gICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICBlbnZpcm9ubWVudDogJ2xvY2FsJyxcbiAgICBjcmVhdGVkQXQ6IHBlcnNpc3RlZEV2ZW50LmNyZWF0ZWRBdCxcbiAgICBzcGVjVmVyc2lvbjogcGVyc2lzdGVkRXZlbnQuc3BlY1ZlcnNpb24sXG4gICAgaXNXZWJob29rOiBldmVudERhdGEuaXNXZWJob29rID8/IHRydWUsXG4gICAgaXNTeXN0ZW06IGV2ZW50RGF0YS5pc1N5c3RlbSA/PyBmYWxzZSxcbiAgfTtcbiAgLy8gVGhpcyBwYXRoIGNhbiByZXBhaXIgZXZlbnRzIHB1Ymxpc2hlZCBieSBwcmUtaW5kZXggd3JpdGVycywgc29cbiAgLy8gKGlkZW1wb3RlbnRseSkgaW5kZXggdGhlIHBlcnNpc3RlZCBldmVudCBiZWZvcmUgdGhlIGVudGl0eSB3cml0ZS5cbiAgYXdhaXQgd3JpdGVIb29rQ3JlYXRlZEluZGV4RW50cmllcyhcbiAgICBiYXNlZGlyLFxuICAgIGV2ZW50RGF0YS50b2tlbixcbiAgICBydW5JZCxcbiAgICBob29rSWQsXG4gICAgcGVyc2lzdGVkRXZlbnRJZCxcbiAgICB0YWdcbiAgKTtcbiAgYXdhaXQgd3JpdGVIb29rQnlSdW5NYXJrZXIoYmFzZWRpciwgcnVuSWQsIGhvb2tJZCwgdGFnKTtcbiAgYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rSWQsIHRhZyksXG4gICAgSlNPTi5zdHJpbmdpZnkoaG9vaywganNvblJlcGxhY2VyLCAyKVxuICApO1xufVxuXG4vKipcbiAqIEF0b21pY2FsbHkgcGluIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgIGV2ZW50SWQgZm9yIGEgbGVnYWN5XG4gKiBjbGFpbSAob25lIHdpdGhvdXQgYW4gaW5saW5lIGBldmVudElkYCkuIFRoZSBmaXJzdCByZXRyeSB0b1xuICogYHdyaXRlRXhjbHVzaXZlYCB0aGUgcmVjb3ZlcnkgbWFya2VyIHdpbnM7IGl0cyBgY2FuZGlkYXRlRXZlbnRJZGBcbiAqIGJlY29tZXMgY2Fub25pY2FsLiBTdWJzZXF1ZW50IHJldHJpZXMgcmVhZCB0aGUgbWFya2VyIGFuZCBhZG9wdFxuICogaXRzIGBldmVudElkYC4gVG9nZXRoZXIgd2l0aCB0aGUgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGluXG4gKiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCwgdGhpcyBnaXZlcyB0aGUgbGVnYWN5LWZhbGxiYWNrIHBhdGggdGhlXG4gKiBzYW1lIHNpbmdsZS1ldmVudCBjb252ZXJnZW5jZSBndWFyYW50ZWUgYXMgdGhlIGlubGluZS1gZXZlbnRJZGBcbiAqIGZhc3QgcGF0aC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIGNhbGxlciB0byBhZG9wdCwgb3IgYG51bGxgXG4gKiBpZiB3ZSBsb3N0IHRoZSBtYXJrZXIgcmFjZSBBTkQgdGhlIHJlc3VsdGluZyBtYXJrZXIgZmlsZSBpc1xuICogdW5yZWFkYWJsZSAoZXh0cmVtZWx5IHJhcmU7IGNvcnJ1cHRlZCBkaXNrKS4gQ2FsbGVycyB0cmVhdCBgbnVsbGBcbiAqIGFzIFwiZ2l2ZSB1cCwgdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgXCIgc28gdGhlIHJ1bnRpbWUnc1xuICogY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBzd2FsbG93cyB0aGlzIGF0dGVtcHQgYW5kIGxldHNcbiAqIGFub3RoZXIgb25lIHRocm91Z2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbkNhbm9uaWNhbEV2ZW50SWRGb3JMZWdhY3lDbGFpbShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0b2tlbjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgY2FuZGlkYXRlRXZlbnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+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/IHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgLy8gSW5kZXggZW50cmllcyBiZWZvcmUgdGhlIGV2ZW50IHB1Ymxpc2ggKHNlZSBob29rLWluZGV4LnRzXG4gICAgICAgICAgLy8gY3Jhc2gtb3JkZXJpbmcgaW52YXJpYW50KS4gYGV2ZW50SWRgIGlzIGZpbmFsIGhlcmUg4oCUIHRoZVxuICAgICAgICAgIC8vIGRlZHVwLXJlY292ZXJ5IGJyYW5jaCBhYm92ZSBhbHJlYWR5IHJlYXNzaWduZWQgaXQgdG8gdGhlXG4gICAgICAgICAgLy8gY2Fub25pY2FsIGlkIHdoZW4gYXBwbGljYWJsZS5cbiAgICAgICAgICBhd2FpdCB3cml0ZUhvb2tDcmVhdGVkSW5kZXhFbnRyaWVzKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgIGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSB7XG4gICAgICAgICAgLy8gaG9va19kaXNwb3NlZDogRGVsZXRlcyBob29rIGVudGl0eSwgcmVqZWN0cyBkdXBsaWNhdGVzLlxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZGlzcG9zaW5nIHRoZSBzYW1lIGhvb2sgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICAvLyBUaGUgbG9jayBkb3VibGVzIGFzIHRoZSBkdXJhYmxlIGRpc3Bvc2FsIG1hcmtlciBjb25zdWx0ZWQgYnkgdGhlXG4gICAgICAgICAgLy8gaG9va19jcmVhdGVkIGNsYWltIHBhdGggYW5kIHRoZSBldmVudC1sb2cgcmVidWlsZCAoc2VlXG4gICAgICAgICAgLy8gYGlzSG9va0Rpc3Bvc2FsQ29tbWl0dGVkYCksIHdoaWNoIGlzIHdoeSBpdCBtdXN0IGJlIHdyaXR0ZW5cbiAgICAgICAgICAvLyBiZWZvcmUgYW55IG9mIHRoZSBkZXN0cnVjdGl2ZSBkZWxldGVzIGJlbG93LlxuICAgICAgICAgIGNvbnN0IGxvY2tQYXRoID0gaG9va0Rpc3Bvc2VMb2NrUGF0aChcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBIb29rIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBkaXNwb3NlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJlYWQgdGhlIGhvb2sgdG8gZ2V0IGl0cyB0b2tlbiBiZWZvcmUgZGVsZXRpbmdcbiAgICAgICAgICBjb25zdCBob29rUGF0aCA9IHRhZ2dlZFBhdGgoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIHRva2VuIGNsYWltIHRvIGZyZWUgdXAgdGhlIHRva2VuIGZvciByZXVzZSDigJRcbiAgICAgICAgICAgIC8vIGJ1dCBvbmx5IGlmIGl0IHN0aWxsIHBvaW50cyBhdCB0aGlzIGhvb2suIEEgY2xhaW1hbnQgdGhhdFxuICAgICAgICAgICAgLy8gZm9yY2UtcmVsZWFzZWQgdGhpcyBob29rJ3Mgc3RhbGUgY2xhaW0gKHNlZVxuICAgICAgICAgICAgLy8gYGlzSG9va1Rva2VuQ2xhaW1SZWxlYXNhYmxlYCkgbWF5IGFscmVhZHkgaG9sZCBhIGZyZXNoXG4gICAgICAgICAgICAvLyBjbGFpbSBmb3IgdGhlIHRva2VuOyBkZWxldGluZyB1bmNvbmRpdGlvbmFsbHkgaGVyZSB3b3VsZFxuICAgICAgICAgICAgLy8gZGVzdHJveSB0aGF0IGxpdmUgY2xhaW0gYW5kIHRyYW5zaWVudGx5IGJyZWFrIHRva2VuXG4gICAgICAgICAgICAvLyB1bmlxdWVuZXNzLiBBbHNvIGRlbGV0ZSB0aGlzIGhvb2sncyByZWNvdmVyeSBtYXJrZXIgKGlmXG4gICAgICAgICAgICAvLyBhbnkpIGZvciBkaXNrIGh5Z2llbmUuIFRoZSBtYXJrZXIncyBmaWxlbmFtZSBoYXNoXG4gICAgICAgICAgICAvLyBpbmNsdWRlcyBgKHRva2VuLCBydW5JZCwgaG9va0lkKWAgc28gZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBsaWZldGltZXMgbmV2ZXIgY29sbGlkZSwgYnV0IGNsZWFuaW5nIHVwIHJlZHVjZXMgZGlza1xuICAgICAgICAgICAgLy8gbGVhayBmb3IgaG9va3MgdGhhdCBnbyB0aHJvdWdoIHRoZSByZWNvdmVyeSBwYXRoLlxuICAgICAgICAgICAgYXdhaXQgcmVsZWFzZUhvb2tUb2tlbkNsYWltSWZPd25lZEJ5KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBleGlzdGluZ0hvb2sudG9rZW4sXG4gICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLmhvb2tJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgICAgICAgIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2sudG9rZW4sXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnJ1bklkLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ob29rSWRcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihob29rUGF0aCk7XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSG9va0J5UnVuTWFya2VyKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHdhaXRfY3JlYXRlZDogQ3JlYXRlcyB3YWl0IGVudGl0eSB3aXRoIHN0YXR1cyAnd2FpdGluZycuXG4gICAgICAgICAgLy8gQXRvbWljIGNsYWltIG9uIGEgcGVyLShydW5JZCwgY29ycmVsYXRpb25JZCkgY29uc3RyYWludCBmaWxlXG4gICAgICAgICAgLy8gZW5zdXJlcyBkdXBsaWNhdGUgd2FpdF9jcmVhdGVkIGZyb20gY29uY3VycmVudCBpbnZvY2F0aW9uc1xuICAgICAgICAgIC8vIHN1cmZhY2VzIGFzIEVudGl0eUNvbmZsaWN0RXJyb3IgKHJlcGxhY2VzIGEgcHJpb3IgVE9DVE9VXG4gICAgICAgICAgLy8gcmVhZC10aGVuLWNoZWNrIHRoYXQgY291bGQgbGV0IGJvdGggd3JpdGVycyB0aHJvdWdoKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7d2FpdENvbXBvc2l0ZUtleX0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXdhaXRDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3YWl0RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHJlc3VtZUF0PzogRGF0ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICB3YWl0SWQ6IHdhaXRDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGF0dXM6ICd3YWl0aW5nJyxcbiAgICAgICAgICAgIHJlc3VtZUF0OiB3YWl0RGF0YS5yZXN1bWVBdCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZDogVHJhbnNpdGlvbnMgd2FpdCB0byAnY29tcGxldGVkJywgcmVqZWN0cyBkdXBsaWNhdGVzLlxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggY29tcGxldGluZyB0aGUgc2FtZSB3YWl0IChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3Qgd2FpdENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGNvbnN0IHdhaXRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jb21wbGV0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jb21wbGV0ZWRgO1xuICAgICAgICAgIGNvbnN0IGxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobG9ja1BhdGgsICcnKTtcbiAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY29tcGxldGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdXYWl0ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRDb21wb3NpdGVLZXksXG4gICAgICAgICAgICBXYWl0U2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWV4aXN0aW5nV2FpdCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGxvY2sgZmlsZSB3ZSBqdXN0IGNsYWltZWQg4oCUIHRoZSB3YWl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhsb2NrUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBub3QgZm91bmRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUaGUgbG9jayBmaWxlICh3cml0ZUV4Y2x1c2l2ZSBhYm92ZSkgYWxyZWFkeSBwcmV2ZW50cyBjb25jdXJyZW50XG4gICAgICAgICAgLy8gY29tcGxldGlvbnMg4oCUIG5vIGFkZGl0aW9uYWwgc3RhdHVzIGNoZWNrIG5lZWRlZC5cbiAgICAgICAgICB3YWl0ID0ge1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdXYWl0LFxuICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3dhaXRzJywgd2FpdENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBob29rX3JlY2VpdmVkIGV2ZW50cyBhcmUgc3RvcmVkIGluIHRoZSBldmVudCBsb2cgYnV0IGRvbid0XG4gICAgICAgIC8vIG1vZGlmeSB0aGUgSG9vayBlbnRpdHkgKHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIHBheWxvYWQgZmllbGQpXG5cbiAgICAgICAgLy8gU3RvcmUgZXZlbnQgdXNpbmcgY29tcG9zaXRlIGtleSB7cnVuSWR9LXtldmVudElkfS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYHdyaXRlRXhjbHVzaXZlYCAoT19DUkVBVHxPX0VYQ0wgdmlhIHRlbXAtZmlsZSArIGhhcmQtbGluaylcbiAgICAgICAgLy8gaXMgdGhlIGNyb3NzLXByb2Nlc3MgYXRvbWljIHB1Ymxpc2ggcHJpbWl0aXZlOiBpZiB0aGUgZmlsZVxuICAgICAgICAvLyBhbHJlYWR5IGV4aXN0cywgcmV0dXJucyBmYWxzZSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nLiBUaGlzXG4gICAgICAgIC8vIGlzIGNyaXRpY2FsIGZvciB0aGUgaG9va19jcmVhdGVkIGRlZHVwLXJlY292ZXJ5IGNvbnZlcmdlbmNlXG4gICAgICAgIC8vIChhYm92ZSkg4oCUIHR3byB3b3JrZXJzIHRoYXQgYWRvcHQgdGhlIHNhbWUgY2Fub25pY2FsIGV2ZW50SWRcbiAgICAgICAgLy8gcmFjZSBoZXJlOyB3aG9ldmVyIGxpbmtzIHRoZSBmaWxlIGZpcnN0IHdpbnMsIHRoZSBsb3NlclxuICAgICAgICAvLyB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvciwgYW5kIHRoZSBydW50aW1lJ3MgZXhpc3RpbmdcbiAgICAgICAgLy8gY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBhdCBzdXNwZW5zaW9uLWhhbmRsZXIudHM6MTQyXG4gICAgICAgIC8vIHN3YWxsb3dzIGl0LiBGb3IgYWxsIG90aGVyIGV2ZW50IHR5cGVzLCBldmVudElkcyBhcmVcbiAgICAgICAgLy8gbW9ub3RvbmljIFVMSURzIChnbG9iYWxseSB1bmlxdWUgYnkgY29uc3RydWN0aW9uKSBzbyBhXG4gICAgICAgIC8vIGNvbGxpc2lvbiBpbmRpY2F0ZXMgYSByZWFsIGJ1ZyBhbmQgRW50aXR5Q29uZmxpY3RFcnJvciBpc1xuICAgICAgICAvLyBhbHNvIHRoZSByaWdodCBzdXJmYWNlIOKAlCBzYW1lIHNoYXBlIGFzIHN0ZXBfY3JlYXRlZCdzXG4gICAgICAgIC8vIGNsYWltLWZpbGUgYmVoYXZpb3IuXG4gICAgICAgIC8vIExhc3QtaW5zdGFudCByZS12YWxpZGF0aW9uIGZvciBgaG9va19yZWNlaXZlZGAgKHNlZSB0aGUgYWNjZXB0YW5jZVxuICAgICAgICAvLyBjaGVjayBhYm92ZSkuIFRoZSBwZXItaG9vayBpbi1wcm9jZXNzIGxvY2sgYWxyZWFkeSBzZXJpYWxpemVzXG4gICAgICAgIC8vIHJlc3VtZSB2cy4gZGlzcG9zZSB3aXRoaW4gb25lIHN0b3JhZ2UgaW5zdGFuY2U7IHRoaXMgc2Vjb25kIGNoZWNrXG4gICAgICAgIC8vIG5hcnJvd3MgdGhlIGNyb3NzLWluc3RhbmNlIHdpbmRvdyAoaW5kZXBlbmRlbnQgbG9jayBtYXBzLCBzaGFyZWRcbiAgICAgICAgLy8gZmlsZXN5c3RlbSkgdG8gdGhlIHNpbmdsZSBldmVudCB3cml0ZSBiZWxvdywgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIG1vZHVsZSdzIGNvbnZlbnRpb24gdGhhdCB0aGUgb24tZGlzayBsb2NrIGZpbGUg4oCUIG5vdCB0aGVcbiAgICAgICAgLy8gaW4tcHJvY2VzcyBtdXRleCDigJQgaXMgdGhlIGR1cmFibGUgc291cmNlIG9mIHRydXRoLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCAmJlxuICAgICAgICAgIChhd2FpdCBpc0hvb2tEaXNwb3NhbENvbW1pdHRlZChiYXNlZGlyLCBkYXRhLmNvcnJlbGF0aW9uSWQsIHRhZykpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICBjb25zdCBldmVudFBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjb21wb3NpdGVLZXksIHRhZyk7XG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBiZWZvcmUgdGhlIHdyaXRlJ3MgYGF3YWl0YCBzbyB0aGVcbiAgICAgICAgLy8gY2FjaGVkIHNuYXBzaG90IGNhbid0IG9ic2VydmUgYSBsYXRlciBtdXRhdGlvbiAoc2VlXG4gICAgICAgIC8vIHJlbWVtYmVyU3RvcmVkRXZlbnQpLlxuICAgICAgICBjb25zdCBzZXJpYWxpemVkRXZlbnQgPSBKU09OLnN0cmluZ2lmeShldmVudCwganNvblJlcGxhY2VyLCAyKTtcbiAgICAgICAgY29uc3QgZXZlbnRQdWJsaXNoZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG4gICAgICAgIGlmICghZXZlbnRQdWJsaXNoZWQpIHtcbiAgICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIGxvc2luZyB0aGUgZXZlbnQgcHVibGlzaCBtZWFucyB0aGVcbiAgICAgICAgICAvLyBldmVudCB3YXMgYWxyZWFkeSBjb21taXR0ZWQgYXQgdGhpcyBleGFjdCAoY2Fub25pY2FsKVxuICAgICAgICAgIC8vIHBhdGguIFRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgLy8gaXRzIGV2ZW50IHB1Ymxpc2ggYW5kIGl0cyBkZWZlcnJlZCBob29rLWVudGl0eSB3cml0ZVxuICAgICAgICAgIC8vICh0aGUgaW52ZXJzZSBvZiB0aGUgY3Jhc2ggd2luZG93IHRoZSBkZWZlcnJhbCBjbG9zZXMpLFxuICAgICAgICAgIC8vIGxlYXZpbmcgYW4gZXZlbnQtZmlyc3Qgb3JwaGFuOiB0aGUgZXZlbnQgaXMgaW4gdGhlIGxvZ1xuICAgICAgICAgIC8vIGJ1dCB0aGUgZW50aXR5IGlzIG1pc3NpbmcgYW5kIHRoZSBob29rIGlzIHVucmVzb2x2YWJsZS5cbiAgICAgICAgICAvLyBSZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBQRVJTSVNURUQgZXZlbnQncyBwYXlsb2FkXG4gICAgICAgICAgLy8gKG5ldmVyIHRoZSByZXRyeSdzIOKAlCBkaWZmZXJlbnQgcmV0cnkgbWV0YWRhdGEgbXVzdCBub3RcbiAgICAgICAgICAvLyBjaGFuZ2UgY29tbWl0dGVkIHN0YXRlKSBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ25cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgdG8gdGhlIHJ1bnRpbWUncyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICBhd2FpdCByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IFwiJHtldmVudElkfVwiIGFscmVhZHkgZXhpc3RzIGZvciBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgZXZlbnQgaXMgbm93IGNvbW1pdHRlZDsgY2FjaGUgaXQgc28gYW4gaW1tZWRpYXRlIHNlcXVlbnRpYWxcbiAgICAgICAgLy8gcmVwbGF5IGNhbiBzZXJ2ZSBpdCB3aXRob3V0IHJlcmVhZGluZyBmcm9tIGRpc2suXG4gICAgICAgIHJlbWVtYmVyU3RvcmVkRXZlbnQoZXZlbnQsIGV2ZW50UGF0aCwgc2VyaWFsaXplZEV2ZW50KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaG9vayBlbnRpdHkgT05MWSBub3cgdGhhdCB0aGUgZXZlbnQgcHVibGlzaCBoYXNcbiAgICAgICAgLy8gY29tbWl0dGVkLiBEb2luZyB0aGlzIGVhcmxpZXIgKGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBicmFuY2ggYWJvdmUpIHdvdWxkIG11dGF0ZSBhbiBhbHJlYWR5LWNvbW1pdHRlZCBob29rXG4gICAgICAgIC8vIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoXG4gICAgICAgIC8vIHByb3ZlZCB3aGV0aGVyIHRoaXMgYXR0ZW1wdCB3YXMgcmVwYWlyaW5nIGEgbWlzc2luZyBldmVudFxuICAgICAgICAvLyBvciBqdXN0IGNvbGxpZGluZyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgLlxuICAgICAgICAvLyBUaGUgYnJhbmNoIHNldHMgYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGlmZiB0aGlzIGV2ZW50XG4gICAgICAgIC8vIHR5cGUgd3JpdGVzIGFuIGVudGl0eS5cbiAgICAgICAgaWYgKGhvb2sgJiYgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgLy8gTWFya2VyIGJlZm9yZSBlbnRpdHkgKHNlZSBob29rLWluZGV4LnRzIGNyYXNoLW9yZGVyaW5nXG4gICAgICAgICAgLy8gaW52YXJpYW50KS5cbiAgICAgICAgICBhd2FpdCB3cml0ZUhvb2tCeVJ1bk1hcmtlcihiYXNlZGlyLCBob29rLnJ1bklkLCBob29rLmhvb2tJZCwgdGFnKTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdob29rcycsIGhvb2suaG9va0lkLCB0YWcpLFxuICAgICAgICAgICAgaG9vayxcbiAgICAgICAgICAgIGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXM/LnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgICAgY29uc3QgZmlsdGVyZWRFdmVudCA9IHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpO1xuXG4gICAgICAgIC8vIEZvciBydW5fc3RhcnRlZDogcHJlbG9hZCBvbmUgcGFnZSBvZiBldmVudHMgc28gdGhlIHJ1bnRpbWUgY2FuIHNraXBcbiAgICAgICAgLy8gdGhlIGluaXRpYWwgZXZlbnRzLmxpc3QgY2FsbCB3aGVuIGhhc01vcmUgaXMgZmFsc2UuXG4gICAgICAgIGxldCBldmVudHM6IEV2ZW50W10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBoYXNNb3JlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgJiYgcnVuKSB7XG4gICAgICAgICAgY29uc3QgYWxsRXZlbnRzID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgICAgICBjYWNoZWRJdGVtczogZXZlbnRDYWNoZSxcbiAgICAgICAgICAgIGZpbGVQcmVmaXg6IGAke2VmZmVjdGl2ZVJ1bklkfS1gLFxuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgICAgIGdldElkOiAoZSkgPT4gZS5ldmVudElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cyA9IGFsbEV2ZW50cy5kYXRhO1xuICAgICAgICAgIGN1cnNvciA9IGFsbEV2ZW50cy5jdXJzb3I7XG4gICAgICAgICAgaGFzTW9yZSA9IGFsbEV2ZW50cy5oYXNNb3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbjogb24gYSBzdGVwLXRlcm1pbmFsIHdyaXRlIHRoZSBpbmxpbmVcbiAgICAgICAgLy8gcnVudGltZSBsb29wIGNhbiBwYXNzIGBzaW5jZUN1cnNvcmAgKHRoZSBjdXJzb3IgZnJvbSBiZWZvcmUgaXRcbiAgICAgICAgLy8gYmVnYW4gd3JpdGluZyB0aGlzIHN0ZXAncyBldmVudHMpLiBXZSByZXR1cm4gdGhlIGRlbHRhIG9mXG4gICAgICAgIC8vIGV2ZW50cyB3cml0dGVuIHN0cmljdGx5IGFmdGVyIHRoYXQgY3Vyc29yIOKAlCBleGFjdGx5IHdoYXQgYW5cbiAgICAgICAgLy8gYGV2ZW50cy5saXN0KHsgY3Vyc29yOiBzaW5jZUN1cnNvciwgc29ydE9yZGVyOiAnYXNjJyB9KWAgd291bGRcbiAgICAgICAgLy8gcmV0dXJuIHJpZ2h0IG5vdyDigJQgc28gdGhlIGxvb3AgY2FuIHNraXAgYSByZWR1bmRhbnQgcm91bmQtdHJpcC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBpcyBjb21wdXRlZCBhZ2FpbnN0IHRoZSBzYW1lIG9uLWRpc2sgbG9nIHRoZSBsaXN0IHBhdGhcbiAgICAgICAgLy8gcmVhZHMsIHNvIGl0IGNhcHR1cmVzIGV2ZXJ5dGhpbmcgdGhlIGZldGNoIHdvdWxkOiB0aGlzIHN0ZXAnc1xuICAgICAgICAvLyBzdGVwX2NyZWF0ZWQvc3RlcF9zdGFydGVkL3N0ZXBfY29tcGxldGVkLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXBcbiAgICAgICAgLy8gYm9keSB3cm90ZSwgYW5kIGFueSBpbi1iYW5kIGV2ZW50cyAoZS5nLiBob29rX3JlY2VpdmVkLFxuICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCkgYW5vdGhlciB3cml0ZXIgYXBwZW5kZWQgc2luY2UgdGhlIGN1cnNvci4gVGhhdFxuICAgICAgICAvLyBlcXVpdmFsZW5jZSBpcyB3aGF0IG1ha2VzIHNraXBwaW5nIHRoZSBmZXRjaCBzYWZlIOKAlCBhIG1pc3NlZFxuICAgICAgICAvLyBpbi1iYW5kIGV2ZW50IGNhbm5vdCBkaXZlcmdlIHJlcGxheSBiZWNhdXNlIHRoZSBkZWx0YSBpcyB0aGVcbiAgICAgICAgLy8gZmV0Y2guXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9ubHkgc3RlcC10ZXJtaW5hbCBldmVudHMgcXVhbGlmeTogc3RlcF9jcmVhdGVkL3N0ZXBfc3RhcnRlZCBhcmVcbiAgICAgICAgLy8gbm90IGxvb3AgYm91bmRhcmllcyAodGhlIGxvb3AgZmV0Y2hlcyBhZnRlciBzdGVwX2NvbXBsZXRlZCAvXG4gICAgICAgIC8vIHN0ZXBfZmFpbGVkKSwgYW5kIHJ1bi10ZXJtaW5hbCBldmVudHMgZW5kIHRoZSBsb29wLiBgcmVzb2x2ZURhdGFgXG4gICAgICAgIC8vIG1hdGNoZXMgdGhlIGxpc3QgcGF0aCBzbyBldmVudERhdGEgcmVmcyBhcmUgaGFuZGxlZCBpZGVudGljYWxseS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpICYmXG4gICAgICAgICAgdHlwZW9mIHBhcmFtcz8uc2luY2VDdXJzb3IgPT09ICdzdHJpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbm8gYGxpbWl0YDogdGhpcyByZXR1cm5zIGEgc2luZ2xlIGRlZmF1bHQtc2l6ZSBwYWdlLFxuICAgICAgICAgIC8vIHVubGlrZSB0aGUgYGV2ZW50cy5saXN0YCBwYXRoIHdoaWNoIGxvb3BzIGB3aGlsZSAoaGFzTW9yZSlgIHRvXG4gICAgICAgICAgLy8gZXhoYXVzdGlvbi4gVGhhdCBpcyBzYWZlIOKAlCBhbmQgbXVzdCBOT1QgYmUgXCJmaXhlZFwiIGJ5IHBhZ2luYXRpbmdcbiAgICAgICAgICAvLyBoZXJlIOKAlCBiZWNhdXNlIHRoZSBjb250cmFjdCBpcyBzaW5nbGUtcGFnZS1vci1mYWxsYmFjaywgbm90XG4gICAgICAgICAgLy8gY29tcGxldGUtZGVsdGEuIFdoZW4gdGhlIGRlbHRhIG92ZXJmbG93cyBvbmUgcGFnZSxcbiAgICAgICAgICAvLyBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkgc2V0cyBgaGFzTW9yZTogdHJ1ZWAgYW5kIHNsaWNlcyBgZGF0YWAgdG9cbiAgICAgICAgICAvLyB0aGUgcGFnZSAoc2VlIGZzLnRzKSwgd2hpY2ggd2UgZm9yd2FyZCB2ZXJiYXRpbSBiZWxvdy4gVGhlIFNES1xuICAgICAgICAgIC8vIGNvbnN1bWUgc2lkZSAocnVudGltZS50cykgb25seSBzdGFzaGVzIHRoZSBkZWx0YSB3aGVuIGAhaGFzTW9yZWBcbiAgICAgICAgICAvLyBhbmQgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdGhlIGV4aGF1c3RpdmUgYGV2ZW50cy5saXN0YCBsb29wLCBzbyBhXG4gICAgICAgICAgLy8gdHJ1bmNhdGVkIHBhZ2UgaXMgbmV2ZXIgY29uc3VtZWQgYXMgaWYgaXQgd2VyZSB0aGUgZnVsbCBkZWx0YS5cbiAgICAgICAgICBjb25zdCBkZWx0YSA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgZmlsZVByZWZpeDogYCR7ZWZmZWN0aXZlUnVuSWR9LWAsXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgY3Vyc29yOiBwYXJhbXMuc2luY2VDdXJzb3IsXG4gICAgICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICAgICAgZ2V0SWQ6IChlKSA9PiBlLmV2ZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRzID1cbiAgICAgICAgICAgIHJlc29sdmVEYXRhID09PSAnbm9uZSdcbiAgICAgICAgICAgICAgPyBkZWx0YS5kYXRhLm1hcCgoZSkgPT4gc3RyaXBFdmVudERhdGFSZWZzKGUsIHJlc29sdmVEYXRhKSlcbiAgICAgICAgICAgICAgOiBkZWx0YS5kYXRhO1xuICAgICAgICAgIGN1cnNvciA9IGRlbHRhLmN1cnNvcjtcbiAgICAgICAgICBoYXNNb3JlID0gZGVsdGEuaGFzTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGV2ZW50IGFuZCBhbnkgY3JlYXRlZC91cGRhdGVkIGVudGl0eVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV2ZW50OiBmaWx0ZXJlZEV2ZW50LFxuICAgICAgICAgIHJ1bixcbiAgICAgICAgICBzdGVwLFxuICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgd2FpdCxcbiAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgLi4uKHN0ZXBDcmVhdGVkTGF6aWx5ID8geyBzdGVwQ3JlYXRlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgfSAvLyBlbmQgY3JlYXRlSW1wbFxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQocnVuSWQsIGV2ZW50SWQsIHBhcmFtcykge1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgIGNvbXBvc2l0ZUtleSxcbiAgICAgICAgRXZlbnRTY2hlbWEsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50SWR9IGluIHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3QocGFyYW1zKSB7XG4gICAgICBjb25zdCB7IHJ1bklkIH0gPSBwYXJhbXM7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBjYWNoZWRJdGVtczogZXZlbnRDYWNoZSxcbiAgICAgICAgZmlsZVByZWZpeDogYCR7cnVuSWR9LWAsXG4gICAgICAgIC8vIEV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChvbGRlc3QgZmlyc3QpIGJ5IGRlZmF1bHQsXG4gICAgICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IGZvciBvdGhlciBsaXN0IGNhbGxzLlxuICAgICAgICBzb3J0T3JkZXI6IHBhcmFtcy5wYWdpbmF0aW9uPy5zb3J0T3JkZXIgPz8gJ2FzYycsXG4gICAgICAgIGxpbWl0OiBwYXJhbXMucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgIGN1cnNvcjogcGFyYW1zLnBhZ2luYXRpb24/LmN1cnNvcixcbiAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgZ2V0SWQ6IChldmVudCkgPT4gZXZlbnQuZXZlbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiByZXNvbHZlRGF0YSBpcyBcIm5vbmVcIiwgcmVtb3ZlIGV2ZW50RGF0YSBmcm9tIGV2ZW50c1xuICAgICAgaWYgKHJlc29sdmVEYXRhID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEubWFwKChldmVudCkgPT5cbiAgICAgICAgICAgIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdEJ5Q29ycmVsYXRpb25JZChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBwYXJhbXMuY29ycmVsYXRpb25JZDtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnY29ycmVsYXRpb25JZCcsIGNvcnJlbGF0aW9uSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBjYWNoZWRJdGVtczogZXZlbnRDYWNoZSxcbiAgICAgICAgLy8gTm8gZmlsZVByZWZpeCAtIHNlYXJjaCBhbGwgZXZlbnRzXG4gICAgICAgIGZpbHRlcjogKGV2ZW50KSA9PiBldmVudC5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkLFxuICAgICAgICAvLyBFdmVudHMgaW4gY2hyb25vbG9naWNhbCBvcmRlciAob2xkZXN0IGZpcnN0KSBieSBkZWZhdWx0LFxuICAgICAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBmb3Igb3RoZXIgbGlzdCBjYWxscy5cbiAgICAgICAgc29ydE9yZGVyOiBwYXJhbXMucGFnaW5hdGlvbj8uc29ydE9yZGVyID8/ICdhc2MnLFxuICAgICAgICBsaW1pdDogcGFyYW1zLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICBjdXJzb3I6IHBhcmFtcy5wYWdpbmF0aW9uPy5jdXJzb3IsXG4gICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgcmVzb2x2ZURhdGEgaXMgXCJub25lXCIsIHJlbW92ZSBldmVudERhdGEgZnJvbSBldmVudHNcbiAgICAgIGlmIChyZXNvbHZlRGF0YSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLm1hcCgoZXZlbnQpID0+XG4gICAgICAgICAgICBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|