@workflow/world-local 5.0.0-beta.19 → 5.0.0-beta.20

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.
@@ -485,6 +485,18 @@ export function createEventsStorage(basedir, tag) {
485
485
  // ============================================================
486
486
  // VALIDATION: Terminal state and event ordering checks
487
487
  // ============================================================
488
+ // Lazy step start: a step_started carrying step-creation data
489
+ // (stepName + input) is allowed to arrive with no prior step_created
490
+ // — it creates the step on the fly (see the materialization block
491
+ // below). This mirrors the resilient run_started path. Detect it here
492
+ // so the entity-creation terminal-run guard treats it like a creation
493
+ // and the "step must exist" ordering guard doesn't reject it.
494
+ const lazyStepStart = data.eventType === 'step_started' &&
495
+ 'eventData' in data &&
496
+ !!data.eventData &&
497
+ typeof data.eventData.stepName ===
498
+ 'string' &&
499
+ data.eventData.input !== undefined;
488
500
  // Run terminal state validation
489
501
  if (currentRun && isRunTerminal(currentRun.status)) {
490
502
  const runTerminalEvents = [
@@ -521,10 +533,14 @@ export function createEventsStorage(basedir, tag) {
521
533
  data.eventType === 'run_cancelled') {
522
534
  throw new EntityConflictError(`Cannot transition run from terminal state "${currentRun.status}"`);
523
535
  }
524
- // Creating new entities on terminal runs is not allowed
536
+ // Creating new entities on terminal runs is not allowed. A lazy
537
+ // step_started creates a step, so it is rejected here too — a bare
538
+ // (non-lazy) step_started falls through to the step-validation
539
+ // block below, which uses RunExpiredError for terminal runs.
525
540
  if (data.eventType === 'step_created' ||
526
541
  data.eventType === 'hook_created' ||
527
- data.eventType === 'wait_created') {
542
+ data.eventType === 'wait_created' ||
543
+ lazyStepStart) {
528
544
  throw new EntityConflictError(`Cannot create new entities on run in terminal state "${currentRun.status}"`);
529
545
  }
530
546
  if (data.eventType === 'attr_set') {
@@ -543,18 +559,35 @@ export function createEventsStorage(basedir, tag) {
543
559
  if (stepEvents.includes(data.eventType) && data.correlationId) {
544
560
  const stepCompositeKey = `${effectiveRunId}-${data.correlationId}`;
545
561
  validatedStep = await readJSONWithFallback(basedir, 'steps', stepCompositeKey, StepSchema, tag);
546
- // Event ordering: step must exist before these events
547
- if (!validatedStep) {
562
+ // Event ordering: step must exist before these events — except on
563
+ // the lazy-start path, where step_started creates the step itself.
564
+ if (!validatedStep && !lazyStepStart) {
548
565
  throw new WorkflowWorldError(`Step "${data.correlationId}" not found`);
549
566
  }
550
- // Step terminal state validation
551
- if (isStepTerminal(validatedStep.status)) {
552
- throw new EntityConflictError(`Cannot modify step in terminal state "${validatedStep.status}"`);
567
+ // Lazy start exactly-once gate: a lazy step_started always CREATES
568
+ // the step (the owned-inline path only sends one for a step whose
569
+ // step_created it deferred). If the step already exists, a concurrent
570
+ // handler won the create — this caller is a loser and must not start
571
+ // or run the step. Throw EntityConflictError so the runtime's
572
+ // executeStep maps it to `skipped`. This is critical: the plain start
573
+ // transition below permits re-starting a non-terminal step (retries
574
+ // rely on that), so without this gate a loser would re-start a
575
+ // running step and run the body a second time.
576
+ if (lazyStepStart && validatedStep) {
577
+ throw new EntityConflictError(`Step "${data.correlationId}" already created`);
553
578
  }
554
- // On terminal runs: only allow completing/failing in-progress steps
555
- if (currentRun && isRunTerminal(currentRun.status)) {
556
- if (validatedStep.status !== 'running') {
557
- throw new RunExpiredError(`Cannot modify non-running step on run in terminal state "${currentRun.status}"`);
579
+ // Step terminal state validation. validatedStep can be null only on
580
+ // the lazy-start path (no step yet) — there is nothing terminal to
581
+ // guard against in that case, so these checks are skipped.
582
+ if (validatedStep) {
583
+ if (isStepTerminal(validatedStep.status)) {
584
+ throw new EntityConflictError(`Cannot modify step in terminal state "${validatedStep.status}"`);
585
+ }
586
+ // On terminal runs: only allow completing/failing in-progress steps
587
+ if (currentRun && isRunTerminal(currentRun.status)) {
588
+ if (validatedStep.status !== 'running') {
589
+ throw new RunExpiredError(`Cannot modify non-running step on run in terminal state "${currentRun.status}"`);
590
+ }
558
591
  }
559
592
  }
560
593
  }
@@ -583,11 +616,25 @@ export function createEventsStorage(basedir, tag) {
583
616
  if (data.eventType === 'run_started' && 'eventData' in event) {
584
617
  delete event.eventData;
585
618
  }
619
+ // Strip only the step `input` from the lazy step_started event row —
620
+ // it belongs on the synthetic step_created written above. stepName is
621
+ // preserved for the client replay consumer's step-name divergence
622
+ // check (packages/core/src/step.ts).
623
+ if (lazyStepStart &&
624
+ 'eventData' in event &&
625
+ event.eventData) {
626
+ const { input: _strippedInput, ...rest } = event.eventData;
627
+ event.eventData = rest;
628
+ }
586
629
  // Track entity created/updated for EventResult
587
630
  let run;
588
631
  let step;
589
632
  let hook;
590
633
  let wait;
634
+ // Lazy step start: set true when this step_started atomically created
635
+ // the step (the caller won the create-claim). Surfaced on EventResult
636
+ // as the runtime's exactly-once ownership signal.
637
+ let stepCreatedLazily = false;
591
638
  // For `hook_created`, the hook entity write is deferred until
592
639
  // AFTER the outer event publish succeeds, so a retry that
593
640
  // collides with an already-published `hook_created` does not
@@ -831,6 +878,72 @@ export function createEventsStorage(basedir, tag) {
831
878
  // step_started: Increments attempt, sets status to 'running'
832
879
  // Sets startedAt only on the first start (not updated on retries)
833
880
  // Reuse validatedStep from validation (already read above)
881
+ // Lazy step start: no prior step_created — create the step entity
882
+ // and a synthetic step_created event now, then fall through to the
883
+ // start transition below. Mirrors the resilient run_started path:
884
+ // the step entity is claimed atomically (first writer wins) and the
885
+ // synthetic step_created event keeps replay correct (the client step
886
+ // consumer marks hasCreatedEvent only when it observes that event).
887
+ if (!validatedStep && lazyStepStart) {
888
+ const lazyData = data.eventData;
889
+ const stepCreatedLockName = tag
890
+ ? `${effectiveRunId}-${data.correlationId}.created.${tag}`
891
+ : `${effectiveRunId}-${data.correlationId}.created`;
892
+ const stepCreatedLockPath = resolveWithinBase(basedir, '.locks', 'steps', stepCreatedLockName);
893
+ const stepCreatedClaimed = await writeExclusive(stepCreatedLockPath, '');
894
+ if (!stepCreatedClaimed) {
895
+ // A concurrent handler already claimed the create for this
896
+ // step. The atomic claim is the exactly-once ownership gate:
897
+ // only the winner runs the step body inline. Throw
898
+ // EntityConflictError — the runtime's executeStep maps this to
899
+ // `skipped`, so the loser does not start or run the step. This
900
+ // preserves the same "exactly one handler owns each step"
901
+ // guarantee the separate step_created claim provides today.
902
+ throw new EntityConflictError(`Step "${data.correlationId}" already created`);
903
+ }
904
+ else {
905
+ const createdStep = {
906
+ runId: effectiveRunId,
907
+ stepId: data.correlationId,
908
+ stepName: lazyData.stepName,
909
+ status: 'pending',
910
+ input: lazyData.input,
911
+ output: undefined,
912
+ error: undefined,
913
+ attempt: 0,
914
+ startedAt: undefined,
915
+ completedAt: undefined,
916
+ createdAt: now,
917
+ updatedAt: now,
918
+ specVersion: effectiveSpecVersion,
919
+ };
920
+ await writeJSON(taggedPath(basedir, 'steps', `${effectiveRunId}-${data.correlationId}`, tag), createdStep);
921
+ // Write the synthetic step_created event so replay observes it
922
+ // (the client step consumer sets hasCreatedEvent only on a
923
+ // step_created event). Its eventId is a fresh monotonic ULID.
924
+ // Ordering vs. the step_started event row does not affect
925
+ // correctness: the step_started consumer is a no-op and only
926
+ // step_created flips hasCreatedEvent, so the end state is the
927
+ // same whichever sorts first — this matches the resilient
928
+ // run_started → run_created precedent in this file.
929
+ const stepCreatedEventId = `evnt_${monotonicUlid()}`;
930
+ const stepCreatedEvent = {
931
+ eventType: 'step_created',
932
+ runId: effectiveRunId,
933
+ eventId: stepCreatedEventId,
934
+ createdAt: now,
935
+ specVersion: effectiveSpecVersion,
936
+ correlationId: data.correlationId,
937
+ eventData: {
938
+ stepName: lazyData.stepName,
939
+ input: lazyData.input,
940
+ },
941
+ };
942
+ await writeJSON(taggedPath(basedir, 'events', `${effectiveRunId}-${stepCreatedEventId}`, tag), stepCreatedEvent);
943
+ validatedStep = createdStep;
944
+ stepCreatedLazily = true;
945
+ }
946
+ }
834
947
  if (validatedStep) {
835
948
  // Check if retryAfter timestamp hasn't been reached yet
836
949
  if (validatedStep.retryAfter &&
@@ -1293,6 +1406,55 @@ export function createEventsStorage(basedir, tag) {
1293
1406
  cursor = allEvents.cursor;
1294
1407
  hasMore = allEvents.hasMore;
1295
1408
  }
1409
+ // Inline-delta optimization: on a step-terminal write the inline
1410
+ // runtime loop can pass `sinceCursor` (the cursor from before it
1411
+ // began writing this step's events). We return the delta of
1412
+ // events written strictly after that cursor — exactly what an
1413
+ // `events.list({ cursor: sinceCursor, sortOrder: 'asc' })` would
1414
+ // return right now — so the loop can skip a redundant round-trip.
1415
+ //
1416
+ // This is computed against the same on-disk log the list path
1417
+ // reads, so it captures everything the fetch would: this step's
1418
+ // step_created/step_started/step_completed, any attr_set the step
1419
+ // body wrote, and any in-band events (e.g. hook_received,
1420
+ // wait_completed) another writer appended since the cursor. That
1421
+ // equivalence is what makes skipping the fetch safe — a missed
1422
+ // in-band event cannot diverge replay because the delta is the
1423
+ // fetch.
1424
+ //
1425
+ // Only step-terminal events qualify: step_created/step_started are
1426
+ // not loop boundaries (the loop fetches after step_completed /
1427
+ // step_failed), and run-terminal events end the loop. `resolveData`
1428
+ // matches the list path so eventData refs are handled identically.
1429
+ if ((data.eventType === 'step_completed' ||
1430
+ data.eventType === 'step_failed') &&
1431
+ typeof params?.sinceCursor === 'string') {
1432
+ // Intentionally no `limit`: this returns a single default-size page,
1433
+ // unlike the `events.list` path which loops `while (hasMore)` to
1434
+ // exhaustion. That is safe — and must NOT be "fixed" by paginating
1435
+ // here — because the contract is single-page-or-fallback, not
1436
+ // complete-delta. When the delta overflows one page,
1437
+ // paginatedFileSystemQuery sets `hasMore: true` and slices `data` to
1438
+ // the page (see fs.ts), which we forward verbatim below. The SDK
1439
+ // consume side (runtime.ts) only stashes the delta when `!hasMore`
1440
+ // and otherwise falls back to the exhaustive `events.list` loop, so a
1441
+ // truncated page is never consumed as if it were the full delta.
1442
+ const delta = await paginatedFileSystemQuery({
1443
+ directory: path.join(basedir, 'events'),
1444
+ schema: EventSchema,
1445
+ filePrefix: `${effectiveRunId}-`,
1446
+ sortOrder: 'asc',
1447
+ cursor: params.sinceCursor,
1448
+ getCreatedAt: getObjectCreatedAt('evnt'),
1449
+ getId: (e) => e.eventId,
1450
+ });
1451
+ events =
1452
+ resolveData === 'none'
1453
+ ? delta.data.map((e) => stripEventDataRefs(e, resolveData))
1454
+ : delta.data;
1455
+ cursor = delta.cursor;
1456
+ hasMore = delta.hasMore;
1457
+ }
1296
1458
  // Return EventResult with event and any created/updated entity
1297
1459
  return {
1298
1460
  event: filteredEvent,
@@ -1303,6 +1465,7 @@ export function createEventsStorage(basedir, tag) {
1303
1465
  events,
1304
1466
  cursor,
1305
1467
  hasMore,
1468
+ ...(stepCreatedLazily ? { stepCreated: true } : {}),
1306
1469
  };
1307
1470
  } // end createImpl
1308
1471
  },
@@ -1370,4 +1533,4 @@ export function createEventsStorage(basedir, tag) {
1370
1533
  },
1371
1534
  };
1372
1535
  }
1373
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsYUFBYSxHQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFB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LEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUs7Z0JBQy9CLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU07Z0JBQ2pDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU87YUFDaEMsQ0FBQyxDQUFDO1lBRUgseURBQXlEO1lBQ3pELElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixPQUFPO29CQUNMLEdBQUcsTUFBTTtvQkFDVCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUM5QixrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQ3ZDO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFJ1bk5vdFN1cHBvcnRlZEVycm9yLFxuICBUb29FYXJseUVycm9yLFxuICBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV2ZW50LFxuICBFdmVudFJlc3VsdCxcbiAgSG9vayxcbiAgU2VyaWFsaXplZERhdGEsXG4gIFN0ZXAsXG4gIFN0b3JhZ2UsXG4gIFdhaXQsXG4gIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgYXBwbHlBdHRyaWJ1dGVDaGFuZ2VzLFxuICBFdmVudFNjaGVtYSxcbiAgSG9va1NjaGVtYSxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgcmVxdWlyZXNOZXdlcldvcmxkLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU3RlcFNjaGVtYSxcbiAgdWxpZFRvRGF0ZSxcbiAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzLFxuICB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAsXG4gIFdhaXRTY2hlbWEsXG4gIFdvcmtmbG93UnVuU2NoZW1hLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT04gfSBmcm9tICcuLi9jb25maWcuanMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkLFxuICBkZWxldGVKU09OLFxuICBqc29uUmVwbGFjZXIsXG4gIGxpc3RKU09ORmlsZXMsXG4gIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSxcbiAgcmVhZEpTT04sXG4gIHJlYWRKU09OV2l0aEZhbGxiYWNrLFxuICByZXNvbHZlV2l0aGluQmFzZSxcbiAgdGFnZ2VkUGF0aCxcbiAgd3JpdGVFeGNsdXNpdmUsXG4gIHdyaXRlSlNPTixcbn0gZnJvbSAnLi4vZnMuanMnO1xuaW1wb3J0IHsgc3RyaXBFdmVudERhdGFSZWZzIH0gZnJvbSAnLi9maWx0ZXJzLmpzJztcbmltcG9ydCB7XG4gIGdldE9iamVjdENyZWF0ZWRBdCxcbiAgaGFzaFRva2VuLFxuICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoLFxuICBtb25vdG9uaWNVbGlkLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgZGVsZXRlQWxsSG9va3NGb3JSdW4gfSBmcm9tICcuL2hvb2tzLXN0b3JhZ2UuanMnO1xuaW1wb3J0IHsgaGFuZGxlTGVnYWN5RXZlbnQgfSBmcm9tICcuL2xlZ2FjeS5qcyc7XG5pbXBvcnQgeyB3aXRoUnVuRmlsZUxvY2sgfSBmcm9tICcuL3J1bnMtc3RvcmFnZS5qcyc7XG5cbi8qKlxuICogUGVyLXN0ZXAgaW4tcHJvY2VzcyBhc3luYyBtdXRleC4gU2VyaWFsaXplcyBjb25jdXJyZW50IGBldmVudHMuY3JlYXRlYCBjYWxsc1xuICogdGhhdCB0YXJnZXQgdGhlIHNhbWUgc3RlcCwgc28gdGhhdCB0aGUgXCJjaGVjayB0ZXJtaW5hbCBzdGF0ZSwgdGhlbiB3cml0ZSBzdGVwXG4gKiBlbnRpdHkgKyBldmVudFwiIHNlcXVlbmNlIGlzIGF0b21pYy4gV2l0aG91dCB0aGlzLCB0d28gY29uY3VycmVudCBzdGVwX3N0YXJ0ZWRcbiAqIGNhbGxzIGNhbiBib3RoIHBhc3MgdGhlIG5vdC10ZXJtaW5hbCBjaGVjayBhbmQgYm90aCB3cml0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzXG4gKiDigJQgb3IgYSBzdGVwX3N0YXJ0ZWQgY2FuIGxhbmQgaW4gdGhlIGxvZyBhZnRlciBzdGVwX2NvbXBsZXRlZCBoYXMgYWxyZWFkeVxuICogd3JpdHRlbiwgcHJvZHVjaW5nIHVuY29uc3VtZWQgZXZlbnRzIG9uIHJlcGxheS5cbiAqXG4gKiBEdXBsaWNhdGUgc3RlcF9zdGFydGVkIGV2ZW50cyBmb3IgYSBub24tdGVybWluYWwgc3RlcCBhcmUgc3RpbGwgYWxsb3dlZFxuICogKHJldHJpZXMgbGVnaXRpbWF0ZWx5IHJlLXN0YXJ0IGEgc3RlcCksIG9ubHkgd3JpdGVzIHRvIGFuIGFscmVhZHktdGVybWluYWxcbiAqIHN0ZXAgYXJlIHJlamVjdGVkLlxuICovXG4vLyBgc3RlcExvY2tzYCBhbmQgYGhvb2tMb2Nrc2AgYXJlIG5vdyBpbnN0YW50aWF0ZWQgcGVyXG4vLyBgY3JlYXRlRXZlbnRzU3RvcmFnZWAgY2FsbCAoc2VlIGluc2lkZSB0aGUgZnVuY3Rpb24pIHJhdGhlciB0aGFuXG4vLyBiZWluZyBtb2R1bGUtbGV2ZWwuIFRoZSBvbi1kaXNrIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyByZW1haW5cbi8vIHRoZSBkdXJhYmxlIHNvdXJjZSBvZiB0cnV0aCBhY3Jvc3MgcHJvY2Vzc2VzOyB0aGUgaW4tcHJvY2Vzc1xuLy8gbXV0ZXggaXMgYSBwZXItaW5zdGFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgY2xvc2VzIGEgc2hvcnQgcmFjZVxuLy8gd2luZG93IGluIHRoZSBkZWR1cC1yZWNvdmVyeSBwYXRoLiBQZXItaW5zdGFuY2Ugc2NvcGluZyBsZXRzXG4vLyB0ZXN0cyBzaW11bGF0ZSBjcm9zcy1wcm9jZXNzIGJlaGF2aW9yIHdpdGggdHdvIHN0b3JhZ2UgaW5zdGFuY2VzXG4vLyBzaGFyaW5nIG9uZSBkYXRhIGRpcmVjdG9yeSAoZWFjaCBpbnN0YW5jZSBoYXMgaW5kZXBlbmRlbnQgbG9ja3Ncbi8vIGJ1dCBhIHNoYXJlZCBmaWxlc3lzdGVtKSwgZXhhY3RseSBtYXRjaGluZyB0aGUgY3Jvc3MtcHJvY2Vzc1xuLy8gc2VtYW50aWNzIHdpdGhvdXQgc3Bhd25pbmcgc3VicHJvY2Vzc2VzLlxuXG5jb25zdCBIb29rVG9rZW5DbGFpbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gVGhlIHRva2VuLWNsYWltIHdyaXRlciBiZWxvdyBoYXMgYWx3YXlzIHBlcnNpc3RlZCBgaG9va0lkYCwgYnV0XG4gIC8vIHRoaXMgcmVhZCBzY2hlbWEgcHJldmlvdXNseSBvbWl0dGVkIGl0LCB3aGljaCBpcyB0aGUgYnVnIGZpeGVkXG4gIC8vIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvd29ya2Zsb3cvaXNzdWVzLzIyODMuIGBvcHRpb25hbCgpYFxuICAvLyBpcyBkZWZlbnNpdmU6IGFueSBjbGFpbSBmaWxlIHRoYXQgc29tZWhvdyBsYWNrcyB0aGUgZmllbGQgc3RpbGxcbiAgLy8gcGFyc2VzICh5aWVsZGluZyBgdW5kZWZpbmVkYCkgYW5kIGZhbGxzIHRocm91Z2ggdG8gdGhlIGNyb3NzLVxuICAvLyBob29rIGNvbmZsaWN0IGJyYW5jaCwgbWF0Y2hpbmcgcHJlLWZpeCBiZWhhdmlvci5cbiAgaG9va0lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHJ1bklkOiB6LnN0cmluZygpLFxuICAvLyBgZXZlbnRJZGAgaXMgdGhlIGNhbm9uaWNhbCBob29rX2NyZWF0ZWQgZXZlbnQgSUQgdGhlIGNsYWltaW5nXG4gIC8vIHdvcmtlciBjb21taXR0ZWQgdG8gcHVibGlzaGluZy4gUGVyc2lzdGluZyBpdCBoZXJlIHR1cm5zIHRoZVxuICAvLyBjbGFpbSBmaWxlIGludG8gYSBkdXJhYmxlIGNvbnZlcmdlbmNlIGtleSBmb3IgY3Jvc3Mtd29ya2VyIC9cbiAgLy8gY3Jvc3MtcHJvY2VzcyByZXRyaWVzIChzZWUgY29tbWVudCBvbiB0aGUgaG9va19jcmVhdGVkIGJyYW5jaCkuXG4gIC8vIGBvcHRpb25hbCgpYCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eTogYSBsZWdhY3kgY2xhaW0gZmlsZVxuICAvLyB3cml0dGVuIGJlZm9yZSB0aGlzIGZpZWxkIGV4aXN0ZWQgZmFsbHMgdGhyb3VnaCB0byB0aGUgcmVjb3ZlcnktXG4gIC8vIG1hcmtlciB1cGdyYWRlIHBhdGgsIHdoaWNoIGF0b21pY2FsbHkgcGlucyBhIGNhbm9uaWNhbCBldmVudElkXG4gIC8vIHZpYSBhIHNpZGVjYXIgbWFya2VyIChhbHNvIGEgYHdyaXRlRXhjbHVzaXZlYCkuXG4gIGV2ZW50SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFNpZGVjYXIgcmVjb3ZlcnkgbWFya2VyIHRoYXQgcGlucyBhIGNhbm9uaWNhbCBgaG9va19jcmVhdGVkYFxuICogZXZlbnRJZCBmb3IgYSBsZWdhY3kgdG9rZW4gY2xhaW0g4oCUIG9uZSB3cml0dGVuIGJ5IGEgdmVyc2lvbiBvZlxuICogdGhpcyBzdG9yYWdlIHRoYXQgZGlkIG5vdCB5ZXQgcGVyc2lzdCBgZXZlbnRJZGAgaW5saW5lIGluIHRoZVxuICogY2xhaW0gZmlsZS4gV2l0aG91dCB0aGlzIG1hcmtlciwgdHdvIGNyb3NzLXByb2Nlc3MgcmV0cmllc1xuICogcmVhZGluZyBhIGxlZ2FjeSBjbGFpbSBlYWNoIGdlbmVyYXRlIHRoZWlyIG93biBldmVudElkLCBsYW5kXG4gKiB0aGVpciBgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWAgY2FsbHMgYXQgZGlmZmVyZW50IHBhdGhzLCBhbmRcbiAqIGFwcGVuZCB0d28gYGhvb2tfY3JlYXRlZGAgZXZlbnRzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYC5cbiAqXG4gKiBUaGUgbWFya2VyIGlzIHdyaXR0ZW4gdmlhIGB3cml0ZUV4Y2x1c2l2ZWAg4oCUIHRoZSBmaXJzdCByZXRyeSB0b1xuICogbGFuZCBpdCBwaW5zIGl0cyBjYW5kaWRhdGUgZXZlbnRJZCBhcyBjYW5vbmljYWwsIGFuZCBldmVyeVxuICogc3Vic2VxdWVudCByZXRyeSByZWFkcyBhbmQgYWRvcHRzIHRoYXQgZXZlbnRJZCBiZWZvcmUgdGhlIGNvbW1vblxuICogZXZlbnQgcHVibGlzaC4gU2NoZW1hIGlzIGp1c3QgYHsgZXZlbnRJZCB9YCBiZWNhdXNlIGlkZW50aXR5IGlzXG4gKiBhbHJlYWR5IGVuY29kZWQgaW4gdGhlIG1hcmtlcidzIGZpbGVuYW1lIGhhc2gsIHNvIGRpZmZlcmVudCB0b2tlblxuICogbGlmZXRpbWVzIGNhbiBuZXZlciBzaGFyZSBvbmUgbWFya2VyIChzZWVcbiAqIGBob29rUmVjb3ZlcnlNYXJrZXJQYXRoYCkuXG4gKi9cbmNvbnN0IEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXZlbnRJZDogei5zdHJpbmcoKSxcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiByZWFkSG9va1Rva2VuQ2xhaW0oXG4gIGNvbnN0cmFpbnRQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgSG9va1Rva2VuQ2xhaW1TY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihjb25zdHJhaW50UGF0aCwgSG9va1Rva2VuQ2xhaW1TY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rUmVjb3ZlcnlNYXJrZXIoXG4gIG1hcmtlclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWE+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWFkSlNPTihtYXJrZXJQYXRoLCBIb29rUmVjb3ZlcnlNYXJrZXJTY2hlbWEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogUHJvYmUgdGhlIHJ1bidzIGV2ZW50IGxvZyBmb3IgYW4gZXhpc3RpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnRcbiAqIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uSWQuIFVzZWQgYnkgdGhlIGxlZ2FjeS1jbGFpbSByZWNvdmVyeVxuICogcGF0aCB0byBkZXRlY3QgXCJhbHJlYWR5IHB1Ymxpc2hlZCBieSBhIHByZS11cGdyYWRlIHdyaXRlXCIgYmVmb3JlXG4gKiBwaW5uaW5nIGEgY2Fub25pY2FsIGV2ZW50SWQg4oCUIHdpdGhvdXQgdGhpcyBjaGVjaywgYSBwb3N0LXVwZ3JhZGVcbiAqIHJldHJ5IGVuY291bnRlcmluZyBhIGxlZ2FjeSBjbGFpbSB3aG9zZSBgaG9va19jcmVhdGVkYCB3YXNcbiAqIGFscmVhZHkgd3JpdHRlbiAod2l0aCB0aGUgcHJlLXVwZ3JhZGUgd3JpdGVyJ3Mgb3duIGV2ZW50SWQpIHdvdWxkXG4gKiBwaW4gYSAqZGlmZmVyZW50KiBldmVudElkIHZpYSB0aGUgbWFya2VyIGFuZCBwdWJsaXNoIGEgZHVwbGljYXRlXG4gKiBldmVudCBhdCB0aGUgbWFya2VyJ3MgcGF0aC5cbiAqXG4gKiBUaGUgaW5saW5lLWBldmVudElkYCBmYXN0IHBhdGggZG9lcyBOT1QgbmVlZCB0aGlzIHByb2JlOiB0aGVcbiAqIGNhbm9uaWNhbCBldmVudElkIGlzIGR1cmFibGUgaW4gdGhlIGNsYWltIGZpbGUsIHNvIHRoZSBleGlzdGluZ1xuICogcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKSB3aWxsIGZhaWwgaWZmIHRoZSBldmVudFxuICogYWxyZWFkeSBleGlzdHMgYXQgdGhhdCBleGFjdCBwYXRoIOKAlCB3aGljaCBpcyB0aGUgY29ycmVjdFxuICogXCJhbHJlYWR5LXB1Ymxpc2hlZFwiIHNlbWFudGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRXhpc3RpbmdIb29rQ3JlYXRlZEV2ZW50SWQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICBmaWx0ZXI6IChldmVudCkgPT5cbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiZcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQsXG4gICAgbGltaXQ6IDEsXG4gICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdC5kYXRhWzBdPy5ldmVudElkID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVwYWlyIGFuIFwiZXZlbnQtZmlyc3Qgb3JwaGFuXCI6IHRoZSBob29rIGVudGl0eSB3cml0ZSBpcyBkZWZlcnJlZFxuICogdW50aWwgYWZ0ZXIgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IHB1Ymxpc2ggY29tbWl0cyAoc28gYSBmYWlsZWRcbiAqIHB1Ymxpc2ggY2Fubm90IG11dGF0ZSBhbHJlYWR5LWNvbW1pdHRlZCBzdGF0ZSDigJQgc2VlIHRoZSBjb21tZW50IG9uXG4gKiB0aGUgZGVmZXJyZWQgd3JpdGUpLCB3aGljaCBvcGVucyB0aGUgaW52ZXJzZSBjcmFzaCB3aW5kb3cg4oCUIGFcbiAqIGNyYXNoIEFGVEVSIHRoZSBldmVudCBwdWJsaXNoIGJ1dCBCRUZPUkUgdGhlIGRlZmVycmVkIGVudGl0eSB3cml0ZVxuICogbGVhdmVzIHRoZSBldmVudCBpbiB0aGUgbG9nIHdpdGggdGhlIGhvb2sgZW50aXR5IG1pc3NpbmcuIEEgcmV0cnlcbiAqIHRoZW4gY29sbGlkZXMgYXQgdGhlIGV2ZW50IHB1Ymxpc2ggYW5kIHRocm93c1xuICogYEVudGl0eUNvbmZsaWN0RXJyb3JgIChjb3JyZWN0IOKAlCB0aGUgZXZlbnQgSVMgY29tbWl0dGVkKSwgYnV0XG4gKiB3aXRob3V0IHRoaXMgcmVwYWlyIHRoZSBlbnRpdHkgd291bGQgc3RheSBtaXNzaW5nIGZvcmV2ZXIgYW5kIHRoZVxuICogaG9vayB3b3VsZCBiZSB1bnJlc29sdmFibGUuXG4gKlxuICogVGhlIGVudGl0eSBNVVNUIGJlIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgcGVyc2lzdGVkIGNhbm9uaWNhbFxuICogZXZlbnQncyBwYXlsb2FkIOKAlCBOT1QgdGhlIHJldHJ5J3MgYGV2ZW50RGF0YWAg4oCUIG90aGVyd2lzZSBhIHJldHJ5XG4gKiBjYXJyeWluZyBkaWZmZXJlbnQgYG1ldGFkYXRhYCAvIGBpc1dlYmhvb2tgIHdvdWxkIHNpbGVudGx5IGNoYW5nZVxuICogY29tbWl0dGVkIHN0YXRlLiBUaGUgd3JpdGUgdXNlcyBgd3JpdGVFeGNsdXNpdmVgIChjcmVhdGUtaWYtYWJzZW50KVxuICogc28gYSBjb25jdXJyZW50IHdyaXRlciByYWNpbmcgdGhpcyByZXBhaXIgY2Fubm90IGJlIG92ZXJ3cml0dGVuO1xuICogd2hpY2hldmVyIHdyaXRlIGxhbmRzIGZpcnN0LCB0aGUgY29udGVudCBpcyBpZGVudGljYWwgYmVjYXVzZSBib3RoXG4gKiBkZXJpdmUgZnJvbSB0aGUgc2FtZSBwZXJzaXN0ZWQgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIHBlcnNpc3RlZEV2ZW50SWQ6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtydW5JZH0tJHtwZXJzaXN0ZWRFdmVudElkfWA7XG4gIGNvbnN0IHBlcnNpc3RlZEV2ZW50ID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnZXZlbnRzJyxcbiAgICBjb21wb3NpdGVLZXksXG4gICAgRXZlbnRTY2hlbWEsXG4gICAgdGFnXG4gICk7XG4gIGlmIChcbiAgICAhcGVyc2lzdGVkRXZlbnQgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5ldmVudFR5cGUgIT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgcGVyc2lzdGVkRXZlbnQuY29ycmVsYXRpb25JZCAhPT0gaG9va0lkXG4gICkge1xuICAgIC8vIE5vdGhpbmcgdHJ1c3R3b3J0aHkgdG8gcmVwYWlyIGZyb20uXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgIGJhc2VkaXIsXG4gICAgJ2hvb2tzJyxcbiAgICBob29rSWQsXG4gICAgSG9va1NjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgIC8vIEVudGl0eSBhbHJlYWR5IHByZXNlbnQg4oCUIG5vdCBhbiBvcnBoYW4sIGxlYXZlIGl0IHVudG91Y2hlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXZlbnREYXRhID0gKHBlcnNpc3RlZEV2ZW50LmV2ZW50RGF0YSA/PyB7fSkgYXMge1xuICAgIHRva2VuPzogc3RyaW5nO1xuICAgIG1ldGFkYXRhPzogU2VyaWFsaXplZERhdGE7XG4gICAgaXNXZWJob29rPzogYm9vbGVhbjtcbiAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gIH07XG4gIGlmICh0eXBlb2YgZXZlbnREYXRhLnRva2VuICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBob29rOiBIb29rID0ge1xuICAgIHJ1bklkLFxuICAgIGhvb2tJZCxcbiAgICB0b2tlbjogZXZlbnREYXRhLnRva2VuLFxuICAgIG1ldGFkYXRhOiBldmVudERhdGEubWV0YWRhdGEsXG4gICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICBlbnZpcm9ubWVudDogJ2xvY2FsJyxcbiAgICBjcmVhdGVkQXQ6IHBlcnNpc3RlZEV2ZW50LmNyZWF0ZWRBdCxcbiAgICBzcGVjVmVyc2lvbjogcGVyc2lzdGVkRXZlbnQuc3BlY1ZlcnNpb24sXG4gICAgaXNXZWJob29rOiBldmVudERhdGEuaXNXZWJob29rID8/IGZhbHNlLFxuICAgIGlzU3lzdGVtOiBldmVudERhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gIH07XG4gIGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2hvb2tzJywgaG9va0lkLCB0YWcpLFxuICAgIEpTT04uc3RyaW5naWZ5KGhvb2ssIGpzb25SZXBsYWNlciwgMilcbiAgKTtcbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IHBpbiBhIGNhbm9uaWNhbCBgaG9va19jcmVhdGVkYCBldmVudElkIGZvciBhIGxlZ2FjeVxuICogY2xhaW0gKG9uZSB3aXRob3V0IGFuIGlubGluZSBgZXZlbnRJZGApLiBUaGUgZmlyc3QgcmV0cnkgdG9cbiAqIGB3cml0ZUV4Y2x1c2l2ZWAgdGhlIHJlY292ZXJ5IG1hcmtlciB3aW5zOyBpdHMgYGNhbmRpZGF0ZUV2ZW50SWRgXG4gKiBiZWNvbWVzIGNhbm9uaWNhbC4gU3Vic2VxdWVudCByZXRyaWVzIHJlYWQgdGhlIG1hcmtlciBhbmQgYWRvcHRcbiAqIGl0cyBgZXZlbnRJZGAuIFRvZ2V0aGVyIHdpdGggdGhlIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBpblxuICogdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2gsIHRoaXMgZ2l2ZXMgdGhlIGxlZ2FjeS1mYWxsYmFjayBwYXRoIHRoZVxuICogc2FtZSBzaW5nbGUtZXZlbnQgY29udmVyZ2VuY2UgZ3VhcmFudGVlIGFzIHRoZSBpbmxpbmUtYGV2ZW50SWRgXG4gKiBmYXN0IHBhdGguXG4gKlxuICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGV2ZW50SWQgZm9yIHRoZSBjYWxsZXIgdG8gYWRvcHQsIG9yIGBudWxsYFxuICogaWYgd2UgbG9zdCB0aGUgbWFya2VyIHJhY2UgQU5EIHRoZSByZXN1bHRpbmcgbWFya2VyIGZpbGUgaXNcbiAqIHVucmVhZGFibGUgKGV4dHJlbWVseSByYXJlOyBjb3JydXB0ZWQgZGlzaykuIENhbGxlcnMgdHJlYXQgYG51bGxgXG4gKiBhcyBcImdpdmUgdXAsIHRocm93IGBFbnRpdHlDb25mbGljdEVycm9yYFwiIHNvIHRoZSBydW50aW1lJ3NcbiAqIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggc3dhbGxvd3MgdGhpcyBhdHRlbXB0IGFuZCBsZXRzXG4gKiBhbm90aGVyIG9uZSB0aHJvdWdoLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaW5DYW5vbmljYWxFdmVudElkRm9yTGVnYWN5Q2xhaW0oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgdG9rZW46IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgaG9va0lkOiBzdHJpbmcsXG4gIGNhbmRpZGF0ZUV2ZW50SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IG1hcmtlclBhdGggPSBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKGJhc2VkaXIsIHRva2VuLCBydW5JZCwgaG9va0lkKTtcbiAgY29uc3QgbWFya2VyQ29udGVudCA9IEpTT04uc3RyaW5naWZ5KHsgZXZlbnRJZDogY2FuZGlkYXRlRXZlbnRJZCB9KTtcbiAgY29uc3Qgd29uID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobWFya2VyUGF0aCwgbWFya2VyQ29udGVudCk7XG4gIGlmICh3b24pIHtcbiAgICByZXR1cm4gY2FuZGlkYXRlRXZlbnRJZDtcbiAgfVxuICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHJlYWRIb29rUmVjb3ZlcnlNYXJrZXIobWFya2VyUGF0aCk7XG4gIHJldHVybiBleGlzdGluZz8uZXZlbnRJZCA/PyBudWxsO1xufVxuXG4vKipcbiAqIEluLXByb2Nlc3MgcGVyLWtleSBhc3luYyBtdXRleCBiYWNrZWQgYnkgYSBjYWxsZXItc3VwcGxpZWQgYE1hcGAuXG4gKiBVc2VkIGJ5IGBjcmVhdGVFdmVudHNTdG9yYWdlYCB0byBzZXJpYWxpemUgc2FtZS1rZXkgZXZlbnQgd3JpdGVzXG4gKiAoYHN0ZXBfKmAgZm9yIHRoZSBzYW1lIHN0ZXAsIGBob29rX2NyZWF0ZWRgIGZvciB0aGUgc2FtZSBob29rKS5cbiAqIFRoZSBtYXAgaXMgaW5zdGFudGlhdGVkIHBlci1zdG9yYWdlLWluc3RhbmNlIOKAlCBkaWZmZXJlbnRcbiAqIGluc3RhbmNlcyBkbyBOT1Qgc2hhcmUgbG9ja3MsIHNvIHR3byBpbnN0YW5jZXMgc2hhcmluZyBvbmUgZGF0YVxuICogZGlyZWN0b3J5IGJlaGF2ZSBleGFjdGx5IGxpa2UgdHdvIHNlcGFyYXRlIE9TIHByb2Nlc3NlcyBmcm9tIHRoZVxuICogbG9ja2luZyBzdGFuZHBvaW50LiBDcm9zcy1pbnN0YW5jZSAvIGNyb3NzLXByb2Nlc3MgYXJiaXRyYXRpb25cbiAqIHJlbGllcyBvbiB0aGUgb24tZGlzayBjb25zdHJhaW50IC8gY2xhaW0gZmlsZXMgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gd2l0aEluUHJvY2Vzc0xvY2s8VD4oXG4gIGxvY2tzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PixcbiAga2V5OiBzdHJpbmcsXG4gIGZuOiAoKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcHJldiA9IGxvY2tzLmdldChrZXkpO1xuICBjb25zdCB0YXNrQm94OiB7IHRhc2s/OiBQcm9taXNlPFQ+IH0gPSB7fTtcbiAgY29uc3QgdGFzayA9IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHByZXYpIHtcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSBwcmV2aW91cyB0YXNrIHRvIHNldHRsZTsgZG9uJ3QgaW5oZXJpdCBpdHMgZXJyb3JzLlxuICAgICAgYXdhaXQgcHJldi5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChsb2Nrcy5nZXQoa2V5KSA9PT0gdGFza0JveC50YXNrKSB7XG4gICAgICAgIGxvY2tzLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcbiAgdGFza0JveC50YXNrID0gdGFzaztcbiAgbG9ja3Muc2V0KGtleSwgdGFzayk7XG4gIHJldHVybiB0YXNrO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBkZWxldGUgYWxsIHdhaXRzIGFzc29jaWF0ZWQgd2l0aCBhIHdvcmtmbG93IHJ1bi5cbiAqIENhbGxlZCB3aGVuIGEgcnVuIHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxsV2FpdHNGb3JSdW4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdhaXRzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICd3YWl0cycpO1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMod2FpdHNEaXIpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIC8vIGZpbGVJZHMgbWF5IGNvbnRhaW4gdGFnIHN1ZmZpeGVzIChlLmcuLCBcIndydW5fQUJDLWNvcnJJZC52aXRlc3QtMFwiKVxuICAgIC8vIGJ1dCBzdGFydHNXaXRoIHN0aWxsIG1hdGNoZXMgY29ycmVjdGx5IHNpbmNlIHRoZSB0YWcgaXMgYSBzdWZmaXguXG4gICAgaWYgKGZpbGUuc3RhcnRzV2l0aChgJHtydW5JZH0tYCkpIHtcbiAgICAgIGNvbnN0IHdhaXRQYXRoID0gcGF0aC5qb2luKHdhaXRzRGlyLCBgJHtmaWxlfS5qc29uYCk7XG4gICAgICBhd2FpdCBkZWxldGVKU09OKHdhaXRQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJzaXN0IGEgbGlmZWN5Y2xlLWRyaXZlbiBydW4gdXBkYXRlIChydW5fc3RhcnRlZCAvIHJ1bl9jb21wbGV0ZWQgL1xuICogcnVuX2ZhaWxlZCAvIHJ1bl9jYW5jZWxsZWQpIHVuZGVyIHRoZSBzaGFyZWQgcGVyLXJ1biBmaWxlIGxvY2ssXG4gKiByZS1yZWFkaW5nIHRoZSBvbi1kaXNrIHJ1biBpbnNpZGUgdGhlIGxvY2sgc28gYW55IGF0dHJpYnV0ZSB3cml0ZXNcbiAqIHRoYXQgbGFuZGVkIGJldHdlZW4gdGhlIHByZS12YWxpZGF0aW9uIGBjdXJyZW50UnVuYCByZWFkIGFuZCB0aGlzXG4gKiB3cml0ZSBhcmUgcHJlc2VydmVkLiBXaXRob3V0IHRoZSByZS1yZWFkLCBhbiBgZXhwZXJpbWVudGFsU2V0QXR0cmlidXRlc2BcbiAqIGNhbGwgc2FuZHdpY2hlZCBiZXR3ZWVuIHRoZSBsaWZlY3ljbGUgcmVhZCBhbmQgd3JpdGUgd291bGQgYmVcbiAqIHNpbGVudGx5IG92ZXJ3cml0dGVuIGJ5IHRoZSBsaWZlY3ljbGUgd3JpdGUncyBzdGFsZSBhdHRyaWJ1dGUgc25hcHNob3QuXG4gKlxuICogYHByb3Bvc2VkYCBpcyB0aGUgZnVsbHktY29uc3RydWN0ZWQgcnVuIHJvdyB0aGUgY2FsbGVyIHdhbnRzIHRvXG4gKiB3cml0ZSAod2l0aCB0aGUgY29ycmVjdCBkaXNjcmltaW5hdGVkLXVuaW9uIHN0YXR1cyBicmFuY2gpLiBPbmx5IHRoZVxuICogYGF0dHJpYnV0ZXNgIGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIGZyZXNoZXN0IHZlcnNpb24gaW5zaWRlIHRoZVxuICogbG9jay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2s8VCBleHRlbmRzIFdvcmtmbG93UnVuPihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcHJvcG9zZWQ6IFRcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gd2l0aFJ1bkZpbGVMb2NrKHJ1bklkLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCByZWFkSlNPTihcbiAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBydW5JZCwgdGFnKSxcbiAgICAgIFdvcmtmbG93UnVuU2NoZW1hXG4gICAgKTtcbiAgICBjb25zdCBuZXh0OiBUID0ge1xuICAgICAgLi4ucHJvcG9zZWQsXG4gICAgICBhdHRyaWJ1dGVzOiBmcmVzaD8uYXR0cmlidXRlcyA/PyBwcm9wb3NlZC5hdHRyaWJ1dGVzLFxuICAgIH07XG4gICAgYXdhaXQgd3JpdGVKU09OKHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBydW5JZCwgdGFnKSwgbmV4dCwge1xuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBldmVudHMgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZmlsZXN5c3RlbS5cbiAqIEltcGxlbWVudHMgdGhlIFN0b3JhZ2VbJ2V2ZW50cyddIGludGVyZmFjZSB3aXRoIGNyZWF0ZSwgbGlzdCwgYW5kIGxpc3RCeUNvcnJlbGF0aW9uSWQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50c1N0b3JhZ2UoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBTdG9yYWdlWydldmVudHMnXSB7XG4gIC8vIFBlci1pbnN0YW5jZSBpbi1wcm9jZXNzIG11dGV4ZXMuIFR3byBzdG9yYWdlIGluc3RhbmNlcyBzaGFyaW5nXG4gIC8vIG9uZSBkYXRhIGRpcmVjdG9yeSBnZXQgaW5kZXBlbmRlbnQgbG9jayBtYXBzLCB3aGljaCBtYWtlcyB0aGVtXG4gIC8vIGJlaGF2ZSBsaWtlIHR3byBzZXBhcmF0ZSBPUyBwcm9jZXNzZXMgZnJvbSB0aGUgbG9ja2luZ1xuICAvLyBzdGFuZHBvaW50IOKAlCBjcm9zcy1pbnN0YW5jZSBhcmJpdHJhdGlvbiByZWxpZXMgb24gdGhlIG9uLWRpc2tcbiAgLy8gYHdyaXRlRXhjbHVzaXZlYCBjb25zdHJhaW50IC8gY2xhaW0gZmlsZXMgaW5zdGVhZC4gVGVzdHMgdXNlXG4gIC8vIHRoaXMgdG8gZXhlcmNpc2UgY3Jvc3MtcHJvY2VzcyBjb252ZXJnZW5jZSB3aXRob3V0IHNwYXduaW5nXG4gIC8vIHN1YnByb2Nlc3Nlcy5cbiAgLy9cbiAgLy8gYHN0ZXBMb2Nrc2Agc2VyaWFsaXplcyBzdGVwIGxpZmVjeWNsZSBldmVudHMgZm9yIHRoZSBzYW1lXG4gIC8vIChydW5JZCwgY29ycmVsYXRpb25JZCk6IHNlZSBjb21tZW50IGZ1cnRoZXIgZG93biBpbiB0aGVcbiAgLy8gYGlzU3RlcEV2ZW50YCBicmFuY2guXG4gIC8vXG4gIC8vIGBob29rTG9ja3NgIHNlcmlhbGl6ZXMgYGhvb2tfY3JlYXRlZGAgY2FsbHMgZm9yIHRoZSBzYW1lXG4gIC8vIChydW5JZCwgY29ycmVsYXRpb25JZCkgc28gdGhlIFwiY2xhaW0gdG9rZW4sIHRoZW4gd3JpdGUgaG9va1xuICAvLyBlbnRpdHkgKyBldmVudFwiIHNlcXVlbmNlIHJ1bnMgdG8gY29tcGxldGlvbiBiZWZvcmUgYW5vdGhlclxuICAvLyBpbi1wcm9jZXNzIGludm9jYXRpb24gZW50ZXJzIHRoZSBkZWR1cCBicmFuY2guXG4gIGNvbnN0IHN0ZXBMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuICBjb25zdCBob29rTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNyZWF0ZShydW5JZCwgZGF0YSwgcGFyYW1zKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgLy8gVmFsaWRhdGUgcmVxdWVzdC1zdXBwbGllZCBJRHMgYmVmb3JlIHRoZXkncmUgY29uY2F0ZW5hdGVkIGludG9cbiAgICAgIC8vIGZpbGVzeXN0ZW0gcGF0aHMuIFRoaXMgaXMgdGhlIHByaW1hcnkgZGVmZW5zZSBhZ2FpbnN0IHBhdGggdHJhdmVyc2FsXG4gICAgICAvLyBhdHRhY2tzIHdoZXJlIGEgY2xpZW50IHN1cHBsaWVzIHJ1bklkIC8gY29ycmVsYXRpb25JZCB2YWx1ZXMgbGlrZVxuICAgICAgLy8gXCIuLi8uLi8uLi9wYWNrYWdlXCIgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gICAgICAvLyBSdW4gYmVmb3JlIHRha2luZyB0aGUgcGVyLXN0ZXAgbXV0ZXggc28gbWFsZm9ybWVkIGlucHV0cyBmYWlsIGZhc3QuXG4gICAgICAvL1xuICAgICAgLy8gRW1wdHkgYGNvcnJlbGF0aW9uSWRgIHZhbHVlcyBhcmUgYWxzbyByZWplY3RlZCBoZXJlOiB0aGUgZXZlbnRcbiAgICAgIC8vIHNjaGVtYXMgb25seSByZXF1aXJlIGB6LnN0cmluZygpYCwgc28gd2l0aG91dCB0aGlzIGNoZWNrIGFcbiAgICAgIC8vIHN0ZXBfY3JlYXRlZCAvIGhvb2tfY3JlYXRlZCAvIHdhaXRfY3JlYXRlZCByZXF1ZXN0IHdpdGhcbiAgICAgIC8vIGBjb3JyZWxhdGlvbklkOiAnJ2Agd291bGQgc2lsZW50bHkgYmUgd3JpdHRlbiB1bmRlciBhIG1hbGZvcm1lZFxuICAgICAgLy8gY29tcG9zaXRlIGtleSBsaWtlIGAke3J1bklkfS1gLlxuICAgICAgaWYgKHJ1bklkICE9IG51bGwgJiYgcnVuSWQgIT09ICcnKSB7XG4gICAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgncnVuSWQnLCBydW5JZCk7XG4gICAgICB9XG4gICAgICBpZiAoJ2NvcnJlbGF0aW9uSWQnIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgZGF0YS5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCBsaWZlY3ljbGUgZXZlbnRzIGFyZSBzZXJpYWxpemVkIHBlci1zdGVwIHZpYSBhbiBpbi1wcm9jZXNzIG11dGV4XG4gICAgICAvLyBzbyB0aGF0IHRoZSBcImNoZWNrIHN0YXRlLCB0aGVuIHdyaXRlXCIgc2VxdWVuY2UgaW4gc3RlcF9zdGFydGVkIC9cbiAgICAgIC8vIHN0ZXBfY29tcGxldGVkIC8gc3RlcF9mYWlsZWQgLyBzdGVwX3JldHJ5aW5nIGlzIGF0b21pYy4gc3RlcF9jcmVhdGVkXG4gICAgICAvLyBpcyBhbHNvIHNlcmlhbGl6ZWQgc28gZHVwbGljYXRlLWNyZWF0ZSByYWNlcyBkb24ndCBsZWF2ZSBleHRyYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIGV2ZW50cyBpbiB0aGUgbG9nLlxuICAgICAgY29uc3QgaXNTdGVwRXZlbnQgPVxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jb21wbGV0ZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9mYWlsZWQnIHx8XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZyc7XG4gICAgICBpZiAoaXNTdGVwRXZlbnQgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgIHJldHVybiB3aXRoSW5Qcm9jZXNzTG9jayhzdGVwTG9ja3MsIGxvY2tLZXksICgpID0+IGNyZWF0ZUltcGwoKSk7XG4gICAgICB9XG4gICAgICAvLyBgaG9va19jcmVhdGVkYCBpcyBzZXJpYWxpemVkIHBlci0ocnVuSWQsIGhvb2tJZCkgc28gdGhlXG4gICAgICAvLyBcImNsYWltIHRva2VuLCB3cml0ZSBob29rIGVudGl0eSwgd3JpdGUgZXZlbnRcIiBzZXF1ZW5jZSBydW5zIHRvXG4gICAgICAvLyBjb21wbGV0aW9uIGJlZm9yZSBhbm90aGVyIGluLXByb2Nlc3MgaW52b2NhdGlvbiBlbnRlcnMgdGhlXG4gICAgICAvLyBzYW1lLWhvb2sgZGVkdXAgYnJhbmNoLiBXaXRob3V0IHRoaXMsIHR3byBzYW1lLXRpY2sgY29uY3VycmVudFxuICAgICAgLy8gY2FsbGVycyBjYW4gcmFjZSBiZXR3ZWVuIHRoZSB3aW5uZXIncyBgd3JpdGVFeGNsdXNpdmUoY2xhaW0pYFxuICAgICAgLy8gYW5kIGB3cml0ZUpTT04oaG9vaylgLCBtYWtpbmcgdGhlIHNlY29uZCBjYWxsZXIgbW9tZW50YXJpbHlcbiAgICAgIC8vIG9ic2VydmUgYSBjbGFpbSB3aXRoIG5vIG1hdGNoaW5nIGhvb2sgZW50aXR5IOKAlCB3aGljaCB0aGVcbiAgICAgIC8vIGNyYXNoLXJlY292ZXJ5IHBhdGggYmVsb3cgd291bGQgbWlzaW50ZXJwcmV0IGFzIGEgcHJpb3IgY3Jhc2hcbiAgICAgIC8vIGFuZCBpbmNvcnJlY3RseSBmYWxsIHRocm91Z2ggdG8gYSBzZWNvbmQgaG9vayBlbnRpdHkgd3JpdGUuXG4gICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmIHJ1bklkICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICBjb25zdCBsb2NrS2V5ID0gdGFnXG4gICAgICAgICAgPyBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2suJHt0YWd9YFxuICAgICAgICAgIDogYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5ob29rYDtcbiAgICAgICAgcmV0dXJuIHdpdGhJblByb2Nlc3NMb2NrKGhvb2tMb2NrcywgbG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVJbXBsKCk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUltcGwoKTogUHJvbWlzZTxFdmVudFJlc3VsdD4ge1xuICAgICAgICAvLyBNb3N0IHBhdGhzIHVzZSB0aGUgZnJlc2hseS1nZW5lcmF0ZWQgY2FuZGlkYXRlIGV2ZW50SWQuIFRoZVxuICAgICAgICAvLyBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgcGF0aCBiZWxvdyBtYXkgcmVhc3NpZ24gaXQgdG9cbiAgICAgICAgLy8gdGhlIGNhbm9uaWNhbCBldmVudElkIHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbVxuICAgICAgICAvLyBzbyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcblxuICAgICAgICAvLyBGb3IgcnVuX2NyZWF0ZWQgZXZlbnRzLCB1c2UgY2xpZW50LXByb3ZpZGVkIHJ1bklkIG9yIGdlbmVyYXRlIG9uZSBzZXJ2ZXItc2lkZVxuICAgICAgICBsZXQgZWZmZWN0aXZlUnVuSWQ6IHN0cmluZztcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICghcnVuSWQgfHwgcnVuSWQgPT09ICcnKSkge1xuICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkID0gYHdydW5fJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgfSBlbHNlIGlmICghcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3J1bklkIGlzIHJlcXVpcmVkIGZvciBub24tcnVuX2NyZWF0ZWQgZXZlbnRzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBydW5JZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGNsaWVudC1wcm92aWRlZCBydW5JZCB0aW1lc3RhbXAgaXMgd2l0aGluIGFjY2VwdGFibGUgdGhyZXNob2xkXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiBydW5JZCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3IgPSB2YWxpZGF0ZVVsaWRUaW1lc3RhbXAoXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICd3cnVuXydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IodmFsaWRhdGlvbkVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzcGVjVmVyc2lvbiBpcyBhbHdheXMgc2VudCBieSB0aGUgcnVudGltZSwgYnV0IHdlIHByb3ZpZGUgYSBmYWxsYmFjayBmb3Igc2FmZXR5XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZVNwZWNWZXJzaW9uID0gZGF0YS5zcGVjVmVyc2lvbiA/PyBTUEVDX1ZFUlNJT05fQ1VSUkVOVDtcblxuICAgICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgcnVuIGlzIGluIHRlcm1pbmFsIHN0YXRlXG4gICAgICAgIGNvbnN0IGlzUnVuVGVybWluYWwgPSAoc3RhdHVzOiBzdHJpbmcpID0+XG4gICAgICAgICAgWydjb21wbGV0ZWQnLCAnZmFpbGVkJywgJ2NhbmNlbGxlZCddLmluY2x1ZGVzKHN0YXR1cyk7XG5cbiAgICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIHN0ZXAgaXMgaW4gdGVybWluYWwgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTdGVwVGVybWluYWwgPSAoc3RhdHVzOiBzdHJpbmcpID0+XG4gICAgICAgICAgWydjb21wbGV0ZWQnLCAnZmFpbGVkJywgJ2NhbmNlbGxlZCddLmluY2x1ZGVzKHN0YXR1cyk7XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgcnVuIHN0YXRlIGZvciB2YWxpZGF0aW9uIChpZiBub3QgY3JlYXRpbmcgYSBuZXcgcnVuKVxuICAgICAgICAvLyBTa2lwIHJ1biB2YWxpZGF0aW9uIGZvciBzdGVwX2NvbXBsZXRlZCBhbmQgc3RlcF9yZXRyeWluZyAtIHRoZXkgb25seSBvcGVyYXRlXG4gICAgICAgIC8vIG9uIHJ1bm5pbmcgc3RlcHMsIGFuZCBydW5uaW5nIHN0ZXBzIGFyZSBhbHdheXMgYWxsb3dlZCB0byBtb2RpZnkgcmVnYXJkbGVzc1xuICAgICAgICAvLyBvZiBydW4gc3RhdGUuIFRoaXMgb3B0aW1pemF0aW9uIHNhdmVzIGZpbGVzeXN0ZW0gcmVhZHMgcGVyIHN0ZXAgZXZlbnQuXG4gICAgICAgIGxldCBjdXJyZW50UnVuOiBXb3JrZmxvd1J1biB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBza2lwUnVuVmFsaWRhdGlvbkV2ZW50cyA9IFsnc3RlcF9jb21wbGV0ZWQnLCAnc3RlcF9yZXRyeWluZyddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgIT09ICdydW5fY3JlYXRlZCcgJiZcbiAgICAgICAgICAhc2tpcFJ1blZhbGlkYXRpb25FdmVudHMuaW5jbHVkZXMoZGF0YS5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIGN1cnJlbnRSdW4gPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAncnVucycsXG4gICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIFdvcmtmbG93UnVuU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGFydDogcnVuX3N0YXJ0ZWQgb24gbm9uLWV4aXN0ZW50IHJ1biB3aXRoIGV2ZW50RGF0YVxuICAgICAgICAgIC8vIGNyZWF0ZXMgdGhlIHJ1biBmaXJzdCwgc28gdGhlIHF1ZXVlIGNhbiBib290c3RyYXAgYSBydW4gdGhhdFxuICAgICAgICAgIC8vIGZhaWxlZCB0byBjcmVhdGUgZHVyaW5nIHN0YXJ0KCkuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgJiZcbiAgICAgICAgICAgICFjdXJyZW50UnVuICYmXG4gICAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhICYmXG4gICAgICAgICAgICBkYXRhLmV2ZW50RGF0YVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcnVuSW5wdXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgICAgICAgICAgICAgaW5wdXQ/OiBhbnk7XG4gICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCAmJlxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lICYmXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5pbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJ1bklucHV0RGF0YS5hdHRyaWJ1dGVzID8/IHt9KS5tYXAoXG4gICAgICAgICAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PiAoeyBrZXksIHZhbHVlIH0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQXRvbWljYWxseSB0cnkgdG8gcHVibGlzaCB0aGUgcnVuIGVudGl0eSBzbyBvbmx5IHRoZSBmaXJzdFxuICAgICAgICAgICAgICAvLyB3cml0ZXIgd2lucywgcHJldmVudGluZyBhIFRPQ1RPVSByYWNlIHdoZXJlIGEgY29uY3VycmVudFxuICAgICAgICAgICAgICAvLyBydW5fY3JlYXRlZCBmcm9tIHN0YXJ0KCkgY291bGQgb3ZlcndyaXRlIGEgcnVuIHRoYXQgd2FzXG4gICAgICAgICAgICAgIC8vIGFscmVhZHkgdHJhbnNpdGlvbmVkIHRvICdydW5uaW5nJy5cbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFJ1bjogV29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0RGF0YS5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dERhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0RGF0YS5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICAgICAgcnVuUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjcmVhdGVkUnVuLCBqc29uUmVwbGFjZXIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKGNyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBjcmVhdGVkIHRoZSBydW4g4oCUIGFsc28gd3JpdGUgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50LlxuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudElkID0gYGV2bnRfJHttb25vdG9uaWNVbGlkKCl9YDtcbiAgICAgICAgICAgICAgICBjb25zdCBydW5DcmVhdGVkRXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgZXZlbnRJZDogcnVuQ3JlYXRlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bklucHV0RGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXREYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bklucHV0RGF0YS5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke3J1bkNyZWF0ZWRFdmVudElkfWA7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY3JlYXRlZENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgICAgIHJ1bkNyZWF0ZWRFdmVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGNyZWF0ZWRSdW47XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUnVuIGFscmVhZHkgZXhpc3RzIChjb25jdXJyZW50IHJ1bl9jcmVhdGVkIHdvbiB0aGVcbiAgICAgICAgICAgICAgICAvLyByYWNlKS4gUmUtcmVhZCBpdCBzbyBkb3duc3RyZWFtIGxvZ2ljIHNlZXMgdGhlIHJlYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcnVuX2ZhaWxlZCBvbiBhIG5vbi1leGlzdGVudCBydW4gaXMgcmVqZWN0ZWQgdG8gbWF0Y2ggdGhlXG4gICAgICAgIC8vIHBvc3RncmVzIGFuZCB2ZXJjZWwgd29ybGRzLCB3aGljaCBib3RoIHN1cmZhY2UgdGhpcyBhcyBhXG4gICAgICAgIC8vIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvciByYXRoZXIgdGhhbiBzaWxlbnRseSBwZXJzaXN0aW5nIGFuXG4gICAgICAgIC8vIGV2ZW50IGZvciBhIHJ1biB0aGF0IHdhcyBuZXZlciBjcmVhdGVkLlxuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJiAhY3VycmVudFJ1bikge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZFUlNJT04gQ09NUEFUSUJJTElUWTogQ2hlY2sgcnVuIHNwZWMgdmVyc2lvblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRm9yIGV2ZW50cyB0aGF0IGhhdmUgZmV0Y2hlZCB0aGUgcnVuLCBjaGVjayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIC8vIFNraXAgZm9yIHJ1bl9jcmVhdGVkIChubyBleGlzdGluZyBydW4pIGFuZCBydW50aW1lIGV2ZW50cyAoc3RlcF9jb21wbGV0ZWQsIHN0ZXBfcmV0cnlpbmcpLlxuICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHJ1biByZXF1aXJlcyBhIG5ld2VyIHdvcmxkIHZlcnNpb25cbiAgICAgICAgICBpZiAocmVxdWlyZXNOZXdlcldvcmxkKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVuTm90U3VwcG9ydGVkRXJyb3IoXG4gICAgICAgICAgICAgIGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24hLFxuICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fQ1VSUkVOVFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSb3V0ZSB0byBsZWdhY3kgaGFuZGxlciBmb3IgcHJlLWV2ZW50LXNvdXJjaW5nIHJ1bnNcbiAgICAgICAgICBpZiAoaXNMZWdhY3lTcGVjVmVyc2lvbihjdXJyZW50UnVuLnNwZWNWZXJzaW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUxlZ2FjeUV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY3VycmVudFJ1bixcbiAgICAgICAgICAgICAgcGFyYW1zXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBWQUxJREFUSU9OOiBUZXJtaW5hbCBzdGF0ZSBhbmQgZXZlbnQgb3JkZXJpbmcgY2hlY2tzXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAgIC8vIFJ1biB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzUnVuVGVybWluYWwoY3VycmVudFJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgY29uc3QgcnVuVGVybWluYWxFdmVudHMgPSBbXG4gICAgICAgICAgICAncnVuX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgIF07XG5cbiAgICAgICAgICAvLyBJZGVtcG90ZW50IG9wZXJhdGlvbjogcnVuX2NhbmNlbGxlZCBvbiBhbHJlYWR5IGNhbmNlbGxlZCBydW4gaXMgYWxsb3dlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcgJiZcbiAgICAgICAgICAgIGN1cnJlbnRSdW4uc3RhdHVzID09PSAnY2FuY2VsbGVkJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGV4aXN0aW5nIHN0YXRlIChpZGVtcG90ZW50KVxuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIGV2ZW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICBwYXJhbXM/LnJlc29sdmVEYXRhID8/IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGV2ZW50OiBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKSxcbiAgICAgICAgICAgICAgcnVuOiBjdXJyZW50UnVuLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQgb24gdGVybWluYWwgcnVucywgdXNlIFJ1bkV4cGlyZWRFcnJvciBzbyB0aGVcbiAgICAgICAgICAvLyBydW50aW1lIGtub3dzIHRvIGV4aXQgd2l0aG91dCByZXRyeWluZy5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5FeHBpcmVkRXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGlzIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPdGhlciBydW4gc3RhdGUgdHJhbnNpdGlvbnMgYXJlIG5vdCBhbGxvd2VkIG9uIHRlcm1pbmFsIHJ1bnNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBydW5UZXJtaW5hbEV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IHRyYW5zaXRpb24gcnVuIGZyb20gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGluZyBuZXcgZW50aXRpZXMgb24gdGVybWluYWwgcnVucyBpcyBub3QgYWxsb3dlZFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IGNyZWF0ZSBuZXcgZW50aXRpZXMgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYENhbm5vdCBzZXQgYXR0cmlidXRlcyBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcgYW5kIHRlcm1pbmFsIHN0YXRlKVxuICAgICAgICAvLyBTdG9yZSBleGlzdGluZ1N0ZXAgc28gd2UgY2FuIHJldXNlIGl0IGxhdGVyIChhdm9pZCBkb3VibGUgcmVhZClcbiAgICAgICAgbGV0IHZhbGlkYXRlZFN0ZXA6IFN0ZXAgfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc3RlcEV2ZW50cyA9IFtcbiAgICAgICAgICAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAnc3RlcF9jb21wbGV0ZWQnLFxuICAgICAgICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoc3RlcEV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIHZhbGlkYXRlZFN0ZXAgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgc3RlcENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gRXZlbnQgb3JkZXJpbmc6IHN0ZXAgbXVzdCBleGlzdCBiZWZvcmUgdGhlc2UgZXZlbnRzXG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RlcCB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uXG4gICAgICAgICAgaWYgKGlzU3RlcFRlcm1pbmFsKHZhbGlkYXRlZFN0ZXAuc3RhdHVzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke3ZhbGlkYXRlZFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPbiB0ZXJtaW5hbCBydW5zOiBvbmx5IGFsbG93IGNvbXBsZXRpbmcvZmFpbGluZyBpbi1wcm9ncmVzcyBzdGVwc1xuICAgICAgICAgIGlmIChjdXJyZW50UnVuICYmIGlzUnVuVGVybWluYWwoY3VycmVudFJ1bi5zdGF0dXMpKSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcC5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IG5vbi1ydW5uaW5nIHN0ZXAgb24gcnVuIGluIHRlcm1pbmFsIHN0YXRlIFwiJHtjdXJyZW50UnVuLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIb29rLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcpXG4gICAgICAgIGNvbnN0IGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UgPSBbJ2hvb2tfZGlzcG9zZWQnLCAnaG9va19yZWNlaXZlZCddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZS5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiZcbiAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBgZXZlbnRgIG1heSBiZSByZWFzc2lnbmVkIGxhdGVyIGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBkZWR1cC1yZWNvdmVyeSBicmFuY2ggdG8gc3dhcCBpbiBhIGNhbm9uaWNhbCBldmVudElkIC9cbiAgICAgICAgLy8gY3JlYXRlZEF0IHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbSBzb1xuICAgICAgICAvLyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFN0cmlwIGV2ZW50RGF0YSBmcm9tIHJ1bl9zdGFydGVkIOKAlCBpdCBiZWxvbmdzIG9uIHJ1bl9jcmVhdGVkIG9ubHkuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiAnZXZlbnREYXRhJyBpbiBldmVudCkge1xuICAgICAgICAgIGRlbGV0ZSAoZXZlbnQgYXMgYW55KS5ldmVudERhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFjayBlbnRpdHkgY3JlYXRlZC91cGRhdGVkIGZvciBFdmVudFJlc3VsdFxuICAgICAgICBsZXQgcnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHN0ZXA6IFN0ZXAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBob29rOiBIb29rIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgd2FpdDogV2FpdCB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gRm9yIGBob29rX2NyZWF0ZWRgLCB0aGUgaG9vayBlbnRpdHkgd3JpdGUgaXMgZGVmZXJyZWQgdW50aWxcbiAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggc3VjY2VlZHMsIHNvIGEgcmV0cnkgdGhhdFxuICAgICAgICAvLyBjb2xsaWRlcyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgIGRvZXMgbm90XG4gICAgICAgIC8vIG11dGF0ZSB0aGUgZHVyYWJsZSBob29rIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQuXG4gICAgICAgIC8vIGBob29rRW50aXR5V3JpdGVPcHRpb25zYCBjYXJyaWVzIHRoZSBgeyBvdmVyd3JpdGUgfWAgbW9kZVxuICAgICAgICAvLyBjaG9zZW4gYnkgdGhlIGRlZHVwLXJlY292ZXJ5IGJyYW5jaCBhYm92ZSAodW5kZWZpbmVkIGZvclxuICAgICAgICAvLyBmaXJzdCB3cml0ZXJzLCBgeyBvdmVyd3JpdGU6IHRydWUgfWAgZm9yIHJldHJpZXMgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVwYWlyaW5nIGFuIG9ycGhhbmVkIHBhcnRpYWwgd3JpdGUpLlxuICAgICAgICBsZXQgaG9va0VudGl0eVdyaXRlT3B0aW9uczogeyBvdmVyd3JpdGU6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBDcmVhdGUvdXBkYXRlIGVudGl0eSBiYXNlZCBvbiBldmVudCB0eXBlIChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgLy8gUnVuIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBydW5EYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlucHV0OiBTZXJpYWxpemVkRGF0YTtcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhydW5EYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogcnVuRGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1biA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuRGF0YS5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuRGF0YS53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHJ1biBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bkRhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgIGlucHV0OiBydW5EYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0cmlidXRlczogcnVuRGF0YS5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIEF0b21pY2FsbHkgcHVibGlzaCB0aGUgcnVuIGVudGl0eSBmaWxlIHdpdGhvdXQgb3ZlcndyaXRpbmcgYW5cbiAgICAgICAgICAvLyBleGlzdGluZyB3aW5uZXIuIFRoaXMgcHJldmVudHMgYSBUT0NUT1UgcmFjZSB3aXRoIHRoZSByZXNpbGllbnRcbiAgICAgICAgICAvLyBzdGFydCBwYXRoIChydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuKSB0aGF0IGNvdWxkIHJlc3VsdCBpblxuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBydW5fY3JlYXRlZCBldmVudHMgaW4gdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICBjb25zdCBydW5QYXRoID0gdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHJ1blBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShydW4sIGpzb25SZXBsYWNlciwgMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICAvLyBJZiBhbHJlYWR5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVuIHdpdGhvdXQgaW5zZXJ0aW5nIGFcbiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudC4gIFRoaXMgbWFrZXMgcnVuX3N0YXJ0ZWQgaWRlbXBvdGVudCBmb3JcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMuICBXZSBvbWl0IHByZWxvYWRlZCBldmVudHMgaGVyZVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGlzIGlzIGEgcmFyZSByYWNlLWNvbmRpdGlvbiBwYXRoIOKAlCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gZmFsbHMgYmFjayB0byBsb2FkV29ya2Zsb3dSdW5FdmVudHMoKS5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UnVuLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHJ1bjogY3VycmVudFJ1biB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0ID8/IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7IG91dHB1dD86IGFueSB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgZmFpbGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIFNlcmlhbGl6ZWREYXRhIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAgICAgICAgICAgLy8gZGVoeWRyYXRlUnVuRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVSdW5FcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgICBlcnJvckNvZGU6IGZhaWxlZERhdGEuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICBkZWxldGVBbGxIb29rc0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbFdhaXRzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IGN1cnJlbnRSdW4uc3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ2NhbmNlbGxlZCcsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcgJiYgY3VycmVudFJ1bikge1xuICAgICAgICAgIHJ1biA9IGF3YWl0IHdpdGhSdW5GaWxlTG9jayhlZmZlY3RpdmVSdW5JZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJlc2ggPSBhd2FpdCByZWFkSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIGVmZmVjdGl2ZVJ1bklkLCB0YWcpLFxuICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghZnJlc2gpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoZGF0YS5ldmVudERhdGEuY2hhbmdlcywge1xuICAgICAgICAgICAgICBleGlzdGluZ0tleXM6IE9iamVjdC5rZXlzKGZyZXNoLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczpcbiAgICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xhaW0gdGhlIGNvcnJlbGF0aW9uIGRlZHVwIGxvY2sgb25seSBhZnRlciB2YWxpZGF0aW9uOiBhXG4gICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGZhaWx1cmUgbXVzdCBsZWF2ZSB0aGUgY29ycmVsYXRpb25JZCB1bmNsYWltZWQgc29cbiAgICAgICAgICAgIC8vIHRoZSBydW50aW1lJ3MgcmV0cnkgb2YgdGhlIHNhbWUgZXZlbnQgaXMgbm90IG1pc3JlcG9ydGVkIGFzXG4gICAgICAgICAgICAvLyBcImFscmVhZHkgZXhpc3RzXCIgd2hpbGUgdGhlIGV2ZW50IHdhcyBuZXZlciB3cml0dGVuICh0aGVcbiAgICAgICAgICAgIC8vIGRpc3BhdGNoZXIgd291bGQgdGhlbiB3YWl0IGZvcmV2ZXIgZm9yIGFuIGV2ZW50IHRoYXQgaXMgbm90XG4gICAgICAgICAgICAvLyBpbiB0aGUgbG9nKS5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLndyaXRlci50eXBlID09PSAnd29ya2Zsb3cnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgICAgPyBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgICAgIDogYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkYDtcbiAgICAgICAgICAgICAgY29uc3QgYXR0ckxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgICAnYXR0cmlidXRlcycsXG4gICAgICAgICAgICAgICAgYXR0ckxvY2tOYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoYXR0ckxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICAgIGlmICghYXR0ckNsYWltZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBBdHRyaWJ1dGUgZXZlbnQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0ge1xuICAgICAgICAgICAgICAuLi5mcmVzaCxcbiAgICAgICAgICAgICAgYXR0cmlidXRlczogYXBwbHlBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgIGZyZXNoLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEuY2hhbmdlc1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH0gYXMgV29ya2Zsb3dSdW47XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKSxcbiAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gc3RlcF9jcmVhdGVkOiBDcmVhdGVzIHN0ZXAgZW50aXR5IHdpdGggc3RhdHVzICdwZW5kaW5nJywgYXR0ZW1wdD0wLCBjcmVhdGVkQXQgc2V0LlxuICAgICAgICAgIC8vIFR3byBjb25jdXJyZW50IGludm9jYXRpb25zIHdpdGggaWRlbnRpY2FsIGNvcnJlbGF0aW9uSWRzIChlLmcuIHRoZVxuICAgICAgICAgIC8vIHNuYXBzaG90IHJ1bnRpbWUncyBkZXRlcm1pbmlzdGljIGNvcnJlbGF0aW9uSWRzIGFjcm9zcyByZXBsYXlzKVxuICAgICAgICAgIC8vIG11c3QgYmUgZGVkdXBlZCDigJQgb3RoZXJ3aXNlIGJvdGggd3JpdGVzIHN1Y2NlZWQgYW5kIHRoZSBldmVudCBsb2dcbiAgICAgICAgICAvLyBlbmRzIHVwIHdpdGggZHVwbGljYXRlIHN0ZXBfY3JlYXRlZCBlbnRyaWVzLiBUaGUgb3V0ZXJcbiAgICAgICAgICAvLyB3aXRoU3RlcExvY2sgbXV0ZXggc2VyaWFsaXplcyB3aXRoaW4gYSBzaW5nbGUgcHJvY2VzczsgdGhpc1xuICAgICAgICAgIC8vIFRoZSBleGNsdXNpdmUgY29uc3RyYWludCBmaWxlIGFkZGl0aW9uYWxseSBwcm90ZWN0cyBhZ2FpbnN0XG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyByYWNlcyAodHdvIHBucG0gd29ya2VycywgcmVkZWxpdmVyZWQgcXVldWUgbWVzc2FnZXMsXG4gICAgICAgICAgLy8gZXRjLikuIFRoZSBsb3NlciB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvciBzbyB0aGUgcnVudGltZSdzXG4gICAgICAgICAgLy8gZXhpc3RpbmcgY2F0Y2ggcGF0aCBjYW4gc3dhbGxvdyBpdCBhbmQgYXZvaWQgZG91YmxlLXF1ZXVpbmcgdGhlXG4gICAgICAgICAgLy8gc3RlcC5cbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrUGF0aCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXN0ZXBDcmVhdGVkQ2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3RlcERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwRGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgaW5wdXQ6IHN0ZXBEYXRhLmlucHV0LFxuICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXR0ZW1wdDogMCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAvLyBQcm9wYWdhdGUgc3BlY1ZlcnNpb24gZnJvbSB0aGUgZXZlbnQgdG8gdGhlIHN0ZXAgZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgc3RlcFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gc3RlcF9zdGFydGVkOiBJbmNyZW1lbnRzIGF0dGVtcHQsIHNldHMgc3RhdHVzIHRvICdydW5uaW5nJ1xuICAgICAgICAgIC8vIFNldHMgc3RhcnRlZEF0IG9ubHkgb24gdGhlIGZpcnN0IHN0YXJ0IChub3QgdXBkYXRlZCBvbiByZXRyaWVzKVxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIGhhc24ndCBiZWVuIHJlYWNoZWQgeWV0XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlciAmJlxuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpID4gRGF0ZS5ub3coKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUb29FYXJseUVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3Qgc3RhcnQgc3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiOiByZXRyeUFmdGVyIHRpbWVzdGFtcCBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXRgLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IE1hdGguY2VpbChcbiAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlZFN0ZXAucmV0cnlBZnRlci5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDBcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBndWFyZDogcmUtcmVhZCB0aGUgc3RlcCBlbnRpdHkgdG8gY2hlY2sgaWYgaXRcbiAgICAgICAgICAgIC8vIHJlYWNoZWQgdGVybWluYWwgc3RhdGUgYmV0d2VlbiB0aGUgdmFsaWRhdGlvbiByZWFkIGFuZCBub3cuXG4gICAgICAgICAgICAvLyBUaGlzIG5hcnJvd3MgdGhlIFRPQ1RPVSB3aW5kb3cgYnV0IGRvZXMgbm90IGZ1bGx5IGVsaW1pbmF0ZSBpdFxuICAgICAgICAgICAgLy8gKHRoZSBsb2NhbCB3b3JsZCBpcyBzaW5nbGUtcHJvY2VzcyAvIGRldi1vbmx5OyB0aGUgcG9zdGdyZXNcbiAgICAgICAgICAgIC8vIHdvcmxkIHVzZXMgU1FMLWxldmVsIGF0b21pYyBndWFyZHMgZm9yIHByb2R1Y3Rpb24pLlxuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgZnJlc2hTdGVwID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICAgIHN0ZXBDb21wb3NpdGVLZXksXG4gICAgICAgICAgICAgIFN0ZXBTY2hlbWEsXG4gICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChmcmVzaFN0ZXAgJiYgaXNTdGVwVGVybWluYWwoZnJlc2hTdGVwLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7ZnJlc2hTdGVwLnN0YXR1c31cImBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2V0IHN0YXJ0ZWRBdCBvbiB0aGUgZmlyc3Qgc3RhcnRcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiB2YWxpZGF0ZWRTdGVwLnN0YXJ0ZWRBdCA/PyBub3csXG4gICAgICAgICAgICAgIC8vIEluY3JlbWVudCBhdHRlbXB0IGNvdW50ZXIgb24gZXZlcnkgc3RhcnRcbiAgICAgICAgICAgICAgYXR0ZW1wdDogdmFsaWRhdGVkU3RlcC5hdHRlbXB0ICsgMSxcbiAgICAgICAgICAgICAgLy8gQ2xlYXIgcmV0cnlBZnRlciBub3cgdGhhdCB0aGUgc3RlcCBoYXMgc3RhcnRlZFxuICAgICAgICAgICAgICByZXRyeUFmdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9jb21wbGV0ZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggb3V0cHV0XG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHN0ZXAgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMgeyByZXN1bHQ6IGFueSB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgIG91dHB1dDogY29tcGxldGVkRGF0YS5yZXN1bHQsXG4gICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gc3RlcF9mYWlsZWQ6IFRlcm1pbmFsIHN0YXRlIHdpdGggZXJyb3JcbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGZhaWxpbmcgdGhlIHNhbWUgc3RlcCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IGZhaWxlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBjb25zdCBsb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICA/IGAke3N0ZXBDb21wb3NpdGVLZXl9LnRlcm1pbmFsLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbGA7XG4gICAgICAgICAgICBjb25zdCB0ZXJtaW5hbExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBsb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZSh0ZXJtaW5hbExvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCBtb2RpZnkgc3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBmaWVsZCBpcyBTZXJpYWxpemVkRGF0YSAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgICAgICAgICAgIC8vIGRlaHlkcmF0ZVN0ZXBFcnJvci4gV2Ugc3RvcmUgaXQgdmVyYmF0aW0g4oCUIGNvbnN1bWVycyBoeWRyYXRlIGl0XG4gICAgICAgICAgICAvLyB2aWEgaHlkcmF0ZVN0ZXBFcnJvciB0byByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlLlxuICAgICAgICAgICAgc3RlcCA9IHtcbiAgICAgICAgICAgICAgLi4udmFsaWRhdGVkU3RlcCxcbiAgICAgICAgICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgZXJyb3I6IGZhaWxlZERhdGEuZXJyb3IgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmc6IFNldHMgc3RhdHVzIGJhY2sgdG8gJ3BlbmRpbmcnLCByZWNvcmRzIGVycm9yXG4gICAgICAgICAgLy8gUmV1c2UgdmFsaWRhdGVkU3RlcCBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBjb25zdCByZXRyeURhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICAgIHJldHJ5QWZ0ZXI/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICBlcnJvcjogcmV0cnlEYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5RGF0YS5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gSG9vayBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmXG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZGF0YVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBob29rRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIHRva2VuOiBzdHJpbmc7XG4gICAgICAgICAgICBtZXRhZGF0YT86IGFueTtcbiAgICAgICAgICAgIGlzV2ViaG9vaz86IGJvb2xlYW47XG4gICAgICAgICAgICBpc1N5c3RlbT86IGJvb2xlYW47XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEF0b21pY2FsbHkgY2xhaW0gdGhlIHRva2VuIHVzaW5nIGFuIGV4Y2x1c2l2ZS1jcmVhdGUgY29uc3RyYWludCBmaWxlLlxuICAgICAgICAgIC8vIFRoaXMgYXZvaWRzIHRoZSBUT0NUT1UgcmFjZSBvZiB0aGUgcHJldmlvdXMgcmVhZC1hbGwtdGhlbi1jaGVjayBhcHByb2FjaC5cbiAgICAgICAgICBjb25zdCBjb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICBgJHtoYXNoVG9rZW4oaG9va0RhdGEudG9rZW4pfS5qc29uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gUGVyc2lzdCBgZXZlbnRJZGAgaW4gdGhlIGNsYWltIHNvIGNvbmN1cnJlbnQgLyBjcm9zcy1cbiAgICAgICAgICAvLyBwcm9jZXNzIHJldHJpZXMgY2FuIGNvbnZlcmdlIG9uIGEgc2luZ2xlIGNhbm9uaWNhbFxuICAgICAgICAgIC8vIGBob29rX2NyZWF0ZWRgIGV2ZW50IHBhdGguIFNlZSB0aGUgcmVjb3ZlcnkgY29tbWVudFxuICAgICAgICAgIC8vIGJlbG93LlxuICAgICAgICAgIGNvbnN0IHRva2VuQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgY29uc3RyYWludFBhdGgsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgaG9va0lkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlY292ZXJ5IHNoYXBlOiB0aGUgZHVyYWJsZSByZWNvcmQgb2YgYSBzdWNjZXNzZnVsIGhvb2tcbiAgICAgICAgICAvLyBjcmVhdGlvbiBpcyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgaW4gdGhlIGV2ZW50IGxvZy4gVGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBhbmQgaG9vayBlbnRpdHkgYXJlIHdyaXR0ZW4gYmVmb3JlIHRoZSBldmVudCxcbiAgICAgICAgICAvLyBhbmQgdGhlIHRocmVlIHdyaXRlcyBhcmUgTk9UIGF0b21pYywgc28gYSBjcmFzaCBhdCBhbnlcbiAgICAgICAgICAvLyBwb2ludCBjYW4gbGVhdmUgb25lIG9yIHR3byBvZiB0aGVtIG9uIGRpc2sgd2l0aG91dCB0aGVcbiAgICAgICAgICAvLyBldmVudC4gVHJlYXRpbmcgdGhvc2UgYXMgXCJjb21wbGV0ZWRcIiB3b3VsZCBoYXZlIHRoZVxuICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBzd2FsbG93IHRoZSByZXRyeSBhbmQgcGVybWFuZW50bHkgbG9zZVxuICAgICAgICAgIC8vIHRoZSBgaG9va19jcmVhdGVkYCBldmVudCBmcm9tIHRoZSBsb2cuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBXaGVuIHRoZSBkZWR1cCBicmFuY2ggZmlyZXMgZm9yIHRoZSBzYW1lIGAocnVuSWQsIGhvb2tJZClgLFxuICAgICAgICAgIC8vIHdlIGNvbnZlcmdlIG9uIHRoZSBjYW5vbmljYWwgYGV2ZW50SWRgIHBlcnNpc3RlZCBpbiB0aGVcbiAgICAgICAgICAvLyBjbGFpbSBmaWxlIGJ5IHRoZSBvcmlnaW5hbCAod2lubmluZykgYHdyaXRlRXhjbHVzaXZlYC4gQnlcbiAgICAgICAgICAvLyBhZG9wdGluZyB0aGF0IGV2ZW50SWQgZm9yIHRoaXMgcmV0cnkncyBldmVudCB3cml0ZSDigJQgYW5kXG4gICAgICAgICAgLy8gbGV0dGluZyB0aGUgb3V0ZXIgbm8tb3ZlcndyaXRlIGB3cml0ZUpTT05gIGZvciB0aGUgZXZlbnRcbiAgICAgICAgICAvLyB0aHJvdyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgb24gY29sbGlzaW9uIOKAlCBjb25jdXJyZW50IC9cbiAgICAgICAgICAvLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgZWl0aGVyOlxuICAgICAgICAgIC8vICAgLSBwdWJsaXNoIHRoZSBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIHBhdGggZXhhY3RseSBvbmNlXG4gICAgICAgICAgLy8gICAgICh0aGUgbG9zZXIncyBgd3JpdGVKU09OYCB0aHJvd3MgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgICAgICAgICAvLyAgICAgd2hpY2ggdGhlIHJ1bnRpbWUncyBleGlzdGluZyBjb25jdXJyZW50LXJlcGxheSBjYXRjaFxuICAgICAgICAgIC8vICAgICBwYXRoIGF0IHN1c3BlbnNpb24taGFuZGxlci50czoxNDIgc3dhbGxvd3MpLCBvclxuICAgICAgICAgIC8vICAgLSBjb252ZXJnZSBvbiBhIHNpbmdsZSByZWNvdmVyeSB3cml0ZSB3aGVuIHRoZSBwcmlvclxuICAgICAgICAgIC8vICAgICBjbGFpbSB3YXMgb3JwaGFuZWQgYnkgYSBjcmFzaCBiZWZvcmUgdGhlIGV2ZW50IGxhbmRlZC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBsZWdhY3kgZmFsbGJhY2sgKGBleGlzdGluZ0NsYWltLmV2ZW50SWRgIHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBpcyBmb3IgY2xhaW0gZmlsZXMgd3JpdHRlbiBiZWZvcmUgdGhpcyBmaWVsZCB3YXMgYWRkZWQg4oCUXG4gICAgICAgICAgLy8gdGhvc2UgcHJvYmUgdGhlIGV2ZW50IGxvZyBkaXJlY3RseSBhbmQgZmFsbCB0aHJvdWdoIHRvIGFcbiAgICAgICAgICAvLyBmcmVzaC1ldmVudElkIHJlY292ZXJ5IHdyaXRlLiBUaGUgbGVnYWN5IHBhdGggZG9lcyBub3RcbiAgICAgICAgICAvLyBjb252ZXJnZSBhY3Jvc3Mgd29ya2VycyBidXQgY2Fubm90IHJlZ3Jlc3MgYmVoYXZpb3IgZm9yXG4gICAgICAgICAgLy8gZnJlc2hseS13cml0dGVuIGNsYWltcy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBgd2l0aEhvb2tMb2NrYCBpbi1wcm9jZXNzIG11dGV4IGFib3ZlIGtlZXBzIHR3byBzYW1lLVxuICAgICAgICAgIC8vIHRpY2sgaW4tcHJvY2VzcyBjYWxsZXJzIGZyb20gcmFjaW5nIGludG8gdGhpcyBicmFuY2ggd2l0aFxuICAgICAgICAgIC8vIHRoZSB3aW5uZXIgbWlkLXdyaXRlLCBidXQgaXMgbm90IHN1ZmZpY2llbnQgYWNyb3NzXG4gICAgICAgICAgLy8gcHJvY2Vzc2VzIOKAlCB0aGUgZHVyYWJsZSBjb252ZXJnZW5jZSBrZXkgKGBjbGFpbS5ldmVudElkYClcbiAgICAgICAgICAvLyBpcyB3aGF0IGNsb3NlcyB0aGUgY3Jvc3MtcHJvY2VzcyByYWNlLlxuICAgICAgICAgIGxldCB3cml0ZUhvb2tFbnRpdHlXaXRoT3ZlcndyaXRlID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAoIXRva2VuQ2xhaW1lZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDbGFpbSA9IGF3YWl0IHJlYWRIb29rVG9rZW5DbGFpbShjb25zdHJhaW50UGF0aCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZXhpc3RpbmdDbGFpbT8ucnVuSWQgPT09IGVmZmVjdGl2ZVJ1bklkICYmXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0uaG9va0lkID09PSBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBBZG9wdCBhIGNhbm9uaWNhbCBldmVudElkIGZvciB0aGUgcmVjb3Zlcnkgd3JpdGUuIFRoZVxuICAgICAgICAgICAgICAvLyBvdXRlciBldmVudCBwdWJsaXNoIChgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWApXG4gICAgICAgICAgICAgIC8vIGVpdGhlciBzdWNjZWVkcyAod2UgcHVibGlzaCB0aGUgY2Fub25pY2FsIGV2ZW50LFxuICAgICAgICAgICAgICAvLyByZXBhaXJpbmcgYSBwYXJ0aWFsIHdyaXRlIGxlZnQgYnkgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgIC8vIGNsYWltYW50KSBvciByZXR1cm5zIGBmYWxzZWAgYW5kIHdlIHRocm93XG4gICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAodGhlIGV2ZW50IHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAgIC8vIHB1Ymxpc2hlZCDigJQgYSByZWFsIGR1cGxpY2F0ZSkuIEVpdGhlciB3YXkgdGhlIGxvZ1xuICAgICAgICAgICAgICAvLyBlbmRzIHdpdGggZXhhY3RseSBvbmUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgLy8gYChydW5JZCwgaG9va0lkKWAuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnRJZCBjb21lcyBmcm9tIG9uZSBvZiB0d28gcGxhY2VzOlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyAgIC0gYGV4aXN0aW5nQ2xhaW0uZXZlbnRJZGAgZm9yIGNsYWltcyB3cml0dGVuIGJ5XG4gICAgICAgICAgICAgIC8vICAgICB0aGlzIHZlcnNpb24gKHRoZSB3cml0ZXIgYWJvdmUgcGVyc2lzdHMgdGhlXG4gICAgICAgICAgICAgIC8vICAgICBjYW5kaWRhdGUgZXZlbnRJZCBhdG9taWNhbGx5IHdpdGggdGhlIGNsYWltKS5cbiAgICAgICAgICAgICAgLy8gICAgIFRoZSBldmVudElkIGlzIGR1cmFibGUsIHNvIHRoZSBvdXRlclxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGFsb25lIGlzIGVub3VnaCB0b1xuICAgICAgICAgICAgICAvLyAgICAgYXJiaXRyYXRlIHB1YmxpY2F0aW9uOiBpdCBmYWlscyBpZmYgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICB3YXMgYWxyZWFkeSBwdWJsaXNoZWQgYXQgdGhhdCBleGFjdCBwYXRoLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyAgIC0gVGhlIHJlY292ZXJ5LW1hcmtlciBzaWRlY2FyIGZvciBsZWdhY3kgY2xhaW1zXG4gICAgICAgICAgICAgIC8vICAgICB3cml0dGVuIGJlZm9yZSBgZXZlbnRJZGAgd2FzIHBlcnNpc3RlZCBpbmxpbmVcbiAgICAgICAgICAgICAgLy8gICAgIGluIHRoZSBjbGFpbS4gVGhlIG1hcmtlciBpcyBpdHNlbGYgYVxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlYCwgc28gdGhlIGZpcnN0IHJldHJ5IHBpbnMgaXRzXG4gICAgICAgICAgICAgIC8vICAgICBjYW5kaWRhdGUgZXZlbnRJZCBhcyBjYW5vbmljYWwgYW5kIHN1YnNlcXVlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHJldHJpZXMgYWRvcHQgaXQuIFdpdGhvdXQgdGhpcywgdHdvIHByb2Nlc3Nlc1xuICAgICAgICAgICAgICAvLyAgICAgYm90aCByZWFkaW5nIHRoZSBzYW1lIGxlZ2FjeSBjbGFpbSB3b3VsZCBlYWNoXG4gICAgICAgICAgICAgIC8vICAgICBnZW5lcmF0ZSB0aGVpciBvd24gZXZlbnRJZCwgbGFuZCB0aGVpclxuICAgICAgICAgICAgICAvLyAgICAgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGNhbGxzIGF0IGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyAgICAgcGF0aHMsIGFuZCBhcHBlbmQgdHdvIGV2ZW50cy5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAgIEZvciBsZWdhY3kgY2xhaW1zIHdlIGFsc28gbXVzdCBwcm9iZSB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIGxvZyBmb3IgYW4gZXhpc3RpbmcgYGhvb2tfY3JlYXRlZGAgZXZlbnQgQkVGT1JFXG4gICAgICAgICAgICAgIC8vICAgICBwaW5uaW5nIGEgY2Fub25pY2FsIGV2ZW50SWQ6IHRoZSBwcmUtdXBncmFkZVxuICAgICAgICAgICAgICAvLyAgICAgd3JpdGVyIG1heSBoYXZlIGFscmVhZHkgcHVibGlzaGVkIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgd2l0aCBpdHMgb3duIGV2ZW50SWQsIGFuZCB0aGUgbWFya2VyIGhhcyBubyB3YXlcbiAgICAgICAgICAgICAgLy8gICAgIG9mIGtub3dpbmcgdGhhdCBldmVudElkIGFmdGVyIHRoZSBmYWN0LiBXaXRob3V0XG4gICAgICAgICAgICAgIC8vICAgICB0aGlzIHByb2JlLCBhIHBvc3QtdXBncmFkZSByZXRyeSB3b3VsZCBwaW4gYVxuICAgICAgICAgICAgICAvLyAgICAgZGlmZmVyZW50IGV2ZW50SWQsIHdyaXRlIGEgaG9vayBlbnRpdHksIGFuZFxuICAgICAgICAgICAgICAvLyAgICAgcHVibGlzaCBhIGR1cGxpY2F0ZSBldmVudCBhdCB0aGUgbWFya2VyJ3MgcGF0aC5cbiAgICAgICAgICAgICAgbGV0IGNhbm9uaWNhbEV2ZW50SWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2xhaW0uZXZlbnRJZCkge1xuICAgICAgICAgICAgICAgIGNhbm9uaWNhbEV2ZW50SWQgPSBleGlzdGluZ0NsYWltLmV2ZW50SWQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQgPVxuICAgICAgICAgICAgICAgICAgYXdhaXQgZmluZEV4aXN0aW5nSG9va0NyZWF0ZWRFdmVudElkKFxuICAgICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHVibGlzaGVkRXZlbnRJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhlIHByZS11cGdyYWRlIHdyaXRlciBtYXkgaGF2ZSBjcmFzaGVkIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyBldmVudCBwdWJsaXNoIGFuZCBpdHMgaG9vayBlbnRpdHkgd3JpdGUg4oCUXG4gICAgICAgICAgICAgICAgICAvLyByZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBwZXJzaXN0ZWQgZXZlbnQnc1xuICAgICAgICAgICAgICAgICAgLy8gcGF5bG9hZCBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ24gZHVwbGljYXRlLlxuICAgICAgICAgICAgICAgICAgYXdhaXQgcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZCA9IGF3YWl0IHBpbkNhbm9uaWNhbEV2ZW50SWRGb3JMZWdhY3lDbGFpbShcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgZXZlbnRJZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHBpbm5lZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gTG9zdCB0aGUgbWFya2VyIHJhY2UgYW5kIHRoZSBtYXJrZXIgZmlsZSBpc1xuICAgICAgICAgICAgICAgICAgLy8gdW5yZWFkYWJsZSAoZXh0cmVtZWx5IHJhcmU7IGNvcnJ1cHRlZCBkaXNrKS5cbiAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IGFzIGEgcmVhbCBkdXBsaWNhdGUgc28gdGhlIHJ1bnRpbWUnc1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBzd2FsbG93cyB0aGlzXG4gICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IGluc3RlYWQgb2Ygcmlza2luZyBkaXZlcmdlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHB1YmxpY2F0aW9uLlxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBIb29rIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2Fub25pY2FsRXZlbnRJZCA9IHBpbm5lZDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlYnVpbGQgYGV2ZW50YCB3aXRoIHRoZSBjYW5vbmljYWwgZXZlbnRJZCBhbmQgYVxuICAgICAgICAgICAgICAvLyBkZXRlcm1pbmlzdGljIGBjcmVhdGVkQXRgIGRlcml2ZWQgZnJvbSB0aGUgZXZlbnRJZFxuICAgICAgICAgICAgICAvLyAoYSBVTElEKSBzbyB0d28gd29ya2VycyB3cml0aW5nIHRoZSBzYW1lIGV2ZW50XG4gICAgICAgICAgICAgIC8vIHByb2R1Y2UgYnl0ZS1pZGVudGljYWwgY29udGVudC5cbiAgICAgICAgICAgICAgZXZlbnRJZCA9IGNhbm9uaWNhbEV2ZW50SWQ7XG4gICAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbENyZWF0ZWRBdCA9XG4gICAgICAgICAgICAgICAgdWxpZFRvRGF0ZShldmVudElkLnJlcGxhY2UoL15ldm50Xy8sICcnKSkgPz8gbm93O1xuICAgICAgICAgICAgICBldmVudCA9IHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY2Fub25pY2FsQ3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDcm9zcy1ob29rIC8gY3Jvc3MtcnVuIGNvbmZsaWN0OiBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyAocnVuSWQsIGhvb2tJZCkgaG9sZHMgdGhpcyB0b2tlbi4gQ3JlYXRlIGFcbiAgICAgICAgICAgICAgLy8gaG9va19jb25mbGljdCBldmVudCBzbyB0aGUgd29ya2Zsb3cgY2FuIGZhaWxcbiAgICAgICAgICAgICAgLy8gZ3JhY2VmdWxseSB3aGVuIHRoZSBob29rIGlzIGF3YWl0ZWQuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfY29uZmxpY3QnLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgICAgICAgIC4uLihleGlzdGluZ0NsYWltXG4gICAgICAgICAgICAgICAgICAgID8geyBjb25mbGljdGluZ1J1bklkOiBleGlzdGluZ0NsYWltLnJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnRcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgICAgcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoXG4gICAgICAgICAgICAgICAgY29uZmxpY3RFdmVudCxcbiAgICAgICAgICAgICAgICByZXNvbHZlRGF0YVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGNvbmZsaWN0IGV2ZW50IChubyBob29rIGVudGl0eSBjcmVhdGVkKVxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBmaWx0ZXJlZEV2ZW50LFxuICAgICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICAgIGhvb2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBob29rIGVudGl0eSBub3csIGJ1dCBkZWZlciBpdHMgd3JpdGUgdW50aWxcbiAgICAgICAgICAvLyBBRlRFUiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCBhdCB0aGUgYm90dG9tIG9mIHRoaXNcbiAgICAgICAgICAvLyBmdW5jdGlvbiBjb21taXRzLiBUaGUgcmV0cnkgcGF0aCBjYW4gcmVhY2ggdGhpcyBicmFuY2hcbiAgICAgICAgICAvLyBmb3IgYSBob29rIHdob3NlIGBob29rX2NyZWF0ZWRgIGV2ZW50IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gcHVibGlzaGVkIHN1Y2Nlc3NmdWxseSAoYW4gXCJhbHJlYWR5LWNvbW1pdHRlZFxuICAgICAgICAgIC8vIGR1cGxpY2F0ZVwiKTsgaW4gdGhhdCBjYXNlIHRoZSBvdXRlciBgd3JpdGVFeGNsdXNpdmVgXG4gICAgICAgICAgLy8gZm9yIHRoZSBldmVudCB3aWxsIHJldHVybiBmYWxzZSBhbmQgd2Ugd2lsbCB0aHJvd1xuICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYC4gV3JpdGluZyB0aGUgaG9vayBlbnRpdHkgaGVyZVxuICAgICAgICAgIC8vIGZpcnN0IHdvdWxkIG11dGF0ZSBhbHJlYWR5LWNvbW1pdHRlZCBkdXJhYmxlIHN0YXRlIHdpdGhcbiAgICAgICAgICAvLyB0aGUgcmV0cnkncyBwYXlsb2FkIChlLmcuIGRpZmZlcmVudCBgbWV0YWRhdGFgIG9yXG4gICAgICAgICAgLy8gYGlzV2ViaG9va2ApIGJlZm9yZSB0aGUgZXZlbnQgcHVibGlzaCBwcm92ZWQgd2hpY2hcbiAgICAgICAgICAvLyBvdXRjb21lIHdlIGFyZSBpbiDigJQgbGVhdmluZyB0aGUgZW50aXR5IGFuZCBldmVudCBsb2dcbiAgICAgICAgICAvLyBpbmNvbnNpc3RlbnQuIEJ5IGRlZmVycmluZywgdGhlIGVudGl0eSBpcyBvbmx5IHdyaXR0ZW5cbiAgICAgICAgICAvLyB3aGVuIHRoZSBwdWJsaXNoIGFjdHVhbGx5IHN1Y2NlZWRzIChmaXJzdCB3cml0ZXIgb3JcbiAgICAgICAgICAvLyBvcnBoYW4gcmVjb3ZlcnkpLiBTZWUgcHJhbmF5Z3AncyByZXZpZXcgb24gUFIgIzIyOTUgZm9yXG4gICAgICAgICAgLy8gdGhlIGthcnRoaWtzY2FsZTMgcmVwcm8uXG4gICAgICAgICAgaG9vayA9IHtcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuLFxuICAgICAgICAgICAgbWV0YWRhdGE6IGhvb2tEYXRhLm1ldGFkYXRhLFxuICAgICAgICAgICAgb3duZXJJZDogJ2xvY2FsLW93bmVyJyxcbiAgICAgICAgICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6ICdsb2NhbCcsXG4gICAgICAgICAgICAvLyBVc2UgdGhlIChwb3NzaWJseSBjYW5vbmljYWwpIGV2ZW50J3MgY3JlYXRlZEF0IHNvIHR3b1xuICAgICAgICAgICAgLy8gd29ya2VycyB3cml0aW5nIHRoZSBzYW1lIGhvb2sgZW50aXR5IHByb2R1Y2UgYnl0ZS1cbiAgICAgICAgICAgIC8vIGlkZW50aWNhbCBjb250ZW50IGR1cmluZyBjb252ZXJnZW5jZS5cbiAgICAgICAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBob29rIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgaXNXZWJob29rOiBob29rRGF0YS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgICAgICAgICBpc1N5c3RlbTogaG9va0RhdGEuaXNTeXN0ZW0gPz8gZmFsc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zID0gd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZVxuICAgICAgICAgICAgPyB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSB7XG4gICAgICAgICAgLy8gaG9va19kaXNwb3NlZDogRGVsZXRlcyBob29rIGVudGl0eSwgcmVqZWN0cyBkdXBsaWNhdGVzLlxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggZGlzcG9zaW5nIHRoZSBzYW1lIGhvb2sgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBob29rTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7ZGF0YS5jb3JyZWxhdGlvbklkfS5kaXNwb3NlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke2RhdGEuY29ycmVsYXRpb25JZH0uZGlzcG9zZWRgO1xuICAgICAgICAgIGNvbnN0IGxvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgaG9va0xvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUobG9ja1BhdGgsICcnKTtcbiAgICAgICAgICBpZiAoIWNsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZGlzcG9zZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBSZWFkIHRoZSBob29rIHRvIGdldCBpdHMgdG9rZW4gYmVmb3JlIGRlbGV0aW5nXG4gICAgICAgICAgY29uc3QgaG9va1BhdGggPSB0YWdnZWRQYXRoKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSG9vayA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdob29rcycsXG4gICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBIb29rU2NoZW1hLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgICAgICAgICAvLyBEZWxldGUgdGhlIHRva2VuIGNvbnN0cmFpbnQgZmlsZSB0byBmcmVlIHVwIHRoZSB0b2tlblxuICAgICAgICAgICAgLy8gZm9yIHJldXNlLCBhbmQgZGVsZXRlIHRoaXMgaG9vaydzIHJlY292ZXJ5IG1hcmtlciAoaWZcbiAgICAgICAgICAgIC8vIGFueSkgZm9yIGRpc2sgaHlnaWVuZS4gVGhlIG1hcmtlcidzIGZpbGVuYW1lIGhhc2hcbiAgICAgICAgICAgIC8vIGluY2x1ZGVzIGAodG9rZW4sIHJ1bklkLCBob29rSWQpYCBzbyBkaWZmZXJlbnRcbiAgICAgICAgICAgIC8vIGxpZmV0aW1lcyBuZXZlciBjb2xsaWRlLCBidXQgY2xlYW5pbmcgdXAgcmVkdWNlcyBkaXNrXG4gICAgICAgICAgICAvLyBsZWFrIGZvciBob29rcyB0aGF0IGdvIHRocm91Z2ggdGhlIHJlY292ZXJ5IHBhdGguXG4gICAgICAgICAgICBjb25zdCBkaXNwb3NlZENvbnN0cmFpbnRQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgICAndG9rZW5zJyxcbiAgICAgICAgICAgICAgYCR7aGFzaFRva2VuKGV4aXN0aW5nSG9vay50b2tlbil9Lmpzb25gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihkaXNwb3NlZENvbnN0cmFpbnRQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgICAgICAgIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoXG4gICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2sudG9rZW4sXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnJ1bklkLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ob29rSWRcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihob29rUGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyB3YWl0X2NyZWF0ZWQ6IENyZWF0ZXMgd2FpdCBlbnRpdHkgd2l0aCBzdGF0dXMgJ3dhaXRpbmcnLlxuICAgICAgICAgIC8vIEF0b21pYyBjbGFpbSBvbiBhIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpIGNvbnN0cmFpbnQgZmlsZVxuICAgICAgICAgIC8vIGVuc3VyZXMgZHVwbGljYXRlIHdhaXRfY3JlYXRlZCBmcm9tIGNvbmN1cnJlbnQgaW52b2NhdGlvbnNcbiAgICAgICAgICAvLyBzdXJmYWNlcyBhcyBFbnRpdHlDb25mbGljdEVycm9yIChyZXBsYWNlcyBhIHByaW9yIFRPQ1RPVVxuICAgICAgICAgIC8vIHJlYWQtdGhlbi1jaGVjayB0aGF0IGNvdWxkIGxldCBib3RoIHdyaXRlcnMgdGhyb3VnaCkuXG4gICAgICAgICAgY29uc3Qgd2FpdENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkTG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7d2FpdENvbXBvc2l0ZUtleX0uY3JlYXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWRgO1xuICAgICAgICAgIGNvbnN0IHdhaXRDcmVhdGVkTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZENsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHdhaXRDcmVhdGVkTG9ja1BhdGgsXG4gICAgICAgICAgICAnJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF3YWl0Q3JlYXRlZENsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgZXhpc3RzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgd2FpdERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICByZXN1bWVBdD86IERhdGU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3YWl0ID0ge1xuICAgICAgICAgICAgd2FpdElkOiB3YWl0Q29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgc3RhdHVzOiAnd2FpdGluZycsXG4gICAgICAgICAgICByZXN1bWVBdDogd2FpdERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3dhaXRzJywgd2FpdENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHdhaXRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICAgICAgLy8gd2FpdF9jb21wbGV0ZWQ6IFRyYW5zaXRpb25zIHdhaXQgdG8gJ2NvbXBsZXRlZCcsIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGNvbXBsZXRpbmcgdGhlIHNhbWUgd2FpdCAoVE9DVE9VIHJhY2UpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0TG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgID8gYCR7d2FpdENvbXBvc2l0ZUtleX0uY29tcGxldGVkLiR7dGFnfWBcbiAgICAgICAgICAgIDogYCR7d2FpdENvbXBvc2l0ZUtleX0uY29tcGxldGVkYDtcbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ3dhaXRzJyxcbiAgICAgICAgICAgIHdhaXRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNvbXBsZXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nV2FpdCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0Q29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgV2FpdFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFleGlzdGluZ1dhaXQpIHtcbiAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBsb2NrIGZpbGUgd2UganVzdCBjbGFpbWVkIOKAlCB0aGUgd2FpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICBhd2FpdCBmcy51bmxpbmsobG9ja1BhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGxvY2sgZmlsZSAod3JpdGVFeGNsdXNpdmUgYWJvdmUpIGFscmVhZHkgcHJldmVudHMgY29uY3VycmVudFxuICAgICAgICAgIC8vIGNvbXBsZXRpb25zIOKAlCBubyBhZGRpdGlvbmFsIHN0YXR1cyBjaGVjayBuZWVkZWQuXG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nV2FpdCxcbiAgICAgICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0LFxuICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogaG9va19yZWNlaXZlZCBldmVudHMgYXJlIHN0b3JlZCBpbiB0aGUgZXZlbnQgbG9nIGJ1dCBkb24ndFxuICAgICAgICAvLyBtb2RpZnkgdGhlIEhvb2sgZW50aXR5ICh3aGljaCBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkIGZpZWxkKVxuXG4gICAgICAgIC8vIFN0b3JlIGV2ZW50IHVzaW5nIGNvbXBvc2l0ZSBrZXkge3J1bklkfS17ZXZlbnRJZH0uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGB3cml0ZUV4Y2x1c2l2ZWAgKE9fQ1JFQVR8T19FWENMIHZpYSB0ZW1wLWZpbGUgKyBoYXJkLWxpbmspXG4gICAgICAgIC8vIGlzIHRoZSBjcm9zcy1wcm9jZXNzIGF0b21pYyBwdWJsaXNoIHByaW1pdGl2ZTogaWYgdGhlIGZpbGVcbiAgICAgICAgLy8gYWxyZWFkeSBleGlzdHMsIHJldHVybnMgZmFsc2UgaW5zdGVhZCBvZiBvdmVyd3JpdGluZy4gVGhpc1xuICAgICAgICAvLyBpcyBjcml0aWNhbCBmb3IgdGhlIGhvb2tfY3JlYXRlZCBkZWR1cC1yZWNvdmVyeSBjb252ZXJnZW5jZVxuICAgICAgICAvLyAoYWJvdmUpIOKAlCB0d28gd29ya2VycyB0aGF0IGFkb3B0IHRoZSBzYW1lIGNhbm9uaWNhbCBldmVudElkXG4gICAgICAgIC8vIHJhY2UgaGVyZTsgd2hvZXZlciBsaW5rcyB0aGUgZmlsZSBmaXJzdCB3aW5zLCB0aGUgbG9zZXJcbiAgICAgICAgLy8gdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsIGFuZCB0aGUgcnVudGltZSdzIGV4aXN0aW5nXG4gICAgICAgIC8vIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggYXQgc3VzcGVuc2lvbi1oYW5kbGVyLnRzOjE0MlxuICAgICAgICAvLyBzd2FsbG93cyBpdC4gRm9yIGFsbCBvdGhlciBldmVudCB0eXBlcywgZXZlbnRJZHMgYXJlXG4gICAgICAgIC8vIG1vbm90b25pYyBVTElEcyAoZ2xvYmFsbHkgdW5pcXVlIGJ5IGNvbnN0cnVjdGlvbikgc28gYVxuICAgICAgICAvLyBjb2xsaXNpb24gaW5kaWNhdGVzIGEgcmVhbCBidWcgYW5kIEVudGl0eUNvbmZsaWN0RXJyb3IgaXNcbiAgICAgICAgLy8gYWxzbyB0aGUgcmlnaHQgc3VyZmFjZSDigJQgc2FtZSBzaGFwZSBhcyBzdGVwX2NyZWF0ZWQnc1xuICAgICAgICAvLyBjbGFpbS1maWxlIGJlaGF2aW9yLlxuICAgICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtldmVudElkfWA7XG4gICAgICAgIGNvbnN0IGV2ZW50UHVibGlzaGVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnZXZlbnRzJywgY29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGV2ZW50LCBqc29uUmVwbGFjZXIsIDIpXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZXZlbnRQdWJsaXNoZWQpIHtcbiAgICAgICAgICAvLyBGb3IgYGhvb2tfY3JlYXRlZGAsIGxvc2luZyB0aGUgZXZlbnQgcHVibGlzaCBtZWFucyB0aGVcbiAgICAgICAgICAvLyBldmVudCB3YXMgYWxyZWFkeSBjb21taXR0ZWQgYXQgdGhpcyBleGFjdCAoY2Fub25pY2FsKVxuICAgICAgICAgIC8vIHBhdGguIFRoZSBvcmlnaW5hbCBwdWJsaXNoZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgLy8gaXRzIGV2ZW50IHB1Ymxpc2ggYW5kIGl0cyBkZWZlcnJlZCBob29rLWVudGl0eSB3cml0ZVxuICAgICAgICAgIC8vICh0aGUgaW52ZXJzZSBvZiB0aGUgY3Jhc2ggd2luZG93IHRoZSBkZWZlcnJhbCBjbG9zZXMpLFxuICAgICAgICAgIC8vIGxlYXZpbmcgYW4gZXZlbnQtZmlyc3Qgb3JwaGFuOiB0aGUgZXZlbnQgaXMgaW4gdGhlIGxvZ1xuICAgICAgICAgIC8vIGJ1dCB0aGUgZW50aXR5IGlzIG1pc3NpbmcgYW5kIHRoZSBob29rIGlzIHVucmVzb2x2YWJsZS5cbiAgICAgICAgICAvLyBSZXBhaXIgdGhlIGVudGl0eSBmcm9tIHRoZSBQRVJTSVNURUQgZXZlbnQncyBwYXlsb2FkXG4gICAgICAgICAgLy8gKG5ldmVyIHRoZSByZXRyeSdzIOKAlCBkaWZmZXJlbnQgcmV0cnkgbWV0YWRhdGEgbXVzdCBub3RcbiAgICAgICAgICAvLyBjaGFuZ2UgY29tbWl0dGVkIHN0YXRlKSBiZWZvcmUgc3VyZmFjaW5nIHRoZSBiZW5pZ25cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgdG8gdGhlIHJ1bnRpbWUncyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgICAgICBhd2FpdCByZXBhaXJIb29rRW50aXR5RnJvbVBlcnNpc3RlZEV2ZW50KFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBldmVudElkLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IFwiJHtldmVudElkfVwiIGFscmVhZHkgZXhpc3RzIGZvciBydW4gXCIke2VmZmVjdGl2ZVJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0aGUgaG9vayBlbnRpdHkgT05MWSBub3cgdGhhdCB0aGUgZXZlbnQgcHVibGlzaCBoYXNcbiAgICAgICAgLy8gY29tbWl0dGVkLiBEb2luZyB0aGlzIGVhcmxpZXIgKGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBicmFuY2ggYWJvdmUpIHdvdWxkIG11dGF0ZSBhbiBhbHJlYWR5LWNvbW1pdHRlZCBob29rXG4gICAgICAgIC8vIGVudGl0eSB3aXRoIHRoZSByZXRyeSdzIHBheWxvYWQgYmVmb3JlIHRoZSBldmVudCBwdWJsaXNoXG4gICAgICAgIC8vIHByb3ZlZCB3aGV0aGVyIHRoaXMgYXR0ZW1wdCB3YXMgcmVwYWlyaW5nIGEgbWlzc2luZyBldmVudFxuICAgICAgICAvLyBvciBqdXN0IGNvbGxpZGluZyB3aXRoIGFuIGFscmVhZHktcHVibGlzaGVkIGBob29rX2NyZWF0ZWRgLlxuICAgICAgICAvLyBUaGUgYnJhbmNoIHNldHMgYGhvb2tFbnRpdHlXcml0ZU9wdGlvbnNgIGlmZiB0aGlzIGV2ZW50XG4gICAgICAgIC8vIHR5cGUgd3JpdGVzIGFuIGVudGl0eS5cbiAgICAgICAgaWYgKGhvb2sgJiYgZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rLmhvb2tJZCwgdGFnKSxcbiAgICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgICBob29rRW50aXR5V3JpdGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkRXZlbnQgPSBzdHJpcEV2ZW50RGF0YVJlZnMoZXZlbnQsIHJlc29sdmVEYXRhKTtcblxuICAgICAgICAvLyBGb3IgcnVuX3N0YXJ0ZWQ6IHByZWxvYWQgb25lIHBhZ2Ugb2YgZXZlbnRzIHNvIHRoZSBydW50aW1lIGNhbiBza2lwXG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0IGNhbGwgd2hlbiBoYXNNb3JlIGlzIGZhbHNlLlxuICAgICAgICBsZXQgZXZlbnRzOiBFdmVudFtdIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgaGFzTW9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnICYmIHJ1bikge1xuICAgICAgICAgIGNvbnN0IGFsbEV2ZW50cyA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgZmlsZVByZWZpeDogYCR7ZWZmZWN0aXZlUnVuSWR9LWAsXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgbGltaXQ6IDEwMDAsXG4gICAgICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICAgICAgZ2V0SWQ6IChlKSA9PiBlLmV2ZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRzID0gYWxsRXZlbnRzLmRhdGE7XG4gICAgICAgICAgY3Vyc29yID0gYWxsRXZlbnRzLmN1cnNvcjtcbiAgICAgICAgICBoYXNNb3JlID0gYWxsRXZlbnRzLmhhc01vcmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBldmVudCBhbmQgYW55IGNyZWF0ZWQvdXBkYXRlZCBlbnRpdHlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICBydW4sXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIHdhaXQsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGN1cnNvcixcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICB9O1xuICAgICAgfSAvLyBlbmQgY3JlYXRlSW1wbFxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQocnVuSWQsIGV2ZW50SWQsIHBhcmFtcykge1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgIGNvbXBvc2l0ZUtleSxcbiAgICAgICAgRXZlbnRTY2hlbWEsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50SWR9IGluIHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3QocGFyYW1zKSB7XG4gICAgICBjb25zdCB7IHJ1bklkIH0gPSBwYXJhbXM7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QnlDb3JyZWxhdGlvbklkKHBhcmFtcykge1xuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=
1536
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmFnZS9ldmVudHMtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLGtCQUFrQixHQUNuQixNQUFNLGtCQUFrQixDQUFDO0FBVzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsV0FBVyxFQUNYLFVBQVUsRUFDVixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsVUFBVSxFQUNWLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsVUFBVSxFQUNWLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsVUFBVSxFQUNWLFlBQVksRUFDWixhQUFhLEVBQ2Isd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxHQUNWLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsYUFBYSxHQUNkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFELE9BQU8sRUFB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cGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgUnVuTm90U3VwcG9ydGVkRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIb29rLFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RlcCxcbiAgU3RvcmFnZSxcbiAgV2FpdCxcbiAgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBhcHBseUF0dHJpYnV0ZUNoYW5nZXMsXG4gIEV2ZW50U2NoZW1hLFxuICBIb29rU2NoZW1hLFxuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICByZXF1aXJlc05ld2VyV29ybGQsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTdGVwU2NoZW1hLFxuICB1bGlkVG9EYXRlLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG4gIHZhbGlkYXRlVWxpZFRpbWVzdGFtcCxcbiAgV2FpdFNjaGVtYSxcbiAgV29ya2Zsb3dSdW5TY2hlbWEsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTiB9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBhc3NlcnRTYWZlRW50aXR5SWQsXG4gIGRlbGV0ZUpTT04sXG4gIGpzb25SZXBsYWNlcixcbiAgbGlzdEpTT05GaWxlcyxcbiAgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5LFxuICByZWFkSlNPTixcbiAgcmVhZEpTT05XaXRoRmFsbGJhY2ssXG4gIHJlc29sdmVXaXRoaW5CYXNlLFxuICB0YWdnZWRQYXRoLFxuICB3cml0ZUV4Y2x1c2l2ZSxcbiAgd3JpdGVKU09OLFxufSBmcm9tICcuLi9mcy5qcyc7XG5pbXBvcnQgeyBzdHJpcEV2ZW50RGF0YVJlZnMgfSBmcm9tICcuL2ZpbHRlcnMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0T2JqZWN0Q3JlYXRlZEF0LFxuICBoYXNoVG9rZW4sXG4gIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgsXG4gIG1vbm90b25pY1VsaWQsXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBkZWxldGVBbGxIb29rc0ZvclJ1biB9IGZyb20gJy4vaG9va3Mtc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVMZWdhY3lFdmVudCB9IGZyb20gJy4vbGVnYWN5LmpzJztcbmltcG9ydCB7IHdpdGhSdW5GaWxlTG9jayB9IGZyb20gJy4vcnVucy1zdG9yYWdlLmpzJztcblxuLyoqXG4gKiBQZXItc3RlcCBpbi1wcm9jZXNzIGFzeW5jIG11dGV4LiBTZXJpYWxpemVzIGNvbmN1cnJlbnQgYGV2ZW50cy5jcmVhdGVgIGNhbGxzXG4gKiB0aGF0IHRhcmdldCB0aGUgc2FtZSBzdGVwLCBzbyB0aGF0IHRoZSBcImNoZWNrIHRlcm1pbmFsIHN0YXRlLCB0aGVuIHdyaXRlIHN0ZXBcbiAqIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgaXMgYXRvbWljLiBXaXRob3V0IHRoaXMsIHR3byBjb25jdXJyZW50IHN0ZXBfc3RhcnRlZFxuICogY2FsbHMgY2FuIGJvdGggcGFzcyB0aGUgbm90LXRlcm1pbmFsIGNoZWNrIGFuZCBib3RoIHdyaXRlIHN0ZXBfc3RhcnRlZCBldmVudHNcbiAqIOKAlCBvciBhIHN0ZXBfc3RhcnRlZCBjYW4gbGFuZCBpbiB0aGUgbG9nIGFmdGVyIHN0ZXBfY29tcGxldGVkIGhhcyBhbHJlYWR5XG4gKiB3cml0dGVuLCBwcm9kdWNpbmcgdW5jb25zdW1lZCBldmVudHMgb24gcmVwbGF5LlxuICpcbiAqIER1cGxpY2F0ZSBzdGVwX3N0YXJ0ZWQgZXZlbnRzIGZvciBhIG5vbi10ZXJtaW5hbCBzdGVwIGFyZSBzdGlsbCBhbGxvd2VkXG4gKiAocmV0cmllcyBsZWdpdGltYXRlbHkgcmUtc3RhcnQgYSBzdGVwKSwgb25seSB3cml0ZXMgdG8gYW4gYWxyZWFkeS10ZXJtaW5hbFxuICogc3RlcCBhcmUgcmVqZWN0ZWQuXG4gKi9cbi8vIGBzdGVwTG9ja3NgIGFuZCBgaG9va0xvY2tzYCBhcmUgbm93IGluc3RhbnRpYXRlZCBwZXJcbi8vIGBjcmVhdGVFdmVudHNTdG9yYWdlYCBjYWxsIChzZWUgaW5zaWRlIHRoZSBmdW5jdGlvbikgcmF0aGVyIHRoYW5cbi8vIGJlaW5nIG1vZHVsZS1sZXZlbC4gVGhlIG9uLWRpc2sgY29uc3RyYWludCAvIGNsYWltIGZpbGVzIHJlbWFpblxuLy8gdGhlIGR1cmFibGUgc291cmNlIG9mIHRydXRoIGFjcm9zcyBwcm9jZXNzZXM7IHRoZSBpbi1wcm9jZXNzXG4vLyBtdXRleCBpcyBhIHBlci1pbnN0YW5jZSBvcHRpbWl6YXRpb24gdGhhdCBjbG9zZXMgYSBzaG9ydCByYWNlXG4vLyB3aW5kb3cgaW4gdGhlIGRlZHVwLXJlY292ZXJ5IHBhdGguIFBlci1pbnN0YW5jZSBzY29waW5nIGxldHNcbi8vIHRlc3RzIHNpbXVsYXRlIGNyb3NzLXByb2Nlc3MgYmVoYXZpb3Igd2l0aCB0d28gc3RvcmFnZSBpbnN0YW5jZXNcbi8vIHNoYXJpbmcgb25lIGRhdGEgZGlyZWN0b3J5IChlYWNoIGluc3RhbmNlIGhhcyBpbmRlcGVuZGVudCBsb2Nrc1xuLy8gYnV0IGEgc2hhcmVkIGZpbGVzeXN0ZW0pLCBleGFjdGx5IG1hdGNoaW5nIHRoZSBjcm9zcy1wcm9jZXNzXG4vLyBzZW1hbnRpY3Mgd2l0aG91dCBzcGF3bmluZyBzdWJwcm9jZXNzZXMuXG5cbmNvbnN0IEhvb2tUb2tlbkNsYWltU2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBUaGUgdG9rZW4tY2xhaW0gd3JpdGVyIGJlbG93IGhhcyBhbHdheXMgcGVyc2lzdGVkIGBob29rSWRgLCBidXRcbiAgLy8gdGhpcyByZWFkIHNjaGVtYSBwcmV2aW91c2x5IG9taXR0ZWQgaXQsIHdoaWNoIGlzIHRoZSBidWcgZml4ZWRcbiAgLy8gYnkgaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC93b3JrZmxvdy9pc3N1ZXMvMjI4My4gYG9wdGlvbmFsKClgXG4gIC8vIGlzIGRlZmVuc2l2ZTogYW55IGNsYWltIGZpbGUgdGhhdCBzb21laG93IGxhY2tzIHRoZSBmaWVsZCBzdGlsbFxuICAvLyBwYXJzZXMgKHlpZWxkaW5nIGB1bmRlZmluZWRgKSBhbmQgZmFsbHMgdGhyb3VnaCB0byB0aGUgY3Jvc3MtXG4gIC8vIGhvb2sgY29uZmxpY3QgYnJhbmNoLCBtYXRjaGluZyBwcmUtZml4IGJlaGF2aW9yLlxuICBob29rSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcnVuSWQ6IHouc3RyaW5nKCksXG4gIC8vIGBldmVudElkYCBpcyB0aGUgY2Fub25pY2FsIGhvb2tfY3JlYXRlZCBldmVudCBJRCB0aGUgY2xhaW1pbmdcbiAgLy8gd29ya2VyIGNvbW1pdHRlZCB0byBwdWJsaXNoaW5nLiBQZXJzaXN0aW5nIGl0IGhlcmUgdHVybnMgdGhlXG4gIC8vIGNsYWltIGZpbGUgaW50byBhIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IGZvciBjcm9zcy13b3JrZXIgL1xuICAvLyBjcm9zcy1wcm9jZXNzIHJldHJpZXMgKHNlZSBjb21tZW50IG9uIHRoZSBob29rX2NyZWF0ZWQgYnJhbmNoKS5cbiAgLy8gYG9wdGlvbmFsKClgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGxlZ2FjeSBjbGFpbSBmaWxlXG4gIC8vIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgZXhpc3RlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSByZWNvdmVyeS1cbiAgLy8gbWFya2VyIHVwZ3JhZGUgcGF0aCwgd2hpY2ggYXRvbWljYWxseSBwaW5zIGEgY2Fub25pY2FsIGV2ZW50SWRcbiAgLy8gdmlhIGEgc2lkZWNhciBtYXJrZXIgKGFsc28gYSBgd3JpdGVFeGNsdXNpdmVgKS5cbiAgZXZlbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogU2lkZWNhciByZWNvdmVyeSBtYXJrZXIgdGhhdCBwaW5zIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgXG4gKiBldmVudElkIGZvciBhIGxlZ2FjeSB0b2tlbiBjbGFpbSDigJQgb25lIHdyaXR0ZW4gYnkgYSB2ZXJzaW9uIG9mXG4gKiB0aGlzIHN0b3JhZ2UgdGhhdCBkaWQgbm90IHlldCBwZXJzaXN0IGBldmVudElkYCBpbmxpbmUgaW4gdGhlXG4gKiBjbGFpbSBmaWxlLiBXaXRob3V0IHRoaXMgbWFya2VyLCB0d28gY3Jvc3MtcHJvY2VzcyByZXRyaWVzXG4gKiByZWFkaW5nIGEgbGVnYWN5IGNsYWltIGVhY2ggZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmRcbiAqIHRoZWlyIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnQgcGF0aHMsIGFuZFxuICogYXBwZW5kIHR3byBgaG9va19jcmVhdGVkYCBldmVudHMgZm9yIHRoZSBzYW1lIGAocnVuSWQsIGhvb2tJZClgLlxuICpcbiAqIFRoZSBtYXJrZXIgaXMgd3JpdHRlbiB2aWEgYHdyaXRlRXhjbHVzaXZlYCDigJQgdGhlIGZpcnN0IHJldHJ5IHRvXG4gKiBsYW5kIGl0IHBpbnMgaXRzIGNhbmRpZGF0ZSBldmVudElkIGFzIGNhbm9uaWNhbCwgYW5kIGV2ZXJ5XG4gKiBzdWJzZXF1ZW50IHJldHJ5IHJlYWRzIGFuZCBhZG9wdHMgdGhhdCBldmVudElkIGJlZm9yZSB0aGUgY29tbW9uXG4gKiBldmVudCBwdWJsaXNoLiBTY2hlbWEgaXMganVzdCBgeyBldmVudElkIH1gIGJlY2F1c2UgaWRlbnRpdHkgaXNcbiAqIGFscmVhZHkgZW5jb2RlZCBpbiB0aGUgbWFya2VyJ3MgZmlsZW5hbWUgaGFzaCwgc28gZGlmZmVyZW50IHRva2VuXG4gKiBsaWZldGltZXMgY2FuIG5ldmVyIHNoYXJlIG9uZSBtYXJrZXIgKHNlZVxuICogYGhvb2tSZWNvdmVyeU1hcmtlclBhdGhgKS5cbiAqL1xuY29uc3QgSG9va1JlY292ZXJ5TWFya2VyU2NoZW1hID0gei5vYmplY3Qoe1xuICBldmVudElkOiB6LnN0cmluZygpLFxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRIb29rVG9rZW5DbGFpbShcbiAgY29uc3RyYWludFBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBIb29rVG9rZW5DbGFpbVNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKGNvbnN0cmFpbnRQYXRoLCBIb29rVG9rZW5DbGFpbVNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEhvb2tSZWNvdmVyeU1hcmtlcihcbiAgbWFya2VyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHouaW5mZXI8dHlwZW9mIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYT4gfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRKU09OKG1hcmtlclBhdGgsIEhvb2tSZWNvdmVyeU1hcmtlclNjaGVtYSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9iZSB0aGUgcnVuJ3MgZXZlbnQgbG9nIGZvciBhbiBleGlzdGluZyBgaG9va19jcmVhdGVkYCBldmVudFxuICogd2l0aCB0aGUgZ2l2ZW4gY29ycmVsYXRpb25JZC4gVXNlZCBieSB0aGUgbGVnYWN5LWNsYWltIHJlY292ZXJ5XG4gKiBwYXRoIHRvIGRldGVjdCBcImFscmVhZHkgcHVibGlzaGVkIGJ5IGEgcHJlLXVwZ3JhZGUgd3JpdGVcIiBiZWZvcmVcbiAqIHBpbm5pbmcgYSBjYW5vbmljYWwgZXZlbnRJZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBhIHBvc3QtdXBncmFkZVxuICogcmV0cnkgZW5jb3VudGVyaW5nIGEgbGVnYWN5IGNsYWltIHdob3NlIGBob29rX2NyZWF0ZWRgIHdhc1xuICogYWxyZWFkeSB3cml0dGVuICh3aXRoIHRoZSBwcmUtdXBncmFkZSB3cml0ZXIncyBvd24gZXZlbnRJZCkgd291bGRcbiAqIHBpbiBhICpkaWZmZXJlbnQqIGV2ZW50SWQgdmlhIHRoZSBtYXJrZXIgYW5kIHB1Ymxpc2ggYSBkdXBsaWNhdGVcbiAqIGV2ZW50IGF0IHRoZSBtYXJrZXIncyBwYXRoLlxuICpcbiAqIFRoZSBpbmxpbmUtYGV2ZW50SWRgIGZhc3QgcGF0aCBkb2VzIE5PVCBuZWVkIHRoaXMgcHJvYmU6IHRoZVxuICogY2Fub25pY2FsIGV2ZW50SWQgaXMgZHVyYWJsZSBpbiB0aGUgY2xhaW0gZmlsZSwgc28gdGhlIGV4aXN0aW5nXG4gKiBwdWJsaXNoIChgd3JpdGVFeGNsdXNpdmUoZXZlbnRQYXRoKWApIHdpbGwgZmFpbCBpZmYgdGhlIGV2ZW50XG4gKiBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGV4YWN0IHBhdGgg4oCUIHdoaWNoIGlzIHRoZSBjb3JyZWN0XG4gKiBcImFscmVhZHktcHVibGlzaGVkXCIgc2VtYW50aWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgIGRpcmVjdG9yeTogcGF0aC5qb2luKGJhc2VkaXIsICdldmVudHMnKSxcbiAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgIGZpbGVQcmVmaXg6IGAke3J1bklkfS1gLFxuICAgIGZpbHRlcjogKGV2ZW50KSA9PlxuICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICBsaW1pdDogMSxcbiAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgIGdldElkOiAoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gcmVzdWx0LmRhdGFbMF0/LmV2ZW50SWQgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXBhaXIgYW4gXCJldmVudC1maXJzdCBvcnBoYW5cIjogdGhlIGhvb2sgZW50aXR5IHdyaXRlIGlzIGRlZmVycmVkXG4gKiB1bnRpbCBhZnRlciB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgcHVibGlzaCBjb21taXRzIChzbyBhIGZhaWxlZFxuICogcHVibGlzaCBjYW5ub3QgbXV0YXRlIGFscmVhZHktY29tbWl0dGVkIHN0YXRlIOKAlCBzZWUgdGhlIGNvbW1lbnQgb25cbiAqIHRoZSBkZWZlcnJlZCB3cml0ZSksIHdoaWNoIG9wZW5zIHRoZSBpbnZlcnNlIGNyYXNoIHdpbmRvdyDigJQgYVxuICogY3Jhc2ggQUZURVIgdGhlIGV2ZW50IHB1Ymxpc2ggYnV0IEJFRk9SRSB0aGUgZGVmZXJyZWQgZW50aXR5IHdyaXRlXG4gKiBsZWF2ZXMgdGhlIGV2ZW50IGluIHRoZSBsb2cgd2l0aCB0aGUgaG9vayBlbnRpdHkgbWlzc2luZy4gQSByZXRyeVxuICogdGhlbiBjb2xsaWRlcyBhdCB0aGUgZXZlbnQgcHVibGlzaCBhbmQgdGhyb3dzXG4gKiBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKGNvcnJlY3Qg4oCUIHRoZSBldmVudCBJUyBjb21taXR0ZWQpLCBidXRcbiAqIHdpdGhvdXQgdGhpcyByZXBhaXIgdGhlIGVudGl0eSB3b3VsZCBzdGF5IG1pc3NpbmcgZm9yZXZlciBhbmQgdGhlXG4gKiBob29rIHdvdWxkIGJlIHVucmVzb2x2YWJsZS5cbiAqXG4gKiBUaGUgZW50aXR5IE1VU1QgYmUgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBwZXJzaXN0ZWQgY2Fub25pY2FsXG4gKiBldmVudCdzIHBheWxvYWQg4oCUIE5PVCB0aGUgcmV0cnkncyBgZXZlbnREYXRhYCDigJQgb3RoZXJ3aXNlIGEgcmV0cnlcbiAqIGNhcnJ5aW5nIGRpZmZlcmVudCBgbWV0YWRhdGFgIC8gYGlzV2ViaG9va2Agd291bGQgc2lsZW50bHkgY2hhbmdlXG4gKiBjb21taXR0ZWQgc3RhdGUuIFRoZSB3cml0ZSB1c2VzIGB3cml0ZUV4Y2x1c2l2ZWAgKGNyZWF0ZS1pZi1hYnNlbnQpXG4gKiBzbyBhIGNvbmN1cnJlbnQgd3JpdGVyIHJhY2luZyB0aGlzIHJlcGFpciBjYW5ub3QgYmUgb3ZlcndyaXR0ZW47XG4gKiB3aGljaGV2ZXIgd3JpdGUgbGFuZHMgZmlyc3QsIHRoZSBjb250ZW50IGlzIGlkZW50aWNhbCBiZWNhdXNlIGJvdGhcbiAqIGRlcml2ZSBmcm9tIHRoZSBzYW1lIHBlcnNpc3RlZCBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgcGVyc2lzdGVkRXZlbnRJZDogc3RyaW5nLFxuICB0YWc6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke3J1bklkfS0ke3BlcnNpc3RlZEV2ZW50SWR9YDtcbiAgY29uc3QgcGVyc2lzdGVkRXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICBiYXNlZGlyLFxuICAgICdldmVudHMnLFxuICAgIGNvbXBvc2l0ZUtleSxcbiAgICBFdmVudFNjaGVtYSxcbiAgICB0YWdcbiAgKTtcbiAgaWYgKFxuICAgICFwZXJzaXN0ZWRFdmVudCB8fFxuICAgIHBlcnNpc3RlZEV2ZW50LmV2ZW50VHlwZSAhPT0gJ2hvb2tfY3JlYXRlZCcgfHxcbiAgICBwZXJzaXN0ZWRFdmVudC5jb3JyZWxhdGlvbklkICE9PSBob29rSWRcbiAgKSB7XG4gICAgLy8gTm90aGluZyB0cnVzdHdvcnRoeSB0byByZXBhaXIgZnJvbS5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgYmFzZWRpcixcbiAgICAnaG9va3MnLFxuICAgIGhvb2tJZCxcbiAgICBIb29rU2NoZW1hLFxuICAgIHRhZ1xuICApO1xuICBpZiAoZXhpc3RpbmdIb29rKSB7XG4gICAgLy8gRW50aXR5IGFscmVhZHkgcHJlc2VudCDigJQgbm90IGFuIG9ycGhhbiwgbGVhdmUgaXQgdW50b3VjaGVkLlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBldmVudERhdGEgPSAocGVyc2lzdGVkRXZlbnQuZXZlbnREYXRhID8/IHt9KSBhcyB7XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gICAgbWV0YWRhdGE/OiBTZXJpYWxpemVkRGF0YTtcbiAgICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICAgIGlzU3lzdGVtPzogYm9vbGVhbjtcbiAgfTtcbiAgaWYgKHR5cGVvZiBldmVudERhdGEudG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGhvb2s6IEhvb2sgPSB7XG4gICAgcnVuSWQsXG4gICAgaG9va0lkLFxuICAgIHRva2VuOiBldmVudERhdGEudG9rZW4sXG4gICAgbWV0YWRhdGE6IGV2ZW50RGF0YS5tZXRhZGF0YSxcbiAgICBvd25lcklkOiAnbG9jYWwtb3duZXInLFxuICAgIHByb2plY3RJZDogJ2xvY2FsLXByb2plY3QnLFxuICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgIGNyZWF0ZWRBdDogcGVyc2lzdGVkRXZlbnQuY3JlYXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBwZXJzaXN0ZWRFdmVudC5zcGVjVmVyc2lvbixcbiAgICBpc1dlYmhvb2s6IGV2ZW50RGF0YS5pc1dlYmhvb2sgPz8gZmFsc2UsXG4gICAgaXNTeXN0ZW06IGV2ZW50RGF0YS5pc1N5c3RlbSA/PyBmYWxzZSxcbiAgfTtcbiAgYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnaG9va3MnLCBob29rSWQsIHRhZyksXG4gICAgSlNPTi5zdHJpbmdpZnkoaG9vaywganNvblJlcGxhY2VyLCAyKVxuICApO1xufVxuXG4vKipcbiAqIEF0b21pY2FsbHkgcGluIGEgY2Fub25pY2FsIGBob29rX2NyZWF0ZWRgIGV2ZW50SWQgZm9yIGEgbGVnYWN5XG4gKiBjbGFpbSAob25lIHdpdGhvdXQgYW4gaW5saW5lIGBldmVudElkYCkuIFRoZSBmaXJzdCByZXRyeSB0b1xuICogYHdyaXRlRXhjbHVzaXZlYCB0aGUgcmVjb3ZlcnkgbWFya2VyIHdpbnM7IGl0cyBgY2FuZGlkYXRlRXZlbnRJZGBcbiAqIGJlY29tZXMgY2Fub25pY2FsLiBTdWJzZXF1ZW50IHJldHJpZXMgcmVhZCB0aGUgbWFya2VyIGFuZCBhZG9wdFxuICogaXRzIGBldmVudElkYC4gVG9nZXRoZXIgd2l0aCB0aGUgYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgIGluXG4gKiB0aGUgb3V0ZXIgZXZlbnQgcHVibGlzaCwgdGhpcyBnaXZlcyB0aGUgbGVnYWN5LWZhbGxiYWNrIHBhdGggdGhlXG4gKiBzYW1lIHNpbmdsZS1ldmVudCBjb252ZXJnZW5jZSBndWFyYW50ZWUgYXMgdGhlIGlubGluZS1gZXZlbnRJZGBcbiAqIGZhc3QgcGF0aC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIGNhbGxlciB0byBhZG9wdCwgb3IgYG51bGxgXG4gKiBpZiB3ZSBsb3N0IHRoZSBtYXJrZXIgcmFjZSBBTkQgdGhlIHJlc3VsdGluZyBtYXJrZXIgZmlsZSBpc1xuICogdW5yZWFkYWJsZSAoZXh0cmVtZWx5IHJhcmU7IGNvcnJ1cHRlZCBkaXNrKS4gQ2FsbGVycyB0cmVhdCBgbnVsbGBcbiAqIGFzIFwiZ2l2ZSB1cCwgdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgXCIgc28gdGhlIHJ1bnRpbWUnc1xuICogY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aCBzd2FsbG93cyB0aGlzIGF0dGVtcHQgYW5kIGxldHNcbiAqIGFub3RoZXIgb25lIHRocm91Z2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpbkNhbm9uaWNhbEV2ZW50SWRGb3JMZWdhY3lDbGFpbShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0b2tlbjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nLFxuICBob29rSWQ6IHN0cmluZyxcbiAgY2FuZGlkYXRlRXZlbnRJZDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgbWFya2VyUGF0aCA9IGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoYmFzZWRpciwgdG9rZW4sIHJ1bklkLCBob29rSWQpO1xuICBjb25zdCBtYXJrZXJDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoeyBldmVudElkOiBjYW5kaWRhdGVFdmVudElkIH0pO1xuICBjb25zdCB3b24gPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShtYXJrZXJQYXRoLCBtYXJrZXJDb250ZW50KTtcbiAgaWYgKHdvbikge1xuICAgIHJldHVybiBjYW5kaWRhdGVFdmVudElkO1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgcmVhZEhvb2tSZWNvdmVyeU1hcmtlcihtYXJrZXJQYXRoKTtcbiAgcmV0dXJuIGV4aXN0aW5nPy5ldmVudElkID8/IG51bGw7XG59XG5cbi8qKlxuICogSW4tcHJvY2VzcyBwZXIta2V5IGFzeW5jIG11dGV4IGJhY2tlZCBieSBhIGNhbGxlci1zdXBwbGllZCBgTWFwYC5cbiAqIFVzZWQgYnkgYGNyZWF0ZUV2ZW50c1N0b3JhZ2VgIHRvIHNlcmlhbGl6ZSBzYW1lLWtleSBldmVudCB3cml0ZXNcbiAqIChgc3RlcF8qYCBmb3IgdGhlIHNhbWUgc3RlcCwgYGhvb2tfY3JlYXRlZGAgZm9yIHRoZSBzYW1lIGhvb2spLlxuICogVGhlIG1hcCBpcyBpbnN0YW50aWF0ZWQgcGVyLXN0b3JhZ2UtaW5zdGFuY2Ug4oCUIGRpZmZlcmVudFxuICogaW5zdGFuY2VzIGRvIE5PVCBzaGFyZSBsb2Nrcywgc28gdHdvIGluc3RhbmNlcyBzaGFyaW5nIG9uZSBkYXRhXG4gKiBkaXJlY3RvcnkgYmVoYXZlIGV4YWN0bHkgbGlrZSB0d28gc2VwYXJhdGUgT1MgcHJvY2Vzc2VzIGZyb20gdGhlXG4gKiBsb2NraW5nIHN0YW5kcG9pbnQuIENyb3NzLWluc3RhbmNlIC8gY3Jvc3MtcHJvY2VzcyBhcmJpdHJhdGlvblxuICogcmVsaWVzIG9uIHRoZSBvbi1kaXNrIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiB3aXRoSW5Qcm9jZXNzTG9jazxUPihcbiAgbG9ja3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+LFxuICBrZXk6IHN0cmluZyxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBwcmV2ID0gbG9ja3MuZ2V0KGtleSk7XG4gIGNvbnN0IHRhc2tCb3g6IHsgdGFzaz86IFByb21pc2U8VD4gfSA9IHt9O1xuICBjb25zdCB0YXNrID0gKGFzeW5jICgpID0+IHtcbiAgICBpZiAocHJldikge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHByZXZpb3VzIHRhc2sgdG8gc2V0dGxlOyBkb24ndCBpbmhlcml0IGl0cyBlcnJvcnMuXG4gICAgICBhd2FpdCBwcmV2LmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGxvY2tzLmdldChrZXkpID09PSB0YXNrQm94LnRhc2spIHtcbiAgICAgICAgbG9ja3MuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuICB0YXNrQm94LnRhc2sgPSB0YXNrO1xuICBsb2Nrcy5zZXQoa2V5LCB0YXNrKTtcbiAgcmV0dXJuIHRhc2s7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbGwgd2FpdHMgYXNzb2NpYXRlZCB3aXRoIGEgd29ya2Zsb3cgcnVuLlxuICogQ2FsbGVkIHdoZW4gYSBydW4gcmVhY2hlcyBhIHRlcm1pbmFsIHN0YXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVBbGxXYWl0c0ZvclJ1bihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBydW5JZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd2FpdHNEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3dhaXRzJyk7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdEpTT05GaWxlcyh3YWl0c0Rpcik7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgLy8gZmlsZUlkcyBtYXkgY29udGFpbiB0YWcgc3VmZml4ZXMgKGUuZy4sIFwid3J1bl9BQkMtY29ycklkLnZpdGVzdC0wXCIpXG4gICAgLy8gYnV0IHN0YXJ0c1dpdGggc3RpbGwgbWF0Y2hlcyBjb3JyZWN0bHkgc2luY2UgdGhlIHRhZyBpcyBhIHN1ZmZpeC5cbiAgICBpZiAoZmlsZS5zdGFydHNXaXRoKGAke3J1bklkfS1gKSkge1xuICAgICAgY29uc3Qgd2FpdFBhdGggPSBwYXRoLmpvaW4od2FpdHNEaXIsIGAke2ZpbGV9Lmpzb25gKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUpTT04od2FpdFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBlcnNpc3QgYSBsaWZlY3ljbGUtZHJpdmVuIHJ1biB1cGRhdGUgKHJ1bl9zdGFydGVkIC8gcnVuX2NvbXBsZXRlZCAvXG4gKiBydW5fZmFpbGVkIC8gcnVuX2NhbmNlbGxlZCkgdW5kZXIgdGhlIHNoYXJlZCBwZXItcnVuIGZpbGUgbG9jayxcbiAqIHJlLXJlYWRpbmcgdGhlIG9uLWRpc2sgcnVuIGluc2lkZSB0aGUgbG9jayBzbyBhbnkgYXR0cmlidXRlIHdyaXRlc1xuICogdGhhdCBsYW5kZWQgYmV0d2VlbiB0aGUgcHJlLXZhbGlkYXRpb24gYGN1cnJlbnRSdW5gIHJlYWQgYW5kIHRoaXNcbiAqIHdyaXRlIGFyZSBwcmVzZXJ2ZWQuIFdpdGhvdXQgdGhlIHJlLXJlYWQsIGFuIGBleHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzYFxuICogY2FsbCBzYW5kd2ljaGVkIGJldHdlZW4gdGhlIGxpZmVjeWNsZSByZWFkIGFuZCB3cml0ZSB3b3VsZCBiZVxuICogc2lsZW50bHkgb3ZlcndyaXR0ZW4gYnkgdGhlIGxpZmVjeWNsZSB3cml0ZSdzIHN0YWxlIGF0dHJpYnV0ZSBzbmFwc2hvdC5cbiAqXG4gKiBgcHJvcG9zZWRgIGlzIHRoZSBmdWxseS1jb25zdHJ1Y3RlZCBydW4gcm93IHRoZSBjYWxsZXIgd2FudHMgdG9cbiAqIHdyaXRlICh3aXRoIHRoZSBjb3JyZWN0IGRpc2NyaW1pbmF0ZWQtdW5pb24gc3RhdHVzIGJyYW5jaCkuIE9ubHkgdGhlXG4gKiBgYXR0cmlidXRlc2AgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgZnJlc2hlc3QgdmVyc2lvbiBpbnNpZGUgdGhlXG4gKiBsb2NrLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jazxUIGV4dGVuZHMgV29ya2Zsb3dSdW4+KFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwcm9wb3NlZDogVFxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiB3aXRoUnVuRmlsZUxvY2socnVuSWQsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLFxuICAgICAgV29ya2Zsb3dSdW5TY2hlbWFcbiAgICApO1xuICAgIGNvbnN0IG5leHQ6IFQgPSB7XG4gICAgICAuLi5wcm9wb3NlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGZyZXNoPy5hdHRyaWJ1dGVzID8/IHByb3Bvc2VkLmF0dHJpYnV0ZXMsXG4gICAgfTtcbiAgICBhd2FpdCB3cml0ZUpTT04odGFnZ2VkUGF0aChiYXNlZGlyLCAncnVucycsIHJ1bklkLCB0YWcpLCBuZXh0LCB7XG4gICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGV2ZW50cyBzdG9yYWdlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBmaWxlc3lzdGVtLlxuICogSW1wbGVtZW50cyB0aGUgU3RvcmFnZVsnZXZlbnRzJ10gaW50ZXJmYWNlIHdpdGggY3JlYXRlLCBsaXN0LCBhbmQgbGlzdEJ5Q29ycmVsYXRpb25JZCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXZlbnRzU3RvcmFnZShcbiAgYmFzZWRpcjogc3RyaW5nLFxuICB0YWc/OiBzdHJpbmdcbik6IFN0b3JhZ2VbJ2V2ZW50cyddIHtcbiAgLy8gUGVyLWluc3RhbmNlIGluLXByb2Nlc3MgbXV0ZXhlcy4gVHdvIHN0b3JhZ2UgaW5zdGFuY2VzIHNoYXJpbmdcbiAgLy8gb25lIGRhdGEgZGlyZWN0b3J5IGdldCBpbmRlcGVuZGVudCBsb2NrIG1hcHMsIHdoaWNoIG1ha2VzIHRoZW1cbiAgLy8gYmVoYXZlIGxpa2UgdHdvIHNlcGFyYXRlIE9TIHByb2Nlc3NlcyBmcm9tIHRoZSBsb2NraW5nXG4gIC8vIHN0YW5kcG9pbnQg4oCUIGNyb3NzLWluc3RhbmNlIGFyYml0cmF0aW9uIHJlbGllcyBvbiB0aGUgb24tZGlza1xuICAvLyBgd3JpdGVFeGNsdXNpdmVgIGNvbnN0cmFpbnQgLyBjbGFpbSBmaWxlcyBpbnN0ZWFkLiBUZXN0cyB1c2VcbiAgLy8gdGhpcyB0byBleGVyY2lzZSBjcm9zcy1wcm9jZXNzIGNvbnZlcmdlbmNlIHdpdGhvdXQgc3Bhd25pbmdcbiAgLy8gc3VicHJvY2Vzc2VzLlxuICAvL1xuICAvLyBgc3RlcExvY2tzYCBzZXJpYWxpemVzIHN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBmb3IgdGhlIHNhbWVcbiAgLy8gKHJ1bklkLCBjb3JyZWxhdGlvbklkKTogc2VlIGNvbW1lbnQgZnVydGhlciBkb3duIGluIHRoZVxuICAvLyBgaXNTdGVwRXZlbnRgIGJyYW5jaC5cbiAgLy9cbiAgLy8gYGhvb2tMb2Nrc2Agc2VyaWFsaXplcyBgaG9va19jcmVhdGVkYCBjYWxscyBmb3IgdGhlIHNhbWVcbiAgLy8gKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBzbyB0aGUgXCJjbGFpbSB0b2tlbiwgdGhlbiB3cml0ZSBob29rXG4gIC8vIGVudGl0eSArIGV2ZW50XCIgc2VxdWVuY2UgcnVucyB0byBjb21wbGV0aW9uIGJlZm9yZSBhbm90aGVyXG4gIC8vIGluLXByb2Nlc3MgaW52b2NhdGlvbiBlbnRlcnMgdGhlIGRlZHVwIGJyYW5jaC5cbiAgY29uc3Qgc3RlcExvY2tzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIGNvbnN0IGhvb2tMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY3JlYXRlKHJ1bklkLCBkYXRhLCBwYXJhbXMpOiBQcm9taXNlPEV2ZW50UmVzdWx0PiB7XG4gICAgICAvLyBWYWxpZGF0ZSByZXF1ZXN0LXN1cHBsaWVkIElEcyBiZWZvcmUgdGhleSdyZSBjb25jYXRlbmF0ZWQgaW50b1xuICAgICAgLy8gZmlsZXN5c3RlbSBwYXRocy4gVGhpcyBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlIGFnYWluc3QgcGF0aCB0cmF2ZXJzYWxcbiAgICAgIC8vIGF0dGFja3Mgd2hlcmUgYSBjbGllbnQgc3VwcGxpZXMgcnVuSWQgLyBjb3JyZWxhdGlvbklkIHZhbHVlcyBsaWtlXG4gICAgICAvLyBcIi4uLy4uLy4uL3BhY2thZ2VcIiB0byByZWFkIG9yIHdyaXRlIGZpbGVzIG91dHNpZGUgdGhlIHN0b3JhZ2Ugcm9vdC5cbiAgICAgIC8vIFJ1biBiZWZvcmUgdGFraW5nIHRoZSBwZXItc3RlcCBtdXRleCBzbyBtYWxmb3JtZWQgaW5wdXRzIGZhaWwgZmFzdC5cbiAgICAgIC8vXG4gICAgICAvLyBFbXB0eSBgY29ycmVsYXRpb25JZGAgdmFsdWVzIGFyZSBhbHNvIHJlamVjdGVkIGhlcmU6IHRoZSBldmVudFxuICAgICAgLy8gc2NoZW1hcyBvbmx5IHJlcXVpcmUgYHouc3RyaW5nKClgLCBzbyB3aXRob3V0IHRoaXMgY2hlY2sgYVxuICAgICAgLy8gc3RlcF9jcmVhdGVkIC8gaG9va19jcmVhdGVkIC8gd2FpdF9jcmVhdGVkIHJlcXVlc3Qgd2l0aFxuICAgICAgLy8gYGNvcnJlbGF0aW9uSWQ6ICcnYCB3b3VsZCBzaWxlbnRseSBiZSB3cml0dGVuIHVuZGVyIGEgbWFsZm9ybWVkXG4gICAgICAvLyBjb21wb3NpdGUga2V5IGxpa2UgYCR7cnVuSWR9LWAuXG4gICAgICBpZiAocnVuSWQgIT0gbnVsbCAmJiBydW5JZCAhPT0gJycpIHtcbiAgICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIH1cbiAgICAgIGlmICgnY29ycmVsYXRpb25JZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5jb3JyZWxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2NvcnJlbGF0aW9uSWQnLCBkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIGxpZmVjeWNsZSBldmVudHMgYXJlIHNlcmlhbGl6ZWQgcGVyLXN0ZXAgdmlhIGFuIGluLXByb2Nlc3MgbXV0ZXhcbiAgICAgIC8vIHNvIHRoYXQgdGhlIFwiY2hlY2sgc3RhdGUsIHRoZW4gd3JpdGVcIiBzZXF1ZW5jZSBpbiBzdGVwX3N0YXJ0ZWQgL1xuICAgICAgLy8gc3RlcF9jb21wbGV0ZWQgLyBzdGVwX2ZhaWxlZCAvIHN0ZXBfcmV0cnlpbmcgaXMgYXRvbWljLiBzdGVwX2NyZWF0ZWRcbiAgICAgIC8vIGlzIGFsc28gc2VyaWFsaXplZCBzbyBkdXBsaWNhdGUtY3JlYXRlIHJhY2VzIGRvbid0IGxlYXZlIGV4dHJhXG4gICAgICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnRzIGluIHRoZSBsb2cuXG4gICAgICBjb25zdCBpc1N0ZXBFdmVudCA9XG4gICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJyB8fFxuICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcgfHxcbiAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJztcbiAgICAgIGlmIChpc1N0ZXBFdmVudCAmJiBydW5JZCAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgY29uc3QgbG9ja0tleSA9IHRhZ1xuICAgICAgICAgID8gYCR7cnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS4ke3RhZ31gXG4gICAgICAgICAgOiBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgcmV0dXJuIHdpdGhJblByb2Nlc3NMb2NrKHN0ZXBMb2NrcywgbG9ja0tleSwgKCkgPT4gY3JlYXRlSW1wbCgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGBob29rX2NyZWF0ZWRgIGlzIHNlcmlhbGl6ZWQgcGVyLShydW5JZCwgaG9va0lkKSBzbyB0aGVcbiAgICAgIC8vIFwiY2xhaW0gdG9rZW4sIHdyaXRlIGhvb2sgZW50aXR5LCB3cml0ZSBldmVudFwiIHNlcXVlbmNlIHJ1bnMgdG9cbiAgICAgIC8vIGNvbXBsZXRpb24gYmVmb3JlIGFub3RoZXIgaW4tcHJvY2VzcyBpbnZvY2F0aW9uIGVudGVycyB0aGVcbiAgICAgIC8vIHNhbWUtaG9vayBkZWR1cCBicmFuY2guIFdpdGhvdXQgdGhpcywgdHdvIHNhbWUtdGljayBjb25jdXJyZW50XG4gICAgICAvLyBjYWxsZXJzIGNhbiByYWNlIGJldHdlZW4gdGhlIHdpbm5lcidzIGB3cml0ZUV4Y2x1c2l2ZShjbGFpbSlgXG4gICAgICAvLyBhbmQgYHdyaXRlSlNPTihob29rKWAsIG1ha2luZyB0aGUgc2Vjb25kIGNhbGxlciBtb21lbnRhcmlseVxuICAgICAgLy8gb2JzZXJ2ZSBhIGNsYWltIHdpdGggbm8gbWF0Y2hpbmcgaG9vayBlbnRpdHkg4oCUIHdoaWNoIHRoZVxuICAgICAgLy8gY3Jhc2gtcmVjb3ZlcnkgcGF0aCBiZWxvdyB3b3VsZCBtaXNpbnRlcnByZXQgYXMgYSBwcmlvciBjcmFzaFxuICAgICAgLy8gYW5kIGluY29ycmVjdGx5IGZhbGwgdGhyb3VnaCB0byBhIHNlY29uZCBob29rIGVudGl0eSB3cml0ZS5cbiAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgJiYgcnVuSWQgJiYgZGF0YS5jb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIGNvbnN0IGxvY2tLZXkgPSB0YWdcbiAgICAgICAgICA/IGAke3J1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uaG9vay4ke3RhZ31gXG4gICAgICAgICAgOiBgJHtydW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9Lmhvb2tgO1xuICAgICAgICByZXR1cm4gd2l0aEluUHJvY2Vzc0xvY2soaG9va0xvY2tzLCBsb2NrS2V5LCAoKSA9PiBjcmVhdGVJbXBsKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZUltcGwoKTtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSW1wbCgpOiBQcm9taXNlPEV2ZW50UmVzdWx0PiB7XG4gICAgICAgIC8vIE1vc3QgcGF0aHMgdXNlIHRoZSBmcmVzaGx5LWdlbmVyYXRlZCBjYW5kaWRhdGUgZXZlbnRJZC4gVGhlXG4gICAgICAgIC8vIGhvb2tfY3JlYXRlZCBkZWR1cC1yZWNvdmVyeSBwYXRoIGJlbG93IG1heSByZWFzc2lnbiBpdCB0b1xuICAgICAgICAvLyB0aGUgY2Fub25pY2FsIGV2ZW50SWQgcGVyc2lzdGVkIGluIHRoZSBkdXJhYmxlIHRva2VuIGNsYWltXG4gICAgICAgIC8vIHNvIGNvbmN1cnJlbnQgLyBjcm9zcy1wcm9jZXNzIHdvcmtlcnMgY29udmVyZ2Ugb24gYSBzaW5nbGVcbiAgICAgICAgLy8gZXZlbnQgaW4gdGhlIGxvZy5cbiAgICAgICAgbGV0IGV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIC8vIEZvciBydW5fY3JlYXRlZCBldmVudHMsIHVzZSBjbGllbnQtcHJvdmlkZWQgcnVuSWQgb3IgZ2VuZXJhdGUgb25lIHNlcnZlci1zaWRlXG4gICAgICAgIGxldCBlZmZlY3RpdmVSdW5JZDogc3RyaW5nO1xuICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgJiYgKCFydW5JZCB8fCBydW5JZCA9PT0gJycpKSB7XG4gICAgICAgICAgZWZmZWN0aXZlUnVuSWQgPSBgd3J1bl8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICB9IGVsc2UgaWYgKCFydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncnVuSWQgaXMgcmVxdWlyZWQgZm9yIG5vbi1ydW5fY3JlYXRlZCBldmVudHMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlZmZlY3RpdmVSdW5JZCA9IHJ1bklkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgY2xpZW50LXByb3ZpZGVkIHJ1bklkIHRpbWVzdGFtcCBpcyB3aXRoaW4gYWNjZXB0YWJsZSB0aHJlc2hvbGRcbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnICYmIHJ1bklkICYmIHJ1bklkICE9PSAnJykge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IHZhbGlkYXRlVWxpZFRpbWVzdGFtcChcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgJ3dydW5fJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93V29ybGRFcnJvcih2YWxpZGF0aW9uRXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwZWNWZXJzaW9uIGlzIGFsd2F5cyBzZW50IGJ5IHRoZSBydW50aW1lLCBidXQgd2UgcHJvdmlkZSBhIGZhbGxiYWNrIGZvciBzYWZldHlcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlU3BlY1ZlcnNpb24gPSBkYXRhLnNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5UO1xuXG4gICAgICAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBydW4gaXMgaW4gdGVybWluYWwgc3RhdGVcbiAgICAgICAgY29uc3QgaXNSdW5UZXJtaW5hbCA9IChzdGF0dXM6IHN0cmluZykgPT5cbiAgICAgICAgICBbJ2NvbXBsZXRlZCcsICdmYWlsZWQnLCAnY2FuY2VsbGVkJ10uaW5jbHVkZXMoc3RhdHVzKTtcblxuICAgICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgc3RlcCBpcyBpbiB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICBjb25zdCBpc1N0ZXBUZXJtaW5hbCA9IChzdGF0dXM6IHN0cmluZykgPT5cbiAgICAgICAgICBbJ2NvbXBsZXRlZCcsICdmYWlsZWQnLCAnY2FuY2VsbGVkJ10uaW5jbHVkZXMoc3RhdHVzKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBydW4gc3RhdGUgZm9yIHZhbGlkYXRpb24gKGlmIG5vdCBjcmVhdGluZyBhIG5ldyBydW4pXG4gICAgICAgIC8vIFNraXAgcnVuIHZhbGlkYXRpb24gZm9yIHN0ZXBfY29tcGxldGVkIGFuZCBzdGVwX3JldHJ5aW5nIC0gdGhleSBvbmx5IG9wZXJhdGVcbiAgICAgICAgLy8gb24gcnVubmluZyBzdGVwcywgYW5kIHJ1bm5pbmcgc3RlcHMgYXJlIGFsd2F5cyBhbGxvd2VkIHRvIG1vZGlmeSByZWdhcmRsZXNzXG4gICAgICAgIC8vIG9mIHJ1biBzdGF0ZS4gVGhpcyBvcHRpbWl6YXRpb24gc2F2ZXMgZmlsZXN5c3RlbSByZWFkcyBwZXIgc3RlcCBldmVudC5cbiAgICAgICAgbGV0IGN1cnJlbnRSdW46IFdvcmtmbG93UnVuIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHNraXBSdW5WYWxpZGF0aW9uRXZlbnRzID0gWydzdGVwX2NvbXBsZXRlZCcsICdzdGVwX3JldHJ5aW5nJ107XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSAhPT0gJ3J1bl9jcmVhdGVkJyAmJlxuICAgICAgICAgICFza2lwUnVuVmFsaWRhdGlvbkV2ZW50cy5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudFJ1biA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdydW5zJyxcbiAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmVzaWxpZW50IHN0YXJ0OiBydW5fc3RhcnRlZCBvbiBub24tZXhpc3RlbnQgcnVuIHdpdGggZXZlbnREYXRhXG4gICAgICAgICAgLy8gY3JlYXRlcyB0aGUgcnVuIGZpcnN0LCBzbyB0aGUgcXVldWUgY2FuIGJvb3RzdHJhcCBhIHJ1biB0aGF0XG4gICAgICAgICAgLy8gZmFpbGVkIHRvIGNyZWF0ZSBkdXJpbmcgc3RhcnQoKS5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJlxuICAgICAgICAgICAgIWN1cnJlbnRSdW4gJiZcbiAgICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGEgJiZcbiAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBydW5JbnB1dERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZD86IHN0cmluZztcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgICBpbnB1dD86IGFueTtcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBydW5JbnB1dERhdGEuZGVwbG95bWVudElkICYmXG4gICAgICAgICAgICAgIHJ1bklucHV0RGF0YS53b3JrZmxvd05hbWUgJiZcbiAgICAgICAgICAgICAgcnVuSW5wdXREYXRhLmlucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoXG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30pLm1hcChcbiAgICAgICAgICAgICAgICAgIChba2V5LCB2YWx1ZV0pID0+ICh7IGtleSwgdmFsdWUgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBBdG9taWNhbGx5IHRyeSB0byBwdWJsaXNoIHRoZSBydW4gZW50aXR5IHNvIG9ubHkgdGhlIGZpcnN0XG4gICAgICAgICAgICAgIC8vIHdyaXRlciB3aW5zLCBwcmV2ZW50aW5nIGEgVE9DVE9VIHJhY2Ugd2hlcmUgYSBjb25jdXJyZW50XG4gICAgICAgICAgICAgIC8vIHJ1bl9jcmVhdGVkIGZyb20gc3RhcnQoKSBjb3VsZCBvdmVyd3JpdGUgYSBydW4gdGhhdCB3YXNcbiAgICAgICAgICAgICAgLy8gYWxyZWFkeSB0cmFuc2l0aW9uZWQgdG8gJ3J1bm5pbmcnLlxuICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkUnVuOiBXb3JrZmxvd1J1biA9IHtcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dERhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogcnVuSW5wdXREYXRhLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogcnVuSW5wdXREYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHJ1bklucHV0RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMgPz8ge30sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGNvbnN0IHJ1blBhdGggPSB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyk7XG4gICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgICAgICBydW5QYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNyZWF0ZWRSdW4sIGpzb25SZXBsYWNlcilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoY3JlYXRlZCkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZWQgdGhlIHJ1biDigJQgYWxzbyB3cml0ZSB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuXG4gICAgICAgICAgICAgICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBldmVudElkOiBydW5DcmVhdGVkRXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXREYXRhLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dERhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXREYXRhLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dERhdGEuZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXREYXRhLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgIHJ1bklucHV0RGF0YS5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7cnVuQ3JlYXRlZEV2ZW50SWR9YDtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdldmVudHMnLCBjcmVhdGVkQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEV2ZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gY3JlYXRlZFJ1bjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSdW4gYWxyZWFkeSBleGlzdHMgKGNvbmN1cnJlbnQgcnVuX2NyZWF0ZWQgd29uIHRoZVxuICAgICAgICAgICAgICAgIC8vIHJhY2UpLiBSZS1yZWFkIGl0IHNvIGRvd25zdHJlYW0gbG9naWMgc2VlcyB0aGUgcmVhbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICBjdXJyZW50UnVuID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1blNjaGVtYSxcbiAgICAgICAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBydW5fZmFpbGVkIG9uIGEgbm9uLWV4aXN0ZW50IHJ1biBpcyByZWplY3RlZCB0byBtYXRjaCB0aGVcbiAgICAgICAgLy8gcG9zdGdyZXMgYW5kIHZlcmNlbCB3b3JsZHMsIHdoaWNoIGJvdGggc3VyZmFjZSB0aGlzIGFzIGFcbiAgICAgICAgLy8gV29ya2Zsb3dSdW5Ob3RGb3VuZEVycm9yIHJhdGhlciB0aGFuIHNpbGVudGx5IHBlcnNpc3RpbmcgYW5cbiAgICAgICAgLy8gZXZlbnQgZm9yIGEgcnVuIHRoYXQgd2FzIG5ldmVyIGNyZWF0ZWQuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmICFjdXJyZW50UnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVuTm90Rm91bmRFcnJvcihlZmZlY3RpdmVSdW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gVkVSU0lPTiBDT01QQVRJQklMSVRZOiBDaGVjayBydW4gc3BlYyB2ZXJzaW9uXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBGb3IgZXZlbnRzIHRoYXQgaGF2ZSBmZXRjaGVkIHRoZSBydW4sIGNoZWNrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbiAgICAgICAgLy8gU2tpcCBmb3IgcnVuX2NyZWF0ZWQgKG5vIGV4aXN0aW5nIHJ1bikgYW5kIHJ1bnRpbWUgZXZlbnRzIChzdGVwX2NvbXBsZXRlZCwgc3RlcF9yZXRyeWluZykuXG4gICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgcnVuIHJlcXVpcmVzIGEgbmV3ZXIgd29ybGQgdmVyc2lvblxuICAgICAgICAgIGlmIChyZXF1aXJlc05ld2VyV29ybGQoY3VycmVudFJ1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW5Ob3RTdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgICAgICAgY3VycmVudFJ1bi5zcGVjVmVyc2lvbiEsXG4gICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9DVVJSRU5UXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJvdXRlIHRvIGxlZ2FjeSBoYW5kbGVyIGZvciBwcmUtZXZlbnQtc291cmNpbmcgcnVuc1xuICAgICAgICAgIGlmIChpc0xlZ2FjeVNwZWNWZXJzaW9uKGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlTGVnYWN5RXZlbnQoXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBjdXJyZW50UnVuLFxuICAgICAgICAgICAgICBwYXJhbXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFZBTElEQVRJT046IFRlcm1pbmFsIHN0YXRlIGFuZCBldmVudCBvcmRlcmluZyBjaGVja3NcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBhIHN0ZXBfc3RhcnRlZCBjYXJyeWluZyBzdGVwLWNyZWF0aW9uIGRhdGFcbiAgICAgICAgLy8gKHN0ZXBOYW1lICsgaW5wdXQpIGlzIGFsbG93ZWQgdG8gYXJyaXZlIHdpdGggbm8gcHJpb3Igc3RlcF9jcmVhdGVkXG4gICAgICAgIC8vIOKAlCBpdCBjcmVhdGVzIHRoZSBzdGVwIG9uIHRoZSBmbHkgKHNlZSB0aGUgbWF0ZXJpYWxpemF0aW9uIGJsb2NrXG4gICAgICAgIC8vIGJlbG93KS4gVGhpcyBtaXJyb3JzIHRoZSByZXNpbGllbnQgcnVuX3N0YXJ0ZWQgcGF0aC4gRGV0ZWN0IGl0IGhlcmVcbiAgICAgICAgLy8gc28gdGhlIGVudGl0eS1jcmVhdGlvbiB0ZXJtaW5hbC1ydW4gZ3VhcmQgdHJlYXRzIGl0IGxpa2UgYSBjcmVhdGlvblxuICAgICAgICAvLyBhbmQgdGhlIFwic3RlcCBtdXN0IGV4aXN0XCIgb3JkZXJpbmcgZ3VhcmQgZG9lc24ndCByZWplY3QgaXQuXG4gICAgICAgIGNvbnN0IGxhenlTdGVwU3RhcnQgPVxuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGEgJiZcbiAgICAgICAgICAhIWRhdGEuZXZlbnREYXRhICYmXG4gICAgICAgICAgdHlwZW9mIChkYXRhLmV2ZW50RGF0YSBhcyB7IHN0ZXBOYW1lPzogdW5rbm93biB9KS5zdGVwTmFtZSA9PT1cbiAgICAgICAgICAgICdzdHJpbmcnICYmXG4gICAgICAgICAgKGRhdGEuZXZlbnREYXRhIGFzIHsgaW5wdXQ/OiB1bmtub3duIH0pLmlucHV0ICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gUnVuIHRlcm1pbmFsIHN0YXRlIHZhbGlkYXRpb25cbiAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNSdW5UZXJtaW5hbChjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICBjb25zdCBydW5UZXJtaW5hbEV2ZW50cyA9IFtcbiAgICAgICAgICAgICdydW5fc3RhcnRlZCcsXG4gICAgICAgICAgICAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgXTtcblxuICAgICAgICAgIC8vIElkZW1wb3RlbnQgb3BlcmF0aW9uOiBydW5fY2FuY2VsbGVkIG9uIGFscmVhZHkgY2FuY2VsbGVkIHJ1biBpcyBhbGxvd2VkXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJyAmJlxuICAgICAgICAgICAgY3VycmVudFJ1bi5zdGF0dXMgPT09ICdjYW5jZWxsZWQnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gZXhpc3Rpbmcgc3RhdGUgKGlkZW1wb3RlbnQpXG4gICAgICAgICAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtldmVudElkfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgZXZlbnRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9XG4gICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXZlbnQ6IHN0cmlwRXZlbnREYXRhUmVmcyhldmVudCwgcmVzb2x2ZURhdGEpLFxuICAgICAgICAgICAgICBydW46IGN1cnJlbnRSdW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZvciBydW5fc3RhcnRlZCBvbiB0ZXJtaW5hbCBydW5zLCB1c2UgUnVuRXhwaXJlZEVycm9yIHNvIHRoZVxuICAgICAgICAgIC8vIHJ1bnRpbWUga25vd3MgdG8gZXhpdCB3aXRob3V0IHJldHJ5aW5nLlxuICAgICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7ZWZmZWN0aXZlUnVuSWR9XCIgaXMgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE90aGVyIHJ1biBzdGF0ZSB0cmFuc2l0aW9ucyBhcmUgbm90IGFsbG93ZWQgb24gdGVybWluYWwgcnVuc1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHJ1blRlcm1pbmFsRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgdHJhbnNpdGlvbiBydW4gZnJvbSB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0aW5nIG5ldyBlbnRpdGllcyBvbiB0ZXJtaW5hbCBydW5zIGlzIG5vdCBhbGxvd2VkLiBBIGxhenlcbiAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgY3JlYXRlcyBhIHN0ZXAsIHNvIGl0IGlzIHJlamVjdGVkIGhlcmUgdG9vIOKAlCBhIGJhcmVcbiAgICAgICAgICAvLyAobm9uLWxhenkpIHN0ZXBfc3RhcnRlZCBmYWxscyB0aHJvdWdoIHRvIHRoZSBzdGVwLXZhbGlkYXRpb25cbiAgICAgICAgICAvLyBibG9jayBiZWxvdywgd2hpY2ggdXNlcyBSdW5FeHBpcmVkRXJyb3IgZm9yIHRlcm1pbmFsIHJ1bnMuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnIHx8XG4gICAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcgfHxcbiAgICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyB8fFxuICAgICAgICAgICAgbGF6eVN0ZXBTdGFydFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBDYW5ub3QgY3JlYXRlIG5ldyBlbnRpdGllcyBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgQ2Fubm90IHNldCBhdHRyaWJ1dGVzIG9uIHJ1biBpbiB0ZXJtaW5hbCBzdGF0ZSBcIiR7Y3VycmVudFJ1bi5zdGF0dXN9XCJgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAtcmVsYXRlZCBldmVudCB2YWxpZGF0aW9uIChvcmRlcmluZyBhbmQgdGVybWluYWwgc3RhdGUpXG4gICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nU3RlcCBzbyB3ZSBjYW4gcmV1c2UgaXQgbGF0ZXIgKGF2b2lkIGRvdWJsZSByZWFkKVxuICAgICAgICBsZXQgdmFsaWRhdGVkU3RlcDogU3RlcCB8IG51bGwgPSBudWxsO1xuICAgICAgICBjb25zdCBzdGVwRXZlbnRzID0gW1xuICAgICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChzdGVwRXZlbnRzLmluY2x1ZGVzKGRhdGEuZXZlbnRUeXBlKSAmJiBkYXRhLmNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgdmFsaWRhdGVkU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgU3RlcFNjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBFdmVudCBvcmRlcmluZzogc3RlcCBtdXN0IGV4aXN0IGJlZm9yZSB0aGVzZSBldmVudHMg4oCUIGV4Y2VwdCBvblxuICAgICAgICAgIC8vIHRoZSBsYXp5LXN0YXJ0IHBhdGgsIHdoZXJlIHN0ZXBfc3RhcnRlZCBjcmVhdGVzIHRoZSBzdGVwIGl0c2VsZi5cbiAgICAgICAgICBpZiAoIXZhbGlkYXRlZFN0ZXAgJiYgIWxhenlTdGVwU3RhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgbm90IGZvdW5kYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBMYXp5IHN0YXJ0IGV4YWN0bHktb25jZSBnYXRlOiBhIGxhenkgc3RlcF9zdGFydGVkIGFsd2F5cyBDUkVBVEVTXG4gICAgICAgICAgLy8gdGhlIHN0ZXAgKHRoZSBvd25lZC1pbmxpbmUgcGF0aCBvbmx5IHNlbmRzIG9uZSBmb3IgYSBzdGVwIHdob3NlXG4gICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGl0IGRlZmVycmVkKS4gSWYgdGhlIHN0ZXAgYWxyZWFkeSBleGlzdHMsIGEgY29uY3VycmVudFxuICAgICAgICAgIC8vIGhhbmRsZXIgd29uIHRoZSBjcmVhdGUg4oCUIHRoaXMgY2FsbGVyIGlzIGEgbG9zZXIgYW5kIG11c3Qgbm90IHN0YXJ0XG4gICAgICAgICAgLy8gb3IgcnVuIHRoZSBzdGVwLiBUaHJvdyBFbnRpdHlDb25mbGljdEVycm9yIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAvLyBleGVjdXRlU3RlcCBtYXBzIGl0IHRvIGBza2lwcGVkYC4gVGhpcyBpcyBjcml0aWNhbDogdGhlIHBsYWluIHN0YXJ0XG4gICAgICAgICAgLy8gdHJhbnNpdGlvbiBiZWxvdyBwZXJtaXRzIHJlLXN0YXJ0aW5nIGEgbm9uLXRlcm1pbmFsIHN0ZXAgKHJldHJpZXNcbiAgICAgICAgICAvLyByZWx5IG9uIHRoYXQpLCBzbyB3aXRob3V0IHRoaXMgZ2F0ZSBhIGxvc2VyIHdvdWxkIHJlLXN0YXJ0IGFcbiAgICAgICAgICAvLyBydW5uaW5nIHN0ZXAgYW5kIHJ1biB0aGUgYm9keSBhIHNlY29uZCB0aW1lLlxuICAgICAgICAgIGlmIChsYXp5U3RlcFN0YXJ0ICYmIHZhbGlkYXRlZFN0ZXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RlcCB0ZXJtaW5hbCBzdGF0ZSB2YWxpZGF0aW9uLiB2YWxpZGF0ZWRTdGVwIGNhbiBiZSBudWxsIG9ubHkgb25cbiAgICAgICAgICAvLyB0aGUgbGF6eS1zdGFydCBwYXRoIChubyBzdGVwIHlldCkg4oCUIHRoZXJlIGlzIG5vdGhpbmcgdGVybWluYWwgdG9cbiAgICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IGluIHRoYXQgY2FzZSwgc28gdGhlc2UgY2hlY2tzIGFyZSBza2lwcGVkLlxuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBpZiAoaXNTdGVwVGVybWluYWwodmFsaWRhdGVkU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke3ZhbGlkYXRlZFN0ZXAuc3RhdHVzfVwiYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBPbiB0ZXJtaW5hbCBydW5zOiBvbmx5IGFsbG93IGNvbXBsZXRpbmcvZmFpbGluZyBpbi1wcm9ncmVzcyBzdGVwc1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRSdW4gJiYgaXNSdW5UZXJtaW5hbChjdXJyZW50UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFN0ZXAuc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVuRXhwaXJlZEVycm9yKFxuICAgICAgICAgICAgICAgICAgYENhbm5vdCBtb2RpZnkgbm9uLXJ1bm5pbmcgc3RlcCBvbiBydW4gaW4gdGVybWluYWwgc3RhdGUgXCIke2N1cnJlbnRSdW4uc3RhdHVzfVwiYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIb29rLXJlbGF0ZWQgZXZlbnQgdmFsaWRhdGlvbiAob3JkZXJpbmcpXG4gICAgICAgIGNvbnN0IGhvb2tFdmVudHNSZXF1aXJpbmdFeGlzdGVuY2UgPSBbJ2hvb2tfZGlzcG9zZWQnLCAnaG9va19yZWNlaXZlZCddO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaG9va0V2ZW50c1JlcXVpcmluZ0V4aXN0ZW5jZS5pbmNsdWRlcyhkYXRhLmV2ZW50VHlwZSkgJiZcbiAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdIb29rID0gYXdhaXQgcmVhZEpTT05XaXRoRmFsbGJhY2soXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIEhvb2tTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFleGlzdGluZ0hvb2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBIb29rTm90Rm91bmRFcnJvcihkYXRhLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBgZXZlbnRgIG1heSBiZSByZWFzc2lnbmVkIGxhdGVyIGluIHRoZSBgaG9va19jcmVhdGVkYFxuICAgICAgICAvLyBkZWR1cC1yZWNvdmVyeSBicmFuY2ggdG8gc3dhcCBpbiBhIGNhbm9uaWNhbCBldmVudElkIC9cbiAgICAgICAgLy8gY3JlYXRlZEF0IHBlcnNpc3RlZCBpbiB0aGUgZHVyYWJsZSB0b2tlbiBjbGFpbSBzb1xuICAgICAgICAvLyBjb25jdXJyZW50IC8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGNvbnZlcmdlIG9uIGEgc2luZ2xlXG4gICAgICAgIC8vIGV2ZW50IGluIHRoZSBsb2cuXG4gICAgICAgIGxldCBldmVudDogRXZlbnQgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFN0cmlwIGV2ZW50RGF0YSBmcm9tIHJ1bl9zdGFydGVkIOKAlCBpdCBiZWxvbmdzIG9uIHJ1bl9jcmVhdGVkIG9ubHkuXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiAnZXZlbnREYXRhJyBpbiBldmVudCkge1xuICAgICAgICAgIGRlbGV0ZSAoZXZlbnQgYXMgYW55KS5ldmVudERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RyaXAgb25seSB0aGUgc3RlcCBgaW5wdXRgIGZyb20gdGhlIGxhenkgc3RlcF9zdGFydGVkIGV2ZW50IHJvdyDigJRcbiAgICAgICAgLy8gaXQgYmVsb25ncyBvbiB0aGUgc3ludGhldGljIHN0ZXBfY3JlYXRlZCB3cml0dGVuIGFib3ZlLiBzdGVwTmFtZSBpc1xuICAgICAgICAvLyBwcmVzZXJ2ZWQgZm9yIHRoZSBjbGllbnQgcmVwbGF5IGNvbnN1bWVyJ3Mgc3RlcC1uYW1lIGRpdmVyZ2VuY2VcbiAgICAgICAgLy8gY2hlY2sgKHBhY2thZ2VzL2NvcmUvc3JjL3N0ZXAudHMpLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgbGF6eVN0ZXBTdGFydCAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmXG4gICAgICAgICAgKGV2ZW50IGFzIHsgZXZlbnREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkuZXZlbnREYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHsgaW5wdXQ6IF9zdHJpcHBlZElucHV0LCAuLi5yZXN0IH0gPSAoXG4gICAgICAgICAgICBldmVudCBhcyB7IGV2ZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfVxuICAgICAgICAgICkuZXZlbnREYXRhO1xuICAgICAgICAgIChldmVudCBhcyB7IGV2ZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkuZXZlbnREYXRhID0gcmVzdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIGVudGl0eSBjcmVhdGVkL3VwZGF0ZWQgZm9yIEV2ZW50UmVzdWx0XG4gICAgICAgIGxldCBydW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgc3RlcDogU3RlcCB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhvb2s6IEhvb2sgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB3YWl0OiBXYWl0IHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBMYXp5IHN0ZXAgc3RhcnQ6IHNldCB0cnVlIHdoZW4gdGhpcyBzdGVwX3N0YXJ0ZWQgYXRvbWljYWxseSBjcmVhdGVkXG4gICAgICAgIC8vIHRoZSBzdGVwICh0aGUgY2FsbGVyIHdvbiB0aGUgY3JlYXRlLWNsYWltKS4gU3VyZmFjZWQgb24gRXZlbnRSZXN1bHRcbiAgICAgICAgLy8gYXMgdGhlIHJ1bnRpbWUncyBleGFjdGx5LW9uY2Ugb3duZXJzaGlwIHNpZ25hbC5cbiAgICAgICAgbGV0IHN0ZXBDcmVhdGVkTGF6aWx5ID0gZmFsc2U7XG4gICAgICAgIC8vIEZvciBgaG9va19jcmVhdGVkYCwgdGhlIGhvb2sgZW50aXR5IHdyaXRlIGlzIGRlZmVycmVkIHVudGlsXG4gICAgICAgIC8vIEFGVEVSIHRoZSBvdXRlciBldmVudCBwdWJsaXNoIHN1Y2NlZWRzLCBzbyBhIHJldHJ5IHRoYXRcbiAgICAgICAgLy8gY29sbGlkZXMgd2l0aCBhbiBhbHJlYWR5LXB1Ymxpc2hlZCBgaG9va19jcmVhdGVkYCBkb2VzIG5vdFxuICAgICAgICAvLyBtdXRhdGUgdGhlIGR1cmFibGUgaG9vayBlbnRpdHkgd2l0aCB0aGUgcmV0cnkncyBwYXlsb2FkLlxuICAgICAgICAvLyBgaG9va0VudGl0eVdyaXRlT3B0aW9uc2AgY2FycmllcyB0aGUgYHsgb3ZlcndyaXRlIH1gIG1vZGVcbiAgICAgICAgLy8gY2hvc2VuIGJ5IHRoZSBkZWR1cC1yZWNvdmVyeSBicmFuY2ggYWJvdmUgKHVuZGVmaW5lZCBmb3JcbiAgICAgICAgLy8gZmlyc3Qgd3JpdGVycywgYHsgb3ZlcndyaXRlOiB0cnVlIH1gIGZvciByZXRyaWVzIHRoYXQgbWF5XG4gICAgICAgIC8vIGJlIHJlcGFpcmluZyBhbiBvcnBoYW5lZCBwYXJ0aWFsIHdyaXRlKS5cbiAgICAgICAgbGV0IGhvb2tFbnRpdHlXcml0ZU9wdGlvbnM6IHsgb3ZlcndyaXRlOiBib29sZWFuIH0gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gQ3JlYXRlL3VwZGF0ZSBlbnRpdHkgYmFzZWQgb24gZXZlbnQgdHlwZSAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAgIC8vIFJ1biBsaWZlY3ljbGUgZXZlbnRzXG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgY29uc3QgcnVuRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZDogc3RyaW5nO1xuICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBpbnB1dDogU2VyaWFsaXplZERhdGE7XG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiB0cnVlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocnVuRGF0YS5hdHRyaWJ1dGVzID8/IHt9KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHJ1bkRhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW4gPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bkRhdGEuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bkRhdGEud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBydW4gZW50aXR5XG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5EYXRhLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICBpbnB1dDogcnVuRGF0YS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHJ1bkRhdGEuYXR0cmlidXRlcyA/PyB7fSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBBdG9taWNhbGx5IHB1Ymxpc2ggdGhlIHJ1biBlbnRpdHkgZmlsZSB3aXRob3V0IG92ZXJ3cml0aW5nIGFuXG4gICAgICAgICAgLy8gZXhpc3Rpbmcgd2lubmVyLiBUaGlzIHByZXZlbnRzIGEgVE9DVE9VIHJhY2Ugd2l0aCB0aGUgcmVzaWxpZW50XG4gICAgICAgICAgLy8gc3RhcnQgcGF0aCAocnVuX3N0YXJ0ZWQgb24gbm9uLWV4aXN0ZW50IHJ1bikgdGhhdCBjb3VsZCByZXN1bHQgaW5cbiAgICAgICAgICAvLyBkdXBsaWNhdGUgcnVuX2NyZWF0ZWQgZXZlbnRzIGluIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgY29uc3QgcnVuUGF0aCA9IHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKTtcbiAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICBydW5QYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocnVuLCBqc29uUmVwbGFjZXIsIDIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWNyZWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgLy8gUmV1c2UgY3VycmVudFJ1biBmcm9tIHZhbGlkYXRpb24gKGFscmVhZHkgcmVhZCBhYm92ZSlcbiAgICAgICAgICBpZiAoY3VycmVudFJ1bikge1xuICAgICAgICAgICAgLy8gSWYgYWxyZWFkeSBydW5uaW5nLCByZXR1cm4gdGhlIHJ1biB3aXRob3V0IGluc2VydGluZyBhXG4gICAgICAgICAgICAvLyBkdXBsaWNhdGUgZXZlbnQuICBUaGlzIG1ha2VzIHJ1bl9zdGFydGVkIGlkZW1wb3RlbnQgZm9yXG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGludm9jYXRpb25zLiAgV2Ugb21pdCBwcmVsb2FkZWQgZXZlbnRzIGhlcmVcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhpcyBpcyBhIHJhcmUgcmFjZS1jb25kaXRpb24gcGF0aCDigJQgdGhlIHJ1bnRpbWVcbiAgICAgICAgICAgIC8vIGZhbGxzIGJhY2sgdG8gbG9hZFdvcmtmbG93UnVuRXZlbnRzKCkuXG4gICAgICAgICAgICBpZiAoY3VycmVudFJ1bi5zdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4geyBydW46IGN1cnJlbnRSdW4gfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcnVuID0gYXdhaXQgd3JpdGVSdW5VbmRlckxpZmVjeWNsZUxvY2soXG4gICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBydW5JZDogY3VycmVudFJ1bi5ydW5JZCxcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGN1cnJlbnRSdW4uZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZTogY3VycmVudFJ1bi53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGN1cnJlbnRSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dDogY3VycmVudFJ1bi5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgIGlucHV0OiBjdXJyZW50UnVuLmlucHV0LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogY3VycmVudFJ1bi5jcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlZEF0OiBjdXJyZW50UnVuLmV4cGlyZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCA/PyBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogY3VycmVudFJ1bi5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMgeyBvdXRwdXQ/OiBhbnkgfTtcbiAgICAgICAgICAvLyBSZXVzZSBjdXJyZW50UnVuIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuICAgICAgICAgIGlmIChjdXJyZW50UnVuKSB7XG4gICAgICAgICAgICBydW4gPSBhd2FpdCB3cml0ZVJ1blVuZGVyTGlmZWN5Y2xlTG9jayhcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJ1bklkOiBjdXJyZW50UnVuLnJ1bklkLFxuICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogY3VycmVudFJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBjdXJyZW50UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogY3VycmVudFJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBjdXJyZW50UnVuLmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGN1cnJlbnRSdW4uaW5wdXQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBjdXJyZW50UnVuLmNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVkQXQ6IGN1cnJlbnRSdW4uZXhwaXJlZEF0LFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogY3VycmVudFJ1bi5zdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICBvdXRwdXQ6IGNvbXBsZXRlZERhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbEhvb2tzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgICAgZGVsZXRlQWxsV2FpdHNGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGZhaWxlZERhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICBlcnJvcjogdW5rbm93bjtcbiAgICAgICAgICAgIGVycm9yQ29kZT86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIC8vIFRoZSBlcnJvciBmaWVsZCBpcyBTZXJpYWxpemVkRGF0YSAoVWludDhBcnJheSkgcHJvZHVjZWQgYnlcbiAgICAgICAgICAgIC8vIGRlaHlkcmF0ZVJ1bkVycm9yLiBXZSBzdG9yZSBpdCB2ZXJiYXRpbSDigJQgY29uc3VtZXJzIGh5ZHJhdGUgaXRcbiAgICAgICAgICAgIC8vIHZpYSBoeWRyYXRlUnVuRXJyb3IgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZS5cbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBmYWlsZWREYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBmYWlsZWREYXRhLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGN1cnJlbnRSdW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgZGVsZXRlQWxsSG9va3NGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgICBkZWxldGVBbGxXYWl0c0ZvclJ1bihiYXNlZGlyLCBlZmZlY3RpdmVSdW5JZCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJykge1xuICAgICAgICAgIC8vIFJldXNlIGN1cnJlbnRSdW4gZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgaWYgKGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJ1biA9IGF3YWl0IHdyaXRlUnVuVW5kZXJMaWZlY3ljbGVMb2NrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGN1cnJlbnRSdW4ucnVuSWQsXG4gICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBjdXJyZW50UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IGN1cnJlbnRSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBjdXJyZW50UnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IGN1cnJlbnRSdW4uZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICBpbnB1dDogY3VycmVudFJ1bi5pbnB1dCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGN1cnJlbnRSdW4uY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGV4cGlyZWRBdDogY3VycmVudFJ1bi5leHBpcmVkQXQsXG4gICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBjdXJyZW50UnVuLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdjYW5jZWxsZWQnLFxuICAgICAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBjdXJyZW50UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIGRlbGV0ZUFsbEhvb2tzRm9yUnVuKGJhc2VkaXIsIGVmZmVjdGl2ZVJ1bklkKSxcbiAgICAgICAgICAgICAgZGVsZXRlQWxsV2FpdHNGb3JSdW4oYmFzZWRpciwgZWZmZWN0aXZlUnVuSWQpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmIGN1cnJlbnRSdW4pIHtcbiAgICAgICAgICBydW4gPSBhd2FpdCB3aXRoUnVuRmlsZUxvY2soZWZmZWN0aXZlUnVuSWQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyZXNoID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3J1bnMnLCBlZmZlY3RpdmVSdW5JZCwgdGFnKSxcbiAgICAgICAgICAgICAgV29ya2Zsb3dSdW5TY2hlbWFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWZyZXNoKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bk5vdEZvdW5kRXJyb3IoZWZmZWN0aXZlUnVuSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVDaGFuZ2VzKGRhdGEuZXZlbnREYXRhLmNoYW5nZXMsIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmdLZXlzOiBPYmplY3Qua2V5cyhmcmVzaC5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6XG4gICAgICAgICAgICAgICAgZGF0YS5ldmVudERhdGEuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPT09IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENsYWltIHRoZSBjb3JyZWxhdGlvbiBkZWR1cCBsb2NrIG9ubHkgYWZ0ZXIgdmFsaWRhdGlvbjogYVxuICAgICAgICAgICAgLy8gdmFsaWRhdGlvbiBmYWlsdXJlIG11c3QgbGVhdmUgdGhlIGNvcnJlbGF0aW9uSWQgdW5jbGFpbWVkIHNvXG4gICAgICAgICAgICAvLyB0aGUgcnVudGltZSdzIHJldHJ5IG9mIHRoZSBzYW1lIGV2ZW50IGlzIG5vdCBtaXNyZXBvcnRlZCBhc1xuICAgICAgICAgICAgLy8gXCJhbHJlYWR5IGV4aXN0c1wiIHdoaWxlIHRoZSBldmVudCB3YXMgbmV2ZXIgd3JpdHRlbiAodGhlXG4gICAgICAgICAgICAvLyBkaXNwYXRjaGVyIHdvdWxkIHRoZW4gd2FpdCBmb3JldmVyIGZvciBhbiBldmVudCB0aGF0IGlzIG5vdFxuICAgICAgICAgICAgLy8gaW4gdGhlIGxvZykuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCAmJlxuICAgICAgICAgICAgICBkYXRhLmV2ZW50RGF0YS53cml0ZXIudHlwZSA9PT0gJ3dvcmtmbG93J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgICAgICA6IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH0uY3JlYXRlZGA7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dHJMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMnLFxuICAgICAgICAgICAgICAgIGF0dHJMb2NrTmFtZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBhdHRyQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGF0dHJMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgICBpZiAoIWF0dHJDbGFpbWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQXR0cmlidXRlIGV2ZW50IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBleGlzdHNgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHtcbiAgICAgICAgICAgICAgLi4uZnJlc2gsXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGFwcGx5QXR0cmlidXRlQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICBmcmVzaC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGRhdGEuZXZlbnREYXRhLmNoYW5nZXNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9IGFzIFdvcmtmbG93UnVuO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdydW5zJywgZWZmZWN0aXZlUnVuSWQsIHRhZyksXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAvLyBTdGVwIGxpZmVjeWNsZSBldmVudHNcbiAgICAgICAgICBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcgJiZcbiAgICAgICAgICAnZXZlbnREYXRhJyBpbiBkYXRhXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHN0ZXBfY3JlYXRlZDogQ3JlYXRlcyBzdGVwIGVudGl0eSB3aXRoIHN0YXR1cyAncGVuZGluZycsIGF0dGVtcHQ9MCwgY3JlYXRlZEF0IHNldC5cbiAgICAgICAgICAvLyBUd28gY29uY3VycmVudCBpbnZvY2F0aW9ucyB3aXRoIGlkZW50aWNhbCBjb3JyZWxhdGlvbklkcyAoZS5nLiB0aGVcbiAgICAgICAgICAvLyBzbmFwc2hvdCBydW50aW1lJ3MgZGV0ZXJtaW5pc3RpYyBjb3JyZWxhdGlvbklkcyBhY3Jvc3MgcmVwbGF5cylcbiAgICAgICAgICAvLyBtdXN0IGJlIGRlZHVwZWQg4oCUIG90aGVyd2lzZSBib3RoIHdyaXRlcyBzdWNjZWVkIGFuZCB0aGUgZXZlbnQgbG9nXG4gICAgICAgICAgLy8gZW5kcyB1cCB3aXRoIGR1cGxpY2F0ZSBzdGVwX2NyZWF0ZWQgZW50cmllcy4gVGhlIG91dGVyXG4gICAgICAgICAgLy8gd2l0aFN0ZXBMb2NrIG11dGV4IHNlcmlhbGl6ZXMgd2l0aGluIGEgc2luZ2xlIHByb2Nlc3M7IHRoaXNcbiAgICAgICAgICAvLyBUaGUgZXhjbHVzaXZlIGNvbnN0cmFpbnQgZmlsZSBhZGRpdGlvbmFsbHkgcHJvdGVjdHMgYWdhaW5zdFxuICAgICAgICAgIC8vIGNyb3NzLXByb2Nlc3MgcmFjZXMgKHR3byBwbnBtIHdvcmtlcnMsIHJlZGVsaXZlcmVkIHF1ZXVlIG1lc3NhZ2VzLFxuICAgICAgICAgIC8vIGV0Yy4pLiBUaGUgbG9zZXIgdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3Igc28gdGhlIHJ1bnRpbWUnc1xuICAgICAgICAgIC8vIGV4aXN0aW5nIGNhdGNoIHBhdGggY2FuIHN3YWxsb3cgaXQgYW5kIGF2b2lkIGRvdWJsZS1xdWV1aW5nIHRoZVxuICAgICAgICAgIC8vIHN0ZXAuXG4gICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrTmFtZSA9IHRhZ1xuICAgICAgICAgICAgPyBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWRgO1xuICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkTG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZENsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIHN0ZXBDcmVhdGVkTG9ja1BhdGgsXG4gICAgICAgICAgICAnJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFzdGVwQ3JlYXRlZENsYWltZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICBgU3RlcCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHN0ZXBEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlucHV0OiBhbnk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgc3RlcElkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBzdGVwTmFtZTogc3RlcERhdGEuc3RlcE5hbWUsXG4gICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgIGlucHV0OiBzdGVwRGF0YS5pbnB1dCxcbiAgICAgICAgICAgIG91dHB1dDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGF0dGVtcHQ6IDAsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHNwZWNWZXJzaW9uIGZyb20gdGhlIGV2ZW50IHRvIHRoZSBzdGVwIGVudGl0eVxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgIHN0ZXBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZDogSW5jcmVtZW50cyBhdHRlbXB0LCBzZXRzIHN0YXR1cyB0byAncnVubmluZydcbiAgICAgICAgICAvLyBTZXRzIHN0YXJ0ZWRBdCBvbmx5IG9uIHRoZSBmaXJzdCBzdGFydCAobm90IHVwZGF0ZWQgb24gcmV0cmllcylcbiAgICAgICAgICAvLyBSZXVzZSB2YWxpZGF0ZWRTdGVwIGZyb20gdmFsaWRhdGlvbiAoYWxyZWFkeSByZWFkIGFib3ZlKVxuXG4gICAgICAgICAgLy8gTGF6eSBzdGVwIHN0YXJ0OiBubyBwcmlvciBzdGVwX2NyZWF0ZWQg4oCUIGNyZWF0ZSB0aGUgc3RlcCBlbnRpdHlcbiAgICAgICAgICAvLyBhbmQgYSBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIGV2ZW50IG5vdywgdGhlbiBmYWxsIHRocm91Z2ggdG8gdGhlXG4gICAgICAgICAgLy8gc3RhcnQgdHJhbnNpdGlvbiBiZWxvdy4gTWlycm9ycyB0aGUgcmVzaWxpZW50IHJ1bl9zdGFydGVkIHBhdGg6XG4gICAgICAgICAgLy8gdGhlIHN0ZXAgZW50aXR5IGlzIGNsYWltZWQgYXRvbWljYWxseSAoZmlyc3Qgd3JpdGVyIHdpbnMpIGFuZCB0aGVcbiAgICAgICAgICAvLyBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIGV2ZW50IGtlZXBzIHJlcGxheSBjb3JyZWN0ICh0aGUgY2xpZW50IHN0ZXBcbiAgICAgICAgICAvLyBjb25zdW1lciBtYXJrcyBoYXNDcmVhdGVkRXZlbnQgb25seSB3aGVuIGl0IG9ic2VydmVzIHRoYXQgZXZlbnQpLlxuICAgICAgICAgIGlmICghdmFsaWRhdGVkU3RlcCAmJiBsYXp5U3RlcFN0YXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBsYXp5RGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHtcbiAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgaW5wdXQ6IGFueTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICAgID8gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfS5jcmVhdGVkLiR7dGFnfWBcbiAgICAgICAgICAgICAgOiBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmNyZWF0ZWRgO1xuICAgICAgICAgICAgY29uc3Qgc3RlcENyZWF0ZWRMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDcmVhdGVkQ2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgICAgICBzdGVwQ3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghc3RlcENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIGFscmVhZHkgY2xhaW1lZCB0aGUgY3JlYXRlIGZvciB0aGlzXG4gICAgICAgICAgICAgIC8vIHN0ZXAuIFRoZSBhdG9taWMgY2xhaW0gaXMgdGhlIGV4YWN0bHktb25jZSBvd25lcnNoaXAgZ2F0ZTpcbiAgICAgICAgICAgICAgLy8gb25seSB0aGUgd2lubmVyIHJ1bnMgdGhlIHN0ZXAgYm9keSBpbmxpbmUuIFRocm93XG4gICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oCUIHRoZSBydW50aW1lJ3MgZXhlY3V0ZVN0ZXAgbWFwcyB0aGlzIHRvXG4gICAgICAgICAgICAgIC8vIGBza2lwcGVkYCwgc28gdGhlIGxvc2VyIGRvZXMgbm90IHN0YXJ0IG9yIHJ1biB0aGUgc3RlcC4gVGhpc1xuICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZXMgdGhlIHNhbWUgXCJleGFjdGx5IG9uZSBoYW5kbGVyIG93bnMgZWFjaCBzdGVwXCJcbiAgICAgICAgICAgICAgLy8gZ3VhcmFudGVlIHRoZSBzZXBhcmF0ZSBzdGVwX2NyZWF0ZWQgY2xhaW0gcHJvdmlkZXMgdG9kYXkuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBTdGVwIFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjcmVhdGVkYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFN0ZXA6IFN0ZXAgPSB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIHN0ZXBJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBsYXp5RGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgICBpbnB1dDogbGF6eURhdGEuaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBhdHRlbXB0OiAwLFxuICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICAgICAgYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWAsXG4gICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRTdGVwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBzeW50aGV0aWMgc3RlcF9jcmVhdGVkIGV2ZW50IHNvIHJlcGxheSBvYnNlcnZlcyBpdFxuICAgICAgICAgICAgICAvLyAodGhlIGNsaWVudCBzdGVwIGNvbnN1bWVyIHNldHMgaGFzQ3JlYXRlZEV2ZW50IG9ubHkgb24gYVxuICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgZXZlbnQpLiBJdHMgZXZlbnRJZCBpcyBhIGZyZXNoIG1vbm90b25pYyBVTElELlxuICAgICAgICAgICAgICAvLyBPcmRlcmluZyB2cy4gdGhlIHN0ZXBfc3RhcnRlZCBldmVudCByb3cgZG9lcyBub3QgYWZmZWN0XG4gICAgICAgICAgICAgIC8vIGNvcnJlY3RuZXNzOiB0aGUgc3RlcF9zdGFydGVkIGNvbnN1bWVyIGlzIGEgbm8tb3AgYW5kIG9ubHlcbiAgICAgICAgICAgICAgLy8gc3RlcF9jcmVhdGVkIGZsaXBzIGhhc0NyZWF0ZWRFdmVudCwgc28gdGhlIGVuZCBzdGF0ZSBpcyB0aGVcbiAgICAgICAgICAgICAgLy8gc2FtZSB3aGljaGV2ZXIgc29ydHMgZmlyc3Qg4oCUIHRoaXMgbWF0Y2hlcyB0aGUgcmVzaWxpZW50XG4gICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIOKGkiBydW5fY3JlYXRlZCBwcmVjZWRlbnQgaW4gdGhpcyBmaWxlLlxuICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZEV2ZW50SWQgPSBgZXZudF8ke21vbm90b25pY1VsaWQoKX1gO1xuICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICBldmVudElkOiBzdGVwQ3JlYXRlZEV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBsYXp5RGF0YS5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0OiBsYXp5RGF0YS5pbnB1dCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgICAgdGFnZ2VkUGF0aChcbiAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgICAgICAgICAgIGAke2VmZmVjdGl2ZVJ1bklkfS0ke3N0ZXBDcmVhdGVkRXZlbnRJZH1gLFxuICAgICAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBzdGVwQ3JlYXRlZEV2ZW50XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHZhbGlkYXRlZFN0ZXAgPSBjcmVhdGVkU3RlcDtcbiAgICAgICAgICAgICAgc3RlcENyZWF0ZWRMYXppbHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiByZXRyeUFmdGVyIHRpbWVzdGFtcCBoYXNuJ3QgYmVlbiByZWFjaGVkIHlldFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIgJiZcbiAgICAgICAgICAgICAgdmFsaWRhdGVkU3RlcC5yZXRyeUFmdGVyLmdldFRpbWUoKSA+IERhdGUubm93KClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVG9vRWFybHlFcnJvcihcbiAgICAgICAgICAgICAgICBgQ2Fubm90IHN0YXJ0IHN0ZXAgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIjogcmV0cnlBZnRlciB0aW1lc3RhbXAgaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0YCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXRyeUFmdGVyOiBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZWRTdGVwLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgZ3VhcmQ6IHJlLXJlYWQgdGhlIHN0ZXAgZW50aXR5IHRvIGNoZWNrIGlmIGl0XG4gICAgICAgICAgICAvLyByZWFjaGVkIHRlcm1pbmFsIHN0YXRlIGJldHdlZW4gdGhlIHZhbGlkYXRpb24gcmVhZCBhbmQgbm93LlxuICAgICAgICAgICAgLy8gVGhpcyBuYXJyb3dzIHRoZSBUT0NUT1Ugd2luZG93IGJ1dCBkb2VzIG5vdCBmdWxseSBlbGltaW5hdGUgaXRcbiAgICAgICAgICAgIC8vICh0aGUgbG9jYWwgd29ybGQgaXMgc2luZ2xlLXByb2Nlc3MgLyBkZXYtb25seTsgdGhlIHBvc3RncmVzXG4gICAgICAgICAgICAvLyB3b3JsZCB1c2VzIFNRTC1sZXZlbCBhdG9taWMgZ3VhcmRzIGZvciBwcm9kdWN0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IHN0ZXBDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGZyZXNoU3RlcCA9IGF3YWl0IHJlYWRKU09OV2l0aEZhbGxiYWNrKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnc3RlcHMnLFxuICAgICAgICAgICAgICBzdGVwQ29tcG9zaXRlS2V5LFxuICAgICAgICAgICAgICBTdGVwU2NoZW1hLFxuICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZnJlc2hTdGVwICYmIGlzU3RlcFRlcm1pbmFsKGZyZXNoU3RlcC5zdGF0dXMpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgIGBDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUgXCIke2ZyZXNoU3RlcC5zdGF0dXN9XCJgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAvLyBPbmx5IHNldCBzdGFydGVkQXQgb24gdGhlIGZpcnN0IHN0YXJ0XG4gICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdmFsaWRhdGVkU3RlcC5zdGFydGVkQXQgPz8gbm93LFxuICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgYXR0ZW1wdCBjb3VudGVyIG9uIGV2ZXJ5IHN0YXJ0XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IHZhbGlkYXRlZFN0ZXAuYXR0ZW1wdCArIDEsXG4gICAgICAgICAgICAgIC8vIENsZWFyIHJldHJ5QWZ0ZXIgbm93IHRoYXQgdGhlIHN0ZXAgaGFzIHN0YXJ0ZWRcbiAgICAgICAgICAgICAgcmV0cnlBZnRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfY29tcGxldGVkOiBUZXJtaW5hbCBzdGF0ZSB3aXRoIG91dHB1dFxuICAgICAgICAgIC8vIFVzZXMgd3JpdGVFeGNsdXNpdmUgb24gYSBsb2NrIGZpbGUgdG8gYXRvbWljYWxseSBwcmV2ZW50IGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBmcm9tIGJvdGggY29tcGxldGluZyB0aGUgc2FtZSBzdGVwIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgY29tcGxldGVkRGF0YSA9IGRhdGEuZXZlbnREYXRhIGFzIHsgcmVzdWx0OiBhbnkgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgbG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgPyBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWxgO1xuICAgICAgICAgICAgY29uc3QgdGVybWluYWxMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgbG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUodGVybWluYWxMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgICBvdXRwdXQ6IGNvbXBsZXRlZERhdGEucmVzdWx0LFxuICAgICAgICAgICAgICBjb21wbGV0ZWRBdDogbm93LFxuICAgICAgICAgICAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ3N0ZXBzJywgc3RlcENvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcgJiYgJ2V2ZW50RGF0YScgaW4gZGF0YSkge1xuICAgICAgICAgIC8vIHN0ZXBfZmFpbGVkOiBUZXJtaW5hbCBzdGF0ZSB3aXRoIGVycm9yXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBmYWlsaW5nIHRoZSBzYW1lIHN0ZXAgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCBmYWlsZWREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodmFsaWRhdGVkU3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RlcENvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2RhdGEuY29ycmVsYXRpb25JZH1gO1xuICAgICAgICAgICAgY29uc3QgbG9ja05hbWUgPSB0YWdcbiAgICAgICAgICAgICAgPyBgJHtzdGVwQ29tcG9zaXRlS2V5fS50ZXJtaW5hbC4ke3RhZ31gXG4gICAgICAgICAgICAgIDogYCR7c3RlcENvbXBvc2l0ZUtleX0udGVybWluYWxgO1xuICAgICAgICAgICAgY29uc3QgdGVybWluYWxMb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAgICAgbG9ja05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUodGVybWluYWxMb2NrUGF0aCwgJycpO1xuICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgbW9kaWZ5IHN0ZXAgaW4gdGVybWluYWwgc3RhdGUnXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgZXJyb3IgZmllbGQgaXMgU2VyaWFsaXplZERhdGEgKFVpbnQ4QXJyYXkpIHByb2R1Y2VkIGJ5XG4gICAgICAgICAgICAvLyBkZWh5ZHJhdGVTdGVwRXJyb3IuIFdlIHN0b3JlIGl0IHZlcmJhdGltIOKAlCBjb25zdW1lcnMgaHlkcmF0ZSBpdFxuICAgICAgICAgICAgLy8gdmlhIGh5ZHJhdGVTdGVwRXJyb3IgdG8gcmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZS5cbiAgICAgICAgICAgIHN0ZXAgPSB7XG4gICAgICAgICAgICAgIC4uLnZhbGlkYXRlZFN0ZXAsXG4gICAgICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgIGVycm9yOiBmYWlsZWREYXRhLmVycm9yIGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnc3RlcHMnLCBzdGVwQ29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfcmV0cnlpbmcnICYmICdldmVudERhdGEnIGluIGRhdGEpIHtcbiAgICAgICAgICAvLyBzdGVwX3JldHJ5aW5nOiBTZXRzIHN0YXR1cyBiYWNrIHRvICdwZW5kaW5nJywgcmVjb3JkcyBlcnJvclxuICAgICAgICAgIC8vIFJldXNlIHZhbGlkYXRlZFN0ZXAgZnJvbSB2YWxpZGF0aW9uIChhbHJlYWR5IHJlYWQgYWJvdmUpXG4gICAgICAgICAgY29uc3QgcmV0cnlEYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgZXJyb3I6IHVua25vd247XG4gICAgICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh2YWxpZGF0ZWRTdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVwQ29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgICBzdGVwID0ge1xuICAgICAgICAgICAgICAuLi52YWxpZGF0ZWRTdGVwLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgZXJyb3I6IHJldHJ5RGF0YS5lcnJvciBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICByZXRyeUFmdGVyOiByZXRyeURhdGEucmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICdzdGVwcycsIHN0ZXBDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICAgIHN0ZXAsXG4gICAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIEhvb2sgbGlmZWN5Y2xlIGV2ZW50c1xuICAgICAgICAgIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyAmJlxuICAgICAgICAgICdldmVudERhdGEnIGluIGRhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgaG9va0RhdGEgPSBkYXRhLmV2ZW50RGF0YSBhcyB7XG4gICAgICAgICAgICB0b2tlbjogc3RyaW5nO1xuICAgICAgICAgICAgbWV0YWRhdGE/OiBhbnk7XG4gICAgICAgICAgICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICAgICAgICAgICAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBBdG9taWNhbGx5IGNsYWltIHRoZSB0b2tlbiB1c2luZyBhbiBleGNsdXNpdmUtY3JlYXRlIGNvbnN0cmFpbnQgZmlsZS5cbiAgICAgICAgICAvLyBUaGlzIGF2b2lkcyB0aGUgVE9DVE9VIHJhY2Ugb2YgdGhlIHByZXZpb3VzIHJlYWQtYWxsLXRoZW4tY2hlY2sgYXBwcm9hY2guXG4gICAgICAgICAgY29uc3QgY29uc3RyYWludFBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICd0b2tlbnMnLFxuICAgICAgICAgICAgYCR7aGFzaFRva2VuKGhvb2tEYXRhLnRva2VuKX0uanNvbmBcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIFBlcnNpc3QgYGV2ZW50SWRgIGluIHRoZSBjbGFpbSBzbyBjb25jdXJyZW50IC8gY3Jvc3MtXG4gICAgICAgICAgLy8gcHJvY2VzcyByZXRyaWVzIGNhbiBjb252ZXJnZSBvbiBhIHNpbmdsZSBjYW5vbmljYWxcbiAgICAgICAgICAvLyBgaG9va19jcmVhdGVkYCBldmVudCBwYXRoLiBTZWUgdGhlIHJlY292ZXJ5IGNvbW1lbnRcbiAgICAgICAgICAvLyBiZWxvdy5cbiAgICAgICAgICBjb25zdCB0b2tlbkNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShcbiAgICAgICAgICAgIGNvbnN0cmFpbnRQYXRoLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgIGhvb2tJZDogZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBSZWNvdmVyeSBzaGFwZTogdGhlIGR1cmFibGUgcmVjb3JkIG9mIGEgc3VjY2Vzc2Z1bCBob29rXG4gICAgICAgICAgLy8gY3JlYXRpb24gaXMgdGhlIGBob29rX2NyZWF0ZWRgIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgICAgICAgIC8vIGNsYWltIGZpbGUgYW5kIGhvb2sgZW50aXR5IGFyZSB3cml0dGVuIGJlZm9yZSB0aGUgZXZlbnQsXG4gICAgICAgICAgLy8gYW5kIHRoZSB0aHJlZSB3cml0ZXMgYXJlIE5PVCBhdG9taWMsIHNvIGEgY3Jhc2ggYXQgYW55XG4gICAgICAgICAgLy8gcG9pbnQgY2FuIGxlYXZlIG9uZSBvciB0d28gb2YgdGhlbSBvbiBkaXNrIHdpdGhvdXQgdGhlXG4gICAgICAgICAgLy8gZXZlbnQuIFRyZWF0aW5nIHRob3NlIGFzIFwiY29tcGxldGVkXCIgd291bGQgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIgc3dhbGxvdyB0aGUgcmV0cnkgYW5kIHBlcm1hbmVudGx5IGxvc2VcbiAgICAgICAgICAvLyB0aGUgYGhvb2tfY3JlYXRlZGAgZXZlbnQgZnJvbSB0aGUgbG9nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2hlbiB0aGUgZGVkdXAgYnJhbmNoIGZpcmVzIGZvciB0aGUgc2FtZSBgKHJ1bklkLCBob29rSWQpYCxcbiAgICAgICAgICAvLyB3ZSBjb252ZXJnZSBvbiB0aGUgY2Fub25pY2FsIGBldmVudElkYCBwZXJzaXN0ZWQgaW4gdGhlXG4gICAgICAgICAgLy8gY2xhaW0gZmlsZSBieSB0aGUgb3JpZ2luYWwgKHdpbm5pbmcpIGB3cml0ZUV4Y2x1c2l2ZWAuIEJ5XG4gICAgICAgICAgLy8gYWRvcHRpbmcgdGhhdCBldmVudElkIGZvciB0aGlzIHJldHJ5J3MgZXZlbnQgd3JpdGUg4oCUIGFuZFxuICAgICAgICAgIC8vIGxldHRpbmcgdGhlIG91dGVyIG5vLW92ZXJ3cml0ZSBgd3JpdGVKU09OYCBmb3IgdGhlIGV2ZW50XG4gICAgICAgICAgLy8gdGhyb3cgYEVudGl0eUNvbmZsaWN0RXJyb3JgIG9uIGNvbGxpc2lvbiDigJQgY29uY3VycmVudCAvXG4gICAgICAgICAgLy8gY3Jvc3MtcHJvY2VzcyB3b3JrZXJzIGVpdGhlcjpcbiAgICAgICAgICAvLyAgIC0gcHVibGlzaCB0aGUgc2FtZSBldmVudCBhdCB0aGUgc2FtZSBwYXRoIGV4YWN0bHkgb25jZVxuICAgICAgICAgIC8vICAgICAodGhlIGxvc2VyJ3MgYHdyaXRlSlNPTmAgdGhyb3dzIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gICAgICAgICAgLy8gICAgIHdoaWNoIHRoZSBydW50aW1lJ3MgZXhpc3RpbmcgY29uY3VycmVudC1yZXBsYXkgY2F0Y2hcbiAgICAgICAgICAvLyAgICAgcGF0aCBhdCBzdXNwZW5zaW9uLWhhbmRsZXIudHM6MTQyIHN3YWxsb3dzKSwgb3JcbiAgICAgICAgICAvLyAgIC0gY29udmVyZ2Ugb24gYSBzaW5nbGUgcmVjb3Zlcnkgd3JpdGUgd2hlbiB0aGUgcHJpb3JcbiAgICAgICAgICAvLyAgICAgY2xhaW0gd2FzIG9ycGhhbmVkIGJ5IGEgY3Jhc2ggYmVmb3JlIHRoZSBldmVudCBsYW5kZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgbGVnYWN5IGZhbGxiYWNrIChgZXhpc3RpbmdDbGFpbS5ldmVudElkYCB1bmRlZmluZWQpXG4gICAgICAgICAgLy8gaXMgZm9yIGNsYWltIGZpbGVzIHdyaXR0ZW4gYmVmb3JlIHRoaXMgZmllbGQgd2FzIGFkZGVkIOKAlFxuICAgICAgICAgIC8vIHRob3NlIHByb2JlIHRoZSBldmVudCBsb2cgZGlyZWN0bHkgYW5kIGZhbGwgdGhyb3VnaCB0byBhXG4gICAgICAgICAgLy8gZnJlc2gtZXZlbnRJZCByZWNvdmVyeSB3cml0ZS4gVGhlIGxlZ2FjeSBwYXRoIGRvZXMgbm90XG4gICAgICAgICAgLy8gY29udmVyZ2UgYWNyb3NzIHdvcmtlcnMgYnV0IGNhbm5vdCByZWdyZXNzIGJlaGF2aW9yIGZvclxuICAgICAgICAgIC8vIGZyZXNobHktd3JpdHRlbiBjbGFpbXMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgYHdpdGhIb29rTG9ja2AgaW4tcHJvY2VzcyBtdXRleCBhYm92ZSBrZWVwcyB0d28gc2FtZS1cbiAgICAgICAgICAvLyB0aWNrIGluLXByb2Nlc3MgY2FsbGVycyBmcm9tIHJhY2luZyBpbnRvIHRoaXMgYnJhbmNoIHdpdGhcbiAgICAgICAgICAvLyB0aGUgd2lubmVyIG1pZC13cml0ZSwgYnV0IGlzIG5vdCBzdWZmaWNpZW50IGFjcm9zc1xuICAgICAgICAgIC8vIHByb2Nlc3NlcyDigJQgdGhlIGR1cmFibGUgY29udmVyZ2VuY2Uga2V5IChgY2xhaW0uZXZlbnRJZGApXG4gICAgICAgICAgLy8gaXMgd2hhdCBjbG9zZXMgdGhlIGNyb3NzLXByb2Nlc3MgcmFjZS5cbiAgICAgICAgICBsZXQgd3JpdGVIb29rRW50aXR5V2l0aE92ZXJ3cml0ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCF0b2tlbkNsYWltZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2xhaW0gPSBhd2FpdCByZWFkSG9va1Rva2VuQ2xhaW0oY29uc3RyYWludFBhdGgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV4aXN0aW5nQ2xhaW0/LnJ1bklkID09PSBlZmZlY3RpdmVSdW5JZCAmJlxuICAgICAgICAgICAgICBleGlzdGluZ0NsYWltLmhvb2tJZCA9PT0gZGF0YS5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRvcHQgYSBjYW5vbmljYWwgZXZlbnRJZCBmb3IgdGhlIHJlY292ZXJ5IHdyaXRlLiBUaGVcbiAgICAgICAgICAgICAgLy8gb3V0ZXIgZXZlbnQgcHVibGlzaCAoYHdyaXRlRXhjbHVzaXZlKGV2ZW50UGF0aClgKVxuICAgICAgICAgICAgICAvLyBlaXRoZXIgc3VjY2VlZHMgKHdlIHB1Ymxpc2ggdGhlIGNhbm9uaWNhbCBldmVudCxcbiAgICAgICAgICAgICAgLy8gcmVwYWlyaW5nIGEgcGFydGlhbCB3cml0ZSBsZWZ0IGJ5IHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAvLyBjbGFpbWFudCkgb3IgcmV0dXJucyBgZmFsc2VgIGFuZCB3ZSB0aHJvd1xuICAgICAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAgKHRoZSBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgICAgICAvLyBwdWJsaXNoZWQg4oCUIGEgcmVhbCBkdXBsaWNhdGUpLiBFaXRoZXIgd2F5IHRoZSBsb2dcbiAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoIGV4YWN0bHkgb25lIGBob29rX2NyZWF0ZWRgIGV2ZW50IGZvciB0aGlzXG4gICAgICAgICAgICAgIC8vIGAocnVuSWQsIGhvb2tJZClgLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgY2Fub25pY2FsIGV2ZW50SWQgY29tZXMgZnJvbSBvbmUgb2YgdHdvIHBsYWNlczpcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIGBleGlzdGluZ0NsYWltLmV2ZW50SWRgIGZvciBjbGFpbXMgd3JpdHRlbiBieVxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyB2ZXJzaW9uICh0aGUgd3JpdGVyIGFib3ZlIHBlcnNpc3RzIHRoZVxuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXRvbWljYWxseSB3aXRoIHRoZSBjbGFpbSkuXG4gICAgICAgICAgICAgIC8vICAgICBUaGUgZXZlbnRJZCBpcyBkdXJhYmxlLCBzbyB0aGUgb3V0ZXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBhbG9uZSBpcyBlbm91Z2ggdG9cbiAgICAgICAgICAgICAgLy8gICAgIGFyYml0cmF0ZSBwdWJsaWNhdGlvbjogaXQgZmFpbHMgaWZmIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyAgICAgd2FzIGFscmVhZHkgcHVibGlzaGVkIGF0IHRoYXQgZXhhY3QgcGF0aC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gICAtIFRoZSByZWNvdmVyeS1tYXJrZXIgc2lkZWNhciBmb3IgbGVnYWN5IGNsYWltc1xuICAgICAgICAgICAgICAvLyAgICAgd3JpdHRlbiBiZWZvcmUgYGV2ZW50SWRgIHdhcyBwZXJzaXN0ZWQgaW5saW5lXG4gICAgICAgICAgICAgIC8vICAgICBpbiB0aGUgY2xhaW0uIFRoZSBtYXJrZXIgaXMgaXRzZWxmIGFcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZWAsIHNvIHRoZSBmaXJzdCByZXRyeSBwaW5zIGl0c1xuICAgICAgICAgICAgICAvLyAgICAgY2FuZGlkYXRlIGV2ZW50SWQgYXMgY2Fub25pY2FsIGFuZCBzdWJzZXF1ZW50XG4gICAgICAgICAgICAgIC8vICAgICByZXRyaWVzIGFkb3B0IGl0LiBXaXRob3V0IHRoaXMsIHR3byBwcm9jZXNzZXNcbiAgICAgICAgICAgICAgLy8gICAgIGJvdGggcmVhZGluZyB0aGUgc2FtZSBsZWdhY3kgY2xhaW0gd291bGQgZWFjaFxuICAgICAgICAgICAgICAvLyAgICAgZ2VuZXJhdGUgdGhlaXIgb3duIGV2ZW50SWQsIGxhbmQgdGhlaXJcbiAgICAgICAgICAgICAgLy8gICAgIGB3cml0ZUV4Y2x1c2l2ZShldmVudFBhdGgpYCBjYWxscyBhdCBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHBhdGhzLCBhbmQgYXBwZW5kIHR3byBldmVudHMuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vICAgICBGb3IgbGVnYWN5IGNsYWltcyB3ZSBhbHNvIG11c3QgcHJvYmUgdGhlIGV2ZW50XG4gICAgICAgICAgICAgIC8vICAgICBsb2cgZm9yIGFuIGV4aXN0aW5nIGBob29rX2NyZWF0ZWRgIGV2ZW50IEJFRk9SRVxuICAgICAgICAgICAgICAvLyAgICAgcGlubmluZyBhIGNhbm9uaWNhbCBldmVudElkOiB0aGUgcHJlLXVwZ3JhZGVcbiAgICAgICAgICAgICAgLy8gICAgIHdyaXRlciBtYXkgaGF2ZSBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgLy8gICAgIHdpdGggaXRzIG93biBldmVudElkLCBhbmQgdGhlIG1hcmtlciBoYXMgbm8gd2F5XG4gICAgICAgICAgICAgIC8vICAgICBvZiBrbm93aW5nIHRoYXQgZXZlbnRJZCBhZnRlciB0aGUgZmFjdC4gV2l0aG91dFxuICAgICAgICAgICAgICAvLyAgICAgdGhpcyBwcm9iZSwgYSBwb3N0LXVwZ3JhZGUgcmV0cnkgd291bGQgcGluIGFcbiAgICAgICAgICAgICAgLy8gICAgIGRpZmZlcmVudCBldmVudElkLCB3cml0ZSBhIGhvb2sgZW50aXR5LCBhbmRcbiAgICAgICAgICAgICAgLy8gICAgIHB1Ymxpc2ggYSBkdXBsaWNhdGUgZXZlbnQgYXQgdGhlIG1hcmtlcidzIHBhdGguXG4gICAgICAgICAgICAgIGxldCBjYW5vbmljYWxFdmVudElkOiBzdHJpbmc7XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZ0NsYWltLmV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWxFdmVudElkID0gZXhpc3RpbmdDbGFpbS5ldmVudElkO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFscmVhZHlQdWJsaXNoZWRFdmVudElkID1cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGZpbmRFeGlzdGluZ0hvb2tDcmVhdGVkRXZlbnRJZChcbiAgICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeVB1Ymxpc2hlZEV2ZW50SWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmUtdXBncmFkZSB3cml0ZXIgbWF5IGhhdmUgY3Jhc2hlZCBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAvLyBpdHMgZXZlbnQgcHVibGlzaCBhbmQgaXRzIGhvb2sgZW50aXR5IHdyaXRlIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gcmVwYWlyIHRoZSBlbnRpdHkgZnJvbSB0aGUgcGVyc2lzdGVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgIC8vIHBheWxvYWQgYmVmb3JlIHN1cmZhY2luZyB0aGUgYmVuaWduIGR1cGxpY2F0ZS5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcGFpckhvb2tFbnRpdHlGcm9tUGVyc2lzdGVkRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGFscmVhZHlQdWJsaXNoZWRFdmVudElkLFxuICAgICAgICAgICAgICAgICAgICB0YWdcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGNyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWQgPSBhd2FpdCBwaW5DYW5vbmljYWxFdmVudElkRm9yTGVnYWN5Q2xhaW0oXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50SWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChwaW5uZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIExvc3QgdGhlIG1hcmtlciByYWNlIGFuZCB0aGUgbWFya2VyIGZpbGUgaXNcbiAgICAgICAgICAgICAgICAgIC8vIHVucmVhZGFibGUgKGV4dHJlbWVseSByYXJlOyBjb3JydXB0ZWQgZGlzaykuXG4gICAgICAgICAgICAgICAgICAvLyBUcmVhdCBhcyBhIHJlYWwgZHVwbGljYXRlIHNvIHRoZSBydW50aW1lJ3NcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQtcmVwbGF5IGNhdGNoIHBhdGggc3dhbGxvd3MgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCBpbnN0ZWFkIG9mIHJpc2tpbmcgZGl2ZXJnZW50XG4gICAgICAgICAgICAgICAgICAvLyBwdWJsaWNhdGlvbi5cbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgSG9vayBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIGFscmVhZHkgY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbm9uaWNhbEV2ZW50SWQgPSBwaW5uZWQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZWJ1aWxkIGBldmVudGAgd2l0aCB0aGUgY2Fub25pY2FsIGV2ZW50SWQgYW5kIGFcbiAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBgY3JlYXRlZEF0YCBkZXJpdmVkIGZyb20gdGhlIGV2ZW50SWRcbiAgICAgICAgICAgICAgLy8gKGEgVUxJRCkgc28gdHdvIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBldmVudFxuICAgICAgICAgICAgICAvLyBwcm9kdWNlIGJ5dGUtaWRlbnRpY2FsIGNvbnRlbnQuXG4gICAgICAgICAgICAgIGV2ZW50SWQgPSBjYW5vbmljYWxFdmVudElkO1xuICAgICAgICAgICAgICBjb25zdCBjYW5vbmljYWxDcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAgIHVsaWRUb0RhdGUoZXZlbnRJZC5yZXBsYWNlKC9eZXZudF8vLCAnJykpID8/IG5vdztcbiAgICAgICAgICAgICAgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGNhbm9uaWNhbENyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGUgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ3Jvc3MtaG9vayAvIGNyb3NzLXJ1biBjb25mbGljdDogYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgLy8gKHJ1bklkLCBob29rSWQpIGhvbGRzIHRoaXMgdG9rZW4uIENyZWF0ZSBhXG4gICAgICAgICAgICAgIC8vIGhvb2tfY29uZmxpY3QgZXZlbnQgc28gdGhlIHdvcmtmbG93IGNhbiBmYWlsXG4gICAgICAgICAgICAgIC8vIGdyYWNlZnVsbHkgd2hlbiB0aGUgaG9vayBpcyBhd2FpdGVkLlxuICAgICAgICAgICAgICBjb25zdCBjb25mbGljdEV2ZW50OiBFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdob29rX2NvbmZsaWN0JyxcbiAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBkYXRhLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogaG9va0RhdGEudG9rZW4sXG4gICAgICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdDbGFpbVxuICAgICAgICAgICAgICAgICAgICA/IHsgY29uZmxpY3RpbmdSdW5JZDogZXhpc3RpbmdDbGFpbS5ydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcnVuSWQ6IGVmZmVjdGl2ZVJ1bklkLFxuICAgICAgICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IGVmZmVjdGl2ZVNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUtleSA9IGAke2VmZmVjdGl2ZVJ1bklkfS0ke2V2ZW50SWR9YDtcbiAgICAgICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICAgICAgICBjb25mbGljdEV2ZW50XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPVxuICAgICAgICAgICAgICAgIHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZEV2ZW50ID0gc3RyaXBFdmVudERhdGFSZWZzKFxuICAgICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZURhdGFcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBSZXR1cm4gRXZlbnRSZXN1bHQgd2l0aCBjb25mbGljdCBldmVudCAobm8gaG9vayBlbnRpdHkgY3JlYXRlZClcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBldmVudDogZmlsdGVyZWRFdmVudCxcbiAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgICBob29rOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaG9vayBlbnRpdHkgbm93LCBidXQgZGVmZXIgaXRzIHdyaXRlIHVudGlsXG4gICAgICAgICAgLy8gQUZURVIgdGhlIG91dGVyIGV2ZW50IHB1Ymxpc2ggYXQgdGhlIGJvdHRvbSBvZiB0aGlzXG4gICAgICAgICAgLy8gZnVuY3Rpb24gY29tbWl0cy4gVGhlIHJldHJ5IHBhdGggY2FuIHJlYWNoIHRoaXMgYnJhbmNoXG4gICAgICAgICAgLy8gZm9yIGEgaG9vayB3aG9zZSBgaG9va19jcmVhdGVkYCBldmVudCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkgKGFuIFwiYWxyZWFkeS1jb21taXR0ZWRcbiAgICAgICAgICAvLyBkdXBsaWNhdGVcIik7IGluIHRoYXQgY2FzZSB0aGUgb3V0ZXIgYHdyaXRlRXhjbHVzaXZlYFxuICAgICAgICAgIC8vIGZvciB0aGUgZXZlbnQgd2lsbCByZXR1cm4gZmFsc2UgYW5kIHdlIHdpbGwgdGhyb3dcbiAgICAgICAgICAvLyBgRW50aXR5Q29uZmxpY3RFcnJvcmAuIFdyaXRpbmcgdGhlIGhvb2sgZW50aXR5IGhlcmVcbiAgICAgICAgICAvLyBmaXJzdCB3b3VsZCBtdXRhdGUgYWxyZWFkeS1jb21taXR0ZWQgZHVyYWJsZSBzdGF0ZSB3aXRoXG4gICAgICAgICAgLy8gdGhlIHJldHJ5J3MgcGF5bG9hZCAoZS5nLiBkaWZmZXJlbnQgYG1ldGFkYXRhYCBvclxuICAgICAgICAgIC8vIGBpc1dlYmhvb2tgKSBiZWZvcmUgdGhlIGV2ZW50IHB1Ymxpc2ggcHJvdmVkIHdoaWNoXG4gICAgICAgICAgLy8gb3V0Y29tZSB3ZSBhcmUgaW4g4oCUIGxlYXZpbmcgdGhlIGVudGl0eSBhbmQgZXZlbnQgbG9nXG4gICAgICAgICAgLy8gaW5jb25zaXN0ZW50LiBCeSBkZWZlcnJpbmcsIHRoZSBlbnRpdHkgaXMgb25seSB3cml0dGVuXG4gICAgICAgICAgLy8gd2hlbiB0aGUgcHVibGlzaCBhY3R1YWxseSBzdWNjZWVkcyAoZmlyc3Qgd3JpdGVyIG9yXG4gICAgICAgICAgLy8gb3JwaGFuIHJlY292ZXJ5KS4gU2VlIHByYW5heWdwJ3MgcmV2aWV3IG9uIFBSICMyMjk1IGZvclxuICAgICAgICAgIC8vIHRoZSBrYXJ0aGlrc2NhbGUzIHJlcHJvLlxuICAgICAgICAgIGhvb2sgPSB7XG4gICAgICAgICAgICBydW5JZDogZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICBob29rSWQ6IGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIHRva2VuOiBob29rRGF0YS50b2tlbixcbiAgICAgICAgICAgIG1ldGFkYXRhOiBob29rRGF0YS5tZXRhZGF0YSxcbiAgICAgICAgICAgIG93bmVySWQ6ICdsb2NhbC1vd25lcicsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6ICdsb2NhbC1wcm9qZWN0JyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiAnbG9jYWwnLFxuICAgICAgICAgICAgLy8gVXNlIHRoZSAocG9zc2libHkgY2Fub25pY2FsKSBldmVudCdzIGNyZWF0ZWRBdCBzbyB0d29cbiAgICAgICAgICAgIC8vIHdvcmtlcnMgd3JpdGluZyB0aGUgc2FtZSBob29rIGVudGl0eSBwcm9kdWNlIGJ5dGUtXG4gICAgICAgICAgICAvLyBpZGVudGljYWwgY29udGVudCBkdXJpbmcgY29udmVyZ2VuY2UuXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBzcGVjVmVyc2lvbiBmcm9tIHRoZSBldmVudCB0byB0aGUgaG9vayBlbnRpdHlcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBlZmZlY3RpdmVTcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGlzV2ViaG9vazogaG9va0RhdGEuaXNXZWJob29rID8/IGZhbHNlLFxuICAgICAgICAgICAgaXNTeXN0ZW06IGhvb2tEYXRhLmlzU3lzdGVtID8/IGZhbHNlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaG9va0VudGl0eVdyaXRlT3B0aW9ucyA9IHdyaXRlSG9va0VudGl0eVdpdGhPdmVyd3JpdGVcbiAgICAgICAgICAgID8geyBvdmVyd3JpdGU6IHRydWUgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJykge1xuICAgICAgICAgIC8vIGhvb2tfZGlzcG9zZWQ6IERlbGV0ZXMgaG9vayBlbnRpdHksIHJlamVjdHMgZHVwbGljYXRlcy5cbiAgICAgICAgICAvLyBVc2VzIHdyaXRlRXhjbHVzaXZlIG9uIGEgbG9jayBmaWxlIHRvIGF0b21pY2FsbHkgcHJldmVudCBjb25jdXJyZW50XG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgZnJvbSBib3RoIGRpc3Bvc2luZyB0aGUgc2FtZSBob29rIChUT0NUT1UgcmFjZSkuXG4gICAgICAgICAgY29uc3QgaG9va0xvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke2RhdGEuY29ycmVsYXRpb25JZH0uZGlzcG9zZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHtkYXRhLmNvcnJlbGF0aW9uSWR9LmRpc3Bvc2VkYDtcbiAgICAgICAgICBjb25zdCBsb2NrUGF0aCA9IHJlc29sdmVXaXRoaW5CYXNlKFxuICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICcubG9ja3MnLFxuICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgIGhvb2tMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKGxvY2tQYXRoLCAnJyk7XG4gICAgICAgICAgaWYgKCFjbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYEhvb2sgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGRpc3Bvc2VkYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVhZCB0aGUgaG9vayB0byBnZXQgaXRzIHRva2VuIGJlZm9yZSBkZWxldGluZ1xuICAgICAgICAgIGNvbnN0IGhvb2tQYXRoID0gdGFnZ2VkUGF0aChcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgdGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0hvb2sgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICAgZGF0YS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgSG9va1NjaGVtYSxcbiAgICAgICAgICAgIHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nSG9vaykge1xuICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSB0b2tlbiBjb25zdHJhaW50IGZpbGUgdG8gZnJlZSB1cCB0aGUgdG9rZW5cbiAgICAgICAgICAgIC8vIGZvciByZXVzZSwgYW5kIGRlbGV0ZSB0aGlzIGhvb2sncyByZWNvdmVyeSBtYXJrZXIgKGlmXG4gICAgICAgICAgICAvLyBhbnkpIGZvciBkaXNrIGh5Z2llbmUuIFRoZSBtYXJrZXIncyBmaWxlbmFtZSBoYXNoXG4gICAgICAgICAgICAvLyBpbmNsdWRlcyBgKHRva2VuLCBydW5JZCwgaG9va0lkKWAgc28gZGlmZmVyZW50XG4gICAgICAgICAgICAvLyBsaWZldGltZXMgbmV2ZXIgY29sbGlkZSwgYnV0IGNsZWFuaW5nIHVwIHJlZHVjZXMgZGlza1xuICAgICAgICAgICAgLy8gbGVhayBmb3IgaG9va3MgdGhhdCBnbyB0aHJvdWdoIHRoZSByZWNvdmVyeSBwYXRoLlxuICAgICAgICAgICAgY29uc3QgZGlzcG9zZWRDb25zdHJhaW50UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAgICAgJ3Rva2VucycsXG4gICAgICAgICAgICAgIGAke2hhc2hUb2tlbihleGlzdGluZ0hvb2sudG9rZW4pfS5qc29uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oZGlzcG9zZWRDb25zdHJhaW50UGF0aCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdIb29rLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nSG9vay5ydW5JZCxcbiAgICAgICAgICAgICAgICBleGlzdGluZ0hvb2suaG9va0lkXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oaG9va1BhdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJiAnZXZlbnREYXRhJyBpbiBkYXRhKSB7XG4gICAgICAgICAgLy8gd2FpdF9jcmVhdGVkOiBDcmVhdGVzIHdhaXQgZW50aXR5IHdpdGggc3RhdHVzICd3YWl0aW5nJy5cbiAgICAgICAgICAvLyBBdG9taWMgY2xhaW0gb24gYSBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKSBjb25zdHJhaW50IGZpbGVcbiAgICAgICAgICAvLyBlbnN1cmVzIGR1cGxpY2F0ZSB3YWl0X2NyZWF0ZWQgZnJvbSBjb25jdXJyZW50IGludm9jYXRpb25zXG4gICAgICAgICAgLy8gc3VyZmFjZXMgYXMgRW50aXR5Q29uZmxpY3RFcnJvciAocmVwbGFjZXMgYSBwcmlvciBUT0NUT1VcbiAgICAgICAgICAvLyByZWFkLXRoZW4tY2hlY2sgdGhhdCBjb3VsZCBsZXQgYm90aCB3cml0ZXJzIHRocm91Z2gpLlxuICAgICAgICAgIGNvbnN0IHdhaXRDb21wb3NpdGVLZXkgPSBgJHtlZmZlY3RpdmVSdW5JZH0tJHtkYXRhLmNvcnJlbGF0aW9uSWR9YDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNyZWF0ZWQuJHt0YWd9YFxuICAgICAgICAgICAgOiBgJHt3YWl0Q29tcG9zaXRlS2V5fS5jcmVhdGVkYDtcbiAgICAgICAgICBjb25zdCB3YWl0Q3JlYXRlZExvY2tQYXRoID0gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgJy5sb2NrcycsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENyZWF0ZWRMb2NrTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2FpdENyZWF0ZWRDbGFpbWVkID0gYXdhaXQgd3JpdGVFeGNsdXNpdmUoXG4gICAgICAgICAgICB3YWl0Q3JlYXRlZExvY2tQYXRoLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd2FpdENyZWF0ZWRDbGFpbWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgICAgYFdhaXQgXCIke2RhdGEuY29ycmVsYXRpb25JZH1cIiBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdhaXREYXRhID0gZGF0YS5ldmVudERhdGEgYXMge1xuICAgICAgICAgICAgcmVzdW1lQXQ/OiBEYXRlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgd2FpdCA9IHtcbiAgICAgICAgICAgIHdhaXRJZDogd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIHJ1bklkOiBlZmZlY3RpdmVSdW5JZCxcbiAgICAgICAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgICAgICAgcmVzdW1lQXQ6IHdhaXREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogZWZmZWN0aXZlU3BlY1ZlcnNpb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBhd2FpdCB3cml0ZUpTT04oXG4gICAgICAgICAgICB0YWdnZWRQYXRoKGJhc2VkaXIsICd3YWl0cycsIHdhaXRDb21wb3NpdGVLZXksIHRhZyksXG4gICAgICAgICAgICB3YWl0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJykge1xuICAgICAgICAgIC8vIHdhaXRfY29tcGxldGVkOiBUcmFuc2l0aW9ucyB3YWl0IHRvICdjb21wbGV0ZWQnLCByZWplY3RzIGR1cGxpY2F0ZXMuXG4gICAgICAgICAgLy8gVXNlcyB3cml0ZUV4Y2x1c2l2ZSBvbiBhIGxvY2sgZmlsZSB0byBhdG9taWNhbGx5IHByZXZlbnQgY29uY3VycmVudFxuICAgICAgICAgIC8vIGludm9jYXRpb25zIGZyb20gYm90aCBjb21wbGV0aW5nIHRoZSBzYW1lIHdhaXQgKFRPQ1RPVSByYWNlKS5cbiAgICAgICAgICBjb25zdCB3YWl0Q29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZGF0YS5jb3JyZWxhdGlvbklkfWA7XG4gICAgICAgICAgY29uc3Qgd2FpdExvY2tOYW1lID0gdGFnXG4gICAgICAgICAgICA/IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZC4ke3RhZ31gXG4gICAgICAgICAgICA6IGAke3dhaXRDb21wb3NpdGVLZXl9LmNvbXBsZXRlZGA7XG4gICAgICAgICAgY29uc3QgbG9ja1BhdGggPSByZXNvbHZlV2l0aGluQmFzZShcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnLmxvY2tzJyxcbiAgICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgICB3YWl0TG9ja05hbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCB3cml0ZUV4Y2x1c2l2ZShsb2NrUGF0aCwgJycpO1xuICAgICAgICAgIGlmICghY2xhaW1lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgICAgICAgIGBXYWl0IFwiJHtkYXRhLmNvcnJlbGF0aW9uSWR9XCIgYWxyZWFkeSBjb21wbGV0ZWRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1dhaXQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgICAgIGJhc2VkaXIsXG4gICAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICAgd2FpdENvbXBvc2l0ZUtleSxcbiAgICAgICAgICAgIFdhaXRTY2hlbWEsXG4gICAgICAgICAgICB0YWdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghZXhpc3RpbmdXYWl0KSB7XG4gICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgbG9jayBmaWxlIHdlIGp1c3QgY2xhaW1lZCDigJQgdGhlIHdhaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2tQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgICAgICAgICAgICBgV2FpdCBcIiR7ZGF0YS5jb3JyZWxhdGlvbklkfVwiIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBsb2NrIGZpbGUgKHdyaXRlRXhjbHVzaXZlIGFib3ZlKSBhbHJlYWR5IHByZXZlbnRzIGNvbmN1cnJlbnRcbiAgICAgICAgICAvLyBjb21wbGV0aW9ucyDigJQgbm8gYWRkaXRpb25hbCBzdGF0dXMgY2hlY2sgbmVlZGVkLlxuICAgICAgICAgIHdhaXQgPSB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1dhaXQsXG4gICAgICAgICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5vdyxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgIH07XG4gICAgICAgICAgYXdhaXQgd3JpdGVKU09OKFxuICAgICAgICAgICAgdGFnZ2VkUGF0aChiYXNlZGlyLCAnd2FpdHMnLCB3YWl0Q29tcG9zaXRlS2V5LCB0YWcpLFxuICAgICAgICAgICAgd2FpdCxcbiAgICAgICAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGV2ZW50IGxvZyBidXQgZG9uJ3RcbiAgICAgICAgLy8gbW9kaWZ5IHRoZSBIb29rIGVudGl0eSAod2hpY2ggZG9lc24ndCBoYXZlIGEgcGF5bG9hZCBmaWVsZClcblxuICAgICAgICAvLyBTdG9yZSBldmVudCB1c2luZyBjb21wb3NpdGUga2V5IHtydW5JZH0te2V2ZW50SWR9LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgd3JpdGVFeGNsdXNpdmVgIChPX0NSRUFUfE9fRVhDTCB2aWEgdGVtcC1maWxlICsgaGFyZC1saW5rKVxuICAgICAgICAvLyBpcyB0aGUgY3Jvc3MtcHJvY2VzcyBhdG9taWMgcHVibGlzaCBwcmltaXRpdmU6IGlmIHRoZSBmaWxlXG4gICAgICAgIC8vIGFscmVhZHkgZXhpc3RzLCByZXR1cm5zIGZhbHNlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcuIFRoaXNcbiAgICAgICAgLy8gaXMgY3JpdGljYWwgZm9yIHRoZSBob29rX2NyZWF0ZWQgZGVkdXAtcmVjb3ZlcnkgY29udmVyZ2VuY2VcbiAgICAgICAgLy8gKGFib3ZlKSDigJQgdHdvIHdvcmtlcnMgdGhhdCBhZG9wdCB0aGUgc2FtZSBjYW5vbmljYWwgZXZlbnRJZFxuICAgICAgICAvLyByYWNlIGhlcmU7IHdob2V2ZXIgbGlua3MgdGhlIGZpbGUgZmlyc3Qgd2lucywgdGhlIGxvc2VyXG4gICAgICAgIC8vIHRocm93cyBFbnRpdHlDb25mbGljdEVycm9yLCBhbmQgdGhlIHJ1bnRpbWUncyBleGlzdGluZ1xuICAgICAgICAvLyBjb25jdXJyZW50LXJlcGxheSBjYXRjaCBwYXRoIGF0IHN1c3BlbnNpb24taGFuZGxlci50czoxNDJcbiAgICAgICAgLy8gc3dhbGxvd3MgaXQuIEZvciBhbGwgb3RoZXIgZXZlbnQgdHlwZXMsIGV2ZW50SWRzIGFyZVxuICAgICAgICAvLyBtb25vdG9uaWMgVUxJRHMgKGdsb2JhbGx5IHVuaXF1ZSBieSBjb25zdHJ1Y3Rpb24pIHNvIGFcbiAgICAgICAgLy8gY29sbGlzaW9uIGluZGljYXRlcyBhIHJlYWwgYnVnIGFuZCBFbnRpdHlDb25mbGljdEVycm9yIGlzXG4gICAgICAgIC8vIGFsc28gdGhlIHJpZ2h0IHN1cmZhY2Ug4oCUIHNhbWUgc2hhcGUgYXMgc3RlcF9jcmVhdGVkJ3NcbiAgICAgICAgLy8gY2xhaW0tZmlsZSBiZWhhdmlvci5cbiAgICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7ZWZmZWN0aXZlUnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgICBjb25zdCBldmVudFB1Ymxpc2hlZCA9IGF3YWl0IHdyaXRlRXhjbHVzaXZlKFxuICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2V2ZW50cycsIGNvbXBvc2l0ZUtleSwgdGFnKSxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShldmVudCwganNvblJlcGxhY2VyLCAyKVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWV2ZW50UHVibGlzaGVkKSB7XG4gICAgICAgICAgLy8gRm9yIGBob29rX2NyZWF0ZWRgLCBsb3NpbmcgdGhlIGV2ZW50IHB1Ymxpc2ggbWVhbnMgdGhlXG4gICAgICAgICAgLy8gZXZlbnQgd2FzIGFscmVhZHkgY29tbWl0dGVkIGF0IHRoaXMgZXhhY3QgKGNhbm9uaWNhbClcbiAgICAgICAgICAvLyBwYXRoLiBUaGUgb3JpZ2luYWwgcHVibGlzaGVyIG1heSBoYXZlIGNyYXNoZWQgYmV0d2VlblxuICAgICAgICAgIC8vIGl0cyBldmVudCBwdWJsaXNoIGFuZCBpdHMgZGVmZXJyZWQgaG9vay1lbnRpdHkgd3JpdGVcbiAgICAgICAgICAvLyAodGhlIGludmVyc2Ugb2YgdGhlIGNyYXNoIHdpbmRvdyB0aGUgZGVmZXJyYWwgY2xvc2VzKSxcbiAgICAgICAgICAvLyBsZWF2aW5nIGFuIGV2ZW50LWZpcnN0IG9ycGhhbjogdGhlIGV2ZW50IGlzIGluIHRoZSBsb2dcbiAgICAgICAgICAvLyBidXQgdGhlIGVudGl0eSBpcyBtaXNzaW5nIGFuZCB0aGUgaG9vayBpcyB1bnJlc29sdmFibGUuXG4gICAgICAgICAgLy8gUmVwYWlyIHRoZSBlbnRpdHkgZnJvbSB0aGUgUEVSU0lTVEVEIGV2ZW50J3MgcGF5bG9hZFxuICAgICAgICAgIC8vIChuZXZlciB0aGUgcmV0cnkncyDigJQgZGlmZmVyZW50IHJldHJ5IG1ldGFkYXRhIG11c3Qgbm90XG4gICAgICAgICAgLy8gY2hhbmdlIGNvbW1pdHRlZCBzdGF0ZSkgYmVmb3JlIHN1cmZhY2luZyB0aGUgYmVuaWduXG4gICAgICAgICAgLy8gZHVwbGljYXRlIHRvIHRoZSBydW50aW1lJ3MgY29uY3VycmVudC1yZXBsYXkgY2F0Y2ggcGF0aC5cbiAgICAgICAgICBpZiAoZGF0YS5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnICYmIGRhdGEuY29ycmVsYXRpb25JZCkge1xuICAgICAgICAgICAgYXdhaXQgcmVwYWlySG9va0VudGl0eUZyb21QZXJzaXN0ZWRFdmVudChcbiAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgZWZmZWN0aXZlUnVuSWQsXG4gICAgICAgICAgICAgIGRhdGEuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICAgICAgdGFnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5Q29uZmxpY3RFcnJvcihcbiAgICAgICAgICAgIGBFdmVudCBcIiR7ZXZlbnRJZH1cIiBhbHJlYWR5IGV4aXN0cyBmb3IgcnVuIFwiJHtlZmZlY3RpdmVSdW5JZH1cImBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGhvb2sgZW50aXR5IE9OTFkgbm93IHRoYXQgdGhlIGV2ZW50IHB1Ymxpc2ggaGFzXG4gICAgICAgIC8vIGNvbW1pdHRlZC4gRG9pbmcgdGhpcyBlYXJsaWVyIChpbiB0aGUgYGhvb2tfY3JlYXRlZGBcbiAgICAgICAgLy8gYnJhbmNoIGFib3ZlKSB3b3VsZCBtdXRhdGUgYW4gYWxyZWFkeS1jb21taXR0ZWQgaG9va1xuICAgICAgICAvLyBlbnRpdHkgd2l0aCB0aGUgcmV0cnkncyBwYXlsb2FkIGJlZm9yZSB0aGUgZXZlbnQgcHVibGlzaFxuICAgICAgICAvLyBwcm92ZWQgd2hldGhlciB0aGlzIGF0dGVtcHQgd2FzIHJlcGFpcmluZyBhIG1pc3NpbmcgZXZlbnRcbiAgICAgICAgLy8gb3IganVzdCBjb2xsaWRpbmcgd2l0aCBhbiBhbHJlYWR5LXB1Ymxpc2hlZCBgaG9va19jcmVhdGVkYC5cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBzZXRzIGBob29rRW50aXR5V3JpdGVPcHRpb25zYCBpZmYgdGhpcyBldmVudFxuICAgICAgICAvLyB0eXBlIHdyaXRlcyBhbiBlbnRpdHkuXG4gICAgICAgIGlmIChob29rICYmIGRhdGEuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJykge1xuICAgICAgICAgIGF3YWl0IHdyaXRlSlNPTihcbiAgICAgICAgICAgIHRhZ2dlZFBhdGgoYmFzZWRpciwgJ2hvb2tzJywgaG9vay5ob29rSWQsIHRhZyksXG4gICAgICAgICAgICBob29rLFxuICAgICAgICAgICAgaG9va0VudGl0eVdyaXRlT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcz8ucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZEV2ZW50ID0gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG5cbiAgICAgICAgLy8gRm9yIHJ1bl9zdGFydGVkOiBwcmVsb2FkIG9uZSBwYWdlIG9mIGV2ZW50cyBzbyB0aGUgcnVudGltZSBjYW4gc2tpcFxuICAgICAgICAvLyB0aGUgaW5pdGlhbCBldmVudHMubGlzdCBjYWxsIHdoZW4gaGFzTW9yZSBpcyBmYWxzZS5cbiAgICAgICAgbGV0IGV2ZW50czogRXZlbnRbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGhhc01vcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyAmJiBydW4pIHtcbiAgICAgICAgICBjb25zdCBhbGxFdmVudHMgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICAgICAgc2NoZW1hOiBFdmVudFNjaGVtYSxcbiAgICAgICAgICAgIGZpbGVQcmVmaXg6IGAke2VmZmVjdGl2ZVJ1bklkfS1gLFxuICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICAgICAgZ2V0Q3JlYXRlZEF0OiBnZXRPYmplY3RDcmVhdGVkQXQoJ2V2bnQnKSxcbiAgICAgICAgICAgIGdldElkOiAoZSkgPT4gZS5ldmVudElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50cyA9IGFsbEV2ZW50cy5kYXRhO1xuICAgICAgICAgIGN1cnNvciA9IGFsbEV2ZW50cy5jdXJzb3I7XG4gICAgICAgICAgaGFzTW9yZSA9IGFsbEV2ZW50cy5oYXNNb3JlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5saW5lLWRlbHRhIG9wdGltaXphdGlvbjogb24gYSBzdGVwLXRlcm1pbmFsIHdyaXRlIHRoZSBpbmxpbmVcbiAgICAgICAgLy8gcnVudGltZSBsb29wIGNhbiBwYXNzIGBzaW5jZUN1cnNvcmAgKHRoZSBjdXJzb3IgZnJvbSBiZWZvcmUgaXRcbiAgICAgICAgLy8gYmVnYW4gd3JpdGluZyB0aGlzIHN0ZXAncyBldmVudHMpLiBXZSByZXR1cm4gdGhlIGRlbHRhIG9mXG4gICAgICAgIC8vIGV2ZW50cyB3cml0dGVuIHN0cmljdGx5IGFmdGVyIHRoYXQgY3Vyc29yIOKAlCBleGFjdGx5IHdoYXQgYW5cbiAgICAgICAgLy8gYGV2ZW50cy5saXN0KHsgY3Vyc29yOiBzaW5jZUN1cnNvciwgc29ydE9yZGVyOiAnYXNjJyB9KWAgd291bGRcbiAgICAgICAgLy8gcmV0dXJuIHJpZ2h0IG5vdyDigJQgc28gdGhlIGxvb3AgY2FuIHNraXAgYSByZWR1bmRhbnQgcm91bmQtdHJpcC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBpcyBjb21wdXRlZCBhZ2FpbnN0IHRoZSBzYW1lIG9uLWRpc2sgbG9nIHRoZSBsaXN0IHBhdGhcbiAgICAgICAgLy8gcmVhZHMsIHNvIGl0IGNhcHR1cmVzIGV2ZXJ5dGhpbmcgdGhlIGZldGNoIHdvdWxkOiB0aGlzIHN0ZXAnc1xuICAgICAgICAvLyBzdGVwX2NyZWF0ZWQvc3RlcF9zdGFydGVkL3N0ZXBfY29tcGxldGVkLCBhbnkgYXR0cl9zZXQgdGhlIHN0ZXBcbiAgICAgICAgLy8gYm9keSB3cm90ZSwgYW5kIGFueSBpbi1iYW5kIGV2ZW50cyAoZS5nLiBob29rX3JlY2VpdmVkLFxuICAgICAgICAvLyB3YWl0X2NvbXBsZXRlZCkgYW5vdGhlciB3cml0ZXIgYXBwZW5kZWQgc2luY2UgdGhlIGN1cnNvci4gVGhhdFxuICAgICAgICAvLyBlcXVpdmFsZW5jZSBpcyB3aGF0IG1ha2VzIHNraXBwaW5nIHRoZSBmZXRjaCBzYWZlIOKAlCBhIG1pc3NlZFxuICAgICAgICAvLyBpbi1iYW5kIGV2ZW50IGNhbm5vdCBkaXZlcmdlIHJlcGxheSBiZWNhdXNlIHRoZSBkZWx0YSBpcyB0aGVcbiAgICAgICAgLy8gZmV0Y2guXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9ubHkgc3RlcC10ZXJtaW5hbCBldmVudHMgcXVhbGlmeTogc3RlcF9jcmVhdGVkL3N0ZXBfc3RhcnRlZCBhcmVcbiAgICAgICAgLy8gbm90IGxvb3AgYm91bmRhcmllcyAodGhlIGxvb3AgZmV0Y2hlcyBhZnRlciBzdGVwX2NvbXBsZXRlZCAvXG4gICAgICAgIC8vIHN0ZXBfZmFpbGVkKSwgYW5kIHJ1bi10ZXJtaW5hbCBldmVudHMgZW5kIHRoZSBsb29wLiBgcmVzb2x2ZURhdGFgXG4gICAgICAgIC8vIG1hdGNoZXMgdGhlIGxpc3QgcGF0aCBzbyBldmVudERhdGEgcmVmcyBhcmUgaGFuZGxlZCBpZGVudGljYWxseS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgZGF0YS5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCcpICYmXG4gICAgICAgICAgdHlwZW9mIHBhcmFtcz8uc2luY2VDdXJzb3IgPT09ICdzdHJpbmcnXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbm8gYGxpbWl0YDogdGhpcyByZXR1cm5zIGEgc2luZ2xlIGRlZmF1bHQtc2l6ZSBwYWdlLFxuICAgICAgICAgIC8vIHVubGlrZSB0aGUgYGV2ZW50cy5saXN0YCBwYXRoIHdoaWNoIGxvb3BzIGB3aGlsZSAoaGFzTW9yZSlgIHRvXG4gICAgICAgICAgLy8gZXhoYXVzdGlvbi4gVGhhdCBpcyBzYWZlIOKAlCBhbmQgbXVzdCBOT1QgYmUgXCJmaXhlZFwiIGJ5IHBhZ2luYXRpbmdcbiAgICAgICAgICAvLyBoZXJlIOKAlCBiZWNhdXNlIHRoZSBjb250cmFjdCBpcyBzaW5nbGUtcGFnZS1vci1mYWxsYmFjaywgbm90XG4gICAgICAgICAgLy8gY29tcGxldGUtZGVsdGEuIFdoZW4gdGhlIGRlbHRhIG92ZXJmbG93cyBvbmUgcGFnZSxcbiAgICAgICAgICAvLyBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkgc2V0cyBgaGFzTW9yZTogdHJ1ZWAgYW5kIHNsaWNlcyBgZGF0YWAgdG9cbiAgICAgICAgICAvLyB0aGUgcGFnZSAoc2VlIGZzLnRzKSwgd2hpY2ggd2UgZm9yd2FyZCB2ZXJiYXRpbSBiZWxvdy4gVGhlIFNES1xuICAgICAgICAgIC8vIGNvbnN1bWUgc2lkZSAocnVudGltZS50cykgb25seSBzdGFzaGVzIHRoZSBkZWx0YSB3aGVuIGAhaGFzTW9yZWBcbiAgICAgICAgICAvLyBhbmQgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdGhlIGV4aGF1c3RpdmUgYGV2ZW50cy5saXN0YCBsb29wLCBzbyBhXG4gICAgICAgICAgLy8gdHJ1bmNhdGVkIHBhZ2UgaXMgbmV2ZXIgY29uc3VtZWQgYXMgaWYgaXQgd2VyZSB0aGUgZnVsbCBkZWx0YS5cbiAgICAgICAgICBjb25zdCBkZWx0YSA9IGF3YWl0IHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICAgICAgZmlsZVByZWZpeDogYCR7ZWZmZWN0aXZlUnVuSWR9LWAsXG4gICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgY3Vyc29yOiBwYXJhbXMuc2luY2VDdXJzb3IsXG4gICAgICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICAgICAgZ2V0SWQ6IChlKSA9PiBlLmV2ZW50SWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRzID1cbiAgICAgICAgICAgIHJlc29sdmVEYXRhID09PSAnbm9uZSdcbiAgICAgICAgICAgICAgPyBkZWx0YS5kYXRhLm1hcCgoZSkgPT4gc3RyaXBFdmVudERhdGFSZWZzKGUsIHJlc29sdmVEYXRhKSlcbiAgICAgICAgICAgICAgOiBkZWx0YS5kYXRhO1xuICAgICAgICAgIGN1cnNvciA9IGRlbHRhLmN1cnNvcjtcbiAgICAgICAgICBoYXNNb3JlID0gZGVsdGEuaGFzTW9yZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBFdmVudFJlc3VsdCB3aXRoIGV2ZW50IGFuZCBhbnkgY3JlYXRlZC91cGRhdGVkIGVudGl0eVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV2ZW50OiBmaWx0ZXJlZEV2ZW50LFxuICAgICAgICAgIHJ1bixcbiAgICAgICAgICBzdGVwLFxuICAgICAgICAgIGhvb2ssXG4gICAgICAgICAgd2FpdCxcbiAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgY3Vyc29yLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgLi4uKHN0ZXBDcmVhdGVkTGF6aWx5ID8geyBzdGVwQ3JlYXRlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgfSAvLyBlbmQgY3JlYXRlSW1wbFxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQocnVuSWQsIGV2ZW50SWQsIHBhcmFtcykge1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdydW5JZCcsIHJ1bklkKTtcbiAgICAgIGFzc2VydFNhZmVFbnRpdHlJZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgY29uc3QgY29tcG9zaXRlS2V5ID0gYCR7cnVuSWR9LSR7ZXZlbnRJZH1gO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCByZWFkSlNPTldpdGhGYWxsYmFjayhcbiAgICAgICAgYmFzZWRpcixcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgIGNvbXBvc2l0ZUtleSxcbiAgICAgICAgRXZlbnRTY2hlbWEsXG4gICAgICAgIHRhZ1xuICAgICAgKTtcbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFdmVudCAke2V2ZW50SWR9IGluIHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc29sdmVEYXRhID0gcGFyYW1zPy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICByZXR1cm4gc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGxpc3QocGFyYW1zKSB7XG4gICAgICBjb25zdCB7IHJ1bklkIH0gPSBwYXJhbXM7XG4gICAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ3J1bklkJywgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzb2x2ZURhdGEgPSBwYXJhbXMucmVzb2x2ZURhdGEgPz8gREVGQVVMVF9SRVNPTFZFX0RBVEFfT1BUSU9OO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5KHtcbiAgICAgICAgZGlyZWN0b3J5OiBwYXRoLmpvaW4oYmFzZWRpciwgJ2V2ZW50cycpLFxuICAgICAgICBzY2hlbWE6IEV2ZW50U2NoZW1hLFxuICAgICAgICBmaWxlUHJlZml4OiBgJHtydW5JZH0tYCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBsaXN0QnlDb3JyZWxhdGlvbklkKHBhcmFtcykge1xuICAgICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICAgICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdjb3JyZWxhdGlvbklkJywgY29ycmVsYXRpb25JZCk7XG4gICAgICBjb25zdCByZXNvbHZlRGF0YSA9IHBhcmFtcy5yZXNvbHZlRGF0YSA/PyBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT047XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnkoe1xuICAgICAgICBkaXJlY3Rvcnk6IHBhdGguam9pbihiYXNlZGlyLCAnZXZlbnRzJyksXG4gICAgICAgIHNjaGVtYTogRXZlbnRTY2hlbWEsXG4gICAgICAgIC8vIE5vIGZpbGVQcmVmaXggLSBzZWFyY2ggYWxsIGV2ZW50c1xuICAgICAgICBmaWx0ZXI6IChldmVudCkgPT4gZXZlbnQuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCxcbiAgICAgICAgLy8gRXZlbnRzIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKG9sZGVzdCBmaXJzdCkgYnkgZGVmYXVsdCxcbiAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgZm9yIG90aGVyIGxpc3QgY2FsbHMuXG4gICAgICAgIHNvcnRPcmRlcjogcGFyYW1zLnBhZ2luYXRpb24/LnNvcnRPcmRlciA/PyAnYXNjJyxcbiAgICAgICAgbGltaXQ6IHBhcmFtcy5wYWdpbmF0aW9uPy5saW1pdCxcbiAgICAgICAgY3Vyc29yOiBwYXJhbXMucGFnaW5hdGlvbj8uY3Vyc29yLFxuICAgICAgICBnZXRDcmVhdGVkQXQ6IGdldE9iamVjdENyZWF0ZWRBdCgnZXZudCcpLFxuICAgICAgICBnZXRJZDogKGV2ZW50KSA9PiBldmVudC5ldmVudElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIElmIHJlc29sdmVEYXRhIGlzIFwibm9uZVwiLCByZW1vdmUgZXZlbnREYXRhIGZyb20gZXZlbnRzXG4gICAgICBpZiAocmVzb2x2ZURhdGEgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBkYXRhOiByZXN1bHQuZGF0YS5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgICAgc3RyaXBFdmVudERhdGFSZWZzKGV2ZW50LCByZXNvbHZlRGF0YSlcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG59XG4iXX0=