@workflow/core 5.0.0-beta.40 → 5.0.0-beta.42

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.
Files changed (82) hide show
  1. package/dist/events-consumer.d.ts +224 -6
  2. package/dist/events-consumer.d.ts.map +1 -1
  3. package/dist/events-consumer.js +497 -50
  4. package/dist/private.d.ts +87 -18
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +118 -47
  7. package/dist/runtime/constants.d.ts +50 -1
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +59 -3
  10. package/dist/runtime/helpers.d.ts +212 -70
  11. package/dist/runtime/helpers.d.ts.map +1 -1
  12. package/dist/runtime/helpers.js +275 -86
  13. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -1
  14. package/dist/runtime/quickjs-assets.generated.js +2 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts +8 -9
  16. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  17. package/dist/runtime/quickjs-entrypoint.js +172 -41
  18. package/dist/runtime/quickjs-runtime.d.ts +36 -1
  19. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  20. package/dist/runtime/quickjs-runtime.js +613 -185
  21. package/dist/runtime/quickjs-serde.d.ts +107 -0
  22. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  23. package/dist/runtime/quickjs-serde.js +2098 -0
  24. package/dist/runtime/replay-budget.d.ts +13 -14
  25. package/dist/runtime/replay-budget.d.ts.map +1 -1
  26. package/dist/runtime/replay-budget.js +20 -73
  27. package/dist/runtime/resume-hook.d.ts.map +1 -1
  28. package/dist/runtime/resume-hook.js +57 -13
  29. package/dist/runtime/resume-latency.d.ts +143 -0
  30. package/dist/runtime/resume-latency.d.ts.map +1 -0
  31. package/dist/runtime/resume-latency.js +153 -0
  32. package/dist/runtime/runs.d.ts.map +1 -1
  33. package/dist/runtime/runs.js +3 -4
  34. package/dist/runtime/start.js +2 -7
  35. package/dist/runtime/step-executor.d.ts +27 -12
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +105 -15
  38. package/dist/runtime/suspension-handler.d.ts +46 -8
  39. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  40. package/dist/runtime/suspension-handler.js +173 -15
  41. package/dist/runtime/world-compatibility.d.ts +16 -0
  42. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  43. package/dist/runtime/world-compatibility.js +26 -5
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +911 -524
  46. package/dist/serialization/codec-devalue-vm.d.ts +7 -0
  47. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -1
  48. package/dist/serialization/codec-devalue-vm.js +12 -1
  49. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  50. package/dist/serialization/codec-devalue.js +15 -4
  51. package/dist/serialization/workflow-vm.d.ts +8 -3
  52. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  53. package/dist/serialization/workflow-vm.js +9 -4
  54. package/dist/serialization.d.ts.map +1 -1
  55. package/dist/serialization.js +8 -3
  56. package/dist/step.js +2 -2
  57. package/dist/telemetry/semantic-conventions.d.ts +104 -0
  58. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  59. package/dist/telemetry/semantic-conventions.js +84 -1
  60. package/dist/test-support/orchestrator-context.d.ts +25 -0
  61. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  62. package/dist/test-support/orchestrator-context.js +91 -0
  63. package/dist/version.d.ts +1 -1
  64. package/dist/version.js +2 -2
  65. package/dist/vm/index.d.ts.map +1 -1
  66. package/dist/vm/index.js +9 -6
  67. package/dist/workflow/abort-controller.d.ts.map +1 -1
  68. package/dist/workflow/abort-controller.js +4 -6
  69. package/dist/workflow/attribute-dispatcher.js +2 -2
  70. package/dist/workflow/hook.js +2 -2
  71. package/dist/workflow/sleep.js +2 -2
  72. package/dist/workflow.d.ts +10 -0
  73. package/dist/workflow.d.ts.map +1 -1
  74. package/dist/workflow.js +94 -20
  75. package/docs/how-it-works/event-sourcing.mdx +11 -3
  76. package/package.json +7 -7
  77. package/dist/correlation-id.d.ts +0 -109
  78. package/dist/correlation-id.d.ts.map +0 -1
  79. package/dist/correlation-id.js +0 -139
  80. package/dist/serialization/vm-bundle-entry.d.ts +0 -12
  81. package/dist/serialization/vm-bundle-entry.d.ts.map +0 -1
  82. package/dist/serialization/vm-bundle-entry.js +0 -58
@@ -1,7 +1,7 @@
1
1
  import { types } from 'node:util';
2
2
  import { EntityConflictError, FatalError, RetryableError, RunExpiredError, ThrottleError, TooEarlyError, WorkflowRuntimeError, } from '@workflow/errors';
3
3
  import { createWorkflowBaseUrl, pluralize, stepDisplayName, } from '@workflow/utils';
4
- import { SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
4
+ import { requireEventSlot, SPEC_VERSION_CURRENT, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
5
5
  import { runtimeLogger, stepLogger } from '../logger.js';
6
6
  import { getStepFunction } from '../private.js';
7
7
  import { cancelAbortReaders, dehydrateStepError, dehydrateStepReturnValue, hydrateStepArguments, hydrateStepError, } from '../serialization.js';
@@ -12,8 +12,9 @@ import { getErrorName, getErrorStack, normalizeUnknownError, promoteAbortErrorTo
12
12
  import { COMPUTE_INSTANCE_ID } from './compute-instance.js';
13
13
  import { isOptimisticInlineStartEnabled, isOptimisticInlineStartExplicitlyDisabled, } from './constants.js';
14
14
  import { getPortLazy } from './get-port-lazy.js';
15
- import { memoizeEncryptionKey, } from './helpers.js';
15
+ import { maxEventSlot, memoizeEncryptionKey, } from './helpers.js';
16
16
  import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
17
+ import { computeResumeTtrAttributes, } from './resume-latency.js';
17
18
  import { computeStepLatencyEventData, } from './step-latency.js';
18
19
  import { safeWaitUntil } from './wait-until.js';
19
20
  export const DEFAULT_STEP_MAX_RETRIES = 3;
@@ -53,7 +54,53 @@ export async function executeStep(params) {
53
54
  // Gate payload compression on the run's specVersion.
54
55
  const compression = (params.runSpecVersion ?? 0) >= SPEC_VERSION_SUPPORTS_COMPRESSION;
55
56
  const replayRecoveryReporter = params.replayRecoveryReporter ?? ReplayRecoveryReporter.inert();
56
- const createEvent = (data, eventParams) => replayRecoveryReporter.withEventCreate(eventParams, (p) => world.events.create(workflowRunId, data, p));
57
+ /**
58
+ * The highest log slot this executor knows about, seeded from the view its
59
+ * caller scheduled the step against and advanced by every event it commits.
60
+ *
61
+ * Advancing is what keeps the snapshot honest across a step's own writes. A
62
+ * step commits `step_started` and then `step_completed`; if the second still
63
+ * named the caller's original position, the World would report the first one
64
+ * back as an event this writer had not seen, on every step, forever.
65
+ *
66
+ * This reads a report for its highest position and then discards it, where
67
+ * the replay loop and the suspension handler merge theirs with
68
+ * `absorbSkippedSlotReport`. That is the difference between the callers, not
69
+ * an oversight: an executor holds no loaded log to merge into. It runs from a
70
+ * queued delivery whose only view of the log is the integer its caller passed
71
+ * in, so the position is the entire value the report has to it. Whoever
72
+ * replays next loads the log and gets the events themselves.
73
+ */
74
+ let knownSlot = params.slotSnapshot?.eventCount;
75
+ const observeSlot = (result) => {
76
+ if (knownSlot === undefined) {
77
+ // The caller scheduled this step without naming a position, so there is
78
+ // no snapshot to advance and the writes below send none. Not the same as
79
+ // a run without positions: every run has them, this executor just was not
80
+ // told which one it started from.
81
+ return;
82
+ }
83
+ const observed = [];
84
+ if (result.event) {
85
+ observed.push(requireEventSlot(result.event.eventId));
86
+ }
87
+ const reported = maxEventSlot(result.events ?? []);
88
+ if (reported !== undefined) {
89
+ observed.push(reported);
90
+ }
91
+ for (const slot of observed) {
92
+ if (slot > knownSlot) {
93
+ knownSlot = slot;
94
+ }
95
+ }
96
+ };
97
+ const createEvent = async (data, eventParams) => {
98
+ const result = await replayRecoveryReporter.withEventCreate(knownSlot === undefined
99
+ ? eventParams
100
+ : { eventCount: knownSlot, ...eventParams }, (p) => world.events.create(workflowRunId, data, p));
101
+ observeSlot(result);
102
+ return result;
103
+ };
57
104
  const spanName = `step.execute ${stepDisplayName(stepName)}`;
58
105
  return trace(spanName, {}, async (span) => {
59
106
  span?.setAttributes({
@@ -269,18 +316,23 @@ export async function executeStep(params) {
269
316
  (params.forceOptimisticStart === true &&
270
317
  !isOptimisticInlineStartExplicitlyDisabled()));
271
318
  let step;
272
- // Params for the `step_started` create on either path below: the ambient
273
- // compute-instance stamp plus the optimistic-concurrency claim guard.
319
+ // Params for the `step_started` create on either path below. The slot
320
+ // snapshot is not spread here: `createEvent` attaches it to every write,
321
+ // this one included.
274
322
  const startEventParams = {
275
323
  computeInstanceId: COMPUTE_INSTANCE_ID,
276
- // Spread as a unit: the three snapshot fields describe one snapshot and
277
- // must travel together — see StepExecutorParams.preconditionSnapshot.
278
- ...params.preconditionSnapshot,
279
324
  };
280
325
  // `Date.now()` taken immediately before the `step_started` create is
281
326
  // issued (either path below) — anchors RSFS's end point. See
282
327
  // StepLatencyEventData.rsfs and the call sites below.
283
328
  let stepStartPostSentAtMs;
329
+ // `Date.now()` taken once the `step_started` response has returned and the
330
+ // claim succeeded — T6 of the hook-resume TTR window. Only the await path
331
+ // can set it: optimistic inline start deliberately does not wait for the
332
+ // claim before running the body, so at T7 it has no completion instant and
333
+ // the TTR breakdown reports no `step_claim_ms` (see
334
+ // runtime/resume-latency.ts).
335
+ let stepClaimCompletedAtMs;
284
336
  // Settled outcome of the in-flight optimistic `step_started`. Handlers are
285
337
  // attached synchronously (`.then(ok, err)`) so a fast rejection never
286
338
  // surfaces as an unhandledRejection while the body runs.
@@ -327,7 +379,7 @@ export async function executeStep(params) {
327
379
  : {}),
328
380
  },
329
381
  },
330
- // Guard the claim — see StepExecutorParams.preconditionSnapshot. A
382
+ // Guard the claim — see StepExecutorParams.slotSnapshot. A
331
383
  // stale (412) rejection surfaces via reconcileOptimisticStart as a
332
384
  // non-translatable error: the body result is discarded and the
333
385
  // rejection propagates to the caller.
@@ -380,14 +432,12 @@ export async function executeStep(params) {
380
432
  }
381
433
  : { stepName, ...ownershipStamp },
382
434
  },
383
- // Guard the claim — see StepExecutorParams.preconditionSnapshot. A
435
+ // Guard the claim — see StepExecutorParams.slotSnapshot. A
384
436
  // stale (412) rejection is intentionally NOT translated by
385
437
  // startErrorToResult below, so it propagates to the caller for a
386
438
  // fresh replay.
387
439
  startEventParams);
388
- if (!startResult.step) {
389
- throw new WorkflowRuntimeError(`step_started event for "${stepId}" did not return step entity`);
390
- }
440
+ stepClaimCompletedAtMs = Date.now();
391
441
  step = startResult.step;
392
442
  }
393
443
  catch (err) {
@@ -559,6 +609,42 @@ export async function executeStep(params) {
559
609
  ...Attribute.StepLatencyOptimizations(latencyEventData.optimizations ?? []),
560
610
  });
561
611
  }
612
+ /**
613
+ * Close the hook-resume TTR measurement (see runtime/resume-latency.ts).
614
+ *
615
+ * Called from INSIDE `contextStorage.run`, immediately before
616
+ * `stepFn.apply()` — deliberately not alongside the step-latency
617
+ * telemetry above. `executionStartTime` is taken before the inner
618
+ * `step.execute` span and the step context are established, and
619
+ * `step_prepare_ms` is documented to include exactly that setup, so
620
+ * anchoring T7 there would under-report both the phase and the total.
621
+ * TTFS/STSO keep their own anchor so this changes nothing about them.
622
+ *
623
+ * The `reported` latch makes one resumption yield one sample even
624
+ * though every step of an inline batch is handed the same tracking
625
+ * object: whichever step first reaches user code takes the
626
+ * measurement. Sharing it (rather than pinning the batch's first step)
627
+ * is what keeps the sample alive when that first step loses its atomic
628
+ * create-claim to a concurrent invocation while a sibling proceeds.
629
+ * The check-and-set is synchronous, so concurrent siblings cannot both
630
+ * pass it.
631
+ */
632
+ const reportResumeTtr = () => {
633
+ const tracking = params.resumeTracking;
634
+ if (!tracking || tracking.reported)
635
+ return;
636
+ const attributes = computeResumeTtrAttributes({
637
+ tracking,
638
+ attempt,
639
+ stepClaimStartedAtMs: stepStartPostSentAtMs,
640
+ stepClaimCompletedAtMs,
641
+ stepCodeStartedAtMs: Date.now(),
642
+ });
643
+ if (!attributes)
644
+ return;
645
+ tracking.reported = true;
646
+ span?.setAttributes(attributes);
647
+ };
562
648
  try {
563
649
  result = await trace('step.execute', {}, async () => {
564
650
  return await contextStorage.run({
@@ -588,7 +674,11 @@ export async function executeStep(params) {
588
674
  runReadyBarrier: optimisticStart
589
675
  ? params.runReadyBarrier
590
676
  : undefined,
591
- }, () => stepFn.apply(thisVal, args));
677
+ }, () => {
678
+ // The last instant before user code — T7 of the resume window.
679
+ reportResumeTtr();
680
+ return stepFn.apply(thisVal, args);
681
+ });
592
682
  });
593
683
  }
594
684
  catch (err) {
@@ -946,4 +1036,4 @@ export async function executeStep(params) {
946
1036
  return { type: 'completed', hasPendingOps: !opsSettled, inlineDelta };
947
1037
  });
948
1038
  }
949
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3N0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1QsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBU3pCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUNBQWlDLEdBQ2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixHQUNqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsd0JBQXdCLEdBQ3pCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIseUNBQXlDLEdBQzFDLE1BQU0sZ0JBQWdCLENBQUM7QUFD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QUFTLENBQzVDLENBQUM7UUFFRixJQUFJLEVBQUUsYUFBYSxDQUFDO1lBQ2xCLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDcEMsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLE9BQU8sTUFBTSxDQUFDO1NBQzNDLENBQUMsQ0FBQztRQUVILElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixVQUFVLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFO2dCQUN2QyxhQUFhO2dCQUNiLFFBQVE7Z0JBQ1IsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2FBQ3JCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCwrREFBK0Q7UUFDL0Qsd0RBQXdEO1FBQ3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBSZXRyeWFibGVFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBUaHJvdHRsZUVycm9yLFxuICBUb29FYXJseUVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIHBsdXJhbGl6ZSxcbiAgc3RlcERpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVFdmVudFBhcmFtcyxcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RlcCxcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciwgc3RlcExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuLi9wcml2YXRlLmpzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZEtleSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBjYW5jZWxBYm9ydFJlYWRlcnMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgdHJhY2UgfSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RXJyb3JOYW1lLFxuICBnZXRFcnJvclN0YWNrLFxuICBub3JtYWxpemVVbmtub3duRXJyb3IsXG4gIHByb21vdGVBYm9ydEVycm9yVG9GYXRhbCxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgQ09NUFVURV9JTlNUQU5DRV9JRCB9IGZyb20gJy4vY29tcHV0ZS1pbnN0YW5jZS5qcyc7XG5pbXBvcnQge1xuICBpc09wdGltaXN0aWNJbmxpbmVTdGFydEVuYWJsZWQsXG4gIGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RXhwbGljaXRseURpc2FibGVkLFxufSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRQb3J0TGF6eSB9IGZyb20gJy4vZ2V0LXBvcnQtbGF6eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV2ZW50Q3JlYXRvcixcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHR5cGUgUHJlY29uZGl0aW9uU25hcHNob3RQYXJhbXMsXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyIH0gZnJvbSAnLi9yZXBsYXktcmVjb3ZlcnktcmVwb3J0ZXIuanMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5VHJhY2tpbmcsXG59IGZyb20gJy4vc3RlcC1sYXRlbmN5LmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBpbmxpbmUgZGVsdGEgZnJvbSBhIHN0ZXAtdGVybWluYWwgYGV2ZW50cy5jcmVhdGVgIHJlc3VsdCxcbiAqIGlmIHRoZSBXb3JsZCBwb3B1bGF0ZWQgb25lLiBBIGRlbHRhIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBjYWxsZXJcbiAqIHJlcXVlc3RlZCBpdCAoYHNpbmNlQ3Vyc29yYCB3YXMgcGFzc2VkKSBhbmQgdGhlIFdvcmxkIHJldHVybmVkIGJvdGhcbiAqIGBldmVudHNgIGFuZCBhIGBjdXJzb3JgOyBvdGhlcndpc2Ugd2UgcmV0dXJuIHVuZGVmaW5lZCBhbmQgdGhlIGNhbGxlclxuICogZmFsbHMgYmFjayB0byB0aGUgbm9ybWFsIGluY3JlbWVudGFsIGBldmVudHMubGlzdGAuIGBoYXNNb3JlYCBkZWZhdWx0c1xuICogdG8gZmFsc2UgKHNpbmdsZSBwYWdlKSB3aGVuIHRoZSBXb3JsZCBvbWl0cyBpdC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdElubGluZURlbHRhKFxuICByZXN1bHQ6IHsgZXZlbnRzPzogRXZlbnRbXTsgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDsgaGFzTW9yZT86IGJvb2xlYW4gfSxcbiAgcmVxdWVzdGVkOiBib29sZWFuXG4pOiBJbmxpbmVFdmVudERlbHRhIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZXF1ZXN0ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghcmVzdWx0LmV2ZW50cyB8fCByZXN1bHQuY3Vyc29yID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiByZXN1bHQuZXZlbnRzLFxuICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICBoYXNNb3JlOiByZXN1bHQuaGFzTW9yZSA/PyBmYWxzZSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwRXhlY3V0b3JQYXJhbXMge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuSWQ6IHN0cmluZztcbiAgLyoqIERlcGxveW1lbnQgdGhhdCBvd25zIHRoZSB3b3JrZmxvdyBydW4sIGZvciBmb3J3YXJkZWQgd3JpdGFibGUgc3RyZWFtcy4gKi9cbiAgd29ya2Zsb3dEZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICB3b3JrZmxvd1N0YXJ0ZWRBdDogbnVtYmVyO1xuICAvKiogUm9vdCBydW4gaWQgb2YgdGhpcyBydW4ncyBsaW5lYWdlLCBjYXJyaWVkIGludG8gdGhlIHN0ZXAgY29udGV4dC4gKi9cbiAgcm9vdFJ1bklkPzogc3RyaW5nO1xuICBzdGVwSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgZW5jcnlwdGlvbktleT86IFBheWxvYWRLZXk7XG4gIC8qKlxuICAgKiBUaGUgd29ya2Zsb3cgcnVuJ3Mgc3BlY1ZlcnNpb24sIHVzZWQgdG8gZ2F0ZSBwYXlsb2FkIGNvbXByZXNzaW9uLlxuICAgKiBTdGVwIG91dHB1dHMvZXJyb3JzIGFyZSBvbmx5IGNvbXByZXNzZWQgd2hlbiB0aGUgcnVuIGlzIG1hcmtlZCBhc1xuICAgKiBjb21wcmVzc2lvbi1jYXBhYmxlIChzcGVjVmVyc2lvbiA+PSA1KS5cbiAgICovXG4gIHJ1blNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogTGF6eSBzdGVwIHN0YXJ0OiB0aGUgYWxyZWFkeS1kZWh5ZHJhdGVkIHN0ZXAgaW5wdXQuIFdoZW4gcHJvdmlkZWQsIHRoZVxuICAgKiBgc3RlcF9zdGFydGVkYCBldmVudCBjYXJyaWVzIHRoaXMgaW5wdXQgc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlIHN0ZXAgb25cbiAgICogdGhlIGZseSAobm8gc2VwYXJhdGUgYHN0ZXBfY3JlYXRlZGAgcm91bmQtdHJpcCkuIFNldCBieSB0aGUgb3duZWQtaW5saW5lXG4gICAqIHBhdGggZm9yIHRoZSBzdGVwIHdob3NlIGBzdGVwX2NyZWF0ZWRgIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQuXG4gICAqIFRoZSB3b3JsZCdzIGF0b21pYyBjcmVhdGUtY2xhaW0gaXMgdGhlIGV4YWN0bHktb25lLW93bmVyIGdhdGU6IGxvc2luZyBpdFxuICAgKiBzdXJmYWNlcyBhcyBgRW50aXR5Q29uZmxpY3RFcnJvcmAg4oaSIGB7IHR5cGU6ICdza2lwcGVkJyB9YCwgc28gYSBoYW5kbGVyXG4gICAqIHRoYXQgZGlkIG5vdCB3aW4gdGhlIGNyZWF0ZSBuZXZlciBydW5zIHRoZSBib2R5LiBPbWl0dGVkIG9uIGV2ZXJ5IG90aGVyXG4gICAqIHBhdGgsIHdoZXJlIHRoZSBzdGVwIGFscmVhZHkgaGFzIGEgYHN0ZXBfY3JlYXRlZGAgYW5kIGBzdGVwX3N0YXJ0ZWRgXG4gICAqIGNhcnJpZXMgbm8gcGF5bG9hZCAodGhlIGxlZ2FjeSBjb250cmFjdCkuXG4gICAqL1xuICBsYXp5U3RlcElucHV0PzogU2VyaWFsaXplZERhdGE7XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXA6IHRoZSBxdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBpbnZvY2F0aW9uIHRoaXNcbiAgICogZXhlY3V0ZVN0ZXAgY2FsbCBydW5zIGluIChmcm9tIHRoZSBxdWV1ZSBoYW5kbGVyJ3MgbWV0YSkuIFdoZW4gc2V0LCB0aGVcbiAgICogYHN0ZXBfc3RhcnRlZGAgdGhpcyBjYWxsIHNlbmRzIGlzIHN0YW1wZWQgd2l0aCBpdCDigJQgb24gdGhlIGxhenkgcGF0aHNcbiAgICogKHdoZXJlIGBsYXp5U3RlcElucHV0YCBpcyBwcmVzZW50KSBhbmQgb24gdGhlIG93bmVkLXJlY292ZXJ5XG4gICAqIHBheWxvYWQtbGVzcyBzdGFydCAod2hlcmUgaXQgaXMgbm90OyB0aGUgcmUtc3RhbXAga2VlcHMgYSByZWNvdmVyZWRcbiAgICogc3RlcCByZWFkYWJsZSBhcyBvd25lZCBieSB0aGlzIG1lc3NhZ2UsIHNpbmNlIG93bmVyc2hpcCBkZXJpdmVzIGZyb21cbiAgICogdGhlIExBVEVTVCBzdGFydCDigJQgc28gYSByZWNvdmVyeSBzdGFydCBpcyBuZXZlciBiYXJlKS4gV2FrZVxuICAgKiByZXBsYXlzIHRoYXQgb2JzZXJ2ZSBhbiBhY3RpdmVseS1vd25lZCBzdGVwIHN1cHByZXNzIHRoZSBpbW1lZGlhdGVcbiAgICogcmVxdWV1ZSBhbmQgZW5xdWV1ZSBhIGRlbGF5ZWQgYmFja3N0b3AgaW5zdGVhZC4gT21pdHRlZCBvbiB0aGVcbiAgICogYmFja2dyb3VuZC1zdGVwIHBhdGgsIHdob3NlIGJhcmUgc3RhcnQgaW50ZW50aW9uYWxseSBjbGVhcnMgb3duZXJzaGlwXG4gICAqICh0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBmcm9tIHRoYXQgcG9pbnQpLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbmxpbmUtZGVsdGEgb3B0aW1pemF0aW9uIChvcHQtaW4pLiBXaGVuIHByb3ZpZGVkLCB0aGUgY3Vyc29yIG9mIHRoZVxuICAgKiBldmVudCBsb2cgYXMgb2JzZXJ2ZWQgYnkgdGhlIGNhbGxlciAqYmVmb3JlKiB0aGlzIHN0ZXAncyBldmVudHMgd2VyZVxuICAgKiB3cml0dGVuLiBJdCBpcyB0aHJlYWRlZCBpbnRvIHRoZSBzdGVwLXRlcm1pbmFsIGBldmVudHMuY3JlYXRlYCBzbyBhXG4gICAqIHN1cHBvcnRpbmcgV29ybGQgY2FuIHJldHVybiB0aGUgZGVsdGEgb2YgZXZlbnRzIHdyaXR0ZW4gc2luY2UgKHNlZVxuICAgKiB7QGxpbmsgaW1wb3J0KCdAd29ya2Zsb3cvd29ybGQnKS5DcmVhdGVFdmVudFBhcmFtcy5zaW5jZUN1cnNvcn0pLlxuICAgKiBPbmx5IHNldCB0aGlzIHdoZW4gYGNvcnJlbGF0aW9uSWRgLWJhc2VkIG93bmVyc2hpcCBndWFyYW50ZWVzIHRoaXNcbiAgICogaGFuZGxlciBpcyB0aGUgc29sZSBpbmxpbmUgd3JpdGVyIGZvciB0aGUgcnVuIG9uIHRoaXMgaXRlcmF0aW9uLlxuICAgKi9cbiAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFByZWNvbmRpdGlvbi1ndWFyZCBzbmFwc2hvdCBvZiB0aGUgZXZlbnQgbG9nIHRoZSBjYWxsZXIncyByZXBsYXkgbG9hZGVkLCB0b1xuICAgKiBhdHRhY2ggdG8gdGhpcyBzdGVwJ3MgYHN0ZXBfc3RhcnRlZGAgY2xhaW0uIE9uIHRoZSBsYXp5IGlubGluZSBwYXRoIHRoZVxuICAgKiBjbGFpbSBpcyB0aGUgc3RlcCdzIEZJUlNUIGR1cmFibGUgd3JpdGUgKGl0cyBgc3RlcF9jcmVhdGVkYCBpcyBkZWZlcnJlZCksXG4gICAqIHNvIHdpdGhvdXQgdGhpcyB0aGUgY2xhaW0gd291bGQgYnlwYXNzIHRoZSBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IGd1YXJkXG4gICAqIGVudGlyZWx5OiBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBzdGFsZSB2aWV3IGNvdWxkIGNsYWltIOKAlCBhbmQgdGhlbiBjb21taXRcbiAgICog4oCUIGEgc3RlcCBzY2hlZHVsZWQgd2l0aG91dCBvYnNlcnZpbmcgYW4gZXZlbnQgaXQgbmV2ZXIgbG9hZGVkLiBBXG4gICAqIGd1YXJkLWVuZm9yY2luZyBXb3JsZCByZWplY3RzIGEgc3RhbGUgY2xhaW0gd2l0aCBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgXG4gICAqICg0MTIpOyBleGVjdXRlU3RlcCBkb2VzIE5PVCB0cmFuc2xhdGUgdGhhdCByZWplY3Rpb24gKHJlLWNsYWltaW5nIGluIHBsYWNlXG4gICAqIHdvdWxkIHN0aWxsIGNvbW1pdCB0aGUgc3RhbGUgc2NoZWR1bGUpLCBzbyBpdCBwcm9wYWdhdGVzIGZvciB0aGUgY2FsbGVyIHRvXG4gICAqIGFiYW5kb24gdGhlIGJhdGNoIGFuZCByZXN0YXJ0IGl0cyByZXBsYXkuIFVuZGVmaW5lZCB3aGVuIHRoZSBndWFyZCBpc1xuICAgKiBkaXNhYmxlZCBvciB0aGUgY2FsbGVyIGhhcyBubyBzbmFwc2hvdDsgV29ybGRzIHRoYXQgZG9uJ3QgZW5mb3JjZSB0aGUgZ3VhcmRcbiAgICogaWdub3JlIGl0LlxuICAgKi9cbiAgcHJlY29uZGl0aW9uU25hcHNob3Q/OiBQcmVjb25kaXRpb25TbmFwc2hvdFBhcmFtcztcbiAgLyoqXG4gICAqIFN1cHByZXNzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzIHN0ZXAgcmVnYXJkbGVzcyBvZlxuICAgKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgIC8gYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YDogdGFrZSB0aGVcbiAgICogYXdhaXQtdGhlbi1ydW4gcGF0aCBzbyB0aGUgYm9keSBvbmx5IHJ1bnMgYWZ0ZXIgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNsYWltXG4gICAqIHN1Y2NlZWRzLiBTZXQgYnkgdGhlIHJ1bnRpbWUgZm9yIGd1YXJkLWVuZm9yY2VkIGJhdGNoZXMgdGhhdCBhcmVcbiAgICogc3RhbGUtc2Vuc2l0aXZlIChhbiBvcGVuIGhvb2sgbWVhbnMgYW4gb3V0LW9mLWJhbmQgZXZlbnQgY2FuIG1ha2UgdGhlXG4gICAqIHNjaGVkdWxpbmcgdmlldyBzdGFsZSk6IHRoZSBndWFyZCdzIDQxMiBmZW5jZSBjYW4gcmVqZWN0IGEgc3RhbGUgY2xhaW0nc1xuICAgKiBkdXJhYmxlIHdyaXRlcywgYnV0IGl0IGNhbm5vdCB1bi1ydW4gYSBib2R5IHRoYXQgb3B0aW1pc3RpYyBzdGFydCBiZWdhblxuICAgKiBiZWZvcmUgdGhlIGNsYWltIHNldHRsZWQg4oCUIGF3YWl0aW5nIHRoZSBjbGFpbSBleHRlbmRzIHRoZSBmZW5jZSB0byB1c2VyXG4gICAqIGNvZGUuIFdpbnMgb3ZlciBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIGFuZCB0aGUgZW52IGZsYWcuXG4gICAqL1xuICBzdXBwcmVzc09wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCByZWdhcmRsZXNzIG9mXG4gICAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAuIFNldCBieSB0dXJibyBtb2RlIG9uIHRoZSBmaXJzdCBkZWxpdmVyeVxuICAgKiBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgZm9yY2luZyBpdCBpcyBzYWZlOiB0aGVyZSBpcyBubyBjb25jdXJyZW50XG4gICAqIHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0sIHNvIHRoZSBib2R5IHJ1bnMgZXhhY3RseSBvbmNlLiBPbmx5XG4gICAqIG1lYW5pbmdmdWwgdG9nZXRoZXIgd2l0aCBgbGF6eVN0ZXBJbnB1dGAgKGEgYnJhbmQtbmV3IGxhenkgc3RlcCkuXG4gICAqL1xuICBmb3JjZU9wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gc2V0LCB0aGUgbGF6eS9vcHRpbWlzdGljIGBzdGVwX3N0YXJ0ZWRgIGlzXG4gICAqIGNoYWluZWQgb24gaXQgc28gdGhlIHN0ZXAgaXMgbmV2ZXIgY3JlYXRlZCBiZWZvcmUgaXRzIHJ1biBleGlzdHMuIFRoZSBib2R5XG4gICAqIHN0aWxsIHJ1bnMgaW1tZWRpYXRlbHkgYWdhaW5zdCBsb2NhbGx5LXN5bnRoZXNpemVkIHN0YXRlIOKAlCBvbmx5IHRoZSBuZXR3b3JrXG4gICAqIHdyaXRlIHdhaXRzIOKAlCBzbyB0aGUgYHJ1bl9zdGFydGVkYCByb3VuZC10cmlwIG92ZXJsYXBzIHRoZSBib2R5LiBgdW5kZWZpbmVkYFxuICAgKiBvdXRzaWRlIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIHdhcyBhbHJlYWR5IGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xuICAvKipcbiAgICogTGF0ZW5jeSB0ZWxlbWV0cnkgKFRURlMgLyBTVFNPKTogZWxpZ2liaWxpdHkgYW5kIGFuY2hvciB0aW1lc3RhbXBzIGRlY2lkZWRcbiAgICogYnkgdGhlIG9yY2hlc3RyYXRvci4gV2hlbiBzZXQsIHRoaXMgZXhlY3V0b3IgY29tcHV0ZXMgdGhlIGZpbmFsIHZhbHVlc1xuICAgKiBhZ2FpbnN0IHRoZSB3YWxsIGNsb2NrIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIGNvZGUgcnVucyBhbmRcbiAgICogYXR0YWNoZXMgdGhlbSB0byB0aGUgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LiBTZXQgb25seSBmb3IgdGhlIGZpcnN0IHN0ZXAgb2ZcbiAgICogYW4gaW5saW5lIGJhdGNoLCBhbmQgb25seSBvbiBmaXJzdC1hdHRlbXB0IGV4ZWN1dGlvbnMgdGhhdCBxdWFsaWZ5IOKAlCBzZWVcbiAgICogcnVudGltZS9zdGVwLWxhdGVuY3kudHMuXG4gICAqL1xuICBsYXRlbmN5VHJhY2tpbmc/OiBTdGVwTGF0ZW5jeVRyYWNraW5nO1xuICAvKipcbiAgICogQXV0aG9yaXRhdGl2ZSBhdHRlbXB0IG51bWJlciBmb3IgdGhpcyBleGVjdXRpb24sIHVzZWQgdG8gYm91bmQgcmV0cmllc1xuICAgKiBhZ2FpbnN0IGBtYXhSZXRyaWVzYCBCRUZPUkUgdGhlIGJvZHkgcnVucy4gSW4gb3JkZXIgdG8gYWxzbyBjYXRjaFxuICAgKiBzdGVwIHRpbWVvdXRzICh3aGljaCB3ZSBjYW4ndCBoYXZlIGNhdGNoIGhhbmRsZXJzIGZvciksIHdlIGRldGVybWluZVxuICAgKiB0aGUgYXR0ZW1wdCBjb3VudCBiYXNlZCBhcyBmb2xsb3dzOlxuICAgKiAtIElubGluZSAoY29tYmluZWQgaGFuZGxlcik6IHRoZSBudW1iZXIgb2YgYHN0ZXBfc3RhcnRlZGAgZXZlbnRzIGFscmVhZHlcbiAgICogICBpbiB0aGUgZXZlbnQgbG9nIGZvciB0aGlzIHN0ZXAsIHBsdXMgb25lIGZvciB0aGUgYXR0ZW1wdCBhYm91dCB0byBydW4uXG4gICAqIC0gQmFja2dyb3VuZCAocXVldWUtZGlzcGF0Y2hlZCk6IHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudFxuICAgKiAgIChgbWV0YWRhdGEuYXR0ZW1wdGApLCB3aGljaCBpbmNyZW1lbnRzIG9uIGV2ZXJ5IHJlZGVsaXZlcnkuXG4gICAqL1xuICBhdXRob3JpdGF0aXZlQXR0ZW1wdD86IG51bWJlcjtcbiAgLyoqIE9uZS1zaG90IHJlY292ZXJ5IHRlbGVtZXRyeSBhY3RpdmF0ZWQgYnkgdGhlIG9yY2hlc3RyYXRvciByZXBsYXkuICovXG4gIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXI/OiBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyO1xufVxuXG4vKipcbiAqIElubGluZS1kZWx0YSByZXR1cm5lZCBieSBhIHN0ZXAtdGVybWluYWwgd3JpdGUgd2hlbiB0aGUgY2FsbGVyIHBhc3NlZFxuICoge0BsaW5rIFN0ZXBFeGVjdXRvclBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yfSBhbmQgdGhlIFdvcmxkIHN1cHBvcnRzXG4gKiB0aGUgb3B0aW1pemF0aW9uLiBgZXZlbnRzYCBhcmUgdGhlIGV2ZW50cyB3cml0dGVuIHN0cmljdGx5IGFmdGVyIHRoYXRcbiAqIGN1cnNvciAodGhpcyBzdGVwJ3MgZXZlbnRzIHBsdXMgYW55dGhpbmcgaW50ZXJsZWF2ZWQgaW4tYmFuZCksIGBjdXJzb3JgXG4gKiBpcyB0aGUgcG9zaXRpb24gcGFzdCB0aGUgbGFzdCBvbmUsIGFuZCBgaGFzTW9yZWAgc2lnbmFscyBhIGZ1cnRoZXIgcGFnZVxuICogKHRoZSBjYWxsZXIgdGhlbiBmYWxscyBiYWNrIHRvIGEgZnVsbCBpbmNyZW1lbnRhbCBmZXRjaCkuIEFic2VudCB3aGVuXG4gKiB0aGUgV29ybGQgZGlkIG5vdCByZXR1cm4gYSBkZWx0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVFdmVudERlbHRhIHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gIGhhc01vcmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgc3RlcCBleGVjdXRpb24gYXR0ZW1wdC4gVGhlIGNhbGxlciBkZWNpZGVzIHdoYXQgdG8gZG9cbiAqIGJhc2VkIG9uIHRoZSByZXN1bHQgdHlwZSAoZS5nLiwgcXVldWUgd29ya2Zsb3cgY29udGludWF0aW9uLCByZXBsYXkgaW5saW5lLCBldGMuKS5cbiAqXG4gKiBgaW5saW5lRGVsdGFgIGlzIGF0dGFjaGVkIHRvIGEgYGNvbXBsZXRlZGAgcmVzdWx0IHdoZW4gdGhlIGNhbGxlclxuICogcmVxdWVzdGVkIGl0IHZpYSB7QGxpbmsgU3RlcEV4ZWN1dG9yUGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3J9IGFuZFxuICogdGhlIFdvcmxkIHJldHVybmVkIG9uZS4gU3RlcCBmYWlsdXJlcyBhcmUgcmFyZSBhbmQgbm90IHRoZSBpbmxpbmVcbiAqIG9wdGltaXphdGlvbidzIHRhcmdldCwgc28gdGhlIGBmYWlsZWRgIHBhdGggbGVhdmVzIGl0IHRvIHRoZSBub3JtYWxcbiAqIGluY3JlbWVudGFsIGZldGNoLlxuICovXG5leHBvcnQgdHlwZSBTdGVwRXhlY3V0aW9uUmVzdWx0ID1cbiAgfCB7XG4gICAgICB0eXBlOiAnY29tcGxldGVkJztcbiAgICAgIGhhc1BlbmRpbmdPcHM/OiBib29sZWFuO1xuICAgICAgaW5saW5lRGVsdGE/OiBJbmxpbmVFdmVudERlbHRhO1xuICAgIH1cbiAgfCB7IHR5cGU6ICdmYWlsZWQnIH1cbiAgfCB7IHR5cGU6ICdyZXRyeSc7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfVxuICB8IHsgdHlwZTogJ3NraXBwZWQnIH1cbiAgfCB7IHR5cGU6ICdnb25lJyB9XG4gIHwgeyB0eXBlOiAndGhyb3R0bGVkJzsgdGltZW91dFNlY29uZHM6IG51bWJlciB9O1xuXG4vKipcbiAqIEV4ZWN1dGVzIGEgc2luZ2xlIHN0ZXA6IGNyZWF0ZXMgc3RlcF9zdGFydGVkIGV2ZW50LCBoeWRyYXRlcyBpbnB1dCxcbiAqIHJ1bnMgdGhlIHN0ZXAgZnVuY3Rpb24sIGNyZWF0ZXMgc3RlcF9jb21wbGV0ZWQvc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZyBldmVudHMuXG4gKlxuICogRG9lcyBOT1QgcXVldWUgd29ya2Zsb3cgY29udGludWF0aW9uIG1lc3NhZ2VzIOKAlCB0aGUgY2FsbGVyIGRlY2lkZXMgd2hhdCB0byBkbyBuZXh0LlxuICogVXNlZCBieSB0aGUgY29tYmluZWQgd29ya2Zsb3cgaGFuZGxlciBmb3Igc3RlcCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlU3RlcChcbiAgcGFyYW1zOiBTdGVwRXhlY3V0b3JQYXJhbXNcbik6IFByb21pc2U8U3RlcEV4ZWN1dGlvblJlc3VsdD4ge1xuICBjb25zdCB7XG4gICAgd29ybGQsXG4gICAgd29ya2Zsb3dSdW5JZCxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgc3RlcElkLFxuICAgIHN0ZXBOYW1lLFxuICB9ID0gcGFyYW1zO1xuICAvLyBUcnV0aGluZXNzLCBub3QgcHJlc2VuY2U6IGB2ZXJjZWwgZW52IHB1bGxgIHdyaXRlcyBgVkVSQ0VMX1VSTD1cIlwiYCBpbnRvXG4gIC8vIGAuZW52LmxvY2FsYCwgYW5kIGEgZnJhbWV3b3JrIHRoYXQgbG9hZHMgdGhhdCBmaWxlIGxvY2FsbHkgd291bGQgb3RoZXJ3aXNlXG4gIC8vIHB1dCB1cyBvbiB0aGUgVmVyY2VsIGJyYW5jaCB3aXRoIG5vdGhpbmcgdG8gYnVpbGQgYSBob3N0IGZyb20sIG1ha2luZ1xuICAvLyBgaHR0cHM6Ly9gIHRoZSBiYXNlIFVSTCBvZiBldmVyeSBzdGVwLlxuICBjb25zdCBpc1ZlcmNlbCA9IEJvb2xlYW4ocHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCk7XG4gIC8vIEdhdGUgcGF5bG9hZCBjb21wcmVzc2lvbiBvbiB0aGUgcnVuJ3Mgc3BlY1ZlcnNpb24uXG4gIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAocGFyYW1zLnJ1blNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTjtcbiAgY29uc3QgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA9XG4gICAgcGFyYW1zLnJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPz8gUmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5pbmVydCgpO1xuICBjb25zdCBjcmVhdGVFdmVudDogRXZlbnRDcmVhdG9yID0gKGRhdGEsIGV2ZW50UGFyYW1zKSA9PlxuICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIud2l0aEV2ZW50Q3JlYXRlKGV2ZW50UGFyYW1zLCAocCkgPT5cbiAgICAgIHdvcmxkLmV2ZW50cy5jcmVhdGUod29ya2Zsb3dSdW5JZCwgZGF0YSwgcClcbiAgICApO1xuXG4gIGNvbnN0IHNwYW5OYW1lID0gYHN0ZXAuZXhlY3V0ZSAke3N0ZXBEaXNwbGF5TmFtZShzdGVwTmFtZSl9YDtcbiAgcmV0dXJuIHRyYWNlKHNwYW5OYW1lLCB7fSwgYXN5bmMgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZShzdGVwTmFtZSksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZCh3b3JrZmxvd1J1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwSWQoc3RlcElkKSxcbiAgICB9KTtcblxuICAgIC8vIE1lbW9pemVkIGFjY2Vzc29yIGZvciB0aGUgcGVyLXJ1biBlbmNyeXB0aW9uIGtleS4gVGhlIGZpcnN0IGNhbGxlclxuICAgIC8vIChpbnB1dCBoeWRyYXRpb24gb24gdGhlIHN1Y2Nlc3MgcGF0aCwgb3Igb25lIG9mIHRoZSBlYXJseS1yZXR1cm5cbiAgICAvLyBkZWh5ZHJhdGVTdGVwRXJyb3IgcGF0aHMgaWYgc3RlcF9zdGFydGVkIGZhaWxzKSB0cmlnZ2VycyB0aGUgYWN0dWFsXG4gICAgLy8gZmV0Y2ggLyBIS0RGIGRlcml2YXRpb247IHN1YnNlcXVlbnQgY2FsbGVycyBhd2FpdCB0aGUgY2FjaGVkIHByb21pc2UuXG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1bklkKTtcblxuICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwTmFtZSk7XG4gICAgaWYgKCFzdGVwRm4gfHwgdHlwZW9mIHN0ZXBGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCDigJQgZmFpbCB0aGUgc3RlcCBpbW1lZGlhdGVseSAobm90IHRoZSBydW4pLlxuICAgICAgLy8gQ3JlYXRlIGEgc3RlcF9mYWlsZWQgZXZlbnQgc29cbiAgICAgIC8vIHRoZSB3b3JrZmxvdyBjYW4gaGFuZGxlIGl0IGdyYWNlZnVsbHkgdmlhIHRyeS9jYXRjaCBpbiB1c2VyIGNvZGUuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgZGVwbG95bWVudC4gVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIGJ1aWxkIG9yIGJ1bmRsaW5nIGlzc3VlIHRoYXQgY2F1c2VkIHRoZSBzdGVwIHRvIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgZGVwbG95bWVudC5gO1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgc3RlcElkLFxuICAgICAgfSk7XG4gICAgICAvLyBPbiB0aGUgbGF6eSBpbmxpbmUgcGF0aCB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoaXMgc3RlcCdzXG4gICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgZXhwZWN0aW5nIGV4ZWN1dGVTdGVwIHRvIG1hdGVyaWFsaXplIHRoZSBzdGVwIHZpYSBhXG4gICAgICAvLyBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGNhcnJ5aW5nIGl0cyBpbnB1dC4gV2UgbmV2ZXIgZ2V0IHRoYXQgZmFyIGZvciBhblxuICAgICAgLy8gdW5yZWdpc3RlcmVkIHN0ZXAsIHNvIHRoZSBzdGVwIGVudGl0eSBkb2VzIG5vdCBleGlzdCB5ZXQg4oCUIHdyaXRpbmdcbiAgICAgIC8vIGBzdGVwX2ZhaWxlZGAgc3RyYWlnaHQgYXdheSB3b3VsZCBoaXQgdGhlIHdvcmxkJ3MgXCJzdGVwIG11c3QgZXhpc3RcIlxuICAgICAgLy8gb3JkZXJpbmcgZ3VhcmQgYW5kIHdlZGdlIHRoZSBydW4uIFNlbmQgdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgZmlyc3RcbiAgICAgIC8vIChpdCBjcmVhdGVzIHRoZSBzdGVwICsgc3ludGhldGljIGBzdGVwX2NyZWF0ZWRgIGF0b21pY2FsbHkgYW5kIGtlZXBzXG4gICAgICAvLyByZXBsYXkgY29ycmVjdCksIHRoZW4gZmFpbCBpdCBiZWxvdy4gVGhpcyBhbHNvIHByZXNlcnZlcyB0aGVcbiAgICAgIC8vIGV4YWN0bHktb25lLW93bmVyIGd1YXJhbnRlZTogYSBjb25jdXJyZW50IGhhbmRsZXIgdGhhdCB3b24gdGhlIGNyZWF0ZVxuICAgICAgLy8gbWFrZXMgb3VyIGxhenkgYHN0ZXBfc3RhcnRlZGAgcmVqZWN0IHdpdGggRW50aXR5Q29uZmxpY3RFcnJvciDihpIgd2VcbiAgICAgIC8vIHJldHVybiBgc2tpcHBlZGAgYW5kIG5ldmVyIHdyaXRlIHRoZSBmYWlsdXJlIHR3aWNlLlxuICAgICAgaWYgKHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUdXJibzogdGhpcyBsYXp5IGBzdGVwX3N0YXJ0ZWRgIG11c3Qgbm90IHByZWNlZGUgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAuIE9yZGVyIGl0IGFmdGVyIHRoZSBydW4tcmVhZHkgYmFycmllciAoYmVzdC1lZmZvcnQg4oCUXG4gICAgICAgICAgLy8gYSBiYXJyaWVyIHJlamVjdGlvbiBtZWFucyB0aGUgcnVuIGRvZXNuJ3QgZXhpc3QsIGFuZCB0aGUgY3JlYXRlXG4gICAgICAgICAgLy8gYmVsb3cgc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IpLiBOby1vcCBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgIGlmIChwYXJhbXMucnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICBhd2FpdCBwYXJhbXMucnVuUmVhZHlCYXJyaWVyLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgIC8vIFN0YW1wZWQgZm9yIGNvbnNpc3RlbmN5IGV2ZW4gdGhvdWdoIHRoaXMgc3RlcCB0ZXJtaW5hbC1mYWlsc1xuICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJlbG93IOKAlCB0aGUgbG9nIHNob3VsZCBuZXZlciBzaG93IGFuIHVub3duZWRcbiAgICAgICAgICAgICAgICAvLyBsYXp5IHN0YXJ0LlxuICAgICAgICAgICAgICAgIC4uLihwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoc3RhcnRFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGFydEVycikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKHN0YXJ0RXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHN0YXJ0RXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICB9XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEZhdGFsRXJyb3IodHJ1ZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWF4UmV0cmllcyA9IHN0ZXBGbi5tYXhSZXRyaWVzID8/IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBNYXhSZXRyaWVzKG1heFJldHJpZXMpLFxuICAgIH0pO1xuXG4gICAgLy8gbWF4UmV0cmllcyBlbmZvcmNlZCBiZWZvcmUgc3RhcnRpbmcgYW5vdGhlciBhdHRlbXB0LiBUaW1lb3V0cyBjYW4ga2lsbFxuICAgIC8vIGEgc3RlcCBleGVjdXRpb24gd2l0aG91dCBhbnkgd2F5IHRvIGNhdGNoIHRoZSBlcnJvciwgc28gdGhlIHBvc3QtYm9keS9lcnJvclxuICAgIC8vIGd1YXJkcyBiZWxvdyBtaWdodCBtaXNzIGl0LiBIZW5jZSwgd2UgdXNlIGBhdXRob3JpdGF0aXZlQXR0ZW1wdGAgY291bnRcbiAgICAvLyBhcyBhbiBhZGRpdGlvbmFsIGd1YXJkIGJhc2VkIG9uIHN0ZXBfc3RhcnRlZCBjb3VudCBvciBxdWV1ZSBkZWxpdmVyeSBjb3VudFxuICAgIC8vIG9uIGJhY2tncm91bmRlZCBzdGVwcy5cbiAgICAvLyBUaHJvd24tZXJyb3IgZXhoYXVzdGlvbiBzdGlsbCB0ZXJtaW5hdGVzIG9uZSBhdHRlbXB0IGVhcmxpZXIgdmlhIHRoZSBwb3N0LWJvZHlcbiAgICAvLyBndWFyZCAod2l0aCB0aGUgdGhyb3duIGVycm9yIGFzIGNhdXNlKSwgYW5kIHRoaXMgY2hlY2sgZG9lcyBub3QgYWZmZWN0IHRoYXQuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmF1dGhvcml0YXRpdmVBdHRlbXB0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5hdXRob3JpdGF0aXZlQXR0ZW1wdCA+IG1heFJldHJpZXMgKyAxXG4gICAgKSB7XG4gICAgICBjb25zdCByZXRyeUNvdW50ID0gbWF4UmV0cmllcztcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwTmFtZX1cIiBleGNlZWRlZCBtYXggcmV0cmllcyAoJHtyZXRyeUNvdW50fSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIHJldHJ5Q291bnQpfSlgO1xuICAgICAgc3RlcExvZ2dlci5lcnJvcignU3RlcCBleGNlZWRlZCBtYXggcmV0cmllcycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgYXR0ZW1wdDogcGFyYW1zLmF1dGhvcml0YXRpdmVBdHRlbXB0LFxuICAgICAgICBtYXhSZXRyaWVzLFxuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIChhIGNvbmN1cnJlbnQgaGFuZGxlciBvciBhblxuICAgICAgICAgIC8vIGVhcmxpZXIgZGVsaXZlcnkgZmFpbGVkL2NvbXBsZXRlZCBpdCkg4oCUIG5vdGhpbmcgdG8gZG8uXG4gICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCBmb3IgZXhjZWVkZWQgcmV0cmllcywgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeUV4aGF1c3RlZCh0cnVlKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICB9XG5cbiAgICAvLyBNYXBzIGEgYHN0ZXBfc3RhcnRlZGAgcmVqZWN0aW9uIHRvIGEgdGVybWluYWwgU3RlcEV4ZWN1dGlvblJlc3VsdCxcbiAgICAvLyBzaGFyZWQgYnkgdGhlIGF3YWl0IHBhdGggKGJlbG93KSBhbmQgdGhlIG9wdGltaXN0aWMtc3RhcnQgcmVjb25jaWxpYXRpb24uXG4gICAgLy8gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgZXJyb3IgaXMgbm90IG9uZSB3ZSB0cmFuc2xhdGUgKGNhbGxlciByZXRocm93cykuXG4gICAgY29uc3Qgc3RhcnRFcnJvclRvUmVzdWx0ID0gKFxuICAgICAgZXJyOiB1bmtub3duXG4gICAgKTogU3RlcEV4ZWN1dGlvblJlc3VsdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBpZiAoVGhyb3R0bGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBNYXRoLm1heChcbiAgICAgICAgICAxLFxuICAgICAgICAgIHR5cGVvZiBlcnIucmV0cnlBZnRlciA9PT0gJ251bWJlcicgPyBlcnIucmV0cnlBZnRlciA6IDFcbiAgICAgICAgKTtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKCdUaHJvdHRsZWQgb24gc3RlcF9zdGFydGVkLCBkZWZlcnJpbmcnLCB7XG4gICAgICAgICAgcmV0cnlBZnRlclNlY29uZHM6IHJldHJ5QWZ0ZXIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAndGhyb3R0bGVkJywgdGltZW91dFNlY29uZHM6IHJldHJ5QWZ0ZXIgfTtcbiAgICAgIH1cbiAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFdvcmtmbG93IHJ1biBcIiR7d29ya2Zsb3dSdW5JZH1cIiBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAgXCIke3N0ZXBJZH1cIjogJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgfVxuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGVwIGluIHRlcm1pbmFsIHN0YXRlLCBza2lwcGluZycsIHtcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9KTtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwcGVkKHRydWUpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU2tpcFJlYXNvbignY29tcGxldGVkJyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmIChUb29FYXJseUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heCgxLCBlcnIucmV0cnlBZnRlciA/PyAxKTtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCByZXRyeUFmdGVyIHRpbWVzdGFtcCBub3QgeWV0IHJlYWNoZWQnLCB7XG4gICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgc3RlcElkLFxuICAgICAgICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3JldHJ5JywgdGltZW91dFNlY29uZHMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIC8vIE9wdGltaXN0aWMgaW5saW5lIHN0YXJ0OiB3aGVuIHdlIGhvbGQgdGhlIHN0ZXAgaW5wdXQgbG9jYWxseSAobGF6eSBpbmxpbmVcbiAgICAvLyBwYXRoKSBhbmQgdGhlIG9wdGltaXphdGlvbiBpcyBlbmFibGVkLCBmaXJlIGBzdGVwX3N0YXJ0ZWRgIFdJVEhPVVRcbiAgICAvLyBhd2FpdGluZyBhbmQgcnVuIHRoZSBib2R5IGFnYWluc3QgbG9jYWxseS1zeW50aGVzaXplZCBzdGF0ZS4gQSBsYXp5IHN0ZXBcbiAgICAvLyBpcyBhbHdheXMgYnJhbmQtbmV3IOKHkiBhdHRlbXB0IDEsIG5vIHByaW9yIGVycm9yLCBzdGFydGVkIG5vdyDigJQgc28gd2VcbiAgICAvLyBkb24ndCBuZWVkIHRoZSBzZXJ2ZXIgcm91bmQtdHJpcCB0byBiZWdpbi4gV2UgcmVjb25jaWxlIHRoZSBpbi1mbGlnaHRcbiAgICAvLyBgc3RlcF9zdGFydGVkYCBiZWZvcmUgYW55IHRlcm1pbmFsIHdyaXRlIChgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0YCk6IGlmXG4gICAgLy8gaXQgbG9zdCB0aGUgYXRvbWljIGNyZWF0ZS1jbGFpbSAoNDA5KSBvciB0aGUgcnVuIGlzIGdvbmUvdGhyb3R0bGVkLCB3ZVxuICAgIC8vIGRpc2NhcmQgdGhlIGJvZHkgcmVzdWx0LiBSdW5uaW5nIHRoZSBib2R5IGJlZm9yZSBjb25maXJtaW5nIG93bmVyc2hpcCBjYW5cbiAgICAvLyBleGVjdXRlIGEgc3RlcCBtb3JlIHRoYW4gb25jZSB3aGVuIGhhbmRsZXJzIHJhY2Ug4oCUIGlubGluZSBzdGVwIGJvZGllc1xuICAgIC8vIG11c3QgYmUgaWRlbXBvdGVudDsgZGlzYWJsZSB2aWEgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ9MC5cbiAgICAvL1xuICAgIC8vIFR1cmJvIG1vZGUgcGFzc2VzIGBmb3JjZU9wdGltaXN0aWNTdGFydGAgdG8gZW5hYmxlIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAvLyBlbnYgZmxhZyAoaXRzIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSByZW1vdmVzIHRoZSByYWNlKS4gQnV0IGl0IHN0aWxsXG4gICAgLy8gZGVmZXJzIHRvIGFuICpleHBsaWNpdCogYFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUPTBgOiBmb3JjZWRcbiAgICAvLyBvcHRpbWlzdGljIHN0YXJ0IHJ1bnMgdGhlIGJvZHkgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgL2BydW5fc3RhcnRlZGAgaXNcbiAgICAvLyBjb25maXJtZWQsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHByb3BlcnR5IGFuIG9wZXJhdG9yIG9wdHMgb3V0IG9mIHdpdGggdGhhdFxuICAgIC8vIGZsYWcsIHNvIGFuIGV4cGxpY2l0IG9wdC1vdXQgd2lucyBvdmVyIHR1cmJvJ3MgZm9yY2UuXG4gICAgY29uc3Qgb3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgIHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIC8vIFN0YWxlLXNlbnNpdGl2ZSBndWFyZGVkIGJhdGNoZXMgYXdhaXQgdGhlIGNsYWltIHNvIHRoZSA0MTIgZmVuY2VcbiAgICAgIC8vIGNvdmVycyB0aGUgYm9keSwgbm90IGp1c3QgZHVyYWJsZSB3cml0ZXMg4oCUIHNlZVxuICAgICAgLy8gU3RlcEV4ZWN1dG9yUGFyYW1zLnN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0LlxuICAgICAgcGFyYW1zLnN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0ICE9PSB0cnVlICYmXG4gICAgICAoaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFbmFibGVkKCkgfHxcbiAgICAgICAgKHBhcmFtcy5mb3JjZU9wdGltaXN0aWNTdGFydCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICFpc09wdGltaXN0aWNJbmxpbmVTdGFydEV4cGxpY2l0bHlEaXNhYmxlZCgpKSk7XG5cbiAgICBsZXQgc3RlcDogU3RlcDtcbiAgICAvLyBQYXJhbXMgZm9yIHRoZSBgc3RlcF9zdGFydGVkYCBjcmVhdGUgb24gZWl0aGVyIHBhdGggYmVsb3c6IHRoZSBhbWJpZW50XG4gICAgLy8gY29tcHV0ZS1pbnN0YW5jZSBzdGFtcCBwbHVzIHRoZSBvcHRpbWlzdGljLWNvbmN1cnJlbmN5IGNsYWltIGd1YXJkLlxuICAgIGNvbnN0IHN0YXJ0RXZlbnRQYXJhbXM6IENyZWF0ZUV2ZW50UGFyYW1zID0ge1xuICAgICAgY29tcHV0ZUluc3RhbmNlSWQ6IENPTVBVVEVfSU5TVEFOQ0VfSUQsXG4gICAgICAvLyBTcHJlYWQgYXMgYSB1bml0OiB0aGUgdGhyZWUgc25hcHNob3QgZmllbGRzIGRlc2NyaWJlIG9uZSBzbmFwc2hvdCBhbmRcbiAgICAgIC8vIG11c3QgdHJhdmVsIHRvZ2V0aGVyIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLnByZWNvbmRpdGlvblNuYXBzaG90LlxuICAgICAgLi4ucGFyYW1zLnByZWNvbmRpdGlvblNuYXBzaG90LFxuICAgIH07XG4gICAgLy8gYERhdGUubm93KClgIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgYHN0ZXBfc3RhcnRlZGAgY3JlYXRlIGlzXG4gICAgLy8gaXNzdWVkIChlaXRoZXIgcGF0aCBiZWxvdykg4oCUIGFuY2hvcnMgUlNGUydzIGVuZCBwb2ludC4gU2VlXG4gICAgLy8gU3RlcExhdGVuY3lFdmVudERhdGEucnNmcyBhbmQgdGhlIGNhbGwgc2l0ZXMgYmVsb3cuXG4gICAgbGV0IHN0ZXBTdGFydFBvc3RTZW50QXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFNldHRsZWQgb3V0Y29tZSBvZiB0aGUgaW4tZmxpZ2h0IG9wdGltaXN0aWMgYHN0ZXBfc3RhcnRlZGAuIEhhbmRsZXJzIGFyZVxuICAgIC8vIGF0dGFjaGVkIHN5bmNocm9ub3VzbHkgKGAudGhlbihvaywgZXJyKWApIHNvIGEgZmFzdCByZWplY3Rpb24gbmV2ZXJcbiAgICAvLyBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gd2hpbGUgdGhlIGJvZHkgcnVucy5cbiAgICBsZXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDpcbiAgICAgIHwgUHJvbWlzZTx7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZTsgZXJyOiB1bmtub3duIH0+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICAvLyBBd2FpdCB0aGUgb3B0aW1pc3RpYyBgc3RlcF9zdGFydGVkYCBvdXRjb21lIGFuZCB0cmFuc2xhdGUgYSBsb3N0IHJhY2UgL1xuICAgIC8vIHRlcm1pbmFsIHJ1biAvIHRocm90dGxlIGludG8gYSByZXN1bHQgdGhhdCBzaG9ydC1jaXJjdWl0cyB0aGUgYm9keVxuICAgIC8vIG91dHB1dC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB3ZSBvd24gdGhlIHN0ZXAgYW5kIG1heSB3cml0ZSBpdHMgdGVybWluYWxcbiAgICAvLyBldmVudC4gQSBub24tdHJhbnNsYXRhYmxlIHJlamVjdGlvbiBpcyByZXRocm93biAoc28gYSB0cmFuc2llbnRcbiAgICAvLyBzdGVwX3N0YXJ0ZWQgZmFpbHVyZSBwcm9wYWdhdGVzIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZWRlbGl2ZXJ5LFxuICAgIC8vIGV4YWN0bHkgYXMgb24gdGhlIGF3YWl0IHBhdGgpLiBJZGVtcG90ZW50IOKAlCBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuIG9uY2UuXG4gICAgY29uc3QgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0ID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdGVwRXhlY3V0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIW9wdGltaXN0aWNTdGFydFNldHRsZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDtcbiAgICAgIGlmIChzZXR0bGVkLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KHNldHRsZWQuZXJyKTtcbiAgICAgIGlmICghbWFwcGVkKSB0aHJvdyBzZXR0bGVkLmVycjtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfTtcblxuICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgIC8vIENoYWluIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIG9uIHRoZSBydW4tcmVhZHkgYmFycmllciAodHVyYm8gbW9kZSk6XG4gICAgICAvLyB0aGUgc3RlcCBjYW4ndCBiZSBjcmVhdGVkIGJlZm9yZSBpdHMgcnVuIGV4aXN0cywgYnV0IHRoZSBib2R5IGJlbG93XG4gICAgICAvLyBydW5zIGltbWVkaWF0ZWx5IGFnYWluc3Qgc3ludGhlc2l6ZWQgc3RhdGUsIHNvIHRoZSBgcnVuX3N0YXJ0ZWRgXG4gICAgICAvLyByb3VuZC10cmlwIG92ZXJsYXBzIHRoZSBib2R5IHJhdGhlciB0aGFuIGJsb2NraW5nIGl0LiBPdXRzaWRlIHR1cmJvIHRoZVxuICAgICAgLy8gYmFycmllciBpcyB1bmRlZmluZWQgYW5kIHRoaXMgaXMgYSBwbGFpbiBjcmVhdGUuXG4gICAgICBjb25zdCBzdGFydGVkUHJvbWlzZSA9IChwYXJhbXMucnVuUmVhZHlCYXJyaWVyID8/IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gVGFrZW4gcmlnaHQgYmVmb3JlIHRoZSBjcmVhdGUgZmlyZXMsIG5vdCBiZWZvcmUgdGhlIGJhcnJpZXIg4oCUXG4gICAgICAgICAgLy8gUlNGUyBtZWFzdXJlcyB0aGUgcnVuX3N0YXJ0ZWQtdG8tUE9TVCBzdHJldGNoLCBhbmQgdGhlIGJhcnJpZXJcbiAgICAgICAgICAvLyB3YWl0IElTIHBhcnQgb2YgdGhhdCBzdHJldGNoIHVuZGVyIHR1cmJvLlxuICAgICAgICAgIHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIHN0YW1wIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLm93bmVyTWVzc2FnZUlkLlxuICAgICAgICAgICAgICAgIC4uLihwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gR3VhcmQgdGhlIGNsYWltIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLnByZWNvbmRpdGlvblNuYXBzaG90LiBBXG4gICAgICAgICAgICAvLyBzdGFsZSAoNDEyKSByZWplY3Rpb24gc3VyZmFjZXMgdmlhIHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCBhcyBhXG4gICAgICAgICAgICAvLyBub24tdHJhbnNsYXRhYmxlIGVycm9yOiB0aGUgYm9keSByZXN1bHQgaXMgZGlzY2FyZGVkIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIHJlamVjdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICBzdGFydEV2ZW50UGFyYW1zXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIG9wdGltaXN0aWNTdGFydFNldHRsZWQgPSBzdGFydGVkUHJvbWlzZS50aGVuKFxuICAgICAgICAoKSA9PiAoeyBvazogdHJ1ZSBhcyBjb25zdCB9KSxcbiAgICAgICAgKGVycikgPT4gKHsgb2s6IGZhbHNlIGFzIGNvbnN0LCBlcnIgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgc3RlcCA9IHtcbiAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICBpbnB1dDogcGFyYW1zLmxhenlTdGVwSW5wdXQsXG4gICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzdGVwX3N0YXJ0ZWQgdmFsaWRhdGVzIHN0YXRlIGFuZCByZXR1cm5zIHRoZSBzdGVwIGVudGl0eS4gT24gdGhlIGxhenlcbiAgICAgIC8vIGlubGluZSBwYXRoIHdlIGFsc28gY2FycnkgdGhlIHN0ZXAgYGlucHV0YCBzbyB0aGUgd29ybGQgY3JlYXRlcyB0aGVcbiAgICAgIC8vIHN0ZXAgb24gdGhlIGZseSAobm8gc2VwYXJhdGUgc3RlcF9jcmVhdGVkIHJvdW5kLXRyaXApLiBUaGUgd29ybGQnc1xuICAgICAgLy8gYXRvbWljIGNyZWF0ZS1jbGFpbSBtYWtlcyB0aGlzIGV4YWN0bHktb25lLW93bmVyOiBhIGNvbmN1cnJlbnQgbG9zZXJcbiAgICAgIC8vIGdldHMgRW50aXR5Q29uZmxpY3RFcnJvciwgbWFwcGVkIHRvIGB7IHR5cGU6ICdza2lwcGVkJyB9YCwgc28gaXQgbmV2ZXJcbiAgICAgIC8vIHJ1bnMgdGhlIGJvZHkuIFdoZW4gYGxhenlTdGVwSW5wdXRgIGlzIGFic2VudCB0aGlzIGlzIHRoZSBsZWdhY3lcbiAgICAgIC8vIHN0ZXBfc3RhcnRlZCAoc3RlcCBhbHJlYWR5IGNyZWF0ZWQsIG5vIHBheWxvYWQpLlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW5saW5lLW93bmVyc2hpcCBzdGFtcDogcHJlc2VudCBvbiB0aGUgbGF6eSBwYXRocyBBTkQgb24gdGhlXG4gICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHBheWxvYWQtbGVzcyBzdGFydCAoYSByZWRlbGl2ZXJ5IG9mIHRoZSBvd25pbmdcbiAgICAgICAgLy8gbWVzc2FnZSByZS1leGVjdXRpbmcgaXRzIHN0ZXAgbXVzdCByZS1zdGFtcCDigJQgb3duZXJzaGlwIGRlcml2ZXNcbiAgICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHN0YXJ0LCBzbyBhbiB1bnN0YW1wZWQgcmVjb3Zlcnkgc3RhcnQgd291bGQgcmVhZFxuICAgICAgICAvLyBhcyBcInVub3duZWRcIiB0byBhIGxhdGVyIHdha2UpLiBPbmx5IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aFxuICAgICAgICAvLyBwYXNzZXMgbm8gb3duZXJNZXNzYWdlSWQ6IGl0cyBzdGFydCBpcyB0aGUgYmFyZSBvbmUsIGNsZWFyaW5nXG4gICAgICAgIC8vIG93bmVyc2hpcCBhcyBpbnRlbmRlZC5cbiAgICAgICAgY29uc3Qgb3duZXJzaGlwU3RhbXAgPVxuICAgICAgICAgIHBhcmFtcy5vd25lck1lc3NhZ2VJZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgb3duZXJNZXNzYWdlSWQ6IHBhcmFtcy5vd25lck1lc3NhZ2VJZCB9XG4gICAgICAgICAgICA6IHt9O1xuICAgICAgICBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBzdGFydFJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICBldmVudERhdGE6XG4gICAgICAgICAgICAgIHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICAgICAgICAgICAgICAuLi5vd25lcnNoaXBTdGFtcCxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHsgc3RlcE5hbWUsIC4uLm93bmVyc2hpcFN0YW1wIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBHdWFyZCB0aGUgY2xhaW0g4oCUIHNlZSBTdGVwRXhlY3V0b3JQYXJhbXMucHJlY29uZGl0aW9uU25hcHNob3QuIEFcbiAgICAgICAgICAvLyBzdGFsZSAoNDEyKSByZWplY3Rpb24gaXMgaW50ZW50aW9uYWxseSBOT1QgdHJhbnNsYXRlZCBieVxuICAgICAgICAgIC8vIHN0YXJ0RXJyb3JUb1Jlc3VsdCBiZWxvdywgc28gaXQgcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyIGZvciBhXG4gICAgICAgICAgLy8gZnJlc2ggcmVwbGF5LlxuICAgICAgICAgIHN0YXJ0RXZlbnRQYXJhbXNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXN0YXJ0UmVzdWx0LnN0ZXApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgc3RlcF9zdGFydGVkIGV2ZW50IGZvciBcIiR7c3RlcElkfVwiIGRpZCBub3QgcmV0dXJuIHN0ZXAgZW50aXR5YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc3RlcCA9IHN0YXJ0UmVzdWx0LnN0ZXA7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KGVycik7XG4gICAgICAgIGlmIChtYXBwZWQpIHJldHVybiBtYXBwZWQ7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGVwIGV4ZWN1dGlvbiBkZXRhaWxzJywge1xuICAgICAgc3RlcE5hbWUsXG4gICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgIGF0dGVtcHQ6IHN0ZXAuYXR0ZW1wdCxcbiAgICB9KTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoc3RlcC5zdGF0dXMpLFxuICAgIH0pO1xuXG4gICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgIC8vIENoZWNrIG1heCByZXRyaWVzIEFGVEVSIHN0ZXBfc3RhcnRlZCAoYXR0ZW1wdCB3YXMganVzdCBpbmNyZW1lbnRlZCkuXG4gICAgLy8gT25seSBlbmZvcmNlIHdoZW4gdGhlIHN0ZXAgaGFzIGEgcHJldmlvdXMgZXJyb3Ig4oCUIHRoaXMgZGlzdGluZ3Vpc2hlc1xuICAgIC8vIGFjdHVhbCByZXRyaWVzIChmYWlsZWQg4oaSIHJldHJ5KSBmcm9tIGNvbmN1cnJlbnQgaW5saW5lIHN0YXJ0c1xuICAgIC8vIGV4ZWN1dGlvbiBsb29wIGNhbiBjYXVzZSBtdWx0aXBsZSBoYW5kbGVycyB0byBzdGVwX3N0YXJ0ZWQgdGhlIHNhbWVcbiAgICAvLyBzdGVwIHNpbXVsdGFuZW91c2x5LCBpbmZsYXRpbmcgdGhlIGF0dGVtcHQgY291bnRlciB3aXRob3V0IGFueSBmYWlsdXJlKS5cbiAgICBpZiAoc3RlcC5hdHRlbXB0ID4gbWF4UmV0cmllcyArIDEgJiYgc3RlcC5lcnJvcikge1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ1N0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICByZXRyeUNvdW50LFxuICAgICAgfSk7XG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpb3IgYXR0ZW1wdCdzIHNlcmlhbGl6ZWQgZXJyb3IgYXMgdGhlIGNhdXNlIHNvIHRoZVxuICAgICAgLy8gdW5kZXJseWluZyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlIGZyb20gYHN0ZXAuZXJyb3IuY2F1c2VgIGFmdGVyXG4gICAgICAvLyBoeWRyYXRpb24sIHdpdGhvdXQgZm9yY2luZyBjb25zdW1lcnMgdG8gd2FsayB0aGUgc3RlcF9yZXRyeWluZ1xuICAgICAgLy8gZXZlbnQgaGlzdG9yeS4gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBvZiB0aGUgcHJpb3IgYHN0ZXAuZXJyb3JgXG4gICAgICAvLyB0aHJvd3MsIGZhbGwgYmFjayB0byBhIEZhdGFsRXJyb3Igd2l0aG91dCBjYXVzZS5cbiAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICBpZiAoc3RlcC5lcnJvciAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBhd2FpdCBoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgc3RlcC5lcnJvcixcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUg4oCUIGJlc3QtZWZmb3J0IGNhdXNlIGF0dGFjaG1lbnQuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgIH1cblxuICAgIC8vIE9wcyB0aGF0IG11c3QgYmUgZHVyYWJseSBjb21taXR0ZWQgYmVmb3JlIHN0ZXAgY29tcGxldGlvbiAoZS5nLiBhXG4gICAgLy8gc3RlcC1pbml0aWF0ZWQgYWJvcnQncyBob29rX3JlY2VpdmVkIGV2ZW50KS4gU2VlIFN0ZXBDb250ZXh0LiBEZWNsYXJlZFxuICAgIC8vIG91dHNpZGUgdGhlIHRyeSBzbyB0aGUgZmFpbHVyZSBwYXRoIGJlbG93IGNhbiBhbHNvIGRyYWluIHRoZW0uXG4gICAgY29uc3QgcHJlQ29tcGxldGlvbk9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgY29uc3Qgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBsZXQgb3BzU2V0dGxlZCA9IHRydWU7XG5cbiAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeSB0byBhdHRhY2ggdG8gdGhpcyBzdGVwJ3MgdGVybWluYWwgZXZlbnQuIENvbXB1dGVkXG4gICAgLy8gcmlnaHQgYmVmb3JlIHVzZXIgY29kZSBydW5zOyBkZWNsYXJlZCBoZXJlIHNvIHRoZSBmYWlsdXJlIHBhdGggKHRoZVxuICAgIC8vIGNhdGNoIGJlbG93KSBjYW4gYXR0YWNoIGl0IHRvIHN0ZXBfZmFpbGVkIHRvby5cbiAgICBsZXQgbGF0ZW5jeUV2ZW50RGF0YTogU3RlcExhdGVuY3lFdmVudERhdGEgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBCYWNrZmlsbCBSU0ZTIG9udG8gdGhlIGFscmVhZHktY29tcHV0ZWQgdGVsZW1ldHJ5IG9uY2UgdGhlIG9wdGltaXN0aWNcbiAgICAvLyB0dXJibyBzdGFydCBoYXMgc2V0dGxlZC4gT24gdGhhdCBwYXRoIHRoZSBzdGVwLXN0YXJ0IFBPU1QgZmlyZXMgaW5zaWRlXG4gICAgLy8gdGhlIHJ1bi1yZWFkeSBiYXJyaWVyJ3MgYC50aGVuYCwgc28gYHN0ZXBTdGFydFBvc3RTZW50QXRNc2Ag4oCUIGFuZFxuICAgIC8vIHRoZXJlZm9yZSBSU0ZTIOKAlCBpcyB1c3VhbGx5IHN0aWxsIHVuc2V0IHdoZW4gYGxhdGVuY3lFdmVudERhdGFgIGlzXG4gICAgLy8gZmlyc3QgY29tcHV0ZWQganVzdCBiZWZvcmUgdXNlciBjb2RlICh0aGUgYmFycmllciBpcyBzdGlsbCBpbiBmbGlnaHRcbiAgICAvLyBmb3IgYW55IG5vbi10cml2aWFsIGBydW5fc3RhcnRlZGAgcm91bmQtdHJpcCwgd2hpY2ggaXMgZXhhY3RseSB0aGVcbiAgICAvLyBzbG93LXJ1bl9zdGFydGVkIGNhc2UgUlNGUyBleGlzdHMgdG8gbWVhc3VyZSkuIEJ5IHRoZSB0aW1lXG4gICAgLy8gYHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCgpYCBoYXMgYXdhaXRlZCB0aGUgYmFycmllciB0aGUgUE9TVCB0aW1lc3RhbXBcbiAgICAvLyBpcyBrbm93biwgc28gd2UgcGF0Y2ggUlNGUyBpbiBiZWZvcmUgdGhlIHRlcm1pbmFsIGV2ZW50IGlzIHdyaXR0ZW4uXG4gICAgLy8gV2l0aG91dCB0aGlzLCBzbG93LXJ1bl9zdGFydGVkIHNhbXBsZXMgYXJlIGRyb3BwZWQsIGJpYXNpbmcgUlNGU1xuICAgIC8vIHBlcmNlbnRpbGVzIGxvdyAobWlzc2luZy1ub3QtYXQtcmFuZG9tKS4gUmVjb21wdXRlcyBvbmx5IFJTRlMg4oCUXG4gICAgLy8gVFRGUy9TVFNPIHN0YXkgYW5jaG9yZWQgdG8gYGV4ZWN1dGlvblN0YXJ0VGltZWAgYXMgY29tcHV0ZWQgYWJvdmUuXG4gICAgY29uc3QgYmFja2ZpbGxPcHRpbWlzdGljUnNmcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghbGF0ZW5jeUV2ZW50RGF0YSB8fCBsYXRlbmN5RXZlbnREYXRhLnJzZnMgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgY29uc3QgYW5jaG9yTXMgPSBwYXJhbXMubGF0ZW5jeVRyYWNraW5nPy5yc2ZzQW5jaG9yTXM7XG4gICAgICBpZiAoYW5jaG9yTXMgPT09IHVuZGVmaW5lZCB8fCBzdGVwU3RhcnRQb3N0U2VudEF0TXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5yc2ZzID0gTWF0aC5tYXgoMCwgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zIC0gYW5jaG9yTXMpO1xuICAgICAgaWYgKHNwYW4pIHtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJzZnNNcyhsYXRlbmN5RXZlbnREYXRhLnJzZnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgIGlmICghc3RlcC5zdGFydGVkQXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgIGBTdGVwIFwiJHtzdGVwSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RlcFN0YXJ0ZWRBdCA9IHN0ZXAuc3RhcnRlZEF0O1xuICAgICAgLy8gVXNlIHRoZSBwcm92aWRlZCBlbmNyeXB0aW9uIGtleSB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHJlc29sdmVcbiAgICAgIC8vIHRocm91Z2ggdGhlIG1lbW9pemVkIGFjY2Vzc29yIGRlY2xhcmVkIGF0IHRoZSB0b3Agb2YgdGhpcyB0cmFjZS5cbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBwYXJhbXMuZW5jcnlwdGlvbktleSA/PyAoYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpKTtcbiAgICAgIGNvbnN0IGh5ZHJhdGVkSW5wdXQgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgJ3N0ZXAuaHlkcmF0ZScsXG4gICAgICAgIHt9LFxuICAgICAgICBhc3luYyAoaHlkcmF0ZVNwYW4pID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICBvcHMsXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgIGh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXJndW1lbnRzQ291bnQoaHlkcmF0ZWQuYXJncy5sZW5ndGgpLFxuICAgICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRGVzZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGh5ZHJhdGVkO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBhcmdzID0gaHlkcmF0ZWRJbnB1dC5hcmdzO1xuICAgICAgY29uc3QgdGhpc1ZhbCA9IGh5ZHJhdGVkSW5wdXQudGhpc1ZhbCA/PyBudWxsO1xuICAgICAgY29uc3Qgd29ya2Zsb3dCYXNlVXJsID0gY3JlYXRlV29ya2Zsb3dCYXNlVXJsKFxuICAgICAgICBpc1ZlcmNlbFxuICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7KGF3YWl0IGdldFBvcnRMYXp5KCkpID8/IDMwMDB9YFxuICAgICAgKTtcblxuICAgICAgLy8gLS0tIFVzZXIgY29kZSBleGVjdXRpb24gLS0tXG4gICAgICAvLyBXcmFwIG9ubHkgc3RlcEZuLmFwcGx5KCkgKHVzZXIgc3RlcCBjb2RlKSBzbyBjbGVhbnVwIGJlbG93IHJ1bnMgb25cbiAgICAgIC8vIEJPVEggc3VjY2VzcyBhbmQgZmFpbHVyZS4gQSB1c2VyLWNvZGUgdGhyb3cgaXMgY2FwdHVyZWQgaGVyZSBhbmRcbiAgICAgIC8vIHJlLXJhaXNlZCBhZnRlciBjYW5jZWxBYm9ydFJlYWRlcnMsIHNvIGl0IHN0aWxsIGZsb3dzIHRvIHRoZSBvdXRlclxuICAgICAgLy8gY2F0Y2ggKHN0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcpIOKAlCBidXQgdGhlIGFib3J0LXN0cmVhbSByZWFkZXIgaXNcbiAgICAgIC8vIHRvcm4gZG93biBmaXJzdC4gV2l0aG91dCB0aGlzLCBhIHRocm93aW5nL3JldHJ5aW5nIHNpZ25hbC1iZWFyaW5nXG4gICAgICAvLyBzdGVwIHdvdWxkIGxlYWsgYSByZWFsLXRpbWUgYWJvcnQgcmVhZGVyIHBlciBhdHRlbXB0LlxuICAgICAgbGV0IHVzZXJDb2RlRXJyb3I6IHVua25vd247XG4gICAgICBsZXQgdXNlckNvZGVGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgY29uc3QgZXhlY3V0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGxhdGVuY3lFdmVudERhdGEgPSBjb21wdXRlU3RlcExhdGVuY3lFdmVudERhdGEoe1xuICAgICAgICB0cmFja2luZzogcGFyYW1zLmxhdGVuY3lUcmFja2luZyxcbiAgICAgICAgc3RlcENvZGVTdGFydGVkQXRNczogZXhlY3V0aW9uU3RhcnRUaW1lLFxuICAgICAgICBhdHRlbXB0LFxuICAgICAgICBsYXp5U3RlcFN0YXJ0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBvcHRpbWlzdGljU3RhcnQsXG4gICAgICAgIHN0ZXBTdGFydFBvc3RTZW50QXRNcyxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhdGVuY3lFdmVudERhdGEpIHtcbiAgICAgICAgLy8gTWlycm9yIHRoZSBsYXRlbmN5IHRlbGVtZXRyeSBvbnRvIHRoZSBzdGVwIHNwYW4gc28gdHJhY2VzIHNob3dcbiAgICAgICAgLy8gVFRGUy9TVFNPL1JTRlMgYWxvbmdzaWRlIHRoZSBmbGFtZSBncmFwaCwgbm90IGp1c3QgRGF0YWRvZyBtZXRyaWNzLlxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi4obGF0ZW5jeUV2ZW50RGF0YS50dGZzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBUdGZzTXMobGF0ZW5jeUV2ZW50RGF0YS50dGZzKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEuc3RzbyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwU3Rzb01zKGxhdGVuY3lFdmVudERhdGEuc3RzbylcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLnJzZnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBBdHRyaWJ1dGUuU3RlcFJzZnNNcyhsYXRlbmN5RXZlbnREYXRhLnJzZnMpXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4obGF0ZW5jeUV2ZW50RGF0YS5maW5hbFNjaGVkdWxpbmdSZXBsYXkgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBBdHRyaWJ1dGUuU3RlcEZpbmFsU2NoZWR1bGluZ1JlcGxheU1zKFxuICAgICAgICAgICAgICAgIGxhdGVuY3lFdmVudERhdGEuZmluYWxTY2hlZHVsaW5nUmVwbGF5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTGF0ZW5jeU9wdGltaXphdGlvbnMoXG4gICAgICAgICAgICBsYXRlbmN5RXZlbnREYXRhLm9wdGltaXphdGlvbnMgPz8gW11cbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKCdzdGVwLmV4ZWN1dGUnLCB7fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0U3RvcmFnZS5ydW4oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN0ZXBNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICBzdGVwU3RhcnRlZEF0OiBuZXcgRGF0ZSgrc3RlcFN0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgd29ya2Zsb3dNZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBuZXcgRGF0ZSgrd29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgIHVybDogd29ya2Zsb3dCYXNlVXJsLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3b3JrZmxvd0RlcGxveW1lbnRJZDogcGFyYW1zLndvcmtmbG93RGVwbG95bWVudElkLFxuICAgICAgICAgICAgICByb290UnVuSWQ6IHBhcmFtcy5yb290UnVuSWQsXG4gICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgcHJlQ29tcGxldGlvbk9wcyxcbiAgICAgICAgICAgICAgY2xvc3VyZVZhcnM6IGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQgcnVucyB0aGlzIGJvZHkgYmVmb3JlIGBydW5fc3RhcnRlZGAgaXNcbiAgICAgICAgICAgICAgLy8gZHVyYWJsZS4gRXhwb3NlIHRoZSBiYXJyaWVyIHNvIGEgZGlyZWN0IHN0ZXAtYm9keSB3b3JsZCB3cml0ZVxuICAgICAgICAgICAgICAvLyAoZS5nLiBgc2V0QXR0cmlidXRlc2ApIGNhbiBvcmRlciBpdHNlbGYgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgIC8vIHJ1biBleGlzdHMuIFVuZGVmaW5lZCBvbiB0aGUgYXdhaXQgcGF0aCAocnVuIGFscmVhZHkgZHVyYWJsZSkuXG4gICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcjogb3B0aW1pc3RpY1N0YXJ0XG4gICAgICAgICAgICAgICAgPyBwYXJhbXMucnVuUmVhZHlCYXJyaWVyXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhlY3V0aW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIGV4ZWN1dGlvblN0YXJ0VGltZTtcblxuICAgICAgLy8gVGVhciBkb3duIGFueSBhYm9ydC1zdHJlYW0gcmVhZGVycyBvcGVuZWQgd2hpbGUgaHlkcmF0aW5nIHRoZSBzdGVwJ3NcbiAgICAgIC8vIGFyZ3VtZW50cyAoYSBzZXJpYWxpemVkIEFib3J0U2lnbmFsIG9wZW5zIGEgcmVhbC10aW1lIGFib3J0IHJlYWRlciBmb3JcbiAgICAgIC8vIHRoZSBzdGVwJ3MgZHVyYXRpb24pLiBXaXRob3V0IHRoaXMgdGhlIHJlYWRlcidzIGByZWFkKClgIHByb21pc2UgbmV2ZXJcbiAgICAgIC8vIHNldHRsZXMsIHNvIHRoZSBgb3BzYCBmbHVzaCBiZWxvdyBhbHdheXMgbG9zZXMgdGhlIDUwMG1zIHJhY2UgYW5kIHRoZVxuICAgICAgLy8gc3RlcCByZXBvcnRzIGBoYXNQZW5kaW5nT3BzYCDigJQgZm9yY2luZyB0aGUgaW5saW5lIGxvb3AgdG8gcXVldWUgYVxuICAgICAgLy8gY29udGludWF0aW9uIGFuZCBwYXlpbmcgYSBmdWxsIHJvdW5kLXRyaXAgcGVyIHNpZ25hbC1iZWFyaW5nIHN0ZXAuXG4gICAgICAvLyBSdW5zIHVuY29uZGl0aW9uYWxseSAoc3VjY2VzcyBvciBmYWlsdXJlKSBzbyBhIHRocm93aW5nIHN0ZXAgZG9lc24ndFxuICAgICAgLy8gbGVhayB0aGUgcmVhZGVyLlxuICAgICAgY2FuY2VsQWJvcnRSZWFkZXJzKC4uLmFyZ3MsIHRoaXNWYWwsIGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMpO1xuXG4gICAgICAvLyBSZS1yYWlzZSBhIHVzZXItY29kZSBmYWlsdXJlIG5vdyB0aGF0IGNsZWFudXAgaGFzIHJ1bjsgdGhlIG91dGVyXG4gICAgICAvLyBjYXRjaCBtYXBzIGl0IHRvIHN0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcuXG4gICAgICBpZiAodXNlckNvZGVGYWlsZWQpIHtcbiAgICAgICAgdGhyb3cgdXNlckNvZGVFcnJvcjtcbiAgICAgIH1cblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZUV4ZWN1dGlvblRpbWVNcyhleGVjdXRpb25UaW1lTXMpLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRyYWNlKCdzdGVwLmRlaHlkcmF0ZScsIHt9LCBhc3luYyAoZGVoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gYXdhaXQgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgb3BzLFxuICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgY29tcHJlc3Npb24sXG4gICAgICAgICAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydDogYSByZXR1cm5lZCBzdHJlYW0gaXMgcGlwZWQgdG8gdGhlIHNlcnZlclxuICAgICAgICAgIC8vIGFmdGVyIHRoZSBib2R5IGJ1dCB3aXRoaW4gdGhpcyBzYW1lIG9wIGZsdXNoLCBzbyBnYXRlIGl0cyBmaXJzdFxuICAgICAgICAgIC8vIHdyaXRlIG9uIHRoZSBydW4tcmVhZHkgYmFycmllci4gVW5kZWZpbmVkIG9uIHRoZSBhd2FpdCBwYXRoLlxuICAgICAgICAgIG9wdGltaXN0aWNTdGFydCA/IHBhcmFtcy5ydW5SZWFkeUJhcnJpZXIgOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgIGRlaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZVNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIGRlaHlkcmF0ZWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlaHlkcmF0ZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8gRmx1c2ggcGVuZGluZyBvcHMgKHN0cmVhbSB3cml0ZXMsIGV0Yy4pIHdpdGggYSBzaG9ydCBpbmxpbmUgd2FpdC5cbiAgICAgIC8vIFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW0gYWNrcyB3cml0ZXMgb24gYnVmZmVyIGVudHJ5XG4gICAgICAvLyAoZ3JvdXAtY29tbWl0IGJhdGNoaW5nKTsgZHVyYWJpbGl0eSBpcyBlbmZvcmNlZCBieSBpdHMgZHJhaW5cbiAgICAgIC8vIGJhcnJpZXIsIHdoaWNoIHRoZSBmbHVzaGFibGUgc3RhdGUncyBjb21wbGV0aW9uIGF3YWl0cyBhZnRlclxuICAgICAgLy8gbG9jayByZWxlYXNlLiBNb3N0IG9wcyBzZXR0bGUgd2l0aGluIH4yMDBtcyAobG9jay1yZWxlYXNlXG4gICAgICAvLyBwb2xsaW5nICsgb25lIGJhdGNoZWQgSFRUUCBmbHVzaCkuXG4gICAgICAvLyBJZiBvcHMgZG9uJ3Qgc2V0dGxlIGluIDUwMG1zIChlLmcuLCBXcml0YWJsZVN0cmVhbSBrZXB0IG9wZW5cbiAgICAgIC8vIGFjcm9zcyBzdGVwcyksIHdhaXRVbnRpbCBoYW5kbGVzIHRoZSByZXN0LlxuICAgICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG9wc1Byb21pc2UgPSBQcm9taXNlLmFsbChvcHMpO1xuICAgICAgICAvLyBUaGUgcmFjZSBiZWxvdyBzdXJmYWNlcyBmYWlsdXJlcyBpbmxpbmUgd2hlbiBvcHMgc2V0dGxlIHF1aWNrbHk7XG4gICAgICAgIC8vIGlmIHRoZSA1MDBtcyB0aW1lb3V0IHdpbnMsIHRoZSBmYWlsdXJlIGlzIG9ubHkgb2JzZXJ2ZWQgaGVyZS4gVGhlXG4gICAgICAgIC8vIHByb21pc2UgaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZFxuICAgICAgICAvLyB3YWl0VW50aWwgcmVqZWN0aW9uIGNyYXNoZXMgdGhlIHByb2Nlc3MgYXMgdW5oYW5kbGVkUmVqZWN0aW9uKSxcbiAgICAgICAgLy8gc28gdW5leHBlY3RlZCBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICAgIHNhZmVXYWl0VW50aWwob3BzUHJvbWlzZSwgKGVycikgPT4ge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCBmbHVzaCBvZiBzdGVwIHN0cmVhbSBvcHMgZmFpbGVkJywge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcHNTZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICBvcHNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhwZWN0ZWQgY2xpZW50IGRpc2Nvbm5lY3QgZXJyb3JzIChlLmcuLCBicm93c2VyXG4gICAgICAgICAgICAgIC8vIHJlZnJlc2ggZHVyaW5nIHN0cmVhbWluZylcbiAgICAgICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSByZXR1cm4gdHJ1ZSBhcyBjb25zdDtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IFByb21pc2U8ZmFsc2U+KChyKSA9PiBzZXRUaW1lb3V0KCgpID0+IHIoZmFsc2UpLCA1MDApKSxcbiAgICAgICAgXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9wdGltaXN0aWMgc3RhcnQ6IHRoZSBib2R5IHJhbiBiZWZvcmUgYHN0ZXBfc3RhcnRlZGAgd2FzIGNvbmZpcm1lZC5cbiAgICAgIC8vIFJlY29uY2lsZSBpdCBub3cg4oCUIGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIGRpc2NhcmQgdGhpcyByZXN1bHQgYW5kIGRvbid0IHdyaXRlIHN0ZXBfY29tcGxldGVkLlxuICAgICAgLy8gUmVjb25jaWxlIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzOiBhIGRpc2NhcmRlZCByZXN1bHQgbWVhbnNcbiAgICAgIC8vIHRoZSB3aW5uaW5nIGhhbmRsZXIgb3ducyB0aGUgb3V0Y29tZSAoYW5kIHJlLWZpcmVzIGFueSBhYm9ydFxuICAgICAgLy8gaWRlbXBvdGVudGx5KSwgc28gdGhlcmUncyBubyBwb2ludCBwYXlpbmcgdGhlIGFib3J0LWNvbW1pdCBsYXRlbmN5LlxuICAgICAgaWYgKG9wdGltaXN0aWNTdGFydCkge1xuICAgICAgICBjb25zdCByZWNvbmNpbGUgPSBhd2FpdCByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnQoKTtcbiAgICAgICAgaWYgKHJlY29uY2lsZSkgcmV0dXJuIHJlY29uY2lsZTtcbiAgICAgICAgLy8gQmFycmllciByZXNvbHZlZCDigJQgdGhlIHN0ZXAtc3RhcnQgUE9TVCB0aW1lc3RhbXAgaXMgbm93IGtub3duLCBzb1xuICAgICAgICAvLyBSU0ZTIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgYmVsb3cuXG4gICAgICAgIGJhY2tmaWxsT3B0aW1pc3RpY1JzZnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tbWl0IG11c3QtYmUtZHVyYWJsZSBvcHMgKGUuZy4gYSBzdGVwLWluaXRpYXRlZCBhYm9ydCdzXG4gICAgICAvLyBob29rX3JlY2VpdmVkIGV2ZW50KSBiZWZvcmUgd3JpdGluZyBzdGVwX2NvbXBsZXRlZCwgc28gYW55IHdvcmtmbG93XG4gICAgICAvLyBjb250aW51YXRpb24gdHJpZ2dlcmVkIGJ5IHRoYXQgZXZlbnQgb2JzZXJ2ZXMgdGhlIGFib3J0IHJhdGhlciB0aGFuXG4gICAgICAvLyByYWNpbmcgaXQuIFRoZXNlIG9wcyBzd2FsbG93IHRoZWlyIG93biBlcnJvcnMsIHNvIGF3YWl0aW5nIG9ubHlcbiAgICAgIC8vIGVuZm9yY2VzIG9yZGVyaW5nICh0aGUgYC5jYXRjaCgpYCBkZWZlbmRzIHRoZSBuby1yZWplY3QgY29udHJhY3Qgb25cbiAgICAgIC8vIFN0ZXBDb250ZXh0LnByZUNvbXBsZXRpb25PcHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFRyYWRlb2ZmOiBjb3JyZWN0bmVzcyByZXF1aXJlcyB0aGUgaG9vayBiZSBkdXJhYmxlIGJlZm9yZSBjb21wbGV0aW9uLFxuICAgICAgLy8gc28g4oCUIHVubGlrZSB0aGUgYmFja2dyb3VuZCBgb3BzYCBmbHVzaCBhYm92ZSDigJQgdGhpcyBjYW5ub3QgYmUgY2FwcGVkXG4gICAgICAvLyB3aXRoIGEgcmVzb2x2ZS1vbi10aW1lb3V0IHJhY2UuIEEgc2xvdyByZXN1bWUgdGhlcmVmb3JlIGFkZHMgaXRzXG4gICAgICAvLyBsYXRlbmN5IHRvIGEgc3RlcCB0aGF0IGFib3J0cyBhIGNvbnRyb2xsZXIsIGFuZCBhIHRydWUgaGFuZyBob2xkc1xuICAgICAgLy8gY29tcGxldGlvbiB1bnRpbCB0aGUgcGxhdGZvcm0vcXVldWUgZXhlY3V0aW9uIHRpbWVvdXQgZmlyZXM7IHRoZSBxdWV1ZVxuICAgICAgLy8gdGhlbiByZWRlbGl2ZXJzIGFuZCB0aGUgc3RlcCByZXRyaWVzLCByZS1maXJpbmcgdGhlIGFib3J0IGlkZW1wb3RlbnRseS5cbiAgICAgIGlmIChwcmVDb21wbGV0aW9uT3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJlQ29tcGxldGlvbk9wcykuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgLy8gT3B0aW1pc3RpYyBzdGFydDogdGhlIGJvZHkgdGhyZXcgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgIHdhcyBjb25maXJtZWQuXG4gICAgICAvLyBSZWNvbmNpbGUgZmlyc3Qg4oCUIGlmIHdlIGxvc3QgdGhlIGNyZWF0ZS1jbGFpbSAob3IgdGhlIHJ1biBpc1xuICAgICAgLy8gZ29uZS90aHJvdHRsZWQpIHRoZSBib2R5IGVycm9yIGlzIG1vb3Q7IGRpc2NhcmQgaXQgYW5kIGRvbid0IHdyaXRlIGFcbiAgICAgIC8vIHRlcm1pbmFsIGV2ZW50ICh0aGUgd2lubmluZyBoYW5kbGVyIG93bnMgdGhlIG91dGNvbWUpLiBSZWNvbmNpbGVcbiAgICAgIC8vIGJlZm9yZSBkcmFpbmluZyBwcmVDb21wbGV0aW9uT3BzIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIHN1Y2Nlc3NcbiAgICAgIC8vIHBhdGg6IGEgZGlzY2FyZGVkIG91dGNvbWUgZG9lc24ndCBuZWVkIHRoZSBhYm9ydCBjb21taXR0ZWQgaGVyZS5cbiAgICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgICAgY29uc3QgcmVjb25jaWxlID0gYXdhaXQgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KCk7XG4gICAgICAgIGlmIChyZWNvbmNpbGUpIHJldHVybiByZWNvbmNpbGU7XG4gICAgICAgIC8vIEJhcnJpZXIgcmVzb2x2ZWQg4oCUIGF0dGFjaCBSU0ZTIHRvIHRoZSBzdGVwX2ZhaWxlZCBldmVudChzKSBiZWxvdy5cbiAgICAgICAgYmFja2ZpbGxPcHRpbWlzdGljUnNmcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmRlciBhbnkgbXVzdC1iZS1kdXJhYmxlIG9wcyAoZS5nLiBhIHN0ZXAtaW5pdGlhdGVkIGFib3J0J3NcbiAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgZXZlbnQpIGFoZWFkIG9mIHN0ZXBfZmFpbGVkIHRvbyDigJQgYSBzdGVwIHRoYXQgYWJvcnRzIGFuZFxuICAgICAgLy8gdGhlbiB0aHJvd3MgbXVzdCBzdGlsbCBoYXZlIHRoZSBhYm9ydCByZWNvcmRlZCBiZWZvcmUgdGhlIGZhaWx1cmVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBvYnNlcnZlcyBpdC4gU2FtZSBsYXRlbmN5IHRyYWRlb2ZmIGFuZCBuby1yZWplY3QgY29udHJhY3RcbiAgICAgIC8vIGFzIHRoZSBzdWNjZXNzIHBhdGggYWJvdmUuIFNlZSBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzLlxuICAgICAgaWYgKHByZUNvbXBsZXRpb25PcHMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcmVDb21wbGV0aW9uT3BzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUVyciA9IHByb21vdGVBYm9ydEVycm9yVG9GYXRhbChlcnIpO1xuXG4gICAgICBjb25zdCBub3JtYWxpemVkRXJyb3IgPSBhd2FpdCBub3JtYWxpemVVbmtub3duRXJyb3IoZWZmZWN0aXZlRXJyKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9XG4gICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKGVmZmVjdGl2ZUVycikgfHwgJyc7XG5cbiAgICAgIGlmIChlZmZlY3RpdmVFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/LihlZmZlY3RpdmVFcnIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0ZhdGFsID0gRmF0YWxFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck5hbWUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTWVzc2FnZShub3JtYWxpemVkRXJyb3IubWVzc2FnZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZ2V0RXJyb3JOYW1lKGVmZmVjdGl2ZUVycikpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JDYXRlZ29yeShcbiAgICAgICAgICBpc0ZhdGFsXG4gICAgICAgICAgICA/ICdmYXRhbCdcbiAgICAgICAgICAgIDogUmV0cnlhYmxlRXJyb3IuaXMoZWZmZWN0aXZlRXJyKVxuICAgICAgICAgICAgICA/ICdyZXRyeWFibGUnXG4gICAgICAgICAgICAgIDogJ3RyYW5zaWVudCdcbiAgICAgICAgKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yUmV0cnlhYmxlKCFpc0ZhdGFsKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRmF0YWwpIHtcbiAgICAgICAgc3RlcExvZ2dlci5lcnJvcihcbiAgICAgICAgICAnRW5jb3VudGVyZWQgRmF0YWxFcnJvciB3aGlsZSBleGVjdXRpbmcgc3RlcCwgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93JyxcbiAgICAgICAgICB7IHdvcmtmbG93UnVuSWQsIHN0ZXBOYW1lLCBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2sgfVxuICAgICAgICApO1xuICAgICAgICAvLyBBcHBseSB0aGUgbm9ybWFsaXplZCBzdGFjayB0byB0aGUgdGhyb3duIHZhbHVlIHNvIHRoZSBzZXJpYWxpemVkXG4gICAgICAgIC8vIGVycm9yIHByZXNlcnZlcyBpdCBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCB3b3Jrc1xuICAgICAgICAvLyBhY3Jvc3MgVk0gcmVhbG1zIChhIHdvcmtmbG93LXRocm93biBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGVcbiAgICAgICAgLy8gVk0ncyBFcnJvciBjbGFzcywgbm90IHRoZSBob3N0J3MpLlxuICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcihlZmZlY3RpdmVFcnIpICYmIG5vcm1hbGl6ZWRTdGFjaykge1xuICAgICAgICAgIChlZmZlY3RpdmVFcnIgYXMgRXJyb3IpLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUVycixcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIC4uLmxhdGVuY3lFdmVudERhdGEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChzdGVwRmFpbEVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogc3RlcEZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgfVxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9uLWZhdGFsIGVycm9yOiBjaGVjayBpZiByZXRyaWVzIHJlbWFpbmluZ1xuICAgICAgY29uc3QgY3VycmVudEF0dGVtcHQgPSBzdGVwLmF0dGVtcHQ7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEF0dGVtcHQoY3VycmVudEF0dGVtcHQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgICB9KTtcblxuICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMgKyAxKSB7XG4gICAgICAgIC8vIE1heCByZXRyaWVzIHJlYWNoZWRcbiAgICAgICAgY29uc3QgcmV0cnlDb3VudCA9IHN0ZXAuYXR0ZW1wdCAtIDE7XG4gICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgJ01heCByZXRyaWVzIHJlYWNoZWQsIGJ1YmJsaW5nIGVycm9yIHRvIHBhcmVudCB3b3JrZmxvdycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwTmFtZX1cIiBmYWlsZWQgYWZ0ZXIgJHttYXhSZXRyaWVzfSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIG1heFJldHJpZXMpfTogJHtub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAvLyBXcmFwIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgYXMgYGNhdXNlYCBvbiBhIGZyZXNoIEZhdGFsRXJyb3JcbiAgICAgICAgLy8gc28gdGhlIHdyYXBwaW5nIG1lc3NhZ2UgKyByZXRyeS1jb3VudCBmcmFtaW5nIGlzIHRoZSB1c2VyLWZhY2luZ1xuICAgICAgICAvLyBlcnJvciB3aGlsZSB0aGUgb3JpZ2luYWwgZmFpbHVyZSByZW1haW5zIHJlY292ZXJhYmxlIGZyb21cbiAgICAgICAgLy8gYGVyci5jYXVzZWAgYWZ0ZXIgaHlkcmF0aW9uLlxuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGVycjtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRTdGFjaykgd3JhcHBlZEVycm9yLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5sYXRlbmN5RXZlbnREYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgIH1cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHJlbWFpbmluZ1xuICAgICAgaWYgKFJldHJ5YWJsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBSZXRyeWFibGVFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ0VuY291bnRlcmVkIEVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IHRoZSBub3JtYWxpemVkIHN0YWNrIHRvIHRoZSB0aHJvd24gdmFsdWUgc28gaXQgc3Vydml2ZXNcbiAgICAgIC8vIHNlcmlhbGl6YXRpb24uIFNlZSB0aGUgRmF0YWxFcnJvciBzaXRlIGFib3ZlIGZvciB3aHkgd2UgdXNlXG4gICAgICAvLyBgdHlwZXMuaXNOYXRpdmVFcnJvcmAgaW5zdGVhZCBvZiBgZXJyIGluc3RhbmNlb2YgRXJyb3JgLlxuICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IoZXJyKSAmJiBub3JtYWxpemVkU3RhY2spIHtcbiAgICAgICAgKGVyciBhcyBFcnJvcikuc3RhY2sgPSBub3JtYWxpemVkU3RhY2s7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIC4uLihSZXRyeWFibGVFcnJvci5pcyhlcnIpICYmIHsgcmV0cnlBZnRlcjogZXJyLnJldHJ5QWZ0ZXIgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChzdGVwUmV0cnlFcnIpIHtcbiAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcFJldHJ5RXJyKSkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdUcmllZCByZXRyeWluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBzdGVwUmV0cnlFcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHN0ZXBSZXRyeUVycjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZW91dFNlY29uZHMgPSBNYXRoLm1heChcbiAgICAgICAgMSxcbiAgICAgICAgUmV0cnlhYmxlRXJyb3IuaXMoZXJyKVxuICAgICAgICAgID8gTWF0aC5jZWlsKCgrZXJyLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwKVxuICAgICAgICAgIDogMVxuICAgICAgKTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlUaW1lb3V0U2Vjb25kcyh0aW1lb3V0U2Vjb25kcyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlXaWxsUmV0cnkodHJ1ZSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3JldHJ5JywgdGltZW91dFNlY29uZHMgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RlcF9jb21wbGV0ZWQgZXZlbnQgb3V0c2lkZSB0aGUgc3RlcCBleGVjdXRpb24gZmFpbHVyZSBwYXRoOlxuICAgIC8vIHBlcnNpc3RlbmNlIGZhaWx1cmVzIGFyZSBpbmZyYXN0cnVjdHVyZSBlcnJvcnMgYW5kIHNob3VsZCByZWRlbGl2ZXIgdGhlXG4gICAgLy8gcXVldWUgbWVzc2FnZSwgbm90IGJlY29tZSB1c2VyIHN0ZXBfcmV0cnlpbmcvc3RlcF9mYWlsZWQgZXZlbnRzLlxuICAgIGxldCBjb21wbGV0ZWRSZXN1bHQ6IEV2ZW50UmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb21wbGV0ZWRSZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgLi4ubGF0ZW5jeUV2ZW50RGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IHNpbmNlQ3Vyc29yOiBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAnVHJpZWQgY29tcGxldGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBjb25zdCBpbmxpbmVEZWx0YSA9IGV4dHJhY3RJbmxpbmVEZWx0YShcbiAgICAgIGNvbXBsZXRlZFJlc3VsdCxcbiAgICAgIHBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIHJlc3VsdCksXG4gICAgfSk7XG5cbiAgICBpZiAob3BzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0ZXBMb2dnZXIuZGVidWcoJ1N0ZXAgaGFzIHBlbmRpbmcgb3BzJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgb3BzQ291bnQ6IG9wcy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gaGFzUGVuZGluZ09wcyBzaWduYWxzIHRoZSBjb21iaW5lZCBoYW5kbGVyIHRvIGJyZWFrIHRoZSBsb29wXG4gICAgLy8gYW5kIHF1ZXVlIGEgY29udGludWF0aW9uIHNvIHdhaXRVbnRpbCBjYW4gZmx1c2ggdGhlbS5cbiAgICByZXR1cm4geyB0eXBlOiAnY29tcGxldGVkJywgaGFzUGVuZGluZ09wczogIW9wc1NldHRsZWQsIGlubGluZURlbHRhIH07XG4gIH0pO1xufVxuIl19
1039
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3N0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLGFBQWEsRUFDYixhQUFhLEVBQ2Isb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixTQUFTLEVBQ1QsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBVXpCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGlDQUFpQyxHQUNsQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixnQkFBZ0IsR0FDakIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLHdCQUF3QixHQUN6QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLHlDQUF5QyxHQUMxQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixHQUVyQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsMEJBQTBCLEdBRTNCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLDJCQUEyQixHQUc1QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFFMUM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsa0JBQWtCLENBQ3pCLE1BQXVFLEVBQ3ZFLFNBQWtCO0lBRWxCLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDcEUsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksS0FBSztLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQStLRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsTUFBMEI7SUFFMUIsTUFBTSxFQUNKLEtBQUssRUFDTCxhQUFhLEVBQ2IsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsTUFBTSxDQUFDO0lBQ1gsMEVBQTBFO0lBQzFFLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUseUNBQXlDO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELHFEQUFxRDtJQUNyRCxNQUFNLFdBQVcsR0FDZixDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLElBQUksaUNBQWlDLENBQUM7SUFDcEUsTUFBTSxzQkFBc0IsR0FDMUIsTUFBTSxDQUFDLHNCQUFzQixJQUFJLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xFOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUEyQyxFQUFRLEVBQUU7UUFDeEUsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUIsd0VBQXdFO1lBQ3hFLHlFQUF5RTtZQUN6RSwwRUFBMEU7WUFDMUUsa0NBQWtDO1lBQ2xDLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVCLElBQUksSUFBSSxHQUFHLFNBQVMsRUFBRSxDQUFDO2dCQUNyQixTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUN2QixJQUFPLEVBQ1AsV0FBK0IsRUFDL0IsRUFBRTtRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsZUFBZSxDQUN6RCxTQUFTLEtBQUssU0FBUztZQUNyQixDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxXQUFXLEVBQUUsRUFDN0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7UUFDRixXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQzdELE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3hDLElBQUksRUFBRSxhQUFhLENBQUM7WUFDbEIsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUMvQixHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUM7WUFDekMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUM1QixDQUFDLENBQUM7UUFFSCxxRUFBcUU7UUFDckUsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFcEUsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDNUMsMEVBQTBFO1lBQzFFLGdDQUFnQztZQUNoQyxvRUFBb0U7WUFDcEUsTUFBTSxZQUFZLEdBQUcsU0FBUyxRQUFRLDRKQUE0SixDQUFDO1lBQ25NLGFBQWEsQ0FBQyxLQUFLLENBQUMsNENBQTRDLEVBQUU7Z0JBQ2hFLGFBQWE7Z0JBQ2IsUUFBUTtnQkFDUixNQUFNO2FBQ1AsQ0FBQyxDQUFDO1lBQ0gsc0VBQXNFO1lBQ3RFLHNFQUFzRTtZQUN0RSx1RUFBdUU7WUFDdkUscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSx1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLCtEQUErRDtZQUMvRCx3RUFBd0U7WUFDeEUscUVBQXFFO1lBQ3JFLHNEQUFzRDtZQUN0RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQztvQkFDSCxvRUFBb0U7b0JBQ3BFLHFFQUFxRTtvQkFDckUsa0VBQWtFO29CQUNsRSx1REFBdUQ7b0JBQ3ZELElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO3dCQUMzQixNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxDQUFDO29CQUNELE1BQU0sV0FBVyxDQUNmO3dCQUNFLFNBQVMsRUFBRSxjQUFjO3dCQUN6QixXQUFXLEVBQUUsb0JBQW9CO3dCQUNqQyxhQUFhLEVBQUUsTUFBTTt3QkFDckIsU0FBUyxFQUFFOzRCQUNULFFBQVE7NEJBQ1IsWUFBWTs0QkFDWixLQUFLLEVBQUUsTUFBTSxDQUFDLGFBQWE7NEJBQzNCLCtEQUErRDs0QkFDL0QsMkRBQTJEOzRCQUMzRCxjQUFjOzRCQUNkLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLFNBQVM7Z0NBQ3JDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFO2dDQUMzQyxDQUFDLENBQUMsRUFBRSxDQUFDO3lCQUNSO3FCQUNGLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxDQUMzQyxDQUFDO2dCQUNKLENBQUM7Z0JBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3QkFDckMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDN0IsQ0FBQztvQkFDRCxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3QkFDakMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDMUIsQ0FBQztvQkFDRCxNQUFNLFFBQVEsQ0FBQztnQkFDakIsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxXQUFXLENBQUM7b0JBQ2hCLFNBQVMsRUFBRSxhQUFhO29CQUN4QixXQUFXLEVBQUUsb0JBQW9CO29CQUNqQyxhQUFhLEVBQUUsTUFBTTtvQkFDckIsU0FBUyxFQUFFO3dCQUNULFFBQVE7d0JBQ1IsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQzdCLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUM1QixhQUFhLEVBQ2IsTUFBTSxnQkFBZ0IsRUFBRSxFQUN4QixFQUFFLEVBQ0YsVUFBVSxFQUNWLFdBQVcsQ0FDWjtxQkFDRjtpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDeEMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQztnQkFDRCxNQUFNLFdBQVcsQ0FBQztZQUNwQixDQUFDO1lBQ0QsSUFBSSxFQUFFLGFBQWEsQ0FBQztnQkFDbEIsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDakMsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzthQUNsQyxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLHdCQUF3QixDQUFDO1FBRWpFLElBQUksRUFBRSxhQUFhLENBQUM7WUFDbEIsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztTQUN4QyxDQUFDLENBQUM7UUFFSCx5RUFBeUU7UUFDekUsOEVBQThFO1FBQzlFLHlFQUF5RTtRQUN6RSw2RUFBNkU7UUFDN0UseUJBQXlCO1FBQ3pCLGlGQUFpRjtRQUNqRiwrRUFBK0U7UUFDL0UsSUFDRSxNQUFNLENBQUMsb0JBQW9CLEtBQUssU0FBUztZQUN6QyxNQUFNLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxHQUFHLENBQUMsRUFDNUMsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUM5QixNQUFNLFlBQVksR0FBRyxTQUFTLFFBQVEsMkJBQTJCLFVBQVUsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQzVILFVBQVUsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUU7Z0JBQzVDLGFBQWE7Z0JBQ2IsUUFBUTtnQkFDUixNQUFNO2dCQUNOLE9BQU8sRUFBRSxNQUFNLENBQUMsb0JBQW9CO2dCQUNwQyxVQUFVO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxDQUFDO29CQUNoQixTQUFTLEVBQUUsYUFBYTtvQkFDeEIsV0FBVyxFQUFFLG9CQUFvQjtvQkFDakMsYUFBYSxFQUFFLE1BQU07b0JBQ3JCLFNBQVMsRUFBRTt3QkFDVCxRQUFRO3dCQUNSLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUM3QixJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFDNUIsYUFBYSxFQUNiLE1BQU0sZ0JBQWdCLEVBQUUsRUFDeEIsRUFBRSxFQUNGLFVBQVUsRUFDVixXQUFXLENBQ1o7cUJBQ0Y7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsb0VBQW9FO29CQUNwRSx5REFBeUQ7b0JBQ3pELGFBQWEsQ0FBQyxJQUFJLENBQ2hCLHlFQUF5RSxFQUN6RTt3QkFDRSxhQUFhO3dCQUNiLE1BQU07d0JBQ04sUUFBUTt3QkFDUixPQUFPLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztxQkFDMUQsQ0FDRixDQUFDO29CQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQzdCLENBQUM7Z0JBQ0QsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzVCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzFCLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLENBQUM7WUFDWixDQUFDO1lBQ0QsSUFBSSxFQUFFLGFBQWEsQ0FBQztnQkFDbEIsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDakMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2FBQ3RDLENBQUMsQ0FBQztZQUNILE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSw0RUFBNEU7UUFDNUUsOEVBQThFO1FBQzlFLE1BQU0sa0JBQWtCLEdBQUcsQ0FDekIsR0FBWSxFQUNxQixFQUFFO1lBQ25DLElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUN6QixDQUFDLEVBQ0QsT0FBTyxHQUFHLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN4RCxDQUFDO2dCQUNGLGFBQWEsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUU7b0JBQ3pELGlCQUFpQixFQUFFLFVBQVU7aUJBQzlCLENBQUMsQ0FBQztnQkFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDM0QsQ0FBQztZQUNELElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QixhQUFhLENBQUMsSUFBSSxDQUNoQixpQkFBaUIsYUFBYSwyQ0FBMkMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDbkcsQ0FBQztnQkFDRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzFCLENBQUM7WUFDRCxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxhQUFhLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFO29CQUN0RCxRQUFRO29CQUNSLE1BQU07b0JBQ04sYUFBYTtvQkFDYixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDeEQsQ0FBQyxDQUFDO2dCQUNILElBQUksRUFBRSxhQUFhLENBQUM7b0JBQ2xCLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7b0JBQzlCLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7aUJBQ3pDLENBQUMsQ0FBQztnQkFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQzdCLENBQUM7WUFDRCxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEQsYUFBYSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRTtvQkFDL0QsUUFBUTtvQkFDUixNQUFNO29CQUNOLGNBQWM7aUJBQ2YsQ0FBQyxDQUFDO2dCQUNILE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBQzNDLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUM7UUFFRiw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLDJFQUEyRTtRQUMzRSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSx5RUFBeUU7UUFDekUsNEVBQTRFO1FBQzVFLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsRUFBRTtRQUNGLDRFQUE0RTtRQUM1RSx5RUFBeUU7UUFDekUsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSw2RUFBNkU7UUFDN0Usd0RBQXdEO1FBQ3hELE1BQU0sZUFBZSxHQUNuQixNQUFNLENBQUMsYUFBYSxLQUFLLFNBQVM7WUFDbEMsbUVBQW1FO1lBQ25FLGlEQUFpRDtZQUNqRCw4Q0FBOEM7WUFDOUMsTUFBTSxDQUFDLHVCQUF1QixLQUFLLElBQUk7WUFDdkMsQ0FBQyw4QkFBOEIsRUFBRTtnQkFDL0IsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEtBQUssSUFBSTtvQkFDbkMsQ0FBQyx5Q0FBeUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVyRCxJQUFJLElBQWlCLENBQUM7UUFDdEIsc0VBQXNFO1FBQ3RFLHlFQUF5RTtRQUN6RSxxQkFBcUI7UUFDckIsTUFBTSxnQkFBZ0IsR0FBc0I7WUFDMUMsaUJBQWlCLEVBQUUsbUJBQW1CO1NBQ3ZDLENBQUM7UUFDRixxRUFBcUU7UUFDckUsNkRBQTZEO1FBQzdELHNEQUFzRDtRQUN0RCxJQUFJLHFCQUF5QyxDQUFDO1FBQzlDLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsOEJBQThCO1FBQzlCLElBQUksc0JBQTBDLENBQUM7UUFDL0MsMkVBQTJFO1FBQzNFLHNFQUFzRTtRQUN0RSx5REFBeUQ7UUFDekQsSUFBSSxzQkFFUyxDQUFDO1FBQ2QsMEVBQTBFO1FBQzFFLHFFQUFxRTtRQUNyRSw0RUFBNEU7UUFDNUUsa0VBQWtFO1FBQ2xFLHVFQUF1RTtRQUN2RSwyRUFBMkU7UUFDM0UsTUFBTSx3QkFBd0IsR0FBRyxLQUFLLElBRXBDLEVBQUU7WUFDRixJQUFJLENBQUMsc0JBQXNCO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFHLE1BQU0sc0JBQXNCLENBQUM7WUFDN0MsSUFBSSxPQUFPLENBQUMsRUFBRTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLE1BQU07Z0JBQUUsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQy9CLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUVGLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSxtRUFBbUU7WUFDbkUsMEVBQTBFO1lBQzFFLG1EQUFtRDtZQUNuRCxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN2RSxHQUFHLEVBQUU7Z0JBQ0gsZ0VBQWdFO2dCQUNoRSxpRUFBaUU7Z0JBQ2pFLDRDQUE0QztnQkFDNUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNuQyxPQUFPLFdBQVcsQ0FDaEI7b0JBQ0UsU0FBUyxFQUFFLGNBQWM7b0JBQ3pCLFdBQVcsRUFBRSxvQkFBb0I7b0JBQ2pDLGFBQWEsRUFBRSxNQUFNO29CQUNyQixTQUFTLEVBQUU7d0JBQ1QsUUFBUTt3QkFDUixZQUFZO3dCQUNaLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYTt3QkFDM0Isa0VBQWtFO3dCQUNsRSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTOzRCQUNyQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRTs0QkFDM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDUjtpQkFDRjtnQkFDRCwyREFBMkQ7Z0JBQzNELG1FQUFtRTtnQkFDbkUsK0RBQStEO2dCQUMvRCxzQ0FBc0M7Z0JBQ3RDLGdCQUFnQixDQUNqQixDQUFDO1lBQ0osQ0FBQyxDQUNGLENBQUM7WUFDRixzQkFBc0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUMxQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQWEsRUFBRSxDQUFDLEVBQzdCLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUN2QyxDQUFDO1lBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixJQUFJLEdBQUc7Z0JBQ0wsS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLE1BQU07Z0JBQ04sUUFBUTtnQkFDUixNQUFNLEVBQUUsU0FBUztnQkFDakIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxhQUFhO2dCQUMzQixPQUFPLEVBQUUsQ0FBQztnQkFDVixTQUFTLEVBQUUsR0FBRztnQkFDZCxTQUFTLEVBQUUsR0FBRztnQkFDZCxTQUFTLEVBQUUsR0FBRzthQUNmLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLHdFQUF3RTtZQUN4RSxzRUFBc0U7WUFDdEUscUVBQXFFO1lBQ3JFLHVFQUF1RTtZQUN2RSx5RUFBeUU7WUFDekUsbUVBQW1FO1lBQ25FLG1EQUFtRDtZQUNuRCxJQUFJLENBQUM7Z0JBQ0gsK0RBQStEO2dCQUMvRCxnRUFBZ0U7Z0JBQ2hFLGtFQUFrRTtnQkFDbEUsbUVBQW1FO2dCQUNuRSwrREFBK0Q7Z0JBQy9ELGdFQUFnRTtnQkFDaEUseUJBQXlCO2dCQUN6QixNQUFNLGNBQWMsR0FDbEIsTUFBTSxDQUFDLGNBQWMsS0FBSyxTQUFTO29CQUNqQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRTtvQkFDM0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDVCxxQkFBcUIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sV0FBVyxHQUFHLE1BQU0sV0FBVyxDQUNuQztvQkFDRSxTQUFTLEVBQUUsY0FBYztvQkFDekIsV0FBVyxFQUFFLG9CQUFvQjtvQkFDakMsYUFBYSxFQUFFLE1BQU07b0JBQ3JCLFNBQVMsRUFDUCxNQUFNLENBQUMsYUFBYSxLQUFLLFNBQVM7d0JBQ2hDLENBQUMsQ0FBQzs0QkFDRSxRQUFROzRCQUNSLFlBQVk7NEJBQ1osS0FBSyxFQUFFLE1BQU0sQ0FBQyxhQUFhOzRCQUMzQixHQUFHLGNBQWM7eUJBQ2xCO3dCQUNILENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxHQUFHLGNBQWMsRUFBRTtpQkFDdEM7Z0JBQ0QsMkRBQTJEO2dCQUMzRCwyREFBMkQ7Z0JBQzNELGlFQUFpRTtnQkFDakUsZ0JBQWdCO2dCQUNoQixnQkFBZ0IsQ0FDakIsQ0FBQztnQkFDRixzQkFBc0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBRXBDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzFCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLE1BQU07b0JBQUUsT0FBTyxNQUFNLENBQUM7Z0JBQzFCLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztRQUNILENBQUM7UUFFRCxhQUFhLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO1lBQzVDLFFBQVE7WUFDUixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztTQUN0QixDQUFDLENBQUM7UUFFSCxJQUFJLEVBQUUsYUFBYSxDQUFDO1lBQ2xCLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3JDLENBQUMsQ0FBQztRQUVILElBQUksTUFBZSxDQUFDO1FBRXBCLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsZ0VBQWdFO1FBQ2hFLHNFQUFzRTtRQUN0RSwyRUFBMkU7UUFDM0UsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sWUFBWSxHQUFHLFNBQVMsUUFBUSwyQkFBMkIsVUFBVSxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUM7WUFDNUgsVUFBVSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRTtnQkFDNUMsYUFBYTtnQkFDYixRQUFRO2dCQUNSLFVBQVU7YUFDWCxDQUFDLENBQUM7WUFDSCxvRUFBb0U7WUFDcEUsa0VBQWtFO1lBQ2xFLGlFQUFpRTtZQUNqRSxxRUFBcUU7WUFDckUsbURBQW1EO1lBQ25ELE1BQU0sWUFBWSxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2xELElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDO29CQUNGLFlBQXNCLENBQUMsS0FBSyxHQUFHLE1BQU0sZ0JBQWdCLENBQ3BELElBQUksQ0FBQyxLQUFLLEVBQ1YsYUFBYSxFQUNiLE1BQU0sZ0JBQWdCLEVBQUUsQ0FDekIsQ0FBQztnQkFDSixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCx5Q0FBeUM7Z0JBQzNDLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxDQUFDO29CQUNoQixTQUFTLEVBQUUsYUFBYTtvQkFDeEIsV0FBVyxFQUFFLG9CQUFvQjtvQkFDakMsYUFBYSxFQUFFLE1BQU07b0JBQ3JCLFNBQVMsRUFBRTt3QkFDVCxRQUFRO3dCQUNSLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUM3QixZQUFZLEVBQ1osYUFBYSxFQUNiLE1BQU0sZ0JBQWdCLEVBQUUsRUFDeEIsRUFBRSxFQUNGLFVBQVUsRUFDVixXQUFXLENBQ1o7cUJBQ0Y7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsYUFBYSxDQUFDLElBQUksQ0FDaEIsb0RBQW9ELEVBQ3BEO3dCQUNFLGFBQWE7d0JBQ2IsTUFBTTt3QkFDTixRQUFRO3dCQUNSLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztxQkFDckIsQ0FDRixDQUFDO29CQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7Z0JBQzdCLENBQUM7Z0JBQ0QsTUFBTSxHQUFHLENBQUM7WUFDWixDQUFDO1lBQ0QsSUFBSSxFQUFFLGFBQWEsQ0FBQztnQkFDbEIsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDakMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2FBQ3RDLENBQUMsQ0FBQztZQUNILE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUVELG9FQUFvRTtRQUNwRSx5RUFBeUU7UUFDekUsaUVBQWlFO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQW9CLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBb0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUV0QixzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLGlEQUFpRDtRQUNqRCxJQUFJLGdCQUFrRCxDQUFDO1FBRXZELHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLHFFQUFxRTtRQUNyRSx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLDZEQUE2RDtRQUM3RCwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSxrRUFBa0U7UUFDbEUscUVBQXFFO1FBQ3JFLE1BQU0sc0JBQXNCLEdBQUcsR0FBUyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFBRSxPQUFPO1lBQ3JFLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDO1lBQ3RELElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxxQkFBcUIsS0FBSyxTQUFTO2dCQUFFLE9BQU87WUFDMUUsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ3RFLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDakIsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztpQkFDL0MsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFFN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixTQUFTLE1BQU0sZ0NBQWdDLENBQ2hELENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNyQyxvRUFBb0U7WUFDcEUsbUVBQW1FO1lBQ25FLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLElBQUksQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUN6RSxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FDL0IsY0FBYyxFQUNkLEVBQUUsRUFDRixLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxvQkFBb0IsQ0FDekMsSUFBSSxDQUFDLEtBQUssRUFDVixhQUFhLEVBQ2IsYUFBYSxFQUNiLEdBQUcsRUFDSCxVQUFVLEVBQ1YsRUFBRSxFQUNGLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDNUIsQ0FBQztnQkFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO2dCQUMxQyxXQUFXLEVBQUUsYUFBYSxDQUFDO29CQUN6QixHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDckQsR0FBRyxTQUFTLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDO2lCQUNoRCxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxRQUFRLENBQUM7WUFDbEIsQ0FBQyxDQUNGLENBQUM7WUFFRixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO1lBQzlDLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUMzQyxRQUFRO2dCQUNOLENBQUMsQ0FBQyxXQUFXLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsTUFBTSxXQUFXLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUN4RCxDQUFDO1lBRUYsOEJBQThCO1lBQzlCLHFFQUFxRTtZQUNyRSxtRUFBbUU7WUFDbkUscUVBQXFFO1lBQ3JFLHFFQUFxRTtZQUNyRSxvRUFBb0U7WUFDcEUsd0RBQXdEO1lBQ3hELElBQUksYUFBc0IsQ0FBQztZQUMzQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFFM0IsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEMsZ0JBQWdCLEdBQUcsMkJBQTJCLENBQUM7Z0JBQzdDLFFBQVEsRUFBRSxNQUFNLENBQUMsZUFBZTtnQkFDaEMsbUJBQW1CLEVBQUUsa0JBQWtCO2dCQUN2QyxPQUFPO2dCQUNQLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxLQUFLLFNBQVM7Z0JBQ2pELGVBQWU7Z0JBQ2YscUJBQXFCO2FBQ3RCLENBQUMsQ0FBQztZQUNILElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsaUVBQWlFO2dCQUNqRSxzRUFBc0U7Z0JBQ3RFLElBQUksRUFBRSxhQUFhLENBQUM7b0JBQ2xCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssU0FBUzt3QkFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNQLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssU0FBUzt3QkFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNQLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssU0FBUzt3QkFDckMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO3dCQUM3QyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNQLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTO3dCQUN0RCxDQUFDLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUNuQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FDdkM7d0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDUCxHQUFHLFNBQVMsQ0FBQyx3QkFBd0IsQ0FDbkMsZ0JBQWdCLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FDckM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2VBbUJHO1lBQ0gsTUFBTSxlQUFlLEdBQUcsR0FBUyxFQUFFO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRO29CQUFFLE9BQU87Z0JBQzNDLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO29CQUM1QyxRQUFRO29CQUNSLE9BQU87b0JBQ1Asb0JBQW9CLEVBQUUscUJBQXFCO29CQUMzQyxzQkFBc0I7b0JBQ3RCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7aUJBQ2hDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsVUFBVTtvQkFBRSxPQUFPO2dCQUN4QixRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUM7WUFFRixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ2xELE9BQU8sTUFBTSxjQUFjLENBQUMsR0FBRyxDQUM3Qjt3QkFDRSxZQUFZLEVBQUU7NEJBQ1osUUFBUTs0QkFDUixNQUFNOzRCQUNOLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQzs0QkFDdkMsT0FBTzt5QkFDUjt3QkFDRCxnQkFBZ0IsRUFBRTs0QkFDaEIsWUFBWTs0QkFDWixhQUFhOzRCQUNiLGlCQUFpQixFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUM7NEJBQy9DLEdBQUcsRUFBRSxlQUFlOzRCQUNwQixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRTt5QkFDMUM7d0JBQ0Qsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjt3QkFDakQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO3dCQUMzQixHQUFHO3dCQUNILGdCQUFnQjt3QkFDaEIsV0FBVyxFQUFFLGFBQWEsQ0FBQyxXQUFXO3dCQUN0QyxhQUFhO3dCQUNiLGdFQUFnRTt3QkFDaEUsZ0VBQWdFO3dCQUNoRSxvREFBb0Q7d0JBQ3BELGlFQUFpRTt3QkFDakUsZUFBZSxFQUFFLGVBQWU7NEJBQzlCLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZTs0QkFDeEIsQ0FBQyxDQUFDLFNBQVM7cUJBQ2QsRUFDRCxHQUFHLEVBQUU7d0JBQ0gsK0RBQStEO3dCQUMvRCxlQUFlLEVBQUUsQ0FBQzt3QkFDbEIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDckMsQ0FBQyxDQUNGLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixhQUFhLEdBQUcsR0FBRyxDQUFDO2dCQUNwQixjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLENBQUM7WUFFeEQsdUVBQXVFO1lBQ3ZFLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsd0VBQXdFO1lBQ3hFLG9FQUFvRTtZQUNwRSxxRUFBcUU7WUFDckUsdUVBQXVFO1lBQ3ZFLG1CQUFtQjtZQUNuQixrQkFBa0IsQ0FBQyxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRWhFLG1FQUFtRTtZQUNuRSw4Q0FBOEM7WUFDOUMsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxhQUFhLENBQUM7WUFDdEIsQ0FBQztZQUVELElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQzthQUNuRCxDQUFDLENBQUM7WUFFSCxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRTtnQkFDakUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUM3QixNQUFNLFVBQVUsR0FBRyxNQUFNLHdCQUF3QixDQUMvQyxNQUFNLEVBQ04sYUFBYSxFQUNiLGFBQWEsRUFDYixHQUFHLEVBQ0gsVUFBVSxFQUNWLEtBQUssRUFDTCxLQUFLLEVBQ0wsV0FBVztnQkFDWCxtRUFBbUU7Z0JBQ25FLGtFQUFrRTtnQkFDbEUsK0RBQStEO2dCQUMvRCxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDckQsQ0FBQztnQkFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO2dCQUMxQyxhQUFhLEVBQUUsYUFBYSxDQUFDO29CQUMzQixHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7b0JBQzdDLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLFVBQVUsQ0FBQztpQkFDL0MsQ0FBQyxDQUFDO2dCQUNILE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1lBRUgsb0VBQW9FO1lBQ3BFLDJEQUEyRDtZQUMzRCwrREFBK0Q7WUFDL0QsK0RBQStEO1lBQy9ELDREQUE0RDtZQUM1RCxxQ0FBcUM7WUFDckMsK0RBQStEO1lBQy9ELDZDQUE2QztZQUM3QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLG1FQUFtRTtnQkFDbkUsb0VBQW9FO2dCQUNwRSwrREFBK0Q7Z0JBQy9ELGtFQUFrRTtnQkFDbEUsNkNBQTZDO2dCQUM3QyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2hDLGFBQWEsQ0FBQyxJQUFJLENBQUMsNENBQTRDLEVBQUU7d0JBQy9ELGFBQWE7d0JBQ2IsTUFBTTt3QkFDTixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztxQkFDeEQsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNILFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQzlCLFVBQVUsQ0FBQyxJQUFJLENBQ2IsR0FBRyxFQUFFLENBQUMsSUFBYSxFQUNuQixDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNOLDBEQUEwRDt3QkFDMUQsNEJBQTRCO3dCQUM1QixNQUFNLFlBQVksR0FDaEIsR0FBRyxFQUFFLElBQUksS0FBSyxZQUFZLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxpQkFBaUIsQ0FBQzt3QkFDaEUsSUFBSSxZQUFZOzRCQUFFLE9BQU8sSUFBYSxDQUFDO3dCQUN2QyxNQUFNLEdBQUcsQ0FBQztvQkFDWixDQUFDLENBQ0Y7b0JBQ0QsSUFBSSxPQUFPLENBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQzNELENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxzRUFBc0U7WUFDdEUsZ0VBQWdFO1lBQ2hFLHNFQUFzRTtZQUN0RSx1RUFBdUU7WUFDdkUsK0RBQStEO1lBQy9ELHNFQUFzRTtZQUN0RSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLFNBQVMsR0FBRyxNQUFNLHdCQUF3QixFQUFFLENBQUM7Z0JBQ25ELElBQUksU0FBUztvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDaEMsb0VBQW9FO2dCQUNwRSwwREFBMEQ7Z0JBQzFELHNCQUFzQixFQUFFLENBQUM7WUFDM0IsQ0FBQztZQUVELDREQUE0RDtZQUM1RCxzRUFBc0U7WUFDdEUsc0VBQXNFO1lBQ3RFLGtFQUFrRTtZQUNsRSxzRUFBc0U7WUFDdEUsaUNBQWlDO1lBQ2pDLEVBQUU7WUFDRix3RUFBd0U7WUFDeEUsdUVBQXVFO1lBQ3ZFLG1FQUFtRTtZQUNuRSxvRUFBb0U7WUFDcEUseUVBQXlFO1lBQ3pFLDBFQUEwRTtZQUMxRSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztZQUN0Qix3RUFBd0U7WUFDeEUsK0RBQStEO1lBQy9ELHVFQUF1RTtZQUN2RSxtRUFBbUU7WUFDbkUsc0VBQXNFO1lBQ3RFLG1FQUFtRTtZQUNuRSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLFNBQVMsR0FBRyxNQUFNLHdCQUF3QixFQUFFLENBQUM7Z0JBQ25ELElBQUksU0FBUztvQkFBRSxPQUFPLFNBQVMsQ0FBQztnQkFDaEMsb0VBQW9FO2dCQUNwRSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFFRCwrREFBK0Q7WUFDL0QseUVBQXlFO1lBQ3pFLG9FQUFvRTtZQUNwRSx5RUFBeUU7WUFDekUsK0RBQStEO1lBQy9ELElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5ELE1BQU0sZUFBZSxHQUFHLE1BQU0scUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEUsTUFBTSxlQUFlLEdBQ25CLGVBQWUsQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUU3RCxJQUFJLFlBQVksWUFBWSxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRTVDLElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3RELEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RELEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xELEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FDeEIsT0FBTztvQkFDTCxDQUFDLENBQUMsT0FBTztvQkFDVCxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUM7d0JBQy9CLENBQUMsQ0FBQyxXQUFXO3dCQUNiLENBQUMsQ0FBQyxXQUFXLENBQ2xCO2dCQUNELEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUN0QyxDQUFDLENBQUM7WUFFSCxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsVUFBVSxDQUFDLElBQUksQ0FBQywrQ0FBK0MsRUFBRTtvQkFDL0QsYUFBYTtvQkFDYixNQUFNO29CQUNOLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUVELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osVUFBVSxDQUFDLEtBQUssQ0FDZCw2RUFBNkUsRUFDN0UsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsQ0FDekQsQ0FBQztnQkFDRixtRUFBbUU7Z0JBQ25FLGtFQUFrRTtnQkFDbEUsa0VBQWtFO2dCQUNsRSxxQ0FBcUM7Z0JBQ3JDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDeEQsWUFBc0IsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDO2dCQUNsRCxDQUFDO2dCQUNELElBQUksQ0FBQztvQkFDSCxNQUFNLFdBQVcsQ0FBQzt3QkFDaEIsU0FBUyxFQUFFLGFBQWE7d0JBQ3hCLFdBQVcsRUFBRSxvQkFBb0I7d0JBQ2pDLGFBQWEsRUFBRSxNQUFNO3dCQUNyQixTQUFTLEVBQUU7NEJBQ1QsUUFBUTs0QkFDUixLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FDN0IsWUFBWSxFQUNaLGFBQWEsRUFDYixNQUFNLGdCQUFnQixFQUFFLEVBQ3hCLEVBQUUsRUFDRixVQUFVLEVBQ1YsV0FBVyxDQUNaOzRCQUNELEdBQUcsZ0JBQWdCO3lCQUNwQjtxQkFDRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFBQyxPQUFPLFdBQVcsRUFBRSxDQUFDO29CQUNyQixJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO3dCQUN4QyxhQUFhLENBQUMsSUFBSSxDQUNoQixvREFBb0QsRUFDcEQ7NEJBQ0UsYUFBYTs0QkFDYixNQUFNOzRCQUNOLFFBQVE7NEJBQ1IsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO3lCQUM3QixDQUNGLENBQUM7d0JBQ0YsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDN0IsQ0FBQztvQkFDRCxNQUFNLFdBQVcsQ0FBQztnQkFDcEIsQ0FBQztnQkFDRCxJQUFJLEVBQUUsYUFBYSxDQUFDO29CQUNsQixHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO29CQUNqQyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO2lCQUNsQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUM1QixDQUFDO1lBRUQsOENBQThDO1lBQzlDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFFcEMsSUFBSSxFQUFFLGFBQWEsQ0FBQztnQkFDbEIsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQztnQkFDeEMsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQzthQUN4QyxDQUFDLENBQUM7WUFFSCxJQUFJLGNBQWMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLHNCQUFzQjtnQkFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0JBQ3BDLFVBQVUsQ0FBQyxLQUFLLENBQ2Qsd0RBQXdELEVBQ3hEO29CQUNFLGFBQWE7b0JBQ2IsUUFBUTtvQkFDUixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLFVBQVU7b0JBQ1YsVUFBVSxFQUFFLGVBQWU7aUJBQzVCLENBQ0YsQ0FBQztnQkFDRixNQUFNLFlBQVksR0FBRyxTQUFTLFFBQVEsa0JBQWtCLFVBQVUsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzlJLGtFQUFrRTtnQkFDbEUsbUVBQW1FO2dCQUNuRSw0REFBNEQ7Z0JBQzVELCtCQUErQjtnQkFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2pELFlBQXNCLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztnQkFDcEMsSUFBSSxlQUFlO29CQUFFLFlBQVksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDO2dCQUMxRCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxXQUFXLENBQUM7d0JBQ2hCLFNBQVMsRUFBRSxhQUFhO3dCQUN4QixXQUFXLEVBQUUsb0JBQW9CO3dCQUNqQyxhQUFhLEVBQUUsTUFBTTt3QkFDckIsU0FBUyxFQUFFOzRCQUNULFFBQVE7NEJBQ1IsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQzdCLFlBQVksRUFDWixhQUFhLEVBQ2IsTUFBTSxnQkFBZ0IsRUFBRSxFQUN4QixFQUFFLEVBQ0YsVUFBVSxFQUNWLFdBQVcsQ0FDWjs0QkFDRCxHQUFHLGdCQUFnQjt5QkFDcEI7cUJBQ0YsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEMsYUFBYSxDQUFDLElBQUksQ0FDaEIsb0RBQW9ELEVBQ3BEOzRCQUNFLGFBQWE7NEJBQ2IsTUFBTTs0QkFDTixRQUFROzRCQUNSLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTzt5QkFDN0IsQ0FDRixDQUFDO3dCQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7b0JBQzdCLENBQUM7b0JBQ0QsTUFBTSxXQUFXLENBQUM7Z0JBQ3BCLENBQUM7Z0JBQ0QsSUFBSSxFQUFFLGFBQWEsQ0FBQztvQkFDbEIsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztvQkFDakMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2lCQUN0QyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUM1QixDQUFDO1lBRUQsb0JBQW9CO1lBQ3BCLElBQUksY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQixVQUFVLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxFQUFFO29CQUNsRSxhQUFhO29CQUNiLFFBQVE7b0JBQ1IsT0FBTyxFQUFFLGNBQWM7b0JBQ3ZCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztpQkFDckIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFVBQVUsQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUU7b0JBQ3pELGFBQWE7b0JBQ2IsUUFBUTtvQkFDUixPQUFPLEVBQUUsY0FBYztvQkFDdkIsVUFBVSxFQUFFLGVBQWU7aUJBQzVCLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxnRUFBZ0U7WUFDaEUsOERBQThEO1lBQzlELDJEQUEyRDtZQUMzRCxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQy9DLEdBQWEsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDO1lBQ3pDLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxXQUFXLENBQUM7b0JBQ2hCLFNBQVMsRUFBRSxlQUFlO29CQUMxQixXQUFXLEVBQUUsb0JBQW9CO29CQUNqQyxhQUFhLEVBQUUsTUFBTTtvQkFDckIsU0FBUyxFQUFFO3dCQUNULFFBQVE7d0JBQ1IsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQzdCLEdBQUcsRUFDSCxhQUFhLEVBQ2IsTUFBTSxnQkFBZ0IsRUFBRSxFQUN4QixFQUFFLEVBQ0YsVUFBVSxFQUNWLFdBQVcsQ0FDWjt3QkFDRCxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7cUJBQzlEO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO2dCQUN0QixJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUN6QyxhQUFhLENBQUMsSUFBSSxDQUNoQixxREFBcUQsRUFDckQ7d0JBQ0UsYUFBYTt3QkFDYixNQUFNO3dCQUNOLFFBQVE7d0JBQ1IsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPO3FCQUM5QixDQUNGLENBQUM7b0JBQ0YsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQztnQkFDRCxNQUFNLFlBQVksQ0FBQztZQUNyQixDQUFDO1lBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDN0IsQ0FBQyxFQUNELGNBQWMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQzVELENBQUMsQ0FBQyxDQUFDLENBQ04sQ0FBQztZQUVGLElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQztnQkFDcEQsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2FBQ3RDLENBQUMsQ0FBQztZQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFFRCx1RUFBdUU7UUFDdkUsMEVBQTBFO1FBQzFFLG1FQUFtRTtRQUNuRSxJQUFJLGVBQTRCLENBQUM7UUFDakMsSUFBSSxDQUFDO1lBQ0gsZUFBZSxHQUFHLE1BQU0sV0FBVyxDQUNqQztnQkFDRSxTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixXQUFXLEVBQUUsb0JBQW9CO2dCQUNqQyxhQUFhLEVBQUUsTUFBTTtnQkFDckIsU0FBUyxFQUFFO29CQUNULFFBQVE7b0JBQ1IsWUFBWTtvQkFDWixNQUFNLEVBQUUsTUFBb0I7b0JBQzVCLEdBQUcsZ0JBQWdCO2lCQUNwQjthQUNGLEVBQ0QsTUFBTSxDQUFDLHNCQUFzQixLQUFLLFNBQVM7Z0JBQ3pDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsc0JBQXNCLEVBQUU7Z0JBQ2hELENBQUMsQ0FBQyxTQUFTLENBQ2QsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsYUFBYSxDQUFDLElBQUksQ0FDaEIsdURBQXVELEVBQ3ZEO29CQUNFLGFBQWE7b0JBQ2IsTUFBTTtvQkFDTixRQUFRO29CQUNSLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztpQkFDckIsQ0FDRixDQUFDO2dCQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLCtDQUErQyxFQUFFO29CQUMvRCxhQUFhO29CQUNiLE1BQU07b0JBQ04sT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO2lCQUNyQixDQUFDLENBQUM7Z0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBQ0QsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQ3BDLGVBQWUsRUFDZixNQUFNLENBQUMsc0JBQXNCLEtBQUssU0FBUyxDQUM1QyxDQUFDO1FBRUYsSUFBSSxFQUFFLGFBQWEsQ0FBQztZQUNsQixHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQ3BDLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLE1BQU0sQ0FBQztTQUMzQyxDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkIsVUFBVSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRTtnQkFDdkMsYUFBYTtnQkFDYixRQUFRO2dCQUNSLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsK0RBQStEO1FBQy9ELHdEQUF3RDtRQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgVGhyb3R0bGVFcnJvcixcbiAgVG9vRWFybHlFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV29ya2Zsb3dCYXNlVXJsLFxuICBwbHVyYWxpemUsXG4gIHN0ZXBEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3JlYXRlRXZlbnRQYXJhbXMsXG4gIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBTZXJpYWxpemVkRGF0YSxcbiAgU3RhcnRlZFN0ZXAsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHtcbiAgcmVxdWlyZUV2ZW50U2xvdCxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIsIHN0ZXBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgY2FuY2VsQWJvcnRSZWFkZXJzLFxuICBkZWh5ZHJhdGVTdGVwRXJyb3IsXG4gIGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSxcbiAgaHlkcmF0ZVN0ZXBBcmd1bWVudHMsXG4gIGh5ZHJhdGVTdGVwRXJyb3IsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY29udGV4dFN0b3JhZ2UgfSBmcm9tICcuLi9zdGVwL2NvbnRleHQtc3RvcmFnZS5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7XG4gIGdldEVycm9yTmFtZSxcbiAgZ2V0RXJyb3JTdGFjayxcbiAgbm9ybWFsaXplVW5rbm93bkVycm9yLFxuICBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFbmFibGVkLFxuICBpc09wdGltaXN0aWNJbmxpbmVTdGFydEV4cGxpY2l0bHlEaXNhYmxlZCxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydExhenkgfSBmcm9tICcuL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHtcbiAgbWF4RXZlbnRTbG90LFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgdHlwZSBTbG90U25hcHNob3RQYXJhbXMsXG59IGZyb20gJy4vaGVscGVycy5qcyc7XG5pbXBvcnQgeyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyIH0gZnJvbSAnLi9yZXBsYXktcmVjb3ZlcnktcmVwb3J0ZXIuanMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZVJlc3VtZVR0ckF0dHJpYnV0ZXMsXG4gIHR5cGUgUmVzdW1lVHRyVHJhY2tpbmcsXG59IGZyb20gJy4vcmVzdW1lLWxhdGVuY3kuanMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZVN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5RXZlbnREYXRhLFxuICB0eXBlIFN0ZXBMYXRlbmN5VHJhY2tpbmcsXG59IGZyb20gJy4vc3RlcC1sYXRlbmN5LmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBpbmxpbmUgZGVsdGEgZnJvbSBhIHN0ZXAtdGVybWluYWwgYGV2ZW50cy5jcmVhdGVgIHJlc3VsdCxcbiAqIGlmIHRoZSBXb3JsZCBwb3B1bGF0ZWQgb25lLiBBIGRlbHRhIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBjYWxsZXJcbiAqIHJlcXVlc3RlZCBpdCAoYHNpbmNlQ3Vyc29yYCB3YXMgcGFzc2VkKSBhbmQgdGhlIFdvcmxkIHJldHVybmVkIGJvdGhcbiAqIGBldmVudHNgIGFuZCBhIGBjdXJzb3JgOyBvdGhlcndpc2Ugd2UgcmV0dXJuIHVuZGVmaW5lZCBhbmQgdGhlIGNhbGxlclxuICogZmFsbHMgYmFjayB0byB0aGUgbm9ybWFsIGluY3JlbWVudGFsIGBldmVudHMubGlzdGAuIGBoYXNNb3JlYCBkZWZhdWx0c1xuICogdG8gZmFsc2UgKHNpbmdsZSBwYWdlKSB3aGVuIHRoZSBXb3JsZCBvbWl0cyBpdC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdElubGluZURlbHRhKFxuICByZXN1bHQ6IHsgZXZlbnRzPzogRXZlbnRbXTsgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDsgaGFzTW9yZT86IGJvb2xlYW4gfSxcbiAgcmVxdWVzdGVkOiBib29sZWFuXG4pOiBJbmxpbmVFdmVudERlbHRhIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZXF1ZXN0ZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghcmVzdWx0LmV2ZW50cyB8fCByZXN1bHQuY3Vyc29yID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiByZXN1bHQuZXZlbnRzLFxuICAgIGN1cnNvcjogcmVzdWx0LmN1cnNvcixcbiAgICBoYXNNb3JlOiByZXN1bHQuaGFzTW9yZSA/PyBmYWxzZSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwRXhlY3V0b3JQYXJhbXMge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuSWQ6IHN0cmluZztcbiAgLyoqIERlcGxveW1lbnQgdGhhdCBvd25zIHRoZSB3b3JrZmxvdyBydW4sIGZvciBmb3J3YXJkZWQgd3JpdGFibGUgc3RyZWFtcy4gKi9cbiAgd29ya2Zsb3dEZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xuICB3b3JrZmxvd1N0YXJ0ZWRBdDogbnVtYmVyO1xuICAvKiogUm9vdCBydW4gaWQgb2YgdGhpcyBydW4ncyBsaW5lYWdlLCBjYXJyaWVkIGludG8gdGhlIHN0ZXAgY29udGV4dC4gKi9cbiAgcm9vdFJ1bklkPzogc3RyaW5nO1xuICBzdGVwSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgZW5jcnlwdGlvbktleT86IFBheWxvYWRLZXk7XG4gIC8qKlxuICAgKiBUaGUgd29ya2Zsb3cgcnVuJ3Mgc3BlY1ZlcnNpb24sIHVzZWQgdG8gZ2F0ZSBwYXlsb2FkIGNvbXByZXNzaW9uLlxuICAgKiBTdGVwIG91dHB1dHMvZXJyb3JzIGFyZSBvbmx5IGNvbXByZXNzZWQgd2hlbiB0aGUgcnVuIGlzIG1hcmtlZCBhc1xuICAgKiBjb21wcmVzc2lvbi1jYXBhYmxlIChzcGVjVmVyc2lvbiA+PSA1KS5cbiAgICovXG4gIHJ1blNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogTGF6eSBzdGVwIHN0YXJ0OiB0aGUgYWxyZWFkeS1kZWh5ZHJhdGVkIHN0ZXAgaW5wdXQuIFdoZW4gcHJvdmlkZWQsIHRoZVxuICAgKiBgc3RlcF9zdGFydGVkYCBldmVudCBjYXJyaWVzIHRoaXMgaW5wdXQgc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlIHN0ZXAgb25cbiAgICogdGhlIGZseSAobm8gc2VwYXJhdGUgYHN0ZXBfY3JlYXRlZGAgcm91bmQtdHJpcCkuIFNldCBieSB0aGUgb3duZWQtaW5saW5lXG4gICAqIHBhdGggZm9yIHRoZSBzdGVwIHdob3NlIGBzdGVwX2NyZWF0ZWRgIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgZGVmZXJyZWQuXG4gICAqIFRoZSB3b3JsZCdzIGF0b21pYyBjcmVhdGUtY2xhaW0gaXMgdGhlIGV4YWN0bHktb25lLW93bmVyIGdhdGU6IGxvc2luZyBpdFxuICAgKiBzdXJmYWNlcyBhcyBgRW50aXR5Q29uZmxpY3RFcnJvcmAg4oaSIGB7IHR5cGU6ICdza2lwcGVkJyB9YCwgc28gYSBoYW5kbGVyXG4gICAqIHRoYXQgZGlkIG5vdCB3aW4gdGhlIGNyZWF0ZSBuZXZlciBydW5zIHRoZSBib2R5LiBPbWl0dGVkIG9uIGV2ZXJ5IG90aGVyXG4gICAqIHBhdGgsIHdoZXJlIHRoZSBzdGVwIGFscmVhZHkgaGFzIGEgYHN0ZXBfY3JlYXRlZGAgYW5kIGBzdGVwX3N0YXJ0ZWRgXG4gICAqIGNhcnJpZXMgbm8gcGF5bG9hZCAodGhlIGxlZ2FjeSBjb250cmFjdCkuXG4gICAqL1xuICBsYXp5U3RlcElucHV0PzogU2VyaWFsaXplZERhdGE7XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXA6IHRoZSBxdWV1ZSBtZXNzYWdlIElEIG9mIHRoZSBpbnZvY2F0aW9uIHRoaXNcbiAgICogZXhlY3V0ZVN0ZXAgY2FsbCBydW5zIGluIChmcm9tIHRoZSBxdWV1ZSBoYW5kbGVyJ3MgbWV0YSkuIFdoZW4gc2V0LCB0aGVcbiAgICogYHN0ZXBfc3RhcnRlZGAgdGhpcyBjYWxsIHNlbmRzIGlzIHN0YW1wZWQgd2l0aCBpdCDigJQgb24gdGhlIGxhenkgcGF0aHNcbiAgICogKHdoZXJlIGBsYXp5U3RlcElucHV0YCBpcyBwcmVzZW50KSBhbmQgb24gdGhlIG93bmVkLXJlY292ZXJ5XG4gICAqIHBheWxvYWQtbGVzcyBzdGFydCAod2hlcmUgaXQgaXMgbm90OyB0aGUgcmUtc3RhbXAga2VlcHMgYSByZWNvdmVyZWRcbiAgICogc3RlcCByZWFkYWJsZSBhcyBvd25lZCBieSB0aGlzIG1lc3NhZ2UsIHNpbmNlIG93bmVyc2hpcCBkZXJpdmVzIGZyb21cbiAgICogdGhlIExBVEVTVCBzdGFydCDigJQgc28gYSByZWNvdmVyeSBzdGFydCBpcyBuZXZlciBiYXJlKS4gV2FrZVxuICAgKiByZXBsYXlzIHRoYXQgb2JzZXJ2ZSBhbiBhY3RpdmVseS1vd25lZCBzdGVwIHN1cHByZXNzIHRoZSBpbW1lZGlhdGVcbiAgICogcmVxdWV1ZSBhbmQgZW5xdWV1ZSBhIGRlbGF5ZWQgYmFja3N0b3AgaW5zdGVhZC4gT21pdHRlZCBvbiB0aGVcbiAgICogYmFja2dyb3VuZC1zdGVwIHBhdGgsIHdob3NlIGJhcmUgc3RhcnQgaW50ZW50aW9uYWxseSBjbGVhcnMgb3duZXJzaGlwXG4gICAqICh0aGUgc3RlcCBpcyBxdWV1ZS1vd25lZCBmcm9tIHRoYXQgcG9pbnQpLlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbmxpbmUtZGVsdGEgb3B0aW1pemF0aW9uIChvcHQtaW4pLiBXaGVuIHByb3ZpZGVkLCB0aGUgY3Vyc29yIG9mIHRoZVxuICAgKiBldmVudCBsb2cgYXMgb2JzZXJ2ZWQgYnkgdGhlIGNhbGxlciAqYmVmb3JlKiB0aGlzIHN0ZXAncyBldmVudHMgd2VyZVxuICAgKiB3cml0dGVuLiBJdCBpcyB0aHJlYWRlZCBpbnRvIHRoZSBzdGVwLXRlcm1pbmFsIGBldmVudHMuY3JlYXRlYCBzbyBhXG4gICAqIHN1cHBvcnRpbmcgV29ybGQgY2FuIHJldHVybiB0aGUgZGVsdGEgb2YgZXZlbnRzIHdyaXR0ZW4gc2luY2UgKHNlZVxuICAgKiB7QGxpbmsgaW1wb3J0KCdAd29ya2Zsb3cvd29ybGQnKS5DcmVhdGVFdmVudFBhcmFtcy5zaW5jZUN1cnNvcn0pLlxuICAgKiBPbmx5IHNldCB0aGlzIHdoZW4gYGNvcnJlbGF0aW9uSWRgLWJhc2VkIG93bmVyc2hpcCBndWFyYW50ZWVzIHRoaXNcbiAgICogaGFuZGxlciBpcyB0aGUgc29sZSBpbmxpbmUgd3JpdGVyIGZvciB0aGUgcnVuIG9uIHRoaXMgaXRlcmF0aW9uLlxuICAgKi9cbiAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyBtdWNoIG9mIHRoZSBydW4ncyBsb2cgdGhlIGNhbGxlcidzIHJlcGxheSBoYWQgbG9hZGVkIHdoZW4gaXQgc2NoZWR1bGVkXG4gICAqIHRoaXMgc3RlcCwgYXMgdGhlIGhpZ2hlc3Qgc2xvdCB0aGF0IGxvZyBvY2N1cGllcy4gU2VlZHMgdGhlIHNuYXBzaG90IGV2ZXJ5XG4gICAqIHdyaXRlIHRoaXMgZXhlY3V0b3IgbWFrZXMgY2FycmllczsgZWFjaCBjb21taXR0ZWQgZXZlbnQgYWR2YW5jZXMgaXQgdG8gaXRzXG4gICAqIG93biBzbG90LCBzbyBhIGxhdGVyIHdyaXRlIG5ldmVyIG5hbWVzIGEgcG9zaXRpb24gdGhhdCBwcmVkYXRlcyBhbiBlYXJsaWVyXG4gICAqIG9uZSBmcm9tIHRoZSBzYW1lIHN0ZXAuXG4gICAqXG4gICAqIEl0IG1hdHRlcnMgbW9zdCBvbiB0aGUgbGF6eSBpbmxpbmUgcGF0aCwgd2hlcmUgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNsYWltIGlzXG4gICAqIHRoZSBzdGVwJ3MgRklSU1QgZHVyYWJsZSB3cml0ZSAoaXRzIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkKTogd2l0aG91dCBhXG4gICAqIHNlZWQgdGhlIGNsYWltIHdvdWxkIG5hbWUgbm8gcG9zaXRpb24gYXQgYWxsLCBhbmQgYSByZXBsYXkgd29ya2luZyBmcm9tIGFcbiAgICogc3RhbGUgdmlldyBjb3VsZCBjbGFpbSDigJQgYW5kIHRoZW4gY29tbWl0IOKAlCBhIHN0ZXAgc2NoZWR1bGVkIHdpdGhvdXRcbiAgICogb2JzZXJ2aW5nIGFuIGV2ZW50IGl0IG5ldmVyIGxvYWRlZC5cbiAgICpcbiAgICogQSBXb3JsZCB0aGF0IGZlbmNlcyByZWplY3RzIGEgc3RhbGUgY2xhaW0gd2l0aCBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgXG4gICAqICg0MTIpOyBleGVjdXRlU3RlcCBkb2VzIE5PVCB0cmFuc2xhdGUgdGhhdCByZWplY3Rpb24gKHJlLWNsYWltaW5nIGluIHBsYWNlXG4gICAqIHdvdWxkIHN0aWxsIGNvbW1pdCB0aGUgc3RhbGUgc2NoZWR1bGUpLCBzbyBpdCBwcm9wYWdhdGVzIGZvciB0aGUgY2FsbGVyIHRvXG4gICAqIGFiYW5kb24gdGhlIGJhdGNoIGFuZCByZXN0YXJ0IGl0cyByZXBsYXkuIFVuZGVmaW5lZCBmb3IgYSBjYWxsZXIgd2l0aFxuICAgKiBub3RoaW5nIGxvYWRlZC5cbiAgICovXG4gIHNsb3RTbmFwc2hvdD86IFNsb3RTbmFwc2hvdFBhcmFtcztcbiAgLyoqXG4gICAqIFN1cHByZXNzIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IGZvciB0aGlzIHN0ZXAgcmVnYXJkbGVzcyBvZlxuICAgKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgIC8gYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YDogdGFrZSB0aGVcbiAgICogYXdhaXQtdGhlbi1ydW4gcGF0aCBzbyB0aGUgYm9keSBvbmx5IHJ1bnMgYWZ0ZXIgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNsYWltXG4gICAqIHN1Y2NlZWRzLiBTZXQgYnkgdGhlIHJ1bnRpbWUgZm9yIGd1YXJkLWVuZm9yY2VkIGJhdGNoZXMgdGhhdCBhcmVcbiAgICogc3RhbGUtc2Vuc2l0aXZlIChhbiBvcGVuIGhvb2sgbWVhbnMgYW4gb3V0LW9mLWJhbmQgZXZlbnQgY2FuIG1ha2UgdGhlXG4gICAqIHNjaGVkdWxpbmcgdmlldyBzdGFsZSk6IHRoZSBndWFyZCdzIDQxMiBmZW5jZSBjYW4gcmVqZWN0IGEgc3RhbGUgY2xhaW0nc1xuICAgKiBkdXJhYmxlIHdyaXRlcywgYnV0IGl0IGNhbm5vdCB1bi1ydW4gYSBib2R5IHRoYXQgb3B0aW1pc3RpYyBzdGFydCBiZWdhblxuICAgKiBiZWZvcmUgdGhlIGNsYWltIHNldHRsZWQg4oCUIGF3YWl0aW5nIHRoZSBjbGFpbSBleHRlbmRzIHRoZSBmZW5jZSB0byB1c2VyXG4gICAqIGNvZGUuIFdpbnMgb3ZlciBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIGFuZCB0aGUgZW52IGZsYWcuXG4gICAqL1xuICBzdXBwcmVzc09wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCByZWdhcmRsZXNzIG9mXG4gICAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVGAuIFNldCBieSB0dXJibyBtb2RlIG9uIHRoZSBmaXJzdCBkZWxpdmVyeVxuICAgKiBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbiwgd2hlcmUgZm9yY2luZyBpdCBpcyBzYWZlOiB0aGVyZSBpcyBubyBjb25jdXJyZW50XG4gICAqIHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0sIHNvIHRoZSBib2R5IHJ1bnMgZXhhY3RseSBvbmNlLiBPbmx5XG4gICAqIG1lYW5pbmdmdWwgdG9nZXRoZXIgd2l0aCBgbGF6eVN0ZXBJbnB1dGAgKGEgYnJhbmQtbmV3IGxhenkgc3RlcCkuXG4gICAqL1xuICBmb3JjZU9wdGltaXN0aWNTdGFydD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuIFdoZW4gc2V0LCB0aGUgbGF6eS9vcHRpbWlzdGljIGBzdGVwX3N0YXJ0ZWRgIGlzXG4gICAqIGNoYWluZWQgb24gaXQgc28gdGhlIHN0ZXAgaXMgbmV2ZXIgY3JlYXRlZCBiZWZvcmUgaXRzIHJ1biBleGlzdHMuIFRoZSBib2R5XG4gICAqIHN0aWxsIHJ1bnMgaW1tZWRpYXRlbHkgYWdhaW5zdCBsb2NhbGx5LXN5bnRoZXNpemVkIHN0YXRlIOKAlCBvbmx5IHRoZSBuZXR3b3JrXG4gICAqIHdyaXRlIHdhaXRzIOKAlCBzbyB0aGUgYHJ1bl9zdGFydGVkYCByb3VuZC10cmlwIG92ZXJsYXBzIHRoZSBib2R5LiBgdW5kZWZpbmVkYFxuICAgKiBvdXRzaWRlIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIHdhcyBhbHJlYWR5IGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+O1xuICAvKipcbiAgICogTGF0ZW5jeSB0ZWxlbWV0cnkgKFRURlMgLyBTVFNPKTogZWxpZ2liaWxpdHkgYW5kIGFuY2hvciB0aW1lc3RhbXBzIGRlY2lkZWRcbiAgICogYnkgdGhlIG9yY2hlc3RyYXRvci4gV2hlbiBzZXQsIHRoaXMgZXhlY3V0b3IgY29tcHV0ZXMgdGhlIGZpbmFsIHZhbHVlc1xuICAgKiBhZ2FpbnN0IHRoZSB3YWxsIGNsb2NrIHRha2VuIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2VyIGNvZGUgcnVucyBhbmRcbiAgICogYXR0YWNoZXMgdGhlbSB0byB0aGUgc3RlcCdzIHRlcm1pbmFsIGV2ZW50LiBTZXQgb25seSBmb3IgdGhlIGZpcnN0IHN0ZXAgb2ZcbiAgICogYW4gaW5saW5lIGJhdGNoLCBhbmQgb25seSBvbiBmaXJzdC1hdHRlbXB0IGV4ZWN1dGlvbnMgdGhhdCBxdWFsaWZ5IOKAlCBzZWVcbiAgICogcnVudGltZS9zdGVwLWxhdGVuY3kudHMuXG4gICAqL1xuICBsYXRlbmN5VHJhY2tpbmc/OiBTdGVwTGF0ZW5jeVRyYWNraW5nO1xuICAvKipcbiAgICogSG9vay1yZXN1bWUgVFRSIHRlbGVtZXRyeTogdGhlIGJvdW5kYXJpZXMgb2YgYSBob29rIHJlc3VtcHRpb24gd2hvc2UgbmV4dFxuICAgKiBkdXJhYmxlIHN0ZXAgaXMgdGhlIG9uZSB0aGlzIGNhbGwgaXMgYWJvdXQgdG8gZXhlY3V0ZS4gV2hlbiBzZXQsIHRoZVxuICAgKiBleGVjdXRvciBjbG9zZXMgdGhlIG1lYXN1cmVtZW50IGFnYWluc3QgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNsYWltIGFuZCB0aGVcbiAgICogd2FsbCBjbG9jayB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdXNlciBjb2RlLCBhbmQgYXR0YWNoZXMgdGhlIHRvdGFsIHBsdXNcbiAgICogaXRzIHBoYXNlIGJyZWFrZG93biB0byB0aGlzIHN0ZXAncyBgc3RlcC5leGVjdXRlYCBzcGFuLiBTZXQgYnkgdGhlIHJ1bnRpbWVcbiAgICogZm9yIGV4YWN0bHkgb25lIHN0ZXAgcGVyIHJlc3VtcHRpb24g4oCUIHNlZSBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzLlxuICAgKi9cbiAgcmVzdW1lVHJhY2tpbmc/OiBSZXN1bWVUdHJUcmFja2luZztcbiAgLyoqXG4gICAqIEF1dGhvcml0YXRpdmUgYXR0ZW1wdCBudW1iZXIgZm9yIHRoaXMgZXhlY3V0aW9uLCB1c2VkIHRvIGJvdW5kIHJldHJpZXNcbiAgICogYWdhaW5zdCBgbWF4UmV0cmllc2AgQkVGT1JFIHRoZSBib2R5IHJ1bnMuIEluIG9yZGVyIHRvIGFsc28gY2F0Y2hcbiAgICogc3RlcCB0aW1lb3V0cyAod2hpY2ggd2UgY2FuJ3QgaGF2ZSBjYXRjaCBoYW5kbGVycyBmb3IpLCB3ZSBkZXRlcm1pbmVcbiAgICogdGhlIGF0dGVtcHQgY291bnQgYmFzZWQgYXMgZm9sbG93czpcbiAgICogLSBJbmxpbmUgKGNvbWJpbmVkIGhhbmRsZXIpOiB0aGUgbnVtYmVyIG9mIGBzdGVwX3N0YXJ0ZWRgIGV2ZW50cyBhbHJlYWR5XG4gICAqICAgaW4gdGhlIGV2ZW50IGxvZyBmb3IgdGhpcyBzdGVwLCBwbHVzIG9uZSBmb3IgdGhlIGF0dGVtcHQgYWJvdXQgdG8gcnVuLlxuICAgKiAtIEJhY2tncm91bmQgKHF1ZXVlLWRpc3BhdGNoZWQpOiB0aGUgcXVldWUgZGVsaXZlcnkgY291bnRcbiAgICogICAoYG1ldGFkYXRhLmF0dGVtcHRgKSwgd2hpY2ggaW5jcmVtZW50cyBvbiBldmVyeSByZWRlbGl2ZXJ5LlxuICAgKi9cbiAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ/OiBudW1iZXI7XG4gIC8qKiBPbmUtc2hvdCByZWNvdmVyeSB0ZWxlbWV0cnkgYWN0aXZhdGVkIGJ5IHRoZSBvcmNoZXN0cmF0b3IgcmVwbGF5LiAqL1xuICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyPzogUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcjtcbn1cblxuLyoqXG4gKiBJbmxpbmUtZGVsdGEgcmV0dXJuZWQgYnkgYSBzdGVwLXRlcm1pbmFsIHdyaXRlIHdoZW4gdGhlIGNhbGxlciBwYXNzZWRcbiAqIHtAbGluayBTdGVwRXhlY3V0b3JQYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvcn0gYW5kIHRoZSBXb3JsZCBzdXBwb3J0c1xuICogdGhlIG9wdGltaXphdGlvbi4gYGV2ZW50c2AgYXJlIHRoZSBldmVudHMgd3JpdHRlbiBzdHJpY3RseSBhZnRlciB0aGF0XG4gKiBjdXJzb3IgKHRoaXMgc3RlcCdzIGV2ZW50cyBwbHVzIGFueXRoaW5nIGludGVybGVhdmVkIGluLWJhbmQpLCBgY3Vyc29yYFxuICogaXMgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3Qgb25lLCBhbmQgYGhhc01vcmVgIHNpZ25hbHMgYSBmdXJ0aGVyIHBhZ2VcbiAqICh0aGUgY2FsbGVyIHRoZW4gZmFsbHMgYmFjayB0byBhIGZ1bGwgaW5jcmVtZW50YWwgZmV0Y2gpLiBBYnNlbnQgd2hlblxuICogdGhlIFdvcmxkIGRpZCBub3QgcmV0dXJuIGEgZGVsdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lRXZlbnREZWx0YSB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICBoYXNNb3JlOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhIHN0ZXAgZXhlY3V0aW9uIGF0dGVtcHQuIFRoZSBjYWxsZXIgZGVjaWRlcyB3aGF0IHRvIGRvXG4gKiBiYXNlZCBvbiB0aGUgcmVzdWx0IHR5cGUgKGUuZy4sIHF1ZXVlIHdvcmtmbG93IGNvbnRpbnVhdGlvbiwgcmVwbGF5IGlubGluZSwgZXRjLikuXG4gKlxuICogYGlubGluZURlbHRhYCBpcyBhdHRhY2hlZCB0byBhIGBjb21wbGV0ZWRgIHJlc3VsdCB3aGVuIHRoZSBjYWxsZXJcbiAqIHJlcXVlc3RlZCBpdCB2aWEge0BsaW5rIFN0ZXBFeGVjdXRvclBhcmFtcy5pbmxpbmVEZWx0YVNpbmNlQ3Vyc29yfSBhbmRcbiAqIHRoZSBXb3JsZCByZXR1cm5lZCBvbmUuIFN0ZXAgZmFpbHVyZXMgYXJlIHJhcmUgYW5kIG5vdCB0aGUgaW5saW5lXG4gKiBvcHRpbWl6YXRpb24ncyB0YXJnZXQsIHNvIHRoZSBgZmFpbGVkYCBwYXRoIGxlYXZlcyBpdCB0byB0aGUgbm9ybWFsXG4gKiBpbmNyZW1lbnRhbCBmZXRjaC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RlcEV4ZWN1dGlvblJlc3VsdCA9XG4gIHwge1xuICAgICAgdHlwZTogJ2NvbXBsZXRlZCc7XG4gICAgICBoYXNQZW5kaW5nT3BzPzogYm9vbGVhbjtcbiAgICAgIGlubGluZURlbHRhPzogSW5saW5lRXZlbnREZWx0YTtcbiAgICB9XG4gIHwgeyB0eXBlOiAnZmFpbGVkJyB9XG4gIHwgeyB0eXBlOiAncmV0cnknOyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH1cbiAgfCB7IHR5cGU6ICdza2lwcGVkJyB9XG4gIHwgeyB0eXBlOiAnZ29uZScgfVxuICB8IHsgdHlwZTogJ3Rocm90dGxlZCc7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfTtcblxuLyoqXG4gKiBFeGVjdXRlcyBhIHNpbmdsZSBzdGVwOiBjcmVhdGVzIHN0ZXBfc3RhcnRlZCBldmVudCwgaHlkcmF0ZXMgaW5wdXQsXG4gKiBydW5zIHRoZSBzdGVwIGZ1bmN0aW9uLCBjcmVhdGVzIHN0ZXBfY29tcGxldGVkL3N0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcgZXZlbnRzLlxuICpcbiAqIERvZXMgTk9UIHF1ZXVlIHdvcmtmbG93IGNvbnRpbnVhdGlvbiBtZXNzYWdlcyDigJQgdGhlIGNhbGxlciBkZWNpZGVzIHdoYXQgdG8gZG8gbmV4dC5cbiAqIFVzZWQgYnkgdGhlIGNvbWJpbmVkIHdvcmtmbG93IGhhbmRsZXIgZm9yIHN0ZXAgZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVN0ZXAoXG4gIHBhcmFtczogU3RlcEV4ZWN1dG9yUGFyYW1zXG4pOiBQcm9taXNlPFN0ZXBFeGVjdXRpb25SZXN1bHQ+IHtcbiAgY29uc3Qge1xuICAgIHdvcmxkLFxuICAgIHdvcmtmbG93UnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93U3RhcnRlZEF0LFxuICAgIHN0ZXBJZCxcbiAgICBzdGVwTmFtZSxcbiAgfSA9IHBhcmFtcztcbiAgLy8gVHJ1dGhpbmVzcywgbm90IHByZXNlbmNlOiBgdmVyY2VsIGVudiBwdWxsYCB3cml0ZXMgYFZFUkNFTF9VUkw9XCJcImAgaW50b1xuICAvLyBgLmVudi5sb2NhbGAsIGFuZCBhIGZyYW1ld29yayB0aGF0IGxvYWRzIHRoYXQgZmlsZSBsb2NhbGx5IHdvdWxkIG90aGVyd2lzZVxuICAvLyBwdXQgdXMgb24gdGhlIFZlcmNlbCBicmFuY2ggd2l0aCBub3RoaW5nIHRvIGJ1aWxkIGEgaG9zdCBmcm9tLCBtYWtpbmdcbiAgLy8gYGh0dHBzOi8vYCB0aGUgYmFzZSBVUkwgb2YgZXZlcnkgc3RlcC5cbiAgY29uc3QgaXNWZXJjZWwgPSBCb29sZWFuKHByb2Nlc3MuZW52LlZFUkNFTF9VUkwpO1xuICAvLyBHYXRlIHBheWxvYWQgY29tcHJlc3Npb24gb24gdGhlIHJ1bidzIHNwZWNWZXJzaW9uLlxuICBjb25zdCBjb21wcmVzc2lvbiA9XG4gICAgKHBhcmFtcy5ydW5TcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG4gIGNvbnN0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPVxuICAgIHBhcmFtcy5yZXBsYXlSZWNvdmVyeVJlcG9ydGVyID8/IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgLyoqXG4gICAqIFRoZSBoaWdoZXN0IGxvZyBzbG90IHRoaXMgZXhlY3V0b3Iga25vd3MgYWJvdXQsIHNlZWRlZCBmcm9tIHRoZSB2aWV3IGl0c1xuICAgKiBjYWxsZXIgc2NoZWR1bGVkIHRoZSBzdGVwIGFnYWluc3QgYW5kIGFkdmFuY2VkIGJ5IGV2ZXJ5IGV2ZW50IGl0IGNvbW1pdHMuXG4gICAqXG4gICAqIEFkdmFuY2luZyBpcyB3aGF0IGtlZXBzIHRoZSBzbmFwc2hvdCBob25lc3QgYWNyb3NzIGEgc3RlcCdzIG93biB3cml0ZXMuIEFcbiAgICogc3RlcCBjb21taXRzIGBzdGVwX3N0YXJ0ZWRgIGFuZCB0aGVuIGBzdGVwX2NvbXBsZXRlZGA7IGlmIHRoZSBzZWNvbmQgc3RpbGxcbiAgICogbmFtZWQgdGhlIGNhbGxlcidzIG9yaWdpbmFsIHBvc2l0aW9uLCB0aGUgV29ybGQgd291bGQgcmVwb3J0IHRoZSBmaXJzdCBvbmVcbiAgICogYmFjayBhcyBhbiBldmVudCB0aGlzIHdyaXRlciBoYWQgbm90IHNlZW4sIG9uIGV2ZXJ5IHN0ZXAsIGZvcmV2ZXIuXG4gICAqXG4gICAqIFRoaXMgcmVhZHMgYSByZXBvcnQgZm9yIGl0cyBoaWdoZXN0IHBvc2l0aW9uIGFuZCB0aGVuIGRpc2NhcmRzIGl0LCB3aGVyZVxuICAgKiB0aGUgcmVwbGF5IGxvb3AgYW5kIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgbWVyZ2UgdGhlaXJzIHdpdGhcbiAgICogYGFic29yYlNraXBwZWRTbG90UmVwb3J0YC4gVGhhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsZXJzLCBub3RcbiAgICogYW4gb3ZlcnNpZ2h0OiBhbiBleGVjdXRvciBob2xkcyBubyBsb2FkZWQgbG9nIHRvIG1lcmdlIGludG8uIEl0IHJ1bnMgZnJvbSBhXG4gICAqIHF1ZXVlZCBkZWxpdmVyeSB3aG9zZSBvbmx5IHZpZXcgb2YgdGhlIGxvZyBpcyB0aGUgaW50ZWdlciBpdHMgY2FsbGVyIHBhc3NlZFxuICAgKiBpbiwgc28gdGhlIHBvc2l0aW9uIGlzIHRoZSBlbnRpcmUgdmFsdWUgdGhlIHJlcG9ydCBoYXMgdG8gaXQuIFdob2V2ZXJcbiAgICogcmVwbGF5cyBuZXh0IGxvYWRzIHRoZSBsb2cgYW5kIGdldHMgdGhlIGV2ZW50cyB0aGVtc2VsdmVzLlxuICAgKi9cbiAgbGV0IGtub3duU2xvdCA9IHBhcmFtcy5zbG90U25hcHNob3Q/LmV2ZW50Q291bnQ7XG4gIGNvbnN0IG9ic2VydmVTbG90ID0gKHJlc3VsdDogeyBldmVudD86IEV2ZW50OyBldmVudHM/OiBFdmVudFtdIH0pOiB2b2lkID0+IHtcbiAgICBpZiAoa25vd25TbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoZSBjYWxsZXIgc2NoZWR1bGVkIHRoaXMgc3RlcCB3aXRob3V0IG5hbWluZyBhIHBvc2l0aW9uLCBzbyB0aGVyZSBpc1xuICAgICAgLy8gbm8gc25hcHNob3QgdG8gYWR2YW5jZSBhbmQgdGhlIHdyaXRlcyBiZWxvdyBzZW5kIG5vbmUuIE5vdCB0aGUgc2FtZSBhc1xuICAgICAgLy8gYSBydW4gd2l0aG91dCBwb3NpdGlvbnM6IGV2ZXJ5IHJ1biBoYXMgdGhlbSwgdGhpcyBleGVjdXRvciBqdXN0IHdhcyBub3RcbiAgICAgIC8vIHRvbGQgd2hpY2ggb25lIGl0IHN0YXJ0ZWQgZnJvbS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb2JzZXJ2ZWQ6IG51bWJlcltdID0gW107XG4gICAgaWYgKHJlc3VsdC5ldmVudCkge1xuICAgICAgb2JzZXJ2ZWQucHVzaChyZXF1aXJlRXZlbnRTbG90KHJlc3VsdC5ldmVudC5ldmVudElkKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcG9ydGVkID0gbWF4RXZlbnRTbG90KHJlc3VsdC5ldmVudHMgPz8gW10pO1xuICAgIGlmIChyZXBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYnNlcnZlZC5wdXNoKHJlcG9ydGVkKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzbG90IG9mIG9ic2VydmVkKSB7XG4gICAgICBpZiAoc2xvdCA+IGtub3duU2xvdCkge1xuICAgICAgICBrbm93blNsb3QgPSBzbG90O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgY3JlYXRlRXZlbnQgPSBhc3luYyA8VCBleHRlbmRzIENyZWF0ZUV2ZW50UmVxdWVzdD4oXG4gICAgZGF0YTogVCxcbiAgICBldmVudFBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIud2l0aEV2ZW50Q3JlYXRlKFxuICAgICAga25vd25TbG90ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBldmVudFBhcmFtc1xuICAgICAgICA6IHsgZXZlbnRDb3VudDoga25vd25TbG90LCAuLi5ldmVudFBhcmFtcyB9LFxuICAgICAgKHApID0+IHdvcmxkLmV2ZW50cy5jcmVhdGUod29ya2Zsb3dSdW5JZCwgZGF0YSwgcClcbiAgICApO1xuICAgIG9ic2VydmVTbG90KHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBjb25zdCBzcGFuTmFtZSA9IGBzdGVwLmV4ZWN1dGUgJHtzdGVwRGlzcGxheU5hbWUoc3RlcE5hbWUpfWA7XG4gIHJldHVybiB0cmFjZShzcGFuTmFtZSwge30sIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcE5hbWUoc3RlcE5hbWUpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcElkKHN0ZXBJZCksXG4gICAgfSk7XG5cbiAgICAvLyBNZW1vaXplZCBhY2Nlc3NvciBmb3IgdGhlIHBlci1ydW4gZW5jcnlwdGlvbiBrZXkuIFRoZSBmaXJzdCBjYWxsZXJcbiAgICAvLyAoaW5wdXQgaHlkcmF0aW9uIG9uIHRoZSBzdWNjZXNzIHBhdGgsIG9yIG9uZSBvZiB0aGUgZWFybHktcmV0dXJuXG4gICAgLy8gZGVoeWRyYXRlU3RlcEVycm9yIHBhdGhzIGlmIHN0ZXBfc3RhcnRlZCBmYWlscykgdHJpZ2dlcnMgdGhlIGFjdHVhbFxuICAgIC8vIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uOyBzdWJzZXF1ZW50IGNhbGxlcnMgYXdhaXQgdGhlIGNhY2hlZCBwcm9taXNlLlxuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW5JZCk7XG5cbiAgICBjb25zdCBzdGVwRm4gPSBnZXRTdGVwRnVuY3Rpb24oc3RlcE5hbWUpO1xuICAgIGlmICghc3RlcEZuIHx8IHR5cGVvZiBzdGVwRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFN0ZXAgZnVuY3Rpb24gbm90IHJlZ2lzdGVyZWQg4oCUIGZhaWwgdGhlIHN0ZXAgaW1tZWRpYXRlbHkgKG5vdCB0aGUgcnVuKS5cbiAgICAgIC8vIENyZWF0ZSBhIHN0ZXBfZmFpbGVkIGV2ZW50IHNvXG4gICAgICAvLyB0aGUgd29ya2Zsb3cgY2FuIGhhbmRsZSBpdCBncmFjZWZ1bGx5IHZpYSB0cnkvY2F0Y2ggaW4gdXNlciBjb2RlLlxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgXCIke3N0ZXBOYW1lfVwiIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuIFRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYSBidWlsZCBvciBidW5kbGluZyBpc3N1ZSB0aGF0IGNhdXNlZCB0aGUgc3RlcCB0byBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGRlcGxveW1lbnQuYDtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1N0ZXAgZnVuY3Rpb24gbm90IHJlZ2lzdGVyZWQsIGZhaWxpbmcgc3RlcCcsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgIH0pO1xuICAgICAgLy8gT24gdGhlIGxhenkgaW5saW5lIHBhdGggdGhlIHN1c3BlbnNpb24gaGFuZGxlciBkZWZlcnJlZCB0aGlzIHN0ZXAnc1xuICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIGV4cGVjdGluZyBleGVjdXRlU3RlcCB0byBtYXRlcmlhbGl6ZSB0aGUgc3RlcCB2aWEgYVxuICAgICAgLy8gbGF6eSBgc3RlcF9zdGFydGVkYCBjYXJyeWluZyBpdHMgaW5wdXQuIFdlIG5ldmVyIGdldCB0aGF0IGZhciBmb3IgYW5cbiAgICAgIC8vIHVucmVnaXN0ZXJlZCBzdGVwLCBzbyB0aGUgc3RlcCBlbnRpdHkgZG9lcyBub3QgZXhpc3QgeWV0IOKAlCB3cml0aW5nXG4gICAgICAvLyBgc3RlcF9mYWlsZWRgIHN0cmFpZ2h0IGF3YXkgd291bGQgaGl0IHRoZSB3b3JsZCdzIFwic3RlcCBtdXN0IGV4aXN0XCJcbiAgICAgIC8vIG9yZGVyaW5nIGd1YXJkIGFuZCB3ZWRnZSB0aGUgcnVuLiBTZW5kIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIGZpcnN0XG4gICAgICAvLyAoaXQgY3JlYXRlcyB0aGUgc3RlcCArIHN5bnRoZXRpYyBgc3RlcF9jcmVhdGVkYCBhdG9taWNhbGx5IGFuZCBrZWVwc1xuICAgICAgLy8gcmVwbGF5IGNvcnJlY3QpLCB0aGVuIGZhaWwgaXQgYmVsb3cuIFRoaXMgYWxzbyBwcmVzZXJ2ZXMgdGhlXG4gICAgICAvLyBleGFjdGx5LW9uZS1vd25lciBndWFyYW50ZWU6IGEgY29uY3VycmVudCBoYW5kbGVyIHRoYXQgd29uIHRoZSBjcmVhdGVcbiAgICAgIC8vIG1ha2VzIG91ciBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHJlamVjdCB3aXRoIEVudGl0eUNvbmZsaWN0RXJyb3Ig4oaSIHdlXG4gICAgICAvLyByZXR1cm4gYHNraXBwZWRgIGFuZCBuZXZlciB3cml0ZSB0aGUgZmFpbHVyZSB0d2ljZS5cbiAgICAgIGlmIChwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHVyYm86IHRoaXMgbGF6eSBgc3RlcF9zdGFydGVkYCBtdXN0IG5vdCBwcmVjZWRlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgLiBPcmRlciBpdCBhZnRlciB0aGUgcnVuLXJlYWR5IGJhcnJpZXIgKGJlc3QtZWZmb3J0IOKAlFxuICAgICAgICAgIC8vIGEgYmFycmllciByZWplY3Rpb24gbWVhbnMgdGhlIHJ1biBkb2Vzbid0IGV4aXN0LCBhbmQgdGhlIGNyZWF0ZVxuICAgICAgICAgIC8vIGJlbG93IHN1cmZhY2VzIHRoZSByZWFsIGVycm9yKS4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICBpZiAocGFyYW1zLnJ1blJlYWR5QmFycmllcikge1xuICAgICAgICAgICAgYXdhaXQgcGFyYW1zLnJ1blJlYWR5QmFycmllci5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAvLyBTdGFtcGVkIGZvciBjb25zaXN0ZW5jeSBldmVuIHRob3VnaCB0aGlzIHN0ZXAgdGVybWluYWwtZmFpbHNcbiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBiZWxvdyDigJQgdGhlIGxvZyBzaG91bGQgbmV2ZXIgc2hvdyBhbiB1bm93bmVkXG4gICAgICAgICAgICAgICAgLy8gbGF6eSBzdGFydC5cbiAgICAgICAgICAgICAgICAuLi4ocGFyYW1zLm93bmVyTWVzc2FnZUlkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8geyBvd25lck1lc3NhZ2VJZDogcGFyYW1zLm93bmVyTWVzc2FnZUlkIH1cbiAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgY29tcHV0ZUluc3RhbmNlSWQ6IENPTVBVVEVfSU5TVEFOQ0VfSUQgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKHN0YXJ0RXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RhcnRFcnIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhzdGFydEVycikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBzdGFydEVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgfVxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnZmFpbGVkJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IG1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcyA/PyBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG5cbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICB9KTtcblxuICAgIC8vIG1heFJldHJpZXMgZW5mb3JjZWQgYmVmb3JlIHN0YXJ0aW5nIGFub3RoZXIgYXR0ZW1wdC4gVGltZW91dHMgY2FuIGtpbGxcbiAgICAvLyBhIHN0ZXAgZXhlY3V0aW9uIHdpdGhvdXQgYW55IHdheSB0byBjYXRjaCB0aGUgZXJyb3IsIHNvIHRoZSBwb3N0LWJvZHkvZXJyb3JcbiAgICAvLyBndWFyZHMgYmVsb3cgbWlnaHQgbWlzcyBpdC4gSGVuY2UsIHdlIHVzZSBgYXV0aG9yaXRhdGl2ZUF0dGVtcHRgIGNvdW50XG4gICAgLy8gYXMgYW4gYWRkaXRpb25hbCBndWFyZCBiYXNlZCBvbiBzdGVwX3N0YXJ0ZWQgY291bnQgb3IgcXVldWUgZGVsaXZlcnkgY291bnRcbiAgICAvLyBvbiBiYWNrZ3JvdW5kZWQgc3RlcHMuXG4gICAgLy8gVGhyb3duLWVycm9yIGV4aGF1c3Rpb24gc3RpbGwgdGVybWluYXRlcyBvbmUgYXR0ZW1wdCBlYXJsaWVyIHZpYSB0aGUgcG9zdC1ib2R5XG4gICAgLy8gZ3VhcmQgKHdpdGggdGhlIHRocm93biBlcnJvciBhcyBjYXVzZSksIGFuZCB0aGlzIGNoZWNrIGRvZXMgbm90IGFmZmVjdCB0aGF0LlxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5hdXRob3JpdGF0aXZlQXR0ZW1wdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMuYXV0aG9yaXRhdGl2ZUF0dGVtcHQgPiBtYXhSZXRyaWVzICsgMVxuICAgICkge1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IG1heFJldHJpZXM7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoJ1N0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBzdGVwSWQsXG4gICAgICAgIGF0dGVtcHQ6IHBhcmFtcy5hdXRob3JpdGF0aXZlQXR0ZW1wdCxcbiAgICAgICAgbWF4UmV0cmllcyxcbiAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSAoYSBjb25jdXJyZW50IGhhbmRsZXIgb3IgYW5cbiAgICAgICAgICAvLyBlYXJsaWVyIGRlbGl2ZXJ5IGZhaWxlZC9jb21wbGV0ZWQgaXQpIOKAlCBub3RoaW5nIHRvIGRvLlxuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAgZm9yIGV4Y2VlZGVkIHJldHJpZXMsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdnb25lJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgfVxuXG4gICAgLy8gTWFwcyBhIGBzdGVwX3N0YXJ0ZWRgIHJlamVjdGlvbiB0byBhIHRlcm1pbmFsIFN0ZXBFeGVjdXRpb25SZXN1bHQsXG4gICAgLy8gc2hhcmVkIGJ5IHRoZSBhd2FpdCBwYXRoIChiZWxvdykgYW5kIHRoZSBvcHRpbWlzdGljLXN0YXJ0IHJlY29uY2lsaWF0aW9uLlxuICAgIC8vIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGVycm9yIGlzIG5vdCBvbmUgd2UgdHJhbnNsYXRlIChjYWxsZXIgcmV0aHJvd3MpLlxuICAgIGNvbnN0IHN0YXJ0RXJyb3JUb1Jlc3VsdCA9IChcbiAgICAgIGVycjogdW5rbm93blxuICAgICk6IFN0ZXBFeGVjdXRpb25SZXN1bHQgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgaWYgKFRocm90dGxlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgMSxcbiAgICAgICAgICB0eXBlb2YgZXJyLnJldHJ5QWZ0ZXIgPT09ICdudW1iZXInID8gZXJyLnJldHJ5QWZ0ZXIgOiAxXG4gICAgICAgICk7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnVGhyb3R0bGVkIG9uIHN0ZXBfc3RhcnRlZCwgZGVmZXJyaW5nJywge1xuICAgICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeUFmdGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3Rocm90dGxlZCcsIHRpbWVvdXRTZWNvbmRzOiByZXRyeUFmdGVyIH07XG4gICAgICB9XG4gICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBXb3JrZmxvdyBydW4gXCIke3dvcmtmbG93UnVuSWR9XCIgaGFzIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwIFwiJHtzdGVwSWR9XCI6ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgfTtcbiAgICAgIH1cbiAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgc2tpcHBpbmcnLCB7XG4gICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgc3RlcElkLFxuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU2tpcHBlZCh0cnVlKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBSZWFzb24oJ2NvbXBsZXRlZCcpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAoVG9vRWFybHlFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHlldCByZWFjaGVkJywge1xuICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXRyeScsIHRpbWVvdXRTZWNvbmRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvLyBPcHRpbWlzdGljIGlubGluZSBzdGFydDogd2hlbiB3ZSBob2xkIHRoZSBzdGVwIGlucHV0IGxvY2FsbHkgKGxhenkgaW5saW5lXG4gICAgLy8gcGF0aCkgYW5kIHRoZSBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZCwgZmlyZSBgc3RlcF9zdGFydGVkYCBXSVRIT1VUXG4gICAgLy8gYXdhaXRpbmcgYW5kIHJ1biB0aGUgYm9keSBhZ2FpbnN0IGxvY2FsbHktc3ludGhlc2l6ZWQgc3RhdGUuIEEgbGF6eSBzdGVwXG4gICAgLy8gaXMgYWx3YXlzIGJyYW5kLW5ldyDih5IgYXR0ZW1wdCAxLCBubyBwcmlvciBlcnJvciwgc3RhcnRlZCBub3cg4oCUIHNvIHdlXG4gICAgLy8gZG9uJ3QgbmVlZCB0aGUgc2VydmVyIHJvdW5kLXRyaXAgdG8gYmVnaW4uIFdlIHJlY29uY2lsZSB0aGUgaW4tZmxpZ2h0XG4gICAgLy8gYHN0ZXBfc3RhcnRlZGAgYmVmb3JlIGFueSB0ZXJtaW5hbCB3cml0ZSAoYHJlY29uY2lsZU9wdGltaXN0aWNTdGFydGApOiBpZlxuICAgIC8vIGl0IGxvc3QgdGhlIGF0b21pYyBjcmVhdGUtY2xhaW0gKDQwOSkgb3IgdGhlIHJ1biBpcyBnb25lL3Rocm90dGxlZCwgd2VcbiAgICAvLyBkaXNjYXJkIHRoZSBib2R5IHJlc3VsdC4gUnVubmluZyB0aGUgYm9keSBiZWZvcmUgY29uZmlybWluZyBvd25lcnNoaXAgY2FuXG4gICAgLy8gZXhlY3V0ZSBhIHN0ZXAgbW9yZSB0aGFuIG9uY2Ugd2hlbiBoYW5kbGVycyByYWNlIOKAlCBpbmxpbmUgc3RlcCBib2RpZXNcbiAgICAvLyBtdXN0IGJlIGlkZW1wb3RlbnQ7IGRpc2FibGUgdmlhIFdPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUPTAuXG4gICAgLy9cbiAgICAvLyBUdXJibyBtb2RlIHBhc3NlcyBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIHRvIGVuYWJsZSB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlXG4gICAgLy8gZW52IGZsYWcgKGl0cyBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgcmVtb3ZlcyB0aGUgcmFjZSkuIEJ1dCBpdCBzdGlsbFxuICAgIC8vIGRlZmVycyB0byBhbiAqZXhwbGljaXQqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wYDogZm9yY2VkXG4gICAgLy8gb3B0aW1pc3RpYyBzdGFydCBydW5zIHRoZSBib2R5IGJlZm9yZSBgc3RlcF9zdGFydGVkYC9gcnVuX3N0YXJ0ZWRgIGlzXG4gICAgLy8gY29uZmlybWVkLCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9wZXJ0eSBhbiBvcGVyYXRvciBvcHRzIG91dCBvZiB3aXRoIHRoYXRcbiAgICAvLyBmbGFnLCBzbyBhbiBleHBsaWNpdCBvcHQtb3V0IHdpbnMgb3ZlciB0dXJibydzIGZvcmNlLlxuICAgIGNvbnN0IG9wdGltaXN0aWNTdGFydCA9XG4gICAgICBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAvLyBTdGFsZS1zZW5zaXRpdmUgZ3VhcmRlZCBiYXRjaGVzIGF3YWl0IHRoZSBjbGFpbSBzbyB0aGUgNDEyIGZlbmNlXG4gICAgICAvLyBjb3ZlcnMgdGhlIGJvZHksIG5vdCBqdXN0IGR1cmFibGUgd3JpdGVzIOKAlCBzZWVcbiAgICAgIC8vIFN0ZXBFeGVjdXRvclBhcmFtcy5zdXBwcmVzc09wdGltaXN0aWNTdGFydC5cbiAgICAgIHBhcmFtcy5zdXBwcmVzc09wdGltaXN0aWNTdGFydCAhPT0gdHJ1ZSAmJlxuICAgICAgKGlzT3B0aW1pc3RpY0lubGluZVN0YXJ0RW5hYmxlZCgpIHx8XG4gICAgICAgIChwYXJhbXMuZm9yY2VPcHRpbWlzdGljU3RhcnQgPT09IHRydWUgJiZcbiAgICAgICAgICAhaXNPcHRpbWlzdGljSW5saW5lU3RhcnRFeHBsaWNpdGx5RGlzYWJsZWQoKSkpO1xuXG4gICAgbGV0IHN0ZXA6IFN0YXJ0ZWRTdGVwO1xuICAgIC8vIFBhcmFtcyBmb3IgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNyZWF0ZSBvbiBlaXRoZXIgcGF0aCBiZWxvdy4gVGhlIHNsb3RcbiAgICAvLyBzbmFwc2hvdCBpcyBub3Qgc3ByZWFkIGhlcmU6IGBjcmVhdGVFdmVudGAgYXR0YWNoZXMgaXQgdG8gZXZlcnkgd3JpdGUsXG4gICAgLy8gdGhpcyBvbmUgaW5jbHVkZWQuXG4gICAgY29uc3Qgc3RhcnRFdmVudFBhcmFtczogQ3JlYXRlRXZlbnRQYXJhbXMgPSB7XG4gICAgICBjb21wdXRlSW5zdGFuY2VJZDogQ09NUFVURV9JTlNUQU5DRV9JRCxcbiAgICB9O1xuICAgIC8vIGBEYXRlLm5vdygpYCB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGBzdGVwX3N0YXJ0ZWRgIGNyZWF0ZSBpc1xuICAgIC8vIGlzc3VlZCAoZWl0aGVyIHBhdGggYmVsb3cpIOKAlCBhbmNob3JzIFJTRlMncyBlbmQgcG9pbnQuIFNlZVxuICAgIC8vIFN0ZXBMYXRlbmN5RXZlbnREYXRhLnJzZnMgYW5kIHRoZSBjYWxsIHNpdGVzIGJlbG93LlxuICAgIGxldCBzdGVwU3RhcnRQb3N0U2VudEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBgRGF0ZS5ub3coKWAgdGFrZW4gb25jZSB0aGUgYHN0ZXBfc3RhcnRlZGAgcmVzcG9uc2UgaGFzIHJldHVybmVkIGFuZCB0aGVcbiAgICAvLyBjbGFpbSBzdWNjZWVkZWQg4oCUIFQ2IG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93LiBPbmx5IHRoZSBhd2FpdCBwYXRoXG4gICAgLy8gY2FuIHNldCBpdDogb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IHdhaXQgZm9yIHRoZVxuICAgIC8vIGNsYWltIGJlZm9yZSBydW5uaW5nIHRoZSBib2R5LCBzbyBhdCBUNyBpdCBoYXMgbm8gY29tcGxldGlvbiBpbnN0YW50IGFuZFxuICAgIC8vIHRoZSBUVFIgYnJlYWtkb3duIHJlcG9ydHMgbm8gYHN0ZXBfY2xhaW1fbXNgIChzZWVcbiAgICAvLyBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKS5cbiAgICBsZXQgc3RlcENsYWltQ29tcGxldGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIC8vIFNldHRsZWQgb3V0Y29tZSBvZiB0aGUgaW4tZmxpZ2h0IG9wdGltaXN0aWMgYHN0ZXBfc3RhcnRlZGAuIEhhbmRsZXJzIGFyZVxuICAgIC8vIGF0dGFjaGVkIHN5bmNocm9ub3VzbHkgKGAudGhlbihvaywgZXJyKWApIHNvIGEgZmFzdCByZWplY3Rpb24gbmV2ZXJcbiAgICAvLyBzdXJmYWNlcyBhcyBhbiB1bmhhbmRsZWRSZWplY3Rpb24gd2hpbGUgdGhlIGJvZHkgcnVucy5cbiAgICBsZXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDpcbiAgICAgIHwgUHJvbWlzZTx7IG9rOiB0cnVlIH0gfCB7IG9rOiBmYWxzZTsgZXJyOiB1bmtub3duIH0+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICAvLyBBd2FpdCB0aGUgb3B0aW1pc3RpYyBgc3RlcF9zdGFydGVkYCBvdXRjb21lIGFuZCB0cmFuc2xhdGUgYSBsb3N0IHJhY2UgL1xuICAgIC8vIHRlcm1pbmFsIHJ1biAvIHRocm90dGxlIGludG8gYSByZXN1bHQgdGhhdCBzaG9ydC1jaXJjdWl0cyB0aGUgYm9keVxuICAgIC8vIG91dHB1dC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB3ZSBvd24gdGhlIHN0ZXAgYW5kIG1heSB3cml0ZSBpdHMgdGVybWluYWxcbiAgICAvLyBldmVudC4gQSBub24tdHJhbnNsYXRhYmxlIHJlamVjdGlvbiBpcyByZXRocm93biAoc28gYSB0cmFuc2llbnRcbiAgICAvLyBzdGVwX3N0YXJ0ZWQgZmFpbHVyZSBwcm9wYWdhdGVzIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZWRlbGl2ZXJ5LFxuICAgIC8vIGV4YWN0bHkgYXMgb24gdGhlIGF3YWl0IHBhdGgpLiBJZGVtcG90ZW50IOKAlCBzYWZlIHRvIGNhbGwgbW9yZSB0aGFuIG9uY2UuXG4gICAgY29uc3QgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0ID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICBTdGVwRXhlY3V0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4gICAgPiA9PiB7XG4gICAgICBpZiAoIW9wdGltaXN0aWNTdGFydFNldHRsZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgb3B0aW1pc3RpY1N0YXJ0U2V0dGxlZDtcbiAgICAgIGlmIChzZXR0bGVkLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbWFwcGVkID0gc3RhcnRFcnJvclRvUmVzdWx0KHNldHRsZWQuZXJyKTtcbiAgICAgIGlmICghbWFwcGVkKSB0aHJvdyBzZXR0bGVkLmVycjtcbiAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfTtcblxuICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgIC8vIENoYWluIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIG9uIHRoZSBydW4tcmVhZHkgYmFycmllciAodHVyYm8gbW9kZSk6XG4gICAgICAvLyB0aGUgc3RlcCBjYW4ndCBiZSBjcmVhdGVkIGJlZm9yZSBpdHMgcnVuIGV4aXN0cywgYnV0IHRoZSBib2R5IGJlbG93XG4gICAgICAvLyBydW5zIGltbWVkaWF0ZWx5IGFnYWluc3Qgc3ludGhlc2l6ZWQgc3RhdGUsIHNvIHRoZSBgcnVuX3N0YXJ0ZWRgXG4gICAgICAvLyByb3VuZC10cmlwIG92ZXJsYXBzIHRoZSBib2R5IHJhdGhlciB0aGFuIGJsb2NraW5nIGl0LiBPdXRzaWRlIHR1cmJvIHRoZVxuICAgICAgLy8gYmFycmllciBpcyB1bmRlZmluZWQgYW5kIHRoaXMgaXMgYSBwbGFpbiBjcmVhdGUuXG4gICAgICBjb25zdCBzdGFydGVkUHJvbWlzZSA9IChwYXJhbXMucnVuUmVhZHlCYXJyaWVyID8/IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gVGFrZW4gcmlnaHQgYmVmb3JlIHRoZSBjcmVhdGUgZmlyZXMsIG5vdCBiZWZvcmUgdGhlIGJhcnJpZXIg4oCUXG4gICAgICAgICAgLy8gUlNGUyBtZWFzdXJlcyB0aGUgcnVuX3N0YXJ0ZWQtdG8tUE9TVCBzdHJldGNoLCBhbmQgdGhlIGJhcnJpZXJcbiAgICAgICAgICAvLyB3YWl0IElTIHBhcnQgb2YgdGhhdCBzdHJldGNoIHVuZGVyIHR1cmJvLlxuICAgICAgICAgIHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIHN0YW1wIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLm93bmVyTWVzc2FnZUlkLlxuICAgICAgICAgICAgICAgIC4uLihwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gR3VhcmQgdGhlIGNsYWltIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLnNsb3RTbmFwc2hvdC4gQVxuICAgICAgICAgICAgLy8gc3RhbGUgKDQxMikgcmVqZWN0aW9uIHN1cmZhY2VzIHZpYSByZWNvbmNpbGVPcHRpbWlzdGljU3RhcnQgYXMgYVxuICAgICAgICAgICAgLy8gbm9uLXRyYW5zbGF0YWJsZSBlcnJvcjogdGhlIGJvZHkgcmVzdWx0IGlzIGRpc2NhcmRlZCBhbmQgdGhlXG4gICAgICAgICAgICAvLyByZWplY3Rpb24gcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyLlxuICAgICAgICAgICAgc3RhcnRFdmVudFBhcmFtc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBvcHRpbWlzdGljU3RhcnRTZXR0bGVkID0gc3RhcnRlZFByb21pc2UudGhlbihcbiAgICAgICAgKCkgPT4gKHsgb2s6IHRydWUgYXMgY29uc3QgfSksXG4gICAgICAgIChlcnIpID0+ICh7IG9rOiBmYWxzZSBhcyBjb25zdCwgZXJyIH0pXG4gICAgICApO1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIHN0ZXAgPSB7XG4gICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICBzdGVwSWQsXG4gICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgaW5wdXQ6IHBhcmFtcy5sYXp5U3RlcElucHV0LFxuICAgICAgICBhdHRlbXB0OiAxLFxuICAgICAgICBzdGFydGVkQXQ6IG5vdyxcbiAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc3RlcF9zdGFydGVkIHZhbGlkYXRlcyBzdGF0ZSBhbmQgcmV0dXJucyB0aGUgc3RlcCBlbnRpdHkuIE9uIHRoZSBsYXp5XG4gICAgICAvLyBpbmxpbmUgcGF0aCB3ZSBhbHNvIGNhcnJ5IHRoZSBzdGVwIGBpbnB1dGAgc28gdGhlIHdvcmxkIGNyZWF0ZXMgdGhlXG4gICAgICAvLyBzdGVwIG9uIHRoZSBmbHkgKG5vIHNlcGFyYXRlIHN0ZXBfY3JlYXRlZCByb3VuZC10cmlwKS4gVGhlIHdvcmxkJ3NcbiAgICAgIC8vIGF0b21pYyBjcmVhdGUtY2xhaW0gbWFrZXMgdGhpcyBleGFjdGx5LW9uZS1vd25lcjogYSBjb25jdXJyZW50IGxvc2VyXG4gICAgICAvLyBnZXRzIEVudGl0eUNvbmZsaWN0RXJyb3IsIG1hcHBlZCB0byBgeyB0eXBlOiAnc2tpcHBlZCcgfWAsIHNvIGl0IG5ldmVyXG4gICAgICAvLyBydW5zIHRoZSBib2R5LiBXaGVuIGBsYXp5U3RlcElucHV0YCBpcyBhYnNlbnQgdGhpcyBpcyB0aGUgbGVnYWN5XG4gICAgICAvLyBzdGVwX3N0YXJ0ZWQgKHN0ZXAgYWxyZWFkeSBjcmVhdGVkLCBubyBwYXlsb2FkKS5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIElubGluZS1vd25lcnNoaXAgc3RhbXA6IHByZXNlbnQgb24gdGhlIGxhenkgcGF0aHMgQU5EIG9uIHRoZVxuICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSBwYXlsb2FkLWxlc3Mgc3RhcnQgKGEgcmVkZWxpdmVyeSBvZiB0aGUgb3duaW5nXG4gICAgICAgIC8vIG1lc3NhZ2UgcmUtZXhlY3V0aW5nIGl0cyBzdGVwIG11c3QgcmUtc3RhbXAg4oCUIG93bmVyc2hpcCBkZXJpdmVzXG4gICAgICAgIC8vIGZyb20gdGhlIGxhdGVzdCBzdGFydCwgc28gYW4gdW5zdGFtcGVkIHJlY292ZXJ5IHN0YXJ0IHdvdWxkIHJlYWRcbiAgICAgICAgLy8gYXMgXCJ1bm93bmVkXCIgdG8gYSBsYXRlciB3YWtlKS4gT25seSB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGhcbiAgICAgICAgLy8gcGFzc2VzIG5vIG93bmVyTWVzc2FnZUlkOiBpdHMgc3RhcnQgaXMgdGhlIGJhcmUgb25lLCBjbGVhcmluZ1xuICAgICAgICAvLyBvd25lcnNoaXAgYXMgaW50ZW5kZWQuXG4gICAgICAgIGNvbnN0IG93bmVyc2hpcFN0YW1wID1cbiAgICAgICAgICBwYXJhbXMub3duZXJNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG93bmVyTWVzc2FnZUlkOiBwYXJhbXMub3duZXJNZXNzYWdlSWQgfVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgZXZlbnREYXRhOlxuICAgICAgICAgICAgICBwYXJhbXMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0OiBwYXJhbXMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgLi4ub3duZXJzaGlwU3RhbXAsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7IHN0ZXBOYW1lLCAuLi5vd25lcnNoaXBTdGFtcCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gR3VhcmQgdGhlIGNsYWltIOKAlCBzZWUgU3RlcEV4ZWN1dG9yUGFyYW1zLnNsb3RTbmFwc2hvdC4gQVxuICAgICAgICAgIC8vIHN0YWxlICg0MTIpIHJlamVjdGlvbiBpcyBpbnRlbnRpb25hbGx5IE5PVCB0cmFuc2xhdGVkIGJ5XG4gICAgICAgICAgLy8gc3RhcnRFcnJvclRvUmVzdWx0IGJlbG93LCBzbyBpdCBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIgZm9yIGFcbiAgICAgICAgICAvLyBmcmVzaCByZXBsYXkuXG4gICAgICAgICAgc3RhcnRFdmVudFBhcmFtc1xuICAgICAgICApO1xuICAgICAgICBzdGVwQ2xhaW1Db21wbGV0ZWRBdE1zID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBzdGVwID0gc3RhcnRSZXN1bHQuc3RlcDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtYXBwZWQgPSBzdGFydEVycm9yVG9SZXN1bHQoZXJyKTtcbiAgICAgICAgaWYgKG1hcHBlZCkgcmV0dXJuIG1hcHBlZDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgZXhlY3V0aW9uIGRldGFpbHMnLCB7XG4gICAgICBzdGVwTmFtZSxcbiAgICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgICBzdGF0dXM6IHN0ZXAuc3RhdHVzLFxuICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgIH0pO1xuXG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cyhzdGVwLnN0YXR1cyksXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gICAgLy8gQ2hlY2sgbWF4IHJldHJpZXMgQUZURVIgc3RlcF9zdGFydGVkIChhdHRlbXB0IHdhcyBqdXN0IGluY3JlbWVudGVkKS5cbiAgICAvLyBPbmx5IGVuZm9yY2Ugd2hlbiB0aGUgc3RlcCBoYXMgYSBwcmV2aW91cyBlcnJvciDigJQgdGhpcyBkaXN0aW5ndWlzaGVzXG4gICAgLy8gYWN0dWFsIHJldHJpZXMgKGZhaWxlZCDihpIgcmV0cnkpIGZyb20gY29uY3VycmVudCBpbmxpbmUgc3RhcnRzXG4gICAgLy8gZXhlY3V0aW9uIGxvb3AgY2FuIGNhdXNlIG11bHRpcGxlIGhhbmRsZXJzIHRvIHN0ZXBfc3RhcnRlZCB0aGUgc2FtZVxuICAgIC8vIHN0ZXAgc2ltdWx0YW5lb3VzbHksIGluZmxhdGluZyB0aGUgYXR0ZW1wdCBjb3VudGVyIHdpdGhvdXQgYW55IGZhaWx1cmUpLlxuICAgIGlmIChzdGVwLmF0dGVtcHQgPiBtYXhSZXRyaWVzICsgMSAmJiBzdGVwLmVycm9yKSB7XG4gICAgICBjb25zdCByZXRyeUNvdW50ID0gc3RlcC5hdHRlbXB0IC0gMTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwTmFtZX1cIiBleGNlZWRlZCBtYXggcmV0cmllcyAoJHtyZXRyeUNvdW50fSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIHJldHJ5Q291bnQpfSlgO1xuICAgICAgc3RlcExvZ2dlci5lcnJvcignU3RlcCBleGNlZWRlZCBtYXggcmV0cmllcycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIHJldHJ5Q291bnQsXG4gICAgICB9KTtcbiAgICAgIC8vIFByZXNlcnZlIHRoZSBwcmlvciBhdHRlbXB0J3Mgc2VyaWFsaXplZCBlcnJvciBhcyB0aGUgY2F1c2Ugc28gdGhlXG4gICAgICAvLyB1bmRlcmx5aW5nIGZhaWx1cmUgaXMgcmVjb3ZlcmFibGUgZnJvbSBgc3RlcC5lcnJvci5jYXVzZWAgYWZ0ZXJcbiAgICAgIC8vIGh5ZHJhdGlvbiwgd2l0aG91dCBmb3JjaW5nIGNvbnN1bWVycyB0byB3YWxrIHRoZSBzdGVwX3JldHJ5aW5nXG4gICAgICAvLyBldmVudCBoaXN0b3J5LiBCZXN0LWVmZm9ydDogaWYgaHlkcmF0aW9uIG9mIHRoZSBwcmlvciBgc3RlcC5lcnJvcmBcbiAgICAgIC8vIHRocm93cywgZmFsbCBiYWNrIHRvIGEgRmF0YWxFcnJvciB3aXRob3V0IGNhdXNlLlxuICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIGlmIChzdGVwLmVycm9yICE9IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGF3YWl0IGh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICBzdGVwLmVycm9yLFxuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSDigJQgYmVzdC1lZmZvcnQgY2F1c2UgYXR0YWNobWVudC5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgIGNvbXByZXNzaW9uXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgfVxuXG4gICAgLy8gT3BzIHRoYXQgbXVzdCBiZSBkdXJhYmx5IGNvbW1pdHRlZCBiZWZvcmUgc3RlcCBjb21wbGV0aW9uIChlLmcuIGFcbiAgICAvLyBzdGVwLWluaXRpYXRlZCBhYm9ydCdzIGhvb2tfcmVjZWl2ZWQgZXZlbnQpLiBTZWUgU3RlcENvbnRleHQuIERlY2xhcmVkXG4gICAgLy8gb3V0c2lkZSB0aGUgdHJ5IHNvIHRoZSBmYWlsdXJlIHBhdGggYmVsb3cgY2FuIGFsc28gZHJhaW4gdGhlbS5cbiAgICBjb25zdCBwcmVDb21wbGV0aW9uT3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGxldCBvcHNTZXR0bGVkID0gdHJ1ZTtcblxuICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IHRvIGF0dGFjaCB0byB0aGlzIHN0ZXAncyB0ZXJtaW5hbCBldmVudC4gQ29tcHV0ZWRcbiAgICAvLyByaWdodCBiZWZvcmUgdXNlciBjb2RlIHJ1bnM7IGRlY2xhcmVkIGhlcmUgc28gdGhlIGZhaWx1cmUgcGF0aCAodGhlXG4gICAgLy8gY2F0Y2ggYmVsb3cpIGNhbiBhdHRhY2ggaXQgdG8gc3RlcF9mYWlsZWQgdG9vLlxuICAgIGxldCBsYXRlbmN5RXZlbnREYXRhOiBTdGVwTGF0ZW5jeUV2ZW50RGF0YSB8IHVuZGVmaW5lZDtcblxuICAgIC8vIEJhY2tmaWxsIFJTRlMgb250byB0aGUgYWxyZWFkeS1jb21wdXRlZCB0ZWxlbWV0cnkgb25jZSB0aGUgb3B0aW1pc3RpY1xuICAgIC8vIHR1cmJvIHN0YXJ0IGhhcyBzZXR0bGVkLiBPbiB0aGF0IHBhdGggdGhlIHN0ZXAtc3RhcnQgUE9TVCBmaXJlcyBpbnNpZGVcbiAgICAvLyB0aGUgcnVuLXJlYWR5IGJhcnJpZXIncyBgLnRoZW5gLCBzbyBgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zYCDigJQgYW5kXG4gICAgLy8gdGhlcmVmb3JlIFJTRlMg4oCUIGlzIHVzdWFsbHkgc3RpbGwgdW5zZXQgd2hlbiBgbGF0ZW5jeUV2ZW50RGF0YWAgaXNcbiAgICAvLyBmaXJzdCBjb21wdXRlZCBqdXN0IGJlZm9yZSB1c2VyIGNvZGUgKHRoZSBiYXJyaWVyIGlzIHN0aWxsIGluIGZsaWdodFxuICAgIC8vIGZvciBhbnkgbm9uLXRyaXZpYWwgYHJ1bl9zdGFydGVkYCByb3VuZC10cmlwLCB3aGljaCBpcyBleGFjdGx5IHRoZVxuICAgIC8vIHNsb3ctcnVuX3N0YXJ0ZWQgY2FzZSBSU0ZTIGV4aXN0cyB0byBtZWFzdXJlKS4gQnkgdGhlIHRpbWVcbiAgICAvLyBgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KClgIGhhcyBhd2FpdGVkIHRoZSBiYXJyaWVyIHRoZSBQT1NUIHRpbWVzdGFtcFxuICAgIC8vIGlzIGtub3duLCBzbyB3ZSBwYXRjaCBSU0ZTIGluIGJlZm9yZSB0aGUgdGVybWluYWwgZXZlbnQgaXMgd3JpdHRlbi5cbiAgICAvLyBXaXRob3V0IHRoaXMsIHNsb3ctcnVuX3N0YXJ0ZWQgc2FtcGxlcyBhcmUgZHJvcHBlZCwgYmlhc2luZyBSU0ZTXG4gICAgLy8gcGVyY2VudGlsZXMgbG93IChtaXNzaW5nLW5vdC1hdC1yYW5kb20pLiBSZWNvbXB1dGVzIG9ubHkgUlNGUyDigJRcbiAgICAvLyBUVEZTL1NUU08gc3RheSBhbmNob3JlZCB0byBgZXhlY3V0aW9uU3RhcnRUaW1lYCBhcyBjb21wdXRlZCBhYm92ZS5cbiAgICBjb25zdCBiYWNrZmlsbE9wdGltaXN0aWNSc2ZzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFsYXRlbmN5RXZlbnREYXRhIHx8IGxhdGVuY3lFdmVudERhdGEucnNmcyAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBjb25zdCBhbmNob3JNcyA9IHBhcmFtcy5sYXRlbmN5VHJhY2tpbmc/LnJzZnNBbmNob3JNcztcbiAgICAgIGlmIChhbmNob3JNcyA9PT0gdW5kZWZpbmVkIHx8IHN0ZXBTdGFydFBvc3RTZW50QXRNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBsYXRlbmN5RXZlbnREYXRhLnJzZnMgPSBNYXRoLm1heCgwLCBzdGVwU3RhcnRQb3N0U2VudEF0TXMgLSBhbmNob3JNcyk7XG4gICAgICBpZiAoc3Bhbikge1xuICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUnNmc01zKGxhdGVuY3lFdmVudERhdGEucnNmcyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYFN0ZXAgXCIke3N0ZXBJZH1cIiBoYXMgbm8gXCJzdGFydGVkQXRcIiB0aW1lc3RhbXBgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGVwU3RhcnRlZEF0ID0gc3RlcC5zdGFydGVkQXQ7XG4gICAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIGVuY3J5cHRpb24ga2V5IHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgcmVzb2x2ZVxuICAgICAgLy8gdGhyb3VnaCB0aGUgbWVtb2l6ZWQgYWNjZXNzb3IgZGVjbGFyZWQgYXQgdGhlIHRvcCBvZiB0aGlzIHRyYWNlLlxuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHBhcmFtcy5lbmNyeXB0aW9uS2V5ID8/IChhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCkpO1xuICAgICAgY29uc3QgaHlkcmF0ZWRJbnB1dCA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAnc3RlcC5oeWRyYXRlJyxcbiAgICAgICAge30sXG4gICAgICAgIGFzeW5jIChoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIHBhcmFtcy53b3JrZmxvd0RlcGxveW1lbnRJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBcmd1bWVudHNDb3VudChoeWRyYXRlZC5hcmdzLmxlbmd0aCksXG4gICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVEZXNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFyZ3MgPSBoeWRyYXRlZElucHV0LmFyZ3M7XG4gICAgICBjb25zdCB0aGlzVmFsID0gaHlkcmF0ZWRJbnB1dC50aGlzVmFsID8/IG51bGw7XG4gICAgICBjb25zdCB3b3JrZmxvd0Jhc2VVcmwgPSBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwoXG4gICAgICAgIGlzVmVyY2VsXG4gICAgICAgICAgPyBgaHR0cHM6Ly8ke3Byb2Nlc3MuZW52LlZFUkNFTF9VUkx9YFxuICAgICAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHsoYXdhaXQgZ2V0UG9ydExhenkoKSkgPz8gMzAwMH1gXG4gICAgICApO1xuXG4gICAgICAvLyAtLS0gVXNlciBjb2RlIGV4ZWN1dGlvbiAtLS1cbiAgICAgIC8vIFdyYXAgb25seSBzdGVwRm4uYXBwbHkoKSAodXNlciBzdGVwIGNvZGUpIHNvIGNsZWFudXAgYmVsb3cgcnVucyBvblxuICAgICAgLy8gQk9USCBzdWNjZXNzIGFuZCBmYWlsdXJlLiBBIHVzZXItY29kZSB0aHJvdyBpcyBjYXB0dXJlZCBoZXJlIGFuZFxuICAgICAgLy8gcmUtcmFpc2VkIGFmdGVyIGNhbmNlbEFib3J0UmVhZGVycywgc28gaXQgc3RpbGwgZmxvd3MgdG8gdGhlIG91dGVyXG4gICAgICAvLyBjYXRjaCAoc3RlcF9mYWlsZWQvc3RlcF9yZXRyeWluZykg4oCUIGJ1dCB0aGUgYWJvcnQtc3RyZWFtIHJlYWRlciBpc1xuICAgICAgLy8gdG9ybiBkb3duIGZpcnN0LiBXaXRob3V0IHRoaXMsIGEgdGhyb3dpbmcvcmV0cnlpbmcgc2lnbmFsLWJlYXJpbmdcbiAgICAgIC8vIHN0ZXAgd291bGQgbGVhayBhIHJlYWwtdGltZSBhYm9ydCByZWFkZXIgcGVyIGF0dGVtcHQuXG4gICAgICBsZXQgdXNlckNvZGVFcnJvcjogdW5rbm93bjtcbiAgICAgIGxldCB1c2VyQ29kZUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbGF0ZW5jeUV2ZW50RGF0YSA9IGNvbXB1dGVTdGVwTGF0ZW5jeUV2ZW50RGF0YSh7XG4gICAgICAgIHRyYWNraW5nOiBwYXJhbXMubGF0ZW5jeVRyYWNraW5nLFxuICAgICAgICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBleGVjdXRpb25TdGFydFRpbWUsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIGxhenlTdGVwU3RhcnQ6IHBhcmFtcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgIG9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgc3RlcFN0YXJ0UG9zdFNlbnRBdE1zLFxuICAgICAgfSk7XG4gICAgICBpZiAobGF0ZW5jeUV2ZW50RGF0YSkge1xuICAgICAgICAvLyBNaXJyb3IgdGhlIGxhdGVuY3kgdGVsZW1ldHJ5IG9udG8gdGhlIHN0ZXAgc3BhbiBzbyB0cmFjZXMgc2hvd1xuICAgICAgICAvLyBUVEZTL1NUU08vUlNGUyBhbG9uZ3NpZGUgdGhlIGZsYW1lIGdyYXBoLCBub3QganVzdCBEYXRhZG9nIG1ldHJpY3MuXG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLnR0ZnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBBdHRyaWJ1dGUuU3RlcFR0ZnNNcyhsYXRlbmN5RXZlbnREYXRhLnR0ZnMpXG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4obGF0ZW5jeUV2ZW50RGF0YS5zdHNvICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gQXR0cmlidXRlLlN0ZXBTdHNvTXMobGF0ZW5jeUV2ZW50RGF0YS5zdHNvKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKGxhdGVuY3lFdmVudERhdGEucnNmcyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwUnNmc01zKGxhdGVuY3lFdmVudERhdGEucnNmcylcbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihsYXRlbmN5RXZlbnREYXRhLmZpbmFsU2NoZWR1bGluZ1JlcGxheSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IEF0dHJpYnV0ZS5TdGVwRmluYWxTY2hlZHVsaW5nUmVwbGF5TXMoXG4gICAgICAgICAgICAgICAgbGF0ZW5jeUV2ZW50RGF0YS5maW5hbFNjaGVkdWxpbmdSZXBsYXlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBMYXRlbmN5T3B0aW1pemF0aW9ucyhcbiAgICAgICAgICAgIGxhdGVuY3lFdmVudERhdGEub3B0aW1pemF0aW9ucyA/PyBbXVxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBDbG9zZSB0aGUgaG9vay1yZXN1bWUgVFRSIG1lYXN1cmVtZW50IChzZWUgcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cykuXG4gICAgICAgKlxuICAgICAgICogQ2FsbGVkIGZyb20gSU5TSURFIGBjb250ZXh0U3RvcmFnZS5ydW5gLCBpbW1lZGlhdGVseSBiZWZvcmVcbiAgICAgICAqIGBzdGVwRm4uYXBwbHkoKWAg4oCUIGRlbGliZXJhdGVseSBub3QgYWxvbmdzaWRlIHRoZSBzdGVwLWxhdGVuY3lcbiAgICAgICAqIHRlbGVtZXRyeSBhYm92ZS4gYGV4ZWN1dGlvblN0YXJ0VGltZWAgaXMgdGFrZW4gYmVmb3JlIHRoZSBpbm5lclxuICAgICAgICogYHN0ZXAuZXhlY3V0ZWAgc3BhbiBhbmQgdGhlIHN0ZXAgY29udGV4dCBhcmUgZXN0YWJsaXNoZWQsIGFuZFxuICAgICAgICogYHN0ZXBfcHJlcGFyZV9tc2AgaXMgZG9jdW1lbnRlZCB0byBpbmNsdWRlIGV4YWN0bHkgdGhhdCBzZXR1cCwgc29cbiAgICAgICAqIGFuY2hvcmluZyBUNyB0aGVyZSB3b3VsZCB1bmRlci1yZXBvcnQgYm90aCB0aGUgcGhhc2UgYW5kIHRoZSB0b3RhbC5cbiAgICAgICAqIFRURlMvU1RTTyBrZWVwIHRoZWlyIG93biBhbmNob3Igc28gdGhpcyBjaGFuZ2VzIG5vdGhpbmcgYWJvdXQgdGhlbS5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgYHJlcG9ydGVkYCBsYXRjaCBtYWtlcyBvbmUgcmVzdW1wdGlvbiB5aWVsZCBvbmUgc2FtcGxlIGV2ZW5cbiAgICAgICAqIHRob3VnaCBldmVyeSBzdGVwIG9mIGFuIGlubGluZSBiYXRjaCBpcyBoYW5kZWQgdGhlIHNhbWUgdHJhY2tpbmdcbiAgICAgICAqIG9iamVjdDogd2hpY2hldmVyIHN0ZXAgZmlyc3QgcmVhY2hlcyB1c2VyIGNvZGUgdGFrZXMgdGhlXG4gICAgICAgKiBtZWFzdXJlbWVudC4gU2hhcmluZyBpdCAocmF0aGVyIHRoYW4gcGlubmluZyB0aGUgYmF0Y2gncyBmaXJzdCBzdGVwKVxuICAgICAgICogaXMgd2hhdCBrZWVwcyB0aGUgc2FtcGxlIGFsaXZlIHdoZW4gdGhhdCBmaXJzdCBzdGVwIGxvc2VzIGl0cyBhdG9taWNcbiAgICAgICAqIGNyZWF0ZS1jbGFpbSB0byBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiB3aGlsZSBhIHNpYmxpbmcgcHJvY2VlZHMuXG4gICAgICAgKiBUaGUgY2hlY2stYW5kLXNldCBpcyBzeW5jaHJvbm91cywgc28gY29uY3VycmVudCBzaWJsaW5ncyBjYW5ub3QgYm90aFxuICAgICAgICogcGFzcyBpdC5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVwb3J0UmVzdW1lVHRyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCB0cmFja2luZyA9IHBhcmFtcy5yZXN1bWVUcmFja2luZztcbiAgICAgICAgaWYgKCF0cmFja2luZyB8fCB0cmFja2luZy5yZXBvcnRlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY29tcHV0ZVJlc3VtZVR0ckF0dHJpYnV0ZXMoe1xuICAgICAgICAgIHRyYWNraW5nLFxuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgc3RlcENsYWltU3RhcnRlZEF0TXM6IHN0ZXBTdGFydFBvc3RTZW50QXRNcyxcbiAgICAgICAgICBzdGVwQ2xhaW1Db21wbGV0ZWRBdE1zLFxuICAgICAgICAgIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IERhdGUubm93KCksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWF0dHJpYnV0ZXMpIHJldHVybjtcbiAgICAgICAgdHJhY2tpbmcucmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpO1xuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZXhlY3V0ZScsIHt9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRleHRTdG9yYWdlLnJ1bihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3RlcE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBTdGFydGVkQXQ6IG5ldyBEYXRlKCtzdGVwU3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3b3JrZmxvd01ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyBEYXRlKCt3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgdXJsOiB3b3JrZmxvd0Jhc2VVcmwsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBwYXJhbXMud29ya2Zsb3dEZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgIHJvb3RSdW5JZDogcGFyYW1zLnJvb3RSdW5JZCxcbiAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICBwcmVDb21wbGV0aW9uT3BzLFxuICAgICAgICAgICAgICBjbG9zdXJlVmFyczogaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgLy8gVHVyYm8gb3B0aW1pc3RpYyBzdGFydCBydW5zIHRoaXMgYm9keSBiZWZvcmUgYHJ1bl9zdGFydGVkYCBpc1xuICAgICAgICAgICAgICAvLyBkdXJhYmxlLiBFeHBvc2UgdGhlIGJhcnJpZXIgc28gYSBkaXJlY3Qgc3RlcC1ib2R5IHdvcmxkIHdyaXRlXG4gICAgICAgICAgICAgIC8vIChlLmcuIGBzZXRBdHRyaWJ1dGVzYCkgY2FuIG9yZGVyIGl0c2VsZiBhZnRlciB0aGVcbiAgICAgICAgICAgICAgLy8gcnVuIGV4aXN0cy4gVW5kZWZpbmVkIG9uIHRoZSBhd2FpdCBwYXRoIChydW4gYWxyZWFkeSBkdXJhYmxlKS5cbiAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyOiBvcHRpbWlzdGljU3RhcnRcbiAgICAgICAgICAgICAgICA/IHBhcmFtcy5ydW5SZWFkeUJhcnJpZXJcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFRoZSBsYXN0IGluc3RhbnQgYmVmb3JlIHVzZXIgY29kZSDigJQgVDcgb2YgdGhlIHJlc3VtZSB3aW5kb3cuXG4gICAgICAgICAgICAgIHJlcG9ydFJlc3VtZVR0cigpO1xuICAgICAgICAgICAgICByZXR1cm4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHVzZXJDb2RlRXJyb3IgPSBlcnI7XG4gICAgICAgIHVzZXJDb2RlRmFpbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4ZWN1dGlvblRpbWVNcyA9IERhdGUubm93KCkgLSBleGVjdXRpb25TdGFydFRpbWU7XG5cbiAgICAgIC8vIFRlYXIgZG93biBhbnkgYWJvcnQtc3RyZWFtIHJlYWRlcnMgb3BlbmVkIHdoaWxlIGh5ZHJhdGluZyB0aGUgc3RlcCdzXG4gICAgICAvLyBhcmd1bWVudHMgKGEgc2VyaWFsaXplZCBBYm9ydFNpZ25hbCBvcGVucyBhIHJlYWwtdGltZSBhYm9ydCByZWFkZXIgZm9yXG4gICAgICAvLyB0aGUgc3RlcCdzIGR1cmF0aW9uKS4gV2l0aG91dCB0aGlzIHRoZSByZWFkZXIncyBgcmVhZCgpYCBwcm9taXNlIG5ldmVyXG4gICAgICAvLyBzZXR0bGVzLCBzbyB0aGUgYG9wc2AgZmx1c2ggYmVsb3cgYWx3YXlzIGxvc2VzIHRoZSA1MDBtcyByYWNlIGFuZCB0aGVcbiAgICAgIC8vIHN0ZXAgcmVwb3J0cyBgaGFzUGVuZGluZ09wc2Ag4oCUIGZvcmNpbmcgdGhlIGlubGluZSBsb29wIHRvIHF1ZXVlIGFcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBhbmQgcGF5aW5nIGEgZnVsbCByb3VuZC10cmlwIHBlciBzaWduYWwtYmVhcmluZyBzdGVwLlxuICAgICAgLy8gUnVucyB1bmNvbmRpdGlvbmFsbHkgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkgc28gYSB0aHJvd2luZyBzdGVwIGRvZXNuJ3RcbiAgICAgIC8vIGxlYWsgdGhlIHJlYWRlci5cbiAgICAgIGNhbmNlbEFib3J0UmVhZGVycyguLi5hcmdzLCB0aGlzVmFsLCBoeWRyYXRlZElucHV0LmNsb3N1cmVWYXJzKTtcblxuICAgICAgLy8gUmUtcmFpc2UgYSB1c2VyLWNvZGUgZmFpbHVyZSBub3cgdGhhdCBjbGVhbnVwIGhhcyBydW47IHRoZSBvdXRlclxuICAgICAgLy8gY2F0Y2ggbWFwcyBpdCB0byBzdGVwX2ZhaWxlZC9zdGVwX3JldHJ5aW5nLlxuICAgICAgaWYgKHVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgIHRocm93IHVzZXJDb2RlRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVFeGVjdXRpb25UaW1lTXMoZXhlY3V0aW9uVGltZU1zKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQgPSBhd2FpdCB0cmFjZSgnc3RlcC5kZWh5ZHJhdGUnLCB7fSwgYXN5bmMgKGRlaHlkcmF0ZVNwYW4pID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgZGVoeWRyYXRlZCA9IGF3YWl0IGRlaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIGNvbXByZXNzaW9uLFxuICAgICAgICAgIC8vIFR1cmJvIG9wdGltaXN0aWMgc3RhcnQ6IGEgcmV0dXJuZWQgc3RyZWFtIGlzIHBpcGVkIHRvIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAvLyBhZnRlciB0aGUgYm9keSBidXQgd2l0aGluIHRoaXMgc2FtZSBvcCBmbHVzaCwgc28gZ2F0ZSBpdHMgZmlyc3RcbiAgICAgICAgICAvLyB3cml0ZSBvbiB0aGUgcnVuLXJlYWR5IGJhcnJpZXIuIFVuZGVmaW5lZCBvbiB0aGUgYXdhaXQgcGF0aC5cbiAgICAgICAgICBvcHRpbWlzdGljU3RhcnQgPyBwYXJhbXMucnVuUmVhZHlCYXJyaWVyIDogdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICBkZWh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVTZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiBkZWh5ZHJhdGVkKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkZWh5ZHJhdGVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEZsdXNoIHBlbmRpbmcgb3BzIChzdHJlYW0gd3JpdGVzLCBldGMuKSB3aXRoIGEgc2hvcnQgaW5saW5lIHdhaXQuXG4gICAgICAvLyBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtIGFja3Mgd3JpdGVzIG9uIGJ1ZmZlciBlbnRyeVxuICAgICAgLy8gKGdyb3VwLWNvbW1pdCBiYXRjaGluZyk7IGR1cmFiaWxpdHkgaXMgZW5mb3JjZWQgYnkgaXRzIGRyYWluXG4gICAgICAvLyBiYXJyaWVyLCB3aGljaCB0aGUgZmx1c2hhYmxlIHN0YXRlJ3MgY29tcGxldGlvbiBhd2FpdHMgYWZ0ZXJcbiAgICAgIC8vIGxvY2sgcmVsZWFzZS4gTW9zdCBvcHMgc2V0dGxlIHdpdGhpbiB+MjAwbXMgKGxvY2stcmVsZWFzZVxuICAgICAgLy8gcG9sbGluZyArIG9uZSBiYXRjaGVkIEhUVFAgZmx1c2gpLlxuICAgICAgLy8gSWYgb3BzIGRvbid0IHNldHRsZSBpbiA1MDBtcyAoZS5nLiwgV3JpdGFibGVTdHJlYW0ga2VwdCBvcGVuXG4gICAgICAvLyBhY3Jvc3Mgc3RlcHMpLCB3YWl0VW50aWwgaGFuZGxlcyB0aGUgcmVzdC5cbiAgICAgIGlmIChvcHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvcHNQcm9taXNlID0gUHJvbWlzZS5hbGwob3BzKTtcbiAgICAgICAgLy8gVGhlIHJhY2UgYmVsb3cgc3VyZmFjZXMgZmFpbHVyZXMgaW5saW5lIHdoZW4gb3BzIHNldHRsZSBxdWlja2x5O1xuICAgICAgICAvLyBpZiB0aGUgNTAwbXMgdGltZW91dCB3aW5zLCB0aGUgZmFpbHVyZSBpcyBvbmx5IG9ic2VydmVkIGhlcmUuIFRoZVxuICAgICAgICAvLyBwcm9taXNlIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWRcbiAgICAgICAgLy8gd2FpdFVudGlsIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksXG4gICAgICAgIC8vIHNvIHVuZXhwZWN0ZWQgZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgICBzYWZlV2FpdFVudGlsKG9wc1Byb21pc2UsIChlcnIpID0+IHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ0JhY2tncm91bmQgZmx1c2ggb2Ygc3RlcCBzdHJlYW0gb3BzIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgb3BzU2V0dGxlZCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgb3BzUHJvbWlzZS50aGVuKFxuICAgICAgICAgICAgKCkgPT4gdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGV4cGVjdGVkIGNsaWVudCBkaXNjb25uZWN0IGVycm9ycyAoZS5nLiwgYnJvd3NlclxuICAgICAgICAgICAgICAvLyByZWZyZXNoIGR1cmluZyBzdHJlYW1pbmcpXG4gICAgICAgICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgICAgICAgZXJyPy5uYW1lID09PSAnQWJvcnRFcnJvcicgfHwgZXJyPy5uYW1lID09PSAnUmVzcG9uc2VBYm9ydGVkJztcbiAgICAgICAgICAgICAgaWYgKGlzQWJvcnRFcnJvcikgcmV0dXJuIHRydWUgYXMgY29uc3Q7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBQcm9taXNlPGZhbHNlPigocikgPT4gc2V0VGltZW91dCgoKSA9PiByKGZhbHNlKSwgNTAwKSksXG4gICAgICAgIF0pO1xuICAgICAgfVxuXG4gICAgICAvLyBPcHRpbWlzdGljIHN0YXJ0OiB0aGUgYm9keSByYW4gYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgIHdhcyBjb25maXJtZWQuXG4gICAgICAvLyBSZWNvbmNpbGUgaXQgbm93IOKAlCBpZiB3ZSBsb3N0IHRoZSBjcmVhdGUtY2xhaW0gKG9yIHRoZSBydW4gaXNcbiAgICAgIC8vIGdvbmUvdGhyb3R0bGVkKSBkaXNjYXJkIHRoaXMgcmVzdWx0IGFuZCBkb24ndCB3cml0ZSBzdGVwX2NvbXBsZXRlZC5cbiAgICAgIC8vIFJlY29uY2lsZSBiZWZvcmUgZHJhaW5pbmcgcHJlQ29tcGxldGlvbk9wczogYSBkaXNjYXJkZWQgcmVzdWx0IG1lYW5zXG4gICAgICAvLyB0aGUgd2lubmluZyBoYW5kbGVyIG93bnMgdGhlIG91dGNvbWUgKGFuZCByZS1maXJlcyBhbnkgYWJvcnRcbiAgICAgIC8vIGlkZW1wb3RlbnRseSksIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgcGF5aW5nIHRoZSBhYm9ydC1jb21taXQgbGF0ZW5jeS5cbiAgICAgIGlmIChvcHRpbWlzdGljU3RhcnQpIHtcbiAgICAgICAgY29uc3QgcmVjb25jaWxlID0gYXdhaXQgcmVjb25jaWxlT3B0aW1pc3RpY1N0YXJ0KCk7XG4gICAgICAgIGlmIChyZWNvbmNpbGUpIHJldHVybiByZWNvbmNpbGU7XG4gICAgICAgIC8vIEJhcnJpZXIgcmVzb2x2ZWQg4oCUIHRoZSBzdGVwLXN0YXJ0IFBPU1QgdGltZXN0YW1wIGlzIG5vdyBrbm93biwgc29cbiAgICAgICAgLy8gUlNGUyBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIHN0ZXBfY29tcGxldGVkIGV2ZW50IGJlbG93LlxuICAgICAgICBiYWNrZmlsbE9wdGltaXN0aWNSc2ZzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbW1pdCBtdXN0LWJlLWR1cmFibGUgb3BzIChlLmcuIGEgc3RlcC1pbml0aWF0ZWQgYWJvcnQnc1xuICAgICAgLy8gaG9va19yZWNlaXZlZCBldmVudCkgYmVmb3JlIHdyaXRpbmcgc3RlcF9jb21wbGV0ZWQsIHNvIGFueSB3b3JrZmxvd1xuICAgICAgLy8gY29udGludWF0aW9uIHRyaWdnZXJlZCBieSB0aGF0IGV2ZW50IG9ic2VydmVzIHRoZSBhYm9ydCByYXRoZXIgdGhhblxuICAgICAgLy8gcmFjaW5nIGl0LiBUaGVzZSBvcHMgc3dhbGxvdyB0aGVpciBvd24gZXJyb3JzLCBzbyBhd2FpdGluZyBvbmx5XG4gICAgICAvLyBlbmZvcmNlcyBvcmRlcmluZyAodGhlIGAuY2F0Y2goKWAgZGVmZW5kcyB0aGUgbm8tcmVqZWN0IGNvbnRyYWN0IG9uXG4gICAgICAvLyBTdGVwQ29udGV4dC5wcmVDb21wbGV0aW9uT3BzKS5cbiAgICAgIC8vXG4gICAgICAvLyBUcmFkZW9mZjogY29ycmVjdG5lc3MgcmVxdWlyZXMgdGhlIGhvb2sgYmUgZHVyYWJsZSBiZWZvcmUgY29tcGxldGlvbixcbiAgICAgIC8vIHNvIOKAlCB1bmxpa2UgdGhlIGJhY2tncm91bmQgYG9wc2AgZmx1c2ggYWJvdmUg4oCUIHRoaXMgY2Fubm90IGJlIGNhcHBlZFxuICAgICAgLy8gd2l0aCBhIHJlc29sdmUtb24tdGltZW91dCByYWNlLiBBIHNsb3cgcmVzdW1lIHRoZXJlZm9yZSBhZGRzIGl0c1xuICAgICAgLy8gbGF0ZW5jeSB0byBhIHN0ZXAgdGhhdCBhYm9ydHMgYSBjb250cm9sbGVyLCBhbmQgYSB0cnVlIGhhbmcgaG9sZHNcbiAgICAgIC8vIGNvbXBsZXRpb24gdW50aWwgdGhlIHBsYXRmb3JtL3F1ZXVlIGV4ZWN1dGlvbiB0aW1lb3V0IGZpcmVzOyB0aGUgcXVldWVcbiAgICAgIC8vIHRoZW4gcmVkZWxpdmVycyBhbmQgdGhlIHN0ZXAgcmV0cmllcywgcmUtZmlyaW5nIHRoZSBhYm9ydCBpZGVtcG90ZW50bHkuXG4gICAgICBpZiAocHJlQ29tcGxldGlvbk9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByZUNvbXBsZXRpb25PcHMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgIC8vIE9wdGltaXN0aWMgc3RhcnQ6IHRoZSBib2R5IHRocmV3IGJlZm9yZSBgc3RlcF9zdGFydGVkYCB3YXMgY29uZmlybWVkLlxuICAgICAgLy8gUmVjb25jaWxlIGZpcnN0IOKAlCBpZiB3ZSBsb3N0IHRoZSBjcmVhdGUtY2xhaW0gKG9yIHRoZSBydW4gaXNcbiAgICAgIC8vIGdvbmUvdGhyb3R0bGVkKSB0aGUgYm9keSBlcnJvciBpcyBtb290OyBkaXNjYXJkIGl0IGFuZCBkb24ndCB3cml0ZSBhXG4gICAgICAvLyB0ZXJtaW5hbCBldmVudCAodGhlIHdpbm5pbmcgaGFuZGxlciBvd25zIHRoZSBvdXRjb21lKS4gUmVjb25jaWxlXG4gICAgICAvLyBiZWZvcmUgZHJhaW5pbmcgcHJlQ29tcGxldGlvbk9wcyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBzdWNjZXNzXG4gICAgICAvLyBwYXRoOiBhIGRpc2NhcmRlZCBvdXRjb21lIGRvZXNuJ3QgbmVlZCB0aGUgYWJvcnQgY29tbWl0dGVkIGhlcmUuXG4gICAgICBpZiAob3B0aW1pc3RpY1N0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHJlY29uY2lsZSA9IGF3YWl0IHJlY29uY2lsZU9wdGltaXN0aWNTdGFydCgpO1xuICAgICAgICBpZiAocmVjb25jaWxlKSByZXR1cm4gcmVjb25jaWxlO1xuICAgICAgICAvLyBCYXJyaWVyIHJlc29sdmVkIOKAlCBhdHRhY2ggUlNGUyB0byB0aGUgc3RlcF9mYWlsZWQgZXZlbnQocykgYmVsb3cuXG4gICAgICAgIGJhY2tmaWxsT3B0aW1pc3RpY1JzZnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gT3JkZXIgYW55IG11c3QtYmUtZHVyYWJsZSBvcHMgKGUuZy4gYSBzdGVwLWluaXRpYXRlZCBhYm9ydCdzXG4gICAgICAvLyBob29rX3JlY2VpdmVkIGV2ZW50KSBhaGVhZCBvZiBzdGVwX2ZhaWxlZCB0b28g4oCUIGEgc3RlcCB0aGF0IGFib3J0cyBhbmRcbiAgICAgIC8vIHRoZW4gdGhyb3dzIG11c3Qgc3RpbGwgaGF2ZSB0aGUgYWJvcnQgcmVjb3JkZWQgYmVmb3JlIHRoZSBmYWlsdXJlXG4gICAgICAvLyBjb250aW51YXRpb24gb2JzZXJ2ZXMgaXQuIFNhbWUgbGF0ZW5jeSB0cmFkZW9mZiBhbmQgbm8tcmVqZWN0IGNvbnRyYWN0XG4gICAgICAvLyBhcyB0aGUgc3VjY2VzcyBwYXRoIGFib3ZlLiBTZWUgU3RlcENvbnRleHQucHJlQ29tcGxldGlvbk9wcy5cbiAgICAgIGlmIChwcmVDb21wbGV0aW9uT3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJlQ29tcGxldGlvbk9wcykuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlZmZlY3RpdmVFcnIgPSBwcm9tb3RlQWJvcnRFcnJvclRvRmF0YWwoZXJyKTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID0gYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKGVmZmVjdGl2ZUVycik7XG4gICAgICBjb25zdCBub3JtYWxpemVkU3RhY2sgPVxuICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayhlZmZlY3RpdmVFcnIpIHx8ICcnO1xuXG4gICAgICBpZiAoZWZmZWN0aXZlRXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4oZWZmZWN0aXZlRXJyKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNGYXRhbCA9IEZhdGFsRXJyb3IuaXMoZWZmZWN0aXZlRXJyKTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRXJyb3JOYW1lKGdldEVycm9yTmFtZShlZmZlY3RpdmVFcnIpKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck1lc3NhZ2Uobm9ybWFsaXplZEVycm9yLm1lc3NhZ2UpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JUeXBlKGdldEVycm9yTmFtZShlZmZlY3RpdmVFcnIpKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yQ2F0ZWdvcnkoXG4gICAgICAgICAgaXNGYXRhbFxuICAgICAgICAgICAgPyAnZmF0YWwnXG4gICAgICAgICAgICA6IFJldHJ5YWJsZUVycm9yLmlzKGVmZmVjdGl2ZUVycilcbiAgICAgICAgICAgICAgPyAncmV0cnlhYmxlJ1xuICAgICAgICAgICAgICA6ICd0cmFuc2llbnQnXG4gICAgICAgICksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclJldHJ5YWJsZSghaXNGYXRhbCksXG4gICAgICB9KTtcblxuICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHN0ZXBMb2dnZXIuaW5mbygnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgc3RlcElkLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ZhdGFsKSB7XG4gICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgJ0VuY291bnRlcmVkIEZhdGFsRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHN0ZXAsIGJ1YmJsaW5nIHVwIHRvIHBhcmVudCB3b3JrZmxvdycsXG4gICAgICAgICAgeyB3b3JrZmxvd1J1bklkLCBzdGVwTmFtZSwgZXJyb3JTdGFjazogbm9ybWFsaXplZFN0YWNrIH1cbiAgICAgICAgKTtcbiAgICAgICAgLy8gQXBwbHkgdGhlIG5vcm1hbGl6ZWQgc3RhY2sgdG8gdGhlIHRocm93biB2YWx1ZSBzbyB0aGUgc2VyaWFsaXplZFxuICAgICAgICAvLyBlcnJvciBwcmVzZXJ2ZXMgaXQgZm9yIGNvbnN1bWVycy4gYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgd29ya3NcbiAgICAgICAgLy8gYWNyb3NzIFZNIHJlYWxtcyAoYSB3b3JrZmxvdy10aHJvd24gZXJyb3IgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlXG4gICAgICAgIC8vIFZNJ3MgRXJyb3IgY2xhc3MsIG5vdCB0aGUgaG9zdCdzKS5cbiAgICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IoZWZmZWN0aXZlRXJyKSAmJiBub3JtYWxpemVkU3RhY2spIHtcbiAgICAgICAgICAoZWZmZWN0aXZlRXJyIGFzIEVycm9yKS5zdGFjayA9IG5vcm1hbGl6ZWRTdGFjaztcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVFcnIsXG4gICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5sYXRlbmN5RXZlbnREYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwRmFpbEVycikpIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgIH1cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdmYWlsZWQnIH07XG4gICAgICB9XG5cbiAgICAgIC8vIE5vbi1mYXRhbCBlcnJvcjogY2hlY2sgaWYgcmV0cmllcyByZW1haW5pbmdcbiAgICAgIGNvbnN0IGN1cnJlbnRBdHRlbXB0ID0gc3RlcC5hdHRlbXB0O1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBdHRlbXB0KGN1cnJlbnRBdHRlbXB0KSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBNYXhSZXRyaWVzKG1heFJldHJpZXMpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChjdXJyZW50QXR0ZW1wdCA+PSBtYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAvLyBNYXggcmV0cmllcyByZWFjaGVkXG4gICAgICAgIGNvbnN0IHJldHJ5Q291bnQgPSBzdGVwLmF0dGVtcHQgLSAxO1xuICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICdNYXggcmV0cmllcyByZWFjaGVkLCBidWJibGluZyBlcnJvciB0byBwYXJlbnQgd29ya2Zsb3cnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIGF0dGVtcHQ6IHN0ZXAuYXR0ZW1wdCxcbiAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcE5hbWV9XCIgZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCBtYXhSZXRyaWVzKX06ICR7bm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgLy8gV3JhcCB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIGFzIGBjYXVzZWAgb24gYSBmcmVzaCBGYXRhbEVycm9yXG4gICAgICAgIC8vIHNvIHRoZSB3cmFwcGluZyBtZXNzYWdlICsgcmV0cnktY291bnQgZnJhbWluZyBpcyB0aGUgdXNlci1mYWNpbmdcbiAgICAgICAgLy8gZXJyb3Igd2hpbGUgdGhlIG9yaWdpbmFsIGZhaWx1cmUgcmVtYWlucyByZWNvdmVyYWJsZSBmcm9tXG4gICAgICAgIC8vIGBlcnIuY2F1c2VgIGFmdGVyIGh5ZHJhdGlvbi5cbiAgICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBlcnI7XG4gICAgICAgIGlmIChub3JtYWxpemVkU3RhY2spIHdyYXBwZWRFcnJvci5zdGFjayA9IG5vcm1hbGl6ZWRTdGFjaztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudCh7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgLi4ubGF0ZW5jeUV2ZW50RGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdGVwRmFpbEVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2ZhaWxlZCcgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllcyByZW1haW5pbmdcbiAgICAgIGlmIChSZXRyeWFibGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHN0ZXBMb2dnZXIuaW5mbygnRW5jb3VudGVyZWQgUmV0cnlhYmxlRXJyb3IsIHN0ZXAgd2lsbCBiZSByZXRyaWVkJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgYXR0ZW1wdDogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICBhdHRlbXB0OiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSB0aGUgbm9ybWFsaXplZCBzdGFjayB0byB0aGUgdGhyb3duIHZhbHVlIHNvIGl0IHN1cnZpdmVzXG4gICAgICAvLyBzZXJpYWxpemF0aW9uLiBTZWUgdGhlIEZhdGFsRXJyb3Igc2l0ZSBhYm92ZSBmb3Igd2h5IHdlIHVzZVxuICAgICAgLy8gYHR5cGVzLmlzTmF0aXZlRXJyb3JgIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYC5cbiAgICAgIGlmICh0eXBlcy5pc05hdGl2ZUVycm9yKGVycikgJiYgbm9ybWFsaXplZFN0YWNrKSB7XG4gICAgICAgIChlcnIgYXMgRXJyb3IpLnN0YWNrID0gbm9ybWFsaXplZFN0YWNrO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoe1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfcmV0cnlpbmcnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpLFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAuLi4oUmV0cnlhYmxlRXJyb3IuaXMoZXJyKSAmJiB7IHJldHJ5QWZ0ZXI6IGVyci5yZXRyeUFmdGVyIH0pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoc3RlcFJldHJ5RXJyKSB7XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBSZXRyeUVycikpIHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnVHJpZWQgcmV0cnlpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogc3RlcFJldHJ5RXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAnc2tpcHBlZCcgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBzdGVwUmV0cnlFcnI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoXG4gICAgICAgIDEsXG4gICAgICAgIFJldHJ5YWJsZUVycm9yLmlzKGVycilcbiAgICAgICAgICA/IE1hdGguY2VpbCgoK2Vyci5yZXRyeUFmdGVyLmdldFRpbWUoKSAtIERhdGUubm93KCkpIC8gMTAwMClcbiAgICAgICAgICA6IDFcbiAgICAgICk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5V2lsbFJldHJ5KHRydWUpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdyZXRyeScsIHRpbWVvdXRTZWNvbmRzIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHN0ZXBfY29tcGxldGVkIGV2ZW50IG91dHNpZGUgdGhlIHN0ZXAgZXhlY3V0aW9uIGZhaWx1cmUgcGF0aDpcbiAgICAvLyBwZXJzaXN0ZW5jZSBmYWlsdXJlcyBhcmUgaW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIGFuZCBzaG91bGQgcmVkZWxpdmVyIHRoZVxuICAgIC8vIHF1ZXVlIG1lc3NhZ2UsIG5vdCBiZWNvbWUgdXNlciBzdGVwX3JldHJ5aW5nL3N0ZXBfZmFpbGVkIGV2ZW50cy5cbiAgICBsZXQgY29tcGxldGVkUmVzdWx0OiBFdmVudFJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgY29tcGxldGVkUmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQgYXMgVWludDhBcnJheSxcbiAgICAgICAgICAgIC4uLmxhdGVuY3lFdmVudERhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBzaW5jZUN1cnNvcjogcGFyYW1zLmlubGluZURlbHRhU2luY2VDdXJzb3IgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICdza2lwcGVkJyB9O1xuICAgICAgfVxuICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgIHN0ZXBMb2dnZXIuaW5mbygnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgc3RlcElkLFxuICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgdHlwZTogJ2dvbmUnIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgY29uc3QgaW5saW5lRGVsdGEgPSBleHRyYWN0SW5saW5lRGVsdGEoXG4gICAgICBjb21wbGV0ZWRSZXN1bHQsXG4gICAgICBwYXJhbXMuaW5saW5lRGVsdGFTaW5jZUN1cnNvciAhPT0gdW5kZWZpbmVkXG4gICAgKTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiByZXN1bHQpLFxuICAgIH0pO1xuXG4gICAgaWYgKG9wcy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGVwTG9nZ2VyLmRlYnVnKCdTdGVwIGhhcyBwZW5kaW5nIG9wcycsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgIG9wc0NvdW50OiBvcHMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGhhc1BlbmRpbmdPcHMgc2lnbmFscyB0aGUgY29tYmluZWQgaGFuZGxlciB0byBicmVhayB0aGUgbG9vcFxuICAgIC8vIGFuZCBxdWV1ZSBhIGNvbnRpbnVhdGlvbiBzbyB3YWl0VW50aWwgY2FuIGZsdXNoIHRoZW0uXG4gICAgcmV0dXJuIHsgdHlwZTogJ2NvbXBsZXRlZCcsIGhhc1BlbmRpbmdPcHM6ICFvcHNTZXR0bGVkLCBpbmxpbmVEZWx0YSB9O1xuICB9KTtcbn1cbiJdfQ==