@workflow/world-local 5.0.0-beta.25 → 5.0.0-beta.27

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.
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { EntityConflictError, HookNotFoundError, RunExpiredError, RunNotSupportedError, TooEarlyError, WorkflowRunNotFoundError, WorkflowWorldError, } from '@workflow/errors';
4
- import { applyAttributeChanges, EventSchema, HookSchema, isLegacySpecVersion, isTerminalRunEventType, isTerminalStepStatus, isTerminalWorkflowRunStatus, requiresNewerWorld, SPEC_VERSION_CURRENT, StepSchema, ulidToDate, validateAttributeChanges, validateUlidTimestamp, WaitSchema, WorkflowRunSchema, } from '@workflow/world';
4
+ import { applyAttributeChanges, EventSchema, HookSchema, isChildEntityCreationEvent, isHookEventRequiringExistence, isHookLifecycleEventType, isLegacySpecVersion, isStepEventType, isTerminalRunEventType, isTerminalStepEventType, isTerminalStepStatus, isTerminalWorkflowRunStatus, requiresNewerWorld, SPEC_VERSION_CURRENT, StepSchema, ulidToDate, validateAttributeChanges, validateUlidTimestamp, WaitSchema, WorkflowRunSchema, } from '@workflow/world';
5
5
  import { z } from 'zod';
6
6
  import { DEFAULT_RESOLVE_DATA_OPTION } from '../config.js';
7
7
  import { assertSafeEntityId, deleteJSON, jsonReplacer, jsonReviver, listJSONFiles, paginatedFileSystemQuery, readJSON, readJSONWithFallback, resolveWithinBase, taggedPath, write, writeExclusive, writeJSON, } from '../fs.js';
@@ -432,12 +432,7 @@ export function createEventsStorage(basedir, tag) {
432
432
  // step_completed / step_failed / step_retrying is atomic. step_created
433
433
  // is also serialized so duplicate-create races don't leave extra
434
434
  // step_created events in the log.
435
- const isStepEvent = data.eventType === 'step_created' ||
436
- data.eventType === 'step_started' ||
437
- data.eventType === 'step_completed' ||
438
- data.eventType === 'step_failed' ||
439
- data.eventType === 'step_retrying';
440
- if (isStepEvent && runId && data.correlationId) {
435
+ if (isStepEventType(data.eventType) && runId && data.correlationId) {
441
436
  const lockKey = tag
442
437
  ? `${runId}-${data.correlationId}.${tag}`
443
438
  : `${runId}-${data.correlationId}`;
@@ -462,10 +457,9 @@ export function createEventsStorage(basedir, tag) {
462
457
  // ordering that is journaled durably and makes every subsequent
463
458
  // replay of the owning run diverge at that event
464
459
  // (https://github.com/vercel/workflow/issues/2781).
465
- const isHookLifecycleEvent = data.eventType === 'hook_created' ||
466
- data.eventType === 'hook_received' ||
467
- data.eventType === 'hook_disposed';
468
- if (isHookLifecycleEvent && runId && data.correlationId) {
460
+ if (isHookLifecycleEventType(data.eventType) &&
461
+ runId &&
462
+ data.correlationId) {
469
463
  const lockKey = tag
470
464
  ? `${runId}-${data.correlationId}.hook.${tag}`
471
465
  : `${runId}-${data.correlationId}.hook`;
@@ -608,19 +602,10 @@ export function createEventsStorage(basedir, tag) {
608
602
  // below). This mirrors the resilient run_started path. Detect it here
609
603
  // so the entity-creation terminal-run guard treats it like a creation
610
604
  // and the "step must exist" ordering guard doesn't reject it.
611
- const lazyStepStart = data.eventType === 'step_started' &&
612
- 'eventData' in data &&
613
- !!data.eventData &&
614
- typeof data.eventData.stepName ===
615
- 'string' &&
616
- data.eventData.input !== undefined;
605
+ const createsChildEntity = isChildEntityCreationEvent(data);
606
+ const lazyStepStart = createsChildEntity && data.eventType === 'step_started';
617
607
  // Run terminal state validation
618
608
  if (currentRun && isTerminalWorkflowRunStatus(currentRun.status)) {
619
- const runTerminalEvents = [
620
- 'run_started',
621
- 'run_completed',
622
- 'run_failed',
623
- ];
624
609
  // Idempotent operation: run_cancelled on already cancelled run is allowed
625
610
  if (data.eventType === 'run_cancelled' &&
626
611
  currentRun.status === 'cancelled') {
@@ -645,18 +630,14 @@ export function createEventsStorage(basedir, tag) {
645
630
  throw new RunExpiredError(`Workflow run "${effectiveRunId}" is already in terminal state "${currentRun.status}"`);
646
631
  }
647
632
  // Other run state transitions are not allowed on terminal runs
648
- if (runTerminalEvents.includes(data.eventType) ||
649
- data.eventType === 'run_cancelled') {
633
+ if (isTerminalRunEventType(data.eventType)) {
650
634
  throw new EntityConflictError(`Cannot transition run from terminal state "${currentRun.status}"`);
651
635
  }
652
636
  // Creating new entities on terminal runs is not allowed. A lazy
653
637
  // step_started creates a step, so it is rejected here too — a bare
654
638
  // (non-lazy) step_started falls through to the step-validation
655
639
  // block below, which uses RunExpiredError for terminal runs.
656
- if (data.eventType === 'step_created' ||
657
- data.eventType === 'hook_created' ||
658
- data.eventType === 'wait_created' ||
659
- lazyStepStart) {
640
+ if (createsChildEntity) {
660
641
  throw new EntityConflictError(`Cannot create new entities on run in terminal state "${currentRun.status}"`);
661
642
  }
662
643
  if (data.eventType === 'attr_set') {
@@ -666,13 +647,8 @@ export function createEventsStorage(basedir, tag) {
666
647
  // Step-related event validation (ordering and terminal state)
667
648
  // Store existingStep so we can reuse it later (avoid double read)
668
649
  let validatedStep = null;
669
- const stepEvents = [
670
- 'step_started',
671
- 'step_completed',
672
- 'step_failed',
673
- 'step_retrying',
674
- ];
675
- if (stepEvents.includes(data.eventType) && data.correlationId) {
650
+ const stepEventRequiresExistingStep = isStepEventType(data.eventType) && data.eventType !== 'step_created';
651
+ if (stepEventRequiresExistingStep && data.correlationId) {
676
652
  const stepCompositeKey = `${effectiveRunId}-${data.correlationId}`;
677
653
  validatedStep = await readJSONWithFallback(basedir, 'steps', stepCompositeKey, StepSchema, tag);
678
654
  // Event ordering: step must exist before these events — except on
@@ -708,8 +684,7 @@ export function createEventsStorage(basedir, tag) {
708
684
  }
709
685
  }
710
686
  // Hook-related event validation (ordering)
711
- const hookEventsRequiringExistence = ['hook_disposed', 'hook_received'];
712
- if (hookEventsRequiringExistence.includes(data.eventType) &&
687
+ if (isHookEventRequiringExistence(data.eventType) &&
713
688
  data.correlationId) {
714
689
  // A resume must never be journaled after the hook's disposal.
715
690
  // The disposer's durable order is: dispose lock → claim/entity
@@ -750,10 +725,10 @@ export function createEventsStorage(basedir, tag) {
750
725
  // preserved for the client replay consumer's step-name divergence
751
726
  // check (packages/core/src/step.ts).
752
727
  if (lazyStepStart &&
753
- 'eventData' in event &&
728
+ event.eventType === 'step_started' &&
754
729
  event.eventData) {
755
- const { input: _strippedInput, ...rest } = event.eventData;
756
- event.eventData = rest;
730
+ const { input: _strippedInput, ...eventData } = event.eventData;
731
+ event = { ...event, eventData };
757
732
  }
758
733
  // Track entity created/updated for EventResult
759
734
  let run;
@@ -1671,8 +1646,7 @@ export function createEventsStorage(basedir, tag) {
1671
1646
  // not loop boundaries (the loop fetches after step_completed /
1672
1647
  // step_failed), and run-terminal events end the loop. `resolveData`
1673
1648
  // matches the list path so eventData refs are handled identically.
1674
- if ((data.eventType === 'step_completed' ||
1675
- data.eventType === 'step_failed') &&
1649
+ if (isTerminalStepEventType(data.eventType) &&
1676
1650
  typeof params?.sinceCursor === 'string') {
1677
1651
  // Intentionally no `limit`: this returns a single default-size page,
1678
1652
  // unlike the `events.list` path which loops `while (hasMore)` to
@@ -1780,4 +1754,4 @@ export function createEventsStorage(basedir, tag) {
1780
1754
  },
1781
1755
  };
1782
1756
  }
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==
1757
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDViwwQkFBMEIsRUFDMUIsNkJBQTZCLEVBQzdCLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUMzQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQixVQUFVLEVBQ1YsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0QsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixLQUFLLEVBQ0wsY0FBYyxFQUNkLFNBQVMsR0FDVixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEQsT0FBTyxFQUNM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QUFHLE1BQU07b0JBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDOUIsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUN2QztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBIb29rTm90Rm91bmRFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBSdW5Ob3RTdXBwb3J0ZWRFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhvb2ssXG4gIFNlcmlhbGl6ZWREYXRhLFxuICBTdGVwLFxuICBTdG9yYWdlLFxuICBXYWl0LFxuICBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGFwcGx5QXR0cmlidXRlQ2hhbmdlcyxcbiAgRXZlbnRTY2hlbWEsXG4gIEhvb2tTY2hlbWEsXG4gIGlzQ2hpbGRFbnRpdHlDcmVhdGlvbkV2ZW50LFxuICBpc0hvb2tFdmVudFJlcXVpcmluZ0V4aXN0ZW5jZSxcbiAgaXNIb29rTGlmZWN5Y2xlRXZlbnRUeXBlLFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBpc1N0ZXBFdmVudFR5cGUsXG4gIGlzVGVybWluYWxSdW5FdmVudFR5cGUsXG4gIGlzVGVybWluYWxTdGVwRXZlbnRUeXBlLFxuICBpc1Rlcm1pbmFsU3RlcFN0YXR1cyxcbiAgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzLFxuICByZXF1aXJlc05ld2VyV29ybGQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTdGVwU2NoZW1hLFxuICB1bGlkVG9EYXRlLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG4gIHZhbGlkYXRlVWxpZFRpbWVzdGFtcCxcbiAgV2FpdFNjaGVtYSxcbiAgV29ya2Zsb3dSdW5TY2hlbWEsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTiB9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBhc3NlcnRTYWZlRW50aXR5SWQsXG4gIGRlbGV0ZUpTT04sXG4gIGpzb25SZXBsYWNlcixcbiAganNvblJldml2ZXIsXG4gIGxpc3RKU09ORmlsZXMsXG4gIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSxcbiAgcmVhZEpTT04sXG4gIHJlYWRKU09OV2l0aEZhbGxiYWNrLFxuICByZXNvbHZlV2l0aGluQmFzZSxcbiAgdGFnZ2VkUGF0aCxcbiAgd3JpdGUsXG4gIHdyaXRlRXhjbHVzaXZlLFxuICB3cml0ZUpTT04sXG59IGZyb20gJy4uL2ZzLmpzJztcbmltcG9ydCB7IHN0cmlwRXZlbnREYXRhUmVmcyB9IGZyb20gJy4vZmlsdGVycy5qcyc7XG5pbXBvcnQge1xuICBnZXRPYmplY3RDcmVhdGVkQXQsXG4gIGhvb2tEaXNwb3NlTG9ja1BhdGgsXG4gIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgsXG4gIGhvb2tUb2tlbkNsYWltUGF0aCxcbiAgaXNIb29rRGlzcG9zYWxDb21taXR0ZWQsXG4gIG1vbm90b25pY1VsaWQsXG4gIHJlbGVhc2VIb29rVG9rZW5DbGFpbUlmT3duZWRCeSxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGRlbGV0ZUhvb2tCeVJ1bk1hcmtlcixcbiAgd3JpdGVIb29rQnlSdW5NYXJrZXIsXG4gIHdyaXRlSG9va0NyZWF0ZWRJbmRleEVudHJpZXMsXG59IGZyb20gJy4vaG9vay1pbmRleC5qcyc7XG5pbXBvcnQge1xuICBkZWxldGVBbGxIb29rc0ZvclJ1bixcbiAgcmVidWlsZExpdmVIb29rQnlUb2tlbkZyb21FdmVudExvZyxcbn0gZnJvbSAnLi9ob29rcy1zdG9yYWdlLmpzJztcbmltcG9ydCB7IGhhbmRsZUxlZ2FjeUV2ZW50IH0gZnJvbSAnLi9sZWdhY3kuanMnO1xuaW1wb3J0IHsgd2l0aFJ1bkZpbGVMb2NrIH0gZnJvbSAnLi9ydW5zLXN0b3JhZ2UuanMnO1xuXG4vKipcbiAqIFBlci1zdGVwIGluLXByb2Nlc3MgYXN5bmMgbXV0ZXguIFNlcmlhbGl6ZXMgY29uY3VycmVudCBgZXZlbnRzLmNyZWF0ZWAgY2FsbHNcbiAqIHRoYXQgdGFyZ2V0IHRoZSBzYW1lIHN0ZXAsIHNvIHRoYXQgdGhlIFwiY2hlY2sgdGVybWluYWwgc3RhdGUsIHRoZW4gd3JpdGUgc3RlcFxuICogZW50aXR5ICsgZXZlbnRcIiBzZXF1ZW5jZSBpcyBhdG9taWMuIFdpdGhvdXQgdGhpcywgdHdvIGNvbmN1cnJlbnQgc3RlcF9zdGFydGVkXG4gKiBjYWxscyBjYW4gYm90aCBwYXNzIHRoZSBub3QtdGVybWluYWwgY2hlY2sgYW5kIGJvdGggd3JpdGUgc3RlcF9zdGFydGVkIGV2ZW50c1xuICog4oCUIG9yIGEgc3RlcF9zdGFydGVkIGNhbiBsYW5kIGluIHRoZSBsb2cgYWZ0ZXIgc3RlcF9jb21wbGV0ZWQgaGFzIGFscmVhZHlcbiAqIHdyaXR0ZW4sIHByb2R1Y2luZyB1bmNvbnN1bWVkIGV2ZW50cyBvbiByZXBsYXkuXG4gKlxuICogRHVwbGljYXRlIHN0ZXBfc3RhcnRlZCBldmVudHMgZm9yIGEgbm9uLXRlcm1pbmFsIHN0ZXAgYXJlIHN0aWxsIGFsbG93ZWRcbiAqIChyZXRyaWVzIGxlZ2l0aW1hdGVseSByZS1zdGFydCBhIHN0ZXApLCBvbmx5IHdyaXRlcyB0byBhbiBhbHJlYWR5LXRlcm1pbmFsXG4gKiBzdGVwIGFyZSByZWplY3RlZC5cbiAqL1xuLy8gYHN0ZXBMb2Nrc2AgYW5kIGBob29rTG9ja3NgIGFyZSBub3cgaW5zdGFudGlhdGVkIHBlclxuLy8gYGNyZWF0ZUV2ZW50c1N0b3JhZ2VgIGNhbGwgKHNlZSBpbnNpZGUgdGhlIGZ1bmN0aW9uKSByYXRoZXIgdGhhblxuLy8gYmVpbmcgbW9kdWxlLWxldmVsLiBUaGUgb24tZGlzayBjb25zdHJhaW50IC8gY2xhaW0gZmlsZXMgcmVtYWluXG4vLyB0aGUgZHVyYWJsZSBzb3VyY2Ugb2YgdHJ1dGggYWNyb3NzIHByb2Nlc3NlczsgdGhlIGluLXByb2Nlc3Ncbi8vIG11dGV4IGlzIGEgcGVyLWluc3RhbmNlIG9wdGltaXphdGlvbiB0aGF0IGNsb3NlcyBhIHNob3J0IHJhY2Vcbi8vIHdpbmRvdyBpbiB0aGUgZGVkdXAtcmVjb3ZlcnkgcGF0aC4gUGVyLWluc3RhbmNlIHNjb3BpbmcgbGV0c1xuLy8gdGVzdHMgc2ltdWxhdGUgY3Jvc3MtcHJvY2VzcyBiZWhhdmlvciB3aXRoIHR3byBzdG9yYWdlIGluc3RhbmNlc1xuLy8gc2hhcmluZyBvbmUgZGF0YSBkaXJlY3RvcnkgKGVhY2ggaW5zdGFuY2UgaGFzIGluZGVwZW5kZW50IGxvY2tzXG4vLyBidXQgYSBzaGFyZWQgZmlsZXN5c3RlbSksIGV4YWN0bHkgbWF0Y2hpbmcgdGhlIGNyb3NzLXByb2Nlc3Ncbi8vIHNlbWFudGljcyB3aXRob3V0IHNwYXduaW5nIHN1YnByb2Nlc3Nlcy5cblxuY29uc3QgSG9va1Rva2VuQ2xhaW1TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8vIFRoZSB0b2tlbi1jbGFpbSB3cml0ZXIgYmVsb3cgaGFzIGFsd2F5cyBwZXJzaXN0ZWQgYGhvb2tJZGAsIGJ1dFxuICAvLyB0aGlzIHJlYWQgc2NoZW1hIHByZXZpb3VzbHkgb21pdHRlZCBpdCwgd2hpY2ggaXMgdGhlIGJ1ZyBmaXhlZFxuICAvLyBieSBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2lzc3Vlcy8yMjgzLiBgb3B0aW9uYWwoKWBcbiAgLy8gaXMgZGVmZW5zaXZlOiBhbnkgY2xhaW0gZmlsZSB0aGF0IHNvbWVob3cgbGFja3MgdGhlIGZpZWxkIHN0aWxsXG4gIC8vIHBhcnNlcyAoeWllbGRpbmcgYHVuZGVmaW5lZGApIGFuZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBjcm9zcy1cbiAgLy8gaG9vayBjb25mbGljdCBicmFuY2gsIG1hdGNoaW5nIHByZS1maXggYmVoYXZpb3IuXG4gIGhvb2tJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBydW5JZDogei5zdHJpbmcoKSxcbiAgLy8gYGV2ZW50SWRgIGlzIHRoZSBjYW5vbmljYWwgaG9va19jcmVhdGVkIGV2ZW50IElEIHRoZSBjbGFpbWluZ1xuICAvLyB3b3JrZXIgY29tbWl0dGVkIHRvIHB1Ymxpc2hpbmcuIFBlcnNpc3RpbmcgaXQgaGVyZSB0dXJucyB0aGVcbiAgLy8gY2xhaW0gZmlsZSBpbnRvIGEgZHVyYWJsZSBjb252ZXJnZW5jZSBrZXkgZm9yIGNyb3NzLXdvcmtlciAvXG4gIC8vIGNyb3NzLXByb2Nlc3MgcmV0cmllcyAoc2VlIGNvbW1lbnQgb24gdGhlIGhvb2tfY3JlYXRlZCBicmFuY2gpLlxuICAvLyBgb3B0aW9uYWwoKWAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGEgbGVnYWN5IGNsYWltIGZpbGVcbiAgLy8gd3JpdHRlbiBiZWZvcmUgdGhpcyBmaWVsZCBleGlzdGVkIGZhbGxzIHRocm91Z2ggdG8gdGhlIHJlY292ZXJ5LVxuICAvLyBtYXJrZXIgdXBncmFkZSBwYXRoLCB3aGljaCBhdG9taWNhbGx5IHBpbnMgYSBjYW5vbmljYWwgZXZlbnRJZFxuICAvLyB2aWEgYSBzaWRlY2FyIG1hcmtlciAoYWxzbyBhIGB3cml0ZUV4Y2x1c2l2ZWApLlxuICBldmVudElkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBTaWRlY2FyIHJlY292ZXJ5IG1hcmtlciB0aGF0IHBpbnMgYSBjYW5vbmljYWwgYGhvb2tfY3JlYXRlZGBcbiAqIGV2ZW50SWQgZm9yIGEgbGVnYWN5IHRva2VuIGNsYWltIOKAlCBvbmUgd3JpdHRlbiBieSBhIHZlcnNpb24gb2ZcbiAqIHRoaXMgc3RvcmFnZSB0aGF0IGRpZCBub3QgeWV0IHBlcnNpc3QgYGV2ZW50SWRgIGlubGluZSBpbiB0aGVcbiAqIGNsYWltIGZpbGUuIFdpdGhvdXQgdGhpcyBtYXJrZXIsIHR3byBjcm9zcy1wcm9jZXNzIHJldHJpZXNcbiAqIHJlYWRpbmcgYSBsZWdhY3kgY2xhaW0gZWFjaCBnZW5lcmF0ZSB0aGVpciBvd24gZXZlbnRJZCwgbGFuZFxuICogdGhlaXIgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGNhbGxzIGF0IGRpZmZlcmVudCBwYXRocywgYW5kXG4gKiBhcHBlbmQgdHdvIGBob29rX2NyZWF0ZWRgIGV2ZW50cyBmb3IgdGhlIHNhbWUgYChydW5JZCwgaG9va0lkKWAuXG4gKlxuICogVGhlIG1hcmtlciBpcyB3cml0dGVuIHZpYSBgd3JpdGVFeGNsdXNpdmVgIOKAlCB0aGUgZmlyc3QgcmV0cnkgdG9cbiAqIGxhbmQgaXQgcGlucyBpdHMgY2FuZGlkYXRlIGV2ZW50SWQgYXMgY2Fub25pY2FsLCBhbmQgZXZlcnlcbiAqIHN1YnNlcXVlbnQgcmV0cnkgcmVhZHMgYW5kIGFkb3B0cyB0aGF0IGV2ZW50SWQgYmVmb3JlIHRoZSBjb21tb25cbiAqIGV2ZW50IHB1Ymxpc2guIFNjaGVtYSBpcyBqdXN0IGB7IGV2ZW50SWQgfWAgYmVjYXVzZSBpZGVudGl0eSBpc1xuICogYWxyZWFkeSBlbmNvZGVkIGluIHRoZSBtYXJrZXIncyBmaWxlbmFtZSBoYXNoLCBzbyBkaWZmZXJlbnQgdG9rZW5cbiAqIGxpZmV0aW1lcyBjYW4gbmV2ZXIgc2hhcmUgb25lIG1hcmtlciAoc2VlXG4gKiBgaG9va1JlY292ZXJ5TWFya2VyUGF0aGApLlxuICovXG5jb25zdCBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGV2ZW50SWQ6IHouc3RyaW5nKCksXG59KTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZEhvb2tUb2tlbkNsYWltKFxuICBjb25zdHJhaW50UGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHouaW5mZXI8dHlwZW9mIEhvb2tUb2tlbkNsYWltU2NoZW1hPiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZEpTT04oY29uc3RyYWludFBhdGgsIEhvb2tUb2tlbkNsYWltU2NoZW1hKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB0b2tlbiBjbGFpbSBoZWxkIGJ5IGFub3RoZXIgYChydW5JZCwgaG9va0lkKWAgY2FuIG5ldmVyIGJlY29tZVxuICogbGl2ZSBhZ2FpbiBhbmQgbWF5IHRoZXJlZm9yZSBiZSByZWxlYXNlZCBieSBhIG5ldyBjbGFpbWFudDpcbiAqXG4gKiAgIC0gdGhlIGNsYWltZWQgaG9vaydzIGRpc3Bvc2FsIGlzIGNvbW1pdHRlZCAoaXRzIGRpc3Bvc2UgbG9jayBleGlzdHMg4oCUXG4gKiAgICAgdGhlIGR1cmFibGUgcmVsZWFzZSBvZiB0aGUgY2xhaW0gZmlsZSBqdXN0IGhhc24ndCBsYW5kZWQgeWV0LCBvciB3YXNcbiAqICAgICBsb3N0IHRvIGEgY3Jhc2ggYmV0d2VlbiB0aGUgbG9jayB3cml0ZSBhbmQgdGhlIGNsYWltIGRlbGV0ZSksIG9yXG4gKiAgIC0gdGhlIG93bmluZyBydW4gaXMgdGVybWluYWwgKHRoZSBydW4tY29tcGxldGlvbiBjbGVhbnVwIHJlbGVhc2VzIGFsbFxuICogICAgIG9mIHRoZSBydW4ncyBjbGFpbXMsIGJ1dCBhIGNsYWltYW50IGNhbiBvYnNlcnZlIHRoZSBjbGFpbSBpbiB0aGVcbiAqICAgICB3aW5kb3cgYmVmb3JlIHRoYXQgY2xlYW51cCBsYW5kcyDigJQgb3IgdGhlIGNsZWFudXAgY3Jhc2hlZCksIG9yXG4gKiAgIC0gdGhlIG93bmluZyBydW4gZG9lcyBub3QgZXhpc3QgKGEgY2xhaW0gY2FuIG9ubHkgYmUgd3JpdHRlbiBkdXJpbmcgYVxuICogICAgIHN1c3BlbnNpb24gb2YgYW4gZXhpc3RpbmcgcnVuLCBzbyBhbiBvd25lcmxlc3MgY2xhaW0gaXMgZGVicmlzKS5cbiAqXG4gKiBBIGNsYWltIGZyb20gYSBtaWQtY3JlYXRpb24gd3JpdGVyIGlzIG5ldmVyIHJlbGVhc2FibGU6IGl0cyBvd25pbmcgcnVuXG4gKiBleGlzdHMgYW5kIGlzIG5vbi10ZXJtaW5hbCwgYW5kIGl0cyBkaXNwb3NlIGxvY2sgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzSG9va1Rva2VuQ2xhaW1SZWxlYXNhYmxlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGNsYWltOiB6LmluZmVyPHR5cGVvZiBIb29rVG9rZW5DbGFpbVNjaGVtYT4sXG4gIHRhZz86IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChcbiAgICBjbGFpbS5ob29rSWQgJiZcbiAgICAoYXdhaXQgaXNIb29rRGlzcG9zYWxDb21taXR0ZWQoYmFzZWRpciwgY2xhaW0uaG9va0lkLCB0YWcpKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBvd25pbmdSdW4gPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICBiYXNlZGlyLFxuICAgICdydW5zJyxcbiAgICBjbGFpbS5ydW5JZCxcbiAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKCFvd25pbmdSdW4pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKG93bmluZ1J1bi5zdGF0dXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkSG9va1JlY292ZXJ5TWFya2VyKFxuICBtYXJrZXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgSG9va1JlY292ZXJ5TWFya2VyU2NoZW1hPiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZEpTT04obWFya2VyUGF0aCwgSG9va1JlY292ZXJ5TWFya2VyU2NoZW1hKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFByb2JlIHRoZSBydW4ncyBldmVudCBsb2cgZm9yIGFuIGV4aXN0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50XG4gKiB3aXRoIHRoZSBnaXZlbiBjb3JyZWxhdGlvbklkLiBVc2VkIGJ5IHRoZSBsZWdhY3ktY2xhaW0gcmVjb3ZlcnlcbiAqIHBhdGggdG8gZGV0ZWN0IFwiYWxyZWFkeSBwdWJsaXNoZWQgYnkgYSBwcmUtdXBncmFkZSB3cml0ZVwiIGJlZm9yZVxuICogcGlubmluZyBhIGNhbm9uaWNhbCBldmVudElkIOKAlCB3aXRob3V0IHRoaXMgY2hlY2ssIGEgcG9zdC11cGdyYWRlXG4gKiByZXRyeSBlbmNvdW50ZXJpbmcgYSBsZWdhY3kgY2xhaW0gd2hvc2UgYGhvb2tfY3JlYXRlZGAgd2FzXG4gKiBhbHJlYWR5IHdyaXR0ZW4gKHdpdGggdGhlIHByZS11cGdyYWRlIHdyaXRlcidzIG93biBldmVudElkKSB3b3VsZFxuICogcGluIGEgKmRpZmZlcmVudCogZXZlbnRJZCB2aWEgdGhlIG1hcmtlciBhbmQgcHVibGlzaCBhIGR1cGxpY2F0ZVxuICogZXZlbnQgYXQgdGhlIG1hcmtlcidzIHBhdGguXG4gKlxuICogVGhlIGlubGluZS1gZXZlbnRJZGAgZmFzdCBwYXRoIGRvZXMgTk9UIG5lZWQgdGhpcyBwcm9iZTogdGhlXG4gKiBjYW5vbmljYWwgZXZlbnRJZCBpcyBkdXJhYmxlIGluIHRoZSBjbGFpbSBmaWxlLCBzbyB0aGUgZXhpc3RpbmdcbiAqIHB1Ymxpc2ggKGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCkgd2lsbCBmYWlsIGlmZiB0aGUgZXZlbnRcbiAqIGFscmVhZHkgZXhpc3RzIGF0IHRoYXQgZXhhY3QgcGF0aCDigJQgd2hpY2ggaXMgdGhlIGNvcnJlY3RcbiAqIFwiYWxyZWFkeS1wdWJsaXNoZWRcIiBzZW1hbnRpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZEV4aXN0aW5nSG9va0NyZWF0ZWRFdmVudElkKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgZmlsZVByZWZpeDogYCR7cnVuSWR9LWAsXG4gICAgZmlsdGVyOiAoZXZlbnQpID0+XG4gICAgICBldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmXG4gICAgICBldmVudC5jb3JyZWxhdGlvbklkID09PSBjb3JyZWxhdGlvbklkLFxuICAgIGxpbWl0OiAxLFxuICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgZ2V0SWQ6IChldmVudCkgPT4gZXZlbnQuZXZlbnRJZCxcbiAgfSk7XG4gIHJldHVybiByZXN1bHQuZGF0YVswXT8uZXZlbnRJZCA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlcGFpciBhbiBcImV2ZW50LWZpcnN0IG9ycGhhblwiOiB0aGUgaG9vayBlbnRpdHkgd3JpdGUgaXMgZGVmZXJyZWRcbiAqIHVudGlsIGFmdGVyIHRoZSBgaG9va19jcmVhdGVkYCBldmVudCBwdWJsaXNoIGNvbW1pdHMgKHNvIGEgZmFpbGVkXG4gKiBwdWJsaXNoIGNhbm5vdCBtdXRhdGUgYWxyZWFkeS1jb21taXR0ZWQgc3RhdGUg4oCUIHNlZSB0aGUgY29tbWVudCBvblxuICogdGhlIGRlZmVycmVkIHdyaXRlKSwgd2hpY2ggb3BlbnMgdGhlIGludmVyc2UgY3Jhc2ggd2luZG93IOKAlCBhXG4gKiBjcmFzaCBBRlRFUiB0aGUgZXZlbnQgcHVibGlzaCBidXQgQkVGT1JFIHRoZSBkZWZlcnJlZCBlbnRpdHkgd3JpdGVcbiAqIGxlYXZlcyB0aGUgZXZlbnQgaW4gdGhlIGxvZyB3aXRoIHRoZSBob29rIGVudGl0eSBtaXNzaW5nLiBBIHJldHJ5XG4gKiB0aGVuIGNvbGxpZGVzIGF0IHRoZSBldmVudCBwdWJsaXNoIGFuZCB0aHJvd3NcbiAqIGBFbnRpdHlDb25mbGljdEVycm9yYCAoY29ycmVjdCDigJQgdGhlIGV2ZW50IElTIGNvbW1pdHRlZCksIGJ1dFxuICogd2l0aG91dCB0aGlzIHJlcGFpciB0aGUgZW50aXR5IHdvdWxkIHN0YXkgbWlzc2luZyBmb3JldmVyIGFuZCB0aGVcbiAqIGhvb2sgd291bGQgYmUgdW5yZXNvbHZhYmxlLlxuICpcbiAqIFRoZSBlbnRpdHkgTVVTVCBiZSByZWNvbnN0cnVjdGVkIGZyb20gdGhlIHBlcnNpc3RlZCBjYW5vbmljYWxcbiAqIGV2ZW50J3MgcGF5bG9hZCDigJQgTk9UIHRoZSByZXRyeSdzIGBldmVudERhdGFgIOKAlCBvdGhlcndpc2UgYSByZXRyeVxuICogY2FycnlpbmcgZGlmZmVyZW50IGBtZXRhZGF0YWAgLyBgaXNXZWJob29rYCB3b3VsZCBzaWxlbnRseSBjaGFuZ2VcbiAqIGNvbW1pdHRlZCBzdGF0ZS4gVGhlIHdyaXRlIHVzZXMgYHdyaXRlRXhjbHVzaXZlYCAoY3JlYXRlLWlmLWFic2VudClcbiAqIHNvIGEgY29uY3VycmVudCB3cml0ZXIgcmFjaW5nIHRoaXMgcmVwYWlyIGNhbm5vdCBiZSBvdmVyd3JpdHRlbjtcbiAqIHdoaWNoZXZlciB3cml0ZSBsYW5kcyBmaXJzdCwgdGhlIGNvbnRlbnQgaXMgaWRlbnRpY2FsIGJlY2F1c2UgYm90aFxuICogZGVyaXZlIGZyb20gdGhlIHNhbWUgcGVyc2lzdGVkIGV2ZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhvb2tJZDogc3RyaW5nLFxuICBwZXJzaXN0ZWRFdmVudElkOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7cGVyc2lzdGVkRXZlbnRJZH1gO1xuICBjb25zdCBwZXJzaXN0ZWRFdmVudCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ2V2ZW50cycsXG4gICAgY29tcG9zaXRlS2V5LFxuICAgIEV2ZW50U2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICBpZiAoXG4gICAgIXBlcnNpc3RlZEV2ZW50IHx8XG4gICAgcGVyc2lzdGVkRXZlbnQuZXZlbnRUeXBlICE9PSAnaG9va19jcmVhdGVkJyB8fFxuICAgIHBlcnNpc3RlZEV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGhvb2tJZFxuICApIHtcbiAgICAvLyBOb3RoaW5nIHRydXN0d29ydGh5IHRvIHJlcGFpciBmcm9tLlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICBiYXNlZGlyLFxuICAgICdob29rcycsXG4gICAgaG9va0lkLFxuICAgIEhvb2tTY2hlbWEsXG4gICAgdGFnXG4gICk7XG4gIGlmIChleGlzdGluZ0hvb2spIHtcbiAgICAvLyBFbnRpdHkgYWxyZWFkeSBwcmVzZW50IOKAlCBub3QgYW4gb3JwaGFuLCBsZWF2ZSBpdCB1bnRvdWNoZWQuXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV2ZW50RGF0YSA9IChwZXJzaXN0ZWRFdmVudC5ldmVudERhdGEgPz8ge30pIGFzIHtcbiAgICB0b2tlbj86IHN0cmluZztcbiAgICBtZXRhZGF0YT86IFNlcmlhbGl6ZWREYXRhO1xuICAgIGlzV2ViaG9vaz86IGJvb2xlYW47XG4gICAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICB9O1xuICBpZiAodHlwZW9mIGV2ZW50RGF0YS50b2tlbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaG9vazogSG9vayA9IHtcbiAgICBydW5JZCxcbiAgICBob29rSWQsXG4gICAgdG9rZW46IGV2ZW50RGF0YS50b2tlbixcbiAgICBtZXRhZGF0YTogZXZlbnREYXRhLm1ldGFkYXRhLFxuICAgIG93bmVySWQ6ICdsb2NhbC1vd25lcicsXG4gICAgcHJvamVjdElkOiAnbG9jYWwtcHJvamVjdCcsXG4gICAgZW52aXJvbm1lbnQ6ICdsb2NhbCcsXG4gICAgY3JlYXRlZEF0OiBwZXJzaXN0ZWRFdmVudC5jcmVhdGVkQXQsXG4gICAgc3BlY1ZlcnNpb246IHBlcnNpc3RlZEV2ZW50LnNwZWNWZXJzaW9uLFxuICAgIGlzV2ViaG9vazogZXZlbnREYXRhLmlzV2ViaG9vayA/PyB0cnVlLFxuICAgIGlzU3lzdGVtOiBldmVudERhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gIH07XG4gIC8vIFRoaXMgcGF0aCBjYW4gcmVwYWlyIGV2ZW50cyBwdWJsaXNoZWQgYnkgcHJlLWluZGV4IHdyaXRlcnMsIHNvXG4gIC8vIChpZGVtcG90ZW50bHkpIGluZGV4IHRoZSBwZXJzaXN0ZWQgZXZlbnQgYmVmb3JlIHRoZSBlbnRpdHkgd3JpdGUuXG4gIGF3YWl0IHdyaXRlSG9va0NyZWF0ZWRJbmRleEVudHJpZXMoXG4gICAgYmFzZWRpcixcbiAgICBldmVudERhdGEudG9rZW4sXG4gICAgcnVuSWQsXG4gICAgaG9va0lkLFxuICAgIHBlcnNpc3RlZEV2ZW50SWQsXG4gICAgdGFnXG4gICk7XG4gIGF3YWl0IHdyaXRlSG9va0J5UnVuTWFya2VyKGJhc2VkaXIsIHJ1bklkLCBob29rSWQsIHRhZyk7XG4gIGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2hvb2tzJywgaG9va0lkLCB0YWcpLFxuICAgIEpTT04uc3RyaW5naWZ5KGhvb2ssIGpzb25SZXBsYWNlciwgMilcbiAgKTtcbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IHBpbiBhIGNhbm9uaWNhbCBgaG9va19jcmVhdGVkYCBldmVudElkIGZvciBhIGxlZ2FjeVxuICogY2xhaW0gKG9uZSB3aXRob3V0IGFuIGlubGluZSBgZXZlbnRJZGApLiBUaGUgZmlyc3QgcmV0cnkgdG9cbiAqIGB3cml0ZUV4Y2x1c2l2ZWAgdGhlIHJlY292ZXJ5IG1hcmtlciB3aW5zOyBpdHMgYGNhbmRpZGF0ZUV2ZW50SWRgXG4gKiBiZWNvbWVzIGNhbm9uaWNhbC4gU3Vic2VxdWVudCByZXRyaWVzIHJlYWQgdGhlIG1hcmtlciBhbmQgYWRvcHRcbiAqIGl0cyBgZXZlbnRJZGAuIFRvZ2V0aGVyIHdpdGggdGhlIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBpblxuICogdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2gsIHRoaXMgZ2l2ZXMgdGhlIGxlZ2FjeS1mYWxsYmFjayBwYXRoIHRoZVxuICogc2FtZSBzaW5nbGUtZXZlbnQgY29udmVyZ2VuY2UgZ3VhcmFudGVlIGFzIHRoZSBpbmxpbmUtYGV2ZW50SWRgXG4gKiBmYXN0IHBhdGguXG4gKlxuICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGV2ZW50SWQgZm9yIHRoZSBjYWxsZXIgdG8gYWRvcHQsIG9yIGBudWxsYFxuICogaWYgd2UgbG9zdCB0aGUgbWFya2VyIHJhY2UgQU5EIHRoZSByZXN1bHRpbmcgbWFya2VyIGZpbGUgaXNcbiAqIHVucmVhZGFibGUgKGV4dHJlbWVseSByYXJlOyBjb3JydXB0ZWQgZGlzaykuIENhbGxlcnMgdHJlYXQgYG51bGxgXG4gKiBhcyBcImdpdmUgdXAsIHRocm93IGBFbnRpdHlDb25mbGljdEVycm9yYFwiIHNvIHRoZSBydW50aW1lJ3NcbiAqIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggc3dhbGxvd3MgdGhpcyBhdHRlbXB0IGFuZCBsZXRzXG4gKiBhbm90aGVyIG9uZSB0aHJvdWdoLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaW5DYW5vbmljYWxFdmVudElkRm9yTGVnYWN5Q2xhaW0oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgdG9rZW46IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIGNhbmRpZGF0ZUV2ZW50SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IG1hcmtlclBhdGggPSBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKGJhc2VkaXIsIHRva2VuLCBydW5JZCwgaG9va0lkKTtcbiAgY29uc3QgbWFya2VyQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHsgZXZlbnRJZDogY2FuZGlkYXRlRXZlbnRJZCB9KTtcbiAgY29uc3Qgd29uID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobWFya2VyUGF0aCwgbWFya2VyQ29udGVudCk7XG4gIGlmICh3b24pIHtcbiAgICByZXR1cm4gY2FuZGlkYXRlRXZlbnRJZDtcbiAgfVxuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRIb29rUmVjb3ZlcnlNYXJrZXIobWFya2VyUGF0aCk7XG4gIHJldHVybiBleGlzdGluZz8uZXZlbnRJZCA/PyBudWxsO1xufVxuXG4vKipcbiAqIEluLXByb2Nlc3MgcGVyLWtleSBhc3luYyBtdXRleCBiYWNrZWQgYnkgYSBjYWxsZXItc3VwcGxpZWQgYE1hcGAuXG4gKiBVc2VkIGJ5IGBjcmVhdGVFdmVudHNTdG9yYWdlYCB0byBzZXJpYWxpemUgc2FtZS1rZXkgZXZlbnQgd3JpdGVzXG4gKiAoYHN0ZXBfKmAgZm9yIHRoZSBzYW1lIHN0ZXAsIGBob29rX2NyZWF0ZWRgIGZvciB0aGUgc2FtZSBob29rKS5cbiAqIFRoZSBtYXAgaXMgaW5zdGFudGlhdGVkIHBlci1zdG9yYWdlLWluc3RhbmNlIOKAlCBkaWZmZXJlbnRcbiAqIGluc3RhbmNlcyBkbyBOT1Qgc2hhcmUgbG9ja3MsIHNvIHR3byBpbnN0YW5jZXMgc2hhcmluZyBvbmUgZGF0YVxuICogZGlyZWN0b3J5IGJlaGF2ZSBleGFjdGx5IGxpa2UgdHdvIHNlcGFyYXRlIE9TIHByb2Nlc3NlcyBmcm9tIHRoZVxuICogbG9ja2luZyBzdGFuZHBvaW50LiBDcm9zcy1pbnN0YW5jZSAvIGNyb3NzLXByb2Nlc3MgYXJiaXRyYXRpb25cbiAqIHJlbGllcyBvbiB0aGUgb24tZGlzayBjb25zdHJhaW50IC8gY2xhaW0gZmlsZXMgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gd2l0aEluUHJvY2Vzc0xvY2s8VD4oXG4gIGxvY2tzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PixcbiAga2V5OiBzdHJpbmcsXG4gIGZuOiAoKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcHJldiA9IGxvY2tzLmdldChrZXkpO1xuICBjb25zdCB0YXNrQm94OiB7IHRhc2s/OiBQcm9taXNlPFQ+IH0gPSB7fTtcbiAgY29uc3QgdGFzayA9IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBwcmV2aW91cyB0YXNrIHRvIHNldHRsZTsgZG9uJ3QgaW5oZXJpdCBpdHMgZXJyb3JzLlxuICAgICAgYXdhaXQgcHJldi5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChsb2Nrcy5nZXQoa2V5KSA9PT0gdGFza0JveC50YXNrKSB7XG4gICAgICAgIGxvY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcbiAgdGFza0JveC50YXNrID0gdGFzaztcbiAgbG9ja3Muc2V0KGtleSwgdGFzayk7XG4gIHJldHVybiB0YXNrO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYWxsIHdhaXRzIGFzc29jaWF0ZWQgd2l0aCBhIHdvcmtmbG93IHJ1bi5cbiAqIENhbGxlZCB3aGVuIGEgcnVuIHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxsV2FpdHNGb3JSdW4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdhaXRzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICd3YWl0cycpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMod2FpdHNEaXIpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIC8vIGZpbGVJZHMgbWF5IGNvbnRhaW4gdGFnIHN1ZmZpeGVzIChlLmcuLCBcIndydW5fQUJDLWNvcnJJZC52aXRlc3QtMFwiKVxuICAgIC8vIGJ1dCBzdGFydHNXaXRoIHN0aWxsIG1hdGNoZXMgY29ycmVjdGx5IHNpbmNlIHRoZSB0YWcgaXMgYSBzdWZmaXguXG4gICAgaWYgKGZpbGUuc3RhcnRzV2l0aChgJHtydW5JZH0tYCkpIHtcbiAgICAgIGNvbnN0IHdhaXRQYXRoID0gcGF0aC5qb2luKHdhaXRzRGlyLCBgJHtmaWxlfS5qc29uYCk7XG4gICAgICBhd2FpdCBkZWxldGVKU09OKHdhaXRQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEgbGlmZWN5Y2xlLWRyaXZlbiBydW4gdXBkYXRlIChydW5fc3RhcnRlZCAvIHJ1bl9jb21wbGV0ZWQgL1xuICogcnVuX2ZhaWxlZCAvIHJ1bl9jYW5jZWxsZWQpIHVuZGVyIHRoZSBzaGFyZWQgcGVyLXJ1biBmaWxlIGxvY2ssXG4gKiByZS1yZWFkaW5nIHRoZSBvbi1kaXNrIHJ1biBpbnNpZGUgdGhlIGxvY2sgc28gYW55IGF0dHJpYnV0ZSB3cml0ZXNcbiAqIHRoYXQgbGFuZGVkIGJldHdlZW4gdGhlIHByZS12YWxpZGF0aW9uIGBjdXJyZW50UnVuYCByZWFkIGFuZCB0aGlzXG4gKiB3cml0ZSBhcmUgcHJlc2VydmVkLiBXaXRob3V0IHRoZSByZS1yZWFkLCBhbiBgZXhwZXJpbWVudGFsU2V0QXR0cmlidXRlc2BcbiAqIGNhbGwgc2FuZHdpY2hlZCBiZXR3ZWVuIHRoZSBsaWZlY3ljbGUgcmVhZCBhbmQgd3JpdGUgd291bGQgYmVcbiAqIHNpbGVudGx5IG92ZXJ3cml0dGVuIGJ5IHRoZSBsaWZlY3ljbGUgd3JpdGUncyBzdGFsZSBhdHRyaWJ1dGUgc25hcHNob3QuXG4gKlxuICogYHByb3Bvc2VkYCBpcyB0aGUgZnVsbHktY29uc3RydWN0ZWQgcnVuIHJvdyB0aGUgY2FsbGVyIHdhbnRzIHRvXG4gKiB3cml0ZSAod2l0aCB0aGUgY29ycmVjdCBkaXNjcmltaW5hdGVkLXVuaW9uIHN0YXR1cyBicmFuY2gpLiBPbmx5IHRoZVxuICogYGF0dHJpYnV0ZXNgIGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIGZyZXNoZXN0IHZlcnNpb24gaW5zaWRlIHRoZVxuICogbG9jay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2s8VCBleHRlbmRzIFdvcmtmbG93UnVuPihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHJvcG9zZWQ6IFRcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gd2l0aFJ1bkZpbGVMb2NrKHJ1bklkLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCByZWFkSlNPTihcbiAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBydW5JZCwgdGFnKSxcbiAgICAgIFdvcmtmbG93UnVuU2NoZW1hXG4gICAgKTtcbiAgICBjb25zdCBuZXh0OiBUID0ge1xuICAgICAgLi4ucHJvcG9zZWQsXG4gICAgICBhdHRyaWJ1dGVzOiBmcmVzaD8uYXR0cmlidXRlcyA/PyBwcm9wb3NlZC5hdHRyaWJ1dGVzLFxuICAgIH07XG4gICAgYXdhaXQgd3JpdGVKU09OKHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBydW5JZCwgdGFnKSwgbmV4dCwge1xuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBldmVudHMgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZmlsZXN5c3RlbS5cbiAqIEltcGxlbWVudHMgdGhlIFN0b3JhZ2VbJ2V2ZW50cyddIGludGVyZmFjZSB3aXRoIGNyZWF0ZSwgbGlzdCwgYW5kIGxpc3RCeUNvcnJlbGF0aW9uSWQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9jYWxFdmVudHNTdG9yYWdlID0gU3RvcmFnZVsnZXZlbnRzJ10gJiB7XG4gIGNsZWFyQ2FjaGUoKTogdm9pZDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudHNTdG9yYWdlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogTG9jYWxFdmVudHNTdG9yYWdlIHtcbiAgLy8gRXZlbnRzIGFyZSBhcHBlbmQtb25seS4gS2VlcCBhIGJvdW5kZWQgd2luZG93IG9mIGxvY2FsbHkgcGVyc2lzdGVkIGV2ZW50c1xuICAvLyBhdmFpbGFibGUgdG8gaW1tZWRpYXRlIHJlcGxheSB3aXRob3V0IHJlcmVhZGluZyBKU09OIGZpbGVzLiBQYXlsb2FkIGJ5dGVzXG4gIC8vIGFuZCBlbnRyeSBjb3VudCBhcmUgYm90aCBib3VuZGVkIHNvIGFjdGl2ZS93YWl0aW5nIHJ1bnMgY2Fubm90IHJldGFpblxuICAvLyB1bmJvdW5kZWQgaGlzdG9yaWVzIGluIGEgbG9uZy1saXZlZCBkZXZlbG9wbWVudCBzZXJ2ZXIuXG4gIGNvbnN0IG1heENhY2hlZEV2ZW50Qnl0ZXMgPSA0ICogMTAyNCAqIDEwMjQ7XG4gIGNvbnN0IG1heENhY2hlZEV2ZW50RW50cmllcyA9IDEwMDA7XG4gIGNvbnN0IGV2ZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRXZlbnQ+KCk7XG4gIGNvbnN0IGNhY2hlZEV2ZW50Qnl0ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBjb25zdCBjYWNoZWRQYXRoc0J5UnVuSWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIGxldCB0b3RhbENhY2hlZEV2ZW50Qnl0ZXMgPSAwO1xuXG4gIGZ1bmN0aW9uIGRlbGV0ZUNhY2hlZEV2ZW50KGV2ZW50UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQgPSBldmVudENhY2hlLmdldChldmVudFBhdGgpO1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnRDYWNoZS5kZWxldGUoZXZlbnRQYXRoKTtcbiAgICB0b3RhbENhY2hlZEV2ZW50Qnl0ZXMgLT0gY2FjaGVkRXZlbnRCeXRlcy5nZXQoZXZlbnRQYXRoKSA/PyAwO1xuICAgIGNhY2hlZEV2ZW50Qnl0ZXMuZGVsZXRlKGV2ZW50UGF0aCk7XG4gICAgY29uc3QgY2FjaGVkUGF0aHMgPSBjYWNoZWRQYXRoc0J5UnVuSWQuZ2V0KGV2ZW50LnJ1bklkKTtcbiAgICBjYWNoZWRQYXRocz8uZGVsZXRlKGV2ZW50UGF0aCk7XG4gICAgaWYgKGNhY2hlZFBhdGhzPy5zaXplID09PSAwKSB7XG4gICAgICBjYWNoZWRQYXRoc0J5UnVuSWQuZGVsZXRlKGV2ZW50LnJ1bklkKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhclJ1bkNhY2hlKHJ1bklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNhY2hlZFBhdGggb2YgY2FjaGVkUGF0aHNCeVJ1bklkLmdldChydW5JZCkgPz8gW10pIHtcbiAgICAgIGRlbGV0ZUNhY2hlZEV2ZW50KGNhY2hlZFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgZXZlbnRDYWNoZS5jbGVhcigpO1xuICAgIGNhY2hlZEV2ZW50Qnl0ZXMuY2xlYXIoKTtcbiAgICBjYWNoZWRQYXRoc0J5UnVuSWQuY2xlYXIoKTtcbiAgICB0b3RhbENhY2hlZEV2ZW50Qnl0ZXMgPSAwO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FjaGVFdmVudChcbiAgICBldmVudFBhdGg6IHN0cmluZyxcbiAgICBjYWNoZWRFdmVudDogRXZlbnQsXG4gICAgc2VyaWFsaXplZEJ5dGVzOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgaWYgKHNlcmlhbGl6ZWRCeXRlcyA+IG1heENhY2hlZEV2ZW50Qnl0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAoXG4gICAgICBldmVudENhY2hlLnNpemUgPiAwICYmXG4gICAgICAoZXZlbnRDYWNoZS5zaXplID49IG1heENhY2hlZEV2ZW50RW50cmllcyB8fFxuICAgICAgICB0b3RhbENhY2hlZEV2ZW50Qnl0ZXMgKyBzZXJpYWxpemVkQnl0ZXMgPiBtYXhDYWNoZWRFdmVudEJ5dGVzKVxuICAgICkge1xuICAgICAgY29uc3Qgb2xkZXN0UGF0aCA9IGV2ZW50Q2FjaGUua2V5cygpLm5leHQoKS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICBkZWxldGVDYWNoZWRFdmVudChvbGRlc3RQYXRoKTtcbiAgICB9XG5cbiAgICBldmVudENhY2hlLnNldChldmVudFBhdGgsIGNhY2hlZEV2ZW50KTtcbiAgICBjYWNoZWRFdmVudEJ5dGVzLnNldChldmVudFBhdGgsIHNlcmlhbGl6ZWRCeXRlcyk7XG4gICAgdG90YWxDYWNoZWRFdmVudEJ5dGVzICs9IHNlcmlhbGl6ZWRCeXRlcztcbiAgICBjb25zdCBjYWNoZWRQYXRocyA9XG4gICAgICBjYWNoZWRQYXRoc0J5UnVuSWQuZ2V0KGNhY2hlZEV2ZW50LnJ1bklkKSA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjYWNoZWRQYXRocy5hZGQoZXZlbnRQYXRoKTtcbiAgICBjYWNoZWRQYXRoc0J5UnVuSWQuc2V0KGNhY2hlZEV2ZW50LnJ1bklkLCBjYWNoZWRQYXRocyk7XG4gIH1cblxuICAvLyBVcGRhdGUgdGhlIGluLW1lbW9yeSBjYWNoZSBmb3IgYW4gZXZlbnQgdGhhdCB3YXMganVzdCBwZXJzaXN0ZWQgYXRcbiAgLy8gYGV2ZW50UGF0aGAuIGBzZXJpYWxpemVkRXZlbnRgIG11c3QgYmUgdGhlIGV4YWN0IGJ5dGUgcGF5bG9hZCB3cml0dGVuXG4gIC8vIHRvIGRpc2s6IGRlY29kaW5nIGl0IChpbnN0ZWFkIG9mIHRoZSBjYWxsZXIncyBgZXZlbnRgKSBib3RoIGRldGFjaGVzXG4gIC8vIGNhbGxlci1vd25lZCBwYXlsb2FkcyBhbmQgbWF0Y2hlcyBkaXNrLXJlYWQgbm9ybWFsaXphdGlvbi4gQ2FsbGVyc1xuICAvLyBtdXN0IGNhcHR1cmUgYHNlcmlhbGl6ZWRFdmVudGAgKmJlZm9yZSogdGhlIHdyaXRlJ3MgYGF3YWl0YCBzbyB0aGVcbiAgLy8gY2FjaGVkIHNuYXBzaG90IGNhbiBuZXZlciBvYnNlcnZlIGEgbGF0ZXIgbXV0YXRpb24uXG4gIGZ1bmN0aW9uIHJlbWVtYmVyU3RvcmVkRXZlbnQoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGV2ZW50UGF0aDogc3RyaW5nLFxuICAgIHNlcmlhbGl6ZWRFdmVudDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIC8vIFRlcm1pbmFsIHJ1bnMgcmVsZWFzZSB0aGVpciBjYWNoZWQgaGlzdG9yeSBzbyBhIGxvbmctbGl2ZWQgZGV2XG4gICAgLy8gc2VydmVyIGRvZXNuJ3QgcmV0YWluIGNvbXBsZXRlZCBydW5zIGZvcmV2ZXIuXG4gICAgaWYgKGlzVGVybWluYWxSdW5FdmVudFR5cGUoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgY2xlYXJSdW5DYWNoZShldmVudC5ydW5JZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VyaWFsaXplZEJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoc2VyaWFsaXplZEV2ZW50KTtcbiAgICBpZiAoc2VyaWFsaXplZEJ5dGVzID4gbWF4Q2FjaGVkRXZlbnRCeXRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZEV2ZW50ID0gRXZlbnRTY2hlbWEuc2FmZVBhcnNlKFxuICAgICAgSlNPTi5wYXJzZShzZXJpYWxpemVkRXZlbnQsIGpzb25SZXZpdmVyKVxuICAgICk7XG4gICAgaWYgKGNhY2hlZEV2ZW50LnN1Y2Nlc3MpIHtcbiAgICAgIGNhY2hlRXZlbnQoZXZlbnRQYXRoLCBjYWNoZWRFdmVudC5kYXRhLCBzZXJpYWxpemVkQnl0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHN0b3JlRXZlbnQoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXZlbnRQYXRoID0gdGFnZ2VkUGF0aChcbiAgICAgIGJhc2VkaXIsXG4gICAgICAnZXZlbnRzJyxcbiAgICAgIGAke2V2ZW50LnJ1bklkfS0ke2V2ZW50LmV2ZW50SWR9YCxcbiAgICAgIHRhZ1xuICAgICk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEV2ZW50ID0gSlNPTi5zdHJpbmdpZnkoZXZlbnQsIGpzb25SZXBsYWNlciwgMik7XG4gICAgYXdhaXQgd3JpdGUoZXZlbnRQYXRoLCBzZXJpYWxpemVkRXZlbnQpO1xuICAgIHJlbWVtYmVyU3RvcmVkRXZlbnQoZXZlbnQsIGV2ZW50UGF0aCwgc2VyaWFsaXplZEV2ZW50KTtcbiAgfVxuXG4gIC8vIFBlci1pbnN0YW5jZSBpbi1wcm9jZXNzIG11dGV4ZXMuIFR3byBzdG9yYWdlIGluc3RhbmNlcyBzaGFyaW5nXG4gIC8vIG9uZSBkYXRhIGRpcmVjdG9yeSBnZXQgaW5kZXBlbmRlbnQgbG9jayBtYXBzLCB3aGljaCBtYWtlcyB0aGVtXG4gIC8vIGJlaGF2ZSBsaWtlIHR3byBzZXBhcmF0ZSBPUyBwcm9jZXNzZXMgZnJvbSB0aGUgbG9ja2luZ1xuICAvLyBzdGFuZHBvaW50IOKAlCBjcm9zcy1pbnN0YW5jZSBhcmJpdHJhdGlvbiByZWxpZXMgb24gdGhlIG9uLWRpc2tcbiAgLy8gYHdyaXRlRXhjbHVzaXZlYCBjb25zdHJhaW50IC8gY2xhaW0gZmlsZXMgaW5zdGVhZC4gVGVzdHMgdXNlXG4gIC8vIHRoaXMgdG8gZXhlcmNpc2UgY3Jvc3MtcHJvY2VzcyBjb252ZXJnZW5jZSB3aXRob3V0IHNwYXduaW5nXG4gIC8vIHN1YnByb2Nlc3Nlcy5cbiAgLy9cbiAgLy8gYHN0ZXBMb2Nrc2Agc2VyaWFsaXplcyBzdGVwIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBzYW1lXG4gIC8vIChydW5JZCwgY29ycmVsYXRpb25JZCk6IHNlZSBjb21tZW50IGZ1cnRoZXIgZG93biBpbiB0aGVcbiAgLy8gYGlzU3RlcEV2ZW50YCBicmFuY2guXG4gIC8vXG4gIC8vIGBob29rTG9ja3NgIHNlcmlhbGl6ZXMgYGhvb2tfY3JlYXRlZGAgY2FsbHMgZm9yIHRoZSBzYW1lXG4gIC8vIChydW5JZCwgY29ycmVsYXRpb25JZCkgc28gdGhlIFwiY2xhaW0gdG9rZW4sIHRoZW4gd3JpdGUgaG9va1xuICAvLyBlbnRpdHkgKyBldmVudFwiIHNlcXVlbmNlIHJ1bnMgdG8gY29tcGxldGlvbiBiZWZvcmUgYW5vdGhlclxuICAvLyBpbi1wcm9jZXNzIGludm9jYXRpb24gZW50ZXJzIHRoZSBkZWR1cCBicmFuY2guXG4gIGNvbnN0IHN0ZXBMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuICBjb25zdCBob29rTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuICByZXR1cm4ge1xuICAgIGNsZWFyQ2FjaGUsXG4gICAgYXN5bmMgY3JlYXRlKHJ1bklkLCBkYXRhLCBwYXJhbXMpOiBQcm9taXNlPEV2ZW50UmVzdWx0PiB7XG4gICAgICAvLyBWYWxpZGF0ZSByZXF1ZXN0LXN1cHBsaWVkIElEcyBiZWZvcmUgdGhleSdyZSBjb25jYXRlbmF0ZWQgaW50b1xuICAgICAgLy8gZmlsZXN5c3RlbSBwYXRocy4gVGhpcyBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlIGFnYWluc3QgcGF0aCB0cmF2ZXJzYWxcbiAgICAgIC8vIGF0dGFja3Mgd2hlcmUgYSBjbGllbnQgc3VwcGxpZXMgcnVuSWQgLyBjb3JyZWxhdGlvbklkIHZhbHVlcyBsaWtlXG4gICAgICAvLyBcIi4uLy4uLy4uL3BhY2thZ2VcIiB0byByZWFkIG9yIHdyaXRlIGZpbGVzIG91dHNpZGUgdGhlIHN0b3JhZ2Ugcm9vdC5cbiAgICAgIC8vIFJ1biBiZWZvcmUgdGFraW5nIHRoZSBwZXItc3RlcCBtdXRleCBzbyBtYWxmb3JtZWQgaW5wdXRzIGZhaWwgZmFzdC5cbiAgICAgIC8vXG4gICAgICAvLyBFbXB0eSBgY29ycmVsYXRpb25JZGAgdmFsdWVzIGFyZSBhbHNvIHJlamVjdGVkIGhlcmU6IHRoZSBldmVudFxuICAgICAgLy8gc2NoZW1hcyBvbmx5IHJlcXVpcmUgYHouc3RyaW5nKClgLCBzbyB3aXRob3V0IHRoaXMgY2hlY2sgYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIC8gaG9va19jcmVhdGVkIC8gd2FpdF9jcmVhdGVkIHJlcXVlc3Qgd2l0aFxuICAgICAgLy8gYGNvcnJlbGF0aW9uSWQ6ICcnYCB3b3VsZCBzaWxlbnRseSBiZSB3cml0dGVuIHVuZGVyIGEgbWFsZm9ybWVkXG4gICAgICAvLyBjb21wb3NpdGUga2V5IGxpa2UgYCR7cnVuSWR9LWAuXG4gICAgICBpZiAocnVuSWQgIT0gbnVsbCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIH1cbiAgICAgIGlmICgnY29ycmVsYXRpb25JZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5jb3JyZWxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2NvcnJlbGF0aW9uSWQnLCBkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIGxpZmVjeWNsZSBldmVudHMgYXJlIHNlcmlhbGl6ZWQgcGVyLXN0ZXAgdmlhIGFuIGluLXByb2Nlc3MgbXV0ZXhcbiAgICAgIC8vIHNvIHRoYXQgdGhlIFwiY2hlY2sgc3RhdGUsIHRoZW4gd3JpdGVcIiBzZXF1ZW5jZSBpbiBzdGVwX3N0YXJ0ZWQgL1xuICAgICAgLy8gc3RlcF9jb21wbGV0ZWQgLyBzdGVwX2ZhaWxlZCAvIHN0ZXBfcmV0cnlpbmcgaXMgYXRvbWljLiBzdGVwX2NyZWF0ZWRcbiAgICAgIC8vIGlzIGFsc28gc2VyaWFsaXplZCBzbyBkdXBsaWNhdGUtY3JlYXRlIHJhY2VzIGRvbid0IGxlYXZlIGV4dHJhXG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnRzIGluIHRoZSBsb2cuXG4gICAgICBpZiAoaXNTdGVwRXZlbnRUeXBlKGRhdGEuZXZlbnRUeXBlKSAmJiBydW5JZCAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgbG9ja0tleSA9IHRhZ1xuICAgICAgICAgID8gYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS4ke3RhZ31gXG4gICAgICAgICAgOiBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgcmV0dXJuIHdpdGhJblByb2Nlc3NMb2NrKHN0ZXBMb2NrcywgbG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGBob29rX2NyZWF0ZWRgIGlzIHNlcmlhbGl6ZWQgcGVyLShydW5JZCwgaG9va0lkKSBzbyB0aGVcbiAgICAgIC8vIFwiY2xhaW0gdG9rZW4sIHdyaXRlIGhvb2sgZW50aXR5LCB3cml0ZSBldmVudFwiIHNlcXVlbmNlIHJ1bnMgdG9cbiAgICAgIC8vIGNvbXBsZXRpb24gYmVmb3JlIGFub3RoZXIgaW4tcHJvY2VzcyBpbnZvY2F0aW9uIGVudGVycyB0aGVcbiAgICAgIC8vIHNhbWUtaG9vayBkZWR1cCBicmFuY2guIFdpdGhvdXQgdGhpcywgdHdvIHNhbWUtdGljayBjb25jdXJyZW50XG4gICAgICAvLyBjYWxsZXJzIGNhbiByYWNlIGJldHdlZW4gdGhlIHdpbm5lcidzIGB3cml0ZUV4Y2x1c2l2ZShjbGFpbSlgXG4gICAgICAvLyBhbmQgYHdyaXRlSlNPTihob29rKWAsIG1ha2luZyB0aGUgc2Vjb25kIGNhbGxlciBtb21lbnRhcmlseVxuICAgICAgLy8gb2JzZXJ2ZSBhIGNsYWltIHdpdGggbm8gbWF0Y2hpbmcgaG9vayBlbnRpdHkg4oCUIHdoaWNoIHRoZVxuICAgICAgLy8gY3Jhc2gtcmVjb3ZlcnkgcGF0aCBiZWxvdyB3b3VsZCBtaXNpbnRlcnByZXQgYXMgYSBwcmlvciBjcmFzaFxuICAgICAgLy8gYW5kIGluY29ycmVjdGx5IGZhbGwgdGhyb3VnaCB0byBhIHNlY29uZCBob29rIGVudGl0eSB3cml0ZS5cbiAgICAgIC8vXG4gICAgICAvLyBgaG9va19yZWNlaXZlZGAgYW5kIGBob29rX2Rpc3Bvc2VkYCBzaGFyZSB0aGUgc2FtZSBwZXItaG9vayBsb2NrXG4gICAgICAvLyBzbyBhIHJlc3VtZSdzIFwiaG9vayBleGlzdHMgYW5kIGlzIG5vdCBkaXNwb3NlZCwgdGhlbiBhcHBlbmRcIlxuICAgICAgLy8gc2VxdWVuY2UgaXMgYXRvbWljIHdpdGggcmVzcGVjdCB0byB0aGUgZGlzcG9zZXIncyBcIndyaXRlIGRpc3Bvc2VcbiAgICAgIC8vIGxvY2ssIGRlbGV0ZSBlbnRpdHksIHRoZW4gYXBwZW5kXCIgc2VxdWVuY2UuIFdpdGhvdXQgdGhpcywgYVxuICAgICAgLy8gcmVzdW1lIHRoYXQgcGFzc2VkIGl0cyBleGlzdGVuY2UgY2hlY2sgYmVmb3JlIHRoZSBkaXNwb3NhbCBiZWdhblxuICAgICAgLy8gY291bGQgYXBwZW5kIGl0cyBgaG9va19yZWNlaXZlZGAgQUZURVIgYGhvb2tfZGlzcG9zZWRgIOKAlCBhblxuICAgICAgLy8gb3JkZXJpbmcgdGhhdCBpcyBqb3VybmFsZWQgZHVyYWJseSBhbmQgbWFrZXMgZXZlcnkgc3Vic2VxdWVudFxuICAgICAgLy8gcmVwbGF5IG9mIHRoZSBvd25pbmcgcnVuIGRpdmVyZ2UgYXQgdGhhdCBldmVudFxuICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvaXNzdWVzLzI3ODEpLlxuICAgICAgaWYgKFxuICAgICAgICBpc0hvb2tMaWZlY3ljbGVFdmVudFR5cGUoZGF0YS5ldmVudFR5cGUpICYmXG4gICAgICAgIHJ1bklkICYmXG4gICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uaG9vay4ke3RhZ31gXG4gICAgICAgICAgOiBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2tgO1xuICAgICAgICByZXR1cm4gd2l0aEluUHJvY2Vzc0xvY2soaG9va0xvY2tzLCBsb2NrS2V5LCAoKSA9PiBjcmVhdGVJbXBsKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZUltcGwoKTtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSW1wbCgpOiBQcm9taXNlPEV2ZW50UmVzdWx0PiB7XG4gICAgICAgIC8vIE1vc3QgcGF0aHMgdXNlIHRoZSBmcmVzaGx5LWdlbmVyYXRlZCBjYW5kaWRhdGUgZXZlbnRJZC4gVGhlXG4gICAgICAgIC8vIGhvb2tfY3JlYXRlZCBkZWR1cC1yZWNvdmVyeSBwYXRoIGJlbG93IG1heSByZWFzc2lnbiBpdCB0b1xuICAgICAgICAvLyB0aGUgY2Fub25pY2FsIGV2ZW50SWQgcGVyc2lzdGVkIGluIHRoZSBkdXJhYmxlIHRva2VuIGNsYWltXG4gICAgICAgIC8vIHNvIGNvbmN1cnJlbnQgLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgY29udmVyZ2Ugb24gYSBzaW5nbGVcbiAgICAgICAgLy8gZXZlbnQgaW4gdGhlIGxvZy5cbiAgICAgICAgbGV0IGV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIC8vIEZvciBydW5fY3JlYXRlZCBldmVudHMsIHVzZSBjbGllbnQtcHJvdmlkZWQgcnVuSWQgb3IgZ2VuZXJhdGUgb25lIHNlcnZlci1zaWRlXG4gICAgICAgIGxldCBlZmZlY3RpdmVSdW5JZDogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgKCFydW5JZCB8fCBydW5JZCA9PT0gJycpKSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBgd3J1bl8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICB9IGVsc2UgaWYgKCFydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncnVuSWQgaXMgcmVxdWlyZWQgZm9yIG5vbi1ydW5fY3JlYXRlZCBldmVudHMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZmZlY3RpdmVSdW5JZCA9IHJ1bklkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY2xpZW50LXByb3ZpZGVkIHJ1bklkIHRpbWVzdGFtcCBpcyB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGRcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmIHJ1bklkICYmIHJ1bklkICE9PSAnJykge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRlVWxpZFRpbWVzdGFtcChcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgJ3dydW5fJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcih2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwZWNWZXJzaW9uIGlzIGFsd2F5cyBzZW50IGJ5IHRoZSBydW50aW1lLCBidXQgd2UgcHJvdmlkZSBhIGZhbGxiYWNrIGZvciBzYWZldHlcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU3BlY1ZlcnNpb24gPSBkYXRhLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5UO1xuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJ1biBzdGF0ZSBmb3IgdmFsaWRhdGlvbiAoaWYgbm90IGNyZWF0aW5nIGEgbmV3IHJ1bilcbiAgICAgICAgLy8gU2tpcCBydW4gdmFsaWRhdGlvbiBmb3Igc3RlcF9jb21wbGV0ZWQgYW5kIHN0ZXBfcmV0cnlpbmcgLSB0aGV5IG9ubHkgb3BlcmF0ZVxuICAgICAgICAvLyBvbiBydW5uaW5nIHN0ZXBzLCBhbmQgcnVubmluZyBzdGVwcyBhcmUgYWx3YXlzIGFsbG93ZWQgdG8gbW9kaWZ5IHJlZ2FyZGxlc3NcbiAgICAgICAgLy8gb2YgcnVuIHN0YXRlLiBUaGlzIG9wdGltaXphdGlvbiBzYXZlcyBmaWxlc3lzdGVtIHJlYWRzIHBlciBzdGVwIGV2ZW50LlxuICAgICAgICBsZXQgY3VycmVudFJ1bjogV29ya2Zsb3dSdW4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2tpcFJ1blZhbGlkYXRpb25FdmVudHMgPSBbJ3N0ZXBfY29tcGxldGVkJywgJ3N0ZXBfcmV0cnlpbmcnXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlICE9PSAncnVuX2NyZWF0ZWQnICYmXG4gICAgICAgICAgIXNraXBSdW5WYWxpZGF0aW9uRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZXNpbGllbnQgc3RhcnQ6IHJ1bl9zdGFydGVkIG9uIG5vbi1leGlzdGVudCBydW4gd2l0aCBldmVudERhdGFcbiAgICAgICAgICAvLyBjcmVhdGVzIHRoZSBydW4gZmlyc3QsIHNvIHRoZSBxdWV1ZSBjYW4gYm9vdHN0cmFwIGEgcnVuIHRoYXRcbiAgICAgICAgICAvLyBmYWlsZWQgdG8gY3JlYXRlIGR1cmluZyBzdGFydCgpLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmXG4gICAgICAgICAgICAhY3VycmVudFJ1biAmJlxuICAgICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YSAmJlxuICAgICAgICAgICAgZGF0YS5ldmVudERhdGFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bklucHV0RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgICAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlucHV0PzogYW55O1xuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSAmJlxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuaW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhydW5JbnB1dERhdGEuYXR0cmlidXRlcyA/PyB7fSkubWFwKFxuICAgICAgICAgICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEF0b21pY2FsbHkgdHJ5IHRvIHB1Ymxpc2ggdGhlIHJ1biBlbnRpdHkgc28gb25seSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgLy8gd3JpdGVyIHdpbnMsIHByZXZlbnRpbmcgYSBUT0NUT1UgcmFjZSB3aGVyZSBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgLy8gcnVuX2NyZWF0ZWQgZnJvbSBzdGFydCgpIGNvdWxkIG92ZXJ3cml0ZSBhIHJ1biB0aGF0IHdhc1xuICAgICAgICAgICAgICAvLyBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byAncnVubmluZycuXG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRSdW46IFdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dERhdGEuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgY29uc3QgcnVuUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKTtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY3JlYXRlZFJ1biwganNvblJlcGxhY2VyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmIChjcmVhdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY3JlYXRlZCB0aGUgcnVuIOKAlCBhbHNvIHdyaXRlIHRoZSBydW5fY3JlYXRlZCBldmVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnRJZCA9IGBldm50XyR7bW9ub3RvbmljVWxpZCgpfWA7XG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IHJ1bkNyZWF0ZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dERhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0RGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dERhdGEuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlRXZlbnQocnVuQ3JlYXRlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gY3JlYXRlZFJ1bjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSdW4gYWxyZWFkeSBleGlzdHMgKGNvbmN1cnJlbnQgcnVuX2NyZWF0ZWQgd29uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHJhY2UpLiBSZS1yZWFkIGl0IHNvIGRvd25zdHJlYW0gbG9naWMgc2VlcyB0aGUgcmVhbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW5fZmFpbGVkIG9uIGEgbm9uLWV4aXN0ZW50IHJ1biBpcyByZWplY3RlZCB0byBtYXRjaCB0aGVcbiAgICAgICAgLy8gcG9zdGdyZXMgYW5kIHZlcmNlbCB3b3JsZHMsIHdoaWNoIGJvdGggc3VyZmFjZSB0aGlzIGFzIGFcbiAgICAgICAgLy8gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIHJhdGhlciB0aGFuIHNpbGVudGx5IHBlcnNpc3RpbmcgYW5cbiAgICAgICAgLy8gZXZlbnQgZm9yIGEgcnVuIHRoYXQgd2FzIG5ldmVyIGNyZWF0ZWQuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gVkVSU0lPTiBDT01QQVRJQklMSVRZOiBDaGVjayBydW4gc3BlYyB2ZXJzaW9uXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBGb3IgZXZlbnRzIHRoYXQgaGF2ZSBmZXRjaGVkIHRoZSBydW4sIGNoZWNrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy8gU2tpcCBmb3IgcnVuX2NyZWF0ZWQgKG5vIGV4aXN0aW5nIHJ1bikgYW5kIHJ1bnRpbWUgZXZlbnRzIChzdGVwX2NvbXBsZXRlZCwgc3RlcF9yZXRyeWluZykuXG4gICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgcnVuIHJlcXVpcmVzIGEgbmV3ZXIgd29ybGQgdmVyc2lvblxuICAgICAgICAgIGlmIChyZXF1aXJlc05ld2VyV29ybGQoY3VycmVudFJ1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5Ob3RTdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgICAgY3VycmVudFJ1bi5zcGVjVmVyc2lvbiEsXG4gICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9DVVJSRU5UXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJvdXRlIHRvIGxlZ2FjeSBoYW5kbGVyIGZvciBwcmUtZXZlbnQtc291cmNpbmcgcnVuc1xuICAgICAgICAgIGlmIChpc0xlZ2FjeVNwZWNWZXJzaW9uKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlTGVnYWN5RXZlbnQoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjdXJyZW50UnVuLFxuICAgICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZBTElEQVRJT046IFRlcm1pbmFsIHN0YXRlIGFuZCBldmVudCBvcmRlcmluZyBjaGVja3NcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBhIHN0ZXBfc3RhcnRlZCBjYXJyeWluZyBzdGVwLWNyZWF0aW9uIGRhdGFcbiAgICAgICAgLy8gKHN0ZXBOYW1lICsgaW5wdXQpIGlzIGFsbG93ZWQgdG8gYXJyaXZlIHdpdGggbm8gcHJpb3Igc3RlcF9jcmVhdGVkXG4gICAgICAgIC8vIOKAlCBpdCBjcmVhdGVzIHRoZSBzdGVwIG9uIHRoZSBmbHkgKHNlZSB0aGUgbWF0ZXJpYWxpemF0aW9uIGJsb2NrXG4gICAgICAgIC8vIGJlbG93KS4gVGhpcyBtaXJyb3JzIHRoZSByZXNpbGllbnQgcnVuX3N0YXJ0ZWQgcGF0aC4gRGV0ZWN0IGl0IGhlcmVcbiAgICAgICAgLy8gc28gdGhlIGVudGl0eS1jcmVhdGlvbiB0ZXJtaW5hbC1ydW4gZ3VhcmQgdHJlYXRzIGl0IGxpa2UgYSBjcmVhdGlvblxuICAgICAgICAvLyBhbmQgdGhlIFwic3RlcCBtdXN0IGV4aXN0XCIgb3JkZXJpbmcgZ3VhcmQgZG9lc24ndCByZWplY3QgaXQuXG4gICAgICAgIGNvbnN0IGNyZWF0ZXNDaGlsZEVudGl0eSA9IGlzQ2hpbGRFbnRpdHlDcmVhdGlvbkV2ZW50KGRhdGEpO1xuICAgICAgICBjb25zdCBsYXp5U3RlcFN0YXJ0ID1cbiAgICAgICAgICBjcmVhdGVzQ2hpbGRFbnRpdHkgJiYgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnO1xuXG4gICAgICAgIC8vIFJ1biB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyhjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICAvLyBJZGVtcG90ZW50IG9wZXJhdGlvbjogcnVuX2NhbmNlbGxlZCBvbiBhbHJlYWR5IGNhbmNlbGxlZCBydW4gaXMgYWxsb3dlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcgJiZcbiAgICAgICAgICAgIGN1cnJlbnRSdW4uc3RhdHVzID09PSAnY2FuY2VsbGVkJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGV4aXN0aW5nIHN0YXRlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgc3RvcmVFdmVudChldmVudCk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXZlbnQ6IHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpLFxuICAgICAgICAgICAgICBydW46IGN1cnJlbnRSdW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZvciBydW5fc3RhcnRlZCBvbiB0ZXJtaW5hbCBydW5zLCB1c2UgUnVuRXhwaXJlZEVycm9yIHNvIHRoZVxuICAgICAgICAgIC8vIHJ1bnRpbWUga25vd3MgdG8gZXhpdCB3aXRob3V0IHJldHJ5aW5nLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7ZWZmZWN0aXZlUnVuSWR9XCIgaXMgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE90aGVyIHJ1biBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgbm90IGFsbG93ZWQgb24gdGVybWluYWwgcnVuc1xuICAgICAgICAgIGlmIChpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlKGRhdGEuZXZlbnRUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgdHJhbnNpdGlvbiBydW4gZnJvbSB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0aW5nIG5ldyBlbnRpdGllcyBvbiB0ZXJtaW5hbCBydW5zIGlzIG5vdCBhbGxvd2VkLiBBIGxhenlcbiAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgY3JlYXRlcyBhIHN0ZXAsIHNvIGl0IGlzIHJlamVjdGVkIGhlcmUgdG9vIOKAlCBhIGJhcmVcbiAgICAgICAgICAvLyAobm9uLWxhenkpIHN0ZXBfc3RhcnRlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBzdGVwLXZhbGlkYXRpb25cbiAgICAgICAgICAvLyBibG9jayBiZWxvdywgd2hpY2ggdXNlcyBSdW5FeHBpcmVkRXJyb3IgZm9yIHRlcm1pbmFsIHJ1bnMuXG4gICAgICAgICAgaWYgKGNyZWF0ZXNDaGlsZEVudGl0eSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgY3JlYXRlIG5ldyBlbnRpdGllcyBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IHNldCBhdHRyaWJ1dGVzIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAtcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZyBhbmQgdGVybWluYWwgc3RhdGUpXG4gICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nU3RlcCBzbyB3ZSBjYW4gcmV1c2UgaXQgbGF0ZXIgKGF2b2lkIGRvdWJsZSByZWFkKVxuICAgICAgICBsZXQgdmFsaWRhdGVkU3RlcDogU3RlcCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBzdGVwRXZlbnRSZXF1aXJlc0V4aXN0aW5nU3RlcCA9XG4gICAgICAgICAgaXNTdGVwRXZlbnRUeXBlKGRhdGEuZXZlbnRUeXBlKSAmJiBkYXRhLmV2ZW50VHlwZSAhPT0gJ3N0ZXBfY3JlYXRlZCc7XG4gICAgICAgIGlmIChzdGVwRXZlbnRSZXF1aXJlc0V4aXN0aW5nU3RlcCAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgdmFsaWRhdGVkU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBFdmVudCBvcmRlcmluZzogc3RlcCBtdXN0IGV4aXN0IGJlZm9yZSB0aGVzZSBldmVudHMg4oCUIGV4Y2VwdCBvblxuICAgICAgICAgIC8vIHRoZSBsYXp5LXN0YXJ0IHBhdGgsIHdoZXJlIHN0ZXBfc3RhcnRlZCBjcmVhdGVzIHRoZSBzdGVwIGl0c2VsZi5cbiAgICAgICAgICBpZiAoIXZhbGlkYXRlZFN0ZXAgJiYgIWxhenlTdGVwU3RhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBMYXp5IHN0YXJ0IGV4YWN0bHktb25jZSBnYXRlOiBhIGxhenkgc3RlcF9zdGFydGVkIGFsd2F5cyBDUkVBVEVTXG4gICAgICAgICAgLy8gdGhlIHN0ZXAgKHRoZSBvd25lZC1pbmxpbmUgcGF0aCBvbmx5IHNlbmRzIG9uZSBmb3IgYSBzdGVwIHdob3NlXG4gICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGl0IGRlZmVycmVkKS4gSWYgdGhlIHN0ZXAgYWxyZWFkeSBleGlzdHMsIGEgY29uY3VycmVudFxuICAgICAgICAgIC8vIGhhbmRsZXIgd29uIHRoZSBjcmVhdGUg4oCUIHRoaXMgY2FsbGVyIGlzIGEgbG9zZXIgYW5kIG11c3Qgbm90IHN0YXJ0XG4gICAgICAgICAgLy8gb3IgcnVuIHRoZSBzdGVwLiBUaHJvdyBFbnRpdHlDb25mbGljdEVycm9yIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAvLyBleGVjdXRlU3RlcCBtYXBzIGl0IHRvIGBza2lwcGVkYC4gVGhpcyBpcyBjcml0aWNhbDogdGhlIHBsYWluIHN0YXJ0XG4gICAgICAgICAgLy8gdHJhbnNpdGlvbiBiZWxvdyBwZXJtaXRzIHJlLXN0YXJ0aW5nIGEgbm9uLXRlcm1pbmFsIHN0ZXAgKHJldHJpZXNcbiAgICAgICAgICAvLyByZWx5IG9uIHRoYXQpLCBzbyB3aXRob3V0IHRoaXMgZ2F0ZSBhIGxvc2VyIHdvdWxkIHJlLXN0YXJ0IGFcbiAgICAgICAgICAvLyBydW5uaW5nIHN0ZXAgYW5kIHJ1biB0aGUgYm9keSBhIHNlY29uZCB0aW1lLlxuICAgICAgICAgIGlmIChsYXp5U3RlcFN0YXJ0ICYmIHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RlcCB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uLiB2YWxpZGF0ZWRTdGVwIGNhbiBiZSBudWxsIG9ubHkgb25cbiAgICAgICAgICAvLyB0aGUgbGF6eS1zdGFydCBwYXRoIChubyBzdGVwIHlldCkg4oCUIHRoZXJlIGlzIG5vdGhpbmcgdGVybWluYWwgdG9cbiAgICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGluIHRoYXQgY2FzZSwgc28gdGhlc2UgY2hlY2tzIGFyZSBza2lwcGVkLlxuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBpZiAoaXNUZXJtaW5hbFN0ZXBTdGF0dXModmFsaWRhdGVkU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke3ZhbGlkYXRlZFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiB0ZXJtaW5hbCBydW5zOiBvbmx5IGFsbG93IGNvbXBsZXRpbmcvZmFpbGluZyBpbi1wcm9ncmVzcyBzdGVwc1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKGN1cnJlbnRSdW4uc3RhdHVzKSkge1xuICAgICAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcC5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW5FeHBpcmVkRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ2Fubm90IG1vZGlmeSBub24tcnVubmluZyBzdGVwIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhvb2stcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZylcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzSG9va0V2ZW50UmVxdWlyaW5nRXhpc3RlbmNlKGRhdGEuZXZlbnRUeXBlKSAmJlxuICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBBIHJlc3VtZSBtdXN0IG5ldmVyIGJlIGpvdXJuYWxlZCBhZnRlciB0aGUgaG9vaydzIGRpc3Bvc2FsLlxuICAgICAgICAgIC8vIFRoZSBkaXNwb3NlcidzIGR1cmFibGUgb3JkZXIgaXM6IGRpc3Bvc2UgbG9jayDihpIgY2xhaW0vZW50aXR5XG4gICAgICAgICAgLy8gZGVsZXRlIOKGkiBgaG9va19kaXNwb3NlZGAgYXBwZW5kLCBzbyB0aGUgaG9vayBlbnRpdHkgY2FuIHN0aWxsXG4gICAgICAgICAgLy8gZXhpc3QgKG9yIHRoZSBkaXNwb3NlciBtYXkgaGF2ZSBjcmFzaGVkIG1pZC10ZWFyZG93bikgd2hpbGVcbiAgICAgICAgICAvLyBkaXNwb3NhbCBpcyBhbHJlYWR5IGNvbW1pdHRlZC4gUmUtdmFsaWRhdGUgdGhlIGRpc3Bvc2UgbG9ja1xuICAgICAgICAgIC8vIGhlcmUg4oCUIHVuZGVyIHRoZSBwZXItaG9vayBpbi1wcm9jZXNzIGxvY2sgdGFrZW4gYWJvdmUg4oCUIHNvXG4gICAgICAgICAgLy8gYWNjZXB0YW5jZSBvYnNlcnZlcyB0aGUgc2FtZSBvcmRlciByZXBsYXkgd2lsbDogb25jZSBkaXNwb3NhbFxuICAgICAgICAgIC8vIGhhcyBjb21taXR0ZWQsIHRoZSByZXN1bWUgaXMgcmVqZWN0ZWQgZXhhY3RseSBsaWtlIG9uZSB0aGF0XG4gICAgICAgICAgLy8gYXJyaXZlZCBhZnRlciB0ZWFyZG93biBmaW5pc2hlZC5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAoYXdhaXQgaXNIb29rRGlzcG9zYWxDb21taXR0ZWQoYmFzZWRpciwgZGF0YS5jb3JyZWxhdGlvbklkLCB0YWcpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKGRhdGEuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBIb29rU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghZXhpc3RpbmdIb29rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYGV2ZW50YCBtYXkgYmUgcmVhc3NpZ25lZCBsYXRlciBpbiB0aGUgYGhvb2tfY3JlYXRlZGBcbiAgICAgICAgLy8gZGVkdXAtcmVjb3ZlcnkgYnJhbmNoIHRvIHN3YXAgaW4gYSBjYW5vbmljYWwgZXZlbnRJZCAvXG4gICAgICAgIC8vIGNyZWF0ZWRBdCBwZXJzaXN0ZWQgaW4gdGhlIGR1cmFibGUgdG9rZW4gY2xhaW0gc29cbiAgICAgICAgLy8gY29uY3VycmVudCAvIGNyb3NzLXByb2Nlc3Mgd29ya2VycyBjb252ZXJnZSBvbiBhIHNpbmdsZVxuICAgICAgICAvLyBldmVudCBpbiB0aGUgbG9nLlxuICAgICAgICBsZXQgZXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICB9O1xuICAgICAgICAvLyBTdHJpcCBldmVudERhdGEgZnJvbSBydW5fc3RhcnRlZCDigJQgaXQgYmVsb25ncyBvbiBydW5fY3JlYXRlZCBvbmx5LlxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZXZlbnQpIHtcbiAgICAgICAgICBkZWxldGUgKGV2ZW50IGFzIGFueSkuZXZlbnREYXRhO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cmlwIG9ubHkgdGhlIHN0ZXAgYGlucHV0YCBmcm9tIHRoZSBsYXp5IHN0ZXBfc3RhcnRlZCBldmVudCByb3cg4oCUXG4gICAgICAgIC8vIGl0IGJlbG9uZ3Mgb24gdGhlIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgd3JpdHRlbiBhYm92ZS4gc3RlcE5hbWUgaXNcbiAgICAgICAgLy8gcHJlc2VydmVkIGZvciB0aGUgY2xpZW50IHJlcGxheSBjb25zdW1lcidzIHN0ZXAtbmFtZSBkaXZlcmdlbmNlXG4gICAgICAgIC8vIGNoZWNrIChwYWNrYWdlcy9jb3JlL3NyYy9zdGVwLnRzKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGxhenlTdGVwU3RhcnQgJiZcbiAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnICYmXG4gICAgICAgICAgZXZlbnQuZXZlbnREYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHsgaW5wdXQ6IF9zdHJpcHBlZElucHV0LCAuLi5ldmVudERhdGEgfSA9IGV2ZW50LmV2ZW50RGF0YTtcbiAgICAgICAgICBldmVudCA9IHsgLi4uZXZlbnQsIGV2ZW50RGF0YSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgZW50aXR5IGNyZWF0ZWQvdXBkYXRlZCBmb3IgRXZlbnRSZXN1bHRcbiAgICAgICAgbGV0IHJ1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBzdGVwOiBTdGVwIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaG9vazogSG9vayB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHdhaXQ6IFdhaXQgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIExhenkgc3RlcCBzdGFydDogc2V0IHRydWUgd2hlbiB0aGlzIHN0ZXBfc3RhcnRlZCBhdG9taWNhbGx5IGNyZWF0ZWRcbiAgICAgICAgLy8gdGhlIHN0ZXAgKHRoZSBjYWxsZXIgd29uIHRoZSBjcmVhdGUtY2xhaW0pLiBTdXJmYWNlZCBvbiBFdmVudFJlc3VsdFxuICAgICAgICAvLyBhcyB0aGUgcnVudGltZSdzIGV4YWN0bHktb25jZSBvd25lcnNoaXAgc2lnbmFsLlxuICAgICAgICBsZXQgc3RlcENyZWF0ZWRMYXppbHkgPSBmYWxzZTtcbiAgICAgICAgLy8gRm9yIGBob29rX2NyZWF0ZWRgLCB0aGUgaG9vayBlbnRpdHkgd3JpdGUgaXMgZGVmZXJyZWQgdW50aWxcbiAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggc3VjY2VlZHMsIHNvIGEgcmV0cnkgdGhhdFxuICAgICAgICAvLyBjb2xsaWRlcyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgIGRvZXMgbm90XG4gICAgICAgIC8vIG11dGF0ZSB0aGUgZHVyYWJsZSBob29rIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQuXG4gICAgICAgIC8vIGBob29rRW50aXR5V3JpdGVPcHRpb25zYCBjYXJyaWVzIHRoZSBgeyBvdmVyd3JpdGUgfWAgbW9kZVxuICAgICAgICAvLyBjaG9zZW4gYnkgdGhlIGRlZHVwLXJlY292ZXJ5IGJyYW5jaCBhYm92ZSAodW5kZWZpbmVkIGZvclxuICAgICAgICAvLyBmaXJzdCB3cml0ZXJzLCBgeyBvdmVyd3JpdGU6IHRydWUgfWAgZm9yIHJldHJpZXMgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVwYWlyaW5nIGFuIG9ycGhhbmVkIHBhcnRpYWwgd3JpdGUpLlxuICAgICAgICBsZXQgaG9va0VudGl0eVdyaXRlT3B0aW9uczogeyBvdmVyd3JpdGU6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBDcmVhdGUvdXBkYXRlIGVudGl0eSBiYXNlZCBvbiBldmVudCB0eXBlIChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgLy8gUnVuIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBydW5EYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhydW5EYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogcnVuRGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1biA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuRGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuRGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHJ1biBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bkRhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgIGlucHV0OiBydW5EYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0cmlidXRlczogcnVuRGF0YS5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIEF0b21pY2FsbHkgcHVibGlzaCB0aGUgcnVuIGVudGl0eSBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW5cbiAgICAgICAgICAvLyBleGlzdGluZyB3aW5uZXIuIFRoaXMgcHJldmVudHMgYSBUT0NUT1UgcmFjZSB3aXRoIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAvLyBzdGFydCBwYXRoIChydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuKSB0aGF0IGNvdWxkIHJlc3VsdCBpblxuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBydW5fY3JlYXRlZCBldmVudHMgaW4gdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShydW4sIGpzb25SZXBsYWNlciwgMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVuIHdpdGhvdXQgaW5zZXJ0aW5nIGFcbiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudC4gIFRoaXMgbWFrZXMgcnVuX3N0YXJ0ZWQgaWRlbXBvdGVudCBmb3JcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMuICBXZSBvbWl0IHByZWxvYWRlZCBldmVudHMgaGVyZVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIGEgcmFyZSByYWNlLWNvbmRpdGlvbiBwYXRoIOKAlCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBsb2FkV29ya2Zsb3dSdW5FdmVudHMoKS5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHJ1bjogY3VycmVudFJ1biB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IG91dHB1dD86IGFueSB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlUnVuRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVSdW5FcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IGZhaWxlZERhdGEuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcgJiYgY3VycmVudFJ1bikge1xuICAgICAgICAgIHJ1biA9IGF3YWl0IHdpdGhSdW5GaWxlTG9jayhlZmZlY3RpdmVSdW5JZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJlc2ggPSBhd2FpdCByZWFkSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpLFxuICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghZnJlc2gpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoZGF0YS5ldmVudERhdGEuY2hhbmdlcywge1xuICAgICAgICAgICAgICBleGlzdGluZ0tleXM6IE9iamVjdC5rZXlzKGZyZXNoLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xhaW0gdGhlIGNvcnJlbGF0aW9uIGRlZHVwIGxvY2sgb25seSBhZnRlciB2YWxpZGF0aW9uOiBhXG4gICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGZhaWx1cmUgbXVzdCBsZWF2ZSB0aGUgY29ycmVsYXRpb25JZCB1bmNsYWltZWQgc29cbiAgICAgICAgICAgIC8vIHRoZSBydW50aW1lJ3MgcmV0cnkgb2YgdGhlIHNhbWUgZXZlbnQgaXMgbm90IG1pc3JlcG9ydGVkIGFzXG4gICAgICAgICAgICAvLyBcImFscmVhZHkgZXhpc3RzXCIgd2hpbGUgdGhlIGV2ZW50IHdhcyBuZXZlciB3cml0dGVuICh0aGVcbiAgICAgICAgICAgIC8vIGRpc3BhdGNoZXIgd291bGQgdGhlbiB3YWl0IGZvcmV2ZXIgZm9yIGFuIGV2ZW50IHRoYXQgaXMgbm90XG4gICAgICAgICAgICAvLyBpbiB0aGUgbG9nKS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLndyaXRlci50eXBlID09PSAnd29ya2Zsb3cnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgICAgPyBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgICAnYXR0cmlidXRlcycsXG4gICAgICAgICAgICAgICAgYXR0ckxvY2tOYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoYXR0ckxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICAgIGlmICghYXR0ckNsYWltZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBBdHRyaWJ1dGUgZXZlbnQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0ge1xuICAgICAgICAgICAgICAuLi5mcmVzaCxcbiAgICAgICAgICAgICAgYXR0cmlidXRlczogYXBwbHlBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgIGZyZXNoLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEuY2hhbmdlc1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH0gYXMgV29ya2Zsb3dSdW47XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKSxcbiAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gc3RlcF9jcmVhdGVkOiBDcmVhdGVzIHN0ZXAgZW50aXR5IHdpdGggc3RhdHVzICdwZW5kaW5nJywgYXR0ZW1wdD0wLCBjcmVhdGVkQXQgc2V0LlxuICAgICAgICAgIC8vIFR3byBjb25jdXJyZW50IGludm9jYXRpb25zIHdpdGggaWRlbnRpY2FsIGNvcnJlbGF0aW9uSWRzIChlLmcuIHRoZVxuICAgICAgICAgIC8vIHNuYXBzaG90IHJ1bnRpbWUncyBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzIGFjcm9zcyByZXBsYXlzKVxuICAgICAgICAgIC8vIG11c3QgYmUgZGVkdXBlZCDigJQgb3RoZXJ3aXNlIGJvdGggd3JpdGVzIHN1Y2NlZWQgYW5kIHRoZSBldmVudCBsb2dcbiAgICAgICAgICAvLyBlbmRzIHVwIHdpdGggZHVwbGljYXRlIHN0ZXBfY3JlYXRlZCBlbnRyaWVzLiBUaGUgb3V0ZXJcbiAgICAgICAgICAvLyB3aXRoU3RlcExvY2sgbXV0ZXggc2VyaWFsaXplcyB3aXRoaW4gYSBzaW5nbGUgcHJvY2VzczsgdGhpc1xuICAgICAgICAgIC8vIFRoZSBleGNsdXNpdmUgY29uc3RyYWludCBmaWxlIGFkZGl0aW9uYWxseSBwcm90ZWN0cyBhZ2FpbnN0XG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyByYWNlcyAodHdvIHBucG0gd29ya2VycywgcmVkZWxpdmVyZWQgcXVldWUgbWVzc2FnZXMsXG4gICAgICAgICAgLy8gZXRjLikuIFRoZSBsb3NlciB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvciBzbyB0aGUgcnVudGltZSdzXG4gICAgICAgICAgLy8gZXhpc3RpbmcgY2F0Y2ggcGF0aCBjYW4gc3dhbGxvdyBpdCBhbmQgYXZvaWQgZG91YmxlLXF1ZXVpbmcgdGhlXG4gICAgICAgICAgLy8gc3RlcC5cbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXN0ZXBDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3RlcERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwRGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgaW5wdXQ6IHN0ZXBEYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0ZW1wdDogMCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHN0ZXAgZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgc3RlcFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gc3RlcF9zdGFydGVkOiBJbmNyZW1lbnRzIGF0dGVtcHQsIHNldHMgc3RhdHVzIHRvICdydW5uaW5nJ1xuICAgICAgICAgIC8vIFNldHMgc3RhcnRlZEF0IG9ubHkgb24gdGhlIGZpcnN0IHN0YXJ0IChub3QgdXBkYXRlZCBvbiByZXRyaWVzKVxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG5cbiAgICAgICAgICAvLyBMYXp5IHN0ZXAgc3RhcnQ6IG5vIHByaW9yIHN0ZXBfY3JlYXRlZCDigJQgY3JlYXRlIHRoZSBzdGVwIGVudGl0eVxuICAgICAgICAgIC8vIGFuZCBhIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgZXZlbnQgbm93LCB0aGVuIGZhbGwgdGhyb3VnaCB0byB0aGVcbiAgICAgICAgICAvLyBzdGFydCB0cmFuc2l0aW9uIGJlbG93LiBNaXJyb3JzIHRoZSByZXNpbGllbnQgcnVuX3N0YXJ0ZWQgcGF0aDpcbiAgICAgICAgICAvLyB0aGUgc3RlcCBlbnRpdHkgaXMgY2xhaW1lZCBhdG9taWNhbGx5IChmaXJzdCB3cml0ZXIgd2lucykgYW5kIHRoZVxuICAgICAgICAgIC8vIHN5bnRoZXRpYyBzdGVwX2NyZWF0ZWQgZXZlbnQga2VlcHMgcmVwbGF5IGNvcnJlY3QgKHRoZSBjbGllbnQgc3RlcFxuICAgICAgICAgIC8vIGNvbnN1bWVyIG1hcmtzIGhhc0NyZWF0ZWRFdmVudCBvbmx5IHdoZW4gaXQgb2JzZXJ2ZXMgdGhhdCBldmVudCkuXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZWRTdGVwICYmIGxhenlTdGVwU3RhcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhenlEYXRhID0gZGF0YS5ldmVudERhdGE7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWRgO1xuICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghc3RlcENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIGFscmVhZHkgY2xhaW1lZCB0aGUgY3JlYXRlIGZvciB0aGlzXG4gICAgICAgICAgICAgIC8vIHN0ZXAuIFRoZSBhdG9taWMgY2xhaW0gaXMgdGhlIGV4YWN0bHktb25jZSBvd25lcnNoaXAgZ2F0ZTpcbiAgICAgICAgICAgICAgLy8gb25seSB0aGUgd2lubmVyIHJ1bnMgdGhlIHN0ZXAgYm9keSBpbmxpbmUuIFRocm93XG4gICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oCUIHRoZSBydW50aW1lJ3MgZXhlY3V0ZVN0ZXAgbWFwcyB0aGlzIHRvXG4gICAgICAgICAgICAgIC8vIGBza2lwcGVkYCwgc28gdGhlIGxvc2VyIGRvZXMgbm90IHN0YXJ0IG9yIHJ1biB0aGUgc3RlcC4gVGhpc1xuICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZXMgdGhlIHNhbWUgXCJleGFjdGx5IG9uZSBoYW5kbGVyIG93bnMgZWFjaCBzdGVwXCJcbiAgICAgICAgICAgICAgLy8gZ3VhcmFudGVlIHRoZSBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgY2xhaW0gcHJvdmlkZXMgdG9kYXkuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFN0ZXA6IFN0ZXAgPSB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIHN0ZXBJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBsYXp5RGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgICBpbnB1dDogbGF6eURhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhdHRlbXB0OiAwLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICAgICAgYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWAsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRTdGVwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIGV2ZW50IHNvIHJlcGxheSBvYnNlcnZlcyBpdFxuICAgICAgICAgICAgICAvLyAodGhlIGNsaWVudCBzdGVwIGNvbnN1bWVyIHNldHMgaGFzQ3JlYXRlZEV2ZW50IG9ubHkgb24gYVxuICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnQpLiBJdHMgZXZlbnRJZCBpcyBhIGZyZXNoIG1vbm90b25pYyBVTElELlxuICAgICAgICAgICAgICAvLyBPcmRlcmluZyB2cy4gdGhlIHN0ZXBfc3RhcnRlZCBldmVudCByb3cgZG9lcyBub3QgYWZmZWN0XG4gICAgICAgICAgICAgIC8vIGNvcnJlY3RuZXNzOiB0aGUgc3RlcF9zdGFydGVkIGNvbnN1bWVyIGlzIGEgbm8tb3AgYW5kIG9ubHlcbiAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGZsaXBzIGhhc0NyZWF0ZWRFdmVudCwgc28gdGhlIGVuZCBzdGF0ZSBpcyB0aGVcbiAgICAgICAgICAgICAgLy8gc2FtZSB3aGljaGV2ZXIgc29ydHMgZmlyc3Qg4oCUIHRoaXMgbWF0Y2hlcyB0aGUgcmVzaWxpZW50XG4gICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIOKGkiBydW5fY3JlYXRlZCBwcmVjZWRlbnQgaW4gdGhpcyBmaWxlLlxuICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBldmVudElkOiBzdGVwQ3JlYXRlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBsYXp5RGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBsYXp5RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgICAgICAgICAgIGAke2VmZmVjdGl2ZVJ1bklkfS0ke3N0ZXBDcmVhdGVkRXZlbnRJZH1gLFxuICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBzdGVwQ3JlYXRlZEV2ZW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAgPSBjcmVhdGVkU3RlcDtcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMYXppbHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiByZXRyeUFmdGVyIHRpbWVzdGFtcCBoYXNuJ3QgYmVlbiByZWFjaGVkIHlldFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIgJiZcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyLmdldFRpbWUoKSA+IERhdGUubm93KClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vRWFybHlFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IHN0YXJ0IHN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIjogcmV0cnlBZnRlciB0aW1lc3RhbXAgaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0YCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXRyeUFmdGVyOiBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgZ3VhcmQ6IHJlLXJlYWQgdGhlIHN0ZXAgZW50aXR5IHRvIGNoZWNrIGlmIGl0XG4gICAgICAgICAgICAvLyByZWFjaGVkIHRlcm1pbmFsIHN0YXRlIGJldHdlZW4gdGhlIHZhbGlkYXRpb24gcmVhZCBhbmQgbm93LlxuICAgICAgICAgICAgLy8gVGhpcyBuYXJyb3dzIHRoZSBUT0NUT1Ugd2luZG93IGJ1dCBkb2VzIG5vdCBmdWxseSBlbGltaW5hdGUgaXRcbiAgICAgICAgICAgIC8vICh0aGUgbG9jYWwgd29ybGQgaXMgc2luZ2xlLXByb2Nlc3MgLyBkZXYtb25seTsgdGhlIHBvc3RncmVzXG4gICAgICAgICAgICAvLyB3b3JsZCB1c2VzIFNRTC1sZXZlbCBhdG9taWMgZ3VhcmRzIGZvciBwcm9kdWN0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGZyZXNoU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgICBTdGVwU2NoZW1hLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZnJlc2hTdGVwICYmIGlzVGVybWluYWxTdGVwU3RhdHVzKGZyZXNoU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke2ZyZXNoU3RlcC5zdGF0dXN9XCJgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAvLyBPbmx5IHNldCBzdGFydGVkQXQgb24gdGhlIGZpcnN0IHN0YXJ0XG4gICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdmFsaWRhdGVkU3RlcC5zdGFydGVkQXQgPz8gbm93LFxuICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgYXR0ZW1wdCBjb3VudGVyIG9uIGV2ZXJ5IHN0YXJ0XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IHZhbGlkYXRlZFN0ZXAuYXR0ZW1wdCArIDEsXG4gICAgICAgICAgICAgIC8vIENsZWFyIHJldHJ5QWZ0ZXIgbm93IHRoYXQgdGhlIHN0ZXAgaGFzIHN0YXJ0ZWRcbiAgICAgICAgICAgICAgcmV0cnlBZnRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfY29tcGxldGVkOiBUZXJtaW5hbCBzdGF0ZSB3aXRoIG91dHB1dFxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggY29tcGxldGluZyB0aGUgc2FtZSBzdGVwIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgY29tcGxldGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHsgcmVzdWx0OiBhbnkgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgbG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgPyBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWxgO1xuICAgICAgICAgICAgY29uc3QgdGVybWluYWxMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgbG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUodGVybWluYWxMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICBvdXRwdXQ6IGNvbXBsZXRlZERhdGEucmVzdWx0LFxuICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfZmFpbGVkOiBUZXJtaW5hbCBzdGF0ZSB3aXRoIGVycm9yXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBmYWlsaW5nIHRoZSBzYW1lIHN0ZXAgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBmYWlsZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgbG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgPyBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWxgO1xuICAgICAgICAgICAgY29uc3QgdGVybWluYWxMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgbG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUodGVybWluYWxMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgZmllbGQgaXMgU2VyaWFsaXplZERhdGEgKFVpbnQ4QXJyYXkpIHByb2R1Y2VkIGJ5XG4gICAgICAgICAgICAvLyBkZWh5ZHJhdGVTdGVwRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVTdGVwRXJyb3IgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZS5cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgIGVycm9yOiBmYWlsZWREYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX3JldHJ5aW5nOiBTZXRzIHN0YXR1cyBiYWNrIHRvICdwZW5kaW5nJywgcmVjb3JkcyBlcnJvclxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgY29uc3QgcmV0cnlEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgZXJyb3I6IHJldHJ5RGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICByZXRyeUFmdGVyOiByZXRyeURhdGEucmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIEhvb2sgbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgaG9va0RhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICB0b2tlbjogc3RyaW5nO1xuICAgICAgICAgICAgbWV0YWRhdGE/OiBhbnk7XG4gICAgICAgICAgICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICAgICAgICAgICAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBBdG9taWNhbGx5IGNsYWltIHRoZSB0b2tlbiB1c2luZyBhbiBleGNsdXNpdmUtY3JlYXRlIGNvbnN0cmFpbnQgZmlsZS5cbiAgICAgICAgICAvLyBUaGlzIGF2b2lkcyB0aGUgVE9DVE9VIHJhY2Ugb2YgdGhlIHByZXZpb3VzIHJlYWQtYWxsLXRoZW4tY2hlY2sgYXBwcm9hY2guXG4gICAgICAgICAgY29uc3QgY29uc3RyYWludFBhdGggPSBob29rVG9rZW5DbGFpbVBhdGgoYmFzZWRpciwgaG9va0RhdGEudG9rZW4pO1xuICAgICAgICAgIC8vIFBlcnNpc3QgYGV2ZW50SWRgIGluIHRoZSBjbGFpbSBzbyBjb25jdXJyZW50IC8gY3Jvc3MtXG4gICAgICAgICAgLy8gcHJvY2VzcyByZXRyaWVzIGNhbiBjb252ZXJnZSBvbiBhIHNpbmdsZSBjYW5vbmljYWxcbiAgICAgICAgICAvLyBgaG9va19jcmVhdGVkYCBldmVudCBwYXRoLiBTZWUgdGhlIHJlY292ZXJ5IGNvbW1lbnRcbiAgICAgICAgICAvLyBiZWxvdy5cbiAgICAgICAgICBjb25zdCBjbGFpbUNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICBob29rSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBCb3VuZGVkIGNsYWltIGxvb3AuIEEgc2FtZS10b2tlbiBjbGFpbSBjYW4gYmUgb2JzZXJ2ZWQgaW4gdGhlXG4gICAgICAgICAgLy8gc2hvcnQgd2luZG93IHdoZXJlIGl0cyByZWxlYXNlIGlzIGFscmVhZHkgY29tbWl0dGVkIGJ1dCB0aGVcbiAgICAgICAgICAvLyBjbGFpbSBmaWxlIGl0c2VsZiBpcyBzdGlsbCBvbiBkaXNrIChvciB3YXMganVzdCBkZWxldGVkKTpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgLSB0aGUgY2xhaW0gdmFuaXNoZWQgYmV0d2VlbiB0aGUgZXhjbHVzaXZlLWNyZWF0ZSBhdHRlbXB0XG4gICAgICAgICAgLy8gICAgIGFuZCB0aGUgb3duZXJzaGlwIHJlYWQg4oaSIHJldHJ5IGltbWVkaWF0ZWx5O1xuICAgICAgICAgIC8vICAgLSB0aGUgY2xhaW0gaXMgaGVsZCBieSBhIGRpc3Bvc2VkIGhvb2sgb3IgYSB0ZXJtaW5hbC9taXNzaW5nXG4gICAgICAgICAgLy8gICAgIHJ1biAoYGlzSG9va1Rva2VuQ2xhaW1SZWxlYXNhYmxlYCkg4oaSIHdhaXQgYnJpZWZseSBmb3IgdGhlXG4gICAgICAgICAgLy8gICAgIGluLWZsaWdodCByZWxlYXNlciAodGhlIGhvb2tfZGlzcG9zZWQgaGFuZGxlciBvciB0aGVcbiAgICAgICAgICAvLyAgICAgcnVuLWNvbXBsZXRpb24gY2xlYW51cCkgdG8gZGVsZXRlIGl0LCB0aGVuIHJlY2xhaW07IGlmIGl0XG4gICAgICAgICAgLy8gICAgIG5ldmVyIGRvZXMgKHRoZSByZWxlYXNlciBjcmFzaGVkIGFmdGVyIGNvbW1pdHRpbmcgaXRzXG4gICAgICAgICAgLy8gICAgIGRpc3Bvc2UgbG9jayAvIHRlcm1pbmFsIHN0YXR1cyksIHJlbGVhc2UgdGhlIHN0YWxlIGNsYWltXG4gICAgICAgICAgLy8gICAgIG91cnNlbHZlcyBhbmQgcmVjbGFpbS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYSBydW4gY2xhaW1pbmcgYSB0b2tlbiByaWdodCBhZnRlciB0aGUgcHJldmlvdXNcbiAgICAgICAgICAvLyBvd25lciBkaXNwb3NlZCBpdCByZWNvcmRzIGEgZHVyYWJsZSwgc3B1cmlvdXMgaG9va19jb25mbGljdFxuICAgICAgICAgIC8vIChpc3N1ZSAjMjc3OCkuIEEgZ2VudWluZWx5IGxpdmUgY2xhaW0gZXhpdHMgdGhlIGxvb3Agb24gdGhlXG4gICAgICAgICAgLy8gZmlyc3QgaXRlcmF0aW9uIGFuZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBkZWR1cCAvIGNvbmZsaWN0XG4gICAgICAgICAgLy8gaGFuZGxpbmcgYmVsb3cuXG4gICAgICAgICAgbGV0IHRva2VuQ2xhaW1lZCA9IGZhbHNlO1xuICAgICAgICAgIGxldCBleGlzdGluZ0NsYWltOiB6LmluZmVyPHR5cGVvZiBIb29rVG9rZW5DbGFpbVNjaGVtYT4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBsZXQgcmVsZWFzYWJsZU9ic2VydmF0aW9ucyA9IDA7XG4gICAgICAgICAgLy8gQSBjbGFpbSBmaWxlIHRoYXQgZXhpc3RzIChleGNsdXNpdmUtY3JlYXRlIGtlZXBzIGZhaWxpbmcpIGJ1dCBuZXZlclxuICAgICAgICAgIC8vIHBhcnNlcyBpcyBkZWJyaXM6IGB3cml0ZUV4Y2x1c2l2ZWAgd3JpdGVzIGF0b21pY2FsbHksIHNvIGEgbGl2ZVxuICAgICAgICAgIC8vIGNsYWltIGlzIGFsd2F5cyB2YWxpZCBKU09OIOKAlCBhbiB1bnBhcnNlYWJsZSBvbmUgYXQgdGhlIGNhbm9uaWNhbFxuICAgICAgICAgIC8vIHBhdGggaXMgYSBjb3JydXB0L3BhcnRpYWwgbGVmdG92ZXIuIFRoZSByZWxlYXNlciBsZWF2ZXMgaXQgYWxvbmVcbiAgICAgICAgICAvLyAob3duZXJzaGlwIGlzIHVuZGV0ZXJtaW5hYmxlKSwgc28gbm90aGluZyBlbHNlIHJlYXBzIGl0IGFuZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGJsb2NrIHRoZSB0b2tlbiBmb3JldmVyLiBGb3JjZS1kZWxldGUgaXQgYWZ0ZXIgYSBmZXcgb2JzZXJ2YXRpb25zLlxuICAgICAgICAgIGxldCB1bnBhcnNlYWJsZU9ic2VydmF0aW9ucyA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAxMDsgYXR0ZW1wdCsrKSB7XG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBjbGFpbSBpcyBhYnNlbnQsIHRoZSBldmVudCBsb2cgaXMgdGhlIG9ubHkgZHVyYWJsZVxuICAgICAgICAgICAgLy8gc291cmNlIHRoYXQgY2FuIGRpc3Rpbmd1aXNoIGEgZmlyc3QgaG9vayBmcm9tIGEgY3Jhc2gtbG9zdFxuICAgICAgICAgICAgLy8gdG9rZW4gY2FjaGUuXG4gICAgICAgICAgICBpZiAoIShhd2FpdCByZWFkSG9va1Rva2VuQ2xhaW0oY29uc3RyYWludFBhdGgpKSkge1xuICAgICAgICAgICAgICBhd2FpdCByZWJ1aWxkTGl2ZUhvb2tCeVRva2VuRnJvbUV2ZW50TG9nKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbkNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShjb25zdHJhaW50UGF0aCwgY2xhaW1Db250ZW50KTtcbiAgICAgICAgICAgIGlmICh0b2tlbkNsYWltZWQpIGJyZWFrO1xuXG4gICAgICAgICAgICBleGlzdGluZ0NsYWltID0gYXdhaXQgcmVhZEhvb2tUb2tlbkNsYWltKGNvbnN0cmFpbnRQYXRoKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RpbmdDbGFpbSkge1xuICAgICAgICAgICAgICAvLyBUaGUgY2xhaW0gZWl0aGVyIHZhbmlzaGVkIChyYWNlZCBhIHJlbGVhc2VyIGJldHdlZW4gdGhlXG4gICAgICAgICAgICAgIC8vIGV4Y2x1c2l2ZS1jcmVhdGUgYXR0ZW1wdCBhbmQgdGhpcyByZWFkIOKGkiByZXRyeSByZXNvbHZlcyBpdCkgb3JcbiAgICAgICAgICAgICAgLy8gZXhpc3RzIGJ1dCBpcyB1bnBhcnNlYWJsZS4gYHJlYWRIb29rVG9rZW5DbGFpbWAgY2FuJ3QgdGVsbCB0aGVtXG4gICAgICAgICAgICAgIC8vIGFwYXJ0LCBzbyBjb3VudCBjb25zZWN1dGl2ZSBtaXNzZXM7IG9uY2Ugd2UncmUgY29uZmlkZW50IGl0IGlzXG4gICAgICAgICAgICAgIC8vIG5vdCBhIHRyYW5zaWVudCByYWNlLCBkZWxldGUgdGhlIChwcmVzdW1lZCBjb3JydXB0KSBmaWxlIHNvIHRoZVxuICAgICAgICAgICAgICAvLyB0b2tlbiBpc24ndCBibG9ja2VkIGZvcmV2ZXIuIGBkZWxldGVKU09OYCBpcyBhIG5vLW9wIGlmIGl0IHdhc1xuICAgICAgICAgICAgICAvLyBpbiBmYWN0IGEgdmFuaXNoZWQtY2xhaW0gcmFjZS5cbiAgICAgICAgICAgICAgdW5wYXJzZWFibGVPYnNlcnZhdGlvbnMrKztcbiAgICAgICAgICAgICAgaWYgKHVucGFyc2VhYmxlT2JzZXJ2YXRpb25zID49IDMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKGNvbnN0cmFpbnRQYXRoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbS5ydW5JZCA9PT0gZWZmZWN0aXZlUnVuSWQgJiZcbiAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbS5ob29rSWQgPT09IGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIE91ciBvd24gcHJpb3IgY2xhaW0g4oCUIGRlZHVwLXJlY292ZXJ5IGhhbmRsaW5nIGJlbG93LlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIShhd2FpdCBpc0hvb2tUb2tlbkNsYWltUmVsZWFzYWJsZShiYXNlZGlyLCBleGlzdGluZ0NsYWltLCB0YWcpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIEdlbnVpbmVseSBsaXZlIGNsYWltIOKAlCBjb25mbGljdCBoYW5kbGluZyBiZWxvdy5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWxlYXNhYmxlT2JzZXJ2YXRpb25zKys7XG4gICAgICAgICAgICBpZiAocmVsZWFzYWJsZU9ic2VydmF0aW9ucyA8IDMpIHtcbiAgICAgICAgICAgICAgLy8gR2l2ZSB0aGUgaW4tZmxpZ2h0IHJlbGVhc2VyIGEgbW9tZW50IHRvIGRlbGV0ZSB0aGUgY2xhaW0uXG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUaGUgcmVsZWFzZXIgaXMgbm90IGNvbWluZy4gUmVsZWFzZSB0aGUgc3RhbGUgY2xhaW0gYW5kXG4gICAgICAgICAgICAgIC8vIHRoZSBob29rIGVudGl0eSBpdCBwb2ludHMgYXQsIG1pcnJvcmluZyB0aGUgaG9va19kaXNwb3NlZFxuICAgICAgICAgICAgICAvLyBjbGVhbnVwLlxuICAgICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKGNvbnN0cmFpbnRQYXRoKTtcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2xhaW0uaG9va0lkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2hvb2tzJywgZXhpc3RpbmdDbGFpbS5ob29rSWQsIHRhZylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgICBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbS5ydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbS5ob29rSWRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBleGlzdGluZ0NsYWltID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWNvdmVyeSBzaGFwZTogdGhlIGR1cmFibGUgcmVjb3JkIG9mIGEgc3VjY2Vzc2Z1bCBob29rXG4gICAgICAgICAgLy8gY3JlYXRpb24gaXMgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgICAgICAgIC8vIGNsYWltIGZpbGUgYW5kIGhvb2sgZW50aXR5IGFyZSB3cml0dGVuIGJlZm9yZSB0aGUgZXZlbnQsXG4gICAgICAgICAgLy8gYW5kIHRoZSB0aHJlZSB3cml0ZXMgYXJlIE5PVCBhdG9taWMsIHNvIGEgY3Jhc2ggYXQgYW55XG4gICAgICAgICAgLy8gcG9pbnQgY2FuIGxlYXZlIG9uZSBvciB0d28gb2YgdGhlbSBvbiBkaXNrIHdpdGhvdXQgdGhlXG4gICAgICAgICAgLy8gZXZlbnQuIFRyZWF0aW5nIHRob3NlIGFzIFwiY29tcGxldGVkXCIgd291bGQgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgc3dhbGxvdyB0aGUgcmV0cnkgYW5kIHBlcm1hbmVudGx5IGxvc2VcbiAgICAgICAgICAvLyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZnJvbSB0aGUgbG9nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2hlbiB0aGUgZGVkdXAgYnJhbmNoIGZpcmVzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYCxcbiAgICAgICAgICAvLyB3ZSBjb252ZXJnZSBvbiB0aGUgY2Fub25pY2FsIGBldmVudElkYCBwZXJzaXN0ZWQgaW4gdGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBieSB0aGUgb3JpZ2luYWwgKHdpbm5pbmcpIGB3cml0ZUV4Y2x1c2l2ZWAuIEJ5XG4gICAgICAgICAgLy8gYWRvcHRpbmcgdGhhdCBldmVudElkIGZvciB0aGlzIHJldHJ5J3MgZXZlbnQgd3JpdGUg4oCUIGFuZFxuICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG91dGVyIG5vLW92ZXJ3cml0ZSBgd3JpdGVKU09OYCBmb3IgdGhlIGV2ZW50XG4gICAgICAgICAgLy8gdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgIG9uIGNvbGxpc2lvbiDigJQgY29uY3VycmVudCAvXG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGVpdGhlcjpcbiAgICAgICAgICAvLyAgIC0gcHVibGlzaCB0aGUgc2FtZSBldmVudCBhdCB0aGUgc2FtZSBwYXRoIGV4YWN0bHkgb25jZVxuICAgICAgICAgIC8vICAgICAodGhlIGxvc2VyJ3MgYHdyaXRlSlNPTmAgdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gICAgICAgICAgLy8gICAgIHdoaWNoIHRoZSBydW50aW1lJ3MgZXhpc3RpbmcgY29uY3VycmVudC1yZXBsYXkgY2F0Y2hcbiAgICAgICAgICAvLyAgICAgcGF0aCBhdCBzdXNwZW5zaW9uLWhhbmRsZXIudHM6MTQyIHN3YWxsb3dzKSwgb3JcbiAgICAgICAgICAvLyAgIC0gY29udmVyZ2Ugb24gYSBzaW5nbGUgcmVjb3Zlcnkgd3JpdGUgd2hlbiB0aGUgcHJpb3JcbiAgICAgICAgICAvLyAgICAgY2xhaW0gd2FzIG9ycGhhbmVkIGJ5IGEgY3Jhc2ggYmVmb3JlIHRoZSBldmVudCBsYW5kZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgbGVnYWN5IGZhbGxiYWNrIChgZXhpc3RpbmdDbGFpbS5ldmVudElkYCB1bmRlZmluZWQpXG4gICAgICAgICAgLy8gaXMgZm9yIGNsYWltIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgd2FzIGFkZGVkIOKAlFxuICAgICAgICAgIC8vIHRob3NlIHByb2JlIHRoZSBldmVudCBsb2cgZGlyZWN0bHkgYW5kIGZhbGwgdGhyb3VnaCB0byBhXG4gICAgICAgICAgLy8gZnJlc2gtZXZlbnRJZCByZWNvdmVyeSB3cml0ZS4gVGhlIGxlZ2FjeSBwYXRoIGRvZXMgbm90XG4gICAgICAgICAgLy8gY29udmVyZ2UgYWNyb3NzIHdvcmtlcnMgYnV0IGNhbm5vdCByZWdyZXNzIGJlaGF2aW9yIGZvclxuICAgICAgICAgIC8vIGZyZXNobHktd3JpdHRlbiBjbGFpbXMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgYHdpdGhIb29rTG9ja2AgaW4tcHJvY2VzcyBtdXRleCBhYm92ZSBrZWVwcyB0d28gc2FtZS1cbiAgICAgICAgICAvLyB0aWNrIGluLXByb2Nlc3MgY2FsbGVycyBmcm9tIHJhY2luZyBpbnRvIHRoaXMgYnJhbmNoIHdpdGhcbiAgICAgICAgICAvLyB0aGUgd2lubmVyIG1pZC13cml0ZSwgYnV0IGlzIG5vdCBzdWZmaWNpZW50IGFjcm9zc1xuICAgICAgICAgIC8vIHByb2Nlc3NlcyDigJQgdGhlIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IChgY2xhaW0uZXZlbnRJZGApXG4gICAgICAgICAgLy8gaXMgd2hhdCBjbG9zZXMgdGhlIGNyb3NzLXByb2Nlc3MgcmFjZS5cbiAgICAgICAgICBsZXQgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCF0b2tlbkNsYWltZWQpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbT8ucnVuSWQgPT09IGVmZmVjdGl2ZVJ1bklkICYmXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0uaG9va0lkID09PSBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZG9wdCBhIGNhbm9uaWNhbCBldmVudElkIGZvciB0aGUgcmVjb3Zlcnkgd3JpdGUuIFRoZVxuICAgICAgICAgICAgICAvLyBvdXRlciBldmVudCBwdWJsaXNoIChgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWApXG4gICAgICAgICAgICAgIC8vIGVpdGhlciBzdWNjZWVkcyAod2UgcHVibGlzaCB0aGUgY2Fub25pY2FsIGV2ZW50LFxuICAgICAgICAgICAgICAvLyByZXBhaXJpbmcgYSBwYXJ0aWFsIHdyaXRlIGxlZnQgYnkgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgIC8vIGNsYWltYW50KSBvciByZXR1cm5zIGBmYWxzZWAgYW5kIHdlIHRocm93XG4gICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAodGhlIGV2ZW50IHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAgIC8vIHB1Ymxpc2hlZCDigJQgYSByZWFsIGR1cGxpY2F0ZSkuIEVpdGhlciB3YXkgdGhlIGxvZ1xuICAgICAgICAgICAgICAvLyBlbmRzIHdpdGggZXhhY3RseSBvbmUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgLy8gYChydW5JZCwgaG9va0lkKWAuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnRJZCBjb21lcyBmcm9tIG9uZSBvZiB0d28gcGxhY2VzOlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyAgIC0gYGV4aXN0aW5nQ2xhaW0uZXZlbnRJZGAgZm9yIGNsYWltcyB3cml0dGVuIGJ5XG4gICAgICAgICAgICAgIC8vICAgICB0aGlzIHZlcnNpb24gKHRoZSB3cml0ZXIgYWJvdmUgcGVyc2lzdHMgdGhlXG4gICAgICAgICAgICAgIC8vICAgICBjYW5kaWRhdGUgZXZlbnRJZCBhdG9taWNhbGx5IHdpdGggdGhlIGNsYWltKS5cbiAgICAgICAgICAgICAgLy8gICAgIFRoZSBldmVudElkIGlzIGR1cmFibGUsIHNvIHRoZSBvdXRlclxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGFsb25lIGlzIGVub3VnaCB0b1xuICAgICAgICAgICAgICAvLyAgICAgYXJiaXRyYXRlIHB1YmxpY2F0aW9uOiBpdCBmYWlscyBpZmYgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICB3YXMgYWxyZWFkeSBwdWJsaXNoZWQgYXQgdGhhdCBleGFjdCBwYXRoLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyAgIC0gVGhlIHJlY292ZXJ5LW1hcmtlciBzaWRlY2FyIGZvciBsZWdhY3kgY2xhaW1zXG4gICAgICAgICAgICAgIC8vICAgICB3cml0dGVuIGJlZm9yZSBgZXZlbnRJZGAgd2FzIHBlcnNpc3RlZCBpbmxpbmVcbiAgICAgICAgICAgICAgLy8gICAgIGluIHRoZSBjbGFpbS4gVGhlIG1hcmtlciBpcyBpdHNlbGYgYVxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlYCwgc28gdGhlIGZpcnN0IHJldHJ5IHBpbnMgaXRzXG4gICAgICAgICAgICAgIC8vICAgICBjYW5kaWRhdGUgZXZlbnRJZCBhcyBjYW5vbmljYWwgYW5kIHN1YnNlcXVlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHJldHJpZXMgYWRvcHQgaXQuIFdpdGhvdXQgdGhpcywgdHdvIHByb2Nlc3Nlc1xuICAgICAgICAgICAgICAvLyAgICAgYm90aCByZWFkaW5nIHRoZSBzYW1lIGxlZ2FjeSBjbGFpbSB3b3VsZCBlYWNoXG4gICAgICAgICAgICAgIC8vICAgICBnZW5lcmF0ZSB0aGVpciBvd24gZXZlbnRJZCwgbGFuZCB0aGVpclxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGNhbGxzIGF0IGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyAgICAgcGF0aHMsIGFuZCBhcHBlbmQgdHdvIGV2ZW50cy5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAgIEZvciBsZWdhY3kgY2xhaW1zIHdlIGFsc28gbXVzdCBwcm9iZSB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIGxvZyBmb3IgYW4gZXhpc3RpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnQgQkVGT1JFXG4gICAgICAgICAgICAgIC8vICAgICBwaW5uaW5nIGEgY2Fub25pY2FsIGV2ZW50SWQ6IHRoZSBwcmUtdXBncmFkZVxuICAgICAgICAgICAgICAvLyAgICAgd3JpdGVyIG1heSBoYXZlIGFscmVhZHkgcHVibGlzaGVkIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgd2l0aCBpdHMgb3duIGV2ZW50SWQsIGFuZCB0aGUgbWFya2VyIGhhcyBubyB3YXlcbiAgICAgICAgICAgICAgLy8gICAgIG9mIGtub3dpbmcgdGhhdCBldmVudElkIGFmdGVyIHRoZSBmYWN0LiBXaXRob3V0XG4gICAgICAgICAgICAgIC8vICAgICB0aGlzIHByb2JlLCBhIHBvc3QtdXBncmFkZSByZXRyeSB3b3VsZCBwaW4gYVxuICAgICAgICAgICAgICAvLyAgICAgZGlmZmVyZW50IGV2ZW50SWQsIHdyaXRlIGEgaG9vayBlbnRpdHksIGFuZFxuICAgICAgICAgICAgICAvLyAgICAgcHVibGlzaCBhIGR1cGxpY2F0ZSBldmVudCBhdCB0aGUgbWFya2VyJ3MgcGF0aC5cbiAgICAgICAgICAgICAgbGV0IGNhbm9uaWNhbEV2ZW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2xhaW0uZXZlbnRJZCkge1xuICAgICAgICAgICAgICAgIGNhbm9uaWNhbEV2ZW50SWQgPSBleGlzdGluZ0NsYWltLmV2ZW50SWQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQgPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgZmluZEV4aXN0aW5nSG9va0NyZWF0ZWRFdmVudElkKFxuICAgICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHVibGlzaGVkRXZlbnRJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZS11cGdyYWRlIHdyaXRlciBtYXkgaGF2ZSBjcmFzaGVkIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBldmVudCBwdWJsaXNoIGFuZCBpdHMgaG9vayBlbnRpdHkgd3JpdGUg4oCUXG4gICAgICAgICAgICAgICAgICAvLyByZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBwZXJzaXN0ZWQgZXZlbnQnc1xuICAgICAgICAgICAgICAgICAgLy8gcGF5bG9hZCBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ24gZHVwbGljYXRlLlxuICAgICAgICAgICAgICAgICAgYXdhaXQgcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZCA9IGF3YWl0IHBpbkNhbm9uaWNhbEV2ZW50SWRGb3JMZWdhY3lDbGFpbShcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgZXZlbnRJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHBpbm5lZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gTG9zdCB0aGUgbWFya2VyIHJhY2UgYW5kIHRoZSBtYXJrZXIgZmlsZSBpc1xuICAgICAgICAgICAgICAgICAgLy8gdW5yZWFkYWJsZSAoZXh0cmVtZWx5IHJhcmU7IGNvcnJ1cHRlZCBkaXNrKS5cbiAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IGFzIGEgcmVhbCBkdXBsaWNhdGUgc28gdGhlIHJ1bnRpbWUnc1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBzd2FsbG93cyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IGluc3RlYWQgb2Ygcmlza2luZyBkaXZlcmdlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHB1YmxpY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBIb29rIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2Fub25pY2FsRXZlbnRJZCA9IHBpbm5lZDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlYnVpbGQgYGV2ZW50YCB3aXRoIHRoZSBjYW5vbmljYWwgZXZlbnRJZCBhbmQgYVxuICAgICAgICAgICAgICAvLyBkZXRlcm1pbmlzdGljIGBjcmVhdGVkQXRgIGRlcml2ZWQgZnJvbSB0aGUgZXZlbnRJZFxuICAgICAgICAgICAgICAvLyAoYSBVTElEKSBzbyB0d28gd29ya2VycyB3cml0aW5nIHRoZSBzYW1lIGV2ZW50XG4gICAgICAgICAgICAgIC8vIHByb2R1Y2UgYnl0ZS1pZGVudGljYWwgY29udGVudC5cbiAgICAgICAgICAgICAgZXZlbnRJZCA9IGNhbm9uaWNhbEV2ZW50SWQ7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbENyZWF0ZWRBdCA9XG4gICAgICAgICAgICAgICAgdWxpZFRvRGF0ZShldmVudElkLnJlcGxhY2UoL15ldm50Xy8sICcnKSkgPz8gbm93O1xuICAgICAgICAgICAgICBldmVudCA9IHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY2Fub25pY2FsQ3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDcm9zcy1ob29rIC8gY3Jvc3MtcnVuIGNvbmZsaWN0OiBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyAocnVuSWQsIGhvb2tJZCkgaG9sZHMgdGhpcyB0b2tlbi4gQ3JlYXRlIGFcbiAgICAgICAgICAgICAgLy8gaG9va19jb25mbGljdCBldmVudCBzbyB0aGUgd29ya2Zsb3cgY2FuIGZhaWxcbiAgICAgICAgICAgICAgLy8gZ3JhY2VmdWxseSB3aGVuIHRoZSBob29rIGlzIGF3YWl0ZWQuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY29uZmxpY3QnLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICAgIC4uLihleGlzdGluZ0NsYWltXG4gICAgICAgICAgICAgICAgICAgID8geyBjb25mbGljdGluZ1J1bklkOiBleGlzdGluZ0NsYWltLnJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgLy8gUGVyc2lzdCBhbmQgY2FjaGUgdGhlIGNvbmZsaWN0IGV2ZW50IChjcmVhdGUtb25seSxcbiAgICAgICAgICAgICAgLy8gc2FtZSBwYXRoIHRoZSByZWFkIGNhY2hlIGtleXMgb24pIHNvIGFuIGltbWVkaWF0ZVxuICAgICAgICAgICAgICAvLyByZXBsYXkgY2FuIHNlcnZlIGl0IHdpdGhvdXQgcmVyZWFkaW5nIGZyb20gZGlzay5cbiAgICAgICAgICAgICAgYXdhaXQgc3RvcmVFdmVudChjb25mbGljdEV2ZW50KTtcblxuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgICAgcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoXG4gICAgICAgICAgICAgICAgY29uZmxpY3RFdmVudCxcbiAgICAgICAgICAgICAgICByZXNvbHZlRGF0YVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGNvbmZsaWN0IGV2ZW50IChubyBob29rIGVudGl0eSBjcmVhdGVkKVxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBmaWx0ZXJlZEV2ZW50LFxuICAgICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIGhvb2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBob29rIGVudGl0eSBub3csIGJ1dCBkZWZlciBpdHMgd3JpdGUgdW50aWxcbiAgICAgICAgICAvLyBBRlRFUiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCBhdCB0aGUgYm90dG9tIG9mIHRoaXNcbiAgICAgICAgICAvLyBmdW5jdGlvbiBjb21taXRzLiBUaGUgcmV0cnkgcGF0aCBjYW4gcmVhY2ggdGhpcyBicmFuY2hcbiAgICAgICAgICAvLyBmb3IgYSBob29rIHdob3NlIGBob29rX2NyZWF0ZWRgIGV2ZW50IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gcHVibGlzaGVkIHN1Y2Nlc3NmdWxseSAoYW4gXCJhbHJlYWR5LWNvbW1pdHRlZFxuICAgICAgICAgIC8vIGR1cGxpY2F0ZVwiKTsgaW4gdGhhdCBjYXNlIHRoZSBvdXRlciBgd3JpdGVFeGNsdXNpdmVgXG4gICAgICAgICAgLy8gZm9yIHRoZSBldmVudCB3aWxsIHJldHVybiBmYWxzZSBhbmQgd2Ugd2lsbCB0aHJvd1xuICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYC4gV3JpdGluZyB0aGUgaG9vayBlbnRpdHkgaGVyZVxuICAgICAgICAgIC8vIGZpcnN0IHdvdWxkIG11dGF0ZSBhbHJlYWR5LWNvbW1pdHRlZCBkdXJhYmxlIHN0YXRlIHdpdGhcbiAgICAgICAgICAvLyB0aGUgcmV0cnkncyBwYXlsb2FkIChlLmcuIGRpZmZlcmVudCBgbWV0YWRhdGFgIG9yXG4gICAgICAgICAgLy8gYGlzV2ViaG9va2ApIGJlZm9yZSB0aGUgZXZlbnQgcHVibGlzaCBwcm92ZWQgd2hpY2hcbiAgICAgICAgICAvLyBvdXRjb21lIHdlIGFyZSBpbiDigJQgbGVhdmluZyB0aGUgZW50aXR5IGFuZCBldmVudCBsb2dcbiAgICAgICAgICAvLyBpbmNvbnNpc3RlbnQuIEJ5IGRlZmVycmluZywgdGhlIGVudGl0eSBpcyBvbmx5IHdyaXR0ZW5cbiAgICAgICAgICAvLyB3aGVuIHRoZSBwdWJsaXNoIGFjdHVhbGx5IHN1Y2NlZWRzIChmaXJzdCB3cml0ZXIgb3JcbiAgICAgICAgICAvLyBvcnBoYW4gcmVjb3ZlcnkpLiBTZWUgcHJhbmF5Z3AncyByZXZpZXcgb24gUFIgIzIyOTUgZm9yXG4gICAgICAgICAgLy8gdGhlIGthcnRoaWtzY2FsZTMgcmVwcm8uXG4gICAgICAgICAgaG9vayA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tEYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6ICdsb2NhbCcsXG4gICAgICAgICAgICAvLyBVc2UgdGhlIChwb3NzaWJseSBjYW5vbmljYWwpIGV2ZW50J3MgY3JlYXRlZEF0IHNvIHR3b1xuICAgICAgICAgICAgLy8gd29ya2VycyB3cml0aW5nIHRoZSBzYW1lIGhvb2sgZW50aXR5IHByb2R1Y2UgYnl0ZS1cbiAgICAgICAgICAgIC8vIGlkZW50aWNhbCBjb250ZW50IGR1cmluZyBjb252ZXJnZW5jZS5cbiAgICAgICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBob29rIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rRGF0YS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICBpc1N5c3RlbTogaG9va0RhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zID0gd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZVxuICAgICAgICAgICAgPyB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIC8vIEluZGV4IGVudHJpZXMgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoIChzZWUgaG9vay1pbmRleC50c1xuICAgICAgICAgIC8vIGNyYXNoLW9yZGVyaW5nIGludmFyaWFudCkuIGBldmVudElkYCBpcyBmaW5hbCBoZXJlIOKAlCB0aGVcbiAgICAgICAgICAvLyBkZWR1cC1yZWNvdmVyeSBicmFuY2ggYWJvdmUgYWxyZWFkeSByZWFzc2lnbmVkIGl0IHRvIHRoZVxuICAgICAgICAgIC8vIGNhbm9uaWNhbCBpZCB3aGVuIGFwcGxpY2FibGUuXG4gICAgICAgICAgYXdhaXQgd3JpdGVIb29rQ3JlYXRlZEluZGV4RW50cmllcyhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAgIC8vIGhvb2tfZGlzcG9zZWQ6IERlbGV0ZXMgaG9vayBlbnRpdHksIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGRpc3Bvc2luZyB0aGUgc2FtZSBob29rIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgLy8gVGhlIGxvY2sgZG91YmxlcyBhcyB0aGUgZHVyYWJsZSBkaXNwb3NhbCBtYXJrZXIgY29uc3VsdGVkIGJ5IHRoZVxuICAgICAgICAgIC8vIGhvb2tfY3JlYXRlZCBjbGFpbSBwYXRoIGFuZCB0aGUgZXZlbnQtbG9nIHJlYnVpbGQgKHNlZVxuICAgICAgICAgIC8vIGBpc0hvb2tEaXNwb3NhbENvbW1pdHRlZGApLCB3aGljaCBpcyB3aHkgaXQgbXVzdCBiZSB3cml0dGVuXG4gICAgICAgICAgLy8gYmVmb3JlIGFueSBvZiB0aGUgZGVzdHJ1Y3RpdmUgZGVsZXRlcyBiZWxvdy5cbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IGhvb2tEaXNwb3NlTG9ja1BhdGgoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobG9ja1BhdGgsICcnKTtcbiAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZGlzcG9zZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZWFkIHRoZSBob29rIHRvIGdldCBpdHMgdG9rZW4gYmVmb3JlIGRlbGV0aW5nXG4gICAgICAgICAgY29uc3QgaG9va1BhdGggPSB0YWdnZWRQYXRoKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBIb29rU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgICAgICAgICAvLyBSZWxlYXNlIHRoZSB0b2tlbiBjbGFpbSB0byBmcmVlIHVwIHRoZSB0b2tlbiBmb3IgcmV1c2Ug4oCUXG4gICAgICAgICAgICAvLyBidXQgb25seSBpZiBpdCBzdGlsbCBwb2ludHMgYXQgdGhpcyBob29rLiBBIGNsYWltYW50IHRoYXRcbiAgICAgICAgICAgIC8vIGZvcmNlLXJlbGVhc2VkIHRoaXMgaG9vaydzIHN0YWxlIGNsYWltIChzZWVcbiAgICAgICAgICAgIC8vIGBpc0hvb2tUb2tlbkNsYWltUmVsZWFzYWJsZWApIG1heSBhbHJlYWR5IGhvbGQgYSBmcmVzaFxuICAgICAgICAgICAgLy8gY2xhaW0gZm9yIHRoZSB0b2tlbjsgZGVsZXRpbmcgdW5jb25kaXRpb25hbGx5IGhlcmUgd291bGRcbiAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhhdCBsaXZlIGNsYWltIGFuZCB0cmFuc2llbnRseSBicmVhayB0b2tlblxuICAgICAgICAgICAgLy8gdW5pcXVlbmVzcy4gQWxzbyBkZWxldGUgdGhpcyBob29rJ3MgcmVjb3ZlcnkgbWFya2VyIChpZlxuICAgICAgICAgICAgLy8gYW55KSBmb3IgZGlzayBoeWdpZW5lLiBUaGUgbWFya2VyJ3MgZmlsZW5hbWUgaGFzaFxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgYCh0b2tlbiwgcnVuSWQsIGhvb2tJZClgIHNvIGRpZmZlcmVudFxuICAgICAgICAgICAgLy8gbGlmZXRpbWVzIG5ldmVyIGNvbGxpZGUsIGJ1dCBjbGVhbmluZyB1cCByZWR1Y2VzIGRpc2tcbiAgICAgICAgICAgIC8vIGxlYWsgZm9yIGhvb2tzIHRoYXQgZ28gdGhyb3VnaCB0aGUgcmVjb3ZlcnkgcGF0aC5cbiAgICAgICAgICAgIGF3YWl0IHJlbGVhc2VIb29rVG9rZW5DbGFpbUlmT3duZWRCeShcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnRva2VuLFxuICAgICAgICAgICAgICBleGlzdGluZ0hvb2sucnVuSWQsXG4gICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ob29rSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2suaG9va0lkXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUhvb2tCeVJ1bk1hcmtlcihcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyB3YWl0X2NyZWF0ZWQ6IENyZWF0ZXMgd2FpdCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3dhaXRpbmcnLlxuICAgICAgICAgIC8vIEF0b21pYyBjbGFpbSBvbiBhIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpIGNvbnN0cmFpbnQgZmlsZVxuICAgICAgICAgIC8vIGVuc3VyZXMgZHVwbGljYXRlIHdhaXRfY3JlYXRlZCBmcm9tIGNvbmN1cnJlbnQgaW52b2NhdGlvbnNcbiAgICAgICAgICAvLyBzdXJmYWNlcyBhcyBFbnRpdHlDb25mbGljdEVycm9yIChyZXBsYWNlcyBhIHByaW9yIFRPQ1RPVVxuICAgICAgICAgIC8vIHJlYWQtdGhlbi1jaGVjayB0aGF0IGNvdWxkIGxldCBib3RoIHdyaXRlcnMgdGhyb3VnaCkuXG4gICAgICAgICAgY29uc3Qgd2FpdENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7d2FpdENvbXBvc2l0ZUtleX0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWRgO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZENsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkTG9ja1BhdGgsXG4gICAgICAgICAgICAnJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF3YWl0Q3JlYXRlZENsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgd2FpdERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICByZXN1bWVBdD86IERhdGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3YWl0ID0ge1xuICAgICAgICAgICAgd2FpdElkOiB3YWl0Q29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgc3RhdHVzOiAnd2FpdGluZycsXG4gICAgICAgICAgICByZXN1bWVBdDogd2FpdERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3dhaXRzJywgd2FpdENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHdhaXRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQ6IFRyYW5zaXRpb25zIHdhaXQgdG8gJ2NvbXBsZXRlZCcsIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGNvbXBsZXRpbmcgdGhlIHNhbWUgd2FpdCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0TG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7d2FpdENvbXBvc2l0ZUtleX0uY29tcGxldGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7d2FpdENvbXBvc2l0ZUtleX0uY29tcGxldGVkYDtcbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNvbXBsZXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nV2FpdCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0Q29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgV2FpdFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFleGlzdGluZ1dhaXQpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBsb2NrIGZpbGUgd2UganVzdCBjbGFpbWVkIOKAlCB0aGUgd2FpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9ja1BhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGxvY2sgZmlsZSAod3JpdGVFeGNsdXNpdmUgYWJvdmUpIGFscmVhZHkgcHJldmVudHMgY29uY3VycmVudFxuICAgICAgICAgIC8vIGNvbXBsZXRpb25zIOKAlCBubyBhZGRpdGlvbmFsIHN0YXR1cyBjaGVjayBuZWVkZWQuXG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nV2FpdCxcbiAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0LFxuICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogaG9va19yZWNlaXZlZCBldmVudHMgYXJlIHN0b3JlZCBpbiB0aGUgZXZlbnQgbG9nIGJ1dCBkb24ndFxuICAgICAgICAvLyBtb2RpZnkgdGhlIEhvb2sgZW50aXR5ICh3aGljaCBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkIGZpZWxkKVxuXG4gICAgICAgIC8vIFN0b3JlIGV2ZW50IHVzaW5nIGNvbXBvc2l0ZSBrZXkge3J1bklkfS17ZXZlbnRJZH0uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGB3cml0ZUV4Y2x1c2l2ZWAgKE9fQ1JFQVR8T19FWENMIHZpYSB0ZW1wLWZpbGUgKyBoYXJkLWxpbmspXG4gICAgICAgIC8vIGlzIHRoZSBjcm9zcy1wcm9jZXNzIGF0b21pYyBwdWJsaXNoIHByaW1pdGl2ZTogaWYgdGhlIGZpbGVcbiAgICAgICAgLy8gYWxyZWFkeSBleGlzdHMsIHJldHVybnMgZmFsc2UgaW5zdGVhZCBvZiBvdmVyd3JpdGluZy4gVGhpc1xuICAgICAgICAvLyBpcyBjcml0aWNhbCBmb3IgdGhlIGhvb2tfY3JlYXRlZCBkZWR1cC1yZWNvdmVyeSBjb252ZXJnZW5jZVxuICAgICAgICAvLyAoYWJvdmUpIOKAlCB0d28gd29ya2VycyB0aGF0IGFkb3B0IHRoZSBzYW1lIGNhbm9uaWNhbCBldmVudElkXG4gICAgICAgIC8vIHJhY2UgaGVyZTsgd2hvZXZlciBsaW5rcyB0aGUgZmlsZSBmaXJzdCB3aW5zLCB0aGUgbG9zZXJcbiAgICAgICAgLy8gdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsIGFuZCB0aGUgcnVudGltZSdzIGV4aXN0aW5nXG4gICAgICAgIC8vIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggYXQgc3VzcGVuc2lvbi1oYW5kbGVyLnRzOjE0MlxuICAgICAgICAvLyBzd2FsbG93cyBpdC4gRm9yIGFsbCBvdGhlciBldmVudCB0eXBlcywgZXZlbnRJZHMgYXJlXG4gICAgICAgIC8vIG1vbm90b25pYyBVTElEcyAoZ2xvYmFsbHkgdW5pcXVlIGJ5IGNvbnN0cnVjdGlvbikgc28gYVxuICAgICAgICAvLyBjb2xsaXNpb24gaW5kaWNhdGVzIGEgcmVhbCBidWcgYW5kIEVudGl0eUNvbmZsaWN0RXJyb3IgaXNcbiAgICAgICAgLy8gYWxzbyB0aGUgcmlnaHQgc3VyZmFjZSDigJQgc2FtZSBzaGFwZSBhcyBzdGVwX2NyZWF0ZWQnc1xuICAgICAgICAvLyBjbGFpbS1maWxlIGJlaGF2aW9yLlxuICAgICAgICAvLyBMYXN0LWluc3RhbnQgcmUtdmFsaWRhdGlvbiBmb3IgYGhvb2tfcmVjZWl2ZWRgIChzZWUgdGhlIGFjY2VwdGFuY2VcbiAgICAgICAgLy8gY2hlY2sgYWJvdmUpLiBUaGUgcGVyLWhvb2sgaW4tcHJvY2VzcyBsb2NrIGFscmVhZHkgc2VyaWFsaXplc1xuICAgICAgICAvLyByZXN1bWUgdnMuIGRpc3Bvc2Ugd2l0aGluIG9uZSBzdG9yYWdlIGluc3RhbmNlOyB0aGlzIHNlY29uZCBjaGVja1xuICAgICAgICAvLyBuYXJyb3dzIHRoZSBjcm9zcy1pbnN0YW5jZSB3aW5kb3cgKGluZGVwZW5kZW50IGxvY2sgbWFwcywgc2hhcmVkXG4gICAgICAgIC8vIGZpbGVzeXN0ZW0pIHRvIHRoZSBzaW5nbGUgZXZlbnQgd3JpdGUgYmVsb3csIG1hdGNoaW5nIHRoZVxuICAgICAgICAvLyBtb2R1bGUncyBjb252ZW50aW9uIHRoYXQgdGhlIG9uLWRpc2sgbG9jayBmaWxlIOKAlCBub3QgdGhlXG4gICAgICAgIC8vIGluLXByb2Nlc3MgbXV0ZXgg4oCUIGlzIHRoZSBkdXJhYmxlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCcgJiZcbiAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgICAgICAoYXdhaXQgaXNIb29rRGlzcG9zYWxDb21taXR0ZWQoYmFzZWRpciwgZGF0YS5jb3JyZWxhdGlvbklkLCB0YWcpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgY29uc3QgZXZlbnRQYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpO1xuICAgICAgICAvLyBDYXB0dXJlIHRoZSBzZXJpYWxpemVkIHBheWxvYWQgYmVmb3JlIHRoZSB3cml0ZSdzIGBhd2FpdGAgc28gdGhlXG4gICAgICAgIC8vIGNhY2hlZCBzbmFwc2hvdCBjYW4ndCBvYnNlcnZlIGEgbGF0ZXIgbXV0YXRpb24gKHNlZVxuICAgICAgICAvLyByZW1lbWJlclN0b3JlZEV2ZW50KS5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZEV2ZW50ID0gSlNPTi5zdHJpbmdpZnkoZXZlbnQsIGpzb25SZXBsYWNlciwgMik7XG4gICAgICAgIGNvbnN0IGV2ZW50UHVibGlzaGVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoLCBzZXJpYWxpemVkRXZlbnQpO1xuICAgICAgICBpZiAoIWV2ZW50UHVibGlzaGVkKSB7XG4gICAgICAgICAgLy8gRm9yIGBob29rX2NyZWF0ZWRgLCBsb3NpbmcgdGhlIGV2ZW50IHB1Ymxpc2ggbWVhbnMgdGhlXG4gICAgICAgICAgLy8gZXZlbnQgd2FzIGFscmVhZHkgY29tbWl0dGVkIGF0IHRoaXMgZXhhY3QgKGNhbm9uaWNhbClcbiAgICAgICAgICAvLyBwYXRoLiBUaGUgb3JpZ2luYWwgcHVibGlzaGVyIG1heSBoYXZlIGNyYXNoZWQgYmV0d2VlblxuICAgICAgICAgIC8vIGl0cyBldmVudCBwdWJsaXNoIGFuZCBpdHMgZGVmZXJyZWQgaG9vay1lbnRpdHkgd3JpdGVcbiAgICAgICAgICAvLyAodGhlIGludmVyc2Ugb2YgdGhlIGNyYXNoIHdpbmRvdyB0aGUgZGVmZXJyYWwgY2xvc2VzKSxcbiAgICAgICAgICAvLyBsZWF2aW5nIGFuIGV2ZW50LWZpcnN0IG9ycGhhbjogdGhlIGV2ZW50IGlzIGluIHRoZSBsb2dcbiAgICAgICAgICAvLyBidXQgdGhlIGVudGl0eSBpcyBtaXNzaW5nIGFuZCB0aGUgaG9vayBpcyB1bnJlc29sdmFibGUuXG4gICAgICAgICAgLy8gUmVwYWlyIHRoZSBlbnRpdHkgZnJvbSB0aGUgUEVSU0lTVEVEIGV2ZW50J3MgcGF5bG9hZFxuICAgICAgICAgIC8vIChuZXZlciB0aGUgcmV0cnkncyDigJQgZGlmZmVyZW50IHJldHJ5IG1ldGFkYXRhIG11c3Qgbm90XG4gICAgICAgICAgLy8gY2hhbmdlIGNvbW1pdHRlZCBzdGF0ZSkgYmVmb3JlIHN1cmZhY2luZyB0aGUgYmVuaWduXG4gICAgICAgICAgLy8gZHVwbGljYXRlIHRvIHRoZSBydW50aW1lJ3MgY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aC5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICAgICAgYXdhaXQgcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgIGBFdmVudCBcIiR7ZXZlbnRJZH1cIiBhbHJlYWR5IGV4aXN0cyBmb3IgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGV2ZW50IGlzIG5vdyBjb21taXR0ZWQ7IGNhY2hlIGl0IHNvIGFuIGltbWVkaWF0ZSBzZXF1ZW50aWFsXG4gICAgICAgIC8vIHJlcGxheSBjYW4gc2VydmUgaXQgd2l0aG91dCByZXJlYWRpbmcgZnJvbSBkaXNrLlxuICAgICAgICByZW1lbWJlclN0b3JlZEV2ZW50KGV2ZW50LCBldmVudFBhdGgsIHNlcmlhbGl6ZWRFdmVudCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGhvb2sgZW50aXR5IE9OTFkgbm93IHRoYXQgdGhlIGV2ZW50IHB1Ymxpc2ggaGFzXG4gICAgICAgIC8vIGNvbW1pdHRlZC4gRG9pbmcgdGhpcyBlYXJsaWVyIChpbiB0aGUgYGhvb2tfY3JlYXRlZGBcbiAgICAgICAgLy8gYnJhbmNoIGFib3ZlKSB3b3VsZCBtdXRhdGUgYW4gYWxyZWFkeS1jb21taXR0ZWQgaG9va1xuICAgICAgICAvLyBlbnRpdHkgd2l0aCB0aGUgcmV0cnkncyBwYXlsb2FkIGJlZm9yZSB0aGUgZXZlbnQgcHVibGlzaFxuICAgICAgICAvLyBwcm92ZWQgd2hldGhlciB0aGlzIGF0dGVtcHQgd2FzIHJlcGFpcmluZyBhIG1pc3NpbmcgZXZlbnRcbiAgICAgICAgLy8gb3IganVzdCBjb2xsaWRpbmcgd2l0aCBhbiBhbHJlYWR5LXB1Ymxpc2hlZCBgaG9va19jcmVhdGVkYC5cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBzZXRzIGBob29rRW50aXR5V3JpdGVPcHRpb25zYCBpZmYgdGhpcyBldmVudFxuICAgICAgICAvLyB0eXBlIHdyaXRlcyBhbiBlbnRpdHkuXG4gICAgICAgIGlmIChob29rICYmIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICAgIC8vIE1hcmtlciBiZWZvcmUgZW50aXR5IChzZWUgaG9vay1pbmRleC50cyBjcmFzaC1vcmRlcmluZ1xuICAgICAgICAgIC8vIGludmFyaWFudCkuXG4gICAgICAgICAgYXdhaXQgd3JpdGVIb29rQnlSdW5NYXJrZXIoYmFzZWRpciwgaG9vay5ydW5JZCwgaG9vay5ob29rSWQsIHRhZyk7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rLmhvb2tJZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgY2FjaGVkSXRlbXM6IGV2ZW50Q2FjaGUsXG4gICAgICAgICAgICBmaWxlUHJlZml4OiBgJHtlZmZlY3RpdmVSdW5JZH0tYCxcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgICBsaW1pdDogMTAwMCxcbiAgICAgICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgICAgICBnZXRJZDogKGUpID0+IGUuZXZlbnRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudHMgPSBhbGxFdmVudHMuZGF0YTtcbiAgICAgICAgICBjdXJzb3IgPSBhbGxFdmVudHMuY3Vyc29yO1xuICAgICAgICAgIGhhc01vcmUgPSBhbGxFdmVudHMuaGFzTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElubGluZS1kZWx0YSBvcHRpbWl6YXRpb246IG9uIGEgc3RlcC10ZXJtaW5hbCB3cml0ZSB0aGUgaW5saW5lXG4gICAgICAgIC8vIHJ1bnRpbWUgbG9vcCBjYW4gcGFzcyBgc2luY2VDdXJzb3JgICh0aGUgY3Vyc29yIGZyb20gYmVmb3JlIGl0XG4gICAgICAgIC8vIGJlZ2FuIHdyaXRpbmcgdGhpcyBzdGVwJ3MgZXZlbnRzKS4gV2UgcmV0dXJuIHRoZSBkZWx0YSBvZlxuICAgICAgICAvLyBldmVudHMgd3JpdHRlbiBzdHJpY3RseSBhZnRlciB0aGF0IGN1cnNvciDigJQgZXhhY3RseSB3aGF0IGFuXG4gICAgICAgIC8vIGBldmVudHMubGlzdCh7IGN1cnNvcjogc2luY2VDdXJzb3IsIHNvcnRPcmRlcjogJ2FzYycgfSlgIHdvdWxkXG4gICAgICAgIC8vIHJldHVybiByaWdodCBub3cg4oCUIHNvIHRoZSBsb29wIGNhbiBza2lwIGEgcmVkdW5kYW50IHJvdW5kLXRyaXAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgaXMgY29tcHV0ZWQgYWdhaW5zdCB0aGUgc2FtZSBvbi1kaXNrIGxvZyB0aGUgbGlzdCBwYXRoXG4gICAgICAgIC8vIHJlYWRzLCBzbyBpdCBjYXB0dXJlcyBldmVyeXRoaW5nIHRoZSBmZXRjaCB3b3VsZDogdGhpcyBzdGVwJ3NcbiAgICAgICAgLy8gc3RlcF9jcmVhdGVkL3N0ZXBfc3RhcnRlZC9zdGVwX2NvbXBsZXRlZCwgYW55IGF0dHJfc2V0IHRoZSBzdGVwXG4gICAgICAgIC8vIGJvZHkgd3JvdGUsIGFuZCBhbnkgaW4tYmFuZCBldmVudHMgKGUuZy4gaG9va19yZWNlaXZlZCxcbiAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQpIGFub3RoZXIgd3JpdGVyIGFwcGVuZGVkIHNpbmNlIHRoZSBjdXJzb3IuIFRoYXRcbiAgICAgICAgLy8gZXF1aXZhbGVuY2UgaXMgd2hhdCBtYWtlcyBza2lwcGluZyB0aGUgZmV0Y2ggc2FmZSDigJQgYSBtaXNzZWRcbiAgICAgICAgLy8gaW4tYmFuZCBldmVudCBjYW5ub3QgZGl2ZXJnZSByZXBsYXkgYmVjYXVzZSB0aGUgZGVsdGEgaXMgdGhlXG4gICAgICAgIC8vIGZldGNoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbmx5IHN0ZXAtdGVybWluYWwgZXZlbnRzIHF1YWxpZnk6IHN0ZXBfY3JlYXRlZC9zdGVwX3N0YXJ0ZWQgYXJlXG4gICAgICAgIC8vIG5vdCBsb29wIGJvdW5kYXJpZXMgKHRoZSBsb29wIGZldGNoZXMgYWZ0ZXIgc3RlcF9jb21wbGV0ZWQgL1xuICAgICAgICAvLyBzdGVwX2ZhaWxlZCksIGFuZCBydW4tdGVybWluYWwgZXZlbnRzIGVuZCB0aGUgbG9vcC4gYHJlc29sdmVEYXRhYFxuICAgICAgICAvLyBtYXRjaGVzIHRoZSBsaXN0IHBhdGggc28gZXZlbnREYXRhIHJlZnMgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc1Rlcm1pbmFsU3RlcEV2ZW50VHlwZShkYXRhLmV2ZW50VHlwZSkgJiZcbiAgICAgICAgICB0eXBlb2YgcGFyYW1zPy5zaW5jZUN1cnNvciA9PT0gJ3N0cmluZydcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSBubyBgbGltaXRgOiB0aGlzIHJldHVybnMgYSBzaW5nbGUgZGVmYXVsdC1zaXplIHBhZ2UsXG4gICAgICAgICAgLy8gdW5saWtlIHRoZSBgZXZlbnRzLmxpc3RgIHBhdGggd2hpY2ggbG9vcHMgYHdoaWxlIChoYXNNb3JlKWAgdG9cbiAgICAgICAgICAvLyBleGhhdXN0aW9uLiBUaGF0IGlzIHNhZmUg4oCUIGFuZCBtdXN0IE5PVCBiZSBcImZpeGVkXCIgYnkgcGFnaW5hdGluZ1xuICAgICAgICAgIC8vIGhlcmUg4oCUIGJlY2F1c2UgdGhlIGNvbnRyYWN0IGlzIHNpbmdsZS1wYWdlLW9yLWZhbGxiYWNrLCBub3RcbiAgICAgICAgICAvLyBjb21wbGV0ZS1kZWx0YS4gV2hlbiB0aGUgZGVsdGEgb3ZlcmZsb3dzIG9uZSBwYWdlLFxuICAgICAgICAgIC8vIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSBzZXRzIGBoYXNNb3JlOiB0cnVlYCBhbmQgc2xpY2VzIGBkYXRhYCB0b1xuICAgICAgICAgIC8vIHRoZSBwYWdlIChzZWUgZnMudHMpLCB3aGljaCB3ZSBmb3J3YXJkIHZlcmJhdGltIGJlbG93LiBUaGUgU0RLXG4gICAgICAgICAgLy8gY29uc3VtZSBzaWRlIChydW50aW1lLnRzKSBvbmx5IHN0YXNoZXMgdGhlIGRlbHRhIHdoZW4gYCFoYXNNb3JlYFxuICAgICAgICAgIC8vIGFuZCBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB0aGUgZXhoYXVzdGl2ZSBgZXZlbnRzLmxpc3RgIGxvb3AsIHNvIGFcbiAgICAgICAgICAvLyB0cnVuY2F0ZWQgcGFnZSBpcyBuZXZlciBjb25zdW1lZCBhcyBpZiBpdCB3ZXJlIHRoZSBmdWxsIGRlbHRhLlxuICAgICAgICAgIGNvbnN0IGRlbHRhID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICAgICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgICAgICBmaWxlUHJlZml4OiBgJHtlZmZlY3RpdmVSdW5JZH0tYCxcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgICBjdXJzb3I6IHBhcmFtcy5zaW5jZUN1cnNvcixcbiAgICAgICAgICAgIGdldENyZWF0ZWRBdDogZ2V0T2JqZWN0Q3JlYXRlZEF0KCdldm50JyksXG4gICAgICAgICAgICBnZXRJZDogKGUpID0+IGUuZXZlbnRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudHMgPVxuICAgICAgICAgICAgcmVzb2x2ZURhdGEgPT09ICdub25lJ1xuICAgICAgICAgICAgICA/IGRlbHRhLmRhdGEubWFwKChlKSA9PiBzdHJpcEV2ZW50RGF0YVJlZnMoZSwgcmVzb2x2ZURhdGEpKVxuICAgICAgICAgICAgICA6IGRlbHRhLmRhdGE7XG4gICAgICAgICAgY3Vyc29yID0gZGVsdGEuY3Vyc29yO1xuICAgICAgICAgIGhhc01vcmUgPSBkZWx0YS5oYXNNb3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIEV2ZW50UmVzdWx0IHdpdGggZXZlbnQgYW5kIGFueSBjcmVhdGVkL3VwZGF0ZWQgZW50aXR5XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXZlbnQ6IGZpbHRlcmVkRXZlbnQsXG4gICAgICAgICAgcnVuLFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgaG9vayxcbiAgICAgICAgICB3YWl0LFxuICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICBjdXJzb3IsXG4gICAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgICAuLi4oc3RlcENyZWF0ZWRMYXppbHkgPyB7IHN0ZXBDcmVhdGVkOiB0cnVlIH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICB9IC8vIGVuZCBjcmVhdGVJbXBsXG4gICAgfSxcblxuICAgIGFzeW5jIGdldChydW5JZCwgZXZlbnRJZCwgcGFyYW1zKSB7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdldmVudElkJywgZXZlbnRJZCk7XG4gICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtydW5JZH0tJHtldmVudElkfWA7XG4gICAgICBjb25zdCBldmVudCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICBiYXNlZGlyLFxuICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgY29tcG9zaXRlS2V5LFxuICAgICAgICBFdmVudFNjaGVtYSxcbiAgICAgICAgdGFnXG4gICAgICApO1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV2ZW50ICR7ZXZlbnRJZH0gaW4gcnVuICR7cnVuSWR9IG5vdCBmb3VuZGApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXM/LnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgIHJldHVybiBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgbGlzdChwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHsgcnVuSWQgfSA9IHBhcmFtcztcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIGNhY2hlZEl0ZW1zOiBldmVudENhY2hlLFxuICAgICAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QnlDb3JyZWxhdGlvbklkKHBhcmFtcykge1xuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIGNhY2hlZEl0ZW1zOiBldmVudENhY2hlLFxuICAgICAgICAvLyBObyBmaWxlUHJlZml4IC0gc2VhcmNoIGFsbCBldmVudHNcbiAgICAgICAgZmlsdGVyOiAoZXZlbnQpID0+IGV2ZW50LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQsXG4gICAgICAgIC8vIEV2ZW50cyBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIChvbGRlc3QgZmlyc3QpIGJ5IGRlZmF1bHQsXG4gICAgICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IGZvciBvdGhlciBsaXN0IGNhbGxzLlxuICAgICAgICBzb3J0T3JkZXI6IHBhcmFtcy5wYWdpbmF0aW9uPy5zb3J0T3JkZXIgPz8gJ2FzYycsXG4gICAgICAgIGxpbWl0OiBwYXJhbXMucGFnaW5hdGlvbj8ubGltaXQsXG4gICAgICAgIGN1cnNvcjogcGFyYW1zLnBhZ2luYXRpb24/LmN1cnNvcixcbiAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgZ2V0SWQ6IChldmVudCkgPT4gZXZlbnQuZXZlbnRJZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiByZXNvbHZlRGF0YSBpcyBcIm5vbmVcIiwgcmVtb3ZlIGV2ZW50RGF0YSBmcm9tIGV2ZW50c1xuICAgICAgaWYgKHJlc29sdmVEYXRhID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGEubWFwKChldmVudCkgPT5cbiAgICAgICAgICAgIHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xufVxuIl19