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

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 (40) hide show
  1. package/dist/create-hook.d.ts +9 -5
  2. package/dist/create-hook.d.ts.map +1 -1
  3. package/dist/create-hook.js +1 -1
  4. package/dist/private.d.ts +31 -12
  5. package/dist/private.d.ts.map +1 -1
  6. package/dist/private.js +147 -23
  7. package/dist/runtime/constants.d.ts +27 -0
  8. package/dist/runtime/constants.d.ts.map +1 -1
  9. package/dist/runtime/constants.js +33 -1
  10. package/dist/runtime/quickjs-entrypoint.d.ts +2 -0
  11. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  12. package/dist/runtime/quickjs-entrypoint.js +3 -2
  13. package/dist/runtime/run.d.ts.map +1 -1
  14. package/dist/runtime/run.js +54 -29
  15. package/dist/runtime/step-executor.d.ts +49 -1
  16. package/dist/runtime/step-executor.d.ts.map +1 -1
  17. package/dist/runtime/step-executor.js +67 -8
  18. package/dist/runtime/step-latency.d.ts +6 -0
  19. package/dist/runtime/step-latency.d.ts.map +1 -1
  20. package/dist/runtime/step-latency.js +3 -1
  21. package/dist/runtime/suspension-handler.d.ts +81 -1
  22. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  23. package/dist/runtime/suspension-handler.js +501 -15
  24. package/dist/runtime.d.ts.map +1 -1
  25. package/dist/runtime.js +126 -16
  26. package/dist/serialization.d.ts +10 -2
  27. package/dist/serialization.d.ts.map +1 -1
  28. package/dist/serialization.js +48 -6
  29. package/dist/telemetry.d.ts +6 -0
  30. package/dist/telemetry.d.ts.map +1 -1
  31. package/dist/telemetry.js +22 -1
  32. package/dist/version.d.ts +1 -1
  33. package/dist/version.js +2 -2
  34. package/dist/workflow/create-hook.js +2 -2
  35. package/dist/workflow/hook.js +3 -3
  36. package/dist/workflow.js +16 -8
  37. package/docs/foundations/hooks.mdx +2 -2
  38. package/docs/foundations/streaming.mdx +24 -0
  39. package/docs/how-it-works/event-sourcing.mdx +39 -1
  40. package/package.json +4 -4
package/dist/runtime.js CHANGED
@@ -1224,6 +1224,7 @@ export function workflowEntrypoint(workflowCode, options) {
1224
1224
  workflowDeploymentId: bgRun.deploymentId,
1225
1225
  workflowName,
1226
1226
  workflowStartedAt: bgStartedAt,
1227
+ requestId,
1227
1228
  rootRunId: rootRunIdFrom(bgRun.attributes, runId),
1228
1229
  stepId: incomingStepId,
1229
1230
  stepName: incomingStepName,
@@ -2104,6 +2105,7 @@ export function workflowEntrypoint(workflowCode, options) {
2104
2105
  // requeueing the step.
2105
2106
  deliveryAttempt: metadata.attempt,
2106
2107
  ownerMessageId: metadata.messageId,
2108
+ requestId,
2107
2109
  });
2108
2110
  if (quickjsResult?.timeoutSeconds !== undefined) {
2109
2111
  // Use `reinvoke` rather than returning
@@ -2454,6 +2456,21 @@ export function workflowEntrypoint(workflowCode, options) {
2454
2456
  queueName: getWorkflowQueueName(workflowName, namespace),
2455
2457
  getTraceCarrier: nextTraceCarrier,
2456
2458
  },
2459
+ // Inline pre-claims: lets the batched fan-out
2460
+ // fold the lazy-inline steps' step_created +
2461
+ // step_started pairs — stamped with this
2462
+ // message's ownership — into the one commit, so
2463
+ // the bodies below start straight off it. See
2464
+ // SuspensionHandlerResult.inlineClaims.
2465
+ ownerMessageId: metadata.messageId,
2466
+ // Let the fold return once the pair chunk has
2467
+ // committed: trailing chunks and the per-chunk
2468
+ // step-message publishes ride
2469
+ // `deferredBatchWork`, which this invocation
2470
+ // joins before it can ack (below, next to the
2471
+ // dispatch join) — so the durability contract
2472
+ // is unchanged while the bodies start earlier.
2473
+ allowDeferredBatchWork: true,
2457
2474
  });
2458
2475
  }
2459
2476
  catch (suspensionError) {
@@ -2825,7 +2842,21 @@ export function workflowEntrypoint(workflowCode, options) {
2825
2842
  requestedAt: new Date(),
2826
2843
  }, getWaitContinuationDispatch(suspensionResult.waitTimeout.seconds, suspensionResult.waitTimeout.correlationId)));
2827
2844
  }
2828
- await Promise.all(dispatches);
2845
+ // The dispatch publishes and the inline bodies below
2846
+ // run CONCURRENTLY: the suspension commit already made
2847
+ // every dispatched step durable (and, when the fold
2848
+ // engaged, settled the inline pairs' claims), which is
2849
+ // the only ordering both sides need — so neither waits
2850
+ // for the other. The joins below (before step results
2851
+ // are read, and on the no-inline early returns) keep
2852
+ // the failure contract: a dispatch rejection still
2853
+ // fails this delivery, after in-flight bodies settle.
2854
+ const dispatchesSettled = Promise.all(dispatches);
2855
+ // A rejection must not surface as an unhandled
2856
+ // rejection while the bodies run (or if setup between
2857
+ // here and the join throws first); awaiting the
2858
+ // original promise below still observes it.
2859
+ dispatchesSettled.catch(() => { });
2829
2860
  // The set of steps THIS invocation executes: the
2830
2861
  // deferred lazy-inline batch plus any owned-recovery
2831
2862
  // steps (this message's redelivery re-executing a
@@ -2837,11 +2868,25 @@ export function workflowEntrypoint(workflowCode, options) {
2837
2868
  // ownerMessageId, which is also what the
2838
2869
  // owned-recovery retry ceiling counts).
2839
2870
  const inlineExecutions = [
2840
- ...lazyInlineSteps.map((s) => ({
2841
- correlationId: s.correlationId,
2842
- stepName: s.stepName,
2843
- lazyStepInput: s.dehydratedInput,
2844
- })),
2871
+ ...lazyInlineSteps.map((s) => {
2872
+ // Pre-claimed by the suspension batch: the pair
2873
+ // already settled this step's create + claim, so
2874
+ // the executor runs (or skips) the body off that
2875
+ // verdict instead of sending a lazy start with
2876
+ // the input.
2877
+ const claim = suspensionResult.inlineClaims.get(s.correlationId);
2878
+ return claim
2879
+ ? {
2880
+ correlationId: s.correlationId,
2881
+ stepName: s.stepName,
2882
+ preclaimedStart: claim,
2883
+ }
2884
+ : {
2885
+ correlationId: s.correlationId,
2886
+ stepName: s.stepName,
2887
+ lazyStepInput: s.dehydratedInput,
2888
+ };
2889
+ }),
2845
2890
  ...ownedRecoverySteps.map((s) => ({
2846
2891
  correlationId: s.correlationId,
2847
2892
  stepName: s.stepName,
@@ -2874,6 +2919,14 @@ export function workflowEntrypoint(workflowCode, options) {
2874
2919
  // queued (or no work needs scheduling). Exit and let
2875
2920
  // the queue drive subsequent replays.
2876
2921
  if (inlineExecutions.length === 0) {
2922
+ // Nothing runs concurrently with the dispatches on
2923
+ // this path — join them (and the fold's deferred
2924
+ // chunk commits/publishes) here so a failure fails
2925
+ // the delivery exactly as it always has.
2926
+ await Promise.all([
2927
+ dispatchesSettled,
2928
+ suspensionResult.deferredBatchWork,
2929
+ ]);
2877
2930
  // A `hook.getConflict()` awaiter needs an immediate
2878
2931
  // re-invocation: the replay consumes the
2879
2932
  // just-committed hook_created and resolves the
@@ -3057,7 +3110,20 @@ export function workflowEntrypoint(workflowCode, options) {
3057
3110
  // this is the view the scheduling decision was made
3058
3111
  // against. The executor advances from it as its own
3059
3112
  // writes land; see `slotSnapshot` in step-executor.
3060
- const inlineClaimSnapshot = slotSnapshotParams(eventLog.events);
3113
+ const loadedSlotSnapshot = slotSnapshotParams(eventLog.events);
3114
+ // The batched fan-out's own events are not in the
3115
+ // loaded log yet (the next iteration reloads), but
3116
+ // this invocation wrote them — fold the batch's
3117
+ // ceiling in, or every inline terminal write would
3118
+ // name a pre-batch position and be answered with a
3119
+ // skipped-slot report echoing the events this
3120
+ // suspension just committed.
3121
+ const batchSlotCeiling = suspensionResult.batchCommittedSlotCeiling;
3122
+ const inlineClaimSnapshot = batchSlotCeiling !== undefined &&
3123
+ batchSlotCeiling >
3124
+ (loadedSlotSnapshot.eventCount ?? 0)
3125
+ ? { eventCount: batchSlotCeiling }
3126
+ : loadedSlotSnapshot;
3061
3127
  // TTR: consumed by this batch. Every step is handed
3062
3128
  // the SAME tracking object and its one-shot
3063
3129
  // `reported` latch picks the single step that
@@ -3081,6 +3147,7 @@ export function workflowEntrypoint(workflowCode, options) {
3081
3147
  workflowDeploymentId: workflowRun.deploymentId,
3082
3148
  workflowName,
3083
3149
  workflowStartedAt,
3150
+ requestId,
3084
3151
  rootRunId: rootRunIdFrom(workflowRun.attributes, runId),
3085
3152
  stepId: s.correlationId,
3086
3153
  stepName: s.stepName,
@@ -3107,7 +3174,8 @@ export function workflowEntrypoint(workflowCode, options) {
3107
3174
  // rather than walking the growing log for
3108
3175
  // every inline step (which would be O(n²)
3109
3176
  // across a long sequential workflow).
3110
- authoritativeAttempt: s.lazyStepInput !== undefined
3177
+ authoritativeAttempt: s.lazyStepInput !== undefined ||
3178
+ s.preclaimedStart !== undefined
3111
3179
  ? 1
3112
3180
  : countStepStartedEvents(eventLog.events, s.correlationId, {
3113
3181
  type: 'ownedBy',
@@ -3117,8 +3185,15 @@ export function workflowEntrypoint(workflowCode, options) {
3117
3185
  // input on step_started so the world creates
3118
3186
  // the step on the fly. Absent for
3119
3187
  // owned-recovery steps, whose input hydrates
3120
- // from the existing step entity.
3188
+ // from the existing step entity, and for
3189
+ // pre-claimed steps, whose pair already
3190
+ // carried it.
3121
3191
  lazyStepInput: s.lazyStepInput,
3192
+ // Pre-claimed inline start: the suspension
3193
+ // batch settled this step's create + claim;
3194
+ // the executor runs (or skips) the body off
3195
+ // that verdict with no start write of its own.
3196
+ preclaimedStart: s.preclaimedStart,
3122
3197
  // Inline ownership: stamp (or re-stamp) this
3123
3198
  // invocation's queue message ID on the
3124
3199
  // step_started, so wake replays see the body
@@ -3139,7 +3214,8 @@ export function workflowEntrypoint(workflowCode, options) {
3139
3214
  runReadyBarrier,
3140
3215
  slotSnapshot: inlineClaimSnapshot,
3141
3216
  ...(stepIndex === 0 &&
3142
- s.lazyStepInput !== undefined &&
3217
+ (s.lazyStepInput !== undefined ||
3218
+ s.preclaimedStart !== undefined) &&
3143
3219
  latencyTracking
3144
3220
  ? { latencyTracking }
3145
3221
  : {}),
@@ -3158,18 +3234,52 @@ export function workflowEntrypoint(workflowCode, options) {
3158
3234
  // these bodies until they settle — see
3159
3235
  // assertNoInFlightOwnedSteps.
3160
3236
  inFlightOwnedSteps.add(s.correlationId);
3161
- // Lazy steps are brand-new (their create-claim
3162
- // is the exactly-once gate), but an
3163
- // owned-recovery step already exists and its
3164
- // delayed backstop message may fire mid-body
3237
+ // Lazy and pre-claimed steps are brand-new
3238
+ // (their create-claim is the exactly-once gate),
3239
+ // but an owned-recovery step already exists and
3240
+ // its delayed backstop message may fire mid-body
3165
3241
  // in this same process — route those through
3166
3242
  // the in-process single-flight.
3167
- const executed = s.lazyStepInput === undefined
3243
+ const executed = s.lazyStepInput === undefined &&
3244
+ s.preclaimedStart === undefined
3168
3245
  ? runStepSingleFlight(runId, s.correlationId, run)
3169
3246
  : run();
3170
3247
  return executed.finally(() => inFlightOwnedSteps.delete(s.correlationId));
3171
3248
  });
3249
+ // The joins below sit BETWEEN these promises' creation
3250
+ // and the `Promise.all` that reads them, so a body that
3251
+ // rejects while a publish or a trailing chunk commit is
3252
+ // still in flight would have no handler attached at the
3253
+ // microtask checkpoint — an `unhandledRejection`, fatal
3254
+ // under Node's default `--unhandled-rejections=throw`.
3255
+ // A 412 stale-claim rejection races exactly that window.
3256
+ // Attach now; every rejection is still observed by the
3257
+ // awaits below, which are what decide the outcome.
3258
+ for (const promise of stepExecutionPromises) {
3259
+ promise.catch(() => { });
3260
+ }
3172
3261
  try {
3262
+ // Join the dispatch publishes launched above and
3263
+ // the fold's deferred batch work (trailing chunk
3264
+ // commits + per-chunk step-message publishes) —
3265
+ // the bodies are already running in parallel with
3266
+ // both, and this invocation must not ack before
3267
+ // every create and publish is durable. A failure
3268
+ // keeps its old contract (fail this delivery so
3269
+ // the message redelivers), but the in-flight
3270
+ // bodies must settle first: an owned body left
3271
+ // running past this handler would race its own
3272
+ // redelivery.
3273
+ try {
3274
+ await Promise.all([
3275
+ dispatchesSettled,
3276
+ suspensionResult.deferredBatchWork,
3277
+ ]);
3278
+ }
3279
+ catch (dispatchErr) {
3280
+ await Promise.allSettled(stepExecutionPromises);
3281
+ throw dispatchErr;
3282
+ }
3173
3283
  stepResults = await Promise.all(stepExecutionPromises);
3174
3284
  }
3175
3285
  catch (stepErr) {
@@ -3588,4 +3698,4 @@ export function workflowEntrypoint(workflowCode, options) {
3588
3698
  });
3589
3699
  });
3590
3700
  }
3591
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBRXJCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsaUNBQWlDLEVBRWpDLDJCQUEyQixHQUc1QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQWdDLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBZSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNB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cm9tICdub2RlOmFzc2VydC9zdHJpY3QnO1xuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgRW50aXR5Q29uZmxpY3RFcnJvcixcbiAgRmF0YWxFcnJvcixcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IsXG4gIFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBvbmNlLCBzZXRXb3JrZmxvd0Jhc2VQYXRoIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxuICB3b3JrZmxvd0Rpc3BsYXlOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICB0eXBlIENyZWF0ZUV2ZW50UGFyYW1zLFxuICB0eXBlIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgdHlwZSBFdmVudCxcbiAgdHlwZSBFdmVudFJlc3VsdCxcbiAgZ2V0UXVldWVUb3BpY1ByZWZpeCxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgaXNUZXJtaW5hbFJ1bkV2ZW50VHlwZSxcbiAgUk9PVF9SVU5fSURfQVRUUklCVVRFLFxuICB0eXBlIFJ1bklucHV0LFxuICByZXNvbHZlUXVldWVOYW1lc3BhY2UsXG4gIFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG4gIHR5cGUgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICBXb3JrZmxvd0ludm9rZVBheWxvYWRTY2hlbWEsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgbXMgZnJvbSAnbXMnO1xuaW1wb3J0IHsgZGVjb2RlVGltZSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlSdW5FcnJvcixcbiAgaXNSZXRyeWFibGVXb3JsZEVycm9yLFxuICBpc1dvcmxkQ29udHJhY3RFcnJvcixcbn0gZnJvbSAnLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQgeyBkZXNjcmliZUVycm9yIH0gZnJvbSAnLi9kZXNjcmliZS1lcnJvci5qcyc7XG5pbXBvcnQgeyB0eXBlIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtLCBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgeyB0eXBlIExvZ2dlciwgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdldFN0ZXBGdW5jdGlvbiB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB7IENPTVBVVEVfSU5TVEFOQ0VfSUQgfSBmcm9tICcuL3J1bnRpbWUvY29tcHV0ZS1pbnN0YW5jZS5qcyc7XG5pbXBvcnQge1xuICBnZXRNYXhFdmVudHNPdmVycmlkZSxcbiAgZ2V0TWF4UXVldWVEZWxpdmVyaWVzLFxuICBnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cyxcbiAgZ2V0UHJlY29uZGl0aW9uTWF4UmVpbnZvY2F0aW9ucyxcbiAgZ2V0UHJlY29uZGl0aW9uUmVpbnZva2VEZWxheVNlY29uZHMsXG4gIGdldFJlcGxheURpdmVyZ2VuY2VNYXhSZXRyaWVzLFxuICBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQsXG4gIGlzVHVyYm9FbmFibGVkLFxuICBpc1ZtUmV0ZW50aW9uRW5hYmxlZCxcbn0gZnJvbSAnLi9ydW50aW1lL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBjb3VudFN0ZXBTdGFydGVkRXZlbnRzIH0gZnJvbSAnLi9ydW50aW1lL2NvdW50LXN0ZXAtc3RhcnRlZC1ldmVudHMuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lLFxuICBndWFyZERlcGxveW1lbnRBZmZpbml0eSxcbiAgdHlwZSBSZWVucXVldWVBcmdzLFxufSBmcm9tICcuL3J1bnRpbWUvZGVwbG95bWVudC1ndWFyZC5qcyc7XG5pbXBvcnQge1xuICBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydCxcbiAgYXBwZW5kVW5pcXVlRXZlbnRzLFxuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBpbnNlcnRFdmVudEJ5RXZlbnRJZCxcbiAgaXNTbG90R2FwQ2hlY2tFbmFibGVkLFxuICB0eXBlIExvYWRlZEV2ZW50TG9nLFxuICBsb2FkV29ya2Zsb3dSdW5FdmVudHMsXG4gIG1lbW9pemVFbmNyeXB0aW9uS2V5LFxuICBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZCxcbiAgcHJlY29uZGl0aW9uRXZlbnREZWx0YSxcbiAgcXVldWVNZXNzYWdlLFxuICB0eXBlIFNsb3RTbmFwc2hvdFBhcmFtcyxcbiAgc2V0dGxlRXZlbnRTbG90R2FwLFxuICBzbG90U25hcHNob3RQYXJhbXMsXG4gIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LFxuICB3aXRoSGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGhhbmRsZVJlcGxheUJ1ZGdldEV4aGF1c3RlZCxcbiAgUmVwbGF5QnVkZ2V0LFxufSBmcm9tICcuL3J1bnRpbWUvcmVwbGF5LWJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyIH0gZnJvbSAnLi9ydW50aW1lL3JlcGxheS1yZWNvdmVyeS1yZXBvcnRlci5qcyc7XG5pbXBvcnQge1xuICByZXN1bWVUaW1pbmdGb3JNZXNzYWdlLFxuICByZXN1bWVUcmFja2luZ0Zyb21NZXNzYWdlLFxufSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWxhdGVuY3kuanMnO1xuaW1wb3J0IHsgcnVuSWRDcmVhdGVkQXQgfSBmcm9tICcuL3J1bnRpbWUvcnVuLWlkLXRpbWUuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTLFxuICBleGVjdXRlU3RlcCxcbn0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY29tcHV0ZVN0ZXBMYXRlbmN5VHJhY2tpbmcgfSBmcm9tICcuL3J1bnRpbWUvc3RlcC1sYXRlbmN5LmpzJztcbmltcG9ydCB7XG4gIGJhY2tzdG9wSWRlbXBvdGVuY3lLZXksXG4gIGhhc1BlbmRpbmdTdGVwT3duZWRCeU1lc3NhZ2UsXG4gIGlzU3RlcE93bmVyc2hpcEFjdGl2ZSxcbiAgc3RlcExlYXNlUmVtYWluaW5nU2Vjb25kcyxcbn0gZnJvbSAnLi9ydW50aW1lL3N0ZXAtb3duZXJzaGlwLmpzJztcbmltcG9ydCB7IHJ1blN0ZXBTaW5nbGVGbGlnaHQgfSBmcm9tICcuL3J1bnRpbWUvc3RlcC1zaW5nbGUtZmxpZ2h0LmpzJztcbmltcG9ydCB7IGhhbmRsZVN1c3BlbnNpb24gfSBmcm9tICcuL3J1bnRpbWUvc3VzcGVuc2lvbi1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHVzZVF1aWNrSlNWbSB9IGZyb20gJy4vcnVudGltZS92bS1tb2RlLmpzJztcbmltcG9ydCB7IGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaCB9IGZyb20gJy4vcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi5qcyc7XG5pbXBvcnQge1xuICBnZXRXb3JsZCxcbiAgZ2V0V29ybGRIYW5kbGVycyxcbiAgdHlwZSBXb3JsZEhhbmRsZXJzLFxufSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHsgZGVoeWRyYXRlUnVuRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgcmVtYXBFcnJvclN0YWNrIH0gZnJvbSAnLi9zb3VyY2UtbWFwLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQge1xuICBidWlsZEludm9jYXRpb25TcGFuTGlua3MsXG4gIGdldE5leHRUcmFjZUNhcnJpZXIsXG4gIGdldFNwYW5LaW5kLFxuICBnZXRXb3JrZmxvd1RyYWNlTW9kZSxcbiAgaXNVc2FibGVUcmFjZUNhcnJpZXIsXG4gIHRyYWNlLFxuICB3aXRoVHJhY2VDb250ZXh0LFxuICB3aXRoV29ya2Zsb3dCYWdnYWdlLFxufSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRFcnJvck5hbWUsIGdldEVycm9yU3RhY2ssIG5vcm1hbGl6ZVVua25vd25FcnJvciB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRXb3JrZmxvd1N1c3BlbnNpb25NZXNzYWdlIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7XG4gIHJlcGxheVdvcmtmbG93LFxuICByZXN1bWVXb3JrZmxvdyxcbiAgdHlwZSBXb3JrZmxvd1Jlc3VtZVJlc3VsdCxcbiAgdHlwZSBXb3JrZmxvd1Nlc3Npb24sXG59IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9O1xuZXhwb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBIZWFsdGhDaGVja09wdGlvbnMsXG4gIHR5cGUgSGVhbHRoQ2hlY2tSZXN1bHQsXG4gIGhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5leHBvcnQge1xuICBnZXRIb29rQnlUb2tlbixcbiAgdHlwZSBSZXN1bWVkSG9vayxcbiAgcmVzdW1lSG9vayxcbiAgcmVzdW1lV2ViaG9vayxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1ob29rLmpzJztcbmV4cG9ydCB7XG4gIGdldFJ1bixcbiAgUnVuLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW0sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMsXG59IGZyb20gJy4vcnVudGltZS9ydW4uanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBDYW5jZWxSdW5PcHRpb25zLFxuICBjYW5jZWxSdW4sXG4gIGNhbmNlbFJ1bnMsXG4gIGxpc3RTdHJlYW1zLFxuICB0eXBlIFJlYWRTdHJlYW1PcHRpb25zLFxuICB0eXBlIFJlY3JlYXRlUnVuT3B0aW9ucyxcbiAgdHlwZSBSZWVucXVldWVSdW5PcHRpb25zLFxuICByZWFkU3RyZWFtLFxuICByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZyxcbiAgcmVlbnF1ZXVlUnVuLFxuICB0eXBlIFN0b3BTbGVlcE9wdGlvbnMsXG4gIHR5cGUgU3RvcFNsZWVwUmVzdWx0LFxuICB3YWtlVXBSdW4sXG59IGZyb20gJy4vcnVudGltZS9ydW5zLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgU3RhcnRPcHRpb25zLFxuICB0eXBlIFN0YXJ0T3B0aW9uc0Jhc2UsXG4gIHR5cGUgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkLFxuICBzdGFydCxcbn0gZnJvbSAnLi9ydW50aW1lL3N0YXJ0LmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVdvcmxkLFxuICBjcmVhdGVXb3JsZEZyb21Nb2R1bGUsXG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICBzZXRXb3JsZCxcbiAgdHlwZSBXb3JsZEZhY3RvcnlNb2R1bGUsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5cbi8qKlxuICogQXBwbHkgdGhlIG9wdGlvbmFsIGNsaWVudC1zaWRlIGV2ZW50LWxpbWl0IG92ZXJyaWRlLlxuICogYFdPUktGTE9XX01BWF9FVkVOVFNfT1ZFUlJJREVgLCB3aGVuIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIsIGNsYW1wcyB0aGVcbiAqIHNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgdG8gYSBzbWFsbGVyIHZhbHVlIHNvIGVuZm9yY2VtZW50IGNhblxuICogYmUgZXhlcmNpc2VkIHdpdGhvdXQgYSBzZXJ2ZXItc2lkZSBjaGFuZ2UuIENsYW1wLWRvd24gb25seTogaXQgbmV2ZXIgcmFpc2VzXG4gKiB0aGUgc2VydmVyJ3MgbGltaXQsIGFuZCBpdCB0YWtlcyBlZmZlY3QgZXZlbiB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBub25lLlxuICogVW5zZXQg4oeSIHNlcnZlciB2YWx1ZSBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGNsYW1wTWF4RXZlbnRzKHNlcnZlclZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdmVycmlkZSA9IGdldE1heEV2ZW50c092ZXJyaWRlKCk7XG4gIGlmIChvdmVycmlkZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc2VydmVyVmFsdWU7XG4gIHJldHVybiBzZXJ2ZXJWYWx1ZSA9PT0gdW5kZWZpbmVkID8gb3ZlcnJpZGUgOiBNYXRoLm1pbihzZXJ2ZXJWYWx1ZSwgb3ZlcnJpZGUpO1xufVxuXG4vKipcbiAqIFJlZnVzZSBhIHF1ZXVlIGRlbGl2ZXJ5IHdob3NlIHJ1biB3YXMgY3JlYXRlZCBpbiBhIGRpZmZlcmVudCBlbnZpcm9ubWVudCB0aGFuXG4gKiB0aGlzIGRlcGxveW1lbnQgcnVucyBpbi5cbiAqXG4gKiBgc3RhcnQoKWAgcGVyZm9ybXMgdHdvIHdyaXRlcyB0aGF0IG11c3QgbGFuZCBpbiB0aGUgc2FtZSB0ZW5hbnQ6IHRoZVxuICogYHJ1bl9jcmVhdGVkYCBldmVudCwgYXR0cmlidXRlZCB0byB3aGF0ZXZlciBlbnZpcm9ubWVudCB0aGUgKmNhbGxlcipcbiAqIGF1dGhlbnRpY2F0ZXMgYXMsIGFuZCB0aGUgcXVldWUgbWVzc2FnZSwgcGlubmVkIHRvIGEgKmRlcGxveW1lbnQqLiBBXG4gKiBtaXNjb25maWd1cmVkIGNhbGxlciBjYW4gc3BsaXQgdGhlbSDigJQgd3JpdGluZyB0aGUgcnVuIHRvIG9uZSBlbnZpcm9ubWVudFxuICogd2hpbGUgYWRkcmVzc2luZyB0aGUgbWVzc2FnZSB0byBhIGRlcGxveW1lbnQgaW4gYW5vdGhlci4gVGhlIGNvbnN1bWVyIHRoZW5cbiAqIGZpbmRzIG5vIHJ1biB1bmRlciBpdHMgb3duIHRlbmFudCBhbmQgdGhlIGJhY2tlbmQncyByZXNpbGllbnQgc3RhcnRcbiAqIChgcnVuX3N0YXJ0ZWRgIGNyZWF0ZXMgdGhlIHJ1biB3aGVuIGBydW5fY3JlYXRlZGAgd2FzIG5ldmVyIHNlZW4pIG1pbnRzIGFcbiAqIFNFQ09ORCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiB0aGlzIGVudmlyb25tZW50LiBCb3RoIGNvcGllcyBhcmUgcmVhbDogdGhlXG4gKiBjcmVhdG9yJ3Mgc2l0cyBwZW5kaW5nIGZvcmV2ZXIsIHRoaXMgb25lIGV4ZWN1dGVzLCBhbmQgZXZlcnkgc3Vic2VxdWVudFxuICogY3Jvc3MtdGVuYW50IHF1ZXVlIGFjayBmYWlscyB0byBmaW5kIGl0cyBtZXNzYWdlLlxuICpcbiAqIE5vdGhpbmcgZXh0ZXJuYWwgaXMgbmVlZGVkIHRvIGNhdGNoIHRoaXM6IHRoZSBjcmVhdG9yJ3MgZW52aXJvbm1lbnQgcmlkZXMgdGhlXG4gKiBtZXNzYWdlIGluIGBydW5JbnB1dC5lbnZpcm9ubWVudGAgYW5kIHRoaXMgcHJvY2VzcyBhbHJlYWR5IGtub3dzIGl0cyBvd24uIFNvXG4gKiBjb21wYXJlIHRoZW0gYW5kIHN0b3AgQkVGT1JFIGBydW5fc3RhcnRlZGAg4oCUIHRoZSB3cml0ZSB0aGF0IHdvdWxkIGNyZWF0ZSB0aGVcbiAqIGZvcmsuIFJlZnVzaW5nIGFmdGVyIGl0IHdvdWxkIGJlIHRvbyBsYXRlLlxuICpcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGNhbGxlciBtdXN0IGFiYW5kb24gdGhlIGRlbGl2ZXJ5LiBTa2lwcGVkIHdoZW5ldmVyXG4gKiBlaXRoZXIgc2lkZSBpcyB1bmtub3duLCB3aGljaCBrZWVwcyBldmVyeSBleGlzdGluZyBzZXR1cCBvbiBpdHMgY3VycmVudFxuICogYmVoYXZpb3I6IHdvcmxkcyB3aXRoIG5vIGVudmlyb25tZW50IGRpbWVuc2lvbiAoYHdvcmxkLWxvY2FsYCxcbiAqIGB3b3JsZC1wb3N0Z3Jlc2ApIGRvbid0IGltcGxlbWVudCBgZ2V0RW52aXJvbm1lbnRgLCBhbmQgcnVucyBzdGFydGVkIGJ5IGFuXG4gKiBvbGRlciBTREsgY2Fycnkgbm8gYGVudmlyb25tZW50YCBmaWVsZC5cbiAqL1xuZnVuY3Rpb24gcmVmdXNlQ3Jvc3NFbnZpcm9ubWVudERlbGl2ZXJ5KHtcbiAgd29ybGQsXG4gIHJ1bklucHV0LFxuICBydW5JZCxcbiAgcnVuTG9nZ2VyLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bklucHV0OiBSdW5JbnB1dCB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcnVuTG9nZ2VyOiBMb2dnZXI7XG59KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNyZWF0b3JFbnZpcm9ubWVudCA9IHJ1bklucHV0Py5lbnZpcm9ubWVudDtcbiAgaWYgKCFjcmVhdG9yRW52aXJvbm1lbnQpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjdXJyZW50RW52aXJvbm1lbnQgPSB3b3JsZC5nZXRFbnZpcm9ubWVudD8uKCk7XG4gIGlmICghY3VycmVudEVudmlyb25tZW50IHx8IGN1cnJlbnRFbnZpcm9ubWVudCA9PT0gY3JlYXRvckVudmlyb25tZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgIGBSZWZ1c2luZyB0byBydW4gdGhpcyB3b3JrZmxvdzogaXQgd2FzIGNyZWF0ZWQgaW4gdGhlIFwiJHtjcmVhdG9yRW52aXJvbm1lbnR9XCIgYCArXG4gICAgICBgZW52aXJvbm1lbnQgYnV0IHRoaXMgZGVwbG95bWVudCBydW5zIGluIFwiJHtjdXJyZW50RW52aXJvbm1lbnR9XCIuIGAgK1xuICAgICAgJ0V4ZWN1dGluZyBpdCBoZXJlIHdvdWxkIGNyZWF0ZSBhIHNlY29uZCBjb3B5IG9mIHRoZSBzYW1lIHJ1biBpZCBpbiAnICtcbiAgICAgICdib3RoIGVudmlyb25tZW50cyDigJQgb25lIHBlbmRpbmcgZm9yZXZlciwgb25lIHJ1bm5pbmcg4oCUIHNvIHRoZSBxdWV1ZSAnICtcbiAgICAgICdtZXNzYWdlIGlzIGJlaW5nIGRpc2NhcmRlZCB3aXRob3V0IGV4ZWN1dGluZyBhbmQgd2l0aG91dCByZXRyeWluZy4gJyArXG4gICAgICAnVGhlIGNsaWVudCB0aGF0IGNhbGxlZCBzdGFydCgpIHdyb3RlIHRoZSBydW4gdG8gaXRzIG93biBlbnZpcm9ubWVudCAnICtcbiAgICAgICdidXQgYWRkcmVzc2VkIHRoZSBxdWV1ZSBtZXNzYWdlIHRvIGEgZGVwbG95bWVudCBpbiBhbm90aGVyIG9uZS4gQ2hlY2sgJyArXG4gICAgICAndGhhdCB0aGUgZW52aXJvbm1lbnQgdGhhdCBjbGllbnQgYXV0aGVudGljYXRlcyBhcyAoV09SS0ZMT1dfVkVSQ0VMX0VOViAnICtcbiAgICAgIFwiZm9yIENMSSBhbmQgQ0kgY2xpZW50cywgb3IgdGhlIE9JREMgdG9rZW4ncyBlbnZpcm9ubWVudCBpbnNpZGUgYSBcIiArXG4gICAgICAnZGVwbG95bWVudCkgbWF0Y2hlcyB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGRlcGxveW1lbnQgaXQgdGFyZ2V0cy4gVGhlICcgK1xuICAgICAgYHJ1biBpdCBjcmVhdGVkIGlzIHN0aWxsIHBlbmRpbmcgaW4gXCIke2NyZWF0b3JFbnZpcm9ubWVudH1cIiBhbmQgd2lsbCBgICtcbiAgICAgICdub3QgcnVuLicsXG4gICAge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBjcmVhdG9yRW52aXJvbm1lbnQsXG4gICAgICBjdXJyZW50RW52aXJvbm1lbnQsXG4gICAgICBwaW5uZWREZXBsb3ltZW50SWQ6IHJ1bklucHV0Py5kZXBsb3ltZW50SWQsXG4gICAgfVxuICApO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBMb2cgd2hlbiBhIGBzdGFydCgpYC1lbnF1ZXVlZCBtZXNzYWdlIHBpbm5lZCB0byBvbmUgZGVwbG95bWVudCBpcyBkZWxpdmVyZWRcbiAqIHRvIGEgZGlmZmVyZW50IG9uZS5cbiAqXG4gKiBBIGZpcnN0LWRlbGl2ZXJ5IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXQuZGVwbG95bWVudElkYCDigJQgdGhlIGRlcGxveW1lbnRcbiAqIGBzdGFydCgpYCBhZGRyZXNzZWQgaXQgdG8g4oCUIHNvIGNvbXBhcmluZyB0aGF0IGFnYWluc3QgdGhpcyBoYW5kbGVyJ3Mgb3duXG4gKiBkZXBsb3ltZW50IGRldGVjdHMgbWlzLWRlbGl2ZXJ5IGRpcmVjdGx5LiBUaGlzIGlzIGEgRElBR05PU1RJQywgbm90IGEgZ2F0ZTpcbiAqIGl0IHdhcm5zIGFuZCBsZXRzIHRoZSBpbnZvY2F0aW9uIHByb2NlZWQsIGRlbGliZXJhdGVseS5cbiAqXG4gKiBXaHkgdGhpcyBvbmUgb25seSB3YXJucyB3aGlsZSBpdHMgZW52aXJvbm1lbnQgc2libGluZyBhYm92ZSByZWZ1c2VzOiBhXG4gKiBkaWZmZXJpbmcgZGVwbG95bWVudCBpZCBpcyBub3QgYnkgaXRzZWxmIGV2aWRlbmNlIG9mIHRoZSBmb3JrIHdlIGNhcmUgYWJvdXQuXG4gKiBUaGUgZW52aXJvbm1lbnQgcGFpciBpcyBleGFjdCDigJQgdHdvIG5hbWVkIGVudmlyb25tZW50cyB0aGF0IGRpc2FncmVlIOKAlCBhbmQgaXRcbiAqIGlzIHRoZSBkaW1lbnNpb24gdGhlIHJ1bidzIHRlbmFudCBpcyBrZXllZCBvbi4gRGVwbG95bWVudCBpZHMgZGlzYWdyZWUgZm9yXG4gKiBiZW5pZ24gcmVhc29ucyB0b286IGB3b3JsZC1sb2NhbGAgZGVyaXZlcyBpdHMgaWQgZnJvbSB0aGUgaW5zdGFsbGVkIHBhY2thZ2VcbiAqIHZlcnNpb24gKGBkcGxfbG9jYWxAPHZlcnNpb24+YCksIHNvIHVwZ3JhZGluZyB0aGUgU0RLIG1pZC1ydW4gY2hhbmdlcyBpdCB3aXRoXG4gKiBub3RoaW5nIHdyb25nLiBSZWZ1c2luZyBvbiB0aGF0IHNpZ25hbCB3b3VsZCBzdHJhbmQgY29ycmVjdCBydW5zLCBhbmRcbiAqIHJlZnVzaW5nIGJlZm9yZSBgcnVuX3N0YXJ0ZWRgIGxlYXZlcyBubyBzZXJ2ZXItc2lkZSByZWNvcmQgdG8gZXhwbGFpbiB3aHkuXG4gKiBBbnlvbmUgdGVtcHRlZCB0byBwcm9tb3RlIHRoaXMgdG8gYSBoYXJkIGZhaWx1cmUgaGFzIHRvIGhhbmRsZSB0aGF0IGZpcnN0LlxuICpcbiAqIFNraXBwZWQgdW5sZXNzIEJPVEggaWRzIGFyZSBrbm93biDigJQgYGdldERlcGxveW1lbnRJZCgpYCB0aHJvd3MgaW4gd29ybGRzIHRoYXRcbiAqIHJlcXVpcmUgYSBkZXBsb3ltZW50IGFuZCBoYXZlIG5vbmUsIGFuZCBhIHJlLWVucXVldWVkIG1lc3NhZ2UgY2FycmllcyBub1xuICogYHJ1bklucHV0YCBhdCBhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhcm5PbkRlcGxveW1lbnRQaW5uaW5nTWlzbWF0Y2goe1xuICB3b3JsZCxcbiAgcnVuSW5wdXQsXG4gIHJ1bklkLFxuICBydW5Mb2dnZXIsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgcnVuSW5wdXQ6IFJ1bklucHV0IHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICBydW5Mb2dnZXI6IExvZ2dlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGlubmVkRGVwbG95bWVudElkID0gcnVuSW5wdXQ/LmRlcGxveW1lbnRJZDtcbiAgaWYgKCFwaW5uZWREZXBsb3ltZW50SWQpIHJldHVybjtcblxuICBsZXQgY3VycmVudERlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gV29ybGRzIHRoYXQgcmVxdWlyZSBhIGRlcGxveW1lbnQgaWQgdGhyb3cgd2hlbiB0aGVyZSBpc24ndCBvbmUuIFRoYXQgaXNcbiAgICAvLyBub3QgYSBtaXNtYXRjaCDigJQgdGhlcmUgaXMgc2ltcGx5IG5vdGhpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWN1cnJlbnREZXBsb3ltZW50SWQgfHwgY3VycmVudERlcGxveW1lbnRJZCA9PT0gcGlubmVkRGVwbG95bWVudElkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcnVuTG9nZ2VyLmVycm9yKFxuICAgICdRdWV1ZSBtZXNzYWdlIHdhcyBkZWxpdmVyZWQgdG8gYSBkZXBsb3ltZW50IGl0IHdhcyBub3QgcGlubmVkIHRvLiAnICtcbiAgICAgICdUaGUgcnVuIHdhcyBjcmVhdGVkIHRhcmdldGluZyBhIGRpZmZlcmVudCBkZXBsb3ltZW50LCBzbyB0aGlzICcgK1xuICAgICAgJ2ludm9jYXRpb24gbWF5IGJlIHJlcGxheWluZyBhZ2FpbnN0IGNvZGUgdGhlIHJ1biB3YXMgbm90IHN0YXJ0ZWQgb24uICcgK1xuICAgICAgJ0NvbnRpbnVpbmcg4oCUIHRoaXMgaXMgZXhwZWN0ZWQgaWYgdGhlIFdvcmtmbG93IFNESyB2ZXJzaW9uIGNoYW5nZWQgJyArXG4gICAgICAnbWlkLXJ1biBpbiBsb2NhbCBkZXZlbG9wbWVudCwgd2hlcmUgdGhlIGRlcGxveW1lbnQgaWQgaXMgZGVyaXZlZCBmcm9tICcgK1xuICAgICAgJ3RoYXQgdmVyc2lvbi4nLFxuICAgIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgcGlubmVkRGVwbG95bWVudElkLFxuICAgICAgY3VycmVudERlcGxveW1lbnRJZCxcbiAgICB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHwgbnVsbCB7XG4gIGlmIChXb3JrZmxvd1J1bnRpbWVFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG5cbiAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHN0ZXAgZXhlY3V0aW9uIHJlamVjdGVkIGJlY2F1c2UgdGhlIHN0ZXAgZW50aXR5IGRvZXMgbm90IGV4aXN0IOKAlFxuICogdGhlIHNpZ25hdHVyZSBvZiBhIHJlc2lsaWVudCBzdGVwIGRpc3BhdGNoIG1lc3NhZ2Ugd2hvc2UgZGVsaXZlcnkgYmVhdCAob3JcbiAqIG91dGxpdmVkIGEgdHJhbnNpZW50IGZhaWx1cmUgb2YpIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsIGBzdGVwX2NyZWF0ZWRgXG4gKiB3cml0ZS4gRXZlcnkgV29ybGQgc3VyZmFjZXMgaXQgYXMgYSBgV29ya2Zsb3dXb3JsZEVycm9yYCBuYW1pbmcgdGhlIG1pc3NpbmdcbiAqIHN0ZXA6IHdvcmxkLXZlcmNlbCBtYXBzIHRoZSBiYWNrZW5kJ3MgNDA0IHRvXG4gKiBgd29ya2Zsb3cgc3RlcCBzdGVwX+KApiBub3QgZm91bmRgLCB3b3JsZC1sb2NhbCBhbmQgd29ybGQtcG9zdGdyZXMgdGhyb3dcbiAqIGBTdGVwIFwic3RlcF/igKZcIiBub3QgZm91bmRgIGRpcmVjdGx5LiBUaGUgbWVzc2FnZSBtYXRjaCBpcyBkZWxpYmVyYXRlbHkgbG9vc2VcbiAqIGFjcm9zcyB0aG9zZSBzaGFwZXM7IHRoZSBzdGF0dXMgY2hlY2sgbmFycm93cyB0aGUgcmVtb3RlIGNhc2Ugd2l0aG91dFxuICogZXhjbHVkaW5nIHRoZSBsb2NhbCBvbmVzICh3aGljaCBjYXJyeSBubyBzdGF0dXMpLlxuICpcbiAqIFVzZWQgb25seSB3aGVuIHRoZSBtZXNzYWdlIGNhcnJpZXMgYHN0ZXBJbnB1dGAg4oCUIGEgYmFyZSBkaXNwYXRjaCB3aXRob3V0IGFcbiAqIHBheWxvYWQgaGFzIG5vdGhpbmcgdG8gcmVjb3ZlciBmcm9tLCBhbmQgdGhlIGVycm9yIGtlZXBzIHByb3BhZ2F0aW5nIGZvclxuICogcXVldWUtZHJpdmVuIHJlY292ZXJ5IGV4YWN0bHkgYXMgYmVmb3JlLlxuICovXG5mdW5jdGlvbiBpc1N0ZXBNaXNzaW5nRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikpIHJldHVybiBmYWxzZTtcbiAgaWYgKGVyci5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBlcnIuc3RhdHVzICE9PSA0MDQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9zdGVwL2kudGVzdChlcnIubWVzc2FnZSkgJiYgL25vdCBmb3VuZC9pLnRlc3QoZXJyLm1lc3NhZ2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWNvcmRGYXRhbFJ1bkVycm9yKHtcbiAgd29ybGQsXG4gIHdvcmtmbG93UnVuLFxuICBydW5JZCxcbiAgcmVxdWVzdElkLFxuICBlcnIsXG4gIGVycm9yQ29kZSxcbiAgbG9nTWVzc2FnZSxcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4gfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlcnI6IHVua25vd247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICBsb2dNZXNzYWdlOiBzdHJpbmc7XG59KSB7XG4gIHJ1bnRpbWVMb2dnZXIuZXJyb3IobG9nTWVzc2FnZSwge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGVycm9yQ29kZSxcbiAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICB9KTtcblxuICB0cnkge1xuICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW4gPz8gcnVuSWQpO1xuICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICBydW5JZCxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCksXG4gICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICApLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7IHJlcXVlc3RJZCB9XG4gICAgKTtcbiAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICBlcnJvcjogZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yID8gZmFpbEVyci5tZXNzYWdlIDogU3RyaW5nKGZhaWxFcnIpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBmYWlsRXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudHM6IEV2ZW50W10sIHJ1bklkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gVGVybWluYWwgcnVuIGV2ZW50cyBhcmUgYWx3YXlzIGxhc3QgYnkgY29uc3RydWN0aW9uIChubyBldmVudCBjcmVhdGlvblxuICAvLyBzdWNjZWVkcyBhZ2FpbnN0IGEgdGVybWluYWwgcnVuKSwgYnV0IHNjYW4gdGhlIGZ1bGwgYXJyYXkgZm9yXG4gIC8vIGRlZmVuc2UtaW4tZGVwdGg6IGEgV29ybGQvYmFja2VuZCBvcmRlcmluZyBidWcgc2hvdWxkbid0IG1ha2UgdXMgbWlzcyBhblxuICAvLyBhY3R1YWwgdGVybWluYXRpb24gc2lnbmFsLlxuICBjb25zdCB0ZXJtaW5hbFJ1bkV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGUpID0+XG4gICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgKGUuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICApO1xuXG4gIGlmICghdGVybWluYWxSdW5FdmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1J1biByZWFjaGVkIHRlcm1pbmFsIGV2ZW50LCBleGl0aW5nJywge1xuICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgIGV2ZW50VHlwZTogdGVybWluYWxSdW5FdmVudC5ldmVudFR5cGUsXG4gICAgZXZlbnRJZDogdGVybWluYWxSdW5FdmVudC5ldmVudElkLFxuICB9KTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBIb3cgbWFueSBvZiBgaWRzYCBhcmUgYWJzZW50IGZyb20gYHByZXNlbnRgLiAqL1xuZnVuY3Rpb24gY291bnRNaXNzaW5nSWRzKGlkczogSXRlcmFibGU8c3RyaW5nPiwgcHJlc2VudDogU2V0PHN0cmluZz4pOiBudW1iZXIge1xuICBsZXQgbWlzc2luZyA9IDA7XG4gIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgaWYgKCFwcmVzZW50LmhhcyhpZCkpIG1pc3NpbmcrKztcbiAgfVxuICByZXR1cm4gbWlzc2luZztcbn1cblxuLyoqXG4gKiBUaGUgbGluZWFnZSByb290IG9mIGEgbG9hZGVkIHJ1bjogaXRzIGAkcm9vdFJ1bklkYCBhdHRyaWJ1dGUsIG9yIGl0cyBvd24gaWRcbiAqIHdoZW4gaXQgaXMgaXRzZWxmIGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gcm9vdFJ1bklkRnJvbShcbiAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgcnVuSWQ6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGF0dHJpYnV0ZXM/LltST09UX1JVTl9JRF9BVFRSSUJVVEVdID8/IHJ1bklkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJ1biBoYXMgYSBob29rIGFuZC9vciB3YWl0IHRoYXQgYW4gb3V0LW9mLWJhbmQgd3JpdGVyIGNvdWxkXG4gKiBhcHBlbmQgYW4gZXZlbnQgZm9yIGJldHdlZW4gYW4gaW5saW5lIHN0ZXAncyBgc3RlcF9jb21wbGV0ZWRgIHdyaXRlIGFuZFxuICogdGhlIG5leHQgcmVwbGF5IOKAlCBuYW1lbHkgYW4gb3BlbiBob29rIChhIGBob29rX2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGBob29rX2Rpc3Bvc2VkYCwgd2hpY2ggYSB3ZWJob29rIHJlY2VpdmVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGBob29rX3JlY2VpdmVkYCkgb3IgYW4gb3BlbiB3YWl0IChhIGB3YWl0X2NyZWF0ZWRgIG5vdCB5ZXRcbiAqIGB3YWl0X2NvbXBsZXRlZGAsIHdoaWNoIHRoZSB3YWl0IHRpbWVyIGNhbiByZXNvbHZlIHdpdGhcbiAqIGB3YWl0X2NvbXBsZXRlZGApLlxuICpcbiAqIFRoaXMgZ2F0ZXMgVk0gcmV0ZW50aW9uLCB0aGUgaW5saW5lLWRlbHRhIGZhc3QgcGF0aCwgYW5kIHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0LiBBIHRlcm1pbmFsLXN0ZXAgZGVsdGEgY2FuIG9taXQgYW4gZXZlbnQgYXBwZW5kZWRcbiAqIGNvbmN1cnJlbnRseSBhZnRlciB0aGF0IHdyaXRlLiBXaXRoIG5vIG9wZW4gaG9vayBvciB3YWl0LCBvbmx5IGNhbmNlbGxhdGlvblxuICogY2FuIGRvIHNvLCBhbmQgb2JzZXJ2aW5nIGl0IG9uZSByZXBsYXkgbGF0ZSBpcyBzYWZlIGJlY2F1c2UgdGhlIG5leHQgZW50aXR5XG4gKiB3cml0ZSBpcyByZWplY3RlZC5cbiAqXG4gKiBTdGVwLWJvZHkgYGF0dHJfc2V0YCB3cml0ZXMgYXJlIE5PVCBhIGNvbmNlcm46IHRoZXkgbGFuZCBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgdGVybWluYWwgd3JpdGUgYW5kIGFyZSB0aGVyZWZvcmUgYWxyZWFkeSBpbnNpZGUgdGhlIHJldHVybmVkXG4gKiBkZWx0YS5cbiAqL1xuZnVuY3Rpb24gb3Blbkhvb2tBbmRXYWl0U3RhdGUoZXZlbnRzOiBFdmVudFtdKToge1xuICBvcGVuSG9vazogYm9vbGVhbjtcbiAgb3BlbldhaXQ6IGJvb2xlYW47XG59IHtcbiAgY29uc3QgaG9va3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgd2FpdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnaG9va19jcmVhdGVkJzpcbiAgICAgICAgaG9va3MuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvb2tfZGlzcG9zZWQnOlxuICAgICAgICBob29rcy5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2FpdF9jcmVhdGVkJzpcbiAgICAgICAgd2FpdHMuYWRkKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dhaXRfY29tcGxldGVkJzpcbiAgICAgICAgd2FpdHMuZGVsZXRlKGV2ZW50LmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgb3Blbkhvb2s6IGhvb2tzLnNpemUgPiAwLCBvcGVuV2FpdDogd2FpdHMuc2l6ZSA+IDAgfTtcbn1cblxudHlwZSBSZXBsYXlFdmVudExvZyA9XG4gIHwgeyB0eXBlOiAnbG9hZEFsbCcgfVxuICB8ICh7IHR5cGU6ICdyZWFkeScgfSAmIExvYWRlZEV2ZW50TG9nKVxuICB8ICh7IHR5cGU6ICdsb2FkQWZ0ZXInOyBjdXJzb3I6IHN0cmluZyB9ICYgTG9hZGVkRXZlbnRMb2cpO1xuXG5mdW5jdGlvbiBuZXh0RXZlbnRMb2dMb2FkKGxvZzogTG9hZGVkRXZlbnRMb2cpOiBSZXBsYXlFdmVudExvZyB7XG4gIGlmIChsb2cuY3Vyc29yID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnbG9hZEFmdGVyJyxcbiAgICBldmVudHM6IGxvZy5ldmVudHMsXG4gICAgY3Vyc29yOiBsb2cuY3Vyc29yLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhcHBlbmRFdmVudExvZyhsb2c6IExvYWRlZEV2ZW50TG9nLCBhcHBlbmRlZDogTG9hZGVkRXZlbnRMb2cpOiB2b2lkIHtcbiAgYXBwZW5kVW5pcXVlRXZlbnRzKGxvZy5ldmVudHMsIGFwcGVuZGVkLmV2ZW50cyk7XG4gIGxvZy5jdXJzb3IgPSBhcHBlbmRlZC5jdXJzb3IgPz8gbG9nLmN1cnNvcjtcbn1cblxuLyoqXG4gKiBUaGUgd2hvbGUgcmV0ZW50aW9uIHByZWRpY2F0ZToga2VlcCB0aGUgc2Vzc2lvbiBvbmx5IGZvciBhIHB1cmUgc3RlcFxuICogYm91bmRhcnkgKGV2ZXJ5IHN1c3BlbnNpb24gaXRlbSBpcyBhIHN0ZXAg4oCUIGFueSBvdGhlciBpdGVtIHR5cGUsIHByZXNlbnRcbiAqIG9yIGZ1dHVyZSwgaXMgdW5yZXRhaW5hYmxlIGJ5IGRlZmF1bHQpIHdob3NlIG5ldyBzdGVwIGlucHV0cyBzZXJpYWxpemVkXG4gKiB3aXRob3V0IGV4ZWN1dGluZyB3b3JrZmxvdyBjb2RlLCB3aXRoIG5vIG91dC1vZi1iYW5kIGNvbnRpbnVhdGlvbiBzb3VyY2U6XG4gKiBhdHRyaWJ1dGVzIHJlcXVpcmUgcmVwbGF5OyBob29rcyBhbmQgd2FpdHMgY2FuIHdha2UgYW5vdGhlciBpbnZvY2F0aW9uLlxuICogYFdPUktGTE9XX1JFVEFJTkVEX1ZNPTBgIGRpc2FibGVzIHJldGVudGlvbiBlbnRpcmVseS5cbiAqXG4gKiBUaGUgb3BlbiBob29rL3dhaXQgc2NhbiBpcyBPKGV2ZW50cyksIHNvIGl0IGlzIHRha2VuIHRocm91Z2ggYSBsYXp5IGdldHRlclxuICogYW5kIGNvbnN1bHRlZCBsYXN0LCBhZnRlciBldmVyeSBjaGVhcCBjaGVjayBoYXMgcGFzc2VkLlxuICpcbiAqIElOVkFSSUFOVCB0aGlzIHByZWRpY2F0ZSBsZWFucyBvbjogZXZlcnkgc3VzcGVuc2lvbiBzaWduYWxlciB0aGF0IGRvZXMgTk9UXG4gKiBjYXJyeSB0aGUgc3RlcC1jb25zdW1lciBnZW5lcmF0aW9uIGd1YXJkIChzbGVlcCwgaG9vaywgYXR0cmlidXRlIOKAlCBzZWVcbiAqIGBzdXNwZW5zaW9uR2VuZXJhdGlvbmAgaW4gcHJpdmF0ZS50cykgbXVzdCBiZSB1bnJldGFpbmFibGUgaGVyZSwgZWl0aGVyIHZpYVxuICogYSBub24tc3RlcCBxdWV1ZSBpdGVtIG9yIHRoZSBvcGVuIGhvb2svd2FpdCBzY2FuLiBBIG5ldyBzaWduYWxlciB0aGF0XG4gKiBzYXRpc2ZpZXMgbmVpdGhlciB3b3VsZCBsZXQgYSBzdGFsZSBzaWduYWwgYmUgYWNjZXB0ZWQgYXMgYSBmcmVzaFxuICogc3VzcGVuc2lvbiBvbiBhIHJlc3VtZWQgc2Vzc2lvbi5cbiAqXG4gKiBRdWllc2NlbmNlIGFzc3VtZXMgd29ya2Zsb3cgY29kZSBzdGF5cyBpbnNpZGUgdGhlIHNhbmRib3gncyBkZXRlcm1pbmlzbVxuICogY29udHJhY3QuIEVzY2FwaW5nIHRvIHRoZSBob3N0IHJlYWxtIChlLmcuIHJlY292ZXJpbmcgdGhlIGhvc3QgYEZ1bmN0aW9uYFxuICogY29uc3RydWN0b3IgZnJvbSBhbiBleHBvc2VkIGhvc3QgY2xhc3MgdG8gc2NoZWR1bGUgcmVhbCB0aW1lcnMpIG1ha2VzIGFcbiAqIHdvcmtmbG93IG5vbmRldGVybWluaXN0aWMgdW5kZXIgb3JkaW5hcnkgcmVwbGF5IHRvbywgYW5kIGlzIG5vdCBkZWZlbmRlZFxuICogaGVyZS5cbiAqL1xuZnVuY3Rpb24gY2FuUmV0YWluV29ya2Zsb3dTZXNzaW9uKFxuICBzdXNwZW5zaW9uOiBXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHN0ZXBJbnB1dHNTYWZlOiBib29sZWFuLFxuICBvcGVuSG9va1dhaXQ6IHsgdmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIG9wZW5Ib29rQW5kV2FpdFN0YXRlPiB9XG4pOiBib29sZWFuIHtcbiAgaWYgKFxuICAgICFpc1ZtUmV0ZW50aW9uRW5hYmxlZCgpIHx8XG4gICAgIXN0ZXBJbnB1dHNTYWZlIHx8XG4gICAgc3VzcGVuc2lvbi5zdGVwcy5sZW5ndGggPT09IDAgfHxcbiAgICAhc3VzcGVuc2lvbi5zdGVwcy5ldmVyeSgoaXRlbSkgPT4gaXRlbS50eXBlID09PSAnc3RlcCcpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB7IG9wZW5Ib29rLCBvcGVuV2FpdCB9ID0gb3Blbkhvb2tXYWl0LnZhbHVlO1xuICByZXR1cm4gIW9wZW5Ib29rICYmICFvcGVuV2FpdDtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGlubGluZS1leGVjdXRpb24gZHVyYXRpb24gZm9yIGEgc2luZ2xlIGhhbmRsZXIgaW52b2NhdGlvbi5cbiAqXG4gKiBPcmRlciBvZiBwcmVjZWRlbmNlOlxuICogMS4gYFdPUktGTE9XX1YyX1RJTUVPVVRfTVNgIGVudiB2YXJcbiAqIDIuIFRpZXJlZCBidWRnZXQgZGVyaXZlZCBmcm9tIGB3b3JsZC5nZXRSdW50aW1lRGVhZGxpbmUoKWBcbiAqIDMuIERlZmF1bHQgb2YgMiBtaW51dGVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gIHdvcmxkOiBXb3JsZCxcbiAgaW52b2NhdGlvblN0YXJ0VGltZTogbnVtYmVyXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByYXdFbnZPdmVycmlkZSA9IHByb2Nlc3MuZW52LldPUktGTE9XX1YyX1RJTUVPVVRfTVM7XG4gIGlmIChyYXdFbnZPdmVycmlkZSAhPT0gdW5kZWZpbmVkICYmIHJhd0Vudk92ZXJyaWRlICE9PSAnJykge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXdFbnZPdmVycmlkZSk7XG4gICAgaWYgKE51bWJlci5pc0Zpbml0ZShwYXJzZWQpICYmIHBhcnNlZCA+IDApIHtcbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcnVudGltZURlYWRsaW5lID0gYXdhaXQgd29ybGQuZ2V0UnVudGltZURlYWRsaW5lPy4oKTtcbiAgaWYgKHJ1bnRpbWVEZWFkbGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGVhZGxpbmVNcyA9IHJ1bnRpbWVEZWFkbGluZS5nZXRUaW1lKCk7XG4gICAgaWYgKCFOdW1iZXIuaXNOYU4oZGVhZGxpbmVNcykpIHtcbiAgICAgIGNvbnN0IG1heER1cmF0aW9uTXMgPSBNYXRoLmZsb29yKGRlYWRsaW5lTXMgLSBpbnZvY2F0aW9uU3RhcnRUaW1lKTtcbiAgICAgIGlmIChtYXhEdXJhdGlvbk1zID49IG1zKCcyNW0nKSkge1xuICAgICAgICByZXR1cm4gbXMoJzEwbScpO1xuICAgICAgfVxuXG4gICAgICBpZiAobWF4RHVyYXRpb25NcyA+PSBtcygnMTBtJykpIHtcbiAgICAgICAgcmV0dXJuIG1zKCc1bScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtcygnMm0nKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIHJvdXRlIHdoaWNoIGhhbmRsZXMgd29ya2Zsb3cgZXhlY3V0aW9uIHJlcXVlc3RzLFxuICogZXhlY3V0aW5nIHN0ZXBzIGlubGluZSB3aGVuIHBvc3NpYmxlIHRvIHJlZHVjZSBmdW5jdGlvbiBpbnZvY2F0aW9uc1xuICogYW5kIHF1ZXVlIG92ZXJoZWFkLlxuICpcbiAqIFRoZSBoYW5kbGVyIGxvb3BzOiByZXBsYXkgd29ya2Zsb3cg4oaSIGV4ZWN1dGUgc3RlcCBpbmxpbmUg4oaSIHJlcGxheSDihpIgLi4uXG4gKiB1bnRpbCB0aGUgd29ya2Zsb3cgY29tcGxldGVzLCB0aW1lcyBvdXQsIG9yIGVuY291bnRlcnMgbm9uLXN0ZXAgc3VzcGVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHdvcmtmbG93Q29kZSAtIFRoZSB3b3JrZmxvdyBidW5kbGUgY29kZSBjb250YWluaW5nIGFsbCB3b3JrZmxvdyBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBhIFZlcmNlbCBBUEkgcm91dGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93RW50cnlwb2ludChcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdD86IG51bWJlcjtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgfVxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICBzZXRXb3JrZmxvd0Jhc2VQYXRoKG9wdGlvbnM/LmJhc2VQYXRoKTtcblxuICBjb25zdCBuYW1lc3BhY2UgPSByZXNvbHZlUXVldWVOYW1lc3BhY2Uob3B0aW9ucz8ubmFtZXNwYWNlKTtcbiAgY29uc3Qgd29ya2Zsb3dQcmVmaXggPSBnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIG5hbWVzcGFjZSk7XG5cbiAgY29uc3QgaGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICAgIHdvcmxkSGFuZGxlcnMuY3JlYXRlUXVldWVIYW5kbGVyKFxuICAgICAgd29ya2Zsb3dQcmVmaXgsXG4gICAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIC8vIFQyIG9mIHRoZSBob29rLXJlc3VtZSBUVFIgd2luZG93IChzZWUgcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cyk6XG4gICAgICAgIC8vIHRoZSBpbnN0YW50IHRoaXMgY29uc3VtZXIgYmVnYW4sIGJlZm9yZSBtZXNzYWdlIHBhcnNpbmcuIE9ubHkgdXNlZFxuICAgICAgICAvLyB3aGVuIHRoZSBtZXNzYWdlIHR1cm5zIG91dCB0byBjYXJyeSByZXN1bWUgdGltaW5nOyB0YWtpbmcgaXRcbiAgICAgICAgLy8gdW5jb25kaXRpb25hbGx5IGtlZXBzIGl0IGhvbmVzdCBmb3IgdGhlIGRlbGl2ZXJpZXMgdGhhdCBkby5cbiAgICAgICAgY29uc3QgaGFuZGxlckVudGVyZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlXG4gICAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAgIC8vIFRoZSBzdHJlYW0gbmFtZSBpbmNsdWRlcyBhIHVuaXF1ZSBjb3JyZWxhdGlvbklkIHRoYXQgbXVzdCBiZSBrbm93biBieSB0aGUgY2FsbGVyLlxuICAgICAgICBjb25zdCBoZWFsdGhDaGVjayA9IHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKG1lc3NhZ2VfKTtcbiAgICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgICAgYXdhaXQgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICAgICAgICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICAgICAgICB3b3JsZEhhbmRsZXJzLnNwZWNWZXJzaW9uXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgdHJhY2VDYXJyaWVyOiBpbmNvbWluZ1RyYWNlQ2FycmllcixcbiAgICAgICAgICByZXF1ZXN0ZWRBdCxcbiAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2UsXG4gICAgICAgICAgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9ucyxcbiAgICAgICAgICBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50LFxuICAgICAgICAgIHJ1bklucHV0LFxuICAgICAgICAgIGhvb2tJbnB1dCxcbiAgICAgICAgICBzdGVwSW5wdXQsXG4gICAgICAgICAgaG9va1Jlc3VtZVRpbWluZyxcbiAgICAgICAgfSA9IFdvcmtmbG93SW52b2tlUGF5bG9hZFNjaGVtYS5wYXJzZShtZXNzYWdlXyk7XG5cbiAgICAgICAgLy8gLS0tIEhvb2stcmVzdW1lIFRUUiB0ZWxlbWV0cnkgKHJ1bnRpbWUvcmVzdW1lLWxhdGVuY3kudHMpIC0tLVxuICAgICAgICAvLyBUaHJlYWRlZCB0aHJvdWdoIHRoaXMgaW52b2NhdGlvbiBhbmQgQ09OU1VNRUQgYnkgdGhlIGZpcnN0IGR1cmFibGVcbiAgICAgICAgLy8gc3RlcCB0aGF0IGZvbGxvd3MgdGhlIHJlc3VtcHRpb24g4oCUIGNsZWFyZWQgYXQgdGhhdCBwb2ludCBzbyBhIGxhdGVyXG4gICAgICAgIC8vIHN0ZXAsIGEgcmV0cnksIG9yIGEgcmVkZWxpdmVyeSBuZXZlciByZS1yZXBvcnRzIHRoZSBzYW1lIHJlc3VtZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVHdvIGRlbGl2ZXJ5IHNoYXBlcyBjYXJyeSB0aW1pbmc6XG4gICAgICAgIC8vICAtIHRoZSByZXN1bWUncyBvd24gaW52b2NhdGlvbiAobm8gYHN0ZXBJZGApOiB0aGUgcHJvZHVjZXIncyBUMC9UMVxuICAgICAgICAvLyAgICByaWRlIHRoZSBtZXNzYWdlIGFuZCB0aGlzIGhhbmRsZXIncyBlbnRyeSBpcyBUMi5cbiAgICAgICAgLy8gIC0gYSBzdGVwIHRoaXMgaW52b2NhdGlvbiBoYW5kZWQgdG8gYW5vdGhlciBpbnZvY2F0aW9uIChgc3RlcElkYFxuICAgICAgICAvLyAgICBwcmVzZW50KTogdGhlIHJlc3VtaW5nIGludm9jYXRpb24gYWxyZWFkeSBzdGFtcGVkIFQyLi5UNCBvbnRvXG4gICAgICAgIC8vICAgIHRoZSBtZXNzYWdlLCBzbyB0aGV5IGFyZSByZWFkIGJhY2sgdmVyYmF0aW0uXG4gICAgICAgIGxldCByZXN1bWVUcmFja2luZyA9IHJlc3VtZVRyYWNraW5nRnJvbU1lc3NhZ2UoXG4gICAgICAgICAgaG9va1Jlc3VtZVRpbWluZyxcbiAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCAhPT0gdW5kZWZpbmVkID8gJ2Rpc3BhdGNoZWQnIDogJ2lubGluZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nICYmIGluY29taW5nU3RlcElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bWVUcmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zID0gaGFuZGxlckVudGVyZWRBdE1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXN1bWVUcmFja2luZyAmJlxuICAgICAgICAgICFOdW1iZXIuaXNGaW5pdGUocmVzdW1lVHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQSBzdGVwIG1lc3NhZ2UgZnJvbSBhIHByb2R1Y2VyIHRoYXQgZm9yd2FyZGVkIHRpbWluZyB3aXRob3V0IHRoZVxuICAgICAgICAgIC8vIGNvbnN1bWVyIGJvdW5kYXJpZXMuIE5vdGhpbmcgYWRkaXRpdmUgY2FuIGJlIHJlcG9ydGVkLlxuICAgICAgICAgIHJlc3VtZVRyYWNraW5nID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBzdGFydCgpYCBhbHdheXMgYXR0YWNoZXMgYSB0cmFjZSBjYXJyaWVyLCBidXRcbiAgICAgICAgLy8gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCkgcmV0dXJucyBge31gIHdoZW4gbm8gT1RFTCBTREsgaXMgcmVnaXN0ZXJlZFxuICAgICAgICAvLyBvciBubyBzcGFuIGlzIGFjdGl2ZSDigJQgdHJlYXQgYW4gZW1wdHkgY2FycmllciB0aGUgc2FtZSBhcyBhblxuICAgICAgICAvLyBhYnNlbnQgb25lIHNvIGxpbmtlZCBtb2RlIGZhbGxzIGJhY2sgdG8gYSBmcmVzaCBvcmlnaW4gaW5zdGVhZCBvZlxuICAgICAgICAvLyBmb3J3YXJkaW5nIGEgdXNlbGVzcyBge31gIGZvcmV2ZXIuXG4gICAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IGlzVXNhYmxlVHJhY2VDYXJyaWVyKGluY29taW5nVHJhY2VDYXJyaWVyKVxuICAgICAgICAgID8gaW5jb21pbmdUcmFjZUNhcnJpZXJcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhO1xuICAgICAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2Uod29ya2Zsb3dQcmVmaXgubGVuZ3RoKTtcblxuICAgICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgICAvLyBFbmZvcmNlIG1heCBkZWxpdmVyeSBsaW1pdCBiZWZvcmUgYW55IGluZnJhc3RydWN0dXJlIGNhbGxzLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJ1bmF3YXkgd29ya2Zsb3dzIGZyb20gY29uc3VtaW5nIGluZmluaXRlIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gICAgICAgIC8vIFNjb3BlZCBsb2dnZXIgZm9yIHRoaXMgcnVuIOKAlCBhdHRhY2hlcyBydW5JZC93b3JrZmxvd05hbWUgdG8gZXZlcnlcbiAgICAgICAgLy8gbG9nIGxpbmUgYW5kIGNoaWxkIGxvZ2dlcnMgYmVsb3csIHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgICBjb25zdCBydW5Mb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihydW5JZCwgd29ya2Zsb3dOYW1lKTtcblxuICAgICAgICBjb25zdCBtYXhRdWV1ZURlbGl2ZXJpZXMgPSBnZXRNYXhRdWV1ZURlbGl2ZXJpZXMoKTtcbiAgICAgICAgaWYgKG1ldGFkYXRhLmF0dGVtcHQgPiBtYXhRdWV1ZURlbGl2ZXJpZXMpIHtcbiAgICAgICAgICBjb25zdCBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24gPSBkZXNjcmliZUVycm9yKFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgV29ya2Zsb3cgaGFuZGxlciBleGNlZWRlZCBtYXggZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke21heFF1ZXVlRGVsaXZlcmllc30pYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgZXJyb3JDb2RlOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uZXJyb3JDb2RlLFxuICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBtYXhEZWxpdmVyaWVzRGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCBydW5JZCk7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgICAgYFdvcmtmbG93IGV4Y2VlZGVkIG1heGltdW0gcXVldWUgZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke21heFF1ZXVlRGVsaXZlcmllc30pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fCBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAvLyBSdW4gYWxyZWFkeSBmaW5pc2hlZCwgY29uc3VtZSB0aGUgbWVzc2FnZSBzaWxlbnRseVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gbWFyayBydW4gYXMgZmFpbGVkIGFmdGVyICR7bWV0YWRhdGEuYXR0ZW1wdH0gZGVsaXZlcnkgYXR0ZW1wdHMuIGAgK1xuICAgICAgICAgICAgICAgIGBBIHBlcnNpc3RlbnQgZXJyb3IgaXMgcHJldmVudGluZyB0aGUgcnVuIGZyb20gYmVpbmcgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoZSBydW4gd2lsbCByZW1haW4gaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgbWFudWFsbHkgcmVzb2x2ZWQuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byBhIHBlcnNpc3RlbnQgb3V0YWdlIG9mIHRoZSB3b3JrZmxvdyBiYWNrZW5kIGAgK1xuICAgICAgICAgICAgICAgIGBvciBhIGJ1ZyBpbiB0aGUgd29ya2Zsb3cgcnVudGltZSBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBXb3JrZmxvdyB0ZWFtLmAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgIGVycm9yU3RhY2s6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gVHJhY2UgY29ycmVsYXRpb24gbW9kZSAtLS1cbiAgICAgICAgLy8gJ2xpbmtlZCcgKGRlZmF1bHQpOiB0aGUgd29ya2Zsb3cuZXhlY3V0ZSBzcGFuIGJlbG93IHN0YXlzIGEgQ0hJTERcbiAgICAgICAgLy8gb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKSBjb250ZXh0LCBzbyBvbmUgaW52b2NhdGlvbiDigJRcbiAgICAgICAgLy8gcm91dGUgaGFuZGxlciwgd29ya2Zsb3cgcmVwbGF5LCBpbmxpbmUgc3RlcHMsIGV2ZW50IHdyaXRlcyDigJQgaXMgYVxuICAgICAgICAvLyBzaW5nbGUgYm91bmRlZCB0cmFjZS4gVGhlIHJ1bi1vcmlnaW4gY29udGV4dCB0cmF2ZWxzIGFzIGEgc3BhblxuICAgICAgICAvLyBMSU5LIChub3QgYSBwYXJlbnQpLCBhbmQgcmUtZW5xdWV1ZXMgZm9yd2FyZCB0aGUgb3JpZ2luYWwgY2FycmllclxuICAgICAgICAvLyB1bmNoYW5nZWQsIHNvIGEgKHBvdGVudGlhbGx5IGhvdXJzLWxvbmcpIHJ1biBpcyBuZXZlciBzdGl0Y2hlZFxuICAgICAgICAvLyBpbnRvIG9uZSBnaWFudCB0cmFjZSBhY3Jvc3MgaW52b2NhdGlvbnMuXG4gICAgICAgIC8vICdjb250aW51b3VzJzogbGVnYWN5IGJlaGF2aW9yIOKAlCB0aGUgcmVzdG9yZWQgcnVuLW9yaWdpbiBjb250ZXh0XG4gICAgICAgIC8vIGJlY29tZXMgdGhlIHBhcmVudCBvZiB0aGlzIGludm9jYXRpb24ncyBzcGFucy5cbiAgICAgICAgY29uc3QgdHJhY2VNb2RlID0gZ2V0V29ya2Zsb3dUcmFjZU1vZGUoKTtcblxuICAgICAgICAvLyBUcmFjZSBjYXJyaWVyIHRvIGF0dGFjaCB0byBtZXNzYWdlcyB0aGlzIGludm9jYXRpb24gZW5xdWV1ZXMg4oCUXG4gICAgICAgIC8vIHNlZSBnZXROZXh0VHJhY2VDYXJyaWVyIGZvciB0aGUgbGlua2VkL2NvbnRpbnVvdXMgc2VtYW50aWNzLlxuICAgICAgICBjb25zdCBuZXh0VHJhY2VDYXJyaWVyID0gKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT5cbiAgICAgICAgICBnZXROZXh0VHJhY2VDYXJyaWVyKHRyYWNlTW9kZSwgdHJhY2VDb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFuIGxpbmtzIHRvIHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0IGFuZCAoaW4gbGlua2VkIG1vZGUpXG4gICAgICAgIC8vIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbSB0aGUgdHJhY2UgY2Fycmllci5cbiAgICAgICAgY29uc3Qgc3BhbkxpbmtzID0gYXdhaXQgYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzKFxuICAgICAgICAgIHRyYWNlTW9kZSxcbiAgICAgICAgICB0cmFjZUNvbnRleHRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBUaGUgcmVwbGF5IGJ1ZGdldCBjb3ZlcnMgb3JjaGVzdHJhdGlvbiB3b3JrIGJldHdlZW4gc3RlcHMsIG5vdCBpbmxpbmVcbiAgICAgICAgLy8gc3RlcCBib2RpZXMuIEl0IGlzIGNoZWNrZWQgYmV0d2VlbiBsb29wIGl0ZXJhdGlvbnM7IHN0ZXAgYm9kaWVzIHVzZVxuICAgICAgICAvLyB0aGUgcGxhdGZvcm0gdGltZW91dCBhbmQgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NUyBndWFyZCBpbnN0ZWFkLlxuICAgICAgICBjb25zdCByZXBsYXlCdWRnZXQgPSBuZXcgUmVwbGF5QnVkZ2V0KCk7XG5cbiAgICAgICAgLy8gSW4gbGlua2VkIG1vZGUgdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBpcyBOT1QgcmVzdG9yZWQgYXMgdGhlXG4gICAgICAgIC8vIGFjdGl2ZSAocGFyZW50KSBjb250ZXh0IOKAlCBwYXNzaW5nIGB1bmRlZmluZWRgIG1ha2VzXG4gICAgICAgIC8vIHdpdGhUcmFjZUNvbnRleHQgYSBwYXNzdGhyb3VnaCwgc28gdGhlIHdvcmtmbG93LmV4ZWN1dGUgc3BhbiBiZWxvd1xuICAgICAgICAvLyBzdGF5cyBhIGNoaWxkIG9mIHRoZSBsb2NhbCBkZWxpdmVyeSAoZmxvdy1yb3V0ZSkgY29udGV4dCBhbmQgdGhlXG4gICAgICAgIC8vIHJ1bi1vcmlnaW4gdHJhdmVscyBhcyBhIHNwYW4gbGluayBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBwYXJlbnRUcmFjZUNhcnJpZXIgPVxuICAgICAgICAgIHRyYWNlTW9kZSA9PT0gJ2NvbnRpbnVvdXMnID8gdHJhY2VDb250ZXh0IDogdW5kZWZpbmVkO1xuICAgICAgICAvLyBRdWV1ZS1kZWxpdmVyZWQgaW52b2NhdGlvbjogQ09OU1VNRVIga2luZCwgbWF0Y2hpbmcgdGhlXG4gICAgICAgIC8vIHF1ZXVlLWRlbGl2ZXJlZCBzdGVwLmV4ZWN1dGUgc3Bhbi5cbiAgICAgICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnQ09OU1VNRVInKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUcmFjZUNvbnRleHQocGFyZW50VHJhY2VDYXJyaWVyLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHdpdGhXb3JrZmxvd0JhZ2dhZ2UoXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCB3b3JrZmxvd05hbWUgfSxcbiAgICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuZ2V0X3dvcmxkJywgYXN5bmMgKCkgPT5cbiAgICAgICAgICAgICAgICBnZXRXb3JsZCgpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIC8vIEJvdGggY2hlY2tzIGJlbG93IGxvb2sgYXQgYHJ1bklucHV0YCwgc28gYm90aCBhcmUgbm8tb3BzIG9uIGFcbiAgICAgICAgICAgICAgLy8gcmUtZW5xdWV1ZWQgbWVzc2FnZSAod2hpY2ggY2FycmllcyBub25lKSDigJQgdGhleSBvbmx5IGV2ZXIgcnVuIG9uXG4gICAgICAgICAgICAgIC8vIGEgZmlyc3QgZGVsaXZlcnksIHRoZSBvbmUgdGhhdCBjb3VsZCBjcmVhdGUgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gUmV0dXJuaW5nIGFja3MgdGhlIG1lc3NhZ2UuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIG1pc21hdGNoIGlzXG4gICAgICAgICAgICAgIC8vIGJha2VkIGludG8gdGhpcyBtZXNzYWdlLCBzbyBldmVyeSByZWRlbGl2ZXJ5IHdvdWxkIHJlYWNoIHRoZVxuICAgICAgICAgICAgICAvLyBzYW1lIHZlcmRpY3QsIGFuZCB0aHJvd2luZyB3b3VsZCBqdXN0IGhvdC1sb29wIHRoZSBoYW5kbGVyIHVudGlsXG4gICAgICAgICAgICAgIC8vIE1BWF9RVUVVRV9ERUxJVkVSSUVTIHdpdGggdGhlIHNhbWUgZXJyb3IgZWFjaCB0aW1lLiBJdCBtYXRjaGVzXG4gICAgICAgICAgICAgIC8vIGhvdyB0aGUgcnVuX3N0YXJ0ZWQgcGF0aCBhbHJlYWR5IGRpc2NhcmRzIGRlbGl2ZXJpZXMgd2hvc2VcbiAgICAgICAgICAgICAgLy8gdmVyZGljdCBjYW5ub3QgY2hhbmdlIChFbnRpdHlDb25mbGljdEVycm9yLCBSdW5FeHBpcmVkRXJyb3IpLlxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcmVmdXNlQ3Jvc3NFbnZpcm9ubWVudERlbGl2ZXJ5KHtcbiAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlcixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpYyBvbmx5IOKAlCBzZWUgdGhlIGhlbHBlciBmb3Igd2h5IHRoaXMgd2FybnMgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAvLyByZWZ1c2luZyB0aGUgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgYXdhaXQgd2Fybk9uRGVwbG95bWVudFBpbm5pbmdNaXNtYXRjaCh7XG4gICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgcnVuTG9nZ2VyLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlKFxuICAgICAgICAgICAgICAgIGB3b3JrZmxvdy5leGVjdXRlICR7d29ya2Zsb3dEaXNwbGF5TmFtZSh3b3JrZmxvd05hbWUpfWAsXG4gICAgICAgICAgICAgICAgeyBraW5kOiBzcGFuS2luZCwgbGlua3M6IHNwYW5MaW5rcyB9LFxuICAgICAgICAgICAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ2V4ZWN1dGVfdjInKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VQcm9wYWdhdGVkKCEhdHJhY2VDb250ZXh0KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93VHJhY2VNb2RlKHRyYWNlTW9kZSksXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgaW52b2NhdGlvblN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBub0lubGluZVJlcGxheUFmdGVyTXMgPSBhd2FpdCBnZXRNYXhJbmxpbmVEdXJhdGlvbk1zKFxuICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0VGltZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGxldCBsb29wSXRlcmF0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIgPSByZXBsYXlEaXZlcmdlbmNlXG4gICAgICAgICAgICAgICAgICAgID8gbmV3IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIocmVwbGF5RGl2ZXJnZW5jZS5jb3VudClcbiAgICAgICAgICAgICAgICAgICAgOiBSZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmluZXJ0KCk7XG4gICAgICAgICAgICAgICAgICAvLyBFdmVyeSB3cml0ZSB0aGlzIGxvb3AgbWFrZXMgY2FycmllcyB0aGUgY3Vyc29yIG9mIHRoZSBsb2dcbiAgICAgICAgICAgICAgICAgIC8vIGl0IHdhcyBjb21wdXRlZCBhZ2FpbnN0LCBhbmQgZm9sZHMgYSBjb21wbGV0ZSByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgLy8gZGVsdGEgaW50byB0aGF0IGxvZy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUV2ZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBDcmVhdGVFdmVudFJlcXVlc3Q+KFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBULFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM/OiBDcmVhdGVFdmVudFBhcmFtc1xuICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbmNlQ3Vyc29yID0gZGVsdGFSZXF1ZXN0Q3Vyc29yKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpdGhTbmFwc2hvdCA9IHsgLi4uc2xvdFNuYXBzaG90KCksIC4uLnBhcmFtcyB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLndpdGhFdmVudENyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICBzaW5jZUN1cnNvciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHdpdGhTbmFwc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLndpdGhTbmFwc2hvdCwgc2luY2VDdXJzb3IgfSxcbiAgICAgICAgICAgICAgICAgICAgICAocCkgPT4gd29ybGQuZXZlbnRzLmNyZWF0ZShydW5JZCwgZGF0YSwgcClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhYnNvcmJDcmVhdGVEZWx0YShzaW5jZUN1cnNvciwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgc2xvdCBzbmFwc2hvdCBmb3IgYSB3cml0ZSBpc3N1ZWQgZnJvbSB0aGlzIGxvb3A6IGhvd1xuICAgICAgICAgICAgICAgICAgICogbXVjaCBvZiB0aGUgcnVuJ3MgbG9nIHRoZSBkZWNpc2lvbiBiZWhpbmQgaXQgd2FzIG1hZGVcbiAgICAgICAgICAgICAgICAgICAqIGFnYWluc3QuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogRXZlcnkgd3JpdGUgZ29lcyB0aHJvdWdoIGhlcmUsIGluY2x1ZGluZyB0aGUgb25lcyB0aGF0IGFza1xuICAgICAgICAgICAgICAgICAgICogZm9yIGFuIGlubGluZSBkZWx0YS4gVGhlIHR3byBhbnN3ZXIgZGlmZmVyZW50IHF1ZXN0aW9ucyBhbmRcbiAgICAgICAgICAgICAgICAgICAqIGEgV29ybGQgaXMgZnJlZSB0byBzZXJ2ZSBib3RoOiB0aGUgY3Vyc29yIHNheXMgd2hlcmUgdG9cbiAgICAgICAgICAgICAgICAgICAqIHN0YXJ0IGxpc3RpbmcgZnJvbSwgdGhlIHNsb3Qgc2F5cyB3aGljaCBldmVudHMgdGhpcyB3cml0ZXJcbiAgICAgICAgICAgICAgICAgICAqIGhhZCBhbHJlYWR5IGRlY2lkZWQgd2l0aG91dC4gV29ybGRzIHRoYXQgdHJlYXQgdGhlIGRlbHRhIGFzXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgYmV0dGVyIGFuc3dlciBzaW1wbHkgaWdub3JlIHRoZSBzbG90LlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRha2VuIGZyb20gd2hhdGV2ZXIgaXMgbG9hZGVkLCBpbmNsdWRpbmcgdGhlIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgKiBgbG9hZEFmdGVyYCBzdGF0ZS4gVW5kZXJzdGF0aW5nIGlzIHNhZmU6IHRoZSBXb3JsZCByZXBvcnRzXG4gICAgICAgICAgICAgICAgICAgKiBiYWNrIGEgd2lkZXIgc3BhbiB0aGFuIHN0cmljdGx5IG5lZWRlZCwgYW5kXG4gICAgICAgICAgICAgICAgICAgKiBgbWVyZ2VSZXBvcnRlZEV2ZW50c2AgZHJvcHMgd2hhdCB0aGUgbG9nIGFscmVhZHkgaG9sZHMuXG4gICAgICAgICAgICAgICAgICAgKiBPdmVyc3RhdGluZyBpcyBub3QsIHNvIHRoZXJlIGlzIG5vIGd1ZXNzaW5nIHdoZW4gbm90aGluZyBpc1xuICAgICAgICAgICAgICAgICAgICogbG9hZGVkIGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2xvdFNuYXBzaG90ID0gKCk6IFNsb3RTbmFwc2hvdFBhcmFtcyA9PlxuICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAnbG9hZEFsbCdcbiAgICAgICAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgICAgICAgOiBzbG90U25hcHNob3RQYXJhbXMoZXZlbnRMb2cuZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgY3Vyc29yIHRvIGFzayBmb3IgYW4gaW5saW5lIGRlbHRhIGFnYWluc3QsIG9yXG4gICAgICAgICAgICAgICAgICAgKiB1bmRlZmluZWQgdG8gbm90IGFzay5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUdXJibyBpcyBleGNsdWRlZCBvbiBwdXJwb3NlOiBpdCBleGlzdHMgdG8gbWFrZSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAqIGludm9jYXRpb24ncyB3cml0ZXMgYXMgY2hlYXAgYXMgcG9zc2libGUsIGFuZCBpdCBoYXMgbm9cbiAgICAgICAgICAgICAgICAgICAqIGxvYWRlZCBsb2cgdG8gZXh0ZW5kLiBSdW4tdGVybWluYWwgd3JpdGVzIGFyZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICogYmVjYXVzZSBub3RoaW5nIHJlYWRzIHRoZSBsb2cgYWZ0ZXJ3YXJkcywgc28gdGhlIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgKiB3b3VsZCBiZSB3b3JrIHRoZSBXb3JsZCBkb2VzIGZvciBubyBvbmUuIEEgY2FsbGVyIHRoYXRcbiAgICAgICAgICAgICAgICAgICAqIHNldCBpdHMgb3duIGBzaW5jZUN1cnNvcmAgKG9yIGFza2VkIGZvciB0aGUgYHJ1bl9zdGFydGVkYFxuICAgICAgICAgICAgICAgICAgICogLyBgaG9va19yZWNlaXZlZGAgcHJlbG9hZCwgd2hpY2ggb3ducyB0aGUgc2FtZSByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICogZmllbGRzKSBrZWVwcyB3aGF0IGl0IGFza2VkIGZvci5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGFSZXF1ZXN0Q3Vyc29yID0gKFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtczogQ3JlYXRlRXZlbnRQYXJhbXMgfCB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICB0dXJibyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdyZWFkeScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM/LnNpbmNlQ3Vyc29yICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM/LnByZWxvYWRFdmVudHMgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBpc1Rlcm1pbmFsUnVuRXZlbnRUeXBlKGRhdGEuZXZlbnRUeXBlKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudExvZy5jdXJzb3IgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBGb2xkIGFuIGlubGluZSBkZWx0YSByZXR1cm5lZCBieSBgZXZlbnRzLmNyZWF0ZWAgaW50byB0aGVcbiAgICAgICAgICAgICAgICAgICAqIGluLW1lbW9yeSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGRlbHRhIGlzIHdoYXQgYGV2ZW50cy5saXN0KHsgY3Vyc29yOiBzZW50Q3Vyc29yIH0pYFxuICAgICAgICAgICAgICAgICAgICogd291bGQgaGF2ZSByZXR1cm5lZCByaWdodCBhZnRlciB0aGUgd3JpdGUsIHNvIGl0IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAqIGJhY2sgYm90aCBvdXIgb3duIGV2ZW50IGFuZCBhbnl0aGluZyBhbm90aGVyIHdyaXRlclxuICAgICAgICAgICAgICAgICAgICogYXBwZW5kZWQgaW4gYmFuZC4gQWJzb3JiaW5nIGl0IGhlcmUgbWVhbnMgdGhlIG5leHQgcmVhZGVyXG4gICAgICAgICAgICAgICAgICAgKiBhbHJlYWR5IGhhcyB0aGUgbG9nIGFuZCB0aGUgbG9vcCdzIGluY3JlbWVudGFsXG4gICAgICAgICAgICAgICAgICAgKiBgZXZlbnRzLmxpc3RgIGZpbmRzIG5vdGhpbmcgbGVmdCB0byBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBEZWxpYmVyYXRlbHkgbm90IGBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydGAsIGV2ZW4gdGhvdWdoIHRoZVxuICAgICAgICAgICAgICAgICAgICogYGhhc01vcmVgIGhhbGYgb2YgdGhlIHR3byBwb2xpY2llcyBjb2luY2lkZXMuIEEgZGVsdGFcbiAgICAgICAgICAgICAgICAgICAqIGV4dGVuZHMgdGhlIHRhaWwgYW5kIGNhcnJpZXMgYSBjdXJzb3IgdGhhdCBoYXMgdG8gbW92ZSB3aXRoXG4gICAgICAgICAgICAgICAgICAgKiBpdCwgc28gaXQgYXBwZW5kcyB3aXRob3V0IHJlLXNvcnRpbmcgYW5kIG5lZWRzIHRoZSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAqIGd1YXJkIGJlbG93OyBhIHNraXBwZWQtc2xvdCByZXBvcnQgaXMgYSB3aW5kb3cgc3RyaWN0bHlcbiAgICAgICAgICAgICAgICAgICAqIGJlbG93IHRoZSB3cml0ZSwgY2FycmllcyBubyBjdXJzb3IsIGFuZCBoYXMgdG8gYmUgc29ydGVkXG4gICAgICAgICAgICAgICAgICAgKiBiYWNrIGludG8gcGxhY2UuIFNoYXJpbmcgYW4gaW1wbGVtZW50YXRpb24gd291bGQgbWVhbiBvbmVcbiAgICAgICAgICAgICAgICAgICAqIG9mIHRoZW0gZG9pbmcgdGhlIG90aGVyJ3Mgd29yay5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBEZWNsaW5pbmcgaXMgYWx3YXlzIHNhZmUg4oCUIGFuIHVuYWJzb3JiZWQgZGVsdGEgaXMgYSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICogdGhlIG5leHQgYGV2ZW50cy5saXN0YCByZXR1cm5zIOKAlCBzbyB0aGUgZ3VhcmRzIGFyZSBmcmVlIHRvXG4gICAgICAgICAgICAgICAgICAgKiBiZSBzdHJpY3Q6XG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogLSBgaGFzTW9yZWAgbWVhbnMgdGhlIFdvcmxkIHRydW5jYXRlZCB0aGUgcGFnZS4gVGFraW5nIGl0XG4gICAgICAgICAgICAgICAgICAgKiAgIHdoaWxlIGFkdmFuY2luZyB0aGUgY3Vyc29yIHRvIHRoZSBwYWdlIGVuZCB3b3VsZCBiZVxuICAgICAgICAgICAgICAgICAgICogICBmaW5lLCBidXQgdGFraW5nIGl0IGFuZCBOT1QgYWR2YW5jaW5nIHdvdWxkIGR1cGxpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAqICAgYW5kIHRoZSB0cnVuY2F0ZWQgY2FzZSBpcyByYXJlIGVub3VnaCBub3QgdG8gc3BlY2lhbC1jYXNlLlxuICAgICAgICAgICAgICAgICAgICogLSBUaGUgY3Vyc29yIG11c3QgYmUgZXhhY3RseSB3aGVyZSBpdCB3YXMgd2hlbiB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICogICB3ZW50IG91dC4gQ29uY3VycmVudCB3cml0ZXMgZWFjaCBkaWZmIGFnYWluc3QgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICogICB0aGV5IHNhdywgYW5kIGBhcHBlbmRVbmlxdWVFdmVudHNgIGRlbGliZXJhdGVseSBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICogICByZS1zb3J0LCBzbyBhYnNvcmJpbmcgYSBzZWNvbmQgZGVsdGEgY29tcHV0ZWQgZnJvbSBhblxuICAgICAgICAgICAgICAgICAgICogICBvbGRlciBjdXJzb3IgY291bGQgYXBwZW5kIGV2ZW50cyBiZWhpbmQgb25lcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgKiAgIHRha2VuLiBGaXJzdCByZXNwb25zZSBiYWNrIHdpbnM7IHRoZSByZXN0IGFyZSBkcm9wcGVkLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBhYnNvcmJDcmVhdGVEZWx0YSA9IChcbiAgICAgICAgICAgICAgICAgICAgc2VudEN1cnNvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IEV2ZW50UmVzdWx0XG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdyZWFkeScgfHxcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5jdXJzb3IgIT09IHNlbnRDdXJzb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaGFzTW9yZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHJlc3VsdC5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIGByZWFkeWAgY2FuIHJlcGxheSBvbmNlIHdpdGhvdXQgYSByZWFkLiBUaGUgb3RoZXIgc3RhdGVzXG4gICAgICAgICAgICAgICAgICAvLyBkZXNjcmliZSB0aGUgbmV4dCBsb2FkIGV4YWN0bHkuXG4gICAgICAgICAgICAgICAgICBsZXQgZXZlbnRMb2c6IFJlcGxheUV2ZW50TG9nID0geyB0eXBlOiAnbG9hZEFsbCcgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gU2hhcmVkIHN0YXRlOiBzZXQgYnkgZWl0aGVyIHRoZSBiYWNrZ3JvdW5kIHN0ZXAgcGF0aFxuICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIHJ1bl9zdGFydGVkIHNldHVwIGJlbG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFNlcnZlci1zdXBwbGllZCBwZXItcnVuIGV2ZW50IGNlaWxpbmcgZnJvbSB0aGUgcnVuX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlLiBVbmRlZmluZWQg4oeSIG5vIGVuZm9yY2VtZW50IChvbGRlciBzZXJ2ZXJzLCB0dXJibykuXG4gICAgICAgICAgICAgICAgICBsZXQgbWF4RXZlbnRzTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIGxldCB3b3JrZmxvd1N0YXJ0ZWRBdCA9IC0xO1xuXG4gICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeSAoVFRGUykgc3RhdGUg4oCUIHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cy5cbiAgICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBpbnZvY2F0aW9uJ3MgRklSU1QgZXZlbnQgc25hcHNob3QgY29udGFpbmVkXG4gICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGJleW9uZCBydW5fY3JlYXRlZC9ydW5fc3RhcnRlZDogYW55dGhpbmcgZWxzZSB3YXNcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gYnkgYW4gZWFybGllciBpbnZvY2F0aW9uLCB3aG9zZSBjb250cmlidXRpb24gdG9cbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUtdG8tZmlyc3Qtc3RlcCAoaW5jbHVkaW5nIHRoZSBxdWV1ZSBob3AgYmFjayBoZXJlKVxuICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGJlIG1lYXN1cmVkIHdhbGwtY2xvY2ssIHNvIFRURlMgaXMgbm90IHJlcG9ydGVkLlxuICAgICAgICAgICAgICAgICAgLy8gU2V0IG9uY2UsIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24ncyBsb2FkZWQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICBsZXQgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIEVwb2NoIG1zIHRoZSBgcnVuX3N0YXJ0ZWRgIHJlc3BvbnNlIHdhcyByZWNlaXZlZC9wYXJzZWRcbiAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBTREsg4oCUIGFuY2hvcnMgUlNGUyAocnVuX3N0YXJ0ZWQg4oaSIGZpcnN0IHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgUE9TVCkuIFNldCBvbmNlLCBpbiB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAvLyBVbmRlciB0dXJibywgcnVuX3N0YXJ0ZWQgaXMgYmFja2dyb3VuZGVkIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAvLyBhd2FpdGVkLCBzbyB0aGlzIGlzIHN0YW1wZWQgYXQgdGhlIHBvaW50IHRoZSBydW4gaXNcbiAgICAgICAgICAgICAgICAgIC8vIHN5bnRoZXNpemVkIGxvY2FsbHkgaW5zdGVhZCBvZiB0aGUgcmVhbCByZXNwb25zZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJzZnNBbmNob3JNcy5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5TdGFydGVkUmVjZWl2ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAvLyBXYWxsLWNsb2NrIG1zIHNwZW50IGNvbW1pdHRpbmcgaG9va19jcmVhdGVkIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBzdGVwIHJhbiwgYWNjdW11bGF0ZWQgYWNyb3NzIHN1c3BlbnNpb24gcGFzc2VzXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgc3VidHJhY3RlZCBmcm9tIFRURlMuIEFjY3VtdWxhdG9ycyBoZXJlIHN1cnZpdmUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGluLXByb2Nlc3MgcmVwbGF5IHJlc3RhcnQgKGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uLCBvclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZS1ldmVudCByZXN0YXJ0IGJlbG93KSwgc28gYSByZXN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gb3Zlci1jb3VudHMgYnkgdGhlIGFiYW5kb25lZCBwYXNzJ3MgaG9vayB0aW1lIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgc2xpZ2h0IG92ZXItY291bnQgZWl0aGVyIHJlc3RhcnQgaGFzIGFsd2F5cyBoYWQuXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlU3RlcEJsb2NraW5nTXMgPSAwO1xuICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3Qgb2YgdGhlIGFjY3VtdWxhdG9yIGFzIG9mIHRoZSBzdXNwZW5zaW9uIHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHdyb3RlIHRoZSBydW4ncyBmaXJzdCBhdHRyX3NldCAod2hvc2UgaG9vayBwaGFzZSByYW5cbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdHMgYXR0ciB3cml0ZXMpLiBXaGVuIGEgcHJlLXN0ZXAgc2V0QXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgLy8gZW5kcyB0aGUgVFRGUyBtZWFzdXJlbWVudCBhdCB0aGUgYXR0ciB3cml0ZSwgb25seSBob29rXG4gICAgICAgICAgICAgICAgICAvLyB0aW1lIGZyb20gQkVGT1JFIHRoYXQgcG9pbnQgbWF5IGJlIHN1YnRyYWN0ZWQg4oCUIGxhdGVyXG4gICAgICAgICAgICAgICAgICAvLyBob29rIHdyaXRlcyBmYWxsIG91dHNpZGUgdGhlIG1lYXN1cmVkIHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmYXN0LXBhdGhzIHRoZSB2ZXJ5IGZpcnN0IGRlbGl2ZXJ5IG9mIHRoZSB2ZXJ5XG4gICAgICAgICAgICAgICAgICAvLyBmaXJzdCBpbnZvY2F0aW9uLCB3aGVyZSBpdCBpcyBwcm92YWJseSBzYWZlIHRvOiBiYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuX3N0YXJ0ZWRgLCBza2lwIHRoZSBpbml0aWFsIGV2ZW50LWxvZyBsb2FkIChub3RoaW5nIGhhc1xuICAgICAgICAgICAgICAgICAgLy8gYmVlbiB3cml0dGVuIHlldCksIGFuZCBmb3JjZSBvcHRpbWlzdGljIGlubGluZSBzdGFydCAobm9cbiAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcGVlciBoYW5kbGVyIGV4aXN0cyB0byByYWNlIHRoZSBjcmVhdGUtY2xhaW0pLlxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bklucHV0YCBpcyBvbmx5IHByZXNlbnQgb24gdGhlIHN0YXJ0KCktZW5xdWV1ZWQgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBgYXR0ZW1wdCA9PT0gMWAgKDEtYmFzZWQpIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeTsgYGluY29taW5nU3RlcElkYCB3b3VsZCBtYXJrIGEgYmFja2dyb3VuZC1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uIGFuZCBgcmVwbGF5RGl2ZXJnZW5jZWAgYSByZWNvdmVyeSByZXBsYXkg4oCUIGJvdGhcbiAgICAgICAgICAgICAgICAgIC8vIGluZWxpZ2libGUuIFRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgdGhhdCBtYWtlcyBmb3JjZWRcbiAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgc3RhcnQgc2FmZSBlbmRzIG9uY2UgYSBob29rIG9yIHdhaXQgaXMgY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgaW50cm9kdWNlIHJlc3VtZSBpbnZvY2F0aW9ucyksIHNvIHR1cmJvIGV4aXRzIGF0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIHBvaW50IChzZWUgYGZvcmNlT3B0aW1pc3RpY1N0YXJ0YCkuIFdvcmtmbG93IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGludHJvZHVjZSBubyBzdWNoIGludm9jYXRpb24gc291cmNlIOKAlCB0aGV5IHJlc29sdmVcbiAgICAgICAgICAgICAgICAgIC8vIHZpYSBhbiBpbi1wcm9jZXNzIHJlcGxheSBhbmQgZG9uJ3QgZW5kIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgLy8gTk9URTogYG1ldGFkYXRhLmF0dGVtcHQgPT09IDFgIGlzIGFsc28gbG9hZC1iZWFyaW5nIGZvclxuICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgb3duZXJzaGlwOiBvd25lZC1yZWNvdmVyeSBzdGVwcyAoYSBzdGVwXG4gICAgICAgICAgICAgICAgICAvLyBzdGFtcGVkIGJ5IGEgUFJFVklPVVMgZGVsaXZlcnkgb2YgdGhpcyBtZXNzYWdlKSBjYW4gb25seVxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3Qgb24gYXR0ZW1wdCDiiaUgMiwgc28gdHVyYm8gYW5kIG93bmVkIHJlY292ZXJ5IGFyZVxuICAgICAgICAgICAgICAgICAgLy8gbXV0dWFsbHkgZXhjbHVzaXZlLiBUaGUgdHVyYm8gYHJlaW52b2tlKClgIHBhdGhzIChob29rXG4gICAgICAgICAgICAgICAgICAvLyBjb25mbGljdCwgdGhyb3R0bGUgYmFja29mZikgYWNrIHRoaXMgbWVzc2FnZSBhbmQgY29udGludWVcbiAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIGEgTkVXIG1lc3NhZ2UgaWQg4oCUIHNhZmUgb25seSBiZWNhdXNlIG5vXG4gICAgICAgICAgICAgICAgICAvLyBub24tdGVybWluYWwgc3RlcCBjYW4gYmUgaW5saW5lLW93bmVkIGJ5IHRoZSBhY2tlZCBpZFxuICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0dXJibyBpcyBvbi4gSWYgdHVyYm8gZXZlciBlbmdhZ2VzIG9uIHJlZGVsaXZlcmllcyxcbiAgICAgICAgICAgICAgICAgIC8vIHRob3NlIHBhdGhzIG11c3QgZmlyc3QgY2hlY2sgZm9yIG93bmVkIHBlbmRpbmcgc3RlcHMgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gYHsgdGltZW91dFNlY29uZHMgfWAgcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cmJvID1cbiAgICAgICAgICAgICAgICAgICAgaXNUdXJib0VuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICBydW5JbnB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmF0dGVtcHQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmdTdGVwSWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAhcmVwbGF5RGl2ZXJnZW5jZTtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoQXR0cmlidXRlLldvcmtmbG93VHVyYm8odHVyYm8pKTtcblxuICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBvbmx5OiByZXNvbHZlcyBvbmNlIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAgaGFzIGxhbmRlZCAob3IgcmVqZWN0cyBpZiBpdCBmYWlsZWQpLiBUaHJlYWRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW50byBoYW5kbGVTdXNwZW5zaW9uIGFuZCBleGVjdXRlU3RlcCBzbyBubyBzdGVwL2hvb2svd2FpdFxuICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgcmFjZXMgYWhlYWQgb2YgdGhlIHJ1bidzIGNyZWF0aW9uLiBVbmRlZmluZWQgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgLy8gdHVyYm8sIHdoZXJlIGBydW5fc3RhcnRlZGAgaXMgYXdhaXRlZCB1cCBmcm9udC5cbiAgICAgICAgICAgICAgICAgIGxldCBydW5SZWFkeUJhcnJpZXI6IFByb21pc2U8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgIC8vIE9yZGVyIGEgdGVybWluYWwgcnVuIHdyaXRlIChydW5fY29tcGxldGVkIC8gcnVuX2ZhaWxlZCkgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgaW4gdHVyYm8gbW9kZSDigJQgYSBuby1zdGVwXG4gICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBjYW4gb3RoZXJ3aXNlIHJlYWNoIHJ1bl9jb21wbGV0ZWQgYmVmb3JlIHRoZSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cy4gQmVzdC1lZmZvcnQ6IGEgYmFycmllciByZWplY3Rpb24gaXMgc3dhbGxvd2VkIGZvclxuICAgICAgICAgICAgICAgICAgLy8gb3JkZXJpbmcgb25seTsgaWYgcnVuX3N0YXJ0ZWQgdHJ1bHkgZmFpbGVkIHRoZSB0ZXJtaW5hbCB3cml0ZVxuICAgICAgICAgICAgICAgICAgLy8gc3VyZmFjZXMgdGhlIHJlYWwgZXJyb3IgKHJ1biBub3QgZm91bmQgLyBnb25lKSBhbmQgdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnMuIE5vLW9wIG91dHNpZGUgdHVyYm8uXG4gICAgICAgICAgICAgICAgICBjb25zdCBhd2FpdFJ1blJlYWR5ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnVuUmVhZHlCYXJyaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJ1blJlYWR5QmFycmllcjtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsOiBvcmRlcmluZyBiYXJyaWVyIG9ubHkg4oCUIHNlZSBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgb3JjaGVzdHJhdG9yLiBPdXRzaWRlIHR1cmJvIHRoaXMgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAsIHdoaWNoIG1ha2VzIHRoZSBxdWV1ZSByZXNjaGVkdWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBkZWxpdmVyeSdzIG1lc3NhZ2UuIEluIHR1cmJvIHRoYXQgaXMgYSB0cmFwOiB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAsIGFuZCBvbiBhc3luYyBxdWV1ZXNcbiAgICAgICAgICAgICAgICAgIC8vIChlLmcuIGdyYXBoaWxlLXdvcmtlcikgYSByZXNjaGVkdWxlIGNvbWVzIGJhY2sgYXMgZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgMSDigJQgc28gdHVyYm8gcmUtZW5nYWdlcywgc2tpcHMgdGhlIGV2ZW50LWxvZyBsb2FkXG4gICAgICAgICAgICAgICAgICAvLyBhZ2FpbiwgcmVwbGF5cyBhZ2FpbnN0IGFuIGVtcHR5IGxvZywgbmV2ZXIgb2JzZXJ2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBob29rIGV2ZW50IHRoaXMgaW52b2NhdGlvbiBqdXN0IHdyb3RlLCBhbmQgcmUtc3VzcGVuZHNcbiAgICAgICAgICAgICAgICAgIC8vIGZvcmV2ZXIgKHRoZSBydW4gd2VkZ2VzKS4gVW5kZXIgdHVyYm8gd2UgaW5zdGVhZCBlbnF1ZXVlIGFuXG4gICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBjb250aW51YXRpb24gdGhhdCBjYXJyaWVzIE5PIGBydW5JbnB1dGAsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gbmV4dCBkZWxpdmVyeSBpcyBhIG5vcm1hbCAobm9uLXR1cmJvKSBsb2FkLWFuZC1yZXBsYXkgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIGNvbW1pdHRlZCBldmVudHMgYW5kIG1ha2VzIHByb2dyZXNzOyB3ZSB0aGVuXG4gICAgICAgICAgICAgICAgICAvLyByZXR1cm4gYHVuZGVmaW5lZGAgc28gdGhlIHF1ZXVlIHRyZWF0cyB0aGlzIGRlbGl2ZXJ5IGFzIGRvbmVcbiAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGFsc28gcmVzY2hlZHVsaW5nIGl0LlxuICAgICAgICAgICAgICAgICAgLy8gSW5saW5lLW93bmVyc2hpcCBpbnZhcmlhbnQgZ3VhcmQ6IGNvcnJlbGF0aW9uIElEcyBvZlxuICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgd2hvc2UgYm9kaWVzIHRoaXMgaW52b2NhdGlvbiBpcyBleGVjdXRpbmcgdW5kZXIgYW5cbiAgICAgICAgICAgICAgICAgIC8vIG93bmVyc2hpcCBzdGFtcCAobGF6eSBpbmxpbmUgKyBvd25lZCByZWNvdmVyeSksIHdoaWxlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gYm9keSBpcyBpbiBmbGlnaHQuIENyYXNoIHJlY292ZXJ5IGRlcGVuZHMgb24gdGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBOT1QgYmVpbmcgYWNrZWQgd2hpbGUgc3VjaCBhIHN0ZXAgaXMgbm9uLXRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAvLyAoYWNrID0gaGFuZGxlciByZXR1cm4gb3IgcmVpbnZva2UsIHdoaWNoIGFja3MgKyBlbnF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCDigJQgdGhlIHJlZGVsaXZlcnkgb2YgdGhlIG9sZCBpZCBpc1xuICAgICAgICAgICAgICAgICAgLy8gd2hhdCByZS1leGVjdXRlcyBhbiBvcnBoYW5lZCBvd25lZCBzdGVwKS4gQWxsIGV4ZWN1dGVTdGVwXG4gICAgICAgICAgICAgICAgICAvLyBjYWxscyBhcmUgYXdhaXRlZCBiZWZvcmUgYW55IGFjayBwYXRoIHJ1bnMsIHNvIHRoaXMgc2V0XG4gICAgICAgICAgICAgICAgICAvLyBpcyBlbXB0eSBhdCBldmVyeSBhY2sgYnkgY29uc3RydWN0aW9uOyB0aGUgY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAvLyB0byBjYXRjaCBmdXR1cmUgcmVmYWN0b3JzIHRoYXQgYnJlYWsgdGhhdCBvcmRlcmluZy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluRmxpZ2h0T3duZWRTdGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMgPSAoXG4gICAgICAgICAgICAgICAgICAgIGFja1BhdGg6IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkZsaWdodE93bmVkU3RlcHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFyaWFudCB2aW9sYXRpb246IGFja2luZyB0aGUgd29ya2Zsb3cgbWVzc2FnZSB3aGlsZSBvd25lZCBpbmxpbmUgc3RlcHMgYXJlIHN0aWxsIGV4ZWN1dGluZyDigJQgY3Jhc2ggcmVjb3ZlcnkgZm9yIHRoZXNlIHN0ZXBzIGlzIGJyb2tlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY2tQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWRzOiBbLi4uaW5GbGlnaHRPd25lZFN0ZXBzXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBBIHBsYWluIG9yY2hlc3RyYXRvci1yZXBsYXkgbWVzc2FnZS4gT21pdHMgYHJ1bklucHV0YCAoaXRcbiAgICAgICAgICAgICAgICAgIC8vIHJlLWVuZ2FnZXMgdHVyYm8gb24gdGhlIG5leHQgZGVsaXZlcnkgYW5kIHdlZGdlcyB0aGUgcnVuIOKAlFxuICAgICAgICAgICAgICAgICAgLy8gc2VlIGByZWludm9rZWAgYmVsb3cpIGFuZCBgcmVwbGF5RGl2ZXJnZW5jZWAgL1xuICAgICAgICAgICAgICAgICAgLy8gYHNlcnZlckVycm9yUmV0cnlDb3VudGAgKHRoaXMgZGVsaXZlcnkgY2hhaW4ncyBidWRnZXRzKS5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheU1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICBhc3luYyAoKTogUHJvbWlzZTxXb3JrZmxvd0ludm9rZVBheWxvYWQ+ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZSA9IGFzeW5jIChcbiAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBFeHRyYSBmaWVsZHMgdG8gY2Fycnkgb24gdGhlIG5ldyBtZXNzYWdlLiBPbmx5IHJlYWNoZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAqIG5leHQgaW52b2NhdGlvbiBvbiB0aGUgdHVyYm8gcGF0aDogd2l0aG91dCB0dXJibyBub1xuICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlIGlzIGVucXVldWVkIGF0IGFsbCDigJQgdGhlIGhhbmRsZXIgcmV0dXJucyBhXG4gICAgICAgICAgICAgICAgICAgICAqIHZpc2liaWxpdHkgdGltZW91dCBhbmQgdGhlIHF1ZXVlIHJlZGVsaXZlcnMgdGhlIENVUlJFTlRcbiAgICAgICAgICAgICAgICAgICAgICogbWVzc2FnZSwgd2hvc2UgYm9keSAoYW5kIHRoZXJlZm9yZSBhbnkgY291bnRlciBvbiBpdClcbiAgICAgICAgICAgICAgICAgICAgICogY2Fubm90IGJlIGNoYW5nZWQuXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBleHRyYVBheWxvYWQ/OiBQYXJ0aWFsPFdvcmtmbG93SW52b2tlUGF5bG9hZD5cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8eyB0aW1lb3V0U2Vjb25kczogbnVtYmVyIH0gfCB1bmRlZmluZWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMoJ3JlaW52b2tlJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdHVyYm8pIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiBkZWxheVNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICB7IC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLCAuLi5leHRyYVBheWxvYWQgfSxcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMgPiAwID8geyBkZWxheVNlY29uZHMgfSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUHJlY29uZGl0aW9uICg0MTIpIHJlY292ZXJ5OiBob3cgbWFueSB0aW1lcyB0aGlzIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgIC8vIGhhcyB0aHJvd24gYXdheSBpdHMgcmVwbGF5IGFuZCBzdGFydGVkIG92ZXIgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVjb25kaXRpb25SZXN0YXJ0cyA9IDA7XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEV2ZW50IGlkcyB0aGUgZGlzY2FyZGVkIHJlcGxheSBoZWxkLCBrZXB0IHVudGlsIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgKiBsb2FkIHJlc29sdmVzIHNvIGEgcmVzdGFydCBjYW4gcmVwb3J0IHdoYXQgaXRzIHJlbG9hZFxuICAgICAgICAgICAgICAgICAgICogYWN0dWFsbHkgZm91bmQuIFdpdGhvdXQgdGhpcyBhIDQxMiBvbmx5IGV2ZXIgdGVsbHMgeW91IHRoYXRcbiAgICAgICAgICAgICAgICAgICAqIGEgcmVzdGFydCBoYXBwZW5lZCwgd2hpY2ggY29uZmxhdGVzIHR3byB2ZXJ5IGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICogc2l0dWF0aW9uczogYSBsb2cgdGhhdCBncmV3IChleHBlY3RlZCDigJQgdGhlIGZlbmNlIGRpZCBpdHNcbiAgICAgICAgICAgICAgICAgICAqIGpvYikgYW5kIGEgbG9nIHRoYXQgY2FtZSBiYWNrIGlkZW50aWNhbCwgd2hpY2ggbWVhbnMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2VuZCBkaXNhZ3JlZSBhYm91dCB0aGUgY291bnQgZm9yIHRoZSBzYW1lIHNldCBvZlxuICAgICAgICAgICAgICAgICAgICogZXZlbnRzIGFuZCB0aGUgcmVzdGFydCB3aWxsIHJlLWRlcml2ZSB0aGUgc2FtZSBzbmFwc2hvdCBhbmRcbiAgICAgICAgICAgICAgICAgICAqIGJlIHJlamVjdGVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBsZXQgcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkczogU2V0PHN0cmluZz47XG4gICAgICAgICAgICAgICAgICAgIHJlc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2lubGluZS1kZWx0YScgfCAnZnVsbC1yZWxvYWQnO1xuICAgICAgICAgICAgICAgICAgfSB8IG51bGwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBSZXBvcnQgd2hhdCBhIHN0YWxlLXNuYXBzaG90IHJlc3RhcnQncyByZWxvYWQgZm91bmQsIG9uY2VcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2cgdGhpcyByZXBsYXkgd2lsbCBhY3R1YWxseSBjb25zdW1lIGlzIGluIGhhbmQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogYGdyZXdgIGlzIHRoZSBleHBlY3RlZCBjYXNlIGFuZCBnaXZlcyA0MTIgdm9sdW1lIGFcbiAgICAgICAgICAgICAgICAgICAqIGRlbm9taW5hdG9yLiBgdW5jaGFuZ2VkYCBtZWFucyB0aGUgcmVsb2FkIGRpc2FncmVlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgcmVqZWN0aW9uLCBzbyB0aGlzIHJlcGxheSByZS1kZXJpdmVzIHRoZSBzYW1lIHNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgaXMgcmVqZWN0ZWQgYWdhaW4gdW50aWwgdGhlIGJ1ZGdldCBpcyBzcGVudC4gYHNocmFua2BcbiAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBiZSBpbXBvc3NpYmxlOiBldmVyeSBsb2FkIHBhdGggb25seSBhZGRzIHRvIGEgcnVuJ3NcbiAgICAgICAgICAgICAgICAgICAqIGxvZy5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwb3J0UHJlY29uZGl0aW9uUmVzdGFydFJlbG9hZCA9IChcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBFdmVudFtdXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZWxpbmUgPSBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZWxpbmUpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydEJhc2VsaW5lID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRlZElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkZGVkID0gY291bnRNaXNzaW5nSWRzKHJlbG9hZGVkSWRzLCBiYXNlbGluZS5pZHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcm9wcGVkID0gY291bnRNaXNzaW5nSWRzKGJhc2VsaW5lLmlkcywgcmVsb2FkZWRJZHMpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRjb21lID1cbiAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkID4gMCA/ICdzaHJhbmsnIDogYWRkZWQgPiAwID8gJ2dyZXcnIDogJ3VuY2hhbmdlZCc7XG5cbiAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICdSZXN0YXJ0ZWQgcmVwbGF5IHJlbG9hZGVkIGl0cyBldmVudCBsb2cgYWZ0ZXIgYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0JlZm9yZTogYmFzZWxpbmUuaWRzLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudHNBZnRlcjogcmVsb2FkZWRJZHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzOiBiYXNlbGluZS5yZXN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBiYXNlbGluZS5yZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGJhc2VsaW5lLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogUmVjb3ZlciBmcm9tIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgKiByZXBsYXkgaW5zaWRlIHRoaXMgaW52b2NhdGlvbiwgcmV0dXJuaW5nIGZhbHNlIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgKiBwZXItaW52b2NhdGlvbiBidWRnZXQgaXMgc3BlbnQgKHRoZSBjYWxsZXIgdGhlbiBmYWxscyBiYWNrXG4gICAgICAgICAgICAgICAgICAgKiB0byBhIGZyZXNoIGludm9jYXRpb24pLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIEEgNDEyIG1lYW5zIHRoZSBsb2cgdGhpcyByZXBsYXkgZGVyaXZlZCBpdHMgZXZlbnRzIGZyb20gd2FzXG4gICAgICAgICAgICAgICAgICAgKiBtaXNzaW5nIGFuIGV2ZW50IHRoZSBiYWNrZW5kIGhhZCBhbHJlYWR5IHJlY29yZGVkLiBUaGVcbiAgICAgICAgICAgICAgICAgICAqIHJlamVjdGVkIHdyaXRlIGNhbm5vdCBzaW1wbHkgYmUgcmV0cmllZDogY29ycmVsYXRpb24gaWRzXG4gICAgICAgICAgICAgICAgICAgKiBhcmUgcG9zaXRpb25hbCBvcmRpbmFscyBvZiBvbmUgc2VlZGVkIHNlcXVlbmNlLCBzbyBhIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICogb3ZlciB0aGUgY29ycmVjdGVkIGxvZyBtaW50cyBhIGRpZmZlcmVudCBpZCBmb3IgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAqIGxvZ2ljYWwgZXZlbnQsIGFuZCByZS1wb3N0aW5nIHRoaXMgb25lIHdvdWxkIHBlcnNpc3QgYW5cbiAgICAgICAgICAgICAgICAgICAqIGV2ZW50IG5vIGNvcnJlY3QgcmVwbGF5IGV2ZXIgcHJvZHVjZXMuIFRoZSB3aG9sZSByZXBsYXkgaGFzXG4gICAgICAgICAgICAgICAgICAgKiB0byBiZSByZS1kZXJpdmVkIOKAlCB3aGljaCB0aGUgbG9vcCBkb2VzIGJ5IGRpc2NhcmRpbmcgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBjYWNoZWQgbG9nLCBzaW5jZSBgcnVuV29ya2Zsb3dgIHRoZW4gYnVpbGRzIGEgZnJlc2ggVk0sXG4gICAgICAgICAgICAgICAgICAgKiBzZWVkIGFuZCBjb3JyZWxhdGlvbi1pZCBzZXF1ZW5jZSBmcm9tIHRoZSByZWxvYWRlZCBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RhcnRSZXBsYXlJblByb2Nlc3MgPSAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcj86IHVua25vd24sXG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBTZXQgZmFsc2Ugd2hlbiB3cml0ZXMgdGhpcyBpbnZvY2F0aW9uIG1hZGUgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAqIHdpdGggdGhlIHJlamVjdGVkIG9uZSBtYXkgYmUgbWlzc2luZyBmcm9tIHRoZSA0MTInc1xuICAgICAgICAgICAgICAgICAgICAgKiBkZWx0YTogdGhlIFdvcmxkIGNvbXB1dGVkIHRoYXQgZGVsdGEgYWdhaW5zdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgcmVxdWVzdCdzIHNuYXBzaG90LCBzbyBpdCBjYW5ub3QgY29udGFpbiBhblxuICAgICAgICAgICAgICAgICAgICAgKiBldmVudCBhIHNpYmxpbmcgY29tbWl0dGVkIGFmdGVyd2FyZHMsIGFuZCBtZXJnaW5nIGl0XG4gICAgICAgICAgICAgICAgICAgICAqIHdvdWxkIHJlc3RhcnQgdGhlIHJlcGxheSBvbiBhIGxvZyB0aGF0IGlzIHN0aWxsXG4gICAgICAgICAgICAgICAgICAgICAqIGluY29tcGxldGUuIE9ubHkgYSBmdWxsIHJlbG9hZCBpcyBhdXRob3JpdGF0aXZlIHRoZW4uXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICB7IGFsbG93RGVsdGEgPSB0cnVlIH06IHsgYWxsb3dEZWx0YT86IGJvb2xlYW4gfSA9IHt9XG4gICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzID49XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMrKztcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlcnkgc3RhbGUtc25hcHNob3QgcmVzdGFydCBpbnZhbGlkYXRlcyB0aGUgcGFya2VkIFZNOlxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIGl0IGNvbnN1bWVkIHdhcyBtaXNzaW5nIGV2ZW50cywgc28gb25seSBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIGlzIGF1dGhvcml0YXRpdmUuIFRoaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjb3ZlcnMgdGhlIHN1c3BlbnNpb24tY3JlYXRlIDQxMiwgd2hpY2ggZmlyZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSByZXRlbnRpb24gZGVjaXNpb24gKGtpbGwgc3dpdGNoICsgc3RlcC1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAvLyBnYXRlKSBldmVyIHJhbiwgYW5kIHRoZSBydW5fY29tcGxldGVkIDQxMiwgd2hlcmUgYVxuICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc2Vzc2lvbiBtdXN0IG5vdCBiZSByZXN1bWVkIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIFdvcmxkIE1BWSByZXR1cm4gdGhlIGV2ZW50cyB3ZSB3ZXJlIG1pc3Npbmcgb24gdGhlIDQxMi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ1c3QgaXQgb25seSBvbiB0aGUgRklSU1QgcmVzdGFydDogaXRzIGNvbXBsZXRlbmVzcyBwcm9vZlxuICAgICAgICAgICAgICAgICAgICAvLyBsZWFucyBvbiB0aGUgYmFja2VuZCdzIG93biBib29ra2VlcGluZywgc28gaWYgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlci1jb3VudHMsIGEgXCJjb21wbGV0ZVwiIGRlbHRhIGNhbiBzdGlsbCBsZWF2ZSBhIGhvbGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJvdW5kaW5nIGl0IHRvIG9uZSBhdHRlbXB0IGNhcHMgdGhhdCBhdCBhIHNpbmdsZSB3YXN0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydDsgZXZlcnkgbGF0ZXIgcmVzdGFydCBkb2VzIHRoZSBhdXRob3JpdGF0aXZlIGxvYWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhICYmIHByZWNvbmRpdGlvblJlc3RhcnRzID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoZXJyb3IsIHJ1bklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAvLyBBIGRlbHRhIGlzIG9ubHkgdXNhYmxlIGlmIHRoZXJlIGlzIGEgbG9hZGVkIGxvZyB0byBtZXJnZVxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnRvOyB3aXRob3V0IG9uZSB0aGUgcmVzdGFydCBtdXN0IGxvYWQgZXZlcnl0aGluZy5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlZERlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICBkZWx0YSAhPT0gbnVsbCAmJiBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNuYXBzaG90IHRoZSBzZXQgYmVpbmcgZGlzY2FyZGVkIHdoaWxlIGl0IGlzIHN0aWxsIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmQ7IHRoZSBjb21wYXJpc29uIGhhcHBlbnMgb25jZSB0aGUgbmV4dCBsb2FkIHJlc29sdmVzLlxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPVxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0OiBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1c2VkRGVsdGEgPyAnaW5saW5lLWRlbHRhJyA6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICYmIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gTVVTVCBiZSBhIGZ1bGwsIGN1cnNvci1sZXNzIHJlbG9hZC4gVGhlIGN1cnNvciBsaXN0c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmQgZnJvbSB0aGUgaGlnaGVzdCBldmVudCBpZCB0aGlzIHJlcGxheSBob2xkcyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hhdCBhIHN0YWxlIHNuYXBzaG90IGlzIG1pc3Npbmcgc2l0cyBiZWxvdyBpdDogYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3QgYWxsb2NhdGVkIGluc2lkZSBhIGNvbmN1cnJlbnQgY29tbWl0IHRha2VzIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB0aGlzIHJlcGxheSBoYWQgYWxyZWFkeSByZWFkIHBhc3QuIEFuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWwgbG9hZCBzdGFydHMgYWJvdmUgdGhlIGhvbGUgYW5kIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgdHlwZTogJ2xvYWRBbGwnIH07XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvcnJlY3RlZCBsb2cgaW5zZXJ0cyB0aGUgbWlzc2luZyBldmVudHMgQkVMT1cgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIGFscmVhZHkgc2Nhbm5lZCBmb3IgcGF5bG9hZCBwcmV3YXJtaW5nLCBzaGlmdGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGxhdGVyIHBvc2l0aW9uLiBPbmx5IGEgZnVsbCByZXNjYW4gc2VlcyB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZS5yZXNldFNjYW4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlOyByZXN0YXJ0aW5nIHJlcGxheSBpbi1wcm9jZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXNlZERlbHRhID8gJ2lubGluZS1kZWx0YScgOiAnZnVsbC1yZWxvYWQnLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZXN0YXJ0cyc6IHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEVzY2FsYXRlIGEgc3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIHRoYXQgc3Vydml2ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgKiBpbi1wcm9jZXNzIHJlc3RhcnQgYnVkZ2V0IHRvIGEgZnJlc2ggaW52b2NhdGlvbiwgb3IgZ2l2ZSB1cFxuICAgICAgICAgICAgICAgICAgICogb24gdGhlIHJ1biB3aGVuIHRoZSBwZXItcnVuIGJ1ZGdldCBpcyBhbHNvIHNwZW50LlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBpbi1wcm9jZXNzIGJ1ZGdldCBpcyBhIGNsb3N1cmUgdmFyaWFibGUgYW5kIHRoZSBxdWV1ZSdzXG4gICAgICAgICAgICAgICAgICAgKiBkZWxpdmVyeSBjb3VudCByZXN0YXJ0cyBhdCAxIHdoZW5ldmVyIGEgbmV3IG1lc3NhZ2UgaXNcbiAgICAgICAgICAgICAgICAgICAqIGVucXVldWVkLCBzbyBhIHJ1biB0aGF0IGlzIHBlcm1hbmVudGx5IHVuYWJsZSB0byBjYXRjaCB1cFxuICAgICAgICAgICAgICAgICAgICogd2l0aCBpdHMgb3duIGV2ZW50IGxvZyB3b3VsZCBvdGhlcndpc2UgY3ljbGUgcmVzdGFydHMg4oaSXG4gICAgICAgICAgICAgICAgICAgKiByZS1pbnZva2Ug4oaSIHJlc3RhcnRzIHdpdGggbm8gcnVuLWxldmVsIGJvdW5kLiBUaGUgY2hhaW4gaXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZXJlZm9yZSBjb3VudGVkIG9uIHRoZSBtZXNzYWdlIGl0c2VsZiwgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgICAgICAgKiByZXBsYXkgZGl2ZXJnZW5jZXMgYXJlLCBhbmQgZmFpbHMgdGhlIHJ1biBvbmNlIGV4aGF1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgY291bnRlciBvbmx5IGFkdmFuY2VzIG9uIGhvcHMgdGhhdCBlbnF1ZXVlIGEgbmV3IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAqIChzZWUgYHJlaW52b2tlYCkuIEEgcmVkZWxpdmVyeS1iYXNlZCBob3Aga2VlcHMgdGhlIHNhbWUgYm9keVxuICAgICAgICAgICAgICAgICAgICogYW5kIHNvIHRoZSBzYW1lIGNvdW50LCBidXQgaXQgYWxzbyBrZWVwcyBhZHZhbmNpbmdcbiAgICAgICAgICAgICAgICAgICAqIGBtZXRhZGF0YS5hdHRlbXB0YCwgd2hpY2ggdGhlIG1heC1kZWxpdmVyeSBjaGVjayBhdCB0aGUgdG9wXG4gICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgaGFuZGxlciBhbHJlYWR5IGJvdW5kcyDigJQgYW5kIHRoZSBkZWxheSBiZWxvdyBpcyB3aGF0XG4gICAgICAgICAgICAgICAgICAgKiBtYWtlcyB0aGF0IGJ1ZGdldCBzcGFuIHJlYWwgdGltZSByYXRoZXIgdGhhbiBiZWluZyBidXJuZWQgaW5cbiAgICAgICAgICAgICAgICAgICAqIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHVua25vd25cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8XG4gICAgICAgICAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHwgeyByZWludm9rZWQ6IGZhbHNlOyBlcnJvcjogRXJyb3IgfVxuICAgICAgICAgICAgICAgICAgPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dGVtcHQgPSAocHJlY29uZGl0aW9uUmVpbnZvY2F0aW9ucyA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlaW52b2NhdGlvbnMgPSBnZXRQcmVjb25kaXRpb25NYXhSZWludm9jYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gbWF4UmVpbnZvY2F0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGNyZWF0aW9uIHdhcyByZWplY3RlZCBhcyBzdGFsZSBhZnRlciAke21heFJlaW52b2NhdGlvbnN9IHJlLWludm9jYXRpb25zIG9mICR7Z2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMoKX0gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydHMgZWFjaDogdGhpcyBydW4gY2Fubm90IG9ic2VydmUgaXRzIG93biBldmVudCBsb2cgY29tcGxldGVseSBlbm91Z2ggdG8gbWFrZSBwcm9ncmVzcy4gTGFzdCByZWplY3Rpb24gKCR7cmVhc29ufSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ0V2ZW50IGNyZWF0aW9uIHJlamVjdGVkIGFzIHN0YWxlIGFmdGVyIGluLXByb2Nlc3MgcmVzdGFydHM7IHJlLWludm9raW5nIHJ1biBmb3IgYSBmcmVzaCByZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnM6IGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhSZWludm9jYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgJ3dvcmtmbG93LnByZWNvbmRpdGlvbl9yZWludm9jYXRpb25zJzogYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlbGF5ZWQsIHVubGlrZSB0aGUgb3RoZXIgcmVpbnZva2UoKSBjYWxsZXJzOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXN0YXJ0cyBhbHJlYWR5IHJlbG9hZGVkIHRoZSBsb2cgc2V2ZXJhbCB0aW1lc1xuICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGNhdGNoaW5nIHVwLCBzbyB0aGUgd3JpdGVycyB0aGlzIHJlcGxheSBpcyByYWNpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZS4gUmV0cnlpbmcgaW5zdGFudGx5IGp1c3QgYnVybnMgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHBlci1ydW4gYnVkZ2V0IGF0IGZ1bGwgc3BlZWQuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVpbnZva2VkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogYXdhaXQgcmVpbnZva2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcmVjb25kaXRpb25SZWludm9rZURlbGF5U2Vjb25kcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmVjb25kaXRpb25SZWludm9jYXRpb25zOiBhdHRlbXB0IH1cbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gRGVwbG95bWVudC1hZmZpbml0eSBndWFyZCwgc2hhcmVkIGJ5IHRoZSB0d28gcGF0aHMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSBhIHJ1bjogcXVldWVkIHN0ZXAgZXhlY3V0aW9ucyBhbmQgZmxvdyByZXBsYXlzLlxuICAgICAgICAgICAgICAgICAgY29uc3QgZ3VhcmREZXBsb3ltZW50ID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBydW46IFBpY2s8XG4gICAgICAgICAgICAgICAgICAgICAgV29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgJ3J1bklkJyB8ICdkZXBsb3ltZW50SWQnIHwgJ3NwZWNWZXJzaW9uJ1xuICAgICAgICAgICAgICAgICAgICA+LFxuICAgICAgICAgICAgICAgICAgICByZWVucXVldWVQYXlsb2FkOiAoKSA9PiBQcm9taXNlPFdvcmtmbG93SW52b2tlUGF5bG9hZD4sXG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZVN0b3A/OiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgICAgICAgICAgICApOiBQcm9taXNlPERlcGxveW1lbnRBZmZpbml0eU91dGNvbWU+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBvdXRjb21lLCBzcGFuQXR0cmlidXRlcyB9ID1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBndWFyZERlcGxveW1lbnRBZmZpbml0eSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQ6IGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVTdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXBsb3ltZW50VW5hdmFpbGFibGVFcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQuaXNEZXBsb3ltZW50VW5hdmFpbGFibGVFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZW5xdWV1ZTogYXN5bmMgKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudDogcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTogUmVlbnF1ZXVlQXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZWVucXVldWVQYXlsb2FkKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudDogcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZGVwbG95bWVudElkLCBzcGVjVmVyc2lvbiwgZGVsYXlTZWNvbmRzIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGFuQXR0cmlidXRlcykgc3Bhbj8uc2V0QXR0cmlidXRlcyhzcGFuQXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRjb21lO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gSWYgaW5jb21pbmcgbWVzc2FnZSBoYXMgYSBzdGVwSWQsIHRoaXMgaXMgYSBiYWNrZ3JvdW5kIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbi4gRXhlY3V0ZSB0aGUgc3RlcCwgdGhlbiBjaGVjayBpZiBhbGwgcGFyYWxsZWwgc3RlcHNcbiAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGJhdGNoIGFyZSBkb25lLiBJZiBzbywgcmVwbGF5IGlubGluZSAoc2F2aW5nIGEgcXVldWVcbiAgICAgICAgICAgICAgICAgIC8vIHJvdW5kdHJpcCkuIElmIG5vdCwgcmV0dXJuIOKAlCB0aGUgbGFzdCBoYW5kbGVyIHRvIGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAvLyB3aWxsIHBpY2sgdXAgdGhlIHJlcGxheS5cbiAgICAgICAgICAgICAgICAgIGlmIChpbmNvbWluZ1N0ZXBJZCAmJiBpbmNvbWluZ1N0ZXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IHRoZSBwcm9kdWNlciBwYXJhbGxlbGl6ZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAgd3JpdGUgd2l0aCB0aGlzIHF1ZXVlIHB1Ymxpc2gsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgZW50aXR5IG1heSBub3QgZXhpc3QgeWV0IHdoZW4gdGhpcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVzIOKAlCB0aGUgZGVsaXZlcnkgYmVhdCB0aGUgd3JpdGUsIG9yIHRoZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB0cmFuc2llbnRseSBhbmQgdGhpcyBtZXNzYWdlIGNhcnJpZXMgdGhlIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBpbnB1dC4gSWRlbXBvdGVudGx5IHJlLWVuc3VyZSB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBtZXNzYWdlJ3MgYHN0ZXBJbnB1dGAg4oCUIGtleWVkIGJ5IHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWxhdGlvbiBpZCwgc28gdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgYW5kIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZS1lbnN1cmUgY29udmVyZ2Ugb24gZXhhY3RseSBvbmUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2VkIGZyb20gdHdvIHBsYWNlczpcbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAtIElOLUJBTkQgKHRoZSBsb2FkLWJlYXJpbmcgcGF0aCk6IHdoZW4gdGhlIGJhcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBgc3RlcF9zdGFydGVkYCBiZWxvdyByZWplY3RzIHdpdGggXCJzdGVwIG5vdCBmb3VuZFwiLFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBleGVjdXRvciBjYXRjaCBtYXRlcmlhbGl6ZXMgdGhlIHN0ZXAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmV0cmllcyBvbmNlLCBhbGwgd2l0aGluIHRoaXMgZGVsaXZlcnkuIFRoaXMgbXVzdFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG5vdCByZWx5IG9uIGRlbGl2ZXJ5IGF0dGVtcHRzOiB3b3JsZC12ZXJjZWwnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZhaWx1cmUtcmV0cnkgcGF0aCByZS1lbnF1ZXVlcyBhIEZSRVNIIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAoYXR0ZW1wdCByZXNldHMgdG8gMSksIHNvIGFuIGF0dGVtcHQtZ2F0ZWQgcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyB1bnJlYWNoYWJsZSBvbiB0aGUgcmV0cnkgY2hhaW4gYW5kIHRoZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgd291bGQgc3RhbGwgdW50aWwgdGhlIE9SSUdJTkFMIG1lc3NhZ2Unc1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIH4zMDBzIHZpc2liaWxpdHktdGltZW91dCByZWRlbGl2ZXJ5IOKAlCBtZWFzdXJlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGV4YWN0bHkgc28gaW4gdGhlIGR1cmFiZW5jaCBwYXJhbGxlbCBzd2VlcHMgYmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhpcyBwYXRoIGV4aXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIC0gRUFHRVJMWSBvbiBhIGdlbnVpbmUgcmVkZWxpdmVyeSAoYXR0ZW1wdCA+IDEpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGluIHBhcmFsbGVsIHdpdGggdGhlIHJ1biBmZXRjaCBiZWxvdyDigJQgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlZGVsaXZlcmVkIGRpc3BhdGNoIGFscmVhZHkgaGFkIGl0cyBjcmVhdGUgcmFjZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlc29sdmVkIGVpdGhlciB3YXksIHNvIHRoaXMgc2F2ZXMgdGhlIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHN0YXJ0IHJvdW5kLXRyaXAgYXQgbm8gd2FsbC10aW1lIGNvc3QuIEZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgZGVsaXZlcmllcyBza2lwIGl0OiB0aGUgcHJvZHVjZXIncyB3cml0ZSBhbG1vc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbHdheXMgbGFuZHMsIGFuZCBhbiBlYWdlciBlbnN1cmUgd291bGQgYnVybiBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29uZGl0aW9uYWwgd3JpdGUgcGVyIHN0ZXAuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5zdXJlU3RlcEZyb21NZXNzYWdlID0gYXN5bmMgKCk6IFByb21pc2U8XG4gICAgICAgICAgICAgICAgICAgICAgICAnb2snIHwgJ2dvbmUnXG4gICAgICAgICAgICAgICAgICAgICAgPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBJbnB1dCkgcmV0dXJuICdvayc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlZCBVaW50OEFycmF5IGJ5IFN0ZXBEaXNwYXRjaElucHV0U2NoZW1hOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG5vbi1iaW5hcnkgKG1hbmdsZWQpIHBheWxvYWQgZmFpbHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGFyc2UgYWJvdmUgYW5kIG5ldmVyIHJlYWNoZXMgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHN0ZXBJbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrcyB0aGlzIGNyZWF0ZSBhcyBhIGRpc3BhdGNoIHJlLWVuc3VyZSBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBndWFyZC1lbmZvcmNpbmcgYmFja2VuZCBjYW4gcmVmdXNlIGl0IHdoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9kdWNlcidzIHdyaXRlIHdhcyA0MTItcmVqZWN0ZWQgKHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2ggd2FzIHJldm9rZWQpLiBTdXJmYWNlcyBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yIOKGkiAnZ29uZScgYmVsb3csIGFja2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuIFdvcmxkcyB3aXRob3V0IHRoZSBndWFyZCBpZ25vcmUgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWFTdGVwRGlzcGF0Y2g6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGRlbGl2ZXJ5IG1hdGVyaWFsaXplZCB0aGUgc3RlcCDigJQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpb24gb2YgdGhlIHByb2R1Y2VyJ3MgcmVjb3ZlcnkgcGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuU3RlcFJlc2lsaWVudERpc3BhdGNoTWF0ZXJpYWxpemVkKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWF0ZXJpYWxpemVkIHN0ZXBfY3JlYXRlZCBmcm9tIHRoZSBxdWV1ZSBtZXNzYWdlIOKAlCB0aGUgcHJvZHVjZXJcXHUyMDE5cyBkaXJlY3Qgd3JpdGUgZGlkIG5vdCBsYW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbW1vbiBjYXNlOiB0aGUgcHJvZHVjZXIncyB3cml0ZSAob3IgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHJlLWVuc3VyZSkgYWxyZWFkeSBsYW5kZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHJldHVybiAnb2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gZXhlY3V0ZTogdGhlIHJ1biB3ZW50IHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChtYXRjaGVzIHRoZSBydW4tc3RhdHVzIGNoZWNrIGJlbG93KSwgb3IgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBndWFyZC1lbmZvcmNpbmcgYmFja2VuZCByZXZva2VkIHRoaXMgZGlzcGF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKDQxMCBgc3RlcC1kaXNwYXRjaC1yZXZva2VkYCDigJQgdGhlIHByb2R1Y2VyJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgd2FzIDQxMi1yZWplY3RlZCBhbmQgdGhlIHJlcGxheSByZXN0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBhIGNvcnJlY3RlZCBzY2hlZHVsZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkgcmV0dXJuICdnb25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNpZW50IOKAlCByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVyIGF0dGVtcHQgY29udmVyZ2VzIGluc3RlYWQgb2YgZXhlY3V0aW5nIChhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNraW5nKSBhIHN0ZXAgdGhhdCBtYXkgbm90IGV4aXN0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29rJztcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtiZ1J1biwgZW5zdXJlT3V0Y29tZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZC5ydW5zLmdldChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwSW5wdXQgJiYgbWV0YWRhdGEuYXR0ZW1wdCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgnb2snIGFzIGNvbnN0KSxcbiAgICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlT3V0Y29tZSA9PT0gJ2dvbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGJnUnVuLnN0YXR1cyAhPT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnUnVuIGFscmVhZHkgZmluaXNoZWQsIHNraXBwaW5nIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHN0YXR1czogYmdSdW4uc3RhdHVzIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvdmVycyBldmVyeSBxdWV1ZWQgc3RlcCBleGVjdXRpb24g4oCUIGZpcnN0IGRpc3BhdGNoIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcmllcy9yZXRyaWVzIGFsaWtlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoYmdSdW4sIGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogaW5jb21pbmdTdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FycnkgdGhlIHJlc3VtZSB0aW1pbmcgdmVyYmF0aW0gc28gdGhlIHJlLXJvdXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBob3Agc3RheXMgaW5zaWRlIGBzdGVwX2Rpc3BhdGNoYCByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YW5pc2hpbmcgZnJvbSB0aGUgVFRSIGRlY29tcG9zaXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihob29rUmVzdW1lVGltaW5nID8geyBob29rUmVzdW1lVGltaW5nIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSkpICE9PSAnY29udGludWUnXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnU3RhcnRlZEF0ID0gYmdSdW4uc3RhcnRlZEF0XG4gICAgICAgICAgICAgICAgICAgICAgICA/ICtiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmcgZm9yIGEgYmFja2dyb3VuZGVkIHN0ZXAuIGBtZXRhZGF0YS5hdHRlbXB0YFxuICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgcXVldWUgZGVsaXZlcnkgY291bnQpIGlzIGEgY2hlYXAgdXBwZXIgYm91bmQsIGJ1dCBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXItY291bnRzOiBhIFRocm90dGxlRXJyb3IgLyBUb29FYXJseUVycm9yIOKAlCBvciBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJ5IHRoYXQgbmV2ZXIgcmFuIHRoZSBib2R5IOKAlCBzdGlsbCBhZHZhbmNlcyBpdCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyBpdCBkaXJlY3RseSBjb3VsZCBmYWlsIGEgc3RlcCBhcyBcImV4Y2VlZGVkIG1heFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXNcIiBiZWZvcmUgdGhlIGJvZHkgZXZlciByYW4gKGEgdXNlci12aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVncmVzc2lvbiB1bmRlciB0cmFuc2llbnQgYmFja2VuZCBwcmVzc3VyZSkuIFVzZSBpdCBvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXMgYSBmYXN0IGdhdGU6IHdoaWxlIGl0IGlzIGF0IG9yIHVuZGVyIHRoZSBjZWlsaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgY2Fubm90IGJlIGV4aGF1c3RlZCwgc28gcHJvY2VlZCB3aXRob3V0IHRvdWNoaW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZy4gT25seSBvbmNlIGl0IGNyb3NzZXMgdGhlIGNlaWxpbmcgZG8gd2UgbG9hZCB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGxvZyBhbmQgZGVyaXZlIHRoZSBhdXRob3JpdGF0aXZlIGF0dGVtcHQgZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmRlZCBgc3RlcF9zdGFydGVkYCBjb3VudCDigJQgc2NvcGVkIHRvIHRoZSBsaWZlY3ljbGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IHRvdGFsIChiYXJlIHN0YXJ0cyBwbHVzIHRoZSBsYXJnZXN0IHNpbmdsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVyJ3Mgc3RhcnRzKTogdGhyb3R0bGUvdG9vLWVhcmx5IHJlZGVsaXZlcmllcyB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0YXJ0IGF0IGFsbCwgcmFjaW5nIGludm9jYXRpb25zJyBvbmUtb2ZmIHN0YW1wZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGVzIGRvbid0IGFjY3VtdWxhdGUgKGNvdW50aW5nIHRoZW0gZmFsc2VseVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aGF1c3RlZCBoZWFsdGh5IHN0ZXBzIOKAlCBzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cyksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGF0dGVtcHRzIGJ1cm5lZCB1bmRlciBhIHByaW9yIGlubGluZS1vd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwaGFzZSBzdGlsbCBjb3VudCwgc28gYSBzdGVwIHRoYXQgdGltZXMgb3V0IHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQgcmVjb3ZlcnkgYW5kIHRoZW4gdHJhbnNpdGlvbnMgdG8gcXVldWVkL2JhcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyaWVzIHRyaXBzIHRoZSBjb21iaW5lZCBjZWlsaW5nLiBUaGlzIHN0aWxsIGJvdW5kc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXRzLCB3aGljaCB3cml0ZSBubyBlcnJvciBmb3IgdGhlIHBvc3QtYm9keSBndWFyZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0ID0gbWV0YWRhdGEuYXR0ZW1wdDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ01heFJldHJpZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RlcEZ1bmN0aW9uKGluY29taW5nU3RlcE5hbWUpPy5tYXhSZXRyaWVzID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmF0dGVtcHQgPiBiZ01heFJldHJpZXMgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmdBdXRob3JpdGF0aXZlQXR0ZW1wdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICd0b3RhbEF0dGVtcHRzJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRUUjogdGhpcyBkZWxpdmVyeSBJUyB0aGUgZGlzcGF0Y2hlZCBuZXh0IHN0ZXAgb2YgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VtcHRpb24uIENvbnN1bWUgdGhlIHRyYWNraW5nIGhlcmUgc28gdGhlIGlubGluZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aGlzIGhhbmRsZXIgbWF5IGZhbGwgdGhyb3VnaCB0byBjYW5ub3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgaXQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdSZXN1bWVUcmFja2luZyA9IHJlc3VtZVRyYWNraW5nO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUGF1c2UgdGhlIHJlcGxheSBidWRnZXQgd2hpbGUgdGhlIHN0ZXAgYm9keSBydW5zIOKAlFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgZHVyYXRpb24gaXMgYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heER1cmF0aW9uLCBub3QgYnkgdGhlIHJlcGxheSB0aW1lb3V0LiBTZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5QnVkZ2V0IGRvY3MgZm9yIHRoZSBjb250cmFjdC5cbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdDogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBleGVjdXRlU3RlcD4+O1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUtZmxpZ2h0OiBhIGRlbGF5ZWQgYmFja3N0b3AgKG9yIHJldHJ5KSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYXJyaXZlIHdoaWxlIGFub3RoZXIgZXhlY3V0aW9uIG9mIHRoaXMgc2FtZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBtaWQtYm9keSBpbiB0aGlzIHByb2Nlc3Mg4oCUIG1vc3QgaW1wb3J0YW50bHkgb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkcyB3aXRoIG5vIGludm9jYXRpb24ga2lsbCBib3VuZCAod29ybGQtbG9jYWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgdGhlIG93bmVyc2hpcCBsZWFzZSBpcyBub3QgYSBkZWF0aCBwcm9vZi4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb3NlciBhd2FpdHMgdGhlIHdpbm5lcidzIHNldHRsZW1lbnQsIHRoZW4gYWNrc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBleGVjdXRpbmcuIE5vIG93bmVyTWVzc2FnZUlkIGhlcmU6IHRoZSBiYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgb2YgYSBxdWV1ZS1kcml2ZW4gZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGNsZWFycyBpbmxpbmUgb3duZXJzaGlwICh0aGUgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUtb3duZWQgZnJvbSB0aGlzIHBvaW50KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVRdWV1ZWRTdGVwID0gKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiBiZ1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiBiZ1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290UnVuSWQ6IHJvb3RSdW5JZEZyb20oYmdSdW4uYXR0cmlidXRlcywgcnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IGJnUnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmc6IHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCBhcyBhIGZhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnYXRlLCB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZWNvcmRlZCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCBvbmNlIGl0IGNyb3NzZXMgdGhlIGNlaWxpbmcgKHNlZSBhYm92ZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJnUmVzdW1lVHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyByZXN1bWVUcmFja2luZzogYmdSZXN1bWVUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVldWVkU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4tYmFuZCByZXNpbGllbnQgcmVjb3Zlcnk6IGEgbWlzc2luZyBzdGVwIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN0ZXBJbnB1dC1jYXJyeWluZyBtZXNzYWdlIG1lYW5zIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG91dHJhbiAob3Igb3V0bGl2ZWQgYSB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgb2YpIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgd3JpdGUuIE1hdGVyaWFsaXplIHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgcGF5bG9hZCBhbmQgcmV0cnkgT05DRSwgd2l0aGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IOKAlCBzZWUgZW5zdXJlU3RlcEZyb21NZXNzYWdlIGZvciB3aHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2Fubm90IHdhaXQgZm9yIGEgcmVkZWxpdmVyeS4gQSBzZWNvbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgcHJvcGFnYXRlcyBhcyBiZWZvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBJbnB1dCB8fCAhaXNTdGVwTWlzc2luZ0Vycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UoKSkgPT09ICdnb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgYXMgY29uc3QgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVldWVkU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzdGVwIGhhZCBwZW5kaW5nIG9wcyAoc3RyZWFtIHdyaXRlcyksIGJyZWFrIGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0VW50aWwgZmx1c2ggdGhlbSDigJQgY2FuJ3QgY29udGludWUgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnc2tpcHBlZCdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgZXZlbnRzIHRvIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXJzb3ItYmFzZWQgbG9hZGluZyBzbyB0aGUgbWFpbiBsb29wIGNhbiBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWxseSBmcm9tIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBuZXh0RXZlbnRMb2dMb2FkKGxvYWRlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBwZW5kaW5nIHN0ZXBzOiBhbnkgc3RlcF9jcmVhdGVkIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWF0Y2hpbmcgc3RlcF9jb21wbGV0ZWQgb3Igc3RlcF9mYWlsZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFRlcm1pbmFsSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbG9hZGVkLmV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVGVybWluYWxJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nU3RlcElkcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBlbmRpbmcgc3RlcCB0aGF0IFRISVMgbWVzc2FnZSBpbmxpbmUtb3ducyAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2Ugc3RhbXBlZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGFuZCB0aGVuIGNyYXNoZWQgbWlkLWJvZHkpIG11c3QgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmVkIGhlcmU6IG9ubHkgdGhlIG93bmluZyBtZXNzYWdlIG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1leGVjdXRlIGl0IGJlZm9yZSB0aGUgb3duZXJzaGlwIGxlYXNlIGV4cGlyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3YWtlIHJlcGxheXMgbWVyZWx5IGVuc3VyZSBhIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AuIEZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiBsb29wLCB3aG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0YWJsZSByb3V0ZXMgaXQgdG8gb3duZWQgcmVjb3ZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BlbmRpbmdTdGVwT3duZWRCeU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5tZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmU7IGZhbGxpbmcgdGhyb3VnaCB0byByZWNvdmVyIGFuIGlubGluZSBzdGVwIG93bmVkIGJ5IHRoaXMgbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHN0ZXBzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVpbmcg4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGUgd2lsbCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgZG9uZSBhbmQgcmVwbGF5IGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nLCByZXR1cm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHN0ZXBzIGRvbmUg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiByZXBsYXkgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBzaGFyZWQgc3RhdGUgc28gdGhlIGxvb3AgY2FuIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lIGFmdGVyIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudCA9IGxvYWRlZC5ldmVudHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5SW5wdXQ6IHVua25vd247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUlucHV0ID0gcnVuQ3JlYXRlZEV2ZW50LmV2ZW50RGF0YS5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNMZWdhY3lTcGVjVmVyc2lvbihiZ1J1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm8gXCJydW5fY3JlYXRlZFwiIGV2ZW50YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnYWN5IHJ1bnMgcHJlZGF0ZSB0aGUgZXZlbnQtc291cmNlZCBydW5fY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhcmlhbnQsIHNvIHJldGFpbiB0aGUgcmVzb2x2ZWQgR0VUIG9ubHkgZm9yIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZ2FjeVJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZ2FjeVJ1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlJbnB1dCA9IGxlZ2FjeVJ1bi5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iZ1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJlcGxheUlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSBiZ1N0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIGVycm9yIHdoaWxlIHByZXBhcmluZyBiYWNrZ3JvdW5kIHdvcmtmbG93IHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBEZXBsb3ltZW50LWFmZmluaXR5IHByZS1jaGVjayBmb3IgdGhlIGxhenkgaG9vayBmYXN0XG4gICAgICAgICAgICAgICAgICAvLyBwYXRoIGJlbG93LiBOZXcgbGF6eS1yZXN1bWUgbWVzc2FnZXMgY2FycnkgdGhlIHJ1bidzXG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgZGVwbG95bWVudCAoYGhvb2tJbnB1dC5kZXBsb3ltZW50SWRgKSwgc28gYVxuICAgICAgICAgICAgICAgICAgLy8gbWlzcm91dGVkIGRlbGl2ZXJ5IGlzIGRldGVjdGFibGUgd2l0aCBhIGNoZWFwIGFtYmllbnRcbiAgICAgICAgICAgICAgICAgIC8vIGRlcGxveW1lbnQtaWQgY29tcGFyaXNvbiBCRUZPUkUgdGhlIGZhc3QgcGF0aCdzXG4gICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkIHdyaXRlIOKAlCB0aGUgY29ycmVjdGx5LXJvdXRlZCBjb21tb24gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gcGF5cyBubyBydW4gZmV0Y2ggYW5kIG5vIGxhdGVuY3kuIE9ubHkgYSBkZXRlY3RlZFxuICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2ggZmV0Y2hlcyB0aGUgYXV0aG9yaXRhdGl2ZSBydW4gYW5kIGhhbmRzIGl0IHRvXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgZ3VhcmQgKHdoaWNoIG93bnMgcmUtcm91dGUvZmFpbCBwb2xpY3kpO1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlLXJvdXRlZCBtZXNzYWdlIGtlZXBzIHRoZSBjb21wbGV0ZSBgaG9va0lucHV0YCxcbiAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IG1heSBob2xkIHRoZSBvbmx5IGNvcHkgb2YgdGhlIHJlc3VtZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcGlubmVkIG9yIGFtYmllbnQgaWQgaXMgdW5hdmFpbGFibGUgKG9sZGVyXG4gICAgICAgICAgICAgICAgICAvLyBwcm9kdWNlciBtZXNzYWdlLCBhIHdvcmxkIHdpdGhvdXQgZGVwbG95bWVudCBhZmZpbml0eSxcbiAgICAgICAgICAgICAgICAgIC8vIG9yIGEgZ2V0RGVwbG95bWVudElkIGZhaWx1cmUpLCBiZWhhdmlvciBpcyB1bmNoYW5nZWQ6XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXV0aG9yaXRhdGl2ZSBndWFyZCBhZnRlciBydW4gc2V0dXAg4oCUIHdoaWNoIHJlbWFpbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm90ZWN0aW9uIGJlZm9yZSByZXBsYXkgYW5kIHN0ZXAgZXhlY3V0aW9uIOKAlCBzdGlsbFxuICAgICAgICAgICAgICAgICAgLy8gY292ZXJzIHRoZSBkZWxpdmVyeTsgdGhlIGZhc3QgcGF0aCdzIHdyaXRlIGlzIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHBlciAocnVuSWQsIHJlc3VtZUlkKSwgc28gYSBwcmUtZ3VhcmQgd3JpdGUgZnJvbSBhblxuICAgICAgICAgICAgICAgICAgLy8gb2xkZXIgbWVzc2FnZSBzdGF5cyBjb252ZXJnZW50LlxuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhd29ya2Zsb3dSdW4gJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0Py5kZXBsb3ltZW50SWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGVsaWdpYmlsaXR5IGFzIGd1YXJkRGVwbG95bWVudEFmZmluaXR5OiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGF0b21pYywgaW1tdXRhYmxlIGRlcGxveW1lbnRzIHRoZSBpZHMgbGVnaXRpbWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlciAoZS5nLiBkcGxfbG9jYWxAPHZlcnNpb24+KSBhbmQgY29tcGFyaW5nIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgdHJpZ2dlciBzcHVyaW91cyBydW4gZmV0Y2hlcy5cbiAgICAgICAgICAgICAgICAgICAgd29ybGQuY2FwYWJpbGl0aWVzPy5kZXBsb3ltZW50QWZmaW5pdHkgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWREZXBsb3ltZW50SWQgPSBob29rSW5wdXQuZGVwbG95bWVudElkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudERlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCAhPT0gcGlubmVkRGVwbG95bWVudElkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yd2FyZGVkIFVOTU9ESUZJRUQg4oCUIGluIHBhcnRpY3VsYXIgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZGVsaXZlcnkncyBlbnRyeSB0aW1lIOKAlCBzbyB0aGUgbWlzcm91dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9wIGlzIGF0dHJpYnV0ZWQgdG8gYHF1ZXVlX2RlbGl2ZXJ5YCBhbmQgVDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmRzIHVwIGJlaW5nIHRoZSBmaW5hbCBjb25zdW1lcidzIGVudHJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihob29rUmVzdW1lVGltaW5nID8geyBob29rUmVzdW1lVGltaW5nIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICApKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyAtLS0gTGF6eSBob29rIHJlc3VtZSBmYXN0IHBhdGggLS0tXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgaG9vayBkZWxpdmVyeSAocmVzdW1lSWQgKyBkaWdlc3Qgb24gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSBob2lzdHMgdGhlIGNvbnN1bWVyJ3MgaWRlbXBvdGVudCBob29rX3JlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAvLyByZS1lbnN1cmUgYWJvdmUgcnVuX3N0YXJ0ZWQgYW5kIGFza3MgdGhlIFdvcmxkIHRvIHJldHVyblxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgcmVwbGF5IGxvZyB3aXRoIHRoZSB3cml0ZSAocHJlbG9hZEV2ZW50cykuIEFcbiAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgYW5zd2VycyB3aXRoIHRoZSByZWNvbnN0cnVjdGVkIHJ1biwgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZSByZXBsYXkgbG9nLCBhbmQgdGhlIHJ1bidzIGV2ZW50IGNlaWxpbmcg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIHRoZSBnZW5lcmljIHNldHVwIGJlbG93IHdvdWxkIHNwZW5kIGFcbiAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIFBPU1QgYW5kIGFuIGV2ZW50cy5saXN0IG9uLiBBbnkgb3RoZXIgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAvLyAob2xkZXIgc2VydmVyLCBhIFdvcmxkIHRoYXQgaWdub3JlcyB0aGUgcGFyYW0sIG9yIGFcbiAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWQgdGhhdCBmYWlscyB2YWxpZGF0aW9uLCBpbmNsdWRpbmcgYSBib3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBoYXNNb3JlIHBhZ2UpIGZhbGxzIGJhY2sgdG8gdGhhdCBnZW5lcmljIHNldHVwOyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd3JpdGUgaXRzZWxmIGhhcyBzdGlsbCBzdWNjZWVkZWQgZWl0aGVyXG4gICAgICAgICAgICAgICAgICAvLyB3YXksIHNvIHRoZSByZS1lbnN1cmUgYmxvY2sgYmVsb3cgaXMgc2tpcHBlZCB2aWFcbiAgICAgICAgICAgICAgICAgIC8vIGBob29rRW5zdXJlZGAuIE5ldmVyIHRha2VuIG9uIHR1cmJvICh0dXJibyBkZWxpdmVyaWVzXG4gICAgICAgICAgICAgICAgICAvLyBjYXJyeSBydW5JbnB1dCwgbm90IGhvb2tJbnB1dCkgb3IgYWZ0ZXIgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCBhbHJlYWR5IGxvYWRlZCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgbGV0IGhvb2tFbnN1cmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICF3b3JrZmxvd1J1biAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnBheWxvYWREaWdlc3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tSZXN1bWVJbnB1dCA9IGhvb2tJbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGF0ZSB0aGUgbWF0ZXJpYWxpemVkIGV2ZW50IHRvIHdoZW4gdGhlIHJlc3VtZSBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAvLyBvY2N1cnJlZCDigJQgc2FtZSBkZXJpdmF0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3cgKHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWVJZCBpcyBhIFVMSUQgbWludGVkIGJ5IHJlc3VtZUhvb2soKSBhdCByZXN1bWVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGltZSkuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvY2N1cnJlZEF0OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWUoaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5jcmVhdGUuc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5wcmVsb2FkX2V2ZW50cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tSZXN1bWVJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rUmVzdW1lSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va1Jlc3VtZUlucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rUmVzdW1lSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tSZXN1bWVJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0Vuc3VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHVubGlrZSB0aGUgcmUtZW5zdXJlIGJlbG93LCB0aGlzIGhvaXN0ZWQgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIE5PVCBzZXQgSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCDigJQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIG9uIGV2ZXJ5IGZhc3QtcGF0aCByZXN1bWUsIGluY2x1ZGluZyB0aGUgY29tbW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSB3aGVyZSB0aGUgcHJvZHVjZXIncyBkaXJlY3Qgd3JpdGUgYWxyZWFkeSBsYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBjYWxsIG1lcmVseSBjb252ZXJnZWQgb24gaXQsIHNvIGl0IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZWNvdmVyeSBzaWduYWwuIHdvcmtmbG93LnJlc3VtZV9zZXR1cF9zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYmVsb3cpIGRlc2NyaWJlcyB0aGlzIHBhdGggaW5zdGVhZC5cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIGlzIHVzYWJsZSBhcyByZXBsYXkgaW5wdXQgb25seSB3aGVuIGl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVtb25zdHJhYmx5IHRoZSBjb21wbGV0ZSBwaWN0dXJlOiBhIHJlY29uc3RydWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gd2l0aCBhIHN0YXJ0IHRpbWUsIGEgbm9uLWVtcHR5IENPTVBMRVRFIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXNNb3JlIGZhbHNlIOKAlCB0aGlzIHBhdGggaGFzIG5vIGN1cnNvci1jb250aW51YXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lcnksIHNvIGEgYm91bmRlZCBwYWdlIG11c3Qgbm90IGJlIHRydXN0ZWQpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIncyBldmVudCBjZWlsaW5nICh0aGlzIHJlc3BvbnNlIHBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQncyByb2xlLCBzbyBhIG1pc3NpbmcgY2VpbGluZyB3b3VsZCBsZWF2ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LWxpbWl0IGVuZm9yY2VtZW50IGRpc2FibGVkIGZvciB0aGUgcnVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIHJ1biBsaWZlY3ljbGUgZXZlbnRzLCB0aGUgY2Fub25pY2FsIGV2ZW50IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBjb252ZXJnZWQgb24sIGFuZCB0aGUgaG9va19yZWNlaXZlZCBtYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRISVMgcmVzdW1lIChzbyB3ZSBuZXZlciByZXBsYXkgYWdhaW5zdCBhIGxvZyB0aGF0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWlzc2luZyB0aGUgdmVyeSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGRlbGl2ZXJ5KS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2FibGVSZXBsYXlQcmVsb2FkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bi5zdGFydGVkQXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY3Vyc29yICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdC5tYXhFdmVudHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZVJlcGxheVByZWxvYWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4/LnN0YXJ0ZWRBdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlY29uc3RydWN0ZWQgcnVuIGFsd2F5cyByZWFkcyAncnVubmluZycsIGJ1dCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudCBjb21taXR0ZWQgY29uY3VycmVudGx5IHJpZGVzIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGl0c2VsZi4gVGhlIG5vZGUgcmVwbGF5IGxvb3Agd291bGQgY2F0Y2ggaXQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBkaXNwYXRjaGVzIGJlZm9yZSB0aGF0IGNoZWNrIOKAlCBzbyBjb25zdW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsaXZlcnkgaGVyZSwgYmVmb3JlIGFueSBlbmdpbmUgcnVucy4gU2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0Y29tZSBhcyB0aGUgcnVuX3N0YXJ0ZWQgcGF0aCdzIG5vbi1ydW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgY2hlY2suXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbEV2ZW50ID0gcmVzdWx0LmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIHN0aWxsIGluaXRpYWxpemVkIHRoaXMgZGVsaXZlcnkgKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGhvdyB0aGUgdGVybWluYWwgc3RhdGUgd2FzIG9ic2VydmVkKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwLXNvdXJjZSBhbmQgdGhlIHJ1bidzIGFjdHVhbCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgYXJlIHJlY29yZGVkIGJlZm9yZSBjb25zdW1pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnY2FuY2VsbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgbGF6eSBob29rIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgPSBjbGFtcE1heEV2ZW50cyhyZXN1bHQubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcnMgUlNGUyDigJQgc2VlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcGxheXMgcnVuX3N0YXJ0ZWQncyByb2xlIG9uIHRoaXMgcGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ2hvb2tfcHJlbG9hZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiByZXN1bHQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArcmVzdWx0LnJ1bi5zdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJlc3VsdC5ydW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9va19yZWNlaXZlZF9zdHJlYW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCB3cml0ZSwgbm8gdXNhYmxlIHByZWxvYWQgKENCT1IgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gYW4gb2xkZXIgc2VydmVyLCBhIFdvcmxkIHRoYXQgaWdub3JlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdC1pbiwgYSBib3VuZGVkIGhhc01vcmUgcGFnZSwgb3IgYSBwcmVsb2FkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB2YWxpZGF0aW9uKTogdGFrZSB0aGUgZ2VuZXJpYyBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgYmVsb3cuIEl0cyBwcmVsb2FkIGlzIGxvYWRlZCBhZnRlciB0aGlzIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQsIHNvIHRoZSBjYW5vbmljYWwgaG9va19yZWNlaXZlZCBpcyBwYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB3aGF0ZXZlciBsb2cgdGhhdCBzZXR1cCByZWFkcyDigJQgbm8gc3BsaWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX2ZhbGxiYWNrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBjbGFzc2lmaWNhdGlvbiBhcyB0aGUgcmUtZW5zdXJlIGJlbG93OlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gSG9va05vdEZvdW5kIC8gUnVuRXhwaXJlZDogdGhlIHJ1biB3ZW50IHRlcm1pbmFsO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90aGluZyBsZWZ0IHRvIHJlc3VtZSwgY29uc3VtZSB0aGUgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAtIGFueXRoaW5nIGVsc2UgKEVudGl0eUNvbmZsaWN0LCBhIHRydW5jYXRlZCBwcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzdHJlYW0sIHRyYW5zcG9ydCBmYWlsdXJlcyk6IHRyYW5zaWVudCDigJQgcmV0aHJvdyBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIHRoZSBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAocnVuSWQsIHJlc3VtZUlkKSBjbGFpbSBjb252ZXJnZXMgb24gcmV0cnkuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBsYXp5IGhvb2sgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogcHJlcGFyZSB0aGUgcnVuIHN0YXRlIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiB3b3JrZmxvd1J1biB3YXMgYWxyZWFkeSBzZXQgYnkgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCAoaW5saW5lIHJlcGxheSBhZnRlciBhbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSlcbiAgICAgICAgICAgICAgICAgIC8vIG9yIGJ5IHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd1J1bikge1xuICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgY2FsbCBydW5fc3RhcnRlZCBkaXJlY3RseSDigJQgdGhpcyBib3RoIHRyYW5zaXRpb25zXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gdG8gJ3J1bm5pbmcnIEFORCByZXR1cm5zIHRoZSBydW4gZW50aXR5LCBzYXZpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBzZXBhcmF0ZSBydW5zLmdldCByb3VuZC10cmlwLlxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cmFjdDogZXZlbnRzLmNyZWF0ZSgncnVuX3N0YXJ0ZWQnKSBtdXN0IGJlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJ1bnMgYWxyZWFkeSBpbiAncnVubmluZycgc3RhdHVzIChyZXR1cm4gdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGVycm9yKSwgbm90IGp1c3QgZm9yIHBlbmRpbmcg4oaSIHJ1bm5pbmcgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1blN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fc3RhcnRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzcGVjIHZlcnNpb24gZnJvbSB0aGUgb3JpZ2luYWwgc3RhcnQoKSBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhdmFpbGFibGUsIHNvIHRoZSByZXNpbGllbnQgc3RhcnQgcGF0aCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB3aXRoIHRoZSBjb3JyZWN0IHZlcnNpb24gKG5vdCBhbHdheXMgY3VycmVudCkuXG4gICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dD8uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBydW4gaW5wdXQgZnJvbSBxdWV1ZSBzbyB0aGUgc2VydmVyIGNhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcnVuIGlmIHJ1bl9jcmVhdGVkIHdhcyBtaXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVWludDhBcnJheSB2YWx1ZXMgc3Vydml2ZSB0aGUgcXVldWUgbmF0aXZlbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoQ0JPUiBvbiB3b3JsZC12ZXJjZWwsIEpTT04gcmV2aXZlciBvbiB3b3JsZC1sb2NhbCkuXG4gICAgICAgICAgICAgICAgICAgICAgLi4uKHJ1bklucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dC5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR1cmJvICYmIHJ1bklucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGJhY2tncm91bmQgYHJ1bl9zdGFydGVkYCBhbmQgc3ludGhlc2l6ZSB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXR5IGxvY2FsbHkgc28gcmVwbGF5IGNhbiBiZWdpbiB3aXRob3V0IHdhaXRpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJvdW5kLXRyaXAuIFNhZmUgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb2YgdGhlIGZpcnN0IGludm9jYXRpb24g4oCUIHN0YXJ0KCkgY3JlYXRlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gbW9tZW50cyBhZ28gYW5kIG5vIGV2ZW50cyBoYXZlIGJlZW4gd3JpdHRlbiB5ZXQuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcnJpZXIgaXMgY29uc3VtZWQgYnkgZXZlcnkgZG93bnN0cmVhbSB3cml0ZSAoc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIsIG9wdGltaXN0aWMgc3RlcF9zdGFydGVkLCB0ZXJtaW5hbCBydW4gd3JpdGVzKSBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ydW5fc3RhcnRlZC5za2lwX3ByZWxvYWQnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRQcm9taXNlID0gY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBiYWNrZ3JvdW5kIHRoaXMgcHVyZWx5IGFzIGEgd3JpdGUgYmFycmllciBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlYWQgaXRzIHByZWxvYWRlZCBldmVudHMsIHNvIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBldmVudC1sb2cgcHJlbG9hZC4gVGhhdCB0cmltcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIHJlcXVlc3QgdGhlIGNoYWluZWQgZmlyc3Qgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0cyBvbiDigJQgc2hvcnRlbmluZyB0aW1lLXRvLXNlY29uZC1zdGVwIOKAlCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXN0ZWQgbGlzdCtyZXNvbHZlIGl0IHdvdWxkIG90aGVyd2lzZSBjb21wdXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQsIHNraXBQcmVsb2FkOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllciA9IHN0YXJ0ZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIGJhY2tncm91bmRzIHJ1bl9zdGFydGVkLCBzbyB0aGUgbm9uLXR1cmJvIGFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyBuZXZlciBydW5zIOKAlCB0aHJlYWQgdGhlIHBlci1ydW4gZXZlbnQgY2VpbGluZyBvZmYgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJlc3BvbnNlIGhlcmUgaW5zdGVhZC4gVGhlIGd1YXJkIHJlLWNoZWNrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heEV2ZW50c0xpbWl0IGV2ZXJ5IGxvb3AgaXRlcmF0aW9uLCBzbyBhIHZhbHVlIHRoYXQgbGFuZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzaG9ydGx5IGFmdGVyIHN0YXJ0IHN0aWxsIGVuZm9yY2VzIHdlbGwgYmVmb3JlIGEgcnVuYXdheVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyBhcHByb2FjaGVzIHRoZSBjZWlsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3RhcnRlZFByb21pc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gY2xhbXBNYXhFdmVudHMoci5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCkgbWF4RXZlbnRzTGltaXQgPSBsaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGFuIGVhcmx5IGZhaWx1cmUgZnJvbSBzdXJmYWNpbmcgYXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuaGFuZGxlZFJlamVjdGlvbjsgcnVuUmVhZHlCYXJyaWVyIHN0aWxsIG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0OiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIHlldCBvbiBhIGZpcnN0IGRlbGl2ZXJ5IChydW5fc3RhcnRlZCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCkuIEFuIGVtcHR5IHByZWxvYWQgcm91dGVzIGl0ZXJhdGlvbiAxIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm8tbG9hZCBwcmVsb2FkZWQgYnJhbmNoOyBpdGVyYXRpb24gMiB0aGVuIHRha2VzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBvc3QtcHJlbG9hZGVkIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGEgc3B1cmlvdXMgXCJjdXJzb3IgbWlzc2luZ1wiIHdhcm5pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW5JbnB1dC5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVkIGF0dHJpYnV0ZXMgZnJvbSBzdGFydCgpIHJpZGUgYWxvbmcgaW4gYHJ1bklucHV0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgbGl2ZSBpbiBgcnVuX2NyZWF0ZWRgJ3MgZXZlbnREYXRhLCBub3Qgc2VwYXJhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBhdHRyX3NldGAgZXZlbnRzKSwgc28gdGhlIHN5bnRoZXNpemVkIHNuYXBzaG90IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gZXZlbiB0aG91Z2ggd2Ugc2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCBPTkxZIHdoaWxlIGF0dHJpYnV0ZXMgYXJlIHdyaXRlLW9ubHk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBpbi13b3JrZmxvdyByZWFkIEFQSSB0b2RheSAoc2VlIHdvcmtmbG93LnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkXCIpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByZWxvYWRlZCBsb2cgY2FuJ3QgZGl2ZXJnZSBvbiBhIHJlYWQuIElmIGEgcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIGlzIGV2ZXIgYWRkZWQgaXQgTVVTVCByZWFkIGZyb20gdGhpcyBzbmFwc2hvdCwgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSByZXBsYXlpbmcgcnVuX2NyZWF0ZWQvYXR0cl9zZXQgZXZlbnRzIOKAlCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvJ3MgZW1wdHkgaW5pdGlhbCBsb2cgd291bGQgc3VyZmFjZSBzZWVkIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGB7fWAgb24gdGhlIGZpcnN0IGRlbGl2ZXJ5IG9ubHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgYHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXNgIGRlY2xhcmF0aW9uIGFib3ZlOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHN5bnRoZXNpemVzIHRoZSBydW4gYmVmb3JlIHRoZSByZWFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCByZXNwb25zZSBsYW5kcywgc28gYW5jaG9yIFJTRlMgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGF0IGFuIGFjdHVhbCByZXNwb25zZSBpbnN0YW50LlxuICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdydW5uaW5nJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuc2tpcF9wcmVsb2FkJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KHJ1blN0YXJ0ZWRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gcmVzdWx0LnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ID0gY2xhbXBNYXhFdmVudHMocmVzdWx0Lm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JzIFJTRlMg4oCUIHNlZSB0aGUgZGVjbGFyYXRpb24gYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvdmVycyBib3RoIHRoZSBwbGFpbiBzZXF1ZW50aWFsIHJlc3VtZSBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IGZhc3QgcGF0aCdzIGZhbGxiYWNrICh3aG9zZSBob2lzdGVkIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBubyB1c2FibGUgcHJlbG9hZCBhbmQgbGVmdCB3b3JrZmxvd1J1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zZXQsIHNvIGl0IGxhbmRzIGhlcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ3J1bl9zdGFydGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ldmVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbLi4ucmVzdWx0LmV2ZW50c10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gcmVzdWx0Lmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHRFdmVudExvZ0xvYWQobG9hZGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5sb2FkZWQsIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK3Jlc3VsdC5ydW4uc3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhyZXN1bHQucnVuLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ydW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnJ1bi5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZvciBgY2FuY2VsYCwgd2UgYWN0dWFsbHkgd2FudCB0byBwcm9wYWdhdGUgYSBXb3JrZmxvd0NhbmNlbGxlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHdvcmtmbG93IGNvbnRleHQgc28gdGhlIHVzZXIgY2FuIGdyYWNlZnVsbHkgZXhpdC4gdGhpcyBpcyBTSUdURVJNXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXJtb3JlLCB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IG9yIGEgd2F5IHRvIGZvcmNlIGNhbmNlbCBTSUdLSUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgYWN0dWFsbHkgZXhpdCBoZXJlIHdpdGhvdXQgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBhdCBhbGwsIGluIHRoZSBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGlzIGl0c2VsZiBmYWlsaW5nLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB3YXMgY29uY3VycmVudGx5IGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3I6IHJ1biB3YXMgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkIGR1cmluZyBzZXR1cC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yOiBydW4gYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgc2tpcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyB3b3JrZmxvdyBzZXR1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChub24tdHVyYm8gcnVuX3N0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAoIXdvcmtmbG93UnVuKVxuICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgcmVwbGF5J1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgc2V0dXAgYnJhbmNoIHJhbiwgc28gdGhlIHJ1biBhcnJpdmVkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgc2V0dXAgd2FzIGEgcGxhaW4gZXZlbnQgbG9hZC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQtc3RlcCBmYWxsLXRocm91Z2ggcmVhY2hlcyBoZXJlIHdpdGggYSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWRlZCB0b2RheSwgYW5kIGl0IGNvbnN1bWVzIHRoZSB0cmFja2luZyBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQg4oCUIHNvIHRoaXMgaXMgdGhlIGhvbmVzdCBkZWZhdWx0IHJhdGhlciB0aGFuIGEgbGl2ZVxuICAgICAgICAgICAgICAgICAgLy8gcGF0aCwgYW5kIGtlZXBzIHRoZSBkaW1lbnNpb24gdG90YWwgaWYgb25lIGlzIGV2ZXIgYWRkZWQuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZy5zZXR1cFNvdXJjZSA9ICdldmVudF9sb2FkJztcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gQ292ZXJzIGV2ZXJ5IGZsb3cgcmVwbGF5IOKAlCBpbml0aWFsIHN0YXJ0LCBzdGVwIGNvbXBsZXRpb25zLFxuICAgICAgICAgICAgICAgICAgLy8gaG9vayByZXN1bXB0aW9ucywgd2FpdCBjb21wbGV0aW9ucyDigJQgYW5kIHN0b3BzIGJlZm9yZSBhbnlcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgb3IgaW5saW5lIHN0ZXAgZXhlY3V0ZXMgd2hlbiB0aGUgcnVuIGlzIG5vdFxuICAgICAgICAgICAgICAgICAgLy8gcGlubmVkIGhlcmUgKHNlZSBgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHlgKS4gVGhpcyByZW1haW5zXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgQVVUSE9SSVRBVElWRSBwcm90ZWN0aW9uIGJlZm9yZSByZXBsYXkgYW5kIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbi4gYGF3YWl0UnVuUmVhZHlgIG9yZGVycyB0dXJibydzIGBydW5fc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBlaXRoZXIgc3RvcHBpbmcgYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaG9vayByZXN1bWVzIGFyZSBhZGRpdGlvbmFsbHkgcHJlLWNoZWNrZWQgYWJvdmUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBmYXN0IHBhdGg6IGEgbmV3IG1lc3NhZ2UncyBgaG9va0lucHV0LmRlcGxveW1lbnRJZGAgaXNcbiAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmVkIGFnYWluc3QgdGhlIGFtYmllbnQgZGVwbG95bWVudCBpZCBmb3IgZnJlZSwgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBvbmx5IGEgZGV0ZWN0ZWQgbWlzbWF0Y2ggZmV0Y2hlcyB0aGUgYXV0aG9yaXRhdGl2ZSBydW4g4oCUXG4gICAgICAgICAgICAgICAgICAvLyBzbyBhIG1pc3JvdXRlZCBtb2Rlcm4gcmVzdW1lIHJlLXJvdXRlcyB3aXRoIHplcm8gZXZlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcy4gT2xkZXIgbWVzc2FnZXMgKG5vIGBob29rSW5wdXQuZGVwbG95bWVudElkYCkgcmVhY2hcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYXN0IHBhdGgncyBpZGVtcG90ZW50IGhvb2tfcmVjZWl2ZWQgd3JpdGUgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIGd1YXJkOyB0aGF0IHdyaXRlIGNvbnZlcmdlcyBwZXIgKHJ1bklkLCByZXN1bWVJZCkgb24gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgZGVwbG95bWVudCwgc28gaXQgaXMgc2FmZSwganVzdCBub3QgZnJlZS4gRWl0aGVyXG4gICAgICAgICAgICAgICAgICAvLyB3YXkgdGhlIHJlLXJvdXRlZCBtZXNzYWdlIG11c3QgY2FycnkgYGhvb2tJbnB1dGAsIG9yIGFcbiAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB3aG9zZSBwcm9kdWNlciB3cml0ZSBoYWQgbm90IHlldCBsYW5kZWQgd291bGQgYmVcbiAgICAgICAgICAgICAgICAgIC8vIGxvc3QuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tJbnB1dCA/IHsgaG9va0lucHV0IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIHByZS1jaGVjayByZS1yb3V0ZSBhYm92ZTogZm9yd2FyZGVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCwgc28gdGhlIGV4dHJhIGhvcCBpcyBxdWV1ZSBkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihob29rUmVzdW1lVGltaW5nID8geyBob29rUmVzdW1lVGltaW5nIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXRSdW5SZWFkeVxuICAgICAgICAgICAgICAgICAgICApKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBob29rIHJlc3VtZTogdGhlIHByb2R1Y2VyIChyZXN1bWVIb29rIGZhc3QgcGF0aClcbiAgICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsaXplZCB0aGUgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIHdpdGggdGhpcyBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcHVibGlzaCwgc28gdGhlIGV2ZW50IG1heSBub3QgYmUgcGVyc2lzdGVkIHlldC4gSWRlbXBvdGVudGx5XG4gICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgaXQgYmVmb3JlIHJlcGxheSDigJQga2V5ZWQgYnkgYHJlc3VtZUlkYCBzbyBhXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHByb2R1Y2VyIHdyaXRlIGNvbnZlcmdlcyBvbiBleGFjdGx5IG9uZSBldmVudFxuICAgICAgICAgICAgICAgICAgLy8gKHRoZSBzZXJ2ZXIgcmVzb2x2ZXMgYSBtYXRjaGluZyBjbGFpbSBhcyBzdWNjZXNzLCBub3QgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGVycm9yKS4gYGhvb2tJbnB1dGAgbmV2ZXIgcmlkZXMgYSB0dXJibyBmaXJzdC1kZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gKHRoYXQgcGF0aCBjYXJyaWVzIGBydW5JbnB1dGAsIG5vdCBgaG9va0lucHV0YCksIHNvIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcnVucyBvbiB0aGUgbm9ybWFsIGxvYWQtYW5kLXJlcGxheSBwYXRoLiBTa2lwcGVkXG4gICAgICAgICAgICAgICAgICAvLyBlbnRpcmVseSB3aGVuIHRoZSBmYXN0IHBhdGggYWJvdmUgYWxyZWFkeSBlbnN1cmVkIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgKGBob29rRW5zdXJlZGApIOKAlCBzdWNjZXNzZnVsbHkgb3IgdmlhIGl0cyBmYWxsYmFjayxcbiAgICAgICAgICAgICAgICAgIC8vIHdob3NlIHJ1bl9zdGFydGVkIHByZWxvYWQgd2FzIGxvYWRlZCBhZnRlciB0aGUgd3JpdGUgYW5kXG4gICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgYWxyZWFkeSBjb250YWlucyB0aGUgY2Fub25pY2FsIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgaWYgKGhvb2tJbnB1dCAmJiAhaG9va0Vuc3VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGVyZiAoT3B0aW9uIEEpOiBpZiB0aGUgcHJvZHVjZXIncyBjb25jdXJyZW50IGRpcmVjdFxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBhbHJlYWR5IGxhbmRlZCBpbiB0aGUgcnVuX3N0YXJ0ZWQgcHJlbG9hZCwgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbm9uaWNhbCBldmVudCBpcyBpbiB0aGUgbG9nIGFuZCB0aGUgcmUtZW5zdXJlIHJvdW5kIHRyaXBcbiAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHVyZSBvdmVyaGVhZC4gU2tpcCBpdCB3aGVuIHRoZSBwcmVsb2FkIGFscmVhZHkgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGBob29rX3JlY2VpdmVkYCB3aXRoIHRoaXMgcmVzdW1lJ3MgcGVyc2lzdGVkIGByZXN1bWVJZGBcbiAgICAgICAgICAgICAgICAgICAgLy8gKHVuaXF1ZSBwZXIgcmVzdW1lLCBzbyB3ZSBuZXZlciBza2lwIG9uIGFuIHVucmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkKS4gQmVzdC1lZmZvcnQ6IHRoZSB3aW4gbGFuZHMgb25seSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWNlcidzIHdyaXRlIGJlYXQgdGhpcyBjb25zdW1lcidzIGxvYWQ7IG90aGVyd2lzZSB3ZVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGlkZW1wb3RlbnQgcmUtZW5zdXJlIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVucmVhY2hhYmxlIGZvciBhdG9taWMgbGF6eSByZXN1bWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIChyZXN1bWVJZCArIGRpZ2VzdCk6IHRob3NlIHNldCBgaG9va0Vuc3VyZWRgIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBob2lzdGVkIGZhc3QgcGF0aCBhYm92ZSDigJQgb24gc3VjY2VzcyBBTkQgb24gaXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIOKAlCBzbyB0aGlzIGJsb2NrIChhbmQgdGhlIHNraXAgY2hlY2spIG5vdyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcyBob29rSW5wdXQgc2hhcGVzIHdpdGhvdXQgdGhlIGZ1bGwgaWRlbXBvdGVuY3lcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFpci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVByZWxvYWRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nIOKAlCBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgc2ltcGx5IGxlYXZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCwgc28gdGhlIFdvcmxkIGZhbGxzIGJhY2sgdG8gYGNyZWF0ZWRBdGAuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoZGVjb2RlVGltZShob29rSW5wdXQucmVzdW1lSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuc3VyZWRFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZWQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va0lucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3VtZXItc2lkZSBjb21wbGV0aW9uIG9mIHRoZSByZWNvdmVyeSBwYXRoOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgbWF0ZXJpYWxpemVkIHRoZSBldmVudCBiZWNhdXNlIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgd3JpdGUgaGFkIG5vdCBsYW5kZWQgaW4gdGhlIHByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnQg4oCUIHdoZXRoZXIgdGhpcyBjYWxsIGNvbW1pdHRlZCBpdCBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyZ2VkIG9uIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgd3JpdGUg4oCUIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBhY2sgYSBkZWxpdmVyeSB0aGF0IG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjYXJyeSB0aGUgb25seSBjb3B5IG9mIHRoZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBFbnRpdHlDb25mbGljdCAoYW5kIGFueSBvdGhlciB1bmV4cGVjdGVkIGVycm9yKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlc3VtZUlkIGNvbnN0cmFpbnQgZXhpc3RzIGJ1dCB0aGUgbWF0Y2hpbmcgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90IHlldCBvYnNlcnZhYmxlIOKAlCB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCB3cml0ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzdGlsbCBpbiBmbGlnaHQsIG9yIGEgcmVkcml2ZSByYWNlZCB0aGUgY2xhaW0uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdHJhbnNpZW50OiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGF0dGVtcHQgY29udmVyZ2VzIG9uIHRoZSBjb21taXR0ZWQgZXZlbnQgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByZXBsYXlpbmcgKGFuZCBhY2tpbmcpIHdpdGhvdXQgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBwcmVsb2FkZWQgdGhlIGxvZyBCRUZPUkUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSwgc28gaXQgY2Fubm90IGluY2x1ZGUgdGhlIGhvb2tfcmVjZWl2ZWQuIFJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gZGlzY2FyZCB0aGUgcHJlbG9hZCAod2hpY2ggd291bGQgY29zdCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQgdHJpcCBvbiB0aGUgZmlyc3QgcmVwbGF5IGl0ZXJhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGluIHRoZSBjYW5vbmljYWwgZXZlbnQgcmVjb25zdHJ1Y3RlZCBhYm92ZS4gSXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGEgc3RhYmxlIGV2ZW50SWQsIHNvIGBpbnNlcnRFdmVudEJ5RXZlbnRJZGAga2VlcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbiBhc2NlbmRpbmcgZXZlbnRJZCBvcmRlciBhbmQgaXMgaWRlbXBvdGVudCBpZiBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCByZS1vYnNlcnZlcyBpdC4gT25seSB3aGVuIHRoZSBXb3JsZCByZXR1cm5zIG5vIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgZmFsbCBiYWNrIHRvIHJlbG9hZGluZyB0aGUgY29tcGxldGUgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiYgZW5zdXJlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRFdmVudEJ5RXZlbnRJZChldmVudExvZy5ldmVudHMsIGVuc3VyZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyB0eXBlOiAnbG9hZEFsbCcgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKHJlLWVuc3VyZSBuZWVkZWQpXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bidzIGRlcGxveW1lbnQuXG4gICAgICAgICAgICAgICAgICAvLyBVc2VkIGVhZ2VybHkgaGVyZSBzaW5jZSBib3RoIHdvcmtmbG93IGV4ZWN1dGlvbiAoaW5wdXRcbiAgICAgICAgICAgICAgICAgIC8vIGh5ZHJhdGlvbiAvIGhvb2sgcGF5bG9hZCBkZWNyeXB0aW9uKSBhbmQgdGhlIHJ1bl9mYWlsZWRcbiAgICAgICAgICAgICAgICAgIC8vIGRlaHlkcmF0ZSBwYXRoIGJlbG93IG5lZWQgaXQuIE1lbW9pemVkIGFjY2Vzc29yOiBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gY2FsbCB0cmlnZ2VycyB0aGUgYWN0dWFsIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uLFxuICAgICAgICAgICAgICAgICAgLy8gc3Vic2VxdWVudCBjYWxscyBhd2FpdCB0aGUgY2FjaGVkIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1blxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIG9mIFZNLWluZGVwZW5kZW50IHByZXBhcmVkIHBheWxvYWRzXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgaW1tdXRhYmxlIGZpbmFsIHZhbHVlcy4gSXQgc3Vydml2ZXMgdGhlIGZyZXNoIHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAvLyBWTSBjcmVhdGVkIGJ5IGVhY2ggaW5saW5lIHJlcGxheSwgYnV0IG5ldmVyIGNyb3NzZXMgcnVucyBvclxuICAgICAgICAgICAgICAgICAgLy8gcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheVBheWxvYWRDYWNoZSA9IG5ldyBSZXBsYXlQYXlsb2FkQ2FjaGUoXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBsaXZlIFZNIHBhcmtlZCBhdCB0aGUgcHJldmlvdXMgYm91bmRhcnksIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAvLyByZXRlbnRpb24gZGVjaXNpb24ga2VwdCBpdC4gbnVsbCDihpIgdGhpcyBpdGVyYXRpb24gY29sZC1cbiAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMuIEludm9jYXRpb24tc2NvcGVkOiBkaWVzIHdpdGggdGhpcyBkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgIGxldCByZXRhaW5lZFNlc3Npb246IFdvcmtmbG93U2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAvLyBNYWluIHJlcGxheSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy9ub0NvbnN0YW50Q29uZGl0aW9uOiBpbnRlbnRpb25hbCBsb29wXG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5LWJ1ZGdldCBjaGVjazogYmFpbCBvdXQgKHJldHJ5IG9yIGZhaWwpIGlmXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGVwIHRpbWUgd2l0aGluIHRoaXMgaW52b2NhdGlvbiBoYXMgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgYnVkZ2V0LiBTdGVwIGJvZGllcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSByZXBsYXlCdWRnZXQucGF1c2UoKS9yZXN1bWUoKSBicmFja2V0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBleGVjdXRlU3RlcGAgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxheUJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TXM6IHJlcGxheUJ1ZGdldC5jb25maWd1cmVkTGltaXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RTbmFwc2hvdDogc2xvdFNuYXBzaG90KCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB0aGUgdGVybWluYWwgYXR0ZW1wdCByZXR1cm5zLCBhZnRlciBydW5fZmFpbGVkIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZS4gRWFybGllciBhdHRlbXB0cyByZWplY3QgZm9yIHF1ZXVlIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGltZW91dCBiZWZvcmUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSA+PVxuICAgICAgICAgICAgICAgICAgICAgIG5vSW5saW5lUmVwbGF5QWZ0ZXJNc1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnVjIgdGltZW91dCByZWFjaGVkLCByZS1zY2hlZHVsaW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlTdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLS0tIFF1aWNrSlMgVk0gZW5naW5lIGRpc3BhdGNoIC0tLVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBRdWlja0pTIGVuZ2luZSAob3B0LWluIHZpYSBXT1JLRkxPV19WTT1xdWlja2pzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3IgZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd1ZtKSBpcyBhIHNlbGYtY29udGFpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdG8gdGhlIG5vZGU6dm0gaW5saW5lLXJlcGxheSBsb2dpY1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBmdWxsIGV2ZW50IHJlcGxheSwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgd29ya2Zsb3cgY29kZSBpbiBhIFF1aWNrSlMgV0FTTSBWTSwgcXVldWVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgdmlhIHRoZSBzYW1lIGNvbWJpbmVkIHJvdXRlIChzbyB0aGV5IGhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwIGJlbG93IG9uIHJlLWVudHJ5KSwgYW5kIG1hbmFnZXMgaXRzIG93blxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkIGxpZmVjeWNsZSBmb3Igd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lcy4gV2hlbiB0aGUgUXVpY2tKUyBlbmdpbmUgaXMgaW4gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciBkaXNwYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBJTlNJREUgdGhpcyB0cnk6IGVuZ2luZSBmYWlsdXJlcyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlIHRoZSBlbnRyeXBvaW50IChNYXhFdmVudHNFeGNlZWRlZEVycm9yLCBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV0FTTSBPT00gYXQgdGhlIG1lbW9yeSBjZWlsaW5nLCBhIGJ1bmRsZS1ldmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSkgbXVzdCByZWFjaCB0aGlzIGxvb3AncyBjYXRjaCBzbyB0aGV5IGFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzaWZpZWQgYW5kIHJlY29yZGVkIGFzIHJ1bl9mYWlsZWQg4oCUIG91dHNpZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRoZXkgd291bGQgbmFjayB0aGUgbWVzc2FnZSBhbmQgYnVybiBhbGwgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJpZXMgYmVmb3JlIGR5aW5nIGFzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTUFYX0RFTElWRVJJRVNfRVhDRUVERUQuIFRyYW5zaWVudCB3b3JsZCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZXRocm93IG91dCBvZiB0aGUgY2F0Y2ggZm9yIHJlZGVsaXZlcnksIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBub2RlLWVuZ2luZSByZXBsYXkgZmFpbHVyZXMuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVF1aWNrSlNWbSh3b3JrZmxvd1J1bikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1VzaW5nIFF1aWNrSlMgVk0gZW5naW5lJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5kZXIgdHVyYm8sIHJ1bl9zdGFydGVkIGlzIGJhY2tncm91bmRlZC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIGVudHJ5cG9pbnQgZmV0Y2hlcyB0aGUgZXZlbnQgbG9nIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGV2ZW50cyBkaXJlY3RseSwgc28gd2FpdCBmb3IgdGhlIHJ1biB0byBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJseSBzdGFydGVkIGZpcnN0IOKAlCBpdCBkb2VzIG5vdCB0aHJlYWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBydW5SZWFkeUJhcnJpZXIgdGhlIHdheSBoYW5kbGVTdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCwgZXZlbnRMb2cuY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW1wb3J0OiB0aGUgUXVpY2tKUyBlbnRyeXBvaW50J3MgaW1wb3J0IGNoYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZHMgdGhlIGJhc2U2NCBXQVNNIGJpbmFyeSArIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh+MS4zIE1CIGRlY29kZWQgYXQgbW9kdWxlIHNjb3BlKS4gTG9hZGluZyBpdCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGF0IG91dCBvZiBub2RlLWVuZ2luZSBkZXBsb3ltZW50cyBlbnRpcmVseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g4oCUIG9ubHkgdGhlIG9wdC1pbiBwYXRoIHBheXMsIG9uIGZpcnN0IGRpc3BhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBydW5Xb3JrZmxvd1dpdGhRdWlja0pTIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcuL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LmpzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1aWNranNSZXN1bHQgPSBhd2FpdCBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZTogZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNwYW46IHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1zdGVwIG93bmVyc2hpcCBwbHVtYmluZzogcmVkZWxpdmVyaWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBkcml2ZSBjcmFzaCByZWNvdmVyeSBmb3Igc3RlcHMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFybGllciBpbnZvY2F0aW9uIGNsYWltZWQgaW5saW5lIChzZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wIHBhc3MgaW4gdGhlIGVudHJ5cG9pbnQncyBsb29wKSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGlkIGlzIHN0YW1wZWQgYXMgYG93bmVyTWVzc2FnZUlkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXIgdG8gdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVpY2tqc1Jlc3VsdD8udGltZW91dFNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYHJlaW52b2tlYCByYXRoZXIgdGhhbiByZXR1cm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHsgdGltZW91dFNlY29uZHMgfWAgZGlyZWN0bHk6IHVuZGVyIHR1cmJvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1lc3NhZ2UgY2FycmllcyBgcnVuSW5wdXRgIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NoZWR1bGUgd291bGQgcmUtZW5nYWdlIHR1cmJvIG9uIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHJlcGxheWluZyBhZ2FpbnN0IGEgc3RhbGUgcHJlbG9hZGVkIGxvZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VkZ2luZyB0aGUgcnVuIOKAlCBzZWUgdGhlIHJlaW52b2tlKCkgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSkuIHJlaW52b2tlIGVucXVldWVzIGFuIGV4cGxpY2l0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiB3aXRob3V0IGBydW5JbnB1dGAgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVpbnZva2UocXVpY2tqc1Jlc3VsdC50aW1lb3V0U2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cudHlwZSA9PT0gJ2xvYWRBZnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5wYWdlLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydFByZWNvbmRpdGlvblJlc3RhcnRSZWxvYWQoZXZlbnRMb2cuZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVjdCBjb25jdXJyZW50IGNvbXBsZXRpb24gdmlhIHRoZSBldmVudCBsb2c6IGlmXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG90aGVyIGhhbmRsZXIgd3JvdGUgYSB0ZXJtaW5hbCBydW4gZXZlbnQsIGV4aXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgcmVwbGF5IHdvcmsuIFRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZXNlIGV2ZW50cywgc28gY2hlY2tpbmcgdGhlIGxvZyBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZXMgdXMgdGhlIHNhbWUgc2lnbmFsIGFzIGEgcnVucy5nZXQoKSByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgZXh0cmEgcmVxdWVzdCBwZXIgbG9vcCBpdGVyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1JlY29yZGVkVGVybWluYWxSdW5FdmVudChldmVudExvZy5ldmVudHMsIHJ1bklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlIGVsYXBzZWQgd2FpdHNcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0c1RvQ29tcGxldGUgPSBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk6IGUgaXMgRXh0cmFjdDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGV2ZW50VHlwZTogJ3dhaXRfY3JlYXRlZCcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ICYgeyBjb3JyZWxhdGlvbklkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY29ycmVsYXRpb25JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHMuaGFzKGUuY29ycmVsYXRpb25JZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgPj0gKGUuZXZlbnREYXRhLnJlc3VtZUF0IGFzIERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnd2FpdF9jb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGUuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lQXQ6IGUuZXZlbnREYXRhLnJlc3VtZUF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0RXZlbnQgb2Ygd2FpdHNUb0NvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY3JlYXRlRXZlbnQod2FpdEV2ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnVtcC1hbmQtcmVwb3J0OiBmb2xkIHdoYXQgdGhpcyB3cml0ZSBza2lwcGVkIG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgbG9nLCB3aGljaCBpcyB3aGF0IGBjcmVhdGVFdmVudGAgcmVhZHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3Qgc25hcHNob3Qgb2ZmLCBzbyBlYWNoIHJlbWFpbmluZyB3YWl0IGFza3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc2xvdCBhYm92ZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRydW5jYXRlZCBjYXNlIG1hdHRlcnMgdHdpY2Ugb3ZlciBoZXJlLiBCZXlvbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGFjY291bnRpbmcgYGFic29yYlNraXBwZWRTbG90UmVwb3J0YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWplY3RzIGl0IGZvciwgdGhlIG1pc3NpbmctY29tcGxldGlvbiBjaGVjayBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNpZGVzIGZyb20gdGhpcyBsb2cgd2hldGhlciB0aGUgaGFuZGxlciBzdGlsbCBoYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZmV0Y2gsIHNvIGEgcGFydGlhbCBwYWdlIHdvdWxkIG1ha2UgdGhlIGxvZyBsb29rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2UgaXQgaG9sZHMgYSBjb21wbGV0aW9uIHdob3NlIHBhZ2UgaXMgdW5yZWFkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBmZXRjaCBvbiBhIHNuYXBzaG90IHNob3J0IG9mIHRoZSBXb3JsZCdzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChldmVudExvZy5ldmVudHMsIGNyZWF0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2FpdCBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCBsaXN0IGFib3ZlIG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSBhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGVsYXBzZWQgd2FpdCBpcyBjb21taXR0ZWQsIGFuZCB0aGlzIHJlcGxheSBoYXMgdG8gc2VlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biB3YWl0X2NvbXBsZXRlZCBiZWZvcmUgaXQgY2FuIGFkdmFuY2UgcGFzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzbGVlcC4gRWFjaCB3cml0ZSBhc2tlZCB0aGUgV29ybGQgZm9yIHRoZSBkZWx0YSBzaW5jZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIG91ciBjdXJzb3IgYW5kIGZvbGRlZCBpdCBpbiAoc2VlIGNyZWF0ZUV2ZW50KSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgaGFzIGFscmVhZHkgaGFuZGVkIHRob3NlIGV2ZW50cyBiYWNrXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBkby4gT25seSBmZXRjaCBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGlvbnMgc3RpbGwgbWlzc2luZyBsb2NhbGx5OiBhIFdvcmxkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVzIGBzaW5jZUN1cnNvcmAsIGEgdHJ1bmNhdGVkIGRlbHRhLCBhIGNvbmN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhYnNvcmIgdGhhdCBsb3N0IHRoZSBjdXJzb3IgcmFjZSwgb3IgYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yLCB3aG9zZSByZWplY3Rpb24gY2FycmllcyBubyBkZWx0YS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiBlLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW5nV2FpdENvbXBsZXRpb25zID0gd2FpdHNUb0NvbXBsZXRlLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICFjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJXcml0ZXMuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRFdmVudC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKG1pc3NpbmdXYWl0Q29tcGxldGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBvbmx5IGV2ZW50cyBhZnRlciB0aGUgb3JpZ2luYWwgc25hcHNob3QgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBjb25jdXJyZW50IGR1cmFibGUgZXZlbnRzLCBzdWNoIGFzIGhvb2tfcmVjZWl2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZWlyIG9yZGVyaW5nIHJlbGF0aXZlIHRvIHdhaXRfY29tcGxldGVkLiBGYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIGEgZnVsbCByZWxvYWQgZm9yIG9sZGVyIHdvcmxkcyB0aGF0IGNhbm5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSB1cyBhIHN0YWJsZSBjdXJzb3IsIG9yIGlmIHRoZSBjdXJzb3IgZGVsdGEgZG9lc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGluY2x1ZGUgdGhlIHdhaXQgY29tcGxldGlvbiB0aGlzIGhhbmRsZXIganVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLmN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IgPSBuZXcgU2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F3QWxsV2FpdENvbXBsZXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nV2FpdENvbXBsZXRpb25zLmV2ZXJ5KCh3YWl0RXZlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRXYWl0SWRzQWZ0ZXJDdXJzb3IuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RXZlbnQuY29ycmVsYXRpb25JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhd0FsbFdhaXRDb21wbGV0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoYXMgaGFwcGVuZWQsIHNvIGEgcG9zaXRpb24gbm90aGluZyBvY2N1cGllcyBpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gZXZlbnQgdGhhdCBuZXZlciBvY2N1cnJlZCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2F5LiBGYWlsaW5nIGhlcmUgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIHJ1biB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0cyBpdHMgb3duIGNvcnJ1cHRpb24gYW5kIG9uZSB0aGF0IHNpbGVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB0aGUgd3JvbmcgYW5zd2VyLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBob2xlIHRoYXQgaXMgbWVyZWx5IGEgd3JpdGUgbWlkLWNvbW1pdCBmaWxscyBpbiBvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBvd24sIHNvIHNldHRsZUV2ZW50U2xvdEdhcCByZS1yZWFkcyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jbHVkaW5nLCBhbmQgYWRvcHRzIHdoaWNoZXZlciBsb2cgaXQgc2V0dGxlZCBvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTbG90R2FwQ2hlY2tFbmFibGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBzZXR0bGVFdmVudFNsb3RHYXAocnVuSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZXZlbnRMb2cuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uc2V0dGxlZC5sb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0bGVkLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFdmVudCBsb2cgZm9yIHJ1biAke3J1bklkfSBoYXMgYSBob2xlIGF0IHNsb3QgJHtzZXR0bGVkLmdhcC5maXJzdE1pc3NpbmdTbG90fTogJHtzZXR0bGVkLmdhcC5taXNzaW5nQ291bnR9IG9mIHRoZSAke3NldHRsZWQuZ2FwLm1heFNsb3R9IHNsb3RzIHVwIHRvIHRoZSBsb2cncyBtYXhpbXVtIGhvbGQgbm8gZXZlbnQuYFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRpbmcgZWxhcHNlZCB3YWl0cyByZWZyZXNoZXMgdGhlIGV2ZW50IHNuYXBzaG90LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29uY3VycmVudCBoYW5kbGVyIG1heSBoYXZlIHdyaXR0ZW4gdGhlIHRlcm1pbmFsIHJ1blxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGFmdGVyIHRoZSBpbml0aWFsIHNuYXBzaG90IGJ1dCBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheS4gT25jZSB0aGUgZXZlbnQgbG9nIHJlY29yZHMgdGhhdCBvdXRjb21lLCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgaXMgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50TG9nLmV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQtbGltaXQgZ3VhcmQ6IGZhaWwgYSBydW5hd2F5IHJ1biBvbmNlIGl0cyBsb2dcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGVzIHRoZSBzZXJ2ZXItc3VwcGxpZWQgY2VpbGluZyAodW5kZWZpbmVkIOKHkiBub1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZm9yY2VtZW50KS4gVGhlIHRocm93IGlzIGNhdWdodCBiZWxvdyBhbmQgd3JpdHRlbiBhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9mYWlsZWQgLyBNQVhfRVZFTlRTX0VYQ0VFREVELlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cy5sZW5ndGggPj0gbWF4RXZlbnRzTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXhFdmVudHNFeGNlZWRlZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHNMaW1pdFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBMYXRlbmN5IHRlbGVtZXRyeToganVkZ2UgVFRGUyBlbGlnaWJpbGl0eSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24ncyBmaXJzdCBzbmFwc2hvdC4gV2FpdHMgY29tcGxldGVkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYWxyZWFkeSBkaXNxdWFsaWZ5IHZpYSB0aGUgZXZlbnQtdHlwZSBjaGVjaywgc29cbiAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW5nIGFmdGVyIHRoZSB3YWl0IHBhc3MgaXMgZXF1aXZhbGVudC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyX3NldCBpcyBwZXJtaXR0ZWQ6IGEgcmVkZWxpdmVyeSBjYW4gbGFuZCBhZnRlciBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkIHByZS1zdGVwIGF0dHJfc2V0LCBhbmQgdGhlIGRldG91ciBpdCBtYXJrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN1YnRyYWN0ZWQgdmlhIHByZVN0ZXBBdHRyU3RhcnRNcyByZWdhcmRsZXNzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW52b2NhdGlvbiB3cm90ZSBpdCAoc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuID8/PSBldmVudExvZy5ldmVudHMuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdhdHRyX3NldCdcbiAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRDb3VudDogZXZlbnRMb2cuZXZlbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbk1vZGU6IHJldGFpbmVkU2Vzc2lvbiA/ICdyZXRhaW5lZCcgOiAncmVwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXBsYXlTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIFQzLiBgPz89YCBzbyBpdCBtYXJrcyB0aGUgRklSU1QgcmVwbGF5IHBhc3Mgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludm9jYXRpb246IGEgcmVzdW1lIHRoYXQgbmVlZHMgbW9yZSB0aGFuIG9uZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgdG8gcmVhY2ggaXRzIHN0ZXAgKGUuZy4gYSBwcmUtc3RlcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVzYCBkZXRvdXIpIHJlcG9ydHMgdGhlIGV4dHJhIHBhc3Nlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSBgcmVwbGF5YCwga2VlcGluZyB0aGUgcGhhc2VzIGFkZGl0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bWVUcmFja2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcucmVwbGF5U3RhcnRlZEF0TXMgPz89IHJlcGxheVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBldmVyeSBtaXNzaW5nIGRlY3J5cHQvZGVjb21wcmVzcyBvcGVyYXRpb24gdXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9udCAoYWxyZWFkeS1wcmVwYXJlZCBwYXlsb2FkcyBhcmUgc2tpcHBlZCkuIFdlYlxuICAgICAgICAgICAgICAgICAgICAgIC8vIENyeXB0byB3b3JrIG92ZXJsYXBzIFZNIHNldHVwIG9uIHRoZSByZXBsYXkgcGF0aCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXBwZW5kZWQgZXZlbnRzJyBjb25zdW1wdGlvbiBvbiB0aGUgcmVzdW1lIHBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3VtZXJzIHN0aWxsIGRlc2VyaWFsaXplIGFuZCByZXNvbHZlIGluIGV2ZW50IG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWRQcmV3YXJtID0gcmVwbGF5UGF5bG9hZENhY2hlLnByZXdhcm0oXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93UmVzdWx0OiBXb3JrZmxvd1Jlc3VtZVJlc3VsdCA9IHJldGFpbmVkU2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCByZXN1bWVXb3JrZmxvdyhyZXRhaW5lZFNlc3Npb24sIGV2ZW50TG9nLmV2ZW50cylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyB0eXBlOiAncmVwbGF5JyB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmtmbG93UmVzdWx0LnR5cGUgPT09ICdyZXBsYXknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSZXN1bHQgPSBhd2FpdCByZXBsYXlXb3JrZmxvdyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiB0aGUgZW5kLW9mLXJ1biBkcmFpbiBpbnNpZGUgd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uIGNvbW1pdHMgZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyBiZWZvcmUgdGhlIHRlcm1pbmFsIGBhd2FpdFJ1blJlYWR5KClgIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkQ2FwYWJpbGl0aWVzOiB3b3JsZC5jYXBhYmlsaXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGF5bG9hZFByZXdhcm07XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dSZXN1bHQudHlwZSA9PT0gJ3N1c3BlbmRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcmsgdGhlIGxpdmUgc2Vzc2lvbjsgdGhlIHN1c3BlbnNpb24gY2F0Y2ggYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIHRoZSBvbmUgcmV0ZW50aW9uIGRlY2lzaW9uIOKAlCBrZWVwIGl0IGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaXRlcmF0aW9uIG9yIGRpc2NhcmQgaXQgZm9yIGEgZnJlc2ggcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uID0gd29ya2Zsb3dSZXN1bHQuc2Vzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHdvcmtmbG93UmVzdWx0LnN1c3BlbnNpb247XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gd29ya2Zsb3dSZXN1bHQub3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IGV4ZWN1dGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogRGF0ZS5ub3coKSAtIHJlcGxheVN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTW9kZTogcmV0YWluZWRTZXNzaW9uID8gJ3JldGFpbmVkJyA6ICdyZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGNvbXBsZXRlZC4gRG8gTk9UIHJlbG9hZC1hbmQtcmV0cnkgdGhlIGNyZWF0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHBsYWNlOiBgcmVzdWx0YCB3YXMgY29tcHV0ZWQgYnkgdGhpcyByZXBsYXksIHNvIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFsZSAoNDEyKSByZWplY3Rpb24gbXVzdCBmb3JjZSBhICpmcmVzaCByZXBsYXkqICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBvYnNlcnZlIHRoZSBuZXcgZXZlbnQgYW5kIHByb2R1Y2UgYSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHQpLCBub3QgcmUtY29tbWl0IHRoZSBzdGFsZSByZXN1bHQuIFRoZSBjYXRjaCBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnRzIHRoZSByZXBsYXkgaW4tcHJvY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGEgd29ya2Zsb3cgdGhhdCBmaW5pc2hlcyB3aXRoIG5vIHN0ZXBzIHJlYWNoZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVmb3JlIHRoZSBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQ7IG9yZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgd3JpdGUgYWZ0ZXIgaXQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhd2FpdFJ1blJlYWR5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jb21wbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHsgb3V0cHV0OiByZXN1bHQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHdvcmtmbG93IHJ1biwgYnV0IHJ1biBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIG1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgd29ya2Zsb3ctZXhlY3V0aW9uIGR1cmF0aW9uIGZvciBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIG9ubHkg4oCUIGFuY2hvcnMgdGhlIGBmaW5hbFNjaGVkdWxpbmdSZXBsYXlgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgZmllbGQgYmVsb3cgKHNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcExhdGVuY3lUcmFja2luZy5yZXBsYXlNcykuIFRoaXMgaXMgdGhlIEZJTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcGFzcywgdGhlIG9uZSB0aGF0IHJlYWNoZWQgYW5kIHNjaGVkdWxlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHN0ZXA6IHZhbGlkIHJzZnMgcGF0aHMgY2FuIHJlcGxheSBtb3JlIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBzdGVwIChlLmcuIGEgd29ya2Zsb3ctYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHNldEF0dHJpYnV0ZXMoKWAgZGV0b3VyIHJlcGxheXMgdHdpY2UpLCBhbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyByZXBsYXkgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXJlbHkuIFRoaXMgdmFsdWUgaXMgTk9UIGFjY3VtdWxhdGVkIGFjcm9zc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgZWFybGllciBwYXNzZXMsIHNvIGl0IG11c3Qgbm90IGJlIHJlYWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGhlIHJlcGxheSBwb3J0aW9uIG9mIHJzZnNcIiDigJQgcnNmcyBjb3ZlcnMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIHdpbmRvdztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsU2NoZWR1bGluZ1JlcGxheSBjb3ZlcnMgb25seSB0aGlzIGxhc3QgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmVkIGhlcmUsIGJlZm9yZSBgaGFuZGxlU3VzcGVuc2lvbmAncyBhd2FpdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJL08sIHNvIGl0IGV4Y2x1ZGVzIHRoYXQgSS9PLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZHVwbGljYXRlcyB3aGF0IE9URUwgYWxyZWFkeSBjYXB0dXJlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bi9pbnZvY2F0aW9uIHNwYW4sIGJ1dCBpcyBjb2xsZWN0ZWQgYXMgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxlbWV0cnkgc28gdGhlIHNlcnZlciBjYW4gZW1pdCBpdCBhcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVU5TQU1QTEVELCBmdWxsLXBvcHVsYXRpb24gbWV0cmljOiB3b3JrZmxvdy1zZXJ2ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIHNwYW5zIGFyZSBoZWF2aWx5IHNhbXBsZWQgaW4gcHJvZHVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKH43JSksIGFuZCBjbGllbnQgc3BhbnMgY2FuJ3QgYmUgZmlsdGVyZWQgYnkgU0RLXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uLCBzbyBuZWl0aGVyIGNhbiBzZXJ2ZSBhcyB0aGUgZGFzaGJvYXJkJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0IFRURlMgZGVjb21wb3NpdGlvbi4gT24gYSByZXRhaW5lZC1WTVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHRoaXMgbWVhc3VyZXMgdGhlIHJlc3VtZSAodHlwaWNhbGx5IH4wbXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgcmVwbGF5LCBzbyB0aGUgZmllbGQncyBkaXN0cmlidXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpbW9kYWwgb25jZSByZXRlbnRpb24gaXMgYWN0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuZGVkQXRNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYXlEdXJhdGlvbk1zID0gc3VzcGVuZGVkQXRNcyAtIHJlcGxheVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIFQ0IOKAlCB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgaGFzIGJlZW4gZW5jb3VudGVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHYXRlZCBvbiB0aGUgc3VzcGVuc2lvbiBhY3R1YWxseSBzY2hlZHVsaW5nIHN0ZXBzOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdXNwZW5zaW9uIHRoYXQgb25seSBjcmVhdGVzIGhvb2tzL3dhaXRzIGhhcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZWQgYSBzdGVwLCBhbmQgYSBsYXRlciBwYXNzIG1heS4gVGFrZW4gZnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgaW5zdGFudCBhcyBgcmVwbGF5RHVyYXRpb25Nc2Agc28gVDQgY2FuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBwcmVjZWRlIFQzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nICYmIGVyci5zdGVwQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zID8/PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZEF0TXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdXb3JrZmxvdyBzdXNwZW5kZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcHM6IGVyci5zdGVwQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzOiBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0czogZXJyLndhaXRDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VzcGVuc2lvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXNwZW5zaW9uTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKHN1c3BlbnNpb25NZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVjI6IGhhbmRsZSBzdXNwZW5zaW9uIHdpdGhvdXQgcXVldWluZyBzdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVhY2ggZXZlbnQgY3JlYXRpb24gaW5zaWRlIGhhbmRsZVN1c3BlbnNpb24gY2FycmllcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNvbmRpdGlvbiBzbmFwc2hvdCBvZiB0aGUgbG9hZGVkIGV2ZW50IGxvZywgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2VuZCBob2xkaW5nIGFuIGV2ZW50IHRoaXMgcmVwbGF5IG5ldmVyIHNhdyByZWplY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd3JpdGUgKDQxMikgaW5zdGVhZCBvZiBhY2NlcHRpbmcgYSBkaXZlcmdlbnQgb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlamVjdGlvbiBpcyBoYW5kbGVkIGhlcmUsIGJ5IHJlc3RhcnRpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkg4oCUIG5ldmVyIGJ5IHJlLXBvc3RpbmcgdGhlIHNhbWUgZXZlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlID09PSAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgc3VzcGVuZGVkIGJlZm9yZSBpdHMgZXZlbnQgbG9nIHdhcyBsb2FkZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1c3BlbnNpb25SZXN1bHQ6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGhhbmRsZVN1c3BlbnNpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA+O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdCA9IGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb246IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2lsaWVudCBzdGVwIGRpc3BhdGNoOiBsZXRzIGVsaWdpYmxlIG5ld2x5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCBzdGVwcyBwdWJsaXNoIHRoZWlyIHN0ZXAtZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSAoY2FycnlpbmcgYHN0ZXBJbnB1dGApIGluIHBhcmFsbGVsIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcF9jcmVhdGVkIHdyaXRlLiBTdGVwcyBxdWV1ZWQgdGhlcmUgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYmFjayBpbiBgcXVldWVkU3RlcENvcnJlbGF0aW9uSWRzYCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcGVkIGJ5IHRoZSBkaXNwYXRjaCBwYXNzIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEaXNwYXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVOYW1lOiBnZXRXb3JrZmxvd1F1ZXVlTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFjZUNhcnJpZXI6IG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGNyZWF0ZSB3YXMgcmVqZWN0ZWQgYXMgc3RhbGU6IHJlLWRlcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nIGluIHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgc3BlbnQsIGZhbGwgYmFjayB0byBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiAoYSByZXRocm93IHJlbGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZWRlbGl2ZXJ5IG9mIGEgbWVzc2FnZSB0aGUgdHVyYm8gcGF0aCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkIOKAlCB0aGUgcnVuIHdvdWxkIHN0YWxsIGZvciB0aGUgcXVldWUncyB+MzAwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1c3BlbnNpb24tY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudDogZmFpbCB0aGUgcnVuIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZCBpdCBiYWNrIHRvIHRoZSBxdWV1ZSB0byBzcGluIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5yZXBvcnRlZEV2ZW50Q291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1bXAtYW5kLXJlcG9ydCBtZXJnZWQgZXZlbnRzIEJFTE9XIHRoZSB0YWlsIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1zb3J0ZWQgdGhlIGFycmF5IHRvIHNsb3Qgb3JkZXIsIHNoaWZ0aW5nIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIHRoZSBwcmV3YXJtIHNjYW4gaGFkIGFscmVhZHkgcmVjb3JkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJzb3IgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgYWxvbmU6IHRoZSByZXBvcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgYSBsb3dlciBib3VuZCBvbiB3aGF0IHdhcyBza2lwcGVkLCBzbyB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbCByZWFkIHN0aWxsIGhhcyB0byBjb3ZlciB0aGUgc2FtZSByYW5nZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlLnJlc2V0U2NhbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGluIHRoZSBsb2cgYXMgbG9hZGVkIGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIFRoaXMgc3VzcGVuc2lvbidzIG93biBob29rL3dhaXQgd3JpdGVzIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9UIGluIGl0IOKAlCB0aGV5IG5ldmVyIHJlYWNoIHJldGVudGlvbiBhbnl3YXksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGEgc3VzcGVuc2lvbiBjb250YWluaW5nIGEgbm9uLXN0ZXAgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHMgY2FuUmV0YWluV29ya2Zsb3dTZXNzaW9uJ3MgdHlwZSBjaGVjayBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY2FuIGlzIGNvbnN1bHRlZC4gQ29tcHV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhemlseSwgYXQgbW9zdCBvbmNlLCBhbmQgc2hhcmVkIGJldHdlZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRlbnRpb24gZGVjaXNpb24gaGVyZSBhbmQgdGhlIGRlbHRhL3R1cmJvIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyDigJQgdGhlIGF0dHItZGV0b3VyIGFuZCBob29rLWNvbmZsaWN0IHBhdGhzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4vY29udGludWUgYmVmb3JlIHRoZSBnYXRlcyBhbmQgdXN1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnQtY2lyY3VpdCBiZWZvcmUgZXZlciBzY2FubmluZyB0aGUgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3Blbkhvb2tXYWl0ID0gb25jZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50TG9nLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNpbmdsZSByZXRlbnRpb24gZGVjaXNpb246IGtlZXAgdGhlIHBhcmtlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbiBvbmx5IGFjcm9zcyBhIHB1cmUgc3RlcCBib3VuZGFyeSB3aXRoIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQtb2YtYmFuZCBjb250aW51YXRpb24gc291cmNlIGFuZCBwcm92YWJseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2l2ZSBzdGVwIGlucHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFjYW5SZXRhaW5Xb3JrZmxvd1Nlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQucmV0YWluZWRTdGVwSW5wdXRzU2FmZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuSG9va1dhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyArPSBzdXNwZW5zaW9uUmVzdWx0Lmhvb2tDcmVhdGlvbk1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9IHByZVN0ZXBCbG9ja2luZ01zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiBoYW5kbGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbk1zOiBEYXRlLm5vdygpIC0gc3VzcGVuc2lvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHM6IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHM6IHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQ/LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0hvb2tDb25mbGljdDogc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGVFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9vayBjb25mbGljdDogYnJlYWsgbG9vcCwgcmUtaW52b2tlIHZpYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHJlcGxheTogdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gcmVsb2FkcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyAobm93IGhvbGRpbmcgdGhlIGp1c3QtY29tbWl0dGVkIGF0dHJfc2V0KSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMsIHJlc29sdmluZyB0aGUgc2V0QXR0cmlidXRlcyBwcm9taXNlLiBTa2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHByb2Nlc3NpbmcgZm9yIHRoaXMgcGFzcyBzbyB0aGF0IHJlcGxheSBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByYWNlcyBmaXJzdCDigJQgaW4gUHJvbWlzZS5yYWNlKFtzZXRBdHRyaWJ1dGVzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwKCldKSwgdGhlIGR1cmFibGUgYXR0cmlidXRlIGV2ZW50IG11c3QgYmUgYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gd2luIHdpdGhvdXQgZXhlY3V0aW5nIHRoZSBsb3Npbmcgc3RlcC4gVGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFwcGVucyBpbi1wcm9jZXNzIHJhdGhlciB0aGFuIHZpYSBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB1bmxpa2UgaG9va3MgYW5kIHdhaXRzLCBhbiBhdHRyX3NldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm9kdWNlcyBubyBvdXQtb2YtYmFuZCBpbnZvY2F0aW9uIHNvdXJjZSB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciB3b3VsZCBuZWVkIHRvIHlpZWxkIHRoZSBtZXNzYWdlIGZvciwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBheWluZyBhIGRlbGl2ZXJ5IHJvdW5kLXRyaXAgaGVyZSB3b3VsZCBvbmx5IGFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBiZWZvcmUgdGhlIHdvcmtmbG93J3MgbmV4dCBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcHMgPSBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV4ZWN1dGlvbiBpcyBnYXRlZCBvbiBvd25lcnNoaXAuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB0byBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgKGBsYXp5SW5saW5lU3RlcHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJ1biB0aGVtIGlubGluZSDigJQgaW4gcGFyYWxsZWwg4oCUIHZpYSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCBldmVudHMgdGhhdCBjcmVhdGUgZWFjaCBzdGVwIG9uIHRoZSBmbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBPd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGF0b21pYyBhbmQgZXhhY3RseS1vbmUgcGVyIHN0ZXA6IHRoZSB3b3JsZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggc3RlcF9zdGFydGVkIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAo4oaSIGV4ZWN1dGVTdGVwIGBza2lwcGVkYCkgdG8gYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IGxvc2VyLCBzbyBvbmx5IG9uZSBoYW5kbGVyIGV2ZXIgcnVucyBhIGdpdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LiBFdmVyeSBvdGhlciBwZW5kaW5nIHN0ZXAga2VlcHMgaXRzIGVhZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgKGluIGBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzYCkgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1c3BlbnNpb24gaGFuZGxlciBvbmx5IGRlc2lnbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBsYXp5SW5saW5lU3RlcHNgIHdoZW4gbm8gYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHJlc2VudC4gVGhhdCBhd2FpdGVyIGNhc2UgbXVzdCBleGVjdXRlIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZTogYW4gaW5saW5lIGBhd2FpdCBleGVjdXRlU3RlcCguLi4pYCBibG9ja3MgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiwgc28gdGhlIGF3YWl0ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uICh3aGljaCBvbmx5IGFkdmFuY2VzIG9uIHRoZSBuZXh0IHJlcGxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHNlcmlhbGl6ZWQgYmVoaW5kIHRoZSBzdGVwIOKAlCBkZWZlYXRpbmcgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtmbG93IGV4cHJlc3NlZCBhcyBwYXJhbGxlbCAoZS5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGhvb2suZ2V0Q29uZmxpY3QoKS50aGVuKCgpID0+IHN0ZXBCKCkpYCByYWNpbmcgYGF3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwQSgpYCkuIEluIHRoYXQgY2FzZSBgbGF6eUlubGluZVN0ZXBzYCBpcyBlbXB0eSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHN0ZXAgaXMgcXVldWVkIGZvciByZS1pbnZvY2F0aW9uLCB3aGljaCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlciB3aGlsZSBxdWV1ZWQgc3RlcHMgcnVuIGluIHBhcmFsbGVsIGludm9jYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUlubGluZVN0ZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5sYXp5SW5saW5lU3RlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZpZWQgcXVldWUgZGlzcGF0Y2ggZm9yIGV2ZXJ5dGhpbmcgd2UgYXJlIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLWV4ZWN1dGluZy4gU3RlcHMgYXJlIHF1ZXVlZCB3aXRoIHN0ZXBJZCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyIHJ1bnMgdGhlbTsgdGhlIHdhaXQgdGltZXIgaXMgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGdlbmVyaWMgY29udGludWF0aW9uIHRoYXQgZmlyZXMgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGVsYXBzZXMgYW5kIGxldHMgdGhlIG5leHQgcmVwbGF5IG9ic2VydmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgdmlhIHRoZSBcImNvbXBsZXRlIGVsYXBzZWQgd2FpdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlIChwZXIgcGVuZGluZyBzdGVwIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzaWduYXRlZCBsYXp5LWlubGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIElubGluZS1vd25lZCwgb3duZXIgPT09IHRoaXMgbWVzc2FnZSAg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZXhlY3V0ZSBpbiBUSElTIGludm9jYXRpb24gKG93bmVkIHJlY292ZXJ5OiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkZWxpdmVyeSBvZiB0aGUgb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBpdCBjcmFzaGVkIG9uLCB2aWEgYSBwYXlsb2FkLWxlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBlZCB3aXRoIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG93bmVyTWVzc2FnZUlkIOKAlCBub3QgYSBiYXJlIHN0YXJ0KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyICE9PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVuc3VyZSBhIERFTEFZRUQgYmFja3N0b3Agd2FrZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZGVsYXlTZWNvbmRzID0gb3duZXJzaGlwIGxlYXNlIHJlbWFpbmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnN0ZWFkIG9mIGVucXVldWVpbmcgdGhlIHN0ZXAuIFRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnZvY2F0aW9uIGlzIChsaWtlbHkpIHN0aWxsIHJ1bm5pbmcgdGhlIGJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW4gaW1tZWRpYXRlIHN0ZXAgbWVzc2FnZSB3b3VsZCBiYXJlLXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJ1bm5pbmcgc3RlcCBhbmQgZXhlY3V0ZSBpdCBhIHNlY29uZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHdvcmtmbG93IzI3ODApLiBUaGUgYmFja3N0b3AgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb250aW51YXRpb24sIE5PVCBhIHN0ZXAgbWVzc2FnZTogd2hlbiBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGZpcmVzLCB0aGlzIHNhbWUgZGVjaXNpb24gdGFibGUgaGFuZGxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdoYXRldmVyIHN0YXRlIHRoZSBzdGVwIGlzIGluIGJ5IHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAodGVybWluYWwg4oaSIG5vdGhpbmcgcGVuZGluZzsgcXVldWUtb3duZWQgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3JldHJ5aW5nIOKGkiBub3JtYWwga2V5ZWQgZGlzcGF0Y2g7IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGVhZCB3aXRoIGxlYXNlIGV4cGlyZWQg4oaSIGltbWVkaWF0ZSBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmVzZXJ2aW5nIHN0ZXAtbGV2ZWwgZmFpbHVyZSBzZW1hbnRpY3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9pc29uIHN0ZXBzOyBsZWFzZSByZWZyZXNoZWQgYnkgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWNvdmVyeSDihpIgcmUtYXJtKS4gVGhlIGJhY2tzdG9wJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpZGVtcG90ZW5jeUtleSBpcyBzY29wZWQgdG8gdGhlIG93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEVQT0NIIChsYXRlc3Qgc3RlcF9zdGFydGVkIHRpbWVzdGFtcCksIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGp1c3QgdGhlIGNvcnJlbGF0aW9uIElELCBhbmQgbXVzdCBuZXZlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBzdGVwIG1lc3NhZ2UncyBvd24ga2V5IOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5IGZvciBib3RoIGludmFyaWFudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZml4ZWQga2V5cyBlaXRoZXIgYWJzb3JiIHRoZSByZXRyeSBoYW5kb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3IgZGVkdXBlIHRoZSByZWZyZXNoZWQtbGVhc2UgcmUtYXJtIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgaW4tZmxpZ2h0IGJhY2tzdG9wIGl0c2VsZikuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gTm90IG93bmVkIChuZXZlciBzdGFtcGVkIC8gZWFnZXIgLyBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsYXBzZWQgYXQgc3RlcF9yZXRyeWluZyAvIGxlYXNlIGV4cGlyZWQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGtpbGwtc3dpdGNoZWQpIOKGkiBpbW1lZGlhdGUgZW5xdWV1ZSwgZXhhY3RseSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlZm9yZS4gVGhpcyBjb3ZlcnMgY3Jhc2ggcmVjb3Zlcnk6IGlmIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZCBidXQgY3Jhc2hlZCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBxdWV1ZWluZywgYSBsYXRlciBoYW5kbGVyIHF1ZXVlcyBpdDsgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcC1pZGVudGl0eS1zY29wZWQgaWRlbXBvdGVuY3lLZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZHVuZGFudCBxdWV1ZXMgYWNyb3NzIGNvbmN1cnJlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3NlcyDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZU93bmVyc2hpcCA9IGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hOb3dNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZFJlY292ZXJ5U3RlcHM6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtW10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYWNrc3RvcFdha2VzQXJtZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIGhhbmQtb2ZmLiBUaGUgbWVhc3VyZW1lbnQgbWF5IG9ubHkgZ28gdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkgQVRURU1QVCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBzdGVwLCBhbmQgdGhlIGxvb3AgYmVsb3cgaXMgd2hhdCBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aG9zZSBhcmUg4oCUIHNvIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBjbGFzc2lmaWNhdGlvbiwgbmV2ZXIgYWhlYWQgb2YgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIGtlZXBzIHRoZSB0cmFja2luZyB3aGVuZXZlciBpdCB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gc29tZXRoaW5nIGl0c2VsZjogYSBkZWZlcnJlZCBsYXp5LWlubGluZSBzdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYW4gb3duZWQtcmVjb3Zlcnkgc3RlcCAoYSByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0aW5nIHRoZSBzdGVwIGl0IGNyYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uKS4gQm90aCBsYW5kIGluIGBpbmxpbmVFeGVjdXRpb25zYCBiZWxvdyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgaXQgdGhlcmUuIE9ubHkgd2hlbiBuZWl0aGVyIGV4aXN0cyBpcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIHRoZSBGSVJTVCBzdGVwIHRoaXMgaW52b2NhdGlvbiBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5xdWV1ZXMgYXMgYSBzdGVwIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGVwIGNvbnZlcnRlZCBpbnRvIGEgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1QgYW4gYXR0ZW1wdCDigJQgdGhlIHdha2UgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiwgYW5kIHdoaWNoZXZlciBpbnZvY2F0aW9uIGV2ZW50dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIHN0ZXAgaXMgYSBkaWZmZXJlbnQgZGVsaXZlcnkg4oCUIHNvIGl0IG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0YWtlIHRoZSBzYW1wbGUuIElmIGV2ZXJ5IHBlbmRpbmcgc3RlcCBiZWNvbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGJhY2tzdG9wLCBub3RoaW5nIGhlcmUgYXR0ZW1wdHMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1wdGlvbiBnb2VzIHVucmVwb3J0ZWQsIHdoaWNoIGlzIHRoZSBob25lc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWUgcmF0aGVyIHRoYW4gYSB0b3RhbCBhdHRyaWJ1dGVkIHRvIHdvcmsgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgbmV2ZXIgZGlkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhdGVkIG9uIHRoZXJlIGJlaW5nIGEgbWVhc3VyZW1lbnQgdG8gcGxhY2UgYXQgYWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYCYmYCBzaG9ydC1jaXJjdWl0cywgc28gYSBkZWxpdmVyeSBjYXJyeWluZyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tpbmcg4oCUIGV2ZXJ5IG5vbi1yZXN1bWUgZGVsaXZlcnksIGFuZCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHBhc3QgdGhlIHN0ZXAgdGhhdCBjb25zdW1lZCBpdCDigJQgbmV2ZXIgcGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBwZW5kaW5nLXN0ZXAgc2Nhbi4gVGhhdCBtYXR0ZXJzIG9uIHdpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbi1vdXRzLCB3aGVyZSBgcGVuZGluZ1N0ZXBzYCBydW5zIHRvIGh1bmRyZWRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhbmRPZmZSZXN1bWVUaW1pbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXBlbmRpbmdTdGVwcy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGVwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVPd25lcnNoaXAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5vd25lck1lc3NhZ2VJZCA9PT0gbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgcHVibGlzaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNpbGllbnQgZGlzcGF0Y2ggKGNyZWF0ZSArIHF1ZXVlIGluIHBhcmFsbGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGNhcnJ5aW5nIGBzdGVwSW5wdXRgKS4gQSByZS1wdWJsaXNoIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZGVkdXBlIG9uIHRoZSBpZGVtcG90ZW5jeSBrZXkgYW55d2F5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgd2FzdGVkIHJvdW5kLXRyaXAuIE93bmVyc2hpcCBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIHRvIHRoZXNlOiB0aGV5IHdlcmUgY3JlYXRlZCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXBfc3RhcnRlZCBzdGFtcCBjYW4gZXhpc3QgeWV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5xdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHMuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lcnNoaXBBY3RpdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU93bmVyc2hpcCAmJiBpc1N0ZXBPd25lcnNoaXBBY3RpdmUoc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLm93bmVyTWVzc2FnZUlkID09PSBtZXRhZGF0YS5tZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duZWQgcmVjb3Zlcnk6IHRoaXMgZGVsaXZlcnkgSVMgdGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2U7IHJlLWV4ZWN1dGUgdGhlIHN0ZXAgaW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gaW5zdGVhZCBvZiBxdWV1ZWluZyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMucHVzaChzdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxheWVkIGJhY2tzdG9wIHdha2Ugd2hpbGUgYW5vdGhlciBpbnZvY2F0aW9uJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIGxlYXNlIGlzIGxpdmU7IGltbWVkaWF0ZSBzdGVwIGVucXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIChsZWFzZSBleHBpcmVkIOKHkiByZW1haW5pbmcgMCDih5Igc2FtZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RheSwgd2hpY2ggaXMgYWxzbyB0aGUgZGVncmFkZWQgbW9kZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGRzIHdpdGggdW5zdGFibGUgbWVzc2FnZSBJRHMg4oCUIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhYm92ZSBuZXZlciBtYXRjaGVzIHRoZXJlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja3N0b3BEZWxheVNlY29uZHMgPSBvd25lcnNoaXBBY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMoc3RlcCwgZGlzcGF0Y2hOb3dNcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrc3RvcERlbGF5U2Vjb25kcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BlbmRpbmcgc3RlcCBpcyBpbmxpbmUtb3duZWQgYnkgYSBsaXZlIGludm9jYXRpb247IGVuc3VyaW5nIGRlbGF5ZWQgYmFja3N0b3Agd2FrZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZSByZXF1ZXVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogc3RlcC5vd25lck1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BEZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IGJhY2tzdG9wRGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBiYWNrc3RvcElkZW1wb3RlbmN5S2V5KHN0ZXApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0ZXAgSVMgYmVpbmcgYXR0ZW1wdGVkLCBieSB0aGUgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHBpY2tzIHRoZSBtZXNzYWdlIHVwLiBDb25zdW1lIHRoZSB0cmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIOKAlCB0aGUgZmlyc3Qgc3VjaCBzdGVwIGFuZCBubyBvdGhlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFJlc3VtZVRpbWluZyA9IGhhbmRPZmZSZXN1bWVUaW1pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VtZVRpbWluZ0Zvck1lc3NhZ2UocmVzdW1lVHJhY2tpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdW1lVGltaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZE9mZlJlc3VtZVRpbWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBSZXN1bWVUaW1pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgaG9va1Jlc3VtZVRpbWluZzogc3RlcFJlc3VtZVRpbWluZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwLWlkZW50aXR5LXNjb3BlZDogZGVkdXBlcyBhZ2FpbnN0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIGRpc3BhdGNoIG9mIFRISVMgc3RlcCAoY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVycywgY3Jhc2gtcmVjb3ZlcnkgcmUtZGlzcGF0Y2gsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIncyByZXNpbGllbnQgcHVibGlzaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBhYnNvcmJpbmcgYSBkaXNwYXRjaCBvZiBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHVuZGVyIGEgcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc3RlcE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChkaXNwYXRjaGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNldCBvZiBzdGVwcyBUSElTIGludm9jYXRpb24gZXhlY3V0ZXM6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXJyZWQgbGF6eS1pbmxpbmUgYmF0Y2ggcGx1cyBhbnkgb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzICh0aGlzIG1lc3NhZ2UncyByZWRlbGl2ZXJ5IHJlLWV4ZWN1dGluZyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGl0IGNyYXNoZWQgb24g4oCUIG5vIGxhenlTdGVwSW5wdXQ7IHRoZSBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0ZXMgZnJvbSB0aGUgc3RlcCBlbnRpdHkgbGlrZSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCwgYW5kIHRoZSBwYXlsb2FkLWxlc3Mgc3RlcF9zdGFydGVkIHJlLXN0YW1wc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIOKAlCB1bmxpa2UgdGhlIGJhY2tncm91bmQgcGF0aCdzIHN0YXJ0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBOT1QgYmFyZTogaXQgY2FycmllcyB0aGlzIG1lc3NhZ2Unc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJNZXNzYWdlSWQsIHdoaWNoIGlzIGFsc28gd2hhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHJldHJ5IGNlaWxpbmcgY291bnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUV4ZWN1dGlvbnM6IEFycmF5PHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0PzogKHR5cGVvZiBsYXp5SW5saW5lU3RlcHMpW251bWJlcl1bJ2RlaHlkcmF0ZWRJbnB1dCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgfT4gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMuZGVoeWRyYXRlZElucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm93bmVkUmVjb3ZlcnlTdGVwcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIHRlbGVtZXRyeSAoZGVzaWduIGRvYyBQaGFzZSA3KTogc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlcyBzbyBwcm9kdWN0aW9uIHRyYWNlcyBzaG93IHdoZW4gY3Jhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5IHJhbiBvciBhIHdha2Ugd2FzIGNvbnZlcnRlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wLCBhbmQgYSB3YXJuIChhbHdheXMgcHJpbnRlZCwgdW5saWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Zy9pbmZvKSBmb3Igb3duZWQgcmVjb3Zlcnkg4oCUIGl0IG1lYW5zIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSBkaWVkIG1pZC1zdGVwLWJvZHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ob3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93T3duZWRSZWNvdmVyeVN0ZXBzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJhY2tzdG9wV2FrZXNBcm1lZCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93QmFja3N0b3BXYWtlc0FybWVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZS1leGVjdXRpbmcgaW5saW5lIHN0ZXBzIG93bmVkIGJ5IHRoaXMgcXVldWUgbWVzc2FnZSDigJQgYSBwcmV2aW91cyBkZWxpdmVyeSBjcmFzaGVkIG1pZC1ib2R5IGFuZCB0aGlzIHJlZGVsaXZlcnkgaXMgcmVjb3ZlcmluZyB0aGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IG93bmVkUmVjb3ZlcnlTdGVwcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzKSA9PiBzLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGV4ZWN1dGUgaW5saW5lIOKAlCBldmVyeXRoaW5nIGhhcyBiZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgKG9yIG5vIHdvcmsgbmVlZHMgc2NoZWR1bGluZykuIEV4aXQgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGRyaXZlIHN1YnNlcXVlbnQgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVFeGVjdXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGBob29rLmdldENvbmZsaWN0KClgIGF3YWl0ZXIgbmVlZHMgYW4gaW1tZWRpYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWludm9jYXRpb246IHRoZSByZXBsYXkgY29uc3VtZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QtY29tbWl0dGVkIGhvb2tfY3JlYXRlZCBhbmQgcmVzb2x2ZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZXIuIFdpdGhvdXQgaXQgKG5vIGlubGluZSBzdGVwLCBhbGwgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgb3Igbm9uZSBwZW5kaW5nKSB0aGUgcnVuIHdvdWxkIHNpdCBpZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudGlsIHNvbWUgdW5yZWxhdGVkIG1lc3NhZ2Ugd29rZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gaG9va3Mvd2FpdHMgYXJlIGNvbnN1bHRlZCBieSBhbGwgdGhyZWUgZ2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93OyByZXNvbHZlIHRoZSBtZW1vaXplZCBzY2FuIG9uY2UgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wZW5Ib29rV2FpdFN0YXRlID0gb3Blbkhvb2tXYWl0LnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtZGVsdGEgZmFzdCBwYXRoIGdhdGUuIFdlIHJlcXVlc3QgdGhlIGRlbHRhIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG9uIHRoZSBuZXh0IGl0ZXJhdGlvbiBjb25zdW1lIGl0IGluIHBsYWNlIG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qg4oCUIG9ubHkgd2hlbiBBTEwgaG9sZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXZSBoYXZlIGEgcmVhbCBwcmlvciBjdXJzb3IgdG8gZGlmZiBhZ2FpbnN0IChhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBXb3JsZCBtYXkgcmV0dXJuIG5vbmUgb24gdGhlIGluaXRpYWwgbG9hZCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBUaGlzIGlzIHRoZSBjbGVhbiBzaW5nbGUtc3RlcCBzZXF1ZW50aWFsIGNhc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGlzIHN1c3BlbnNpb24gcHJvZHVjZWQgZXhhY3RseSBvbmUgc3RlcCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdhaXRzIChgZXJyLntzdGVwLHdhaXR9Q291bnRgKSwgdGhhdCBvbmUgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGxvbmUgcGVuZGluZyBzdGVwIChgcGVuZGluZ1N0ZXBzLmxlbmd0aCA9PT0gMWApXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbmQgdGhlIGxvbmUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMWAg4oCUIG5vIHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzaWJsaW5ncyBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycywgYW5kIG5vIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpbmxpbmUgc3RlcCB3cml0aW5nIGl0cyBvd24gZXZlbnRzIG91dCBvZiBiYW5kKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIE5vIHBlbmRpbmcgd2FpdCB0aW1lciBmcm9tIFRISVMgc3VzcGVuc2lvbiwgYW5kIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvcGVuIHdhaXQgaW4gdGhlIGN1bXVsYXRpdmUgbG9nLiBBIGB3YWl0X2NvbXBsZXRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIGEgcmVzb2x1dGlvbiB0aGUgcmVwbGF5IGlzIHdhaXRpbmcgb24gcmF0aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGFuIGFuIGV2ZW50IGl0IGNhbiBvYnNlcnZlIG9uZSBpdGVyYXRpb24gbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNvIGNvbnN1bWluZyBhIGRlbHRhIHRoYXQgcHJlZGF0ZXMgaXQgd291bGQgc2V0dGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgc2xlZXAgZnJvbSBhIHZpZXcgdGhhdCBkb2VzIG5vdCBjb250YWluIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29tcGxldGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIEFuIG9wZW4gKG9yIHRoaXMtc3VzcGVuc2lvbi1jcmVhdGVkKSBob29rIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmaW5lLCBhbmQgdGhhdCBpcyB0aGUgZ2F0ZSB0aGlzIHVzZWQgdG8gY2FycnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBUaGUgZGVsdGEgc25hcHNob3RzIHRoZSBsb2cgYXQgdGhlIHN0ZXBfY29tcGxldGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3cml0ZSBidXQgaXMgY29uc3VtZWQgb24gdGhlIG5leHQgcmVwbGF5LCBzbyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgYGhvb2tfcmVjZWl2ZWRgIGxhbmRpbmcgaW4gdGhhdCB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIGFic2VudCBmcm9tIHRoZSBkZWx0YSBhbmQgb2JzZXJ2ZWQgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdGVyYXRpb24gbGF0ZXIgdGhhbiBhIHJlYWwgZmV0Y2ggd291bGQgb2JzZXJ2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXQuIFRoYXQgc3RhbGVuZXNzIGlzIHF1YWxpdGF0aXZlbHkgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHJlYWQtdG8td3JpdGUgcmFjZSB0aGUgZmV0Y2ggcGF0aCBhbHJlYWR5IGhhcyAoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGV2ZW50IGNhbiBsYW5kIHJpZ2h0IGFmdGVyIGBldmVudHMubGlzdGAgcmV0dXJuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYW5kIGJlZm9yZSB0aGUgc3VzcGVuc2lvbidzIHdyaXRlcyksIGFuZCBpdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgYm91bmRlZCBieSB0aGUgc2FtZSB0aGluZzogd2hhdCBhIHN0YWxlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaG9sZHMgaXMgYSAqcHJlZml4KiBvZiB0aGUgbG9nLCBuZXZlciBhIGhvbGUgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0LCBhbmQgcmVwbGF5aW5nIGEgcHJlZml4IHR3aWNlIHJlYWNoZXMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRlY2lzaW9ucy4gSXRzIG5leHQgd3JpdGUgaXMgYWxsb2NhdGVkIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3aGF0ZXZlciBpdCBtaXNzZWQgYW5kIGNvbWVzIGJhY2sgY2FycnlpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChgcmVwb3J0U2tpcHBlZFNsb3RzYCBvbiB0aGUgbG9jYWwgd29ybGRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY29tbWl0LXRpbWUgYWxsb2NhdGlvbiBvbiB0aGUgVmVyY2VsIG9uZSksIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVwbGF5IGNvcnJlY3RzIGl0c2VsZiBvbiB0aGUgd3JpdGUgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9uIGEgcmVhZC4gQSBXb3JsZCBNQVkgaW5zdGVhZCByZWZ1c2UgdGhlIHdyaXRlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBzdGFsZSAoNDEyKSwgd2hpY2ggdGhlIHJ1bnRpbWUgaGFuZGxlcyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2F5OyBub3RoaW5nIHJlcXVpcmVzIGl0IHRvLiBIb29rcyBjcmVhdGVkIGJ5IFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHN1c3BlbnNpb24gYXJlIGluc2lkZSB0aGUgZGVsdGEgKHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBgaG9va19jcmVhdGVkYCBsYW5kcyBiZWZvcmUgdGhlIHN0ZXAtdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdyaXRlKSwgc28gb25seSB0aGVpciBgaG9va19yZWNlaXZlZGAgcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhcmUgc3ViamVjdCB0byB0aGUgc2FtZSB3aW5kb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBXaXRoIG5vIGhvb2sgb3Igd2FpdCBvcGVuIGF0IGFsbCwgdGhlIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG91dC1vZi1iYW5kIHdyaXRlciBpcyBjYW5jZWxsYXRpb24sIHdoaWNoIGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRvIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLiBTZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW5Ib29rQW5kV2FpdFN0YXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSBzdGVwIHJ1bnMgaW5saW5lLCBlYWNoIHdyaXRlcyBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93biBldmVudHMgYW5kIHRoZSBwZXItd3JpdGUgZGVsdGEgd291bGQgYmUgcGFydGlhbCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWx0YSBpcyBub3QgcmVxdWVzdGVkICh0aGUgZ2F0ZSBiZWxvdyBpcyBmYWxzZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpLXN0ZXApIGFuZCB0aGUgbmV4dCBpdGVyYXRpb24gZG9lcyBhIG5vcm1hbCBmZXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RJbmxpbmVEZWx0YSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBldmVudExvZy5jdXJzb3IgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5zdGVwQ291bnQgPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3BlbldhaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWxlLXNlbnNpdGl2ZSBiYXRjaDogYSBob29rIGlzIG9wZW4gaW4gdGhlIHJ1biAob3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBjcmVhdGVkIGJ5IHRoaXMgc3VzcGVuc2lvbiwgc28gaXRzIGhvb2tfcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBsYW5kIGFueSBtb21lbnQpIOKAlCBhbiBvdXQtb2YtYmFuZCBldmVudCBjYW4gbWFrZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZpZXcgdGhpcyBiYXRjaCB3YXMgc2NoZWR1bGVkIGZyb20gc3RhbGUsIHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB3aGVuIHNldmVyYWwgaW52b2NhdGlvbnMgcmFjZSBmb3Igb25lIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0uIE9wdGltaXN0aWMgc3RhcnQgYmVnaW5zIHRoZSBib2R5IGJlZm9yZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltIHNldHRsZXMsIHNvIHRoZSB3cml0ZXIgdGhhdCBMT1NFUyB0aGUgY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChgRW50aXR5Q29uZmxpY3RFcnJvcmAg4oaSIGBza2lwcGVkYCkgaGFzIGFscmVhZHkgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGNvZGUgaXQgZG9lcyBub3Qgb3duLiBTdXBwcmVzcyBpdCBmb3IgdGhlc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoZXMsIHNvIHRoZSBib2R5IHJ1bnMgb25seSBhZnRlciB0aGUgY2xhaW0gY2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB3b24uIENvc3RzIG9uZSBjbGFpbSByb3VuZC10cmlwIHBlciBzdGVwIHdoaWxlIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvb2sgaXMgb3BlbiwgYW5kIGJ1eXMgdGhlIHNhbWUgdGhpbmcgb24gZXZlcnkgV29ybGQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN0ZXAgYm9keSBleGVjdXRlcyBvbmNlIHBlciBjbGFpbSwgbm90IG9uY2UgcGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByYWNlci4gKEEgV29ybGQgdGhhdCByZWZ1c2VzIHRoZSBjbGFpbSBhcyBzdGFsZSAoNDEyKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0cyB0aGUgc2FtZSBwcm90ZWN0aW9uIHRocm91Z2ggdGhlIHNhbWUgYXdhaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub25lIG9mIHRoZSBzaGlwcGVkIG9uZXMgZG9lcyB0aGF0IGZvciBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90LW51bWJlcmVkIHJ1bi4pXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwcmVzc09wdGltaXN0aWNTdGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5Ib29rV2FpdFN0YXRlLm9wZW5Ib29rIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm8gbW9kZSBmb3JjZXMgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoIOKAlCBidXQgb25seSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIFwiY2xlYW5cIiAoYSBwdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHN1c3BlbnNpb24pLiBUaGUgbW9tZW50IGEgaG9vayBvciB3YWl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkLCBsYXRlciByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYmVjb21lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSwgc28gdGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZWQgb3B0aW1pc3RpYyBzdGFydCBzYWZlIG5vIGxvbmdlciBob2xkcyDigJQgdHVyYm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXRzIGFuZCB0aGUgc3RlcHMgdGFrZSB0aGUgbm9ybWFsIChlbnYtZ2F0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdC10aGVuLXJ1biBwYXRoLiBUaGUgaG9vay1jb25mbGljdCBjYXNlIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGVhcmx5IGFib3ZlLCB0aGUgYXR0ciBjYXNlIGNvbnRpbnVlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIHJlcGxheSAoc28gYSBiYXRjaC1zY2hlZHVsaW5nIHN1c3BlbnNpb24gbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZXMgYXR0ciBldmVudHMpLCBhbmQgdGhlIGF3YWl0ZWQtaG9vayBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0aWVkIGxhenlJbmxpbmVTdGVwczsgdGhlIGNoZWNrcyBiZWxvdyBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmVuc2l2ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYHN1c3BlbnNpb25SZXN1bHQuKmAgZmxhZ3Mgb25seSByZWZsZWN0IHdoYXQgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2ggY3JlYXRlZCwgc28gdGhleSBkbyBub3QgY2F0Y2ggYSBob29rL3dhaXQgb3BlbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhbiBlYXJsaWVyIGl0ZXJhdGlvbiBvZiB0aGUgc2FtZSBkZWxpdmVyeSAoZS5nLiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlLWFuZC1mb3JnZXQgYGNyZWF0ZUhvb2soLi4uKWAgdGhhdCBkb2Vzbid0IGJsb2NrIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3csIGxldHRpbmcgdGhlIHJlcGxheSBsb29wIGNvbnRpbnVlIHRvIGxhdGVyIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbnMpLiBPbmNlIGFueSBob29rIG9yIHdhaXQgaXMgb3BlbiBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1bXVsYXRpdmUgbG9nLCByZXN1bWUvcGFyYWxsZWwgaW52b2NhdGlvbnMgYXJlIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biwgc28gdHVyYm8gbXVzdCBsYXRjaCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcm1hbmVudGx5IOKAlCBjaGVja2VkIGhlcmUgdmlhIGBvcGVuSG9va0FuZFdhaXRTdGF0ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIGN1bXVsYXRpdmUgZXZlbnQgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGBXT1JLRkxPV19TRVFVRU5USUFMX1JFUExBWVM9MWAgKHBlci1ydW4gZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9waWNzIGNvbnN1bWVkIHdpdGggYG1heENvbmN1cnJlbmN5OiAxYCkgd291bGQgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW5jaXBsZSB3YWl2ZSB0aGlzIGxhdGNoIOKAlCBzZXJpYWxpemVkIG9yY2hlc3RyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbnMgcmVzdG9yZSB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdob2xlIGRlbGl2ZXJ5LiBUaGUgd2FpdmVyIGlzIGludGVudGlvbmFsbHkgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlbjogdGhlIGVudiB2YXIgaXMgYSBydW50aW1lLXByb2Nlc3Mgc2V0dGluZyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgcHJvdmUgdGhlIEJVSUxUIGZsb3cgdHJpZ2dlciBhY3R1YWxseSBjYXJyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbWF4Q29uY3VycmVuY3k6IDFgIChpdCBtdXN0IGJlIHNldCBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b28sIGFuZCBzb21lIGludGVncmF0aW9ucyB3cml0ZSB0aGVpciBvd24gdHJpZ2dlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlnKSwgYW5kIGBjYXBhYmlsaXRpZXMubWF4Q29uY3VycmVuY3lgIG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmVzIHF1ZXVlIHN1cHBvcnQsIG5vdCBkZXBsb3llZCBjb25maWd1cmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW50aWwgdGhlIGJ1aWxkIGVtaXRzIGEgdmVyaWZpYWJsZSBzaWduYWwgdGhhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGxveWVkIHRyaWdnZXIgaXMgc2VyaWFsaXplZCwgdGhlIGNvbnNlcnZhdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0Y2ggc3RheXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JjZU9wdGltaXN0aWNTdGFydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0F3YWl0ZWRIb29rQ3JlYXRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5Ib29rICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgaW5saW5lIHN0ZXBzIGluIHBhcmFsbGVsLiBUaGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWRnZXQgaXMgcGF1c2VkIGZvciB0aGUgd2hvbGUgYmF0Y2gg4oCUIHN0ZXAgZHVyYXRpb24gaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdW5kZWQgYnkgdGhlIHBsYXRmb3JtJ3MgZnVuY3Rpb24gbWF4RHVyYXRpb24sIG5vdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSB0aW1lb3V0IOKAlCBzbyB0aGUgYnVkZ2V0IGNoZWNrIGF0IHRoZSB0b3Agb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGxvb3AgaXRlcmF0aW9uIGRvZXNuJ3QgY2hhcmdlIHRoZSBzdGVwIGJvZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5OiBkZWNpZGUgd2hldGhlciB0aGlzIGJhdGNoJ3MgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcXVhbGlmaWVzIGZvciBUVEZTL1NUU08gbWVhc3VyZW1lbnQuIE9ubHkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCdzIGZpcnN0IHN0ZXAgY2FycmllcyB0aGUgdHJhY2tpbmcgc28gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYWxsZWwgYmF0Y2ggZW1pdHMgb25lIHNhbXBsZSBwZXIgc2NoZWR1bGluZyBnYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgb25lIHBlciBzaWJsaW5nLiBUdXJibydzIHN5bnRoZXNpemVkIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgaGFzIGEgbG9jYWwtY2xvY2sgY3JlYXRlZEF0LCBzbyB1bmRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHVyYm8gb25seSB0aGUgcnVuLWlkIFVMSUQgdGltZXN0YW1wIGlzIHRydXN0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXRlbmN5VHJhY2tpbmcgPSBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW4gPT09IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkNyZWF0ZWRBdE1zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkQ3JlYXRlZEF0KHJ1bklkKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXJibyA/IHVuZGVmaW5lZCA6ICt3b3JrZmxvd1J1bi5jcmVhdGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNczogcmVwbGF5RHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nTXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdXNwZW5zaW9uJ3Mgb3duIGhvb2svd2FpdCB3cml0ZXMgYXJlIG5vdCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9hZGVkIGV2ZW50IGxvZyB5ZXQsIHNvIHJlcG9ydCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25IYXNXYWl0czpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkNyZWF0ZWRIb29rczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuaG9va0NvdW50ID4gMCB8fCBzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJvLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNsb3Qgc25hcHNob3QgZm9yIHRoZSBpbmxpbmUgc3RlcF9zdGFydGVkIGNsYWltczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IGNsYWltIGlzIHRoZSBmaXJzdCBkdXJhYmxlIHdyaXRlIG9mIGEgaG90LXBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGl0cyBzdGVwX2NyZWF0ZWQgaXMgZGVmZXJyZWQpLCBzbyB3aXRob3V0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGl0IHdvdWxkIG5hbWUgbm8gcG9zaXRpb24gYXQgYWxsIGFuZCBhIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgY291bGQgY2xhaW0g4oCUIGFuZCBjb21taXQg4oCUIGEgc3RlcCBzY2hlZHVsZWQgb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHZpZXcgdGhhdCBtaXNzZXMgYW4gZXZlbnQgaXQgbmV2ZXIgbG9hZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRha2VuIGhlcmUgcmF0aGVyIHRoYW4gaW5zaWRlIHRoZSBleGVjdXRvciBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSB2aWV3IHRoZSBzY2hlZHVsaW5nIGRlY2lzaW9uIHdhcyBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZ2FpbnN0LiBUaGUgZXhlY3V0b3IgYWR2YW5jZXMgZnJvbSBpdCBhcyBpdHMgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgbGFuZDsgc2VlIGBzbG90U25hcHNob3RgIGluIHN0ZXAtZXhlY3V0b3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDbGFpbVNuYXBzaG90ID0gc2xvdFNuYXBzaG90UGFyYW1zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRUUjogY29uc3VtZWQgYnkgdGhpcyBiYXRjaC4gRXZlcnkgc3RlcCBpcyBoYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTQU1FIHRyYWNraW5nIG9iamVjdCBhbmQgaXRzIG9uZS1zaG90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgcmVwb3J0ZWRgIGxhdGNoIHBpY2tzIHRoZSBzaW5nbGUgc3RlcCB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSByZWFjaGVzIHVzZXIgY29kZSDigJQgc28gdGhlIHNhbXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Vydml2ZXMgdGhlIGJhdGNoJ3MgZmlyc3Qgc3RlcCBsb3NpbmcgaXRzIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlLWNsYWltIHRvIGEgY29uY3VycmVudCBpbnZvY2F0aW9uIHdoaWxlIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpYmxpbmcgcnVucywgd2l0aG91dCBhIHBhcmFsbGVsIGJhdGNoIHJlcG9ydGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBwZXIgc2libGluZy4gQ2xlYXJlZCBoZXJlIHNvIGEgbGF0ZXIgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0aW9uJ3Mgc3RlcHMg4oCUIGFuZCBhbnkgaW4tcHJvY2VzcyByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQg4oCUIGNhbm5vdCByZXBvcnQgdGhlIHNhbWUgcmVzdW1wdGlvbiBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoUmVzdW1lVHJhY2tpbmcgPSByZXN1bWVUcmFja2luZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0czogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgZXhlY3V0ZVN0ZXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA+W107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwRXhlY3V0aW9uUHJvbWlzZXMgPSBpbmxpbmVFeGVjdXRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHN0ZXBJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgbnVtYmVyID0gcHJpb3Igc3RlcF9zdGFydGVkIGNvdW50ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhpcyBleGVjdXRpb24ncyBzdGFydCksIGNvdW50aW5nIG9ubHkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duIHN0YXJ0czogdGhlIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgYm91bmRzIGhvdyBtYW55IHRpbWVzIHRoaXMgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmUtcnVucyBhIHN0ZXAgaXQgY3Jhc2hlZC90aW1lZCBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24sIGFuZCBlYWNoIG9mIHRob3NlIChyZSlzdGFydHMgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhLm1lc3NhZ2VJZC4gU3RhcnRzIHdyaXR0ZW4gYnkgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIChzdGFsZS93YWtlIHJlcGxheXMsIGEgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGRpc3BhdGNoZWQgb2ZmIGEgbG9zdCBjcmVhdGUtY2xhaW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IG90aGVyIElEcyDigJQgb3Igbm9uZSDigJQgYW5kIG11c3Qgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50LCBvciB0aGUgY2VpbGluZyBmYWxzZWx5IGV4aGF1c3RzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeSBzdGVwIChzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24gKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGVycyB0aGUgYmF0Y2ggb25seSB3aGVuIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgeWV0KSwgc28gaXQgaGFzIHplcm8gcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGFuZCBpcyBhbHdheXMgYXR0ZW1wdCAxIOKAlCBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2NhbiBlbnRpcmVseS4gT25seSBhbiBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1ydW4gY2FuIGhhdmUgcHJpb3Igc3RhcnRzLCBhbmQgdGhhdCBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY29tbW9uLCBzbyByZXNlcnZlIHRoZSBPKG4pIHNjYW4gZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHdhbGtpbmcgdGhlIGdyb3dpbmcgbG9nIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBpbmxpbmUgc3RlcCAod2hpY2ggd291bGQgYmUgTyhuwrIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyBhIGxvbmcgc2VxdWVudGlhbCB3b3JrZmxvdykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdvd25lZEJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW5saW5lIHN0YXJ0OiBzZW5kIHRoZSBkZWZlcnJlZCBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgb24gc3RlcF9zdGFydGVkIHNvIHRoZSB3b3JsZCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIG9uIHRoZSBmbHkuIEFic2VudCBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZWQtcmVjb3Zlcnkgc3RlcHMsIHdob3NlIGlucHV0IGh5ZHJhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGV4aXN0aW5nIHN0ZXAgZW50aXR5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmxhenlTdGVwSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBvd25lcnNoaXA6IHN0YW1wIChvciByZS1zdGFtcCkgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uJ3MgcXVldWUgbWVzc2FnZSBJRCBvbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkLCBzbyB3YWtlIHJlcGxheXMgc2VlIHRoZSBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGluIGZsaWdodCBoZXJlIGFuZCBzdXBwcmVzcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHJlcXVldWUgKHdvcmtmbG93IzI3ODApLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogZm9yY2Ugb3B0aW1pc3RpYyBzdGFydCBhbmQgaG9sZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF6eSBzdGVwX3N0YXJ0ZWQgdW50aWwgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBsYW5kcyAodGhlIGJvZHkgc3RpbGwgcnVuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSkuIEJvdGggYXJlIHVuZGVmaW5lZC9mYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIHR1cmJvLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU9wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR3VhcmQtZW5mb3JjZWQgYmF0Y2hlcyB3aXRoIGFuIG9wZW4gaG9va1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB0aGUgY2xhaW0gYmVmb3JlIHJ1bm5pbmcgdGhlIGJvZHksIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgNDEyLWZlbmNlZCBzdGVwIG5ldmVyIGV4ZWN1dGVzIHVzZXIgY29kZSDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0IGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc09wdGltaXN0aWNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90U25hcHNob3Q6IGlubGluZUNsYWltU25hcHNob3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihzdGVwSW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IGxhdGVuY3lUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihiYXRjaFJlc3VtZVRyYWNraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHJlc3VtZVRyYWNraW5nOiBiYXRjaFJlc3VtZVRyYWNraW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcXVlc3RJbmxpbmVEZWx0YSAmJiBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lRGVsdGFTaW5jZUN1cnNvcjogZXZlbnRMb2cuY3Vyc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhcmlhbnQgYm9va2tlZXBpbmc6IHRoaXMgaW52b2NhdGlvbiBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYm9kaWVzIHVudGlsIHRoZXkgc2V0dGxlIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsaWdodE93bmVkU3RlcHMuYWRkKHMuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF6eSBzdGVwcyBhcmUgYnJhbmQtbmV3ICh0aGVpciBjcmVhdGUtY2xhaW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgZXhhY3RseS1vbmNlIGdhdGUpLCBidXQgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZC1yZWNvdmVyeSBzdGVwIGFscmVhZHkgZXhpc3RzIGFuZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheWVkIGJhY2tzdG9wIG1lc3NhZ2UgbWF5IGZpcmUgbWlkLWJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNhbWUgcHJvY2VzcyDigJQgcm91dGUgdGhvc2UgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1wcm9jZXNzIHNpbmdsZS1mbGlnaHQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXp5U3RlcElucHV0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBydW5TdGVwU2luZ2xlRmxpZ2h0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcnVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVkLmZpbmFsbHkoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0T3duZWRTdGVwcy5kZWxldGUocy5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YWxlICg0MTIpIHJlamVjdGlvbiBvZiBhbiBpbmxpbmUgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYWltOiB0aGUgbG9hZGVkIHZpZXcgdGhpcyBiYXRjaCB3YXMgc2NoZWR1bGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gaXMgbWlzc2luZyBhbiBldmVudCB0aGUgYmFja2VuZCBhbHJlYWR5IGhhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIGNsYWltIHdhcyBmZW5jZWQgYnkgdGhlIGd1YXJkIGFuZCBubyBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50cyB3ZXJlIHdyaXR0ZW4uIEFiYW5kb24gdGhlIGJhdGNoIOKAlCBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBib2R5IHJlc3VsdCBpcyBkaXNjYXJkZWQgYnkgZXhlY3V0ZVN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbmNpbGlhdGlvbiDigJQgYW5kIHJlc3RhcnQgdGhlIHJlcGxheSBzbyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgbWlzc2luZyBldmVudC4gV2FpdCBmb3IgdGhlIHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9ucyB0byBzZXR0bGUgZmlyc3Qgc28gbm8gb3duZWQgYm9keSBpcyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbGlnaHQgd2hlbiB0aGUgcmVzdGFydCAob3IgdGhlIGFjayBwYXRoKSBydW5zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IuaXMoc3RlcEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEV4ZWN1dGlvblByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHNpYmxpbmcgd2hvc2UgY2xhaW0gd2FzIGFjY2VwdGVkIHdyb3RlIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgb2YgaXRzIG93biwgcG9zc2libHkgYWZ0ZXIgdGhlIFdvcmxkIGJ1aWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyA0MTIncyBkZWx0YSDigJQgc28gdGhhdCBkZWx0YSBjYW4gbm8gbG9uZ2VyIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lZCB0byBjb21wbGV0ZSB0aGUgbG9nLCBhbmQgdGhlIHJlc3RhcnQgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVsb2FkIGl0IGluIGZ1bGwuIGBza2lwcGVkYCAodGhlIHN0ZXAgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0ZWQpLCBgZ29uZWAgYW5kIGB0aHJvdHRsZWRgIChjbGFpbSByZWplY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm90ZSBub3RoaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdXcm90ZSA9IHNldHRsZWQuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdmYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAncmV0cnknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcygnaW5saW5lLWNsYWltJywgc3RlcEVyciwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0RlbHRhOiAhc2libGluZ1dyb3RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24gc3RhcnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaW5hbGx5IGJlbG93IHJlc3VtZXMgdGhlIHJlcGxheSBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhpcyByZXR1cm4gKG9yIHRocm93KSBjb21wbGV0ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmxpbmUtY2xhaW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2NhbGF0aW9uLnJlaW52b2tlZCkgcmV0dXJuIGVzY2FsYXRpb24ucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWdncmVnYXRlIHRoZSBiYXRjaCByZXN1bHRzLiBgcmV0cnlgIHN0ZXBzICh3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBleGlzdCDigJQgdGhlaXIgYHN0ZXBfc3RhcnRlZGAgc3VjY2VlZGVkKSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXF1ZXVlZCBwZXItc3RlcCBhcyBiYWNrZ3JvdW5kIHN0ZXBzIHdpdGggdGhlaXIgb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxheTsgYHRocm90dGxlZGAgc3RlcHMgKHJlamVjdGVkIG9uIHRoZSBjcmVhdGUtY2xhaW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBuZXZlciBjcmVhdGVkKSBpbnN0ZWFkIGRlZmVyIHJlZGVsaXZlcnkgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2Ugc28gdGhleSByZS1ydW4gaW5saW5lIHdpdGggaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJlcGxheTsgY29tcGxldGVkL2ZhaWxlZCBzdGVwcyBhbHJlYWR5IHdyb3RlIHRoZWlyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudHMuIFdlIG9ubHkgbG9vcCBiYWNrIHRvIHJlcGxheSB3aGVuIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUg4oCUIG90aGVyd2lzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXBlbmRpbmcgc3RlcHMgd2lsbCBiZSByZS1ydW4gYnkgdGhlaXIgcXVldWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlcyBhbmQgdGhlIGJhY2tncm91bmQtc3RlcCBwYXRoIHJlcGxheXMgb25jZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiAodHlwZW9mIGlubGluZUV4ZWN1dGlvbnMpW251bWJlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW55UGVuZGluZ09wcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB0aHJvdHRsZWQgaW5saW5lIHN0ZXAgZGVsYXlzIHJlZGVsaXZlcnkgb2YgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIG1lc3NhZ2UgcmF0aGVyIHRoYW4gYmVpbmcgcmUtcXVldWVkIGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcC4gQ3J1Y2lhbGx5LCBhIGB0aHJvdHRsZWRgIHJlc3VsdCBtZWFuc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhenkgYHN0ZXBfc3RhcnRlZGAgd2FzIHJlamVjdGVkIG9uIHRoZSBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSDigJQgc28gdGhlIHN0ZXAgd2FzIE5FVkVSIGNyZWF0ZWQgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCwgbm8gc3RlcCBlbnRpdHkpLiBSZS1xdWV1aW5nIGl0IGFzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcCB3b3VsZCBzZW5kIGEgYmFyZSBgc3RlcF9zdGFydGVkYCAobm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0KSwgd2hpY2ggdGhlIHdvcmxkIHJlamVjdHMgd2l0aCBgU3RlcCBcIjxpZD5cIiBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kYCBiZWNhdXNlIGl0IGNhbm5vdCBsYXppbHkgY3JlYXRlIHRoZSBzdGVwIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBpbnB1dDsgdGhhdCBlcnJvciBpc24ndCB0cmFuc2xhdGFibGUsIHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSByZWRlbGl2ZXJzIHVudGlsIE1BWF9RVUVVRV9ERUxJVkVSSUVTIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgKGFuZCBydW4pIGZhaWwuIERlZmVycmluZyByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JjaGVzdHJhdG9yIGluc3RlYWQgcmUtYXR0ZW1wdHMgdGhlIHRocm90dGxlZCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgV0lUSCBpdHMgaW5wdXQgb24gcmVwbGF5LiBXZSB0cmFjayB0aGUgbG9uZ2VzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja29mZiBzbyBhIGJhdGNoIHdpdGggbXVsdGlwbGUgdGhyb3R0bGVzIHdhaXRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4LiBOb3RlOiBgcmV0cnlgIHJlc3VsdHMgYXJlIHNhZmUgdG8gcmUtcXVldWUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgYmVjYXVzZSBhIHJldHJ5IGltcGxpZXMgYHN0ZXBfc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgc3VjY2VlZGVkIGFuZCB0aGUgc3RlcCBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGVUaW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHN0ZXBSZXN1bHRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaW5saW5lRXhlY3V0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIudHlwZSA9PT0gJ3JldHJ5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlTZWNvbmRzOiByLnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIudHlwZSA9PT0gJ3Rocm90dGxlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlVGltZW91dCA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci50eXBlID09PSAnY29tcGxldGVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnlQZW5kaW5nT3BzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZXIgcmVkZWxpdmVyeSBvZiB0aGUgb3JjaGVzdHJhdG9yIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdHRsZSBiYWNrb2ZmLiBPbiByZXBsYXkgZXZlcnkgbm9uLXRlcm1pbmFsIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcmUtZGlzcGF0Y2hlZCBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwtdGhyb3R0bGVkIHN0ZXBzIHJ1biBpbmxpbmUgYWdhaW4gV0lUSCB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCAodGhlaXIgYHN0ZXBfY3JlYXRlZGAgaXMgZGVmZXJyZWQgYW5ldyksIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgYHJldHJ5YCBzdGVwcyBpbiB0aGlzIGJhdGNoIGFyZSBxdWV1ZWQgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93biByZXRyeUFmdGVyIGhvbm9yZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmFsIHN0ZXBzIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ic2VydmVkIGZyb20gdGhlaXIgZXZlbnRzIGFuZCBub3QgcmUtcnVuLiBCZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXkgZHJpdmVzIGFsbCByZW1haW5pbmcgd29yaywgd2UgbXVzdCBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyByZS1xdWV1ZSBgdG9SZXRyeWAgaGVyZSDigJQgdGhhdCB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGUtZGlzcGF0Y2ggdGhvc2Ugc3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmV0dXJucyBCRUZPUkUgdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3csIHNvIGEgYmF0Y2ggdGhhdCBtaXhlcyBhIHRocm90dGxlIHdpdGggYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWQgc3RlcCB0aGF0IGxlZnQgdW5mbHVzaGVkIG9wcyBkb2VzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSB0aGUgZXhwbGljaXQgZmx1c2ggY29udGludWF0aW9uLiBUaGF0IGlzIHNhZmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgdGhyb3R0bGUgYmFja29mZiAoPj0gMXMpIGFsd2F5cyBleGNlZWRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbi1pbnZvY2F0aW9uIGZsdXNoIHdpbmRvdyAoPD0gNTAwbXMgKyB3YWl0VW50aWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBvcHMgc2V0dGxlIGJlZm9yZSB0aGUgcG9zdC1iYWNrb2ZmIHJlZGVsaXZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5cyBhbmQgcmVhZHMgdGhlbS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKHRocm90dGxlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b1JldHJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlUcmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvUmV0cnkubWFwKCh7IHN0ZXAsIGRlbGF5U2Vjb25kcyB9KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXAuc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiByZXRyeVRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLZXkgdGhlIGRlbGF5ZWQgcmV0cnkgb24gdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGtleSBzbyBpdCBkZWR1cGVzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZWQgcmUtZGlzcGF0Y2ggdGhlIHN1c3BlbnNpb24gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1zIG9uIHJlcGxheSAoaXQgdXNlcyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcywgYSBtaXhlZCBiYXRjaCB3aGVyZSBvbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjb21wbGV0ZWRgIHdpdGggdW5mbHVzaGVkIGJhY2tncm91bmQgb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBhbnlQZW5kaW5nT3BzYCkgYW5kIGFub3RoZXIgc3RlcCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHdvdWxkIGRvdWJsZS1kaXNwYXRjaCB0aGUgcmV0cnk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGBhbnlQZW5kaW5nT3BzYCBicmFuY2ggYmVsb3cgcXVldWVzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlIHBsYWluIGNvbnRpbnVhdGlvbiwgd2hvc2UgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlcyB0aGUgc3RpbGwtYHJldHJ5aW5nYCBzdGVwIGFzIHBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmUtZGlzcGF0Y2hlcyBpdCAqaW1tZWRpYXRlbHkqIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICp3aXRoKiBhIGtleS4gU2luY2UgdGhpcyBkZWxheWVkIHJldHJ5IGhhZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGtleSwgdGhlIHR3byBtZXNzYWdlcyB3b3VsZG4ndCBkZWR1cGUg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0ZXAgd291bGQgcnVuIHR3aWNlLCB0aGUgY29uZmlndXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJhY2tvZmYgd291bGQgYmUgaWdub3JlZCAocGxhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgRXJyb3JgIHJldHJpZXMgcGVyc2lzdCBubyBgcmV0cnlBZnRlcmAsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGhhcyBubyBgVG9vRWFybHlgIGd1YXJkKSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IGJvZHkgY291bGQgcnVuIGVhcmx5L2NvbmN1cnJlbnRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFyaW5nIHRoZSBrZXkgbGV0cyB0aGUgZWFybGllciBkZWxheWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB3aW4sIGhvbm9yaW5nIHRoZSBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc3RlcE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgcGVuZGluZyBiYWNrZ3JvdW5kIG9wZXJhdGlvbnMgZmx1c2ggYmVmb3JlIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgcmVhZHMgdGhlaXIgcmVzdWx0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbnlQZW5kaW5nT3BzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JyZWFraW5nIGxvb3A6IGlubGluZSBzdGVwIGhhcyBwZW5kaW5nIG9wcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbG9vcEl0ZXJhdGlvbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgaW5saW5lIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIHZpYSB0aGVpciBxdWV1ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnkgbWVzc2FnZXM7IHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYWxsIHN0ZXBzIGFyZSB0ZXJtaW5hbC4gRG9uJ3QgbG9vcCBoZXJlIOKAlCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cnlpbmcgc3RlcHMgaGF2ZSBubyB0ZXJtaW5hbCBldmVudCB0byBvYnNlcnZlIHlldC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgaW5saW5lIHN0ZXBzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGNvbXBsZXRlZC9mYWlsZWQvc2tpcHBlZC9nb25lKSDigJQgbG9vcCBiYWNrIHRvIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSB3b3JrZmxvdyBvYnNlcnZlcyB0aGUgdGVybWluYWwgZXZlbnRzIG9uIHJlcGxheSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgYW55IGlubGluZSBkZWx0YS4gSWYgaXQgaXMgcGFydGlhbCwgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gaXRzIGN1cnNvciBpbnN0ZWFkIG9mIHJlYWRpbmcgdGhlIHBhZ2UgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5lRXhlY3V0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb25seSA9IHN0ZXBSZXN1bHRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob25seS50eXBlID09PSAnY29tcGxldGVkJyAmJiBvbmx5LmlubGluZURlbHRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIG9ubHkuaW5saW5lRGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gb25seS5pbmxpbmVEZWx0YS5oYXNNb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHRFdmVudExvZ0xvYWQoZXZlbnRMb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBuZXh0RXZlbnRMb2dMb2FkKGV2ZW50TG9nKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc25hcHNob3QgcmVqZWN0aW9uIG9mIGEgZ3VhcmRlZCB3cml0ZSBtYWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBieSB0aGUgcmVwbGF5IGxvb3Ag4oCUIHRoZSByZXN1bHQtYmVhcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9jb21wbGV0ZWRgLCBvciB0aGUgYHdhaXRfY29tcGxldGVkYCBvZiB0aGUgd2FpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy4gQm90aCByZWFjaCB0aGlzIG9uZSBjYXRjaCBhbmQgdGhlIHJlamVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3Qgc2F5IHdoaWNoLCBoZW5jZSB0aGUgbmV1dHJhbCBsYWJlbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgbWF5IGJlIHJlLXBvc3RlZCBpbiBwbGFjZTogdGhlIGNvcnJlbGF0aW9uIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgKGZvciBydW5fY29tcGxldGVkKSB0aGUgcmVzdWx0IGl0c2VsZiBjYW1lIGZyb21cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwbGF5LCBhbmQgYSBjb3JyZWN0ZWQgbG9nIG1heSBwcm9kdWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgb25lcy4gRG9uJ3QgZmFpbCB0aGUgcnVuIOKAlCByZXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IGluIHRoaXMgaW52b2NhdGlvbiwgYW5kIG9ubHkgb25jZSB0aGF0IGJ1ZGdldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3BlbnQgc2NoZWR1bGUgYW4gZXhwbGljaXQgcmUtaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGhyb3dpbmcgaW5zdGVhZCB3b3VsZCByZWx5IG9uIHJlZGVsaXZlcnkgb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIG1lc3NhZ2UsIHdoaWNoIHRoZSB0dXJibyBwYXRoIGhhcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2tlZCDigJQgZW1waXJpY2FsbHkgdGhlIHJ1biB0aGVuIHN0YWxscyBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSdzIH4zMDBzIGRlZmF1bHQgdmlzaWJpbGl0eSB0aW1lb3V0IGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoJ3JlcGxheS13cml0ZScsIGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlc2NhbGF0aW9uID0gYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBsYXktd3JpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGVyLXJ1biBidWRnZXQgc3BlbnQuIEZhbGwgdGhyb3VnaCB0byB0aGUgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCBiZWxvdyBpbnN0ZWFkIG9mIHJldGhyb3dpbmc6IHRoaXMgY2F0Y2ggb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHRoZSBydW4sIGFuZCBhIHJldGhyb3cgd291bGQgZXNjYXBlIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZSBoYW5kbGVyIGFuZCBiZSByZWRlbGl2ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zaWVudCBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlcyB0YWxraW5nIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGQgKHdvcmtmbG93LXNlcnZlcikg4oCUIGFuIGV4aGF1c3RlZCBSZXRyeUFnZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoVU5EX0VSUl9SRVFfUkVUUlkgZnJvbSBhIHN1c3RhaW5lZCA0MjkvNTAzIHN0b3JtKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgZHJvcHBlZCBzb2NrZXQsIGEgY29ubmVjdC9ETlMgZmFpbHVyZSwgb3IgYSBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXQg4oCUIG11c3QgTk9UIGZhaWwgdGhlIHJ1bi4gUmV0aHJvdyBzbyB0aGUgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnMgYW5kIGEgZnJlc2ggaW52b2NhdGlvbiByZXRyaWVzIHRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgdGhlIGJhY2tlbmQgcmVjb3ZlcnMuIFRoZSBAdmVyY2VsL3F1ZXVlIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpZXMgYSBmYXN0ICgxc+KGkjYwcykgYmFja29mZiBieSBkZWxpdmVyeSBjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkaW5nIHRoZSB+NW1pbiBkZWZhdWx0IHZpc2liaWxpdHktdGltZW91dCByZWRyaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoYW5kIG5ldmVyIGtpbGxpbmcgdGhlIHByb2Nlc3MgdmlhIHJ1bl9mYWlsZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUcmFuc2llbnQgd29ybGQgZXJyb3IgZHVyaW5nIHJlcGxheTsgcmVkZWxpdmVyaW5nIHZpYSBxdWV1ZSBpbnN0ZWFkIG9mIGZhaWxpbmcgdGhlIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpdmVyZ2VuY2VDb3VudCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxheURpdmVyZ2VuY2U/LmNvdW50ID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVjb3ZlcnlSZXBsYXlzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXZlcmdlbmNlQ291bnQgPD0gbWF4UmVjb3ZlcnlSZXBsYXlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkOyBxdWV1ZWluZyBhIHJlY292ZXJ5IHJlcGxheSBiZWZvcmUgZGVjbGFyaW5nIHRoZSBldmVudCBsb2cgY29ycnVwdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlOiBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX0RJVkVSR0VOQ0UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyZ2VuY2VFdmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JEaXZlcmdlbmNlRXZlbnRJZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlPy5ldmVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVjb3ZlcnlSZXBsYXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBlcnIuZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSA9IGRpdmVyZ2VuY2VDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvciA9IG5ldyBDb3JydXB0ZWRFdmVudExvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBXb3JrZmxvdyByZXBsYXkgZGl2ZXJnZWQgJHtkaXZlcmdlbmNlQ291bnR9IHRpbWVzIGFmdGVyICR7bWF4UmVjb3ZlcnlSZXBsYXlzfSByZWNvdmVyeSByZXBsYXlzOyBsYXRlc3QgZGl2ZXJnZW50IGV2ZW50IHdhcyAke2Vyci5ldmVudElkfS4gTGFzdCBkaXZlcmdlbmNlOiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVwbGF5U3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuYWN0aXZhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBjb2RlIGVycm9ycyBhbmQgdGVybWluYWwgcnVudGltZSBlcnJvcnMgZmFpbCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlcm1pbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/Lih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLm5hbWUgfHwgZ2V0RXJyb3JOYW1lKHRlcm1pbmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gbm9ybWFsaXplZEVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2sgPSByZW1hcEVycm9yU3RhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd0NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3NpZnkgdGhlIGVycm9yOiBXb3JrZmxvd1J1bnRpbWVFcnJvciBpbmRpY2F0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIFNESy9ydW50aW1lIGlzc3VlLCBhbmQgc2VsZWN0ZWQgc3ViY2xhc3NlcyB1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3BlY2lmaWMgY29kZXMgZm9yIGJhY2tlbmQgdHJhY2tpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHRlcm1pbmFsRXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSBydW5uaW5nIHdvcmtmbG93Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHNvdXJjZS1tYXAtcmVtYXBwZWQgc3RhY2sgdG8gdGhlIHRocm93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgc28gdGhhdCB0aGUgc2VyaWFsaXplZCBlcnJvciBwcmVzZXJ2ZXMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb25zdW1lcnMuIGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIGlzIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYGVyciBpbnN0YW5jZW9mIEVycm9yYCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgcnVucyBpbiBhIHNlcGFyYXRlIFZNIHJlYWxtIOKAlCBpdHMgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIGRpc3RpbmN0IGZyb20gdGhlIGhvc3Qncywgc28gYGluc3RhbmNlb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yYCBpcyBgZmFsc2VgIGZvciBWTS10aHJvd24gZXJyb3JzLiBUaGUgVjhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgdGFnIHdvcmtzIGFjcm9zcyByZWFsbXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaXNOYXRpdmVFcnJvcih0ZXJtaW5hbEVycm9yKSAmJiBlcnJvclN0YWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXJtaW5hbEVycm9yIGFzIEVycm9yKS5zdGFjayA9IGVycm9yU3RhY2s7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHdvcmtmbG93IHJ1biB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaWRlbnRpdHkgYW5kIGN1c3RvbSBwcm9wZXJ0aWVzIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIGZyb20gdGhpcyBsb29wIGl0IGNhcnJpZXMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbG90IHNuYXBzaG90LCBzbyBhIFdvcmxkIHRoYXQgZmVuY2VzIGNhbiByZWplY3QgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhIHNsb3QtYWxsb2NhdGluZyBvbmUgcmVwb3J0cyBiYWNrIHdoYXQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHJlcGxheSBoYWQgbm90IHNlZW4uIEZhaWwtb3BlbiBvbiBwdXJwb3NlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSBuZWl0aGVyIGFwcGxpZXM6IGEgc3B1cmlvdXMgZmFpbHVyZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgKHRoZSBydW4gY2FuIGJlIHJlLXJ1biBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGFzaGJvYXJkKSwgd2hlcmVhcyBhIHNwdXJpb3VzICpjb21wbGV0aW9uKiBjb21taXRzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyb25nIHJlc3VsdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvOiBvcmRlciB0aGUgdGVybWluYWwgd3JpdGUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjcmVhdGVFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlQ291bnRGb3JGYWlsdXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZmFpbEVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFpbEVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhmYWlsRXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JDb2RlKGVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShlcnJvck5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG5cbiAgbGV0IGNhY2hlZEhhbmRsZXI6ICgocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPikgfCB1bmRlZmluZWQ7XG4gIGxldCBpbnZvY2F0aW9uQ291bnQgPSAwO1xuICBjb25zdCBlbnRyeXBvaW50Q3JlYXRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgcm91dGVNb2R1bGVCb2R5SW5pdE1zID1cbiAgICB0eXBlb2Ygb3B0aW9ucz8ucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID09PSAnbnVtYmVyJ1xuICAgICAgPyBlbnRyeXBvaW50Q3JlYXRlZEF0IC0gb3B0aW9ucy5yb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXRcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB3aXRoSGVhbHRoQ2hlY2soYXN5bmMgKHJlcSkgPT4ge1xuICAgIGludm9jYXRpb25Db3VudCArPSAxO1xuICAgIGNvbnN0IGhhbmRsZXJDYWNoZWQgPSBjYWNoZWRIYW5kbGVyICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3BhbktpbmQgPSBhd2FpdCBnZXRTcGFuS2luZCgnU0VSVkVSJyk7XG5cbiAgICByZXR1cm4gdHJhY2UoXG4gICAgICAnd29ya2Zsb3cucm91dGUuZmxvdycsXG4gICAgICB7XG4gICAgICAgIGtpbmQ6IHNwYW5LaW5kLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVUeXBlKCdmbG93JyksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkZhYXNJbnN0YW5jZShDT01QVVRFX0lOU1RBTkNFX0lEKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUhhbmRsZXJDYWNoZWQoaGFuZGxlckNhY2hlZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQoaW52b2NhdGlvbkNvdW50KSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSb3V0ZUVudHJ5cG9pbnRBZ2VNcyhcbiAgICAgICAgICAgIERhdGUubm93KCkgLSBlbnRyeXBvaW50Q3JlYXRlZEF0XG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi4ocm91dGVNb2R1bGVCb2R5SW5pdE1zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgIDogQXR0cmlidXRlLldvcmtmbG93Um91dGVNb2R1bGVCb2R5SW5pdE1zKHJvdXRlTW9kdWxlQm9keUluaXRNcykpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5IdHRwUmVxdWVzdE1ldGhvZChyZXEubWV0aG9kKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJvdXRlKCcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgIGlmICghY2FjaGVkSGFuZGxlcikge1xuICAgICAgICAgIGNhY2hlZEhhbmRsZXIgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cucm91dGUuaW5pdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkSGFuZGxlcnMgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgICAgICAgJ3dvcmtmbG93LnJvdXRlLmdldF93b3JsZF9oYW5kbGVycycsXG4gICAgICAgICAgICAgIGFzeW5jICgpID0+IGdldFdvcmxkSGFuZGxlcnMoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKHdvcmxkSGFuZGxlcnMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWNoZWRIYW5kbGVyKHJlcSk7XG4gICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhcbiAgICAgICAgICAgIEF0dHJpYnV0ZS5IdHRwUmVzcG9uc2VTdGF0dXNDb2RlKHJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cbiJdfQ==
3701
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIscUJBQXFCLEVBRXJCLHFCQUFxQixFQUNyQixvQkFBb0IsRUFDcEIsaUNBQWlDLEVBRWpDLDJCQUEyQixHQUc1QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xDLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQWdDLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBZSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNB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QUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxJQUFJLFFBQVEsWUFBWSxRQUFRLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxFQUFFLGFBQWEsQ0FDakIsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDbEQsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQvc3RyaWN0JztcbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IsXG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBNYXhFdmVudHNFeGNlZWRlZEVycm9yLFxuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgb25jZSwgc2V0V29ya2Zsb3dCYXNlUGF0aCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQge1xuICBwYXJzZVdvcmtmbG93TmFtZSxcbiAgd29ya2Zsb3dEaXNwbGF5TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHtcbiAgdHlwZSBDcmVhdGVFdmVudFBhcmFtcyxcbiAgdHlwZSBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHR5cGUgRXZlbnQsXG4gIHR5cGUgRXZlbnRSZXN1bHQsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzVGVybWluYWxSdW5FdmVudFR5cGUsXG4gIFJPT1RfUlVOX0lEX0FUVFJJQlVURSxcbiAgdHlwZSBSdW5JbnB1dCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFdvcmtmbG93SW52b2tlUGF5bG9hZCxcbiAgV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IG1zIGZyb20gJ21zJztcbmltcG9ydCB7IGRlY29kZVRpbWUgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7XG4gIGNsYXNzaWZ5UnVuRXJyb3IsXG4gIGlzUmV0cnlhYmxlV29ybGRFcnJvcixcbiAgaXNXb3JsZENvbnRyYWN0RXJyb3IsXG59IGZyb20gJy4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgdHlwZSBTdGVwSW52b2NhdGlvblF1ZXVlSXRlbSwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgUmVwbGF5UGF5bG9hZENhY2hlIH0gZnJvbSAnLi9yZXBsYXktcGF5bG9hZC1jYWNoZS5qcyc7XG5pbXBvcnQgeyBDT01QVVRFX0lOU1RBTkNFX0lEIH0gZnJvbSAnLi9ydW50aW1lL2NvbXB1dGUtaW5zdGFuY2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWF4RXZlbnRzT3ZlcnJpZGUsXG4gIGdldE1heFF1ZXVlRGVsaXZlcmllcyxcbiAgZ2V0UHJlY29uZGl0aW9uTWF4SW5Qcm9jZXNzUmVzdGFydHMsXG4gIGdldFByZWNvbmRpdGlvbk1heFJlaW52b2NhdGlvbnMsXG4gIGdldFByZWNvbmRpdGlvblJlaW52b2tlRGVsYXlTZWNvbmRzLFxuICBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcyxcbiAgaXNJbmxpbmVPd25lcnNoaXBFbmFibGVkLFxuICBpc1R1cmJvRW5hYmxlZCxcbiAgaXNWbVJldGVudGlvbkVuYWJsZWQsXG59IGZyb20gJy4vcnVudGltZS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY291bnRTdGVwU3RhcnRlZEV2ZW50cyB9IGZyb20gJy4vcnVudGltZS9jb3VudC1zdGVwLXN0YXJ0ZWQtZXZlbnRzLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRGVwbG95bWVudEFmZmluaXR5T3V0Y29tZSxcbiAgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHksXG4gIHR5cGUgUmVlbnF1ZXVlQXJncyxcbn0gZnJvbSAnLi9ydW50aW1lL2RlcGxveW1lbnQtZ3VhcmQuanMnO1xuaW1wb3J0IHtcbiAgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnQsXG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyxcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgaW5zZXJ0RXZlbnRCeUV2ZW50SWQsXG4gIGlzU2xvdEdhcENoZWNrRW5hYmxlZCxcbiAgdHlwZSBMb2FkZWRFdmVudExvZyxcbiAgbG9hZFdvcmtmbG93UnVuRXZlbnRzLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgdHlwZSBTbG90U25hcHNob3RQYXJhbXMsXG4gIHNldHRsZUV2ZW50U2xvdEdhcCxcbiAgc2xvdFNuYXBzaG90UGFyYW1zLFxuICBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSxcbiAgd2l0aEhlYWx0aENoZWNrLFxufSBmcm9tICcuL3J1bnRpbWUvaGVscGVycy5qcyc7XG5pbXBvcnQge1xuICBoYW5kbGVSZXBsYXlCdWRnZXRFeGhhdXN0ZWQsXG4gIFJlcGxheUJ1ZGdldCxcbn0gZnJvbSAnLi9ydW50aW1lL3JlcGxheS1idWRnZXQuanMnO1xuaW1wb3J0IHsgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlciB9IGZyb20gJy4vcnVudGltZS9yZXBsYXktcmVjb3ZlcnktcmVwb3J0ZXIuanMnO1xuaW1wb3J0IHtcbiAgcmVzdW1lVGltaW5nRm9yTWVzc2FnZSxcbiAgcmVzdW1lVHJhY2tpbmdGcm9tTWVzc2FnZSxcbn0gZnJvbSAnLi9ydW50aW1lL3Jlc3VtZS1sYXRlbmN5LmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW50aW1lL3J1bi1pZC10aW1lLmpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUyxcbiAgZXhlY3V0ZVN0ZXAsXG4gIHR5cGUgUHJlY2xhaW1lZElubGluZVN0YXJ0LFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21wdXRlU3RlcExhdGVuY3lUcmFja2luZyB9IGZyb20gJy4vcnVudGltZS9zdGVwLWxhdGVuY3kuanMnO1xuaW1wb3J0IHtcbiAgYmFja3N0b3BJZGVtcG90ZW5jeUtleSxcbiAgaGFzUGVuZGluZ1N0ZXBPd25lZEJ5TWVzc2FnZSxcbiAgaXNTdGVwT3duZXJzaGlwQWN0aXZlLFxuICBzdGVwTGVhc2VSZW1haW5pbmdTZWNvbmRzLFxufSBmcm9tICcuL3J1bnRpbWUvc3RlcC1vd25lcnNoaXAuanMnO1xuaW1wb3J0IHsgcnVuU3RlcFNpbmdsZUZsaWdodCB9IGZyb20gJy4vcnVudGltZS9zdGVwLXNpbmdsZS1mbGlnaHQuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgdXNlUXVpY2tKU1ZtIH0gZnJvbSAnLi9ydW50aW1lL3ZtLW1vZGUuanMnO1xuaW1wb3J0IHsgZ2V0V2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIH0gZnJvbSAnLi9ydW50aW1lL3dhaXQtY29udGludWF0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICB0eXBlIFdvcmxkSGFuZGxlcnMsXG59IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyByZW1hcEVycm9yU3RhY2sgfSBmcm9tICcuL3NvdXJjZS1tYXAuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkSW52b2NhdGlvblNwYW5MaW5rcyxcbiAgZ2V0TmV4dFRyYWNlQ2FycmllcixcbiAgZ2V0U3BhbktpbmQsXG4gIGdldFdvcmtmbG93VHJhY2VNb2RlLFxuICBpc1VzYWJsZVRyYWNlQ2FycmllcixcbiAgdHJhY2UsXG4gIHdpdGhUcmFjZUNvbnRleHQsXG4gIHdpdGhXb3JrZmxvd0JhZ2dhZ2UsXG59IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldEVycm9yTmFtZSwgZ2V0RXJyb3JTdGFjaywgbm9ybWFsaXplVW5rbm93bkVycm9yIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFdvcmtmbG93U3VzcGVuc2lvbk1lc3NhZ2UgfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHtcbiAgcmVwbGF5V29ya2Zsb3csXG4gIHJlc3VtZVdvcmtmbG93LFxuICB0eXBlIFdvcmtmbG93UmVzdW1lUmVzdWx0LFxuICB0eXBlIFdvcmtmbG93U2Vzc2lvbixcbn0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH07XG5leHBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5leHBvcnQge1xuICB0eXBlIEhlYWx0aENoZWNrT3B0aW9ucyxcbiAgdHlwZSBIZWFsdGhDaGVja1Jlc3VsdCxcbiAgaGVhbHRoQ2hlY2ssXG59IGZyb20gJy4vcnVudGltZS9oZWxwZXJzLmpzJztcbmV4cG9ydCB7XG4gIGdldEhvb2tCeVRva2VuLFxuICB0eXBlIFJlc3VtZWRIb29rLFxuICByZXN1bWVIb29rLFxuICByZXN1bWVXZWJob29rLFxufSBmcm9tICcuL3J1bnRpbWUvcmVzdW1lLWhvb2suanMnO1xuZXhwb3J0IHtcbiAgZ2V0UnVuLFxuICBSdW4sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbSxcbiAgdHlwZSBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyxcbn0gZnJvbSAnLi9ydW50aW1lL3J1bi5qcyc7XG5leHBvcnQge1xuICB0eXBlIENhbmNlbFJ1bk9wdGlvbnMsXG4gIGNhbmNlbFJ1bixcbiAgY2FuY2VsUnVucyxcbiAgbGlzdFN0cmVhbXMsXG4gIHR5cGUgUmVhZFN0cmVhbU9wdGlvbnMsXG4gIHR5cGUgUmVjcmVhdGVSdW5PcHRpb25zLFxuICB0eXBlIFJlZW5xdWV1ZVJ1bk9wdGlvbnMsXG4gIHJlYWRTdHJlYW0sXG4gIHJlY3JlYXRlUnVuRnJvbUV4aXN0aW5nLFxuICByZWVucXVldWVSdW4sXG4gIHR5cGUgU3RvcFNsZWVwT3B0aW9ucyxcbiAgdHlwZSBTdG9wU2xlZXBSZXN1bHQsXG4gIHdha2VVcFJ1bixcbn0gZnJvbSAnLi9ydW50aW1lL3J1bnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBTdGFydE9wdGlvbnMsXG4gIHR5cGUgU3RhcnRPcHRpb25zQmFzZSxcbiAgdHlwZSBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkLFxuICB0eXBlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQsXG4gIHN0YXJ0LFxufSBmcm9tICcuL3J1bnRpbWUvc3RhcnQuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV29ybGQsXG4gIGNyZWF0ZVdvcmxkRnJvbU1vZHVsZSxcbiAgZ2V0V29ybGQsXG4gIGdldFdvcmxkSGFuZGxlcnMsXG4gIHNldFdvcmxkLFxuICB0eXBlIFdvcmxkRmFjdG9yeU1vZHVsZSxcbn0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJztcblxuLyoqXG4gKiBBcHBseSB0aGUgb3B0aW9uYWwgY2xpZW50LXNpZGUgZXZlbnQtbGltaXQgb3ZlcnJpZGUuXG4gKiBgV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERWAsIHdoZW4gc2V0IHRvIGEgcG9zaXRpdmUgaW50ZWdlciwgY2xhbXBzIHRoZVxuICogc2VydmVyLXN1cHBsaWVkIHBlci1ydW4gZXZlbnQgY2VpbGluZyB0byBhIHNtYWxsZXIgdmFsdWUgc28gZW5mb3JjZW1lbnQgY2FuXG4gKiBiZSBleGVyY2lzZWQgd2l0aG91dCBhIHNlcnZlci1zaWRlIGNoYW5nZS4gQ2xhbXAtZG93biBvbmx5OiBpdCBuZXZlciByYWlzZXNcbiAqIHRoZSBzZXJ2ZXIncyBsaW1pdCwgYW5kIGl0IHRha2VzIGVmZmVjdCBldmVuIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIG5vbmUuXG4gKiBVbnNldCDih5Igc2VydmVyIHZhbHVlIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gY2xhbXBNYXhFdmVudHMoc2VydmVyVmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG92ZXJyaWRlID0gZ2V0TWF4RXZlbnRzT3ZlcnJpZGUoKTtcbiAgaWYgKG92ZXJyaWRlID09PSB1bmRlZmluZWQpIHJldHVybiBzZXJ2ZXJWYWx1ZTtcbiAgcmV0dXJuIHNlcnZlclZhbHVlID09PSB1bmRlZmluZWQgPyBvdmVycmlkZSA6IE1hdGgubWluKHNlcnZlclZhbHVlLCBvdmVycmlkZSk7XG59XG5cbi8qKlxuICogUmVmdXNlIGEgcXVldWUgZGVsaXZlcnkgd2hvc2UgcnVuIHdhcyBjcmVhdGVkIGluIGEgZGlmZmVyZW50IGVudmlyb25tZW50IHRoYW5cbiAqIHRoaXMgZGVwbG95bWVudCBydW5zIGluLlxuICpcbiAqIGBzdGFydCgpYCBwZXJmb3JtcyB0d28gd3JpdGVzIHRoYXQgbXVzdCBsYW5kIGluIHRoZSBzYW1lIHRlbmFudDogdGhlXG4gKiBgcnVuX2NyZWF0ZWRgIGV2ZW50LCBhdHRyaWJ1dGVkIHRvIHdoYXRldmVyIGVudmlyb25tZW50IHRoZSAqY2FsbGVyKlxuICogYXV0aGVudGljYXRlcyBhcywgYW5kIHRoZSBxdWV1ZSBtZXNzYWdlLCBwaW5uZWQgdG8gYSAqZGVwbG95bWVudCouIEFcbiAqIG1pc2NvbmZpZ3VyZWQgY2FsbGVyIGNhbiBzcGxpdCB0aGVtIOKAlCB3cml0aW5nIHRoZSBydW4gdG8gb25lIGVudmlyb25tZW50XG4gKiB3aGlsZSBhZGRyZXNzaW5nIHRoZSBtZXNzYWdlIHRvIGEgZGVwbG95bWVudCBpbiBhbm90aGVyLiBUaGUgY29uc3VtZXIgdGhlblxuICogZmluZHMgbm8gcnVuIHVuZGVyIGl0cyBvd24gdGVuYW50IGFuZCB0aGUgYmFja2VuZCdzIHJlc2lsaWVudCBzdGFydFxuICogKGBydW5fc3RhcnRlZGAgY3JlYXRlcyB0aGUgcnVuIHdoZW4gYHJ1bl9jcmVhdGVkYCB3YXMgbmV2ZXIgc2VlbikgbWludHMgYVxuICogU0VDT05EIGNvcHkgb2YgdGhlIHNhbWUgcnVuIGlkIGluIHRoaXMgZW52aXJvbm1lbnQuIEJvdGggY29waWVzIGFyZSByZWFsOiB0aGVcbiAqIGNyZWF0b3IncyBzaXRzIHBlbmRpbmcgZm9yZXZlciwgdGhpcyBvbmUgZXhlY3V0ZXMsIGFuZCBldmVyeSBzdWJzZXF1ZW50XG4gKiBjcm9zcy10ZW5hbnQgcXVldWUgYWNrIGZhaWxzIHRvIGZpbmQgaXRzIG1lc3NhZ2UuXG4gKlxuICogTm90aGluZyBleHRlcm5hbCBpcyBuZWVkZWQgdG8gY2F0Y2ggdGhpczogdGhlIGNyZWF0b3IncyBlbnZpcm9ubWVudCByaWRlcyB0aGVcbiAqIG1lc3NhZ2UgaW4gYHJ1bklucHV0LmVudmlyb25tZW50YCBhbmQgdGhpcyBwcm9jZXNzIGFscmVhZHkga25vd3MgaXRzIG93bi4gU29cbiAqIGNvbXBhcmUgdGhlbSBhbmQgc3RvcCBCRUZPUkUgYHJ1bl9zdGFydGVkYCDigJQgdGhlIHdyaXRlIHRoYXQgd291bGQgY3JlYXRlIHRoZVxuICogZm9yay4gUmVmdXNpbmcgYWZ0ZXIgaXQgd291bGQgYmUgdG9vIGxhdGUuXG4gKlxuICogUmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgY2FsbGVyIG11c3QgYWJhbmRvbiB0aGUgZGVsaXZlcnkuIFNraXBwZWQgd2hlbmV2ZXJcbiAqIGVpdGhlciBzaWRlIGlzIHVua25vd24sIHdoaWNoIGtlZXBzIGV2ZXJ5IGV4aXN0aW5nIHNldHVwIG9uIGl0cyBjdXJyZW50XG4gKiBiZWhhdmlvcjogd29ybGRzIHdpdGggbm8gZW52aXJvbm1lbnQgZGltZW5zaW9uIChgd29ybGQtbG9jYWxgLFxuICogYHdvcmxkLXBvc3RncmVzYCkgZG9uJ3QgaW1wbGVtZW50IGBnZXRFbnZpcm9ubWVudGAsIGFuZCBydW5zIHN0YXJ0ZWQgYnkgYW5cbiAqIG9sZGVyIFNESyBjYXJyeSBubyBgZW52aXJvbm1lbnRgIGZpZWxkLlxuICovXG5mdW5jdGlvbiByZWZ1c2VDcm9zc0Vudmlyb25tZW50RGVsaXZlcnkoe1xuICB3b3JsZCxcbiAgcnVuSW5wdXQsXG4gIHJ1bklkLFxuICBydW5Mb2dnZXIsXG59OiB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgcnVuSW5wdXQ6IFJ1bklucHV0IHwgdW5kZWZpbmVkO1xuICBydW5JZDogc3RyaW5nO1xuICBydW5Mb2dnZXI6IExvZ2dlcjtcbn0pOiBib29sZWFuIHtcbiAgY29uc3QgY3JlYXRvckVudmlyb25tZW50ID0gcnVuSW5wdXQ/LmVudmlyb25tZW50O1xuICBpZiAoIWNyZWF0b3JFbnZpcm9ubWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGN1cnJlbnRFbnZpcm9ubWVudCA9IHdvcmxkLmdldEVudmlyb25tZW50Py4oKTtcbiAgaWYgKCFjdXJyZW50RW52aXJvbm1lbnQgfHwgY3VycmVudEVudmlyb25tZW50ID09PSBjcmVhdG9yRW52aXJvbm1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgYFJlZnVzaW5nIHRvIHJ1biB0aGlzIHdvcmtmbG93OiBpdCB3YXMgY3JlYXRlZCBpbiB0aGUgXCIke2NyZWF0b3JFbnZpcm9ubWVudH1cIiBgICtcbiAgICAgIGBlbnZpcm9ubWVudCBidXQgdGhpcyBkZXBsb3ltZW50IHJ1bnMgaW4gXCIke2N1cnJlbnRFbnZpcm9ubWVudH1cIi4gYCArXG4gICAgICAnRXhlY3V0aW5nIGl0IGhlcmUgd291bGQgY3JlYXRlIGEgc2Vjb25kIGNvcHkgb2YgdGhlIHNhbWUgcnVuIGlkIGluICcgK1xuICAgICAgJ2JvdGggZW52aXJvbm1lbnRzIOKAlCBvbmUgcGVuZGluZyBmb3JldmVyLCBvbmUgcnVubmluZyDigJQgc28gdGhlIHF1ZXVlICcgK1xuICAgICAgJ21lc3NhZ2UgaXMgYmVpbmcgZGlzY2FyZGVkIHdpdGhvdXQgZXhlY3V0aW5nIGFuZCB3aXRob3V0IHJldHJ5aW5nLiAnICtcbiAgICAgICdUaGUgY2xpZW50IHRoYXQgY2FsbGVkIHN0YXJ0KCkgd3JvdGUgdGhlIHJ1biB0byBpdHMgb3duIGVudmlyb25tZW50ICcgK1xuICAgICAgJ2J1dCBhZGRyZXNzZWQgdGhlIHF1ZXVlIG1lc3NhZ2UgdG8gYSBkZXBsb3ltZW50IGluIGFub3RoZXIgb25lLiBDaGVjayAnICtcbiAgICAgICd0aGF0IHRoZSBlbnZpcm9ubWVudCB0aGF0IGNsaWVudCBhdXRoZW50aWNhdGVzIGFzIChXT1JLRkxPV19WRVJDRUxfRU5WICcgK1xuICAgICAgXCJmb3IgQ0xJIGFuZCBDSSBjbGllbnRzLCBvciB0aGUgT0lEQyB0b2tlbidzIGVudmlyb25tZW50IGluc2lkZSBhIFwiICtcbiAgICAgICdkZXBsb3ltZW50KSBtYXRjaGVzIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgZGVwbG95bWVudCBpdCB0YXJnZXRzLiBUaGUgJyArXG4gICAgICBgcnVuIGl0IGNyZWF0ZWQgaXMgc3RpbGwgcGVuZGluZyBpbiBcIiR7Y3JlYXRvckVudmlyb25tZW50fVwiIGFuZCB3aWxsIGAgK1xuICAgICAgJ25vdCBydW4uJyxcbiAgICB7XG4gICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgIGNyZWF0b3JFbnZpcm9ubWVudCxcbiAgICAgIGN1cnJlbnRFbnZpcm9ubWVudCxcbiAgICAgIHBpbm5lZERlcGxveW1lbnRJZDogcnVuSW5wdXQ/LmRlcGxveW1lbnRJZCxcbiAgICB9XG4gICk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIExvZyB3aGVuIGEgYHN0YXJ0KClgLWVucXVldWVkIG1lc3NhZ2UgcGlubmVkIHRvIG9uZSBkZXBsb3ltZW50IGlzIGRlbGl2ZXJlZFxuICogdG8gYSBkaWZmZXJlbnQgb25lLlxuICpcbiAqIEEgZmlyc3QtZGVsaXZlcnkgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dC5kZXBsb3ltZW50SWRgIOKAlCB0aGUgZGVwbG95bWVudFxuICogYHN0YXJ0KClgIGFkZHJlc3NlZCBpdCB0byDigJQgc28gY29tcGFyaW5nIHRoYXQgYWdhaW5zdCB0aGlzIGhhbmRsZXIncyBvd25cbiAqIGRlcGxveW1lbnQgZGV0ZWN0cyBtaXMtZGVsaXZlcnkgZGlyZWN0bHkuIFRoaXMgaXMgYSBESUFHTk9TVElDLCBub3QgYSBnYXRlOlxuICogaXQgd2FybnMgYW5kIGxldHMgdGhlIGludm9jYXRpb24gcHJvY2VlZCwgZGVsaWJlcmF0ZWx5LlxuICpcbiAqIFdoeSB0aGlzIG9uZSBvbmx5IHdhcm5zIHdoaWxlIGl0cyBlbnZpcm9ubWVudCBzaWJsaW5nIGFib3ZlIHJlZnVzZXM6IGFcbiAqIGRpZmZlcmluZyBkZXBsb3ltZW50IGlkIGlzIG5vdCBieSBpdHNlbGYgZXZpZGVuY2Ugb2YgdGhlIGZvcmsgd2UgY2FyZSBhYm91dC5cbiAqIFRoZSBlbnZpcm9ubWVudCBwYWlyIGlzIGV4YWN0IOKAlCB0d28gbmFtZWQgZW52aXJvbm1lbnRzIHRoYXQgZGlzYWdyZWUg4oCUIGFuZCBpdFxuICogaXMgdGhlIGRpbWVuc2lvbiB0aGUgcnVuJ3MgdGVuYW50IGlzIGtleWVkIG9uLiBEZXBsb3ltZW50IGlkcyBkaXNhZ3JlZSBmb3JcbiAqIGJlbmlnbiByZWFzb25zIHRvbzogYHdvcmxkLWxvY2FsYCBkZXJpdmVzIGl0cyBpZCBmcm9tIHRoZSBpbnN0YWxsZWQgcGFja2FnZVxuICogdmVyc2lvbiAoYGRwbF9sb2NhbEA8dmVyc2lvbj5gKSwgc28gdXBncmFkaW5nIHRoZSBTREsgbWlkLXJ1biBjaGFuZ2VzIGl0IHdpdGhcbiAqIG5vdGhpbmcgd3JvbmcuIFJlZnVzaW5nIG9uIHRoYXQgc2lnbmFsIHdvdWxkIHN0cmFuZCBjb3JyZWN0IHJ1bnMsIGFuZFxuICogcmVmdXNpbmcgYmVmb3JlIGBydW5fc3RhcnRlZGAgbGVhdmVzIG5vIHNlcnZlci1zaWRlIHJlY29yZCB0byBleHBsYWluIHdoeS5cbiAqIEFueW9uZSB0ZW1wdGVkIHRvIHByb21vdGUgdGhpcyB0byBhIGhhcmQgZmFpbHVyZSBoYXMgdG8gaGFuZGxlIHRoYXQgZmlyc3QuXG4gKlxuICogU2tpcHBlZCB1bmxlc3MgQk9USCBpZHMgYXJlIGtub3duIOKAlCBgZ2V0RGVwbG95bWVudElkKClgIHRocm93cyBpbiB3b3JsZHMgdGhhdFxuICogcmVxdWlyZSBhIGRlcGxveW1lbnQgYW5kIGhhdmUgbm9uZSwgYW5kIGEgcmUtZW5xdWV1ZWQgbWVzc2FnZSBjYXJyaWVzIG5vXG4gKiBgcnVuSW5wdXRgIGF0IGFsbC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2Fybk9uRGVwbG95bWVudFBpbm5pbmdNaXNtYXRjaCh7XG4gIHdvcmxkLFxuICBydW5JbnB1dCxcbiAgcnVuSWQsXG4gIHJ1bkxvZ2dlcixcbn06IHtcbiAgd29ybGQ6IFdvcmxkO1xuICBydW5JbnB1dDogUnVuSW5wdXQgfCB1bmRlZmluZWQ7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHJ1bkxvZ2dlcjogTG9nZ2VyO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaW5uZWREZXBsb3ltZW50SWQgPSBydW5JbnB1dD8uZGVwbG95bWVudElkO1xuICBpZiAoIXBpbm5lZERlcGxveW1lbnRJZCkgcmV0dXJuO1xuXG4gIGxldCBjdXJyZW50RGVwbG95bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBXb3JsZHMgdGhhdCByZXF1aXJlIGEgZGVwbG95bWVudCBpZCB0aHJvdyB3aGVuIHRoZXJlIGlzbid0IG9uZS4gVGhhdCBpc1xuICAgIC8vIG5vdCBhIG1pc21hdGNoIOKAlCB0aGVyZSBpcyBzaW1wbHkgbm90aGluZyB0byBjb21wYXJlIGFnYWluc3QuXG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghY3VycmVudERlcGxveW1lbnRJZCB8fCBjdXJyZW50RGVwbG95bWVudElkID09PSBwaW5uZWREZXBsb3ltZW50SWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBydW5Mb2dnZXIuZXJyb3IoXG4gICAgJ1F1ZXVlIG1lc3NhZ2Ugd2FzIGRlbGl2ZXJlZCB0byBhIGRlcGxveW1lbnQgaXQgd2FzIG5vdCBwaW5uZWQgdG8uICcgK1xuICAgICAgJ1RoZSBydW4gd2FzIGNyZWF0ZWQgdGFyZ2V0aW5nIGEgZGlmZmVyZW50IGRlcGxveW1lbnQsIHNvIHRoaXMgJyArXG4gICAgICAnaW52b2NhdGlvbiBtYXkgYmUgcmVwbGF5aW5nIGFnYWluc3QgY29kZSB0aGUgcnVuIHdhcyBub3Qgc3RhcnRlZCBvbi4gJyArXG4gICAgICAnQ29udGludWluZyDigJQgdGhpcyBpcyBleHBlY3RlZCBpZiB0aGUgV29ya2Zsb3cgU0RLIHZlcnNpb24gY2hhbmdlZCAnICtcbiAgICAgICdtaWQtcnVuIGluIGxvY2FsIGRldmVsb3BtZW50LCB3aGVyZSB0aGUgZGVwbG95bWVudCBpZCBpcyBkZXJpdmVkIGZyb20gJyArXG4gICAgICAndGhhdCB2ZXJzaW9uLicsXG4gICAge1xuICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICBwaW5uZWREZXBsb3ltZW50SWQsXG4gICAgICBjdXJyZW50RGVwbG95bWVudElkLFxuICAgIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnI6IHVua25vd24pOiBSdW5FcnJvckNvZGUgfCBudWxsIHtcbiAgaWYgKFdvcmtmbG93UnVudGltZUVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1I7XG4gIH1cblxuICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgc3RlcCBleGVjdXRpb24gcmVqZWN0ZWQgYmVjYXVzZSB0aGUgc3RlcCBlbnRpdHkgZG9lcyBub3QgZXhpc3Qg4oCUXG4gKiB0aGUgc2lnbmF0dXJlIG9mIGEgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggbWVzc2FnZSB3aG9zZSBkZWxpdmVyeSBiZWF0IChvclxuICogb3V0bGl2ZWQgYSB0cmFuc2llbnQgZmFpbHVyZSBvZikgdGhlIHByb2R1Y2VyJ3MgcGFyYWxsZWwgYHN0ZXBfY3JlYXRlZGBcbiAqIHdyaXRlLiBFdmVyeSBXb3JsZCBzdXJmYWNlcyBpdCBhcyBhIGBXb3JrZmxvd1dvcmxkRXJyb3JgIG5hbWluZyB0aGUgbWlzc2luZ1xuICogc3RlcDogd29ybGQtdmVyY2VsIG1hcHMgdGhlIGJhY2tlbmQncyA0MDQgdG9cbiAqIGB3b3JrZmxvdyBzdGVwIHN0ZXBf4oCmIG5vdCBmb3VuZGAsIHdvcmxkLWxvY2FsIGFuZCB3b3JsZC1wb3N0Z3JlcyB0aHJvd1xuICogYFN0ZXAgXCJzdGVwX+KAplwiIG5vdCBmb3VuZGAgZGlyZWN0bHkuIFRoZSBtZXNzYWdlIG1hdGNoIGlzIGRlbGliZXJhdGVseSBsb29zZVxuICogYWNyb3NzIHRob3NlIHNoYXBlczsgdGhlIHN0YXR1cyBjaGVjayBuYXJyb3dzIHRoZSByZW1vdGUgY2FzZSB3aXRob3V0XG4gKiBleGNsdWRpbmcgdGhlIGxvY2FsIG9uZXMgKHdoaWNoIGNhcnJ5IG5vIHN0YXR1cykuXG4gKlxuICogVXNlZCBvbmx5IHdoZW4gdGhlIG1lc3NhZ2UgY2FycmllcyBgc3RlcElucHV0YCDigJQgYSBiYXJlIGRpc3BhdGNoIHdpdGhvdXQgYVxuICogcGF5bG9hZCBoYXMgbm90aGluZyB0byByZWNvdmVyIGZyb20sIGFuZCB0aGUgZXJyb3Iga2VlcHMgcHJvcGFnYXRpbmcgZm9yXG4gKiBxdWV1ZS1kcml2ZW4gcmVjb3ZlcnkgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmZ1bmN0aW9uIGlzU3RlcE1pc3NpbmdFcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZXJyLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIGVyci5zdGF0dXMgIT09IDQwNCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gL3N0ZXAvaS50ZXN0KGVyci5tZXNzYWdlKSAmJiAvbm90IGZvdW5kL2kudGVzdChlcnIubWVzc2FnZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICB3b3JsZCxcbiAgd29ya2Zsb3dSdW4sXG4gIHJ1bklkLFxuICByZXF1ZXN0SWQsXG4gIGVycixcbiAgZXJyb3JDb2RlLFxuICBsb2dNZXNzYWdlLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1biB8IHVuZGVmaW5lZDtcbiAgcnVuSWQ6IHN0cmluZztcbiAgcmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGVycjogdW5rbm93bjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIGxvZ01lc3NhZ2U6IHN0cmluZztcbn0pIHtcbiAgcnVudGltZUxvZ2dlci5lcnJvcihsb2dNZXNzYWdlLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXJyb3JDb2RlLFxuICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1biA/PyBydW5JZCk7XG4gICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgIHJ1bklkLFxuICAgICAge1xuICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKSxcbiAgICAgICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgICAgICAod29ya2Zsb3dSdW4/LnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICksXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHsgcmVxdWVzdElkIH1cbiAgICApO1xuICB9IGNhdGNoIChmYWlsRXJyKSB7XG4gICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc1dvcmxkQ29udHJhY3RFcnJvcihmYWlsRXJyKSkge1xuICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgJ0ZhdGFsIHdvcmxkIGNvbnRyYWN0IGVycm9yIHdoaWxlIHJlY29yZGluZyB3b3JrZmxvdyBmYWlsdXJlJyxcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SLFxuICAgICAgICAgIGVycm9yOiBmYWlsRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBmYWlsRXJyLm1lc3NhZ2UgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGZhaWxFcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50czogRXZlbnRbXSwgcnVuSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBUZXJtaW5hbCBydW4gZXZlbnRzIGFyZSBhbHdheXMgbGFzdCBieSBjb25zdHJ1Y3Rpb24gKG5vIGV2ZW50IGNyZWF0aW9uXG4gIC8vIHN1Y2NlZWRzIGFnYWluc3QgYSB0ZXJtaW5hbCBydW4pLCBidXQgc2NhbiB0aGUgZnVsbCBhcnJheSBmb3JcbiAgLy8gZGVmZW5zZS1pbi1kZXB0aDogYSBXb3JsZC9iYWNrZW5kIG9yZGVyaW5nIGJ1ZyBzaG91bGRuJ3QgbWFrZSB1cyBtaXNzIGFuXG4gIC8vIGFjdHVhbCB0ZXJtaW5hdGlvbiBzaWduYWwuXG4gIGNvbnN0IHRlcm1pbmFsUnVuRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZSkgPT5cbiAgICAgIGUucnVuSWQgPT09IHJ1bklkICYmXG4gICAgICAoZS5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgIGUuZXZlbnRUeXBlID09PSAncnVuX2NhbmNlbGxlZCcpXG4gICk7XG5cbiAgaWYgKCF0ZXJtaW5hbFJ1bkV2ZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUnVuIHJlYWNoZWQgdGVybWluYWwgZXZlbnQsIGV4aXRpbmcnLCB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgZXZlbnRUeXBlOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50VHlwZSxcbiAgICBldmVudElkOiB0ZXJtaW5hbFJ1bkV2ZW50LmV2ZW50SWQsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEhvdyBtYW55IG9mIGBpZHNgIGFyZSBhYnNlbnQgZnJvbSBgcHJlc2VudGAuICovXG5mdW5jdGlvbiBjb3VudE1pc3NpbmdJZHMoaWRzOiBJdGVyYWJsZTxzdHJpbmc+LCBwcmVzZW50OiBTZXQ8c3RyaW5nPik6IG51bWJlciB7XG4gIGxldCBtaXNzaW5nID0gMDtcbiAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICBpZiAoIXByZXNlbnQuaGFzKGlkKSkgbWlzc2luZysrO1xuICB9XG4gIHJldHVybiBtaXNzaW5nO1xufVxuXG4vKipcbiAqIFRoZSBsaW5lYWdlIHJvb3Qgb2YgYSBsb2FkZWQgcnVuOiBpdHMgYCRyb290UnVuSWRgIGF0dHJpYnV0ZSwgb3IgaXRzIG93biBpZFxuICogd2hlbiBpdCBpcyBpdHNlbGYgYSByb290LlxuICovXG5mdW5jdGlvbiByb290UnVuSWRGcm9tKFxuICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICBydW5JZDogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYXR0cmlidXRlcz8uW1JPT1RfUlVOX0lEX0FUVFJJQlVURV0gPz8gcnVuSWQ7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcnVuIGhhcyBhIGhvb2sgYW5kL29yIHdhaXQgdGhhdCBhbiBvdXQtb2YtYmFuZCB3cml0ZXIgY291bGRcbiAqIGFwcGVuZCBhbiBldmVudCBmb3IgYmV0d2VlbiBhbiBpbmxpbmUgc3RlcCdzIGBzdGVwX2NvbXBsZXRlZGAgd3JpdGUgYW5kXG4gKiB0aGUgbmV4dCByZXBsYXkg4oCUIG5hbWVseSBhbiBvcGVuIGhvb2sgKGEgYGhvb2tfY3JlYXRlZGAgbm90IHlldFxuICogYGhvb2tfZGlzcG9zZWRgLCB3aGljaCBhIHdlYmhvb2sgcmVjZWl2ZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYGhvb2tfcmVjZWl2ZWRgKSBvciBhbiBvcGVuIHdhaXQgKGEgYHdhaXRfY3JlYXRlZGAgbm90IHlldFxuICogYHdhaXRfY29tcGxldGVkYCwgd2hpY2ggdGhlIHdhaXQgdGltZXIgY2FuIHJlc29sdmUgd2l0aFxuICogYHdhaXRfY29tcGxldGVkYCkuXG4gKlxuICogVGhpcyBnYXRlcyBWTSByZXRlbnRpb24sIHRoZSBpbmxpbmUtZGVsdGEgZmFzdCBwYXRoLCBhbmQgdHVyYm8ncyBmb3JjZWRcbiAqIG9wdGltaXN0aWMgc3RhcnQuIEEgdGVybWluYWwtc3RlcCBkZWx0YSBjYW4gb21pdCBhbiBldmVudCBhcHBlbmRlZFxuICogY29uY3VycmVudGx5IGFmdGVyIHRoYXQgd3JpdGUuIFdpdGggbm8gb3BlbiBob29rIG9yIHdhaXQsIG9ubHkgY2FuY2VsbGF0aW9uXG4gKiBjYW4gZG8gc28sIGFuZCBvYnNlcnZpbmcgaXQgb25lIHJlcGxheSBsYXRlIGlzIHNhZmUgYmVjYXVzZSB0aGUgbmV4dCBlbnRpdHlcbiAqIHdyaXRlIGlzIHJlamVjdGVkLlxuICpcbiAqIFN0ZXAtYm9keSBgYXR0cl9zZXRgIHdyaXRlcyBhcmUgTk9UIGEgY29uY2VybjogdGhleSBsYW5kIGJlZm9yZSB0aGVcbiAqIHN0ZXAncyB0ZXJtaW5hbCB3cml0ZSBhbmQgYXJlIHRoZXJlZm9yZSBhbHJlYWR5IGluc2lkZSB0aGUgcmV0dXJuZWRcbiAqIGRlbHRhLlxuICovXG5mdW5jdGlvbiBvcGVuSG9va0FuZFdhaXRTdGF0ZShldmVudHM6IEV2ZW50W10pOiB7XG4gIG9wZW5Ib29rOiBib29sZWFuO1xuICBvcGVuV2FpdDogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBob29rcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB3YWl0cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdob29rX2NyZWF0ZWQnOlxuICAgICAgICBob29rcy5hZGQoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaG9va19kaXNwb3NlZCc6XG4gICAgICAgIGhvb2tzLmRlbGV0ZShldmVudC5jb3JyZWxhdGlvbklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3YWl0X2NyZWF0ZWQnOlxuICAgICAgICB3YWl0cy5hZGQoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2FpdF9jb21wbGV0ZWQnOlxuICAgICAgICB3YWl0cy5kZWxldGUoZXZlbnQuY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBvcGVuSG9vazogaG9va3Muc2l6ZSA+IDAsIG9wZW5XYWl0OiB3YWl0cy5zaXplID4gMCB9O1xufVxuXG50eXBlIFJlcGxheUV2ZW50TG9nID1cbiAgfCB7IHR5cGU6ICdsb2FkQWxsJyB9XG4gIHwgKHsgdHlwZTogJ3JlYWR5JyB9ICYgTG9hZGVkRXZlbnRMb2cpXG4gIHwgKHsgdHlwZTogJ2xvYWRBZnRlcic7IGN1cnNvcjogc3RyaW5nIH0gJiBMb2FkZWRFdmVudExvZyk7XG5cbmZ1bmN0aW9uIG5leHRFdmVudExvZ0xvYWQobG9nOiBMb2FkZWRFdmVudExvZyk6IFJlcGxheUV2ZW50TG9nIHtcbiAgaWYgKGxvZy5jdXJzb3IgPT09IG51bGwpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnbG9hZEFsbCcgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdsb2FkQWZ0ZXInLFxuICAgIGV2ZW50czogbG9nLmV2ZW50cyxcbiAgICBjdXJzb3I6IGxvZy5jdXJzb3IsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEV2ZW50TG9nKGxvZzogTG9hZGVkRXZlbnRMb2csIGFwcGVuZGVkOiBMb2FkZWRFdmVudExvZyk6IHZvaWQge1xuICBhcHBlbmRVbmlxdWVFdmVudHMobG9nLmV2ZW50cywgYXBwZW5kZWQuZXZlbnRzKTtcbiAgbG9nLmN1cnNvciA9IGFwcGVuZGVkLmN1cnNvciA/PyBsb2cuY3Vyc29yO1xufVxuXG4vKipcbiAqIFRoZSB3aG9sZSByZXRlbnRpb24gcHJlZGljYXRlOiBrZWVwIHRoZSBzZXNzaW9uIG9ubHkgZm9yIGEgcHVyZSBzdGVwXG4gKiBib3VuZGFyeSAoZXZlcnkgc3VzcGVuc2lvbiBpdGVtIGlzIGEgc3RlcCDigJQgYW55IG90aGVyIGl0ZW0gdHlwZSwgcHJlc2VudFxuICogb3IgZnV0dXJlLCBpcyB1bnJldGFpbmFibGUgYnkgZGVmYXVsdCkgd2hvc2UgbmV3IHN0ZXAgaW5wdXRzIHNlcmlhbGl6ZWRcbiAqIHdpdGhvdXQgZXhlY3V0aW5nIHdvcmtmbG93IGNvZGUsIHdpdGggbm8gb3V0LW9mLWJhbmQgY29udGludWF0aW9uIHNvdXJjZTpcbiAqIGF0dHJpYnV0ZXMgcmVxdWlyZSByZXBsYXk7IGhvb2tzIGFuZCB3YWl0cyBjYW4gd2FrZSBhbm90aGVyIGludm9jYXRpb24uXG4gKiBgV09SS0ZMT1dfUkVUQUlORURfVk09MGAgZGlzYWJsZXMgcmV0ZW50aW9uIGVudGlyZWx5LlxuICpcbiAqIFRoZSBvcGVuIGhvb2svd2FpdCBzY2FuIGlzIE8oZXZlbnRzKSwgc28gaXQgaXMgdGFrZW4gdGhyb3VnaCBhIGxhenkgZ2V0dGVyXG4gKiBhbmQgY29uc3VsdGVkIGxhc3QsIGFmdGVyIGV2ZXJ5IGNoZWFwIGNoZWNrIGhhcyBwYXNzZWQuXG4gKlxuICogSU5WQVJJQU5UIHRoaXMgcHJlZGljYXRlIGxlYW5zIG9uOiBldmVyeSBzdXNwZW5zaW9uIHNpZ25hbGVyIHRoYXQgZG9lcyBOT1RcbiAqIGNhcnJ5IHRoZSBzdGVwLWNvbnN1bWVyIGdlbmVyYXRpb24gZ3VhcmQgKHNsZWVwLCBob29rLCBhdHRyaWJ1dGUg4oCUIHNlZVxuICogYHN1c3BlbnNpb25HZW5lcmF0aW9uYCBpbiBwcml2YXRlLnRzKSBtdXN0IGJlIHVucmV0YWluYWJsZSBoZXJlLCBlaXRoZXIgdmlhXG4gKiBhIG5vbi1zdGVwIHF1ZXVlIGl0ZW0gb3IgdGhlIG9wZW4gaG9vay93YWl0IHNjYW4uIEEgbmV3IHNpZ25hbGVyIHRoYXRcbiAqIHNhdGlzZmllcyBuZWl0aGVyIHdvdWxkIGxldCBhIHN0YWxlIHNpZ25hbCBiZSBhY2NlcHRlZCBhcyBhIGZyZXNoXG4gKiBzdXNwZW5zaW9uIG9uIGEgcmVzdW1lZCBzZXNzaW9uLlxuICpcbiAqIFF1aWVzY2VuY2UgYXNzdW1lcyB3b3JrZmxvdyBjb2RlIHN0YXlzIGluc2lkZSB0aGUgc2FuZGJveCdzIGRldGVybWluaXNtXG4gKiBjb250cmFjdC4gRXNjYXBpbmcgdG8gdGhlIGhvc3QgcmVhbG0gKGUuZy4gcmVjb3ZlcmluZyB0aGUgaG9zdCBgRnVuY3Rpb25gXG4gKiBjb25zdHJ1Y3RvciBmcm9tIGFuIGV4cG9zZWQgaG9zdCBjbGFzcyB0byBzY2hlZHVsZSByZWFsIHRpbWVycykgbWFrZXMgYVxuICogd29ya2Zsb3cgbm9uZGV0ZXJtaW5pc3RpYyB1bmRlciBvcmRpbmFyeSByZXBsYXkgdG9vLCBhbmQgaXMgbm90IGRlZmVuZGVkXG4gKiBoZXJlLlxuICovXG5mdW5jdGlvbiBjYW5SZXRhaW5Xb3JrZmxvd1Nlc3Npb24oXG4gIHN1c3BlbnNpb246IFdvcmtmbG93U3VzcGVuc2lvbixcbiAgc3RlcElucHV0c1NhZmU6IGJvb2xlYW4sXG4gIG9wZW5Ib29rV2FpdDogeyB2YWx1ZTogUmV0dXJuVHlwZTx0eXBlb2Ygb3Blbkhvb2tBbmRXYWl0U3RhdGU+IH1cbik6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgIWlzVm1SZXRlbnRpb25FbmFibGVkKCkgfHxcbiAgICAhc3RlcElucHV0c1NhZmUgfHxcbiAgICBzdXNwZW5zaW9uLnN0ZXBzLmxlbmd0aCA9PT0gMCB8fFxuICAgICFzdXNwZW5zaW9uLnN0ZXBzLmV2ZXJ5KChpdGVtKSA9PiBpdGVtLnR5cGUgPT09ICdzdGVwJylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHsgb3Blbkhvb2ssIG9wZW5XYWl0IH0gPSBvcGVuSG9va1dhaXQudmFsdWU7XG4gIHJldHVybiAhb3Blbkhvb2sgJiYgIW9wZW5XYWl0O1xufVxuXG4vKipcbiAqIE1heGltdW0gaW5saW5lLWV4ZWN1dGlvbiBkdXJhdGlvbiBmb3IgYSBzaW5nbGUgaGFuZGxlciBpbnZvY2F0aW9uLlxuICpcbiAqIE9yZGVyIG9mIHByZWNlZGVuY2U6XG4gKiAxLiBgV09SS0ZMT1dfVjJfVElNRU9VVF9NU2AgZW52IHZhclxuICogMi4gVGllcmVkIGJ1ZGdldCBkZXJpdmVkIGZyb20gYHdvcmxkLmdldFJ1bnRpbWVEZWFkbGluZSgpYFxuICogMy4gRGVmYXVsdCBvZiAyIG1pbnV0ZXNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4SW5saW5lRHVyYXRpb25NcyhcbiAgd29ybGQ6IFdvcmxkLFxuICBpbnZvY2F0aW9uU3RhcnRUaW1lOiBudW1iZXJcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHJhd0Vudk92ZXJyaWRlID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVjJfVElNRU9VVF9NUztcbiAgaWYgKHJhd0Vudk92ZXJyaWRlICE9PSB1bmRlZmluZWQgJiYgcmF3RW52T3ZlcnJpZGUgIT09ICcnKSB7XG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhd0Vudk92ZXJyaWRlKTtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgJiYgcGFyc2VkID4gMCkge1xuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBydW50aW1lRGVhZGxpbmUgPSBhd2FpdCB3b3JsZC5nZXRSdW50aW1lRGVhZGxpbmU/LigpO1xuICBpZiAocnVudGltZURlYWRsaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBkZWFkbGluZU1zID0gcnVudGltZURlYWRsaW5lLmdldFRpbWUoKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihkZWFkbGluZU1zKSkge1xuICAgICAgY29uc3QgbWF4RHVyYXRpb25NcyA9IE1hdGguZmxvb3IoZGVhZGxpbmVNcyAtIGludm9jYXRpb25TdGFydFRpbWUpO1xuICAgICAgaWYgKG1heER1cmF0aW9uTXMgPj0gbXMoJzI1bScpKSB7XG4gICAgICAgIHJldHVybiBtcygnMTBtJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhEdXJhdGlvbk1zID49IG1zKCcxMG0nKSkge1xuICAgICAgICByZXR1cm4gbXMoJzVtJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1zKCcybScpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgcm91dGUgd2hpY2ggaGFuZGxlcyB3b3JrZmxvdyBleGVjdXRpb24gcmVxdWVzdHMsXG4gKiBleGVjdXRpbmcgc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUgdG8gcmVkdWNlIGZ1bmN0aW9uIGludm9jYXRpb25zXG4gKiBhbmQgcXVldWUgb3ZlcmhlYWQuXG4gKlxuICogVGhlIGhhbmRsZXIgbG9vcHM6IHJlcGxheSB3b3JrZmxvdyDihpIgZXhlY3V0ZSBzdGVwIGlubGluZSDihpIgcmVwbGF5IOKGkiAuLi5cbiAqIHVudGlsIHRoZSB3b3JrZmxvdyBjb21wbGV0ZXMsIHRpbWVzIG91dCwgb3IgZW5jb3VudGVycyBub24tc3RlcCBzdXNwZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3dDb2RlIC0gVGhlIHdvcmtmbG93IGJ1bmRsZSBjb2RlIGNvbnRhaW5pbmcgYWxsIHdvcmtmbG93IGZ1bmN0aW9uc1xuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgVmVyY2VsIEFQSSByb3V0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dFbnRyeXBvaW50KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0PzogbnVtYmVyO1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICB9XG4pOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHNldFdvcmtmbG93QmFzZVBhdGgob3B0aW9ucz8uYmFzZVBhdGgpO1xuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpO1xuICBjb25zdCB3b3JrZmxvd1ByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgbmFtZXNwYWNlKTtcblxuICBjb25zdCBoYW5kbGVyID0gKHdvcmxkSGFuZGxlcnM6IFdvcmxkSGFuZGxlcnMpID0+XG4gICAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoXG4gICAgICB3b3JrZmxvd1ByZWZpeCxcbiAgICAgIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgLy8gVDIgb2YgdGhlIGhvb2stcmVzdW1lIFRUUiB3aW5kb3cgKHNlZSBydW50aW1lL3Jlc3VtZS1sYXRlbmN5LnRzKTpcbiAgICAgICAgLy8gdGhlIGluc3RhbnQgdGhpcyBjb25zdW1lciBiZWdhbiwgYmVmb3JlIG1lc3NhZ2UgcGFyc2luZy4gT25seSB1c2VkXG4gICAgICAgIC8vIHdoZW4gdGhlIG1lc3NhZ2UgdHVybnMgb3V0IHRvIGNhcnJ5IHJlc3VtZSB0aW1pbmc7IHRha2luZyBpdFxuICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHkga2VlcHMgaXQgaG9uZXN0IGZvciB0aGUgZGVsaXZlcmllcyB0aGF0IGRvLlxuICAgICAgICBjb25zdCBoYW5kbGVyRW50ZXJlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2VcbiAgICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgICAgLy8gVGhleSBvbmx5IHdyaXRlIGEgc2ltcGxlIHN0YXR1cyByZXNwb25zZSB0byBhIHN0cmVhbSBhbmQgZG8gbm90IGV4cG9zZSBzZW5zaXRpdmUgZGF0YS5cbiAgICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgICBpZiAoaGVhbHRoQ2hlY2spIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB0cmFjZUNhcnJpZXI6IGluY29taW5nVHJhY2VDYXJyaWVyLFxuICAgICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZSxcbiAgICAgICAgICBwcmVjb25kaXRpb25SZWludm9jYXRpb25zLFxuICAgICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQsXG4gICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgaG9va0lucHV0LFxuICAgICAgICAgIHN0ZXBJbnB1dCxcbiAgICAgICAgICBob29rUmVzdW1lVGltaW5nLFxuICAgICAgICB9ID0gV29ya2Zsb3dJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcblxuICAgICAgICAvLyAtLS0gSG9vay1yZXN1bWUgVFRSIHRlbGVtZXRyeSAocnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cykgLS0tXG4gICAgICAgIC8vIFRocmVhZGVkIHRocm91Z2ggdGhpcyBpbnZvY2F0aW9uIGFuZCBDT05TVU1FRCBieSB0aGUgZmlyc3QgZHVyYWJsZVxuICAgICAgICAvLyBzdGVwIHRoYXQgZm9sbG93cyB0aGUgcmVzdW1wdGlvbiDigJQgY2xlYXJlZCBhdCB0aGF0IHBvaW50IHNvIGEgbGF0ZXJcbiAgICAgICAgLy8gc3RlcCwgYSByZXRyeSwgb3IgYSByZWRlbGl2ZXJ5IG5ldmVyIHJlLXJlcG9ydHMgdGhlIHNhbWUgcmVzdW1lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUd28gZGVsaXZlcnkgc2hhcGVzIGNhcnJ5IHRpbWluZzpcbiAgICAgICAgLy8gIC0gdGhlIHJlc3VtZSdzIG93biBpbnZvY2F0aW9uIChubyBgc3RlcElkYCk6IHRoZSBwcm9kdWNlcidzIFQwL1QxXG4gICAgICAgIC8vICAgIHJpZGUgdGhlIG1lc3NhZ2UgYW5kIHRoaXMgaGFuZGxlcidzIGVudHJ5IGlzIFQyLlxuICAgICAgICAvLyAgLSBhIHN0ZXAgdGhpcyBpbnZvY2F0aW9uIGhhbmRlZCB0byBhbm90aGVyIGludm9jYXRpb24gKGBzdGVwSWRgXG4gICAgICAgIC8vICAgIHByZXNlbnQpOiB0aGUgcmVzdW1pbmcgaW52b2NhdGlvbiBhbHJlYWR5IHN0YW1wZWQgVDIuLlQ0IG9udG9cbiAgICAgICAgLy8gICAgdGhlIG1lc3NhZ2UsIHNvIHRoZXkgYXJlIHJlYWQgYmFjayB2ZXJiYXRpbS5cbiAgICAgICAgbGV0IHJlc3VtZVRyYWNraW5nID0gcmVzdW1lVHJhY2tpbmdGcm9tTWVzc2FnZShcbiAgICAgICAgICBob29rUmVzdW1lVGltaW5nLFxuICAgICAgICAgIGluY29taW5nU3RlcElkICE9PSB1bmRlZmluZWQgPyAnZGlzcGF0Y2hlZCcgOiAnaW5saW5lJ1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcgJiYgaW5jb21pbmdTdGVwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VtZVRyYWNraW5nLmNvbnN1bWVyU3RhcnRlZEF0TXMgPSBoYW5kbGVyRW50ZXJlZEF0TXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlc3VtZVRyYWNraW5nICYmXG4gICAgICAgICAgIU51bWJlci5pc0Zpbml0ZShyZXN1bWVUcmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBBIHN0ZXAgbWVzc2FnZSBmcm9tIGEgcHJvZHVjZXIgdGhhdCBmb3J3YXJkZWQgdGltaW5nIHdpdGhvdXQgdGhlXG4gICAgICAgICAgLy8gY29uc3VtZXIgYm91bmRhcmllcy4gTm90aGluZyBhZGRpdGl2ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyBhIHRyYWNlIGNhcnJpZXIsIGJ1dFxuICAgICAgICAvLyBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSByZXR1cm5zIGB7fWAgd2hlbiBubyBPVEVMIFNESyBpcyByZWdpc3RlcmVkXG4gICAgICAgIC8vIG9yIG5vIHNwYW4gaXMgYWN0aXZlIOKAlCB0cmVhdCBhbiBlbXB0eSBjYXJyaWVyIHRoZSBzYW1lIGFzIGFuXG4gICAgICAgIC8vIGFic2VudCBvbmUgc28gbGlua2VkIG1vZGUgZmFsbHMgYmFjayB0byBhIGZyZXNoIG9yaWdpbiBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIGZvcndhcmRpbmcgYSB1c2VsZXNzIGB7fWAgZm9yZXZlci5cbiAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdUcmFjZUNhcnJpZXIpXG4gICAgICAgICAgPyBpbmNvbWluZ1RyYWNlQ2FycmllclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbWV0YWRhdGE7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IG1ldGFkYXRhLnF1ZXVlTmFtZS5zbGljZSh3b3JrZmxvd1ByZWZpeC5sZW5ndGgpO1xuXG4gICAgICAgIC8vIC0tLSBNYXggZGVsaXZlcnkgY2hlY2sgLS0tXG4gICAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSB3b3JrZmxvd3MgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBydW4g4oCUIGF0dGFjaGVzIHJ1bklkL3dvcmtmbG93TmFtZSB0byBldmVyeVxuICAgICAgICAvLyBsb2cgbGluZSBhbmQgY2hpbGQgbG9nZ2VycyBiZWxvdywgc28gY2FsbGVycyBkb24ndCByZXBlYXQgaXQuXG4gICAgICAgIGNvbnN0IHJ1bkxvZ2dlciA9IHJ1bnRpbWVMb2dnZXIuZm9yUnVuKHJ1bklkLCB3b3JrZmxvd05hbWUpO1xuXG4gICAgICAgIGNvbnN0IG1heFF1ZXVlRGVsaXZlcmllcyA9IGdldE1heFF1ZXVlRGVsaXZlcmllcygpO1xuICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IG1heFF1ZXVlRGVsaXZlcmllcykge1xuICAgICAgICAgIGNvbnN0IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbiA9IGRlc2NyaWJlRXJyb3IoXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERURcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBXb3JrZmxvdyBoYW5kbGVyIGV4Y2VlZGVkIG1heCBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICBlcnJvckNvZGU6IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5lcnJvckNvZGUsXG4gICAgICAgICAgICAgIGVycm9yQXR0cmlidXRpb246IG1heERlbGl2ZXJpZXNEZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHJ1bklkKTtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgICBgV29ya2Zsb3cgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7bWF4UXVldWVEZWxpdmVyaWVzfSlgXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgIC8vIFJ1biBhbHJlYWR5IGZpbmlzaGVkLCBjb25zdW1lIHRoZSBtZXNzYWdlIHNpbGVudGx5XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bkxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHJ1biBhcyBmYWlsZWQgYWZ0ZXIgJHttZXRhZGF0YS5hdHRlbXB0fSBkZWxpdmVyeSBhdHRlbXB0cy4gYCArXG4gICAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBydW4gZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgICBgVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZSB1bnRpbCBtYW51YWxseSByZXNvbHZlZC4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBUcmFjZSBjb3JyZWxhdGlvbiBtb2RlIC0tLVxuICAgICAgICAvLyAnbGlua2VkJyAoZGVmYXVsdCk6IHRoZSB3b3JrZmxvdy5leGVjdXRlIHNwYW4gYmVsb3cgc3RheXMgYSBDSElMRFxuICAgICAgICAvLyBvZiB0aGUgbG9jYWwgZGVsaXZlcnkgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIG9uZSBpbnZvY2F0aW9uIOKAlFxuICAgICAgICAvLyByb3V0ZSBoYW5kbGVyLCB3b3JrZmxvdyByZXBsYXksIGlubGluZSBzdGVwcywgZXZlbnQgd3JpdGVzIOKAlCBpcyBhXG4gICAgICAgIC8vIHNpbmdsZSBib3VuZGVkIHRyYWNlLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IHRyYXZlbHMgYXMgYSBzcGFuXG4gICAgICAgIC8vIExJTksgKG5vdCBhIHBhcmVudCksIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gICAgICAgIC8vIHVuY2hhbmdlZCwgc28gYSAocG90ZW50aWFsbHkgaG91cnMtbG9uZykgcnVuIGlzIG5ldmVyIHN0aXRjaGVkXG4gICAgICAgIC8vIGludG8gb25lIGdpYW50IHRyYWNlIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAgICAgICAgLy8gJ2NvbnRpbnVvdXMnOiBsZWdhY3kgYmVoYXZpb3Ig4oCUIHRoZSByZXN0b3JlZCBydW4tb3JpZ2luIGNvbnRleHRcbiAgICAgICAgLy8gYmVjb21lcyB0aGUgcGFyZW50IG9mIHRoaXMgaW52b2NhdGlvbidzIHNwYW5zLlxuICAgICAgICBjb25zdCB0cmFjZU1vZGUgPSBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpO1xuXG4gICAgICAgIC8vIFRyYWNlIGNhcnJpZXIgdG8gYXR0YWNoIHRvIG1lc3NhZ2VzIHRoaXMgaW52b2NhdGlvbiBlbnF1ZXVlcyDigJRcbiAgICAgICAgLy8gc2VlIGdldE5leHRUcmFjZUNhcnJpZXIgZm9yIHRoZSBsaW5rZWQvY29udGludW91cyBzZW1hbnRpY3MuXG4gICAgICAgIGNvbnN0IG5leHRUcmFjZUNhcnJpZXIgPSAoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PlxuICAgICAgICAgIGdldE5leHRUcmFjZUNhcnJpZXIodHJhY2VNb2RlLCB0cmFjZUNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNwYW4gbGlua3MgdG8gdGhlIGluY29taW5nIGRlbGl2ZXJ5IGNvbnRleHQgYW5kIChpbiBsaW5rZWQgbW9kZSlcbiAgICAgICAgLy8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmcm9tIHRoZSB0cmFjZSBjYXJyaWVyLlxuICAgICAgICBjb25zdCBzcGFuTGlua3MgPSBhd2FpdCBidWlsZEludm9jYXRpb25TcGFuTGlua3MoXG4gICAgICAgICAgdHJhY2VNb2RlLFxuICAgICAgICAgIHRyYWNlQ29udGV4dFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRoZSByZXBsYXkgYnVkZ2V0IGNvdmVycyBvcmNoZXN0cmF0aW9uIHdvcmsgYmV0d2VlbiBzdGVwcywgbm90IGlubGluZVxuICAgICAgICAvLyBzdGVwIGJvZGllcy4gSXQgaXMgY2hlY2tlZCBiZXR3ZWVuIGxvb3AgaXRlcmF0aW9uczsgc3RlcCBib2RpZXMgdXNlXG4gICAgICAgIC8vIHRoZSBwbGF0Zm9ybSB0aW1lb3V0IGFuZCBOT19JTkxJTkVfUkVQTEFZX0FGVEVSX01TIGd1YXJkIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHJlcGxheUJ1ZGdldCA9IG5ldyBSZXBsYXlCdWRnZXQoKTtcblxuICAgICAgICAvLyBJbiBsaW5rZWQgbW9kZSB0aGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIE5PVCByZXN0b3JlZCBhcyB0aGVcbiAgICAgICAgLy8gYWN0aXZlIChwYXJlbnQpIGNvbnRleHQg4oCUIHBhc3NpbmcgYHVuZGVmaW5lZGAgbWFrZXNcbiAgICAgICAgLy8gd2l0aFRyYWNlQ29udGV4dCBhIHBhc3N0aHJvdWdoLCBzbyB0aGUgd29ya2Zsb3cuZXhlY3V0ZSBzcGFuIGJlbG93XG4gICAgICAgIC8vIHN0YXlzIGEgY2hpbGQgb2YgdGhlIGxvY2FsIGRlbGl2ZXJ5IChmbG93LXJvdXRlKSBjb250ZXh0IGFuZCB0aGVcbiAgICAgICAgLy8gcnVuLW9yaWdpbiB0cmF2ZWxzIGFzIGEgc3BhbiBsaW5rIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHBhcmVudFRyYWNlQ2FycmllciA9XG4gICAgICAgICAgdHJhY2VNb2RlID09PSAnY29udGludW91cycgPyB0cmFjZUNvbnRleHQgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFF1ZXVlLWRlbGl2ZXJlZCBpbnZvY2F0aW9uOiBDT05TVU1FUiBraW5kLCBtYXRjaGluZyB0aGVcbiAgICAgICAgLy8gcXVldWUtZGVsaXZlcmVkIHN0ZXAuZXhlY3V0ZSBzcGFuLlxuICAgICAgICBjb25zdCBzcGFuS2luZCA9IGF3YWl0IGdldFNwYW5LaW5kKCdDT05TVU1FUicpO1xuICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFRyYWNlQ29udGV4dChwYXJlbnRUcmFjZUNhcnJpZXIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgd2l0aFdvcmtmbG93QmFnZ2FnZShcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIHdvcmtmbG93TmFtZSB9LFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGQnLCBhc3luYyAoKSA9PlxuICAgICAgICAgICAgICAgIGdldFdvcmxkKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gQm90aCBjaGVja3MgYmVsb3cgbG9vayBhdCBgcnVuSW5wdXRgLCBzbyBib3RoIGFyZSBuby1vcHMgb24gYVxuICAgICAgICAgICAgICAvLyByZS1lbnF1ZXVlZCBtZXNzYWdlICh3aGljaCBjYXJyaWVzIG5vbmUpIOKAlCB0aGV5IG9ubHkgZXZlciBydW4gb25cbiAgICAgICAgICAgICAgLy8gYSBmaXJzdCBkZWxpdmVyeSwgdGhlIG9uZSB0aGF0IGNvdWxkIGNyZWF0ZSB0aGUgcnVuLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBSZXR1cm5pbmcgYWNrcyB0aGUgbWVzc2FnZS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgbWlzbWF0Y2ggaXNcbiAgICAgICAgICAgICAgLy8gYmFrZWQgaW50byB0aGlzIG1lc3NhZ2UsIHNvIGV2ZXJ5IHJlZGVsaXZlcnkgd291bGQgcmVhY2ggdGhlXG4gICAgICAgICAgICAgIC8vIHNhbWUgdmVyZGljdCwgYW5kIHRocm93aW5nIHdvdWxkIGp1c3QgaG90LWxvb3AgdGhlIGhhbmRsZXIgdW50aWxcbiAgICAgICAgICAgICAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgd2l0aCB0aGUgc2FtZSBlcnJvciBlYWNoIHRpbWUuIEl0IG1hdGNoZXNcbiAgICAgICAgICAgICAgLy8gaG93IHRoZSBydW5fc3RhcnRlZCBwYXRoIGFscmVhZHkgZGlzY2FyZHMgZGVsaXZlcmllcyB3aG9zZVxuICAgICAgICAgICAgICAvLyB2ZXJkaWN0IGNhbm5vdCBjaGFuZ2UgKEVudGl0eUNvbmZsaWN0RXJyb3IsIFJ1bkV4cGlyZWRFcnJvcikuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICByZWZ1c2VDcm9zc0Vudmlyb25tZW50RGVsaXZlcnkoe1xuICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgcnVuTG9nZ2VyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljIG9ubHkg4oCUIHNlZSB0aGUgaGVscGVyIGZvciB3aHkgdGhpcyB3YXJucyBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAgIC8vIHJlZnVzaW5nIHRoZSBpbnZvY2F0aW9uLlxuICAgICAgICAgICAgICBhd2FpdCB3YXJuT25EZXBsb3ltZW50UGlubmluZ01pc21hdGNoKHtcbiAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICBydW5JbnB1dCxcbiAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICBydW5Mb2dnZXIsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgICAgICAgYHdvcmtmbG93LmV4ZWN1dGUgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YCxcbiAgICAgICAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignZXhlY3V0ZV92MicpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZShtZXRhZGF0YS5xdWV1ZU5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1ldGFkYXRhLm1lc3NhZ2VJZCksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwcm9jZXNzJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLmdldFF1ZXVlT3ZlcmhlYWQoeyByZXF1ZXN0ZWRBdCB9KSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dUcmFjZU1vZGUodHJhY2VNb2RlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vSW5saW5lUmVwbGF5QWZ0ZXJNcyA9IGF3YWl0IGdldE1heElubGluZUR1cmF0aW9uTXMoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgbGV0IGxvb3BJdGVyYXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlciA9IHJlcGxheURpdmVyZ2VuY2VcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVwbGF5UmVjb3ZlcnlSZXBvcnRlcihyZXBsYXlEaXZlcmdlbmNlLmNvdW50KVxuICAgICAgICAgICAgICAgICAgICA6IFJlcGxheVJlY292ZXJ5UmVwb3J0ZXIuaW5lcnQoKTtcbiAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IHdyaXRlIHRoaXMgbG9vcCBtYWtlcyBjYXJyaWVzIHRoZSBjdXJzb3Igb2YgdGhlIGxvZ1xuICAgICAgICAgICAgICAgICAgLy8gaXQgd2FzIGNvbXB1dGVkIGFnYWluc3QsIGFuZCBmb2xkcyBhIGNvbXBsZXRlIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAvLyBkZWx0YSBpbnRvIHRoYXQgbG9nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlRXZlbnQgPSBhc3luYyA8VCBleHRlbmRzIENyZWF0ZUV2ZW50UmVxdWVzdD4oXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IFQsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4gICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2luY2VDdXJzb3IgPSBkZWx0YVJlcXVlc3RDdXJzb3IoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2l0aFNuYXBzaG90ID0geyAuLi5zbG90U25hcHNob3QoKSwgLi4ucGFyYW1zIH07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIud2l0aEV2ZW50Q3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHNpbmNlQ3Vyc29yID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gd2l0aFNuYXBzaG90XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4ud2l0aFNuYXBzaG90LCBzaW5jZUN1cnNvciB9LFxuICAgICAgICAgICAgICAgICAgICAgIChwKSA9PiB3b3JsZC5ldmVudHMuY3JlYXRlKHJ1bklkLCBkYXRhLCBwKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgIGFic29yYkNyZWF0ZURlbHRhKHNpbmNlQ3Vyc29yLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBzbG90IHNuYXBzaG90IGZvciBhIHdyaXRlIGlzc3VlZCBmcm9tIHRoaXMgbG9vcDogaG93XG4gICAgICAgICAgICAgICAgICAgKiBtdWNoIG9mIHRoZSBydW4ncyBsb2cgdGhlIGRlY2lzaW9uIGJlaGluZCBpdCB3YXMgbWFkZVxuICAgICAgICAgICAgICAgICAgICogYWdhaW5zdC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBFdmVyeSB3cml0ZSBnb2VzIHRocm91Z2ggaGVyZSwgaW5jbHVkaW5nIHRoZSBvbmVzIHRoYXQgYXNrXG4gICAgICAgICAgICAgICAgICAgKiBmb3IgYW4gaW5saW5lIGRlbHRhLiBUaGUgdHdvIGFuc3dlciBkaWZmZXJlbnQgcXVlc3Rpb25zIGFuZFxuICAgICAgICAgICAgICAgICAgICogYSBXb3JsZCBpcyBmcmVlIHRvIHNlcnZlIGJvdGg6IHRoZSBjdXJzb3Igc2F5cyB3aGVyZSB0b1xuICAgICAgICAgICAgICAgICAgICogc3RhcnQgbGlzdGluZyBmcm9tLCB0aGUgc2xvdCBzYXlzIHdoaWNoIGV2ZW50cyB0aGlzIHdyaXRlclxuICAgICAgICAgICAgICAgICAgICogaGFkIGFscmVhZHkgZGVjaWRlZCB3aXRob3V0LiBXb3JsZHMgdGhhdCB0cmVhdCB0aGUgZGVsdGEgYXNcbiAgICAgICAgICAgICAgICAgICAqIHRoZSBiZXR0ZXIgYW5zd2VyIHNpbXBseSBpZ25vcmUgdGhlIHNsb3QuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGFrZW4gZnJvbSB3aGF0ZXZlciBpcyBsb2FkZWQsIGluY2x1ZGluZyB0aGUgc3RhbGVcbiAgICAgICAgICAgICAgICAgICAqIGBsb2FkQWZ0ZXJgIHN0YXRlLiBVbmRlcnN0YXRpbmcgaXMgc2FmZTogdGhlIFdvcmxkIHJlcG9ydHNcbiAgICAgICAgICAgICAgICAgICAqIGJhY2sgYSB3aWRlciBzcGFuIHRoYW4gc3RyaWN0bHkgbmVlZGVkLCBhbmRcbiAgICAgICAgICAgICAgICAgICAqIGBtZXJnZVJlcG9ydGVkRXZlbnRzYCBkcm9wcyB3aGF0IHRoZSBsb2cgYWxyZWFkeSBob2xkcy5cbiAgICAgICAgICAgICAgICAgICAqIE92ZXJzdGF0aW5nIGlzIG5vdCwgc28gdGhlcmUgaXMgbm8gZ3Vlc3Npbmcgd2hlbiBub3RoaW5nIGlzXG4gICAgICAgICAgICAgICAgICAgKiBsb2FkZWQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBzbG90U25hcHNob3QgPSAoKTogU2xvdFNuYXBzaG90UGFyYW1zID0+XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWxsJ1xuICAgICAgICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICAgICAgICA6IHNsb3RTbmFwc2hvdFBhcmFtcyhldmVudExvZy5ldmVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBjdXJzb3IgdG8gYXNrIGZvciBhbiBpbmxpbmUgZGVsdGEgYWdhaW5zdCwgb3JcbiAgICAgICAgICAgICAgICAgICAqIHVuZGVmaW5lZCB0byBub3QgYXNrLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFR1cmJvIGlzIGV4Y2x1ZGVkIG9uIHB1cnBvc2U6IGl0IGV4aXN0cyB0byBtYWtlIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICogaW52b2NhdGlvbidzIHdyaXRlcyBhcyBjaGVhcCBhcyBwb3NzaWJsZSwgYW5kIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICogbG9hZGVkIGxvZyB0byBleHRlbmQuIFJ1bi10ZXJtaW5hbCB3cml0ZXMgYXJlIGV4Y2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIG5vdGhpbmcgcmVhZHMgdGhlIGxvZyBhZnRlcndhcmRzLCBzbyB0aGUgZGVsdGFcbiAgICAgICAgICAgICAgICAgICAqIHdvdWxkIGJlIHdvcmsgdGhlIFdvcmxkIGRvZXMgZm9yIG5vIG9uZS4gQSBjYWxsZXIgdGhhdFxuICAgICAgICAgICAgICAgICAgICogc2V0IGl0cyBvd24gYHNpbmNlQ3Vyc29yYCAob3IgYXNrZWQgZm9yIHRoZSBgcnVuX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgKiAvIGBob29rX3JlY2VpdmVkYCBwcmVsb2FkLCB3aGljaCBvd25zIHRoZSBzYW1lIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgKiBmaWVsZHMpIGtlZXBzIHdoYXQgaXQgYXNrZWQgZm9yLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YVJlcXVlc3RDdXJzb3IgPSAoXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBDcmVhdGVFdmVudFBhcmFtcyB8IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHR1cmJvIHx8XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5JyB8fFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz8uc2luY2VDdXJzb3IgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz8ucHJlbG9hZEV2ZW50cyA9PT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGlzVGVybWluYWxSdW5FdmVudFR5cGUoZGF0YS5ldmVudFR5cGUpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50TG9nLmN1cnNvciA/PyB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIEZvbGQgYW4gaW5saW5lIGRlbHRhIHJldHVybmVkIGJ5IGBldmVudHMuY3JlYXRlYCBpbnRvIHRoZVxuICAgICAgICAgICAgICAgICAgICogaW4tbWVtb3J5IGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBUaGUgZGVsdGEgaXMgd2hhdCBgZXZlbnRzLmxpc3QoeyBjdXJzb3I6IHNlbnRDdXJzb3IgfSlgXG4gICAgICAgICAgICAgICAgICAgKiB3b3VsZCBoYXZlIHJldHVybmVkIHJpZ2h0IGFmdGVyIHRoZSB3cml0ZSwgc28gaXQgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICogYmFjayBib3RoIG91ciBvd24gZXZlbnQgYW5kIGFueXRoaW5nIGFub3RoZXIgd3JpdGVyXG4gICAgICAgICAgICAgICAgICAgKiBhcHBlbmRlZCBpbiBiYW5kLiBBYnNvcmJpbmcgaXQgaGVyZSBtZWFucyB0aGUgbmV4dCByZWFkZXJcbiAgICAgICAgICAgICAgICAgICAqIGFscmVhZHkgaGFzIHRoZSBsb2cgYW5kIHRoZSBsb29wJ3MgaW5jcmVtZW50YWxcbiAgICAgICAgICAgICAgICAgICAqIGBldmVudHMubGlzdGAgZmluZHMgbm90aGluZyBsZWZ0IHRvIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIERlbGliZXJhdGVseSBub3QgYGFic29yYlNraXBwZWRTbG90UmVwb3J0YCwgZXZlbiB0aG91Z2ggdGhlXG4gICAgICAgICAgICAgICAgICAgKiBgaGFzTW9yZWAgaGFsZiBvZiB0aGUgdHdvIHBvbGljaWVzIGNvaW5jaWRlcy4gQSBkZWx0YVxuICAgICAgICAgICAgICAgICAgICogZXh0ZW5kcyB0aGUgdGFpbCBhbmQgY2FycmllcyBhIGN1cnNvciB0aGF0IGhhcyB0byBtb3ZlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAqIGl0LCBzbyBpdCBhcHBlbmRzIHdpdGhvdXQgcmUtc29ydGluZyBhbmQgbmVlZHMgdGhlIGN1cnNvclxuICAgICAgICAgICAgICAgICAgICogZ3VhcmQgYmVsb3c7IGEgc2tpcHBlZC1zbG90IHJlcG9ydCBpcyBhIHdpbmRvdyBzdHJpY3RseVxuICAgICAgICAgICAgICAgICAgICogYmVsb3cgdGhlIHdyaXRlLCBjYXJyaWVzIG5vIGN1cnNvciwgYW5kIGhhcyB0byBiZSBzb3J0ZWRcbiAgICAgICAgICAgICAgICAgICAqIGJhY2sgaW50byBwbGFjZS4gU2hhcmluZyBhbiBpbXBsZW1lbnRhdGlvbiB3b3VsZCBtZWFuIG9uZVxuICAgICAgICAgICAgICAgICAgICogb2YgdGhlbSBkb2luZyB0aGUgb3RoZXIncyB3b3JrLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIERlY2xpbmluZyBpcyBhbHdheXMgc2FmZSDigJQgYW4gdW5hYnNvcmJlZCBkZWx0YSBpcyBhIGRlbHRhXG4gICAgICAgICAgICAgICAgICAgKiB0aGUgbmV4dCBgZXZlbnRzLmxpc3RgIHJldHVybnMg4oCUIHNvIHRoZSBndWFyZHMgYXJlIGZyZWUgdG9cbiAgICAgICAgICAgICAgICAgICAqIGJlIHN0cmljdDpcbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiAtIGBoYXNNb3JlYCBtZWFucyB0aGUgV29ybGQgdHJ1bmNhdGVkIHRoZSBwYWdlLiBUYWtpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAqICAgd2hpbGUgYWR2YW5jaW5nIHRoZSBjdXJzb3IgdG8gdGhlIHBhZ2UgZW5kIHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgKiAgIGZpbmUsIGJ1dCB0YWtpbmcgaXQgYW5kIE5PVCBhZHZhbmNpbmcgd291bGQgZHVwbGljYXRlLFxuICAgICAgICAgICAgICAgICAgICogICBhbmQgdGhlIHRydW5jYXRlZCBjYXNlIGlzIHJhcmUgZW5vdWdoIG5vdCB0byBzcGVjaWFsLWNhc2UuXG4gICAgICAgICAgICAgICAgICAgKiAtIFRoZSBjdXJzb3IgbXVzdCBiZSBleGFjdGx5IHdoZXJlIGl0IHdhcyB3aGVuIHRoZSByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgKiAgIHdlbnQgb3V0LiBDb25jdXJyZW50IHdyaXRlcyBlYWNoIGRpZmYgYWdhaW5zdCB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgKiAgIHRoZXkgc2F3LCBhbmQgYGFwcGVuZFVuaXF1ZUV2ZW50c2AgZGVsaWJlcmF0ZWx5IGRvZXMgbm90XG4gICAgICAgICAgICAgICAgICAgKiAgIHJlLXNvcnQsIHNvIGFic29yYmluZyBhIHNlY29uZCBkZWx0YSBjb21wdXRlZCBmcm9tIGFuXG4gICAgICAgICAgICAgICAgICAgKiAgIG9sZGVyIGN1cnNvciBjb3VsZCBhcHBlbmQgZXZlbnRzIGJlaGluZCBvbmVzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAqICAgdGFrZW4uIEZpcnN0IHJlc3BvbnNlIGJhY2sgd2luczsgdGhlIHJlc3QgYXJlIGRyb3BwZWQuXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGFic29yYkNyZWF0ZURlbHRhID0gKFxuICAgICAgICAgICAgICAgICAgICBzZW50Q3Vyc29yOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogRXZlbnRSZXN1bHRcbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5JyB8fFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmN1cnNvciAhPT0gc2VudEN1cnNvciB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogcmVzdWx0LmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gYHJlYWR5YCBjYW4gcmVwbGF5IG9uY2Ugd2l0aG91dCBhIHJlYWQuIFRoZSBvdGhlciBzdGF0ZXNcbiAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaWJlIHRoZSBuZXh0IGxvYWQgZXhhY3RseS5cbiAgICAgICAgICAgICAgICAgIGxldCBldmVudExvZzogUmVwbGF5RXZlbnRMb2cgPSB7IHR5cGU6ICdsb2FkQWxsJyB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBTaGFyZWQgc3RhdGU6IHNldCBieSBlaXRoZXIgdGhlIGJhY2tncm91bmQgc3RlcCBwYXRoXG4gICAgICAgICAgICAgICAgICAvLyBvciB0aGUgcnVuX3N0YXJ0ZWQgc2V0dXAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gU2VydmVyLXN1cHBsaWVkIHBlci1ydW4gZXZlbnQgY2VpbGluZyBmcm9tIHRoZSBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UuIFVuZGVmaW5lZCDih5Igbm8gZW5mb3JjZW1lbnQgKG9sZGVyIHNlcnZlcnMsIHR1cmJvKS5cbiAgICAgICAgICAgICAgICAgIGxldCBtYXhFdmVudHNMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgbGV0IHdvcmtmbG93U3RhcnRlZEF0ID0gLTE7XG5cbiAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5IChUVEZTKSBzdGF0ZSDigJQgc2VlIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzLlxuICAgICAgICAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIGludm9jYXRpb24ncyBGSVJTVCBldmVudCBzbmFwc2hvdCBjb250YWluZWRcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYmV5b25kIHJ1bl9jcmVhdGVkL3J1bl9zdGFydGVkOiBhbnl0aGluZyBlbHNlIHdhc1xuICAgICAgICAgICAgICAgICAgLy8gd3JpdHRlbiBieSBhbiBlYXJsaWVyIGludm9jYXRpb24sIHdob3NlIGNvbnRyaWJ1dGlvbiB0b1xuICAgICAgICAgICAgICAgICAgLy8gdGltZS10by1maXJzdC1zdGVwIChpbmNsdWRpbmcgdGhlIHF1ZXVlIGhvcCBiYWNrIGhlcmUpXG4gICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgYmUgbWVhc3VyZWQgd2FsbC1jbG9jaywgc28gVFRGUyBpcyBub3QgcmVwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAvLyBTZXQgb25jZSwgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbidzIGxvYWRlZCBzbmFwc2hvdC5cbiAgICAgICAgICAgICAgICAgIGxldCBpbnZvY2F0aW9uU3RhcnRlZENsZWFuOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgLy8gRXBvY2ggbXMgdGhlIGBydW5fc3RhcnRlZGAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkL3BhcnNlZFxuICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFNESyDigJQgYW5jaG9ycyBSU0ZTIChydW5fc3RhcnRlZCDihpIgZmlyc3Qgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAvLyBzdGFydCBQT1NUKS4gU2V0IG9uY2UsIGluIHRoZSBydW5fc3RhcnRlZCBzZXR1cCBiZWxvdy5cbiAgICAgICAgICAgICAgICAgIC8vIFVuZGVyIHR1cmJvLCBydW5fc3RhcnRlZCBpcyBiYWNrZ3JvdW5kZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF3YWl0ZWQsIHNvIHRoaXMgaXMgc3RhbXBlZCBhdCB0aGUgcG9pbnQgdGhlIHJ1biBpc1xuICAgICAgICAgICAgICAgICAgLy8gc3ludGhlc2l6ZWQgbG9jYWxseSBpbnN0ZWFkIG9mIHRoZSByZWFsIHJlc3BvbnNlIOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgIC8vIFN0ZXBMYXRlbmN5VHJhY2tpbmcucnNmc0FuY2hvck1zLlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgIC8vIFdhbGwtY2xvY2sgbXMgc3BlbnQgY29tbWl0dGluZyBob29rX2NyZWF0ZWQgZXZlbnRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHN0ZXAgcmFuLCBhY2N1bXVsYXRlZCBhY3Jvc3Mgc3VzcGVuc2lvbiBwYXNzZXNcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdWJ0cmFjdGVkIGZyb20gVFRGUy4gQWNjdW11bGF0b3JzIGhlcmUgc3Vydml2ZSBhblxuICAgICAgICAgICAgICAgICAgLy8gaW4tcHJvY2VzcyByZXBsYXkgcmVzdGFydCAoYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24sIG9yXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlLWV2ZW50IHJlc3RhcnQgYmVsb3cpLCBzbyBhIHJlc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBvdmVyLWNvdW50cyBieSB0aGUgYWJhbmRvbmVkIHBhc3MncyBob29rIHRpbWUg4oCUXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBzbGlnaHQgb3Zlci1jb3VudCBlaXRoZXIgcmVzdGFydCBoYXMgYWx3YXlzIGhhZC5cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVTdGVwQmxvY2tpbmdNcyA9IDA7XG4gICAgICAgICAgICAgICAgICAvLyBTbmFwc2hvdCBvZiB0aGUgYWNjdW11bGF0b3IgYXMgb2YgdGhlIHN1c3BlbnNpb24gdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgdGhlIHJ1bidzIGZpcnN0IGF0dHJfc2V0ICh3aG9zZSBob29rIHBoYXNlIHJhblxuICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGl0cyBhdHRyIHdyaXRlcykuIFdoZW4gYSBwcmUtc3RlcCBzZXRBdHRyaWJ1dGVzXG4gICAgICAgICAgICAgICAgICAvLyBlbmRzIHRoZSBUVEZTIG1lYXN1cmVtZW50IGF0IHRoZSBhdHRyIHdyaXRlLCBvbmx5IGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZnJvbSBCRUZPUkUgdGhhdCBwb2ludCBtYXkgYmUgc3VidHJhY3RlZCDigJQgbGF0ZXJcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgd3JpdGVzIGZhbGwgb3V0c2lkZSB0aGUgbWVhc3VyZWQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgbGV0IHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZhc3QtcGF0aHMgdGhlIHZlcnkgZmlyc3QgZGVsaXZlcnkgb2YgdGhlIHZlcnlcbiAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24sIHdoZXJlIGl0IGlzIHByb3ZhYmx5IHNhZmUgdG86IGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIGBydW5fc3RhcnRlZGAsIHNraXAgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzXG4gICAgICAgICAgICAgICAgICAvLyBiZWVuIHdyaXR0ZW4geWV0KSwgYW5kIGZvcmNlIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IChub1xuICAgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCBwZWVyIGhhbmRsZXIgZXhpc3RzIHRvIHJhY2UgdGhlIGNyZWF0ZS1jbGFpbSkuXG4gICAgICAgICAgICAgICAgICAvLyBgcnVuSW5wdXRgIGlzIG9ubHkgcHJlc2VudCBvbiB0aGUgc3RhcnQoKS1lbnF1ZXVlZCBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgLy8gYW5kIGBhdHRlbXB0ID09PSAxYCAoMS1iYXNlZCkgbWVhbnMgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5OyBgaW5jb21pbmdTdGVwSWRgIHdvdWxkIG1hcmsgYSBiYWNrZ3JvdW5kLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gYW5kIGByZXBsYXlEaXZlcmdlbmNlYCBhIHJlY292ZXJ5IHJlcGxheSDigJQgYm90aFxuICAgICAgICAgICAgICAgICAgLy8gaW5lbGlnaWJsZS4gVGhlIHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSB0aGF0IG1ha2VzIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgLy8gb3B0aW1pc3RpYyBzdGFydCBzYWZlIGVuZHMgb25jZSBhIGhvb2sgb3Igd2FpdCBpcyBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAvLyAodGhleSBpbnRyb2R1Y2UgcmVzdW1lIGludm9jYXRpb25zKSwgc28gdHVyYm8gZXhpdHMgYXQgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQgKHNlZSBgZm9yY2VPcHRpbWlzdGljU3RhcnRgKS4gV29ya2Zsb3cgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZXMgaW50cm9kdWNlIG5vIHN1Y2ggaW52b2NhdGlvbiBzb3VyY2Ug4oCUIHRoZXkgcmVzb2x2ZVxuICAgICAgICAgICAgICAgICAgLy8gdmlhIGFuIGluLXByb2Nlc3MgcmVwbGF5IGFuZCBkb24ndCBlbmQgdHVyYm8uXG4gICAgICAgICAgICAgICAgICAvLyBOT1RFOiBgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMWAgaXMgYWxzbyBsb2FkLWJlYXJpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBpbmxpbmUgc3RlcCBvd25lcnNoaXA6IG93bmVkLXJlY292ZXJ5IHN0ZXBzIChhIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHN0YW1wZWQgYnkgYSBQUkVWSU9VUyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2UpIGNhbiBvbmx5XG4gICAgICAgICAgICAgICAgICAvLyBleGlzdCBvbiBhdHRlbXB0IOKJpSAyLCBzbyB0dXJibyBhbmQgb3duZWQgcmVjb3ZlcnkgYXJlXG4gICAgICAgICAgICAgICAgICAvLyBtdXR1YWxseSBleGNsdXNpdmUuIFRoZSB0dXJibyBgcmVpbnZva2UoKWAgcGF0aHMgKGhvb2tcbiAgICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0LCB0aHJvdHRsZSBiYWNrb2ZmKSBhY2sgdGhpcyBtZXNzYWdlIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgLy8gdW5kZXIgYSBORVcgbWVzc2FnZSBpZCDigJQgc2FmZSBvbmx5IGJlY2F1c2Ugbm9cbiAgICAgICAgICAgICAgICAgIC8vIG5vbi10ZXJtaW5hbCBzdGVwIGNhbiBiZSBpbmxpbmUtb3duZWQgYnkgdGhlIGFja2VkIGlkXG4gICAgICAgICAgICAgICAgICAvLyB3aGVuIHR1cmJvIGlzIG9uLiBJZiB0dXJibyBldmVyIGVuZ2FnZXMgb24gcmVkZWxpdmVyaWVzLFxuICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgcGF0aHMgbXVzdCBmaXJzdCBjaGVjayBmb3Igb3duZWQgcGVuZGluZyBzdGVwcyBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBgeyB0aW1lb3V0U2Vjb25kcyB9YCByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgY29uc3QgdHVyYm8gPVxuICAgICAgICAgICAgICAgICAgICBpc1R1cmJvRW5hYmxlZCgpICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bklucHV0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuYXR0ZW1wdCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICBpbmNvbWluZ1N0ZXBJZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICFyZXBsYXlEaXZlcmdlbmNlO1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuV29ya2Zsb3dUdXJibyh0dXJibykpO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZFxuICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCBoYXMgbGFuZGVkIChvciByZWplY3RzIGlmIGl0IGZhaWxlZCkuIFRocmVhZGVkXG4gICAgICAgICAgICAgICAgICAvLyBpbnRvIGhhbmRsZVN1c3BlbnNpb24gYW5kIGV4ZWN1dGVTdGVwIHNvIG5vIHN0ZXAvaG9vay93YWl0XG4gICAgICAgICAgICAgICAgICAvLyB3cml0ZSByYWNlcyBhaGVhZCBvZiB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZCBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAvLyB0dXJibywgd2hlcmUgYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkIHVwIGZyb250LlxuICAgICAgICAgICAgICAgICAgbGV0IHJ1blJlYWR5QmFycmllcjogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgLy8gT3JkZXIgYSB0ZXJtaW5hbCBydW4gd3JpdGUgKHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkKSBhZnRlclxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZCBpbiB0dXJibyBtb2RlIOKAlCBhIG5vLXN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNhbiBvdGhlcndpc2UgcmVhY2ggcnVuX2NvbXBsZXRlZCBiZWZvcmUgdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgLy8gZXhpc3RzLiBCZXN0LWVmZm9ydDogYSBiYXJyaWVyIHJlamVjdGlvbiBpcyBzd2FsbG93ZWQgZm9yXG4gICAgICAgICAgICAgICAgICAvLyBvcmRlcmluZyBvbmx5OyBpZiBydW5fc3RhcnRlZCB0cnVseSBmYWlsZWQgdGhlIHRlcm1pbmFsIHdyaXRlXG4gICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlcyB0aGUgcmVhbCBlcnJvciAocnVuIG5vdCBmb3VuZCAvIGdvbmUpIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVycy4gTm8tb3Agb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3YWl0UnVuUmVhZHkgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5SZWFkeUJhcnJpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcnVuUmVhZHlCYXJyaWVyO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZW50aW9uYWw6IG9yZGVyaW5nIGJhcnJpZXIgb25seSDigJQgc2VlIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSBvcmNoZXN0cmF0b3IuIE91dHNpZGUgdHVyYm8gdGhpcyByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCwgd2hpY2ggbWFrZXMgdGhlIHF1ZXVlIHJlc2NoZWR1bGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBDVVJSRU5UIGRlbGl2ZXJ5J3MgbWVzc2FnZS4gSW4gdHVyYm8gdGhhdCBpcyBhIHRyYXA6IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtZXNzYWdlIGNhcnJpZXMgYHJ1bklucHV0YCwgYW5kIG9uIGFzeW5jIHF1ZXVlc1xuICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gZ3JhcGhpbGUtd29ya2VyKSBhIHJlc2NoZWR1bGUgY29tZXMgYmFjayBhcyBkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCAxIOKAlCBzbyB0dXJibyByZS1lbmdhZ2VzLCBza2lwcyB0aGUgZXZlbnQtbG9nIGxvYWRcbiAgICAgICAgICAgICAgICAgIC8vIGFnYWluLCByZXBsYXlzIGFnYWluc3QgYW4gZW1wdHkgbG9nLCBuZXZlciBvYnNlcnZlcyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2sgZXZlbnQgdGhpcyBpbnZvY2F0aW9uIGp1c3Qgd3JvdGUsIGFuZCByZS1zdXNwZW5kc1xuICAgICAgICAgICAgICAgICAgLy8gZm9yZXZlciAodGhlIHJ1biB3ZWRnZXMpLiBVbmRlciB0dXJibyB3ZSBpbnN0ZWFkIGVucXVldWUgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNvbnRpbnVhdGlvbiB0aGF0IGNhcnJpZXMgTk8gYHJ1bklucHV0YCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBuZXh0IGRlbGl2ZXJ5IGlzIGEgbm9ybWFsIChub24tdHVyYm8pIGxvYWQtYW5kLXJlcGxheSB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcyB0aGUgY29tbWl0dGVkIGV2ZW50cyBhbmQgbWFrZXMgcHJvZ3Jlc3M7IHdlIHRoZW5cbiAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBgdW5kZWZpbmVkYCBzbyB0aGUgcXVldWUgdHJlYXRzIHRoaXMgZGVsaXZlcnkgYXMgZG9uZVxuICAgICAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYWxzbyByZXNjaGVkdWxpbmcgaXQuXG4gICAgICAgICAgICAgICAgICAvLyBJbmxpbmUtb3duZXJzaGlwIGludmFyaWFudCBndWFyZDogY29ycmVsYXRpb24gSURzIG9mXG4gICAgICAgICAgICAgICAgICAvLyBzdGVwcyB3aG9zZSBib2RpZXMgdGhpcyBpbnZvY2F0aW9uIGlzIGV4ZWN1dGluZyB1bmRlciBhblxuICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIHN0YW1wIChsYXp5IGlubGluZSArIG93bmVkIHJlY292ZXJ5KSwgd2hpbGUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBib2R5IGlzIGluIGZsaWdodC4gQ3Jhc2ggcmVjb3ZlcnkgZGVwZW5kcyBvbiB0aGUgb3duaW5nXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIE5PVCBiZWluZyBhY2tlZCB3aGlsZSBzdWNoIGEgc3RlcCBpcyBub24tdGVybWluYWxcbiAgICAgICAgICAgICAgICAgIC8vIChhY2sgPSBoYW5kbGVyIHJldHVybiBvciByZWludm9rZSwgd2hpY2ggYWNrcyArIGVucXVldWVzXG4gICAgICAgICAgICAgICAgICAvLyB1bmRlciBhIE5FVyBtZXNzYWdlIGlkIOKAlCB0aGUgcmVkZWxpdmVyeSBvZiB0aGUgb2xkIGlkIGlzXG4gICAgICAgICAgICAgICAgICAvLyB3aGF0IHJlLWV4ZWN1dGVzIGFuIG9ycGhhbmVkIG93bmVkIHN0ZXApLiBBbGwgZXhlY3V0ZVN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIGFyZSBhd2FpdGVkIGJlZm9yZSBhbnkgYWNrIHBhdGggcnVucywgc28gdGhpcyBzZXRcbiAgICAgICAgICAgICAgICAgIC8vIGlzIGVtcHR5IGF0IGV2ZXJ5IGFjayBieSBjb25zdHJ1Y3Rpb247IHRoZSBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIGNhdGNoIGZ1dHVyZSByZWZhY3RvcnMgdGhhdCBicmVhayB0aGF0IG9yZGVyaW5nLlxuICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbGlnaHRPd25lZFN0ZXBzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcyA9IChcbiAgICAgICAgICAgICAgICAgICAgYWNrUGF0aDogc3RyaW5nXG4gICAgICAgICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluRmxpZ2h0T3duZWRTdGVwcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnSW52YXJpYW50IHZpb2xhdGlvbjogYWNraW5nIHRoZSB3b3JrZmxvdyBtZXNzYWdlIHdoaWxlIG93bmVkIGlubGluZSBzdGVwcyBhcmUgc3RpbGwgZXhlY3V0aW5nIOKAlCBjcmFzaCByZWNvdmVyeSBmb3IgdGhlc2Ugc3RlcHMgaXMgYnJva2VuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFja1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IFsuLi5pbkZsaWdodE93bmVkU3RlcHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8vIEEgcGxhaW4gb3JjaGVzdHJhdG9yLXJlcGxheSBtZXNzYWdlLiBPbWl0cyBgcnVuSW5wdXRgIChpdFxuICAgICAgICAgICAgICAgICAgLy8gcmUtZW5nYWdlcyB0dXJibyBvbiB0aGUgbmV4dCBkZWxpdmVyeSBhbmQgd2VkZ2VzIHRoZSBydW4g4oCUXG4gICAgICAgICAgICAgICAgICAvLyBzZWUgYHJlaW52b2tlYCBiZWxvdykgYW5kIGByZXBsYXlEaXZlcmdlbmNlYCAvXG4gICAgICAgICAgICAgICAgICAvLyBgc2VydmVyRXJyb3JSZXRyeUNvdW50YCAodGhpcyBkZWxpdmVyeSBjaGFpbidzIGJ1ZGdldHMpLlxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGF5TWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgIGFzeW5jICgpOiBQcm9taXNlPFdvcmtmbG93SW52b2tlUGF5bG9hZD4gPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IG5leHRUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaW52b2tlID0gYXN5bmMgKFxuICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIEV4dHJhIGZpZWxkcyB0byBjYXJyeSBvbiB0aGUgbmV3IG1lc3NhZ2UuIE9ubHkgcmVhY2hlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogbmV4dCBpbnZvY2F0aW9uIG9uIHRoZSB0dXJibyBwYXRoOiB3aXRob3V0IHR1cmJvIG5vXG4gICAgICAgICAgICAgICAgICAgICAqIG1lc3NhZ2UgaXMgZW5xdWV1ZWQgYXQgYWxsIOKAlCB0aGUgaGFuZGxlciByZXR1cm5zIGFcbiAgICAgICAgICAgICAgICAgICAgICogdmlzaWJpbGl0eSB0aW1lb3V0IGFuZCB0aGUgcXVldWUgcmVkZWxpdmVycyB0aGUgQ1VSUkVOVFxuICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlLCB3aG9zZSBib2R5IChhbmQgdGhlcmVmb3JlIGFueSBjb3VudGVyIG9uIGl0KVxuICAgICAgICAgICAgICAgICAgICAgKiBjYW5ub3QgYmUgY2hhbmdlZC5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhUGF5bG9hZD86IFBhcnRpYWw8V29ya2Zsb3dJbnZva2VQYXlsb2FkPlxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTx7IHRpbWVvdXRTZWNvbmRzOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnROb0luRmxpZ2h0T3duZWRTdGVwcygncmVpbnZva2UnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dXJibykgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IGRlbGF5U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgIHsgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksIC4uLmV4dHJhUGF5bG9hZCB9LFxuICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kcyA+IDAgPyB7IGRlbGF5U2Vjb25kcyB9IDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBQcmVjb25kaXRpb24gKDQxMikgcmVjb3Zlcnk6IGhvdyBtYW55IHRpbWVzIHRoaXMgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgLy8gaGFzIHRocm93biBhd2F5IGl0cyByZXBsYXkgYW5kIHN0YXJ0ZWQgb3ZlciBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgbGV0IHByZWNvbmRpdGlvblJlc3RhcnRzID0gMDtcbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRXZlbnQgaWRzIHRoZSBkaXNjYXJkZWQgcmVwbGF5IGhlbGQsIGtlcHQgdW50aWwgdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAqIGxvYWQgcmVzb2x2ZXMgc28gYSByZXN0YXJ0IGNhbiByZXBvcnQgd2hhdCBpdHMgcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgKiBhY3R1YWxseSBmb3VuZC4gV2l0aG91dCB0aGlzIGEgNDEyIG9ubHkgZXZlciB0ZWxscyB5b3UgdGhhdFxuICAgICAgICAgICAgICAgICAgICogYSByZXN0YXJ0IGhhcHBlbmVkLCB3aGljaCBjb25mbGF0ZXMgdHdvIHZlcnkgZGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgKiBzaXR1YXRpb25zOiBhIGxvZyB0aGF0IGdyZXcgKGV4cGVjdGVkIOKAlCB0aGUgZmVuY2UgZGlkIGl0c1xuICAgICAgICAgICAgICAgICAgICogam9iKSBhbmQgYSBsb2cgdGhhdCBjYW1lIGJhY2sgaWRlbnRpY2FsLCB3aGljaCBtZWFucyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZW5kIGRpc2FncmVlIGFib3V0IHRoZSBjb3VudCBmb3IgdGhlIHNhbWUgc2V0IG9mXG4gICAgICAgICAgICAgICAgICAgKiBldmVudHMgYW5kIHRoZSByZXN0YXJ0IHdpbGwgcmUtZGVyaXZlIHRoZSBzYW1lIHNuYXBzaG90IGFuZFxuICAgICAgICAgICAgICAgICAgICogYmUgcmVqZWN0ZWQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgIGxldCBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmU6IHtcbiAgICAgICAgICAgICAgICAgICAgaWRzOiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdGFydDogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICByZWFzb246IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaW5saW5lLWRlbHRhJyB8ICdmdWxsLXJlbG9hZCc7XG4gICAgICAgICAgICAgICAgICB9IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAqIFJlcG9ydCB3aGF0IGEgc3RhbGUtc25hcHNob3QgcmVzdGFydCdzIHJlbG9hZCBmb3VuZCwgb25jZVxuICAgICAgICAgICAgICAgICAgICogdGhlIGxvZyB0aGlzIHJlcGxheSB3aWxsIGFjdHVhbGx5IGNvbnN1bWUgaXMgaW4gaGFuZC5cbiAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgKiBgZ3Jld2AgaXMgdGhlIGV4cGVjdGVkIGNhc2UgYW5kIGdpdmVzIDQxMiB2b2x1bWUgYVxuICAgICAgICAgICAgICAgICAgICogZGVub21pbmF0b3IuIGB1bmNoYW5nZWRgIG1lYW5zIHRoZSByZWxvYWQgZGlzYWdyZWVkIHdpdGhcbiAgICAgICAgICAgICAgICAgICAqIHRoZSByZWplY3Rpb24sIHNvIHRoaXMgcmVwbGF5IHJlLWRlcml2ZXMgdGhlIHNhbWUgc25hcHNob3RcbiAgICAgICAgICAgICAgICAgICAqIGFuZCBpcyByZWplY3RlZCBhZ2FpbiB1bnRpbCB0aGUgYnVkZ2V0IGlzIHNwZW50LiBgc2hyYW5rYFxuICAgICAgICAgICAgICAgICAgICogc2hvdWxkIGJlIGltcG9zc2libGU6IGV2ZXJ5IGxvYWQgcGF0aCBvbmx5IGFkZHMgdG8gYSBydW4nc1xuICAgICAgICAgICAgICAgICAgICogbG9nLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRQcmVjb25kaXRpb25SZXN0YXJ0UmVsb2FkID0gKFxuICAgICAgICAgICAgICAgICAgICBldmVudHM6IEV2ZW50W11cbiAgICAgICAgICAgICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlbGluZSA9IHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFiYXNlbGluZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0QmFzZWxpbmUgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbG9hZGVkSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgICAgICAgICAgICBldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkZWQgPSBjb3VudE1pc3NpbmdJZHMocmVsb2FkZWRJZHMsIGJhc2VsaW5lLmlkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRyb3BwZWQgPSBjb3VudE1pc3NpbmdJZHMoYmFzZWxpbmUuaWRzLCByZWxvYWRlZElkcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG91dGNvbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQgPiAwID8gJ3NocmFuaycgOiBhZGRlZCA+IDAgPyAnZ3JldycgOiAndW5jaGFuZ2VkJztcblxuICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgJ1Jlc3RhcnRlZCByZXBsYXkgcmVsb2FkZWQgaXRzIGV2ZW50IGxvZyBhZnRlciBhIHN0YWxlLXNuYXBzaG90IHJlamVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRjb21lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzQmVmb3JlOiBiYXNlbGluZS5pZHMuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50c0FmdGVyOiByZWxvYWRlZElkcy5zaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHM6IGJhc2VsaW5lLnJlc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGJhc2VsaW5lLnJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogYmFzZWxpbmUuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgKiBSZWNvdmVyIGZyb20gYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gYnkgcmVzdGFydGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHJlcGxheSBpbnNpZGUgdGhpcyBpbnZvY2F0aW9uLCByZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGVcbiAgICAgICAgICAgICAgICAgICAqIHBlci1pbnZvY2F0aW9uIGJ1ZGdldCBpcyBzcGVudCAodGhlIGNhbGxlciB0aGVuIGZhbGxzIGJhY2tcbiAgICAgICAgICAgICAgICAgICAqIHRvIGEgZnJlc2ggaW52b2NhdGlvbikuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogQSA0MTIgbWVhbnMgdGhlIGxvZyB0aGlzIHJlcGxheSBkZXJpdmVkIGl0cyBldmVudHMgZnJvbSB3YXNcbiAgICAgICAgICAgICAgICAgICAqIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgaGFkIGFscmVhZHkgcmVjb3JkZWQuIFRoZVxuICAgICAgICAgICAgICAgICAgICogcmVqZWN0ZWQgd3JpdGUgY2Fubm90IHNpbXBseSBiZSByZXRyaWVkOiBjb3JyZWxhdGlvbiBpZHNcbiAgICAgICAgICAgICAgICAgICAqIGFyZSBwb3NpdGlvbmFsIG9yZGluYWxzIG9mIG9uZSBzZWVkZWQgc2VxdWVuY2UsIHNvIGEgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgKiBvdmVyIHRoZSBjb3JyZWN0ZWQgbG9nIG1pbnRzIGEgZGlmZmVyZW50IGlkIGZvciB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICogbG9naWNhbCBldmVudCwgYW5kIHJlLXBvc3RpbmcgdGhpcyBvbmUgd291bGQgcGVyc2lzdCBhblxuICAgICAgICAgICAgICAgICAgICogZXZlbnQgbm8gY29ycmVjdCByZXBsYXkgZXZlciBwcm9kdWNlcy4gVGhlIHdob2xlIHJlcGxheSBoYXNcbiAgICAgICAgICAgICAgICAgICAqIHRvIGJlIHJlLWRlcml2ZWQg4oCUIHdoaWNoIHRoZSBsb29wIGRvZXMgYnkgZGlzY2FyZGluZyBpdHNcbiAgICAgICAgICAgICAgICAgICAqIGNhY2hlZCBsb2csIHNpbmNlIGBydW5Xb3JrZmxvd2AgdGhlbiBidWlsZHMgYSBmcmVzaCBWTSxcbiAgICAgICAgICAgICAgICAgICAqIHNlZWQgYW5kIGNvcnJlbGF0aW9uLWlkIHNlcXVlbmNlIGZyb20gdGhlIHJlbG9hZGVkIGV2ZW50cy5cbiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdGFydFJlcGxheUluUHJvY2VzcyA9IChcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yPzogdW5rbm93bixcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIFNldCBmYWxzZSB3aGVuIHdyaXRlcyB0aGlzIGludm9jYXRpb24gbWFkZSBjb25jdXJyZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICogd2l0aCB0aGUgcmVqZWN0ZWQgb25lIG1heSBiZSBtaXNzaW5nIGZyb20gdGhlIDQxMidzXG4gICAgICAgICAgICAgICAgICAgICAqIGRlbHRhOiB0aGUgV29ybGQgY29tcHV0ZWQgdGhhdCBkZWx0YSBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiByZWplY3RlZCByZXF1ZXN0J3Mgc25hcHNob3QsIHNvIGl0IGNhbm5vdCBjb250YWluIGFuXG4gICAgICAgICAgICAgICAgICAgICAqIGV2ZW50IGEgc2libGluZyBjb21taXR0ZWQgYWZ0ZXJ3YXJkcywgYW5kIG1lcmdpbmcgaXRcbiAgICAgICAgICAgICAgICAgICAgICogd291bGQgcmVzdGFydCB0aGUgcmVwbGF5IG9uIGEgbG9nIHRoYXQgaXMgc3RpbGxcbiAgICAgICAgICAgICAgICAgICAgICogaW5jb21wbGV0ZS4gT25seSBhIGZ1bGwgcmVsb2FkIGlzIGF1dGhvcml0YXRpdmUgdGhlbi5cbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHsgYWxsb3dEZWx0YSA9IHRydWUgfTogeyBhbGxvd0RlbHRhPzogYm9vbGVhbiB9ID0ge31cbiAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVzdGFydHMgPj1cbiAgICAgICAgICAgICAgICAgICAgICBnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmVjb25kaXRpb25SZXN0YXJ0cysrO1xuICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzdGFsZS1zbmFwc2hvdCByZXN0YXJ0IGludmFsaWRhdGVzIHRoZSBwYXJrZWQgVk06XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgaXQgY29uc3VtZWQgd2FzIG1pc3NpbmcgZXZlbnRzLCBzbyBvbmx5IGEgZnJlc2hcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IG92ZXIgdGhlIGNvcnJlY3RlZCBsb2cgaXMgYXV0aG9yaXRhdGl2ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGNvdmVycyB0aGUgc3VzcGVuc2lvbi1jcmVhdGUgNDEyLCB3aGljaCBmaXJlc1xuICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJldGVudGlvbiBkZWNpc2lvbiAoa2lsbCBzd2l0Y2ggKyBzdGVwLWlucHV0XG4gICAgICAgICAgICAgICAgICAgIC8vIGdhdGUpIGV2ZXIgcmFuLCBhbmQgdGhlIHJ1bl9jb21wbGV0ZWQgNDEyLCB3aGVyZSBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzZXNzaW9uIG11c3Qgbm90IGJlIHJlc3VtZWQgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgV29ybGQgTUFZIHJldHVybiB0aGUgZXZlbnRzIHdlIHdlcmUgbWlzc2luZyBvbiB0aGUgNDEyLlxuICAgICAgICAgICAgICAgICAgICAvLyBUcnVzdCBpdCBvbmx5IG9uIHRoZSBGSVJTVCByZXN0YXJ0OiBpdHMgY29tcGxldGVuZXNzIHByb29mXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlYW5zIG9uIHRoZSBiYWNrZW5kJ3Mgb3duIGJvb2trZWVwaW5nLCBzbyBpZiB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyLWNvdW50cywgYSBcImNvbXBsZXRlXCIgZGVsdGEgY2FuIHN0aWxsIGxlYXZlIGEgaG9sZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQm91bmRpbmcgaXQgdG8gb25lIGF0dGVtcHQgY2FwcyB0aGF0IGF0IGEgc2luZ2xlIHdhc3RlZFxuICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0OyBldmVyeSBsYXRlciByZXN0YXJ0IGRvZXMgdGhlIGF1dGhvcml0YXRpdmUgbG9hZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgIGFsbG93RGVsdGEgJiYgcHJlY29uZGl0aW9uUmVzdGFydHMgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJlY29uZGl0aW9uRXZlbnREZWx0YShlcnJvciwgcnVuSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEEgZGVsdGEgaXMgb25seSB1c2FibGUgaWYgdGhlcmUgaXMgYSBsb2FkZWQgbG9nIHRvIG1lcmdlXG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IGludG87IHdpdGhvdXQgb25lIHRoZSByZXN0YXJ0IG11c3QgbG9hZCBldmVyeXRoaW5nLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VkRGVsdGEgPVxuICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICE9PSBudWxsICYmIGV2ZW50TG9nLnR5cGUgIT09ICdsb2FkQWxsJztcbiAgICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3QgdGhlIHNldCBiZWluZyBkaXNjYXJkZWQgd2hpbGUgaXQgaXMgc3RpbGwgaW5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZDsgdGhlIGNvbXBhcmlzb24gaGFwcGVucyBvbmNlIHRoZSBuZXh0IGxvYWQgcmVzb2x2ZXMuXG4gICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRCYXNlbGluZSA9XG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSAhPT0gJ2xvYWRBbGwnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHM6IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQuZXZlbnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnQ6IHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHVzZWREZWx0YSA/ICdpbmxpbmUtZGVsdGEnIDogJ2Z1bGwtcmVsb2FkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgJiYgZXZlbnRMb2cudHlwZSAhPT0gJ2xvYWRBbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBNVVNUIGJlIGEgZnVsbCwgY3Vyc29yLWxlc3MgcmVsb2FkLiBUaGUgY3Vyc29yIGxpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZm9yd2FyZCBmcm9tIHRoZSBoaWdoZXN0IGV2ZW50IGlkIHRoaXMgcmVwbGF5IGhvbGRzLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3aGF0IGEgc3RhbGUgc25hcHNob3QgaXMgbWlzc2luZyBzaXRzIGJlbG93IGl0OiBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2xvdCBhbGxvY2F0ZWQgaW5zaWRlIGEgY29uY3VycmVudCBjb21taXQgdGFrZXMgYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIHRoaXMgcmVwbGF5IGhhZCBhbHJlYWR5IHJlYWQgcGFzdC4gQW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbCBsb2FkIHN0YXJ0cyBhYm92ZSB0aGUgaG9sZSBhbmQgbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5zIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyB0eXBlOiAnbG9hZEFsbCcgfTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29ycmVjdGVkIGxvZyBpbnNlcnRzIHRoZSBtaXNzaW5nIGV2ZW50cyBCRUxPVyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggYWxyZWFkeSBzY2FubmVkIGZvciBwYXlsb2FkIHByZXdhcm1pbmcsIHNoaWZ0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgbGF0ZXIgcG9zaXRpb24uIE9ubHkgYSBmdWxsIHJlc2NhbiBzZWVzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlLnJlc2V0U2NhbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAnRXZlbnQgY3JlYXRpb24gcmVqZWN0ZWQgYXMgc3RhbGU7IHJlc3RhcnRpbmcgcmVwbGF5IGluLXByb2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNvbmRpdGlvblJlc3RhcnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1c2VkRGVsdGEgPyAnaW5saW5lLWRlbHRhJyA6ICdmdWxsLXJlbG9hZCcsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucHJlY29uZGl0aW9uX3Jlc3RhcnRzJzogcHJlY29uZGl0aW9uUmVzdGFydHMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICogRXNjYWxhdGUgYSBzdGFsZS1zbmFwc2hvdCByZWplY3Rpb24gdGhhdCBzdXJ2aXZlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAqIGluLXByb2Nlc3MgcmVzdGFydCBidWRnZXQgdG8gYSBmcmVzaCBpbnZvY2F0aW9uLCBvciBnaXZlIHVwXG4gICAgICAgICAgICAgICAgICAgKiBvbiB0aGUgcnVuIHdoZW4gdGhlIHBlci1ydW4gYnVkZ2V0IGlzIGFsc28gc3BlbnQuXG4gICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICogVGhlIGluLXByb2Nlc3MgYnVkZ2V0IGlzIGEgY2xvc3VyZSB2YXJpYWJsZSBhbmQgdGhlIHF1ZXVlJ3NcbiAgICAgICAgICAgICAgICAgICAqIGRlbGl2ZXJ5IGNvdW50IHJlc3RhcnRzIGF0IDEgd2hlbmV2ZXIgYSBuZXcgbWVzc2FnZSBpc1xuICAgICAgICAgICAgICAgICAgICogZW5xdWV1ZWQsIHNvIGEgcnVuIHRoYXQgaXMgcGVybWFuZW50bHkgdW5hYmxlIHRvIGNhdGNoIHVwXG4gICAgICAgICAgICAgICAgICAgKiB3aXRoIGl0cyBvd24gZXZlbnQgbG9nIHdvdWxkIG90aGVyd2lzZSBjeWNsZSByZXN0YXJ0cyDihpJcbiAgICAgICAgICAgICAgICAgICAqIHJlLWludm9rZSDihpIgcmVzdGFydHMgd2l0aCBubyBydW4tbGV2ZWwgYm91bmQuIFRoZSBjaGFpbiBpc1xuICAgICAgICAgICAgICAgICAgICogdGhlcmVmb3JlIGNvdW50ZWQgb24gdGhlIG1lc3NhZ2UgaXRzZWxmLCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAgICAgICAgICAqIHJlcGxheSBkaXZlcmdlbmNlcyBhcmUsIGFuZCBmYWlscyB0aGUgcnVuIG9uY2UgZXhoYXVzdGVkLlxuICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAqIFRoZSBjb3VudGVyIG9ubHkgYWR2YW5jZXMgb24gaG9wcyB0aGF0IGVucXVldWUgYSBuZXcgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICogKHNlZSBgcmVpbnZva2VgKS4gQSByZWRlbGl2ZXJ5LWJhc2VkIGhvcCBrZWVwcyB0aGUgc2FtZSBib2R5XG4gICAgICAgICAgICAgICAgICAgKiBhbmQgc28gdGhlIHNhbWUgY291bnQsIGJ1dCBpdCBhbHNvIGtlZXBzIGFkdmFuY2luZ1xuICAgICAgICAgICAgICAgICAgICogYG1ldGFkYXRhLmF0dGVtcHRgLCB3aGljaCB0aGUgbWF4LWRlbGl2ZXJ5IGNoZWNrIGF0IHRoZSB0b3BcbiAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBoYW5kbGVyIGFscmVhZHkgYm91bmRzIOKAlCBhbmQgdGhlIGRlbGF5IGJlbG93IGlzIHdoYXRcbiAgICAgICAgICAgICAgICAgICAqIG1ha2VzIHRoYXQgYnVkZ2V0IHNwYW4gcmVhbCB0aW1lIHJhdGhlciB0aGFuIGJlaW5nIGJ1cm5lZCBpblxuICAgICAgICAgICAgICAgICAgICogYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBjb25zdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24gPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogdW5rbm93blxuICAgICAgICAgICAgICAgICAgKTogUHJvbWlzZTxcbiAgICAgICAgICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHsgdGltZW91dFNlY29uZHM6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfCB7IHJlaW52b2tlZDogZmFsc2U7IGVycm9yOiBFcnJvciB9XG4gICAgICAgICAgICAgICAgICA+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9IChwcmVjb25kaXRpb25SZWludm9jYXRpb25zID8/IDApICsgMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4UmVpbnZvY2F0aW9ucyA9IGdldFByZWNvbmRpdGlvbk1heFJlaW52b2NhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPiBtYXhSZWludm9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlaW52b2tlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBgRXZlbnQgY3JlYXRpb24gd2FzIHJlamVjdGVkIGFzIHN0YWxlIGFmdGVyICR7bWF4UmVpbnZvY2F0aW9uc30gcmUtaW52b2NhdGlvbnMgb2YgJHtnZXRQcmVjb25kaXRpb25NYXhJblByb2Nlc3NSZXN0YXJ0cygpfSBpbi1wcm9jZXNzIHJlcGxheSByZXN0YXJ0cyBlYWNoOiB0aGlzIHJ1biBjYW5ub3Qgb2JzZXJ2ZSBpdHMgb3duIGV2ZW50IGxvZyBjb21wbGV0ZWx5IGVub3VnaCB0byBtYWtlIHByb2dyZXNzLiBMYXN0IHJlamVjdGlvbiAoJHtyZWFzb259KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAnRXZlbnQgY3JlYXRpb24gcmVqZWN0ZWQgYXMgc3RhbGUgYWZ0ZXIgaW4tcHJvY2VzcyByZXN0YXJ0czsgcmUtaW52b2tpbmcgcnVuIGZvciBhIGZyZXNoIHJlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlY29uZGl0aW9uUmVpbnZvY2F0aW9uczogYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlaW52b2NhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucHJlY29uZGl0aW9uX3JlaW52b2NhdGlvbnMnOiBhdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXllZCwgdW5saWtlIHRoZSBvdGhlciByZWludm9rZSgpIGNhbGxlcnM6IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBpbi1wcm9jZXNzIHJlc3RhcnRzIGFscmVhZHkgcmVsb2FkZWQgdGhlIGxvZyBzZXZlcmFsIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgY2F0Y2hpbmcgdXAsIHNvIHRoZSB3cml0ZXJzIHRoaXMgcmVwbGF5IGlzIHJhY2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBhcmUgc3RpbGwgYWN0aXZlLiBSZXRyeWluZyBpbnN0YW50bHkganVzdCBidXJucyB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBidWRnZXQgYXQgZnVsbCBzcGVlZC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICByZWludm9rZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBhd2FpdCByZWludm9rZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZWNvbmRpdGlvblJlaW52b2tlRGVsYXlTZWNvbmRzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHByZWNvbmRpdGlvblJlaW52b2NhdGlvbnM6IGF0dGVtcHQgfVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBEZXBsb3ltZW50LWFmZmluaXR5IGd1YXJkLCBzaGFyZWQgYnkgdGhlIHR3byBwYXRocyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBleGVjdXRlIGEgcnVuOiBxdWV1ZWQgc3RlcCBleGVjdXRpb25zIGFuZCBmbG93IHJlcGxheXMuXG4gICAgICAgICAgICAgICAgICBjb25zdCBndWFyZERlcGxveW1lbnQgPSBhc3luYyAoXG4gICAgICAgICAgICAgICAgICAgIHJ1bjogUGljazxcbiAgICAgICAgICAgICAgICAgICAgICBXb3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAncnVuSWQnIHwgJ2RlcGxveW1lbnRJZCcgfCAnc3BlY1ZlcnNpb24nXG4gICAgICAgICAgICAgICAgICAgID4sXG4gICAgICAgICAgICAgICAgICAgIHJlZW5xdWV1ZVBheWxvYWQ6ICgpID0+IFByb21pc2U8V29ya2Zsb3dJbnZva2VQYXlsb2FkPixcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlU3RvcD86ICgpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgICAgICAgICAgICk6IFByb21pc2U8RGVwbG95bWVudEFmZmluaXR5T3V0Y29tZT4gPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG91dGNvbWUsIHNwYW5BdHRyaWJ1dGVzIH0gPVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGd1YXJkRGVwbG95bWVudEFmZmluaXR5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudDogZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZVN0b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZC5pc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVlbnF1ZXVlOiBhc3luYyAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50OiByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9OiBSZWVucXVldWVBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlZW5xdWV1ZVBheWxvYWQoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50OiByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBkZXBsb3ltZW50SWQsIHNwZWNWZXJzaW9uLCBkZWxheVNlY29uZHMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW5BdHRyaWJ1dGVzKSBzcGFuPy5zZXRBdHRyaWJ1dGVzKHNwYW5BdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dGNvbWU7XG4gICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGhhcyBhIHN0ZXBJZCwgdGhpcyBpcyBhIGJhY2tncm91bmQgc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW9uLiBFeGVjdXRlIHRoZSBzdGVwLCB0aGVuIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwc1xuICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYmF0Y2ggYXJlIGRvbmUuIElmIHNvLCByZXBsYXkgaW5saW5lIChzYXZpbmcgYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcm91bmR0cmlwKS4gSWYgbm90LCByZXR1cm4g4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGVcbiAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGljayB1cCB0aGUgcmVwbGF5LlxuICAgICAgICAgICAgICAgICAgaWYgKGluY29taW5nU3RlcElkICYmIGluY29taW5nU3RlcE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNpbGllbnQgc3RlcCBkaXNwYXRjaDogdGhlIHByb2R1Y2VyIHBhcmFsbGVsaXplZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9jcmVhdGVkYCB3cml0ZSB3aXRoIHRoaXMgcXVldWUgcHVibGlzaCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBlbnRpdHkgbWF5IG5vdCBleGlzdCB5ZXQgd2hlbiB0aGlzIGRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhlY3V0ZXMg4oCUIHRoZSBkZWxpdmVyeSBiZWF0IHRoZSB3cml0ZSwgb3IgdGhlIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRyYW5zaWVudGx5IGFuZCB0aGlzIG1lc3NhZ2UgY2FycmllcyB0aGUgb25seVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb2YgdGhlIGlucHV0LiBJZGVtcG90ZW50bHkgcmUtZW5zdXJlIHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG1lc3NhZ2UncyBgc3RlcElucHV0YCDigJQga2V5ZWQgYnkgdGhlIHN0ZXAnc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlbGF0aW9uIGlkLCBzbyB0aGUgcHJvZHVjZXIncyB3cml0ZSBhbmQgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWVuc3VyZSBjb252ZXJnZSBvbiBleGFjdGx5IG9uZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIEludm9rZWQgZnJvbSB0d28gcGxhY2VzOlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gIC0gSU4tQkFORCAodGhlIGxvYWQtYmVhcmluZyBwYXRoKTogd2hlbiB0aGUgYmFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGBzdGVwX3N0YXJ0ZWRgIGJlbG93IHJlamVjdHMgd2l0aCBcInN0ZXAgbm90IGZvdW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIGV4ZWN1dG9yIGNhdGNoIG1hdGVyaWFsaXplcyB0aGUgc3RlcCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXRyaWVzIG9uY2UsIGFsbCB3aXRoaW4gdGhpcyBkZWxpdmVyeS4gVGhpcyBtdXN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgbm90IHJlbHkgb24gZGVsaXZlcnkgYXR0ZW1wdHM6IHdvcmxkLXZlcmNlbCdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgZmFpbHVyZS1yZXRyeSBwYXRoIHJlLWVucXVldWVzIGEgRlJFU0ggbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIChhdHRlbXB0IHJlc2V0cyB0byAxKSwgc28gYW4gYXR0ZW1wdC1nYXRlZCByZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlzIHVucmVhY2hhYmxlIG9uIHRoZSByZXRyeSBjaGFpbiBhbmQgdGhlIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3b3VsZCBzdGFsbCB1bnRpbCB0aGUgT1JJR0lOQUwgbWVzc2FnZSdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgfjMwMHMgdmlzaWJpbGl0eS10aW1lb3V0IHJlZGVsaXZlcnkg4oCUIG1lYXN1cmVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgZXhhY3RseSBzbyBpbiB0aGUgZHVyYWJlbmNoIHBhcmFsbGVsIHN3ZWVwcyBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGlzIHBhdGggZXhpc3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBFQUdFUkxZIG9uIGEgZ2VudWluZSByZWRlbGl2ZXJ5IChhdHRlbXB0ID4gMSksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgaW4gcGFyYWxsZWwgd2l0aCB0aGUgcnVuIGZldGNoIGJlbG93IOKAlCBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVkZWxpdmVyZWQgZGlzcGF0Y2ggYWxyZWFkeSBoYWQgaXRzIGNyZWF0ZSByYWNlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVzb2x2ZWQgZWl0aGVyIHdheSwgc28gdGhpcyBzYXZlcyB0aGUgZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3RhcnQgcm91bmQtdHJpcCBhdCBubyB3YWxsLXRpbWUgY29zdC4gRmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkZWxpdmVyaWVzIHNraXAgaXQ6IHRoZSBwcm9kdWNlcidzIHdyaXRlIGFsbW9zdFxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFsd2F5cyBsYW5kcywgYW5kIGFuIGVhZ2VyIGVuc3VyZSB3b3VsZCBidXJuIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb25kaXRpb25hbCB3cml0ZSBwZXIgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UgPSBhc3luYyAoKTogUHJvbWlzZTxcbiAgICAgICAgICAgICAgICAgICAgICAgICdvaycgfCAnZ29uZSdcbiAgICAgICAgICAgICAgICAgICAgICA+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcElucHV0KSByZXR1cm4gJ29rJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9jcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGVkIFVpbnQ4QXJyYXkgYnkgU3RlcERpc3BhdGNoSW5wdXRTY2hlbWE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbm9uLWJpbmFyeSAobWFuZ2xlZCkgcGF5bG9hZCBmYWlscyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXJzZSBhYm92ZSBhbmQgbmV2ZXIgcmVhY2hlcyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogc3RlcElucHV0LmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmtzIHRoaXMgY3JlYXRlIGFzIGEgZGlzcGF0Y2ggcmUtZW5zdXJlIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGd1YXJkLWVuZm9yY2luZyBiYWNrZW5kIGNhbiByZWZ1c2UgaXQgd2hlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb2R1Y2VyJ3Mgd3JpdGUgd2FzIDQxMi1yZWplY3RlZCAodGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB3YXMgcmV2b2tlZCkuIFN1cmZhY2VzIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW5FeHBpcmVkRXJyb3Ig4oaSICdnb25lJyBiZWxvdywgYWNraW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZS4gV29ybGRzIHdpdGhvdXQgdGhlIGd1YXJkIGlnbm9yZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYVN0ZXBEaXNwYXRjaDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZGVsaXZlcnkgbWF0ZXJpYWxpemVkIHRoZSBzdGVwIOKAlCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGlvbiBvZiB0aGUgcHJvZHVjZXIncyByZWNvdmVyeSBwYXRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZS5TdGVwUmVzaWxpZW50RGlzcGF0Y2hNYXRlcmlhbGl6ZWQodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNYXRlcmlhbGl6ZWQgc3RlcF9jcmVhdGVkIGZyb20gdGhlIHF1ZXVlIG1lc3NhZ2Ug4oCUIHRoZSBwcm9kdWNlclxcdTIwMTlzIGRpcmVjdCB3cml0ZSBkaWQgbm90IGxhbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBpbmNvbWluZ1N0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29tbW9uIGNhc2U6IHRoZSBwcm9kdWNlcidzIHdyaXRlIChvciBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgcmUtZW5zdXJlKSBhbHJlYWR5IGxhbmRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkgcmV0dXJuICdvayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBleGVjdXRlOiB0aGUgcnVuIHdlbnQgdGVybWluYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG1hdGNoZXMgdGhlIHJ1bi1zdGF0dXMgY2hlY2sgYmVsb3cpLCBvciBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGd1YXJkLWVuZm9yY2luZyBiYWNrZW5kIHJldm9rZWQgdGhpcyBkaXNwYXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoNDEwIGBzdGVwLWRpc3BhdGNoLXJldm9rZWRgIOKAlCB0aGUgcHJvZHVjZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB3YXMgNDEyLXJlamVjdGVkIGFuZCB0aGUgcmVwbGF5IHJlc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgY29ycmVjdGVkIHNjaGVkdWxlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSByZXR1cm4gJ2dvbmUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQg4oCUIHJldGhyb3cgc28gdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZXIgYXR0ZW1wdCBjb252ZXJnZXMgaW5zdGVhZCBvZiBleGVjdXRpbmcgKGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2tpbmcpIGEgc3RlcCB0aGF0IG1heSBub3QgZXhpc3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2snO1xuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2JnUnVuLCBlbnN1cmVPdXRjb21lXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJbnB1dCAmJiBtZXRhZGF0YS5hdHRlbXB0ID4gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVuc3VyZVN0ZXBGcm9tTWVzc2FnZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogKCdvaycgYXMgY29uc3QpLFxuICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnN1cmVPdXRjb21lID09PSAnZ29uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdSdW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCwgc2tpcHBpbmcgYmFja2dyb3VuZCBzdGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgc3RhdHVzOiBiZ1J1bi5zdGF0dXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ292ZXJzIGV2ZXJ5IHF1ZXVlZCBzdGVwIGV4ZWN1dGlvbiDigJQgZmlyc3QgZGlzcGF0Y2ggYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyaWVzL3JldHJpZXMgYWxpa2UuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGd1YXJkRGVwbG95bWVudChiZ1J1biwgYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IHJlcGxheU1lc3NhZ2UoKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBpbmNvbWluZ1N0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXJyeSB0aGUgcmVzdW1lIHRpbWluZyB2ZXJiYXRpbSBzbyB0aGUgcmUtcm91dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvcCBzdGF5cyBpbnNpZGUgYHN0ZXBfZGlzcGF0Y2hgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbmlzaGluZyBmcm9tIHRoZSBUVFIgZGVjb21wb3NpdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tSZXN1bWVUaW1pbmcgPyB7IGhvb2tSZXN1bWVUaW1pbmcgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkgIT09ICdjb250aW51ZSdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdTdGFydGVkQXQgPSBiZ1J1bi5zdGFydGVkQXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gK2JnUnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBEYXRlLm5vdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUmV0cnkgY2VpbGluZyBmb3IgYSBiYWNrZ3JvdW5kZWQgc3RlcC4gYG1ldGFkYXRhLmF0dGVtcHRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCkgaXMgYSBjaGVhcCB1cHBlciBib3VuZCwgYnV0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3Zlci1jb3VudHM6IGEgVGhyb3R0bGVFcnJvciAvIFRvb0Vhcmx5RXJyb3Ig4oCUIG9yIGFueVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZGVsaXZlcnkgdGhhdCBuZXZlciByYW4gdGhlIGJvZHkg4oCUIHN0aWxsIGFkdmFuY2VzIGl0LCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRydXN0aW5nIGl0IGRpcmVjdGx5IGNvdWxkIGZhaWwgYSBzdGVwIGFzIFwiZXhjZWVkZWQgbWF4XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmllc1wiIGJlZm9yZSB0aGUgYm9keSBldmVyIHJhbiAoYSB1c2VyLXZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWdyZXNzaW9uIHVuZGVyIHRyYW5zaWVudCBiYWNrZW5kIHByZXNzdXJlKS4gVXNlIGl0IG9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGZhc3QgZ2F0ZTogd2hpbGUgaXQgaXMgYXQgb3IgdW5kZXIgdGhlIGNlaWxpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBjYW5ub3QgYmUgZXhoYXVzdGVkLCBzbyBwcm9jZWVkIHdpdGhvdXQgdG91Y2hpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbG9nLiBPbmx5IG9uY2UgaXQgY3Jvc3NlcyB0aGUgY2VpbGluZyBkbyB3ZSBsb2FkIHRoZSBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nIGFuZCBkZXJpdmUgdGhlIGF1dGhvcml0YXRpdmUgYXR0ZW1wdCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZGVkIGBzdGVwX3N0YXJ0ZWRgIGNvdW50IOKAlCBzY29wZWQgdG8gdGhlIGxpZmVjeWNsZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgdG90YWwgKGJhcmUgc3RhcnRzIHBsdXMgdGhlIGxhcmdlc3Qgc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXIncyBzdGFydHMpOiB0aHJvdHRsZS90b28tZWFybHkgcmVkZWxpdmVyaWVzIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RhcnQgYXQgYWxsLCByYWNpbmcgaW52b2NhdGlvbnMnIG9uZS1vZmYgc3RhbXBlZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZXMgZG9uJ3QgYWNjdW11bGF0ZSAoY291bnRpbmcgdGhlbSBmYWxzZWx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXhoYXVzdGVkIGhlYWx0aHkgc3RlcHMg4oCUIHNlZSBjb3VudFN0ZXBTdGFydGVkRXZlbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXR0ZW1wdHMgYnVybmVkIHVuZGVyIGEgcHJpb3IgaW5saW5lLW93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIHN0aWxsIGNvdW50LCBzbyBhIHN0ZXAgdGhhdCB0aW1lcyBvdXQgdW5kZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvd25lZCByZWNvdmVyeSBhbmQgdGhlbiB0cmFuc2l0aW9ucyB0byBxdWV1ZWQvYmFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXMgdHJpcHMgdGhlIGNvbWJpbmVkIGNlaWxpbmcuIFRoaXMgc3RpbGwgYm91bmRzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGltZW91dHMsIHdoaWNoIHdyaXRlIG5vIGVycm9yIGZvciB0aGUgcG9zdC1ib2R5IGd1YXJkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2F0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQgPSBtZXRhZGF0YS5hdHRlbXB0O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnTWF4UmV0cmllcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGVwRnVuY3Rpb24oaW5jb21pbmdTdGVwTmFtZSk/Lm1heFJldHJpZXMgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IGJnTWF4UmV0cmllcyArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBiZ0F1dGhvcml0YXRpdmVBdHRlbXB0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3RvdGFsQXR0ZW1wdHMnIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVFRSOiB0aGlzIGRlbGl2ZXJ5IElTIHRoZSBkaXNwYXRjaGVkIG5leHQgc3RlcCBvZiBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1wdGlvbi4gQ29uc3VtZSB0aGUgdHJhY2tpbmcgaGVyZSBzbyB0aGUgaW5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRoaXMgaGFuZGxlciBtYXkgZmFsbCB0aHJvdWdoIHRvIGNhbm5vdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydCBpdCBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiZ1Jlc3VtZVRyYWNraW5nID0gcmVzdW1lVHJhY2tpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSB0aGUgcmVwbGF5IGJ1ZGdldCB3aGlsZSB0aGUgc3RlcCBib2R5IHJ1bnMg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBkdXJhdGlvbiBpcyBib3VuZGVkIGJ5IHRoZSBwbGF0Zm9ybSdzIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF4RHVyYXRpb24sIG5vdCBieSB0aGUgcmVwbGF5IHRpbWVvdXQuIFNlZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYXlCdWRnZXQgZG9jcyBmb3IgdGhlIGNvbnRyYWN0LlxuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUJ1ZGdldC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwUmVzdWx0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPj47XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZS1mbGlnaHQ6IGEgZGVsYXllZCBiYWNrc3RvcCAob3IgcmV0cnkpIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBhcnJpdmUgd2hpbGUgYW5vdGhlciBleGVjdXRpb24gb2YgdGhpcyBzYW1lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG1pZC1ib2R5IGluIHRoaXMgcHJvY2VzcyDigJQgbW9zdCBpbXBvcnRhbnRseSBvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGRzIHdpdGggbm8gaW52b2NhdGlvbiBraWxsIGJvdW5kICh3b3JsZC1sb2NhbCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZSB0aGUgb3duZXJzaGlwIGxlYXNlIGlzIG5vdCBhIGRlYXRoIHByb29mLiBUaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvc2VyIGF3YWl0cyB0aGUgd2lubmVyJ3Mgc2V0dGxlbWVudCwgdGhlbiBhY2tzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGV4ZWN1dGluZy4gTm8gb3duZXJNZXNzYWdlSWQgaGVyZTogdGhlIGJhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBvZiBhIHF1ZXVlLWRyaXZlbiBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgY2xlYXJzIGlubGluZSBvd25lcnNoaXAgKHRoZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZS1vd25lZCBmcm9tIHRoaXMgcG9pbnQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVF1ZXVlZFN0ZXAgPSAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dEZXBsb3ltZW50SWQ6IGJnUnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IGJnU3RhcnRlZEF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290UnVuSWQ6IHJvb3RSdW5JZEZyb20oYmdSdW4uYXR0cmlidXRlcywgcnVuSWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogaW5jb21pbmdTdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IGluY29taW5nU3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU3BlY1ZlcnNpb246IGJnUnVuLnNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IGNlaWxpbmc6IHRoZSBxdWV1ZSBkZWxpdmVyeSBjb3VudCBhcyBhIGZhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnYXRlLCB2ZXJpZmllZCBhZ2FpbnN0IHRoZSByZWNvcmRlZCBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCBvbmNlIGl0IGNyb3NzZXMgdGhlIGNlaWxpbmcgKHNlZSBhYm92ZSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXRhdGl2ZUF0dGVtcHQ6IGJnQXV0aG9yaXRhdGl2ZUF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJnUmVzdW1lVHJhY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyByZXN1bWVUcmFja2luZzogYmdSZXN1bWVUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwUmVzdWx0ID0gYXdhaXQgcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nU3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVldWVkU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4tYmFuZCByZXNpbGllbnQgcmVjb3Zlcnk6IGEgbWlzc2luZyBzdGVwIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN0ZXBJbnB1dC1jYXJyeWluZyBtZXNzYWdlIG1lYW5zIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG91dHJhbiAob3Igb3V0bGl2ZWQgYSB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgb2YpIHRoZSBwcm9kdWNlcidzIHBhcmFsbGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgd3JpdGUuIE1hdGVyaWFsaXplIHRoZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgcGF5bG9hZCBhbmQgcmV0cnkgT05DRSwgd2l0aGluIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IOKAlCBzZWUgZW5zdXJlU3RlcEZyb21NZXNzYWdlIGZvciB3aHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY2Fubm90IHdhaXQgZm9yIGEgcmVkZWxpdmVyeS4gQSBzZWNvbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWx1cmUgcHJvcGFnYXRlcyBhcyBiZWZvcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0ZXBJbnB1dCB8fCAhaXNTdGVwTWlzc2luZ0Vycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhd2FpdCBlbnN1cmVTdGVwRnJvbU1lc3NhZ2UoKSkgPT09ICdnb25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZ29uZScgYXMgY29uc3QgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVldWVkU3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogc3RlcFJlc3VsdC50aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RlcFJlc3VsdC50eXBlID09PSAndGhyb3R0bGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHM6IHN0ZXBSZXN1bHQudGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzdGVwIGhhZCBwZW5kaW5nIG9wcyAoc3RyZWFtIHdyaXRlcyksIGJyZWFrIGFuZCBsZXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0VW50aWwgZmx1c2ggdGhlbSDigJQgY2FuJ3QgY29udGludWUgaW5saW5lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSZXN1bHQuaGFzUGVuZGluZ09wc1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnY29tcGxldGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdC50eXBlID09PSAnc2tpcHBlZCdcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgZXZlbnRzIHRvIGNoZWNrIGlmIGFsbCBwYXJhbGxlbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXJzb3ItYmFzZWQgbG9hZGluZyBzbyB0aGUgbWFpbiBsb29wIGNhbiBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWxseSBmcm9tIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMocnVuSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSBuZXh0RXZlbnRMb2dMb2FkKGxvYWRlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBwZW5kaW5nIHN0ZXBzOiBhbnkgc3RlcF9jcmVhdGVkIHdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWF0Y2hpbmcgc3RlcF9jb21wbGV0ZWQgb3Igc3RlcF9mYWlsZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwQ3JlYXRlZElkcyA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFRlcm1pbmFsSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbG9hZGVkLmV2ZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5ldmVudFR5cGUgPT09ICdzdGVwX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcENyZWF0ZWRJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVGVybWluYWxJZHMuYWRkKGUuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlbmRpbmdTdGVwSWRzID0gbmV3IFNldDxzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHN0ZXBDcmVhdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcFRlcm1pbmFsSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcElkcy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nU3RlcElkcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHBlbmRpbmcgc3RlcCB0aGF0IFRISVMgbWVzc2FnZSBpbmxpbmUtb3ducyAoYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyBkZWxpdmVyeSBvZiB0aGlzIG1lc3NhZ2Ugc3RhbXBlZCBpdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcF9zdGFydGVkIGFuZCB0aGVuIGNyYXNoZWQgbWlkLWJvZHkpIG11c3QgYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmVkIGhlcmU6IG9ubHkgdGhlIG93bmluZyBtZXNzYWdlIG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1leGVjdXRlIGl0IGJlZm9yZSB0aGUgb3duZXJzaGlwIGxlYXNlIGV4cGlyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3YWtlIHJlcGxheXMgbWVyZWx5IGVuc3VyZSBhIGRlbGF5ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3N0b3AuIEZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiBsb29wLCB3aG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCB0YWJsZSByb3V0ZXMgaXQgdG8gb3duZWQgcmVjb3ZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lubGluZU93bmVyc2hpcEVuYWJsZWQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BlbmRpbmdTdGVwT3duZWRCeU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0ZXBJZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5tZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFja2dyb3VuZCBzdGVwIGRvbmU7IGZhbGxpbmcgdGhyb3VnaCB0byByZWNvdmVyIGFuIGlubGluZSBzdGVwIG93bmVkIGJ5IHRoaXMgbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHN0ZXBzIHN0aWxsIGluIHByb2dyZXNzLiBSZXR1cm4gd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVpbmcg4oCUIHRoZSBsYXN0IGhhbmRsZXIgdG8gY29tcGxldGUgd2lsbCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3RlcHMgZG9uZSBhbmQgcmVwbGF5IGlubGluZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhY2tncm91bmQgc3RlcCBkb25lIGJ1dCBvdGhlciBzdGVwcyBwZW5kaW5nLCByZXR1cm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIHN0ZXBzIGRvbmUg4oCUIGZhbGwgdGhyb3VnaCB0byB0aGUgbWFpbiByZXBsYXkgbG9vcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCBzaGFyZWQgc3RhdGUgc28gdGhlIGxvb3AgY2FuIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FsbCBwYXJhbGxlbCBzdGVwcyBkb25lLCByZXBsYXlpbmcgaW5saW5lIGFmdGVyIGJhY2tncm91bmQgc3RlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkNyZWF0ZWRFdmVudCA9IGxvYWRlZC5ldmVudHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwbGF5SW5wdXQ6IHVua25vd247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUlucHV0ID0gcnVuQ3JlYXRlZEV2ZW50LmV2ZW50RGF0YS5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNMZWdhY3lTcGVjVmVyc2lvbihiZ1J1bi5zcGVjVmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIiBoYXMgbm8gXCJydW5fY3JlYXRlZFwiIGV2ZW50YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnYWN5IHJ1bnMgcHJlZGF0ZSB0aGUgZXZlbnQtc291cmNlZCBydW5fY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhcmlhbnQsIHNvIHJldGFpbiB0aGUgcmVzb2x2ZWQgR0VUIG9ubHkgZm9yIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZ2FjeVJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZURhdGE6ICdhbGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZ2FjeVJ1bi5zdGF0dXMgIT09ICdydW5uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlJbnB1dCA9IGxlZ2FjeVJ1bi5pbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iZ1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHJlcGxheUlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZEF0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSBiZ1N0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2V0V29ya2Zsb3dTZXR1cEVycm9yQ29kZShlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlY29yZEZhdGFsUnVuRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhdGFsIGVycm9yIHdoaWxlIHByZXBhcmluZyBiYWNrZ3JvdW5kIHdvcmtmbG93IHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyBEZXBsb3ltZW50LWFmZmluaXR5IHByZS1jaGVjayBmb3IgdGhlIGxhenkgaG9vayBmYXN0XG4gICAgICAgICAgICAgICAgICAvLyBwYXRoIGJlbG93LiBOZXcgbGF6eS1yZXN1bWUgbWVzc2FnZXMgY2FycnkgdGhlIHJ1bidzXG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgZGVwbG95bWVudCAoYGhvb2tJbnB1dC5kZXBsb3ltZW50SWRgKSwgc28gYVxuICAgICAgICAgICAgICAgICAgLy8gbWlzcm91dGVkIGRlbGl2ZXJ5IGlzIGRldGVjdGFibGUgd2l0aCBhIGNoZWFwIGFtYmllbnRcbiAgICAgICAgICAgICAgICAgIC8vIGRlcGxveW1lbnQtaWQgY29tcGFyaXNvbiBCRUZPUkUgdGhlIGZhc3QgcGF0aCdzXG4gICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkIHdyaXRlIOKAlCB0aGUgY29ycmVjdGx5LXJvdXRlZCBjb21tb24gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gcGF5cyBubyBydW4gZmV0Y2ggYW5kIG5vIGxhdGVuY3kuIE9ubHkgYSBkZXRlY3RlZFxuICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2ggZmV0Y2hlcyB0aGUgYXV0aG9yaXRhdGl2ZSBydW4gYW5kIGhhbmRzIGl0IHRvXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgZXhpc3RpbmcgZ3VhcmQgKHdoaWNoIG93bnMgcmUtcm91dGUvZmFpbCBwb2xpY3kpO1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlLXJvdXRlZCBtZXNzYWdlIGtlZXBzIHRoZSBjb21wbGV0ZSBgaG9va0lucHV0YCxcbiAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IG1heSBob2xkIHRoZSBvbmx5IGNvcHkgb2YgdGhlIHJlc3VtZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcGlubmVkIG9yIGFtYmllbnQgaWQgaXMgdW5hdmFpbGFibGUgKG9sZGVyXG4gICAgICAgICAgICAgICAgICAvLyBwcm9kdWNlciBtZXNzYWdlLCBhIHdvcmxkIHdpdGhvdXQgZGVwbG95bWVudCBhZmZpbml0eSxcbiAgICAgICAgICAgICAgICAgIC8vIG9yIGEgZ2V0RGVwbG95bWVudElkIGZhaWx1cmUpLCBiZWhhdmlvciBpcyB1bmNoYW5nZWQ6XG4gICAgICAgICAgICAgICAgICAvLyB0aGUgYXV0aG9yaXRhdGl2ZSBndWFyZCBhZnRlciBydW4gc2V0dXAg4oCUIHdoaWNoIHJlbWFpbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBwcm90ZWN0aW9uIGJlZm9yZSByZXBsYXkgYW5kIHN0ZXAgZXhlY3V0aW9uIOKAlCBzdGlsbFxuICAgICAgICAgICAgICAgICAgLy8gY292ZXJzIHRoZSBkZWxpdmVyeTsgdGhlIGZhc3QgcGF0aCdzIHdyaXRlIGlzIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHBlciAocnVuSWQsIHJlc3VtZUlkKSwgc28gYSBwcmUtZ3VhcmQgd3JpdGUgZnJvbSBhblxuICAgICAgICAgICAgICAgICAgLy8gb2xkZXIgbWVzc2FnZSBzdGF5cyBjb252ZXJnZW50LlxuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhd29ya2Zsb3dSdW4gJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0Py5kZXBsb3ltZW50SWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIGVsaWdpYmlsaXR5IGFzIGd1YXJkRGVwbG95bWVudEFmZmluaXR5OiB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGF0b21pYywgaW1tdXRhYmxlIGRlcGxveW1lbnRzIHRoZSBpZHMgbGVnaXRpbWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlciAoZS5nLiBkcGxfbG9jYWxAPHZlcnNpb24+KSBhbmQgY29tcGFyaW5nIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgdHJpZ2dlciBzcHVyaW91cyBydW4gZmV0Y2hlcy5cbiAgICAgICAgICAgICAgICAgICAgd29ybGQuY2FwYWJpbGl0aWVzPy5kZXBsb3ltZW50QWZmaW5pdHkgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaW5uZWREZXBsb3ltZW50SWQgPSBob29rSW5wdXQuZGVwbG95bWVudElkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudERlcGxveW1lbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRJZCAhPT0gcGlubmVkRGVwbG95bWVudElkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KHJ1bklkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgcmVwbGF5TWVzc2FnZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yd2FyZGVkIFVOTU9ESUZJRUQg4oCUIGluIHBhcnRpY3VsYXIgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZGVsaXZlcnkncyBlbnRyeSB0aW1lIOKAlCBzbyB0aGUgbWlzcm91dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9wIGlzIGF0dHJpYnV0ZWQgdG8gYHF1ZXVlX2RlbGl2ZXJ5YCBhbmQgVDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmRzIHVwIGJlaW5nIHRoZSBmaW5hbCBjb25zdW1lcidzIGVudHJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihob29rUmVzdW1lVGltaW5nID8geyBob29rUmVzdW1lVGltaW5nIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdFJ1blJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICApKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyAtLS0gTGF6eSBob29rIHJlc3VtZSBmYXN0IHBhdGggLS0tXG4gICAgICAgICAgICAgICAgICAvLyBBIGxhenkgaG9vayBkZWxpdmVyeSAocmVzdW1lSWQgKyBkaWdlc3Qgb24gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSBob2lzdHMgdGhlIGNvbnN1bWVyJ3MgaWRlbXBvdGVudCBob29rX3JlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAvLyByZS1lbnN1cmUgYWJvdmUgcnVuX3N0YXJ0ZWQgYW5kIGFza3MgdGhlIFdvcmxkIHRvIHJldHVyblxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgcmVwbGF5IGxvZyB3aXRoIHRoZSB3cml0ZSAocHJlbG9hZEV2ZW50cykuIEFcbiAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRpbmcgV29ybGQgYW5zd2VycyB3aXRoIHRoZSByZWNvbnN0cnVjdGVkIHJ1biwgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZSByZXBsYXkgbG9nLCBhbmQgdGhlIHJ1bidzIGV2ZW50IGNlaWxpbmcg4oCUXG4gICAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIHRoZSBnZW5lcmljIHNldHVwIGJlbG93IHdvdWxkIHNwZW5kIGFcbiAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIFBPU1QgYW5kIGFuIGV2ZW50cy5saXN0IG9uLiBBbnkgb3RoZXIgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAvLyAob2xkZXIgc2VydmVyLCBhIFdvcmxkIHRoYXQgaWdub3JlcyB0aGUgcGFyYW0sIG9yIGFcbiAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWQgdGhhdCBmYWlscyB2YWxpZGF0aW9uLCBpbmNsdWRpbmcgYSBib3VuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBoYXNNb3JlIHBhZ2UpIGZhbGxzIGJhY2sgdG8gdGhhdCBnZW5lcmljIHNldHVwOyB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGhvb2tfcmVjZWl2ZWQgd3JpdGUgaXRzZWxmIGhhcyBzdGlsbCBzdWNjZWVkZWQgZWl0aGVyXG4gICAgICAgICAgICAgICAgICAvLyB3YXksIHNvIHRoZSByZS1lbnN1cmUgYmxvY2sgYmVsb3cgaXMgc2tpcHBlZCB2aWFcbiAgICAgICAgICAgICAgICAgIC8vIGBob29rRW5zdXJlZGAuIE5ldmVyIHRha2VuIG9uIHR1cmJvICh0dXJibyBkZWxpdmVyaWVzXG4gICAgICAgICAgICAgICAgICAvLyBjYXJyeSBydW5JbnB1dCwgbm90IGhvb2tJbnB1dCkgb3IgYWZ0ZXIgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCBhbHJlYWR5IGxvYWRlZCB0aGUgcnVuLlxuICAgICAgICAgICAgICAgICAgbGV0IGhvb2tFbnN1cmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICF3b3JrZmxvd1J1biAmJlxuICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnBheWxvYWREaWdlc3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tSZXN1bWVJbnB1dCA9IGhvb2tJbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGF0ZSB0aGUgbWF0ZXJpYWxpemVkIGV2ZW50IHRvIHdoZW4gdGhlIHJlc3VtZSBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAvLyBvY2N1cnJlZCDigJQgc2FtZSBkZXJpdmF0aW9uIGFzIHRoZSByZS1lbnN1cmUgYmVsb3cgKHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWVJZCBpcyBhIFVMSUQgbWludGVkIGJ5IHJlc3VtZUhvb2soKSBhdCByZXN1bWVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGltZSkuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvY2N1cnJlZEF0OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWUoaG9va1Jlc3VtZUlucHV0LnJlc3VtZUlkKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5jcmVhdGUuc3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cuaG9va19yZWNlaXZlZC5wcmVsb2FkX2V2ZW50cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2tSZXN1bWVJbnB1dC5ob29rSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rUmVzdW1lSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogaG9va1Jlc3VtZUlucHV0LnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUlkOiBob29rUmVzdW1lSW5wdXQucmVzdW1lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tSZXN1bWVJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRXZlbnRzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0Vuc3VyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHVubGlrZSB0aGUgcmUtZW5zdXJlIGJlbG93LCB0aGlzIGhvaXN0ZWQgd3JpdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIE5PVCBzZXQgSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCDigJQgaXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW5zIG9uIGV2ZXJ5IGZhc3QtcGF0aCByZXN1bWUsIGluY2x1ZGluZyB0aGUgY29tbW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSB3aGVyZSB0aGUgcHJvZHVjZXIncyBkaXJlY3Qgd3JpdGUgYWxyZWFkeSBsYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBjYWxsIG1lcmVseSBjb252ZXJnZWQgb24gaXQsIHNvIGl0IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZWNvdmVyeSBzaWduYWwuIHdvcmtmbG93LnJlc3VtZV9zZXR1cF9zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoYmVsb3cpIGRlc2NyaWJlcyB0aGlzIHBhdGggaW5zdGVhZC5cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIGlzIHVzYWJsZSBhcyByZXBsYXkgaW5wdXQgb25seSB3aGVuIGl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVtb25zdHJhYmx5IHRoZSBjb21wbGV0ZSBwaWN0dXJlOiBhIHJlY29uc3RydWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gd2l0aCBhIHN0YXJ0IHRpbWUsIGEgbm9uLWVtcHR5IENPTVBMRVRFIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXNNb3JlIGZhbHNlIOKAlCB0aGlzIHBhdGggaGFzIG5vIGN1cnNvci1jb250aW51YXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lcnksIHNvIGEgYm91bmRlZCBwYWdlIG11c3Qgbm90IGJlIHRydXN0ZWQpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIncyBldmVudCBjZWlsaW5nICh0aGlzIHJlc3BvbnNlIHBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQncyByb2xlLCBzbyBhIG1pc3NpbmcgY2VpbGluZyB3b3VsZCBsZWF2ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LWxpbWl0IGVuZm9yY2VtZW50IGRpc2FibGVkIGZvciB0aGUgcnVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIHJ1biBsaWZlY3ljbGUgZXZlbnRzLCB0aGUgY2Fub25pY2FsIGV2ZW50IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBjb252ZXJnZWQgb24sIGFuZCB0aGUgaG9va19yZWNlaXZlZCBtYXRjaGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFRISVMgcmVzdW1lIChzbyB3ZSBuZXZlciByZXBsYXkgYWdhaW5zdCBhIGxvZyB0aGF0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWlzc2luZyB0aGUgdmVyeSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIGRlbGl2ZXJ5KS5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2FibGVSZXBsYXlQcmVsb2FkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJ1bi5zdGFydGVkQXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuY3Vyc29yICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5oYXNNb3JlID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlc3VsdC5tYXhFdmVudHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXZlbnRzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PiBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tSZXN1bWVJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZVJlcGxheVByZWxvYWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ydW4/LnN0YXJ0ZWRBdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlY29uc3RydWN0ZWQgcnVuIGFsd2F5cyByZWFkcyAncnVubmluZycsIGJ1dCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCBldmVudCBjb21taXR0ZWQgY29uY3VycmVudGx5IHJpZGVzIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGl0c2VsZi4gVGhlIG5vZGUgcmVwbGF5IGxvb3Agd291bGQgY2F0Y2ggaXQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBkaXNwYXRjaGVzIGJlZm9yZSB0aGF0IGNoZWNrIOKAlCBzbyBjb25zdW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsaXZlcnkgaGVyZSwgYmVmb3JlIGFueSBlbmdpbmUgcnVucy4gU2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0Y29tZSBhcyB0aGUgcnVuX3N0YXJ0ZWQgcGF0aCdzIG5vbi1ydW5uaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgY2hlY2suXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXJtaW5hbEV2ZW50ID0gcmVzdWx0LmV2ZW50cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJ1bklkID09PSBydW5JZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9mYWlsZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jYW5jZWxsZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVsb2FkIHN0aWxsIGluaXRpYWxpemVkIHRoaXMgZGVsaXZlcnkgKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGhvdyB0aGUgdGVybWluYWwgc3RhdGUgd2FzIG9ic2VydmVkKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwLXNvdXJjZSBhbmQgdGhlIHJ1bidzIGFjdHVhbCB0ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0dXMgYXJlIHJlY29yZGVkIGJlZm9yZSBjb25zdW1pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NvbXBsZXRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnY29tcGxldGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2ZhaWxlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnY2FuY2VsbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgbGF6eSBob29rIHNldHVwLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRlcm1pbmFsRXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgPSBjbGFtcE1heEV2ZW50cyhyZXN1bHQubWF4RXZlbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuY2hvcnMgUlNGUyDigJQgc2VlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZS4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcGxheXMgcnVuX3N0YXJ0ZWQncyByb2xlIG9uIHRoaXMgcGF0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ2hvb2tfcHJlbG9hZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiByZXN1bHQuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IHJlc3VsdC5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArcmVzdWx0LnJ1bi5zdGFydGVkQXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJlc3VsdC5ydW4uc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93U3RhcnRlZEF0KHdvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tSZXN1bWVTZXR1cFNvdXJjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9va19yZWNlaXZlZF9zdHJlYW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCB3cml0ZSwgbm8gdXNhYmxlIHByZWxvYWQgKENCT1IgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gYW4gb2xkZXIgc2VydmVyLCBhIFdvcmxkIHRoYXQgaWdub3JlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdC1pbiwgYSBib3VuZGVkIGhhc01vcmUgcGFnZSwgb3IgYSBwcmVsb2FkIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB2YWxpZGF0aW9uKTogdGFrZSB0aGUgZ2VuZXJpYyBydW5fc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgYmVsb3cuIEl0cyBwcmVsb2FkIGlzIGxvYWRlZCBhZnRlciB0aGlzIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQsIHNvIHRoZSBjYW5vbmljYWwgaG9va19yZWNlaXZlZCBpcyBwYXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB3aGF0ZXZlciBsb2cgdGhhdCBzZXR1cCByZWFkcyDigJQgbm8gc3BsaWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc3VtZVNldHVwU291cmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob29rX3JlY2VpdmVkX2ZhbGxiYWNrJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBjbGFzc2lmaWNhdGlvbiBhcyB0aGUgcmUtZW5zdXJlIGJlbG93OlxuICAgICAgICAgICAgICAgICAgICAgIC8vIC0gSG9va05vdEZvdW5kIC8gUnVuRXhwaXJlZDogdGhlIHJ1biB3ZW50IHRlcm1pbmFsO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90aGluZyBsZWZ0IHRvIHJlc3VtZSwgY29uc3VtZSB0aGUgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAtIGFueXRoaW5nIGVsc2UgKEVudGl0eUNvbmZsaWN0LCBhIHRydW5jYXRlZCBwcmVsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzdHJlYW0sIHRyYW5zcG9ydCBmYWlsdXJlcyk6IHRyYW5zaWVudCDigJQgcmV0aHJvdyBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIHRoZSBpZGVtcG90ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAocnVuSWQsIHJlc3VtZUlkKSBjbGFpbSBjb252ZXJnZXMgb24gcmV0cnkuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgSG9va05vdEZvdW5kRXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1biBhbHJlYWR5IGZpbmlzaGVkIGR1cmluZyBsYXp5IGhvb2sgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogcHJlcGFyZSB0aGUgcnVuIHN0YXRlIC0tLVxuICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiB3b3JrZmxvd1J1biB3YXMgYWxyZWFkeSBzZXQgYnkgdGhlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgcGF0aCAoaW5saW5lIHJlcGxheSBhZnRlciBhbGwgcGFyYWxsZWwgc3RlcHMgZG9uZSlcbiAgICAgICAgICAgICAgICAgIC8vIG9yIGJ5IHRoZSBsYXp5IGhvb2sgZmFzdCBwYXRoIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgaWYgKCF3b3JrZmxvd1J1bikge1xuICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgY2FsbCBydW5fc3RhcnRlZCBkaXJlY3RseSDigJQgdGhpcyBib3RoIHRyYW5zaXRpb25zXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW4gdG8gJ3J1bm5pbmcnIEFORCByZXR1cm5zIHRoZSBydW4gZW50aXR5LCBzYXZpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBzZXBhcmF0ZSBydW5zLmdldCByb3VuZC10cmlwLlxuICAgICAgICAgICAgICAgICAgICAvLyBDb250cmFjdDogZXZlbnRzLmNyZWF0ZSgncnVuX3N0YXJ0ZWQnKSBtdXN0IGJlIGlkZW1wb3RlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJ1bnMgYWxyZWFkeSBpbiAncnVubmluZycgc3RhdHVzIChyZXR1cm4gdGhlIHJ1blxuICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGVycm9yKSwgbm90IGp1c3QgZm9yIHBlbmRpbmcg4oaSIHJ1bm5pbmcgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1blN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fc3RhcnRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBzcGVjIHZlcnNpb24gZnJvbSB0aGUgb3JpZ2luYWwgc3RhcnQoKSBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBhdmFpbGFibGUsIHNvIHRoZSByZXNpbGllbnQgc3RhcnQgcGF0aCBjcmVhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1biB3aXRoIHRoZSBjb3JyZWN0IHZlcnNpb24gKG5vdCBhbHdheXMgY3VycmVudCkuXG4gICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dD8uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gUGFzcyBydW4gaW5wdXQgZnJvbSBxdWV1ZSBzbyB0aGUgc2VydmVyIGNhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgcnVuIGlmIHJ1bl9jcmVhdGVkIHdhcyBtaXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVWludDhBcnJheSB2YWx1ZXMgc3Vydml2ZSB0aGUgcXVldWUgbmF0aXZlbHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyAoQ0JPUiBvbiB3b3JsZC12ZXJjZWwsIEpTT04gcmV2aXZlciBvbiB3b3JsZC1sb2NhbCkuXG4gICAgICAgICAgICAgICAgICAgICAgLi4uKHJ1bklucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiBydW5JbnB1dC5pbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogcnVuSW5wdXQuZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiBydW5JbnB1dC53b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0OiBydW5JbnB1dC5leGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogcnVuSW5wdXQuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JbnB1dC5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR1cmJvICYmIHJ1bklucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGJhY2tncm91bmQgYHJ1bl9zdGFydGVkYCBhbmQgc3ludGhlc2l6ZSB0aGUgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW50aXR5IGxvY2FsbHkgc28gcmVwbGF5IGNhbiBiZWdpbiB3aXRob3V0IHdhaXRpbmcgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJvdW5kLXRyaXAuIFNhZmUgaGVyZSBiZWNhdXNlIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb2YgdGhlIGZpcnN0IGludm9jYXRpb24g4oCUIHN0YXJ0KCkgY3JlYXRlZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gbW9tZW50cyBhZ28gYW5kIG5vIGV2ZW50cyBoYXZlIGJlZW4gd3JpdHRlbiB5ZXQuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJhcnJpZXIgaXMgY29uc3VtZWQgYnkgZXZlcnkgZG93bnN0cmVhbSB3cml0ZSAoc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIsIG9wdGltaXN0aWMgc3RlcF9zdGFydGVkLCB0ZXJtaW5hbCBydW4gd3JpdGVzKSBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaXMgd3JpdHRlbiBiZWZvcmUgdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQoJ3dvcmtmbG93LnJ1bl9zdGFydGVkLmNyZWF0ZS5zdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICd3b3JrZmxvdy5ydW5fc3RhcnRlZC5za2lwX3ByZWxvYWQnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRQcm9taXNlID0gY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBiYWNrZ3JvdW5kIHRoaXMgcHVyZWx5IGFzIGEgd3JpdGUgYmFycmllciBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHJlYWQgaXRzIHByZWxvYWRlZCBldmVudHMsIHNvIHNraXAgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5fc3RhcnRlZCBldmVudC1sb2cgcHJlbG9hZC4gVGhhdCB0cmltcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9zdGFydGVkIHJlcXVlc3QgdGhlIGNoYWluZWQgZmlyc3Qgc3RlcF9zdGFydGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0cyBvbiDigJQgc2hvcnRlbmluZyB0aW1lLXRvLXNlY29uZC1zdGVwIOKAlCBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXN0ZWQgbGlzdCtyZXNvbHZlIGl0IHdvdWxkIG90aGVyd2lzZSBjb21wdXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQsIHNraXBQcmVsb2FkOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllciA9IHN0YXJ0ZWRQcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFR1cmJvIGJhY2tncm91bmRzIHJ1bl9zdGFydGVkLCBzbyB0aGUgbm9uLXR1cmJvIGFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyBuZXZlciBydW5zIOKAlCB0aHJlYWQgdGhlIHBlci1ydW4gZXZlbnQgY2VpbGluZyBvZmYgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYmFja2dyb3VuZGVkIHJlc3BvbnNlIGhlcmUgaW5zdGVhZC4gVGhlIGd1YXJkIHJlLWNoZWNrc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG1heEV2ZW50c0xpbWl0IGV2ZXJ5IGxvb3AgaXRlcmF0aW9uLCBzbyBhIHZhbHVlIHRoYXQgbGFuZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzaG9ydGx5IGFmdGVyIHN0YXJ0IHN0aWxsIGVuZm9yY2VzIHdlbGwgYmVmb3JlIGEgcnVuYXdheVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyBhcHByb2FjaGVzIHRoZSBjZWlsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3RhcnRlZFByb21pc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbWl0ID0gY2xhbXBNYXhFdmVudHMoci5tYXhFdmVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCkgbWF4RXZlbnRzTGltaXQgPSBsaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGFuIGVhcmx5IGZhaWx1cmUgZnJvbSBzdXJmYWNpbmcgYXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuaGFuZGxlZFJlamVjdGlvbjsgcnVuUmVhZHlCYXJyaWVyIHN0aWxsIG9ic2VydmVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGV2ZW50cy5saXN0OiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4gdG9cbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9nIHlldCBvbiBhIGZpcnN0IGRlbGl2ZXJ5IChydW5fc3RhcnRlZCBpcyBzdGlsbCBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZsaWdodCkuIEFuIGVtcHR5IHByZWxvYWQgcm91dGVzIGl0ZXJhdGlvbiAxIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm8tbG9hZCBwcmVsb2FkZWQgYnJhbmNoOyBpdGVyYXRpb24gMiB0aGVuIHRha2VzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIHBvc3QtcHJlbG9hZGVkIGZ1bGwgcmVsb2FkIHRvIHBpY2sgdXAgYSBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IGEgc3B1cmlvdXMgXCJjdXJzb3IgbWlzc2luZ1wiIHdhcm5pbmcuXG4gICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVhZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudElkOiBydW5JbnB1dC5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHJ1bklucHV0LndvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBydW5JbnB1dC5zcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQ6IHJ1bklucHV0LmV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcnVuSW5wdXQuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWVkIGF0dHJpYnV0ZXMgZnJvbSBzdGFydCgpIHJpZGUgYWxvbmcgaW4gYHJ1bklucHV0YFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoZXkgbGl2ZSBpbiBgcnVuX2NyZWF0ZWRgJ3MgZXZlbnREYXRhLCBub3Qgc2VwYXJhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBhdHRyX3NldGAgZXZlbnRzKSwgc28gdGhlIHN5bnRoZXNpemVkIHNuYXBzaG90IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gZXZlbiB0aG91Z2ggd2Ugc2tpcCB0aGUgaW5pdGlhbCBldmVudHMubGlzdC4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCBPTkxZIHdoaWxlIGF0dHJpYnV0ZXMgYXJlIHdyaXRlLW9ubHk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBpbi13b3JrZmxvdyByZWFkIEFQSSB0b2RheSAoc2VlIHdvcmtmbG93LnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBcInN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkXCIpLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByZWxvYWRlZCBsb2cgY2FuJ3QgZGl2ZXJnZSBvbiBhIHJlYWQuIElmIGEgcmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIGlzIGV2ZXIgYWRkZWQgaXQgTVVTVCByZWFkIGZyb20gdGhpcyBzbmFwc2hvdCwgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBieSByZXBsYXlpbmcgcnVuX2NyZWF0ZWQvYXR0cl9zZXQgZXZlbnRzIOKAlCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvJ3MgZW1wdHkgaW5pdGlhbCBsb2cgd291bGQgc3VyZmFjZSBzZWVkIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIGB7fWAgb24gdGhlIGZpcnN0IGRlbGl2ZXJ5IG9ubHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBydW5JbnB1dC5hdHRyaWJ1dGVzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgYHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXNgIGRlY2xhcmF0aW9uIGFib3ZlOlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHR1cmJvIHN5bnRoZXNpemVzIHRoZSBydW4gYmVmb3JlIHRoZSByZWFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHJ1bl9zdGFydGVkYCByZXNwb25zZSBsYW5kcywgc28gYW5jaG9yIFJTRlMgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGF0IGFuIGFjdHVhbCByZXNwb25zZSBpbnN0YW50LlxuICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMgPSArbm93O1xuICAgICAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdydW5uaW5nJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dTdGFydGVkQXQod29ya2Zsb3dTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudCgnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuY3JlYXRlLnN0YXJ0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnd29ya2Zsb3cucnVuX3N0YXJ0ZWQuc2tpcF9wcmVsb2FkJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUV2ZW50KHJ1blN0YXJ0ZWRFdmVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuID0gcmVzdWx0LnJ1bjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0ID0gY2xhbXBNYXhFdmVudHMocmVzdWx0Lm1heEV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmNob3JzIFJTRlMg4oCUIHNlZSB0aGUgZGVjbGFyYXRpb24gYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5TdGFydGVkUmVjZWl2ZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvdmVycyBib3RoIHRoZSBwbGFpbiBzZXF1ZW50aWFsIHJlc3VtZSBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXp5IGZhc3QgcGF0aCdzIGZhbGxiYWNrICh3aG9zZSBob2lzdGVkIHdyaXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBubyB1c2FibGUgcHJlbG9hZCBhbmQgbGVmdCB3b3JrZmxvd1J1blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5zZXQsIHNvIGl0IGxhbmRzIGhlcmUpLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID0gJ3J1bl9zdGFydGVkJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ldmVudHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbLi4ucmVzdWx0LmV2ZW50c10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiByZXN1bHQuY3Vyc29yID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gcmVzdWx0Lmhhc01vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5leHRFdmVudExvZ0xvYWQobG9hZGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5sb2FkZWQsIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93U3RhcnRlZEF0ID0gK3Jlc3VsdC5ydW4uc3RhcnRlZEF0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyhyZXN1bHQucnVuLnN0YXR1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1N0YXJ0ZWRBdCh3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5ydW4uc3RhdHVzICE9PSAncnVubmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBhbHJlYWR5IGNvbXBsZXRlZCBvciBmYWlsZWQsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnJ1bi5zdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZvciBgY2FuY2VsYCwgd2UgYWN0dWFsbHkgd2FudCB0byBwcm9wYWdhdGUgYSBXb3JrZmxvd0NhbmNlbGxlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNpZGUgdGhlIHdvcmtmbG93IGNvbnRleHQgc28gdGhlIHVzZXIgY2FuIGdyYWNlZnVsbHkgZXhpdC4gdGhpcyBpcyBTSUdURVJNXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZ1cnRoZXJtb3JlLCB0aGVyZSBzaG91bGQgYmUgYSB0aW1lb3V0IG9yIGEgd2F5IHRvIGZvcmNlIGNhbmNlbCBTSUdLSUxMXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgYWN0dWFsbHkgZXhpdCBoZXJlIHdpdGhvdXQgcmVwbGF5aW5nIHRoZSB3b3JrZmxvdyBhdCBhbGwsIGluIHRoZSBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXBsYXlpbmcgdGhlIHdvcmtmbG93IGlzIGl0c2VsZiBmYWlsaW5nLlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biB3YXMgY29uY3VycmVudGx5IGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3I6IHJ1biB3YXMgY29uY3VycmVudGx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlZC9mYWlsZWQvY2FuY2VsbGVkIGR1cmluZyBzZXR1cC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUnVuRXhwaXJlZEVycm9yOiBydW4gYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcywgc2tpcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSdW4gYWxyZWFkeSBmaW5pc2hlZCBkdXJpbmcgc2V0dXAsIHNraXBwaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdldFdvcmtmbG93U2V0dXBFcnJvckNvZGUoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnJvckNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVjb3JkRmF0YWxSdW5FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyB3b3JrZmxvdyBzZXR1cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlIChub24tdHVyYm8gcnVuX3N0YXJ0ZWQpXG4gICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZiAoIXdvcmtmbG93UnVuKVxuICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgcmVwbGF5J1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIC8vIE5laXRoZXIgc2V0dXAgYnJhbmNoIHJhbiwgc28gdGhlIHJ1biBhcnJpdmVkIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgc2V0dXAgd2FzIGEgcGxhaW4gZXZlbnQgbG9hZC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQtc3RlcCBmYWxsLXRocm91Z2ggcmVhY2hlcyBoZXJlIHdpdGggYSBydW5cbiAgICAgICAgICAgICAgICAgIC8vIHByZWxvYWRlZCB0b2RheSwgYW5kIGl0IGNvbnN1bWVzIHRoZSB0cmFja2luZyBiZWZvcmUgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gcG9pbnQg4oCUIHNvIHRoaXMgaXMgdGhlIGhvbmVzdCBkZWZhdWx0IHJhdGhlciB0aGFuIGEgbGl2ZVxuICAgICAgICAgICAgICAgICAgLy8gcGF0aCwgYW5kIGtlZXBzIHRoZSBkaW1lbnNpb24gdG90YWwgaWYgb25lIGlzIGV2ZXIgYWRkZWQuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nICYmXG4gICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nLnNldHVwU291cmNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZy5zZXR1cFNvdXJjZSA9ICdldmVudF9sb2FkJztcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gQ292ZXJzIGV2ZXJ5IGZsb3cgcmVwbGF5IOKAlCBpbml0aWFsIHN0YXJ0LCBzdGVwIGNvbXBsZXRpb25zLFxuICAgICAgICAgICAgICAgICAgLy8gaG9vayByZXN1bXB0aW9ucywgd2FpdCBjb21wbGV0aW9ucyDigJQgYW5kIHN0b3BzIGJlZm9yZSBhbnlcbiAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgb3IgaW5saW5lIHN0ZXAgZXhlY3V0ZXMgd2hlbiB0aGUgcnVuIGlzIG5vdFxuICAgICAgICAgICAgICAgICAgLy8gcGlubmVkIGhlcmUgKHNlZSBgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHlgKS4gVGhpcyByZW1haW5zXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgQVVUSE9SSVRBVElWRSBwcm90ZWN0aW9uIGJlZm9yZSByZXBsYXkgYW5kIHN0ZXBcbiAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbi4gYGF3YWl0UnVuUmVhZHlgIG9yZGVycyB0dXJibydzIGBydW5fc3RhcnRlZGBcbiAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBlaXRoZXIgc3RvcHBpbmcgYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIExhenkgaG9vayByZXN1bWVzIGFyZSBhZGRpdGlvbmFsbHkgcHJlLWNoZWNrZWQgYWJvdmUgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBmYXN0IHBhdGg6IGEgbmV3IG1lc3NhZ2UncyBgaG9va0lucHV0LmRlcGxveW1lbnRJZGAgaXNcbiAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmVkIGFnYWluc3QgdGhlIGFtYmllbnQgZGVwbG95bWVudCBpZCBmb3IgZnJlZSwgYW5kXG4gICAgICAgICAgICAgICAgICAvLyBvbmx5IGEgZGV0ZWN0ZWQgbWlzbWF0Y2ggZmV0Y2hlcyB0aGUgYXV0aG9yaXRhdGl2ZSBydW4g4oCUXG4gICAgICAgICAgICAgICAgICAvLyBzbyBhIG1pc3JvdXRlZCBtb2Rlcm4gcmVzdW1lIHJlLXJvdXRlcyB3aXRoIHplcm8gZXZlbnRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcy4gT2xkZXIgbWVzc2FnZXMgKG5vIGBob29rSW5wdXQuZGVwbG95bWVudElkYCkgcmVhY2hcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBmYXN0IHBhdGgncyBpZGVtcG90ZW50IGhvb2tfcmVjZWl2ZWQgd3JpdGUgYmVmb3JlIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIGd1YXJkOyB0aGF0IHdyaXRlIGNvbnZlcmdlcyBwZXIgKHJ1bklkLCByZXN1bWVJZCkgb24gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBwaW5uZWQgZGVwbG95bWVudCwgc28gaXQgaXMgc2FmZSwganVzdCBub3QgZnJlZS4gRWl0aGVyXG4gICAgICAgICAgICAgICAgICAvLyB3YXkgdGhlIHJlLXJvdXRlZCBtZXNzYWdlIG11c3QgY2FycnkgYGhvb2tJbnB1dGAsIG9yIGFcbiAgICAgICAgICAgICAgICAgIC8vIHJlc3VtZSB3aG9zZSBwcm9kdWNlciB3cml0ZSBoYWQgbm90IHlldCBsYW5kZWQgd291bGQgYmVcbiAgICAgICAgICAgICAgICAgIC8vIGxvc3QuXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBndWFyZERlcGxveW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihhd2FpdCByZXBsYXlNZXNzYWdlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGhvb2tJbnB1dCA/IHsgaG9va0lucHV0IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIHByZS1jaGVjayByZS1yb3V0ZSBhYm92ZTogZm9yd2FyZGVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNlaXZlZCwgc28gdGhlIGV4dHJhIGhvcCBpcyBxdWV1ZSBkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihob29rUmVzdW1lVGltaW5nID8geyBob29rUmVzdW1lVGltaW5nIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXRSdW5SZWFkeVxuICAgICAgICAgICAgICAgICAgICApKSAhPT0gJ2NvbnRpbnVlJ1xuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gTGF6eSBob29rIHJlc3VtZTogdGhlIHByb2R1Y2VyIChyZXN1bWVIb29rIGZhc3QgcGF0aClcbiAgICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsaXplZCB0aGUgYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIHdpdGggdGhpcyBxdWV1ZVxuICAgICAgICAgICAgICAgICAgLy8gcHVibGlzaCwgc28gdGhlIGV2ZW50IG1heSBub3QgYmUgcGVyc2lzdGVkIHlldC4gSWRlbXBvdGVudGx5XG4gICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgaXQgYmVmb3JlIHJlcGxheSDigJQga2V5ZWQgYnkgYHJlc3VtZUlkYCBzbyBhXG4gICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IHByb2R1Y2VyIHdyaXRlIGNvbnZlcmdlcyBvbiBleGFjdGx5IG9uZSBldmVudFxuICAgICAgICAgICAgICAgICAgLy8gKHRoZSBzZXJ2ZXIgcmVzb2x2ZXMgYSBtYXRjaGluZyBjbGFpbSBhcyBzdWNjZXNzLCBub3QgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGVycm9yKS4gYGhvb2tJbnB1dGAgbmV2ZXIgcmlkZXMgYSB0dXJibyBmaXJzdC1kZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgLy8gKHRoYXQgcGF0aCBjYXJyaWVzIGBydW5JbnB1dGAsIG5vdCBgaG9va0lucHV0YCksIHNvIHRoaXNcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcnVucyBvbiB0aGUgbm9ybWFsIGxvYWQtYW5kLXJlcGxheSBwYXRoLiBTa2lwcGVkXG4gICAgICAgICAgICAgICAgICAvLyBlbnRpcmVseSB3aGVuIHRoZSBmYXN0IHBhdGggYWJvdmUgYWxyZWFkeSBlbnN1cmVkIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgKGBob29rRW5zdXJlZGApIOKAlCBzdWNjZXNzZnVsbHkgb3IgdmlhIGl0cyBmYWxsYmFjayxcbiAgICAgICAgICAgICAgICAgIC8vIHdob3NlIHJ1bl9zdGFydGVkIHByZWxvYWQgd2FzIGxvYWRlZCBhZnRlciB0aGUgd3JpdGUgYW5kXG4gICAgICAgICAgICAgICAgICAvLyB0aGVyZWZvcmUgYWxyZWFkeSBjb250YWlucyB0aGUgY2Fub25pY2FsIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgaWYgKGhvb2tJbnB1dCAmJiAhaG9va0Vuc3VyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGVyZiAoT3B0aW9uIEEpOiBpZiB0aGUgcHJvZHVjZXIncyBjb25jdXJyZW50IGRpcmVjdFxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBhbHJlYWR5IGxhbmRlZCBpbiB0aGUgcnVuX3N0YXJ0ZWQgcHJlbG9hZCwgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbm9uaWNhbCBldmVudCBpcyBpbiB0aGUgbG9nIGFuZCB0aGUgcmUtZW5zdXJlIHJvdW5kIHRyaXBcbiAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHVyZSBvdmVyaGVhZC4gU2tpcCBpdCB3aGVuIHRoZSBwcmVsb2FkIGFscmVhZHkgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGBob29rX3JlY2VpdmVkYCB3aXRoIHRoaXMgcmVzdW1lJ3MgcGVyc2lzdGVkIGByZXN1bWVJZGBcbiAgICAgICAgICAgICAgICAgICAgLy8gKHVuaXF1ZSBwZXIgcmVzdW1lLCBzbyB3ZSBuZXZlciBza2lwIG9uIGFuIHVucmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAvLyBob29rX3JlY2VpdmVkKS4gQmVzdC1lZmZvcnQ6IHRoZSB3aW4gbGFuZHMgb25seSB3aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWNlcidzIHdyaXRlIGJlYXQgdGhpcyBjb25zdW1lcidzIGxvYWQ7IG90aGVyd2lzZSB3ZVxuICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGlkZW1wb3RlbnQgcmUtZW5zdXJlIGJlbG93LlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHVucmVhY2hhYmxlIGZvciBhdG9taWMgbGF6eSByZXN1bWVzXG4gICAgICAgICAgICAgICAgICAgIC8vIChyZXN1bWVJZCArIGRpZ2VzdCk6IHRob3NlIHNldCBgaG9va0Vuc3VyZWRgIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBob2lzdGVkIGZhc3QgcGF0aCBhYm92ZSDigJQgb24gc3VjY2VzcyBBTkQgb24gaXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIOKAlCBzbyB0aGlzIGJsb2NrIChhbmQgdGhlIHNraXAgY2hlY2spIG5vdyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlcyBob29rSW5wdXQgc2hhcGVzIHdpdGhvdXQgdGhlIGZ1bGwgaWRlbXBvdGVuY3lcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFpci5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxyZWFkeVByZWxvYWRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgaG9va0lucHV0LnJlc3VtZUlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHMuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVzdW1lSWQgPT09IGhvb2tJbnB1dC5yZXN1bWVJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHJlYWR5UHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnQgYWxyZWFkeSB2aXNpYmxlIGluIHRoZSBwcmVsb2FkZWQgbG9nIOKAlCBub3RoaW5nIHRvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIG9yIHNwbGljZS5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBEYXRlIHRoZSBtYXRlcmlhbGl6ZWQgZXZlbnQgdG8gd2hlbiB0aGUgcmVzdW1lIGFjdHVhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gb2NjdXJyZWQsIG5vdCB3aGVuIHRoaXMgcXVldWUgZGVsaXZlcnkgcmFuLiBgcmVzdW1lSWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIFVMSUQgbWludGVkIGJ5IGByZXN1bWVIb29rKClgIGF0IHJlc3VtZSB0aW1lLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBlbWJlZGRlZCB0aW1lc3RhbXAgaXMgdGhlIGhvbmVzdCBgb2NjdXJyZWRBdGAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgbGF0ZW5jeSBhdHRyaWJ1dGlvbiBvZmYgdGhlIHF1ZXVlIHJvdW5kIHRyaXAuIEFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBub24tVUxJRCByZXN1bWVJZCAobGVnYWN5IC8gdGVzdCkgc2ltcGx5IGxlYXZlcyBpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCwgc28gdGhlIFdvcmxkIGZhbGxzIGJhY2sgdG8gYGNyZWF0ZWRBdGAuXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkQXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBob29rSW5wdXQucmVzdW1lSWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoZGVjb2RlVGltZShob29rSW5wdXQucmVzdW1lSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGVuc3VyZWRFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuc3VyZWQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBob29rSW5wdXQuaG9va0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IGhvb2tJbnB1dC50b2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVJZDogaG9va0lucHV0LnJlc3VtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVBheWxvYWREaWdlc3Q6IGhvb2tJbnB1dC5wYXlsb2FkRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3VtZXItc2lkZSBjb21wbGV0aW9uIG9mIHRoZSByZWNvdmVyeSBwYXRoOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkgbWF0ZXJpYWxpemVkIHRoZSBldmVudCBiZWNhdXNlIHRoZSBwcm9kdWNlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgd3JpdGUgaGFkIG5vdCBsYW5kZWQgaW4gdGhlIHByZWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUuSG9va1Jlc2lsaWVudFJlc3VtZU1hdGVyaWFsaXplZCh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjYW5vbmljYWwgZXZlbnQg4oCUIHdoZXRoZXIgdGhpcyBjYWxsIGNvbW1pdHRlZCBpdCBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyZ2VkIG9uIHRoZSBwcm9kdWNlcidzIGNvbmN1cnJlbnQgd3JpdGUg4oCUIHNvIHdlIGNhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGludG8gdGhlIHByZWxvYWRlZCBsb2cgaW5zdGVhZCBvZiBkaXNjYXJkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJlbG9hZCAoc2VlIGJlbG93KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCBgZXZlbnREYXRhYCBmcm9tIGBob29rSW5wdXRgIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVzdGluZyB0aGUgUE9TVCByZXNwb25zZSdzIHBheWxvYWQ6IHdvcmxkLXZlcmNlbCBwb3N0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9va19yZWNlaXZlZCB3aXRoIGByZW1vdGVSZWZCZWhhdmlvcjogJ2xhenknYCwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBldmVudCdzIHBheWxvYWQgaXMgYSBSZW1vdGVSZWYgKmRlc2NyaXB0b3IqLCBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJpYWxpemVkIGJ5dGVzIHJlcGxheSBuZWVkcy4gYGhvb2tJbnB1dGAgY2Fycmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlYWwgdG9rZW4gKyBwYXlsb2FkIGJ5dGVzICh0aGV5IHJvZGUgdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlKSwgc28gc3BsaWNlIHRob3NlIG9udG8gdGhlIHJldHVybmVkIGV2ZW50J3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWJsZSBldmVudElkL21ldGFkYXRhLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlLWVuc3VyZSBhbHdheXMgcmV0dXJucyBhIGBob29rX3JlY2VpdmVkYCBldmVudCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzcGxpY2UgaXMgc2FmZS4gVGhlIGNhc3QgaXMgbmVlZGVkIGJlY2F1c2Ugc3ByZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmF3IGBFdmVudGAgdW5pb24gYW5kIG92ZXJyaWRpbmcgYGV2ZW50RGF0YWAgY29sbGFwc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIG5vbi1gaG9va19yZWNlaXZlZGAgbWVtYmVyICh3aG9zZSBgZXZlbnREYXRhYCBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgc2hhcGUpOyB0aGUgb2JqZWN0IGlzIGEgZ2VudWluZSBgaG9va19yZWNlaXZlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50IGJ5IGNvbnN0cnVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBlbnN1cmVkLmV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlZEV2ZW50ID0gYmFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBob29rSW5wdXQudG9rZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGhvb2tJbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIEV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbWF0Y2hpbmcgY29uY3VycmVudCBjbGFpbSAoc2FtZSByZXN1bWVJZCArIGRpZ2VzdCkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGFzIHN1Y2Nlc3Mgc2VydmVyLXNpZGUgYW5kIG5ldmVyIHRocm93cywgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFueXRoaW5nIGNhdWdodCBoZXJlIGlzIGEgZ2VudWluZSB0ZXJtaW5hbCBvciB0cmFuc2llbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmRpdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAtIEhvb2tOb3RGb3VuZCAvIFJ1bkV4cGlyZWQ6IHRoZSBwcm9kdWNlcidzIGRpcmVjdCB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBhbHJlYWR5IGVuZGVkIHRoaXMgcmVzdW1lJ3MgZWxpZ2liaWxpdHkgKHRoZSBydW4gd2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0ZXJtaW5hbCkuIFRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byByZXN1bWUsIHNvIGNvbnN1bWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIG1lc3NhZ2UgYW5kIHN0b3AuIENvbnRpbnVpbmcgdG8gcmVwbGF5IHdvdWxkIGJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHdhc3RlZCB3b3JrIOKAlCBhbmQsIHdvcnNlLCB3b3VsZCBhY2sgYSBkZWxpdmVyeSB0aGF0IG1heVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjYXJyeSB0aGUgb25seSBjb3B5IG9mIHRoZSBwYXlsb2FkLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBIb29rTm90Rm91bmRFcnJvci5pcyhlcnIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBFbnRpdHlDb25mbGljdCAoYW5kIGFueSBvdGhlciB1bmV4cGVjdGVkIGVycm9yKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJlc3VtZUlkIGNvbnN0cmFpbnQgZXhpc3RzIGJ1dCB0aGUgbWF0Y2hpbmcgZXZlbnQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgbm90IHlldCBvYnNlcnZhYmxlIOKAlCB0aGUgcHJvZHVjZXIncyBwYXJhbGxlbCB3cml0ZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBzdGlsbCBpbiBmbGlnaHQsIG9yIGEgcmVkcml2ZSByYWNlZCB0aGUgY2xhaW0uIFRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgdHJhbnNpZW50OiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGF0dGVtcHQgY29udmVyZ2VzIG9uIHRoZSBjb21taXR0ZWQgZXZlbnQgaW5zdGVhZCBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICByZXBsYXlpbmcgKGFuZCBhY2tpbmcpIHdpdGhvdXQgdGhlIHBheWxvYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBydW5fc3RhcnRlZCByZXNwb25zZSBwcmVsb2FkZWQgdGhlIGxvZyBCRUZPUkUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSwgc28gaXQgY2Fubm90IGluY2x1ZGUgdGhlIGhvb2tfcmVjZWl2ZWQuIFJhdGhlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gZGlzY2FyZCB0aGUgcHJlbG9hZCAod2hpY2ggd291bGQgY29zdCBhIGZyZXNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzLmxpc3Qgcm91bmQgdHJpcCBvbiB0aGUgZmlyc3QgcmVwbGF5IGl0ZXJhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3BsaWNlIGluIHRoZSBjYW5vbmljYWwgZXZlbnQgcmVjb25zdHJ1Y3RlZCBhYm92ZS4gSXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGEgc3RhYmxlIGV2ZW50SWQsIHNvIGBpbnNlcnRFdmVudEJ5RXZlbnRJZGAga2VlcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbiBhc2NlbmRpbmcgZXZlbnRJZCBvcmRlciBhbmQgaXMgaWRlbXBvdGVudCBpZiBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCByZS1vYnNlcnZlcyBpdC4gT25seSB3aGVuIHRoZSBXb3JsZCByZXR1cm5zIG5vIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgZmFsbCBiYWNrIHRvIHJlbG9hZGluZyB0aGUgY29tcGxldGUgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlICE9PSAnbG9hZEFsbCcgJiYgZW5zdXJlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRFdmVudEJ5RXZlbnRJZChldmVudExvZy5ldmVudHMsIGVuc3VyZWRFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyB0eXBlOiAnbG9hZEFsbCcgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UgKHJlLWVuc3VyZSBuZWVkZWQpXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIHJ1bidzIGRlcGxveW1lbnQuXG4gICAgICAgICAgICAgICAgICAvLyBVc2VkIGVhZ2VybHkgaGVyZSBzaW5jZSBib3RoIHdvcmtmbG93IGV4ZWN1dGlvbiAoaW5wdXRcbiAgICAgICAgICAgICAgICAgIC8vIGh5ZHJhdGlvbiAvIGhvb2sgcGF5bG9hZCBkZWNyeXB0aW9uKSBhbmQgdGhlIHJ1bl9mYWlsZWRcbiAgICAgICAgICAgICAgICAgIC8vIGRlaHlkcmF0ZSBwYXRoIGJlbG93IG5lZWQgaXQuIE1lbW9pemVkIGFjY2Vzc29yOiBmaXJzdFxuICAgICAgICAgICAgICAgICAgLy8gY2FsbCB0cmlnZ2VycyB0aGUgYWN0dWFsIGZldGNoIC8gSEtERiBkZXJpdmF0aW9uLFxuICAgICAgICAgICAgICAgICAgLy8gc3Vic2VxdWVudCBjYWxscyBhd2FpdCB0aGUgY2FjaGVkIHByb21pc2UuXG4gICAgICAgICAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1blxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KCk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIG9mIFZNLWluZGVwZW5kZW50IHByZXBhcmVkIHBheWxvYWRzXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgaW1tdXRhYmxlIGZpbmFsIHZhbHVlcy4gSXQgc3Vydml2ZXMgdGhlIGZyZXNoIHdvcmtmbG93XG4gICAgICAgICAgICAgICAgICAvLyBWTSBjcmVhdGVkIGJ5IGVhY2ggaW5saW5lIHJlcGxheSwgYnV0IG5ldmVyIGNyb3NzZXMgcnVucyBvclxuICAgICAgICAgICAgICAgICAgLy8gcXVldWUgZGVsaXZlcmllcy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheVBheWxvYWRDYWNoZSA9IG5ldyBSZXBsYXlQYXlsb2FkQ2FjaGUoXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFRoZSBsaXZlIFZNIHBhcmtlZCBhdCB0aGUgcHJldmlvdXMgYm91bmRhcnksIHdoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAvLyByZXRlbnRpb24gZGVjaXNpb24ga2VwdCBpdC4gbnVsbCDihpIgdGhpcyBpdGVyYXRpb24gY29sZC1cbiAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMuIEludm9jYXRpb24tc2NvcGVkOiBkaWVzIHdpdGggdGhpcyBkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgIGxldCByZXRhaW5lZFNlc3Npb246IFdvcmtmbG93U2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAvLyBNYWluIHJlcGxheSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb3JyZWN0bmVzcy9ub0NvbnN0YW50Q29uZGl0aW9uOiBpbnRlbnRpb25hbCBsb29wXG4gICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsb29wSXRlcmF0aW9uKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGF5LWJ1ZGdldCBjaGVjazogYmFpbCBvdXQgKHJldHJ5IG9yIGZhaWwpIGlmXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdGVwIHRpbWUgd2l0aGluIHRoaXMgaW52b2NhdGlvbiBoYXMgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgYnVkZ2V0LiBTdGVwIGJvZGllcyBhcmUgZXhjbHVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSByZXBsYXlCdWRnZXQucGF1c2UoKS9yZXN1bWUoKSBicmFja2V0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGBleGVjdXRlU3RlcGAgY2FsbC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxheUJ1ZGdldC5pc0V4aGF1c3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlUmVwbGF5QnVkZ2V0RXhoYXVzdGVkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0TXM6IHJlcGxheUJ1ZGdldC5jb25maWd1cmVkTGltaXRNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RTbmFwc2hvdDogc2xvdFNuYXBzaG90KCksXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB0aGUgdGVybWluYWwgYXR0ZW1wdCByZXR1cm5zLCBhZnRlciBydW5fZmFpbGVkIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZS4gRWFybGllciBhdHRlbXB0cyByZWplY3QgZm9yIHF1ZXVlIHJlZGVsaXZlcnkuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGltZW91dCBiZWZvcmUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpIC0gaW52b2NhdGlvblN0YXJ0VGltZSA+PVxuICAgICAgICAgICAgICAgICAgICAgIG5vSW5saW5lUmVwbGF5QWZ0ZXJNc1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnVjIgdGltZW91dCByZWFjaGVkLCByZS1zY2hlZHVsaW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIGludm9jYXRpb25TdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXBsYXlTdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gLS0tIFF1aWNrSlMgVk0gZW5naW5lIGRpc3BhdGNoIC0tLVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBRdWlja0pTIGVuZ2luZSAob3B0LWluIHZpYSBXT1JLRkxPV19WTT1xdWlja2pzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3IgZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd1ZtKSBpcyBhIHNlbGYtY29udGFpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdG8gdGhlIG5vZGU6dm0gaW5saW5lLXJlcGxheSBsb2dpY1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LiBJdCBwZXJmb3JtcyB0aGUgc2FtZSBmdWxsIGV2ZW50IHJlcGxheSwgYnV0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVucyB0aGUgd29ya2Zsb3cgY29kZSBpbiBhIFF1aWNrSlMgV0FTTSBWTSwgcXVldWVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcHMgdmlhIHRoZSBzYW1lIGNvbWJpbmVkIHJvdXRlIChzbyB0aGV5IGhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVTdGVwIGJlbG93IG9uIHJlLWVudHJ5KSwgYW5kIG1hbmFnZXMgaXRzIG93blxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bl9jb21wbGV0ZWQgLyBydW5fZmFpbGVkIGxpZmVjeWNsZSBmb3Igd29ya2Zsb3dcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRjb21lcy4gV2hlbiB0aGUgUXVpY2tKUyBlbmdpbmUgaXMgaW4gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpbW1lZGlhdGVseSBhZnRlciBkaXNwYXRjaC5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBJTlNJREUgdGhpcyB0cnk6IGVuZ2luZSBmYWlsdXJlcyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlIHRoZSBlbnRyeXBvaW50IChNYXhFdmVudHNFeGNlZWRlZEVycm9yLCBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV0FTTSBPT00gYXQgdGhlIG1lbW9yeSBjZWlsaW5nLCBhIGJ1bmRsZS1ldmFsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSkgbXVzdCByZWFjaCB0aGlzIGxvb3AncyBjYXRjaCBzbyB0aGV5IGFyZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzaWZpZWQgYW5kIHJlY29yZGVkIGFzIHJ1bl9mYWlsZWQg4oCUIG91dHNpZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRoZXkgd291bGQgbmFjayB0aGUgbWVzc2FnZSBhbmQgYnVybiBhbGwgcXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJpZXMgYmVmb3JlIGR5aW5nIGFzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTUFYX0RFTElWRVJJRVNfRVhDRUVERUQuIFRyYW5zaWVudCB3b3JsZCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCByZXRocm93IG91dCBvZiB0aGUgY2F0Y2ggZm9yIHJlZGVsaXZlcnksIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBub2RlLWVuZ2luZSByZXBsYXkgZmFpbHVyZXMuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVF1aWNrSlNWbSh3b3JrZmxvd1J1bikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1VzaW5nIFF1aWNrSlMgVk0gZW5naW5lJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5kZXIgdHVyYm8sIHJ1bl9zdGFydGVkIGlzIGJhY2tncm91bmRlZC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIGVudHJ5cG9pbnQgZmV0Y2hlcyB0aGUgZXZlbnQgbG9nIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVzIGV2ZW50cyBkaXJlY3RseSwgc28gd2FpdCBmb3IgdGhlIHJ1biB0byBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJseSBzdGFydGVkIGZpcnN0IOKAlCBpdCBkb2VzIG5vdCB0aHJlYWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBydW5SZWFkeUJhcnJpZXIgdGhlIHdheSBoYW5kbGVTdXNwZW5zaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCwgZXZlbnRMb2cuY3Vyc29yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHsgLi4uZXZlbnRMb2csIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgaW1wb3J0OiB0aGUgUXVpY2tKUyBlbnRyeXBvaW50J3MgaW1wb3J0IGNoYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZHMgdGhlIGJhc2U2NCBXQVNNIGJpbmFyeSArIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh+MS4zIE1CIGRlY29kZWQgYXQgbW9kdWxlIHNjb3BlKS4gTG9hZGluZyBpdCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGF0IG91dCBvZiBub2RlLWVuZ2luZSBkZXBsb3ltZW50cyBlbnRpcmVseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g4oCUIG9ubHkgdGhlIG9wdC1pbiBwYXRoIHBheXMsIG9uIGZpcnN0IGRpc3BhdGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBydW5Xb3JrZmxvd1dpdGhRdWlja0pTIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcuL3J1bnRpbWUvcXVpY2tqcy1lbnRyeXBvaW50LmpzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1aWNranNSZXN1bHQgPSBhd2FpdCBydW5Xb3JrZmxvd1dpdGhRdWlja0pTKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkZWRFdmVudHNDb21wbGV0ZTogZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNwYW46IHNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1zdGVwIG93bmVyc2hpcCBwbHVtYmluZzogcmVkZWxpdmVyaWVzIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBkcml2ZSBjcmFzaCByZWNvdmVyeSBmb3Igc3RlcHMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFybGllciBpbnZvY2F0aW9uIGNsYWltZWQgaW5saW5lIChzZWUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wIHBhc3MgaW4gdGhlIGVudHJ5cG9pbnQncyBsb29wKSwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXNzYWdlIGlkIGlzIHN0YW1wZWQgYXMgYG93bmVyTWVzc2FnZUlkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBpbmxpbmUgbGF6eSBzdGVwIGNsYWltcyBzbyB3YWtlIHJlcGxheXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXIgdG8gdGhlIGluLWZsaWdodCBib2R5IGluc3RlYWQgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWV1ZWluZyB0aGUgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaXZlcnlBdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogbWV0YWRhdGEubWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWlja2pzUmVzdWx0Py50aW1lb3V0U2Vjb25kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBgcmVpbnZva2VgIHJhdGhlciB0aGFuIHJldHVybmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgeyB0aW1lb3V0U2Vjb25kcyB9YCBkaXJlY3RseTogdW5kZXIgdHVyYm8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWVzc2FnZSBjYXJyaWVzIGBydW5JbnB1dGAgYW5kIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2hlZHVsZSB3b3VsZCByZS1lbmdhZ2UgdHVyYm8gb24gcmVkZWxpdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocmVwbGF5aW5nIGFnYWluc3QgYSBzdGFsZSBwcmVsb2FkZWQgbG9nIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZWRnaW5nIHRoZSBydW4g4oCUIHNlZSB0aGUgcmVpbnZva2UoKSBkb2NzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlKS4gcmVpbnZva2UgZW5xdWV1ZXMgYW4gZXhwbGljaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uIHdpdGhvdXQgYHJ1bklucHV0YCBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZShxdWlja2pzUmVzdWx0LnRpbWVvdXRTZWNvbmRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cudHlwZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdsb2FkQWZ0ZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBldmVudExvZy5jdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExvZy50eXBlID09PSAnbG9hZEFmdGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRFdmVudExvZyhldmVudExvZywgcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5ldmVudExvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cgPSB7IC4uLnBhZ2UsIHR5cGU6ICdyZWFkeScgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJlY29uZGl0aW9uUmVzdGFydFJlbG9hZChldmVudExvZy5ldmVudHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbmN1cnJlbnQgY29tcGxldGlvbiB2aWEgdGhlIGV2ZW50IGxvZzogaWZcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbnkgb3RoZXIgaGFuZGxlciB3cm90ZSBhIHRlcm1pbmFsIHJ1biBldmVudCwgZXhpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkb2luZyByZXBsYXkgd29yay4gVGhlIHJ1biBlbnRpdHkncyBzdGF0dXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gdGhlc2UgZXZlbnRzLCBzbyBjaGVja2luZyB0aGUgbG9nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlcyB1cyB0aGUgc2FtZSBzaWduYWwgYXMgYSBydW5zLmdldCgpIHJvdW5kLXRyaXBcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRob3V0IHRoZSBleHRyYSByZXF1ZXN0IHBlciBsb29wIGl0ZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUmVjb3JkZWRUZXJtaW5hbFJ1bkV2ZW50KGV2ZW50TG9nLmV2ZW50cywgcnVuSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgZWxhcHNlZCB3YWl0c1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkV2FpdElkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRzVG9Db21wbGV0ZSA9IGV2ZW50TG9nLmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTogZSBpcyBFeHRyYWN0PFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZXZlbnRUeXBlOiAnd2FpdF9jcmVhdGVkJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID4gJiB7IGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB9ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jb3JyZWxhdGlvbklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29tcGxldGVkV2FpdElkcy5oYXMoZS5jb3JyZWxhdGlvbklkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyA+PSAoZS5ldmVudERhdGEucmVzdW1lQXQgYXMgRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICd3YWl0X2NvbXBsZXRlZCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogZS5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVBdDogZS5ldmVudERhdGEucmVzdW1lQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdhaXRFdmVudCBvZiB3YWl0c1RvQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjcmVhdGVFdmVudCh3YWl0RXZlbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdW1wLWFuZC1yZXBvcnQ6IGZvbGQgd2hhdCB0aGlzIHdyaXRlIHNraXBwZWQgb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIHRoZSBsb2csIHdoaWNoIGlzIHdoYXQgYGNyZWF0ZUV2ZW50YCByZWFkcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2xvdCBzbmFwc2hvdCBvZmYsIHNvIGVhY2ggcmVtYWluaW5nIHdhaXQgYXNrcyBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzbG90IGFib3ZlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdHJ1bmNhdGVkIGNhc2UgbWF0dGVycyB0d2ljZSBvdmVyIGhlcmUuIEJleW9uZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gYWNjb3VudGluZyBgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdHMgaXQgZm9yLCB0aGUgbWlzc2luZy1jb21wbGV0aW9uIGNoZWNrIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY2lkZXMgZnJvbSB0aGlzIGxvZyB3aGV0aGVyIHRoZSBoYW5kbGVyIHN0aWxsIGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBmZXRjaCwgc28gYSBwYXJ0aWFsIHBhZ2Ugd291bGQgbWFrZSB0aGUgbG9nIGxvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSBpdCBob2xkcyBhIGNvbXBsZXRpb24gd2hvc2UgcGFnZSBpcyB1bnJlYWQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgdGhlIGZldGNoIG9uIGEgc25hcHNob3Qgc2hvcnQgb2YgdGhlIFdvcmxkJ3MuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFic29yYlNraXBwZWRTbG90UmVwb3J0KGV2ZW50TG9nLmV2ZW50cywgY3JlYXRlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXYWl0IGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiB3YWl0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2ZW50IGxpc3QgYWJvdmUgbWF5IGJlIHN0YWxlIGJ5IHRoZSB0aW1lIGFuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZWxhcHNlZCB3YWl0IGlzIGNvbW1pdHRlZCwgYW5kIHRoaXMgcmVwbGF5IGhhcyB0byBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgb3duIHdhaXRfY29tcGxldGVkIGJlZm9yZSBpdCBjYW4gYWR2YW5jZSBwYXN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNsZWVwLiBFYWNoIHdyaXRlIGFza2VkIHRoZSBXb3JsZCBmb3IgdGhlIGRlbHRhIHNpbmNlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3VyIGN1cnNvciBhbmQgZm9sZGVkIGl0IGluIChzZWUgY3JlYXRlRXZlbnQpLCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGluZyBXb3JsZCBoYXMgYWxyZWFkeSBoYW5kZWQgdGhvc2UgZXZlbnRzIGJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgaXMgbm90aGluZyBsZWZ0IHRvIGRvLiBPbmx5IGZldGNoIGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGV0aW9ucyBzdGlsbCBtaXNzaW5nIGxvY2FsbHk6IGEgV29ybGQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZXMgYHNpbmNlQ3Vyc29yYCwgYSB0cnVuY2F0ZWQgZGVsdGEsIGEgY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFic29yYiB0aGF0IGxvc3QgdGhlIGN1cnNvciByYWNlLCBvciBhblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEVudGl0eUNvbmZsaWN0RXJyb3IsIHdob3NlIHJlamVjdGlvbiBjYXJyaWVzIG5vIGRlbHRhLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlcldyaXRlcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZy5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoZSkgPT4gZS5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGUpID0+IGUuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdXYWl0Q29tcGxldGlvbnMgPSB3YWl0c1RvQ29tcGxldGUuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHdhaXRFdmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWNvbXBsZXRlZFdhaXRJZHNBZnRlcldyaXRlcy5oYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEV2ZW50LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAobWlzc2luZ1dhaXRDb21wbGV0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIG9ubHkgZXZlbnRzIGFmdGVyIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBjdXJzb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGNvbmN1cnJlbnQgZHVyYWJsZSBldmVudHMsIHN1Y2ggYXMgaG9va19yZWNlaXZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlaXIgb3JkZXJpbmcgcmVsYXRpdmUgdG8gd2FpdF9jb21wbGV0ZWQuIEZhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gYSBmdWxsIHJlbG9hZCBmb3Igb2xkZXIgd29ybGRzIHRoYXQgY2Fubm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIHVzIGEgc3RhYmxlIGN1cnNvciwgb3IgaWYgdGhlIGN1cnNvciBkZWx0YSBkb2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgaW5jbHVkZSB0aGUgd2FpdCBjb21wbGV0aW9uIHRoaXMgaGFuZGxlciBqdXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRMb2cuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvciA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZSkgPT4gZS5jb3JyZWxhdGlvbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYXdBbGxXYWl0Q29tcGxldGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdXYWl0Q29tcGxldGlvbnMuZXZlcnkoKHdhaXRFdmVudCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZFdhaXRJZHNBZnRlckN1cnNvci5oYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRFdmVudC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F3QWxsV2FpdENvbXBsZXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXZlbnRMb2coZXZlbnRMb2csIHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlYWR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJlcGxheSByZWFkcyB0aGUgbG9nIGFzIHRoZSBjb21wbGV0ZSByZWNvcmQgb2Ygd2hhdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBoYXBwZW5lZCwgc28gYSBwb3NpdGlvbiBub3RoaW5nIG9jY3VwaWVzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBldmVudCB0aGF0IG5ldmVyIG9jY3VycmVkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBicmFuY2ggaXQgd291bGQgaGF2ZSBkZWNpZGVkIGdldHMgZGVjaWRlZCB0aGUgb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3YXkuIEZhaWxpbmcgaGVyZSBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgcnVuIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRzIGl0cyBvd24gY29ycnVwdGlvbiBhbmQgb25lIHRoYXQgc2lsZW50bHlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5zIHRoZSB3cm9uZyBhbnN3ZXIuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBBIGhvbGUgdGhhdCBpcyBtZXJlbHkgYSB3cml0ZSBtaWQtY29tbWl0IGZpbGxzIGluIG9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG93biwgc28gc2V0dGxlRXZlbnRTbG90R2FwIHJlLXJlYWRzIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNsdWRpbmcsIGFuZCBhZG9wdHMgd2hpY2hldmVyIGxvZyBpdCBzZXR0bGVkIG9uLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Nsb3RHYXBDaGVja0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IHNldHRsZUV2ZW50U2xvdEdhcChydW5JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IGV2ZW50TG9nLmV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBldmVudExvZy5jdXJzb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0geyAuLi5zZXR0bGVkLmxvZywgdHlwZTogJ3JlYWR5JyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRsZWQuZ2FwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEV2ZW50IGxvZyBmb3IgcnVuICR7cnVuSWR9IGhhcyBhIGhvbGUgYXQgc2xvdCAke3NldHRsZWQuZ2FwLmZpcnN0TWlzc2luZ1Nsb3R9OiAke3NldHRsZWQuZ2FwLm1pc3NpbmdDb3VudH0gb2YgdGhlICR7c2V0dGxlZC5nYXAubWF4U2xvdH0gc2xvdHMgdXAgdG8gdGhlIGxvZydzIG1heGltdW0gaG9sZCBubyBldmVudC5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGluZyBlbGFwc2VkIHdhaXRzIHJlZnJlc2hlcyB0aGUgZXZlbnQgc25hcHNob3QuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25jdXJyZW50IGhhbmRsZXIgbWF5IGhhdmUgd3JpdHRlbiB0aGUgdGVybWluYWwgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgYWZ0ZXIgdGhlIGluaXRpYWwgc25hcHNob3QgYnV0IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5LiBPbmNlIHRoZSBldmVudCBsb2cgcmVjb3JkcyB0aGF0IG91dGNvbWUsIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxpdmVyeSBpcyBkb25lLlxuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSZWNvcmRlZFRlcm1pbmFsUnVuRXZlbnQoZXZlbnRMb2cuZXZlbnRzLCBydW5JZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVudC1saW1pdCBndWFyZDogZmFpbCBhIHJ1bmF3YXkgcnVuIG9uY2UgaXRzIGxvZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZXMgdGhlIHNlcnZlci1zdXBwbGllZCBjZWlsaW5nICh1bmRlZmluZWQg4oeSIG5vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZW5mb3JjZW1lbnQpLiBUaGUgdGhyb3cgaXMgY2F1Z2h0IGJlbG93IGFuZCB3cml0dGVuIGFzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX2ZhaWxlZCAvIE1BWF9FVkVOVFNfRVhDRUVERUQuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXZlbnRzTGltaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLmxlbmd0aCA+PSBtYXhFdmVudHNMaW1pdFxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1heEV2ZW50c0V4Y2VlZGVkRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLmV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heEV2ZW50c0xpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgIC8vIExhdGVuY3kgdGVsZW1ldHJ5OiBqdWRnZSBUVEZTIGVsaWdpYmlsaXR5IGFnYWluc3QgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbidzIGZpcnN0IHNuYXBzaG90LiBXYWl0cyBjb21wbGV0ZWQgYWJvdmVcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBhbHJlYWR5IGRpc3F1YWxpZnkgdmlhIHRoZSBldmVudC10eXBlIGNoZWNrLCBzb1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGV2YWx1YXRpbmcgYWZ0ZXIgdGhlIHdhaXQgcGFzcyBpcyBlcXVpdmFsZW50LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJfc2V0IGlzIHBlcm1pdHRlZDogYSByZWRlbGl2ZXJ5IGNhbiBsYW5kIGFmdGVyIGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQgcHJlLXN0ZXAgYXR0cl9zZXQsIGFuZCB0aGUgZGV0b3VyIGl0IG1hcmtzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3VidHJhY3RlZCB2aWEgcHJlU3RlcEF0dHJTdGFydE1zIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBpbnZvY2F0aW9uIHdyb3RlIGl0IChzZWUgcnVudGltZS9zdGVwLWxhdGVuY3kudHMpLlxuICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW4gPz89IGV2ZW50TG9nLmV2ZW50cy5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ3J1bl9zdGFydGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0J1xuICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdTdGFydGluZyB3b3JrZmxvdyBleGVjdXRpb24nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudENvdW50OiBldmVudExvZy5ldmVudHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uTW9kZTogcmV0YWluZWRTZXNzaW9uID8gJ3JldGFpbmVkJyA6ICdyZXBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUVFIgVDMuIGA/Pz1gIHNvIGl0IG1hcmtzIHRoZSBGSVJTVCByZXBsYXkgcGFzcyBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW52b2NhdGlvbjogYSByZXN1bWUgdGhhdCBuZWVkcyBtb3JlIHRoYW4gb25lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyB0byByZWFjaCBpdHMgc3RlcCAoZS5nLiBhIHByZS1zdGVwXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHNldEF0dHJpYnV0ZXNgIGRldG91cikgcmVwb3J0cyB0aGUgZXh0cmEgcGFzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5zaWRlIGByZXBsYXlgLCBrZWVwaW5nIHRoZSBwaGFzZXMgYWRkaXRpdmUuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VtZVRyYWNraW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyA/Pz0gcmVwbGF5U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGV2ZXJ5IG1pc3NpbmcgZGVjcnlwdC9kZWNvbXByZXNzIG9wZXJhdGlvbiB1cFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb250IChhbHJlYWR5LXByZXBhcmVkIHBheWxvYWRzIGFyZSBza2lwcGVkKS4gV2ViXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQ3J5cHRvIHdvcmsgb3ZlcmxhcHMgVk0gc2V0dXAgb24gdGhlIHJlcGxheSBwYXRoIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhcHBlbmRlZCBldmVudHMnIGNvbnN1bXB0aW9uIG9uIHRoZSByZXN1bWUgcGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdW1lcnMgc3RpbGwgZGVzZXJpYWxpemUgYW5kIHJlc29sdmUgaW4gZXZlbnQgb3JkZXIuXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZFByZXdhcm0gPSByZXBsYXlQYXlsb2FkQ2FjaGUucHJld2FybShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgd29ya2Zsb3dSZXN1bHQ6IFdvcmtmbG93UmVzdW1lUmVzdWx0ID0gcmV0YWluZWRTZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGF3YWl0IHJlc3VtZVdvcmtmbG93KHJldGFpbmVkU2Vzc2lvbiwgZXZlbnRMb2cuZXZlbnRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICdyZXBsYXknIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAod29ya2Zsb3dSZXN1bHQudHlwZSA9PT0gJ3JlcGxheScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1Jlc3VsdCA9IGF3YWl0IHJlcGxheVdvcmtmbG93KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IHRoZSBlbmQtb2YtcnVuIGRyYWluIGluc2lkZSB3b3JrZmxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpb24gY29tbWl0cyBmaXJlLWFuZC1mb3JnZXQgYCpfY3JlYXRlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIGJlZm9yZSB0aGUgdGVybWluYWwgYGF3YWl0UnVuUmVhZHkoKWAgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRDYXBhYmlsaXRpZXM6IHdvcmxkLmNhcGFiaWxpdGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwYXlsb2FkUHJld2FybTtcblxuICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrZmxvd1Jlc3VsdC50eXBlID09PSAnc3VzcGVuZGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyayB0aGUgbGl2ZSBzZXNzaW9uOyB0aGUgc3VzcGVuc2lvbiBjYXRjaCBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgdGhlIG9uZSByZXRlbnRpb24gZGVjaXNpb24g4oCUIGtlZXAgaXQgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpdGVyYXRpb24gb3IgZGlzY2FyZCBpdCBmb3IgYSBmcmVzaCByZXBsYXkuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFNlc3Npb24gPSB3b3JrZmxvd1Jlc3VsdC5zZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgd29ya2Zsb3dSZXN1bHQuc3VzcGVuc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB3b3JrZmxvd1Jlc3VsdC5vdXRwdXQ7XG4gICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnV29ya2Zsb3cgZXhlY3V0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiBEYXRlLm5vdygpIC0gcmVwbGF5U3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb25Nb2RlOiByZXRhaW5lZFNlc3Npb24gPyAncmV0YWluZWQnIDogJ3JlcGxheScsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlci5hY3RpdmF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgY29tcGxldGVkLiBEbyBOT1QgcmVsb2FkLWFuZC1yZXRyeSB0aGUgY3JlYXRlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW4gcGxhY2U6IGByZXN1bHRgIHdhcyBjb21wdXRlZCBieSB0aGlzIHJlcGxheSwgc28gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWxlICg0MTIpIHJlamVjdGlvbiBtdXN0IGZvcmNlIGEgKmZyZXNoIHJlcGxheSogKHdoaWNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IG9ic2VydmUgdGhlIG5ldyBldmVudCBhbmQgcHJvZHVjZSBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCksIG5vdCByZS1jb21taXQgdGhlIHN0YWxlIHJlc3VsdC4gVGhlIGNhdGNoIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdGFydHMgdGhlIHJlcGxheSBpbi1wcm9jZXNzLlxuICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogYSB3b3JrZmxvdyB0aGF0IGZpbmlzaGVzIHdpdGggbm8gc3RlcHMgcmVhY2hlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBiZWZvcmUgdGhlIGJhY2tncm91bmRlZCBydW5fc3RhcnRlZDsgb3JkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hbCB3cml0ZSBhZnRlciBpdCBzbyB0aGUgcnVuIGV4aXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBvdXRwdXQ6IHJlc3VsdCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuRXhwaXJlZEVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbm91cyB3b3JrZmxvdy1leGVjdXRpb24gZHVyYXRpb24gZm9yIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbnNpb24gb25seSDigJQgYW5jaG9ycyB0aGUgYGZpbmFsU2NoZWR1bGluZ1JlcGxheWBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbGVtZXRyeSBmaWVsZCBiZWxvdyAoc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwTGF0ZW5jeVRyYWNraW5nLnJlcGxheU1zKS4gVGhpcyBpcyB0aGUgRklOQUxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBwYXNzLCB0aGUgb25lIHRoYXQgcmVhY2hlZCBhbmQgc2NoZWR1bGVkIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3Qgc3RlcDogdmFsaWQgcnNmcyBwYXRocyBjYW4gcmVwbGF5IG1vcmUgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBiZWZvcmUgdGhlIGZpcnN0IHN0ZXAgKGUuZy4gYSB3b3JrZmxvdy1ib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc2V0QXR0cmlidXRlcygpYCBkZXRvdXIgcmVwbGF5cyB0d2ljZSksIGFuZCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJ5IG9taXRzIGVhcmxpZXIgaW52b2NhdGlvbnMnIHJlcGxheSB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRpcmVseS4gVGhpcyB2YWx1ZSBpcyBOT1QgYWNjdW11bGF0ZWQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aG9zZSBlYXJsaWVyIHBhc3Nlcywgc28gaXQgbXVzdCBub3QgYmUgcmVhZCBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCJ0aGUgcmVwbGF5IHBvcnRpb24gb2YgcnNmc1wiIOKAlCByc2ZzIGNvdmVycyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob2xlIHJ1bl9zdGFydGVkLXRvLWZpcnN0LXN0ZXAgd2luZG93O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxTY2hlZHVsaW5nUmVwbGF5IGNvdmVycyBvbmx5IHRoaXMgbGFzdCBwYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZWQgaGVyZSwgYmVmb3JlIGBoYW5kbGVTdXNwZW5zaW9uYCdzIGF3YWl0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkvTywgc28gaXQgZXhjbHVkZXMgdGhhdCBJL08uXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBkdXBsaWNhdGVzIHdoYXQgT1RFTCBhbHJlYWR5IGNhcHR1cmVzIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuL2ludm9jYXRpb24gc3BhbiwgYnV0IGlzIGNvbGxlY3RlZCBhcyBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbGVtZXRyeSBzbyB0aGUgc2VydmVyIGNhbiBlbWl0IGl0IGFzIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVTlNBTVBMRUQsIGZ1bGwtcG9wdWxhdGlvbiBtZXRyaWM6IHdvcmtmbG93LXNlcnZlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgc3BhbnMgYXJlIGhlYXZpbHkgc2FtcGxlZCBpbiBwcm9kdWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAofjclKSwgYW5kIGNsaWVudCBzcGFucyBjYW4ndCBiZSBmaWx0ZXJlZCBieSBTREtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24sIHNvIG5laXRoZXIgY2FuIHNlcnZlIGFzIHRoZSBkYXNoYm9hcmQnc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhY3QgVFRGUyBkZWNvbXBvc2l0aW9uLiBPbiBhIHJldGFpbmVkLVZNXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgdGhpcyBtZWFzdXJlcyB0aGUgcmVzdW1lICh0eXBpY2FsbHkgfjBtcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSByZXBsYXksIHNvIHRoZSBmaWVsZCdzIGRpc3RyaWJ1dGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmltb2RhbCBvbmNlIHJldGVudGlvbiBpcyBhY3RpdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5kZWRBdE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxheUR1cmF0aW9uTXMgPSBzdXNwZW5kZWRBdE1zIC0gcmVwbGF5U3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUVFIgVDQg4oCUIHRoZSBuZXh0IGR1cmFibGUgc3RlcCBoYXMgYmVlbiBlbmNvdW50ZXJlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhdGVkIG9uIHRoZSBzdXNwZW5zaW9uIGFjdHVhbGx5IHNjaGVkdWxpbmcgc3RlcHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHN1c3BlbnNpb24gdGhhdCBvbmx5IGNyZWF0ZXMgaG9va3Mvd2FpdHMgaGFzIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlZCBhIHN0ZXAsIGFuZCBhIGxhdGVyIHBhc3MgbWF5LiBUYWtlbiBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBpbnN0YW50IGFzIGByZXBsYXlEdXJhdGlvbk1zYCBzbyBUNCBjYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIHByZWNlZGUgVDMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdW1lVHJhY2tpbmcgJiYgZXJyLnN0ZXBDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lVHJhY2tpbmcubmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXMgPz89XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkQXRNcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1dvcmtmbG93IHN1c3BlbmRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwczogZXJyLnN0ZXBDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9va3M6IGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzOiBlcnIud2FpdENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXNwZW5zaW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkV29ya2Zsb3dTdXNwZW5zaW9uTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuc3RlcENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLndhaXRDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25NZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoc3VzcGVuc2lvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBWMjogaGFuZGxlIHN1c3BlbnNpb24gd2l0aG91dCBxdWV1aW5nIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWFjaCBldmVudCBjcmVhdGlvbiBpbnNpZGUgaGFuZGxlU3VzcGVuc2lvbiBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlY29uZGl0aW9uIHNuYXBzaG90IG9mIHRoZSBsb2FkZWQgZXZlbnQgbG9nLCBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZW5kIGhvbGRpbmcgYW4gZXZlbnQgdGhpcyByZXBsYXkgbmV2ZXIgc2F3IHJlamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3cml0ZSAoNDEyKSBpbnN0ZWFkIG9mIGFjY2VwdGluZyBhIGRpdmVyZ2VudCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVqZWN0aW9uIGlzIGhhbmRsZWQgaGVyZSwgYnkgcmVzdGFydGluZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSDigJQgbmV2ZXIgYnkgcmUtcG9zdGluZyB0aGUgc2FtZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1c3BlbnNpb25TdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nLnR5cGUgPT09ICdyZWFkeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBzdXNwZW5kZWQgYmVmb3JlIGl0cyBldmVudCBsb2cgd2FzIGxvYWRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VzcGVuc2lvblJlc3VsdDogQXdhaXRlZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZTx0eXBlb2YgaGFuZGxlU3VzcGVuc2lvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgID47XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0ID0gYXdhaXQgaGFuZGxlU3VzcGVuc2lvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbjogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogd29ya2Zsb3dSdW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheVJlY292ZXJ5UmVwb3J0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2g6IGxldHMgZWxpZ2libGUgbmV3bHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHN0ZXBzIHB1Ymxpc2ggdGhlaXIgc3RlcC1leGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIChjYXJyeWluZyBgc3RlcElucHV0YCkgaW4gcGFyYWxsZWwgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUuIFN0ZXBzIHF1ZXVlZCB0aGVyZSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZCBiYWNrIGluIGBxdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHNgIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXBwZWQgYnkgdGhlIGRpc3BhdGNoIHBhc3MgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcERpc3BhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU5hbWU6IGdldFdvcmtmbG93UXVldWVOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYWNlQ2FycmllcjogbmV4dFRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZSBwcmUtY2xhaW1zOiBsZXRzIHRoZSBiYXRjaGVkIGZhbi1vdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xkIHRoZSBsYXp5LWlubGluZSBzdGVwcycgc3RlcF9jcmVhdGVkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgcGFpcnMg4oCUIHN0YW1wZWQgd2l0aCB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSdzIG93bmVyc2hpcCDigJQgaW50byB0aGUgb25lIGNvbW1pdCwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYm9kaWVzIGJlbG93IHN0YXJ0IHN0cmFpZ2h0IG9mZiBpdC4gU2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VzcGVuc2lvbkhhbmRsZXJSZXN1bHQuaW5saW5lQ2xhaW1zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyTWVzc2FnZUlkOiBtZXRhZGF0YS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBmb2xkIHJldHVybiBvbmNlIHRoZSBwYWlyIGNodW5rIGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHRlZDogdHJhaWxpbmcgY2h1bmtzIGFuZCB0aGUgcGVyLWNodW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcC1tZXNzYWdlIHB1Ymxpc2hlcyByaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGRlZmVycmVkQmF0Y2hXb3JrYCwgd2hpY2ggdGhpcyBpbnZvY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gam9pbnMgYmVmb3JlIGl0IGNhbiBhY2sgKGJlbG93LCBuZXh0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGpvaW4pIOKAlCBzbyB0aGUgZHVyYWJpbGl0eSBjb250cmFjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY2hhbmdlZCB3aGlsZSB0aGUgYm9kaWVzIHN0YXJ0IGVhcmxpZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWZlcnJlZEJhdGNoV29yazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdXNwZW5zaW9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGNyZWF0ZSB3YXMgcmVqZWN0ZWQgYXMgc3RhbGU6IHJlLWRlcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGZyb20gYSBjb3JyZWN0ZWQgbG9nIGluIHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB0aGUgaW4tcHJvY2VzcyBidWRnZXQgaXMgc3BlbnQsIGZhbGwgYmFjayB0byBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBpbW1lZGlhdGUgcmUtaW52b2NhdGlvbiAoYSByZXRocm93IHJlbGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZWRlbGl2ZXJ5IG9mIGEgbWVzc2FnZSB0aGUgdHVyYm8gcGF0aCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFja2VkIOKAlCB0aGUgcnVuIHdvdWxkIHN0YWxsIGZvciB0aGUgcXVldWUncyB+MzAwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhzdXNwZW5zaW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydFJlcGxheUluUHJvY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1c3BlbnNpb24tY3JlYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWludm9rZUFmdGVyU3RhbGVSZWplY3Rpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXNwZW5zaW9uLWNyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXItcnVuIGJ1ZGdldCBzcGVudDogZmFpbCB0aGUgcnVuIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZCBpdCBiYWNrIHRvIHRoZSBxdWV1ZSB0byBzcGluIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVzY2FsYXRpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGYXRhbEVycm9yLmlzKHN1c3BlbnNpb25FcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgZmFpbHVyZXMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgc28gdGhlIG1lc3NhZ2UgaXMgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3VzcGVuc2lvbkVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi1yZXRyeWFibGUgZmFpbHVyZSB3aGlsZSBjb21taXR0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uJ3MgZXZlbnRzIOKAlCBlLmcuIGFuIGF0dHJpYnV0ZSB3cml0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgV29ybGQgcmVqZWN0ZWQgYXMgaW52YWxpZCAodGhlIGN1bXVsYXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXJ1biBjYXAgY2FuIG9ubHkgYmUgY2hlY2tlZCBXb3JsZC1zaWRlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVkZWxpdmVyeSB3b3VsZCByZXBsYXkgdGhlIHdvcmtmbG93IGludG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgd3JpdGUgYW5kIHRoZSBzYW1lIHJlamVjdGlvbiwgc28gZmFpbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHdpdGggdGhlIGVycm9yIGluc3RlYWQgb2Ygd2VkZ2luZyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBpbiByZWRlbGl2ZXJ5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBjbGFzc2lmeVJ1bkVycm9yKHN1c3BlbnNpb25FcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vbi1yZXRyeWFibGUgZXJyb3Igd2hpbGUgY29tbWl0dGluZyB3b3JrZmxvdyBzdXNwZW5zaW9uOyBmYWlsaW5nIHJ1bicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN1c3BlbnNpb25FcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IG9yZGVyIHRoZSB0ZXJtaW5hbCB3cml0ZSBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXdhaXRSdW5SZWFkeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUV2ZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdydW5fZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmtmbG93UnVuPy5zcGVjVmVyc2lvbiA/PyAwKSA+PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyB3b3JrZmxvdyBydW4sIGJ1dCBydW4gaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25FcnJvci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLkVycm9yVHlwZShzdXNwZW5zaW9uRXJyb3IubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5yZXBvcnRlZEV2ZW50Q291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1bXAtYW5kLXJlcG9ydCBtZXJnZWQgZXZlbnRzIEJFTE9XIHRoZSB0YWlsIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1zb3J0ZWQgdGhlIGFycmF5IHRvIHNsb3Qgb3JkZXIsIHNoaWZ0aW5nIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIHRoZSBwcmV3YXJtIHNjYW4gaGFkIGFscmVhZHkgcmVjb3JkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJzb3IgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgYWxvbmU6IHRoZSByZXBvcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgYSBsb3dlciBib3VuZCBvbiB3aGF0IHdhcyBza2lwcGVkLCBzbyB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnRhbCByZWFkIHN0aWxsIGhhcyB0byBjb3ZlciB0aGUgc2FtZSByYW5nZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UGF5bG9hZENhY2hlLnJlc2V0U2NhbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPcGVuIGhvb2tzL3dhaXRzIGluIHRoZSBsb2cgYXMgbG9hZGVkIGZvciB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYXkuIFRoaXMgc3VzcGVuc2lvbidzIG93biBob29rL3dhaXQgd3JpdGVzIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9UIGluIGl0IOKAlCB0aGV5IG5ldmVyIHJlYWNoIHJldGVudGlvbiBhbnl3YXksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGEgc3VzcGVuc2lvbiBjb250YWluaW5nIGEgbm9uLXN0ZXAgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbHMgY2FuUmV0YWluV29ya2Zsb3dTZXNzaW9uJ3MgdHlwZSBjaGVjayBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzY2FuIGlzIGNvbnN1bHRlZC4gQ29tcHV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhemlseSwgYXQgbW9zdCBvbmNlLCBhbmQgc2hhcmVkIGJldHdlZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRlbnRpb24gZGVjaXNpb24gaGVyZSBhbmQgdGhlIGRlbHRhL3R1cmJvIGdhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyDigJQgdGhlIGF0dHItZGV0b3VyIGFuZCBob29rLWNvbmZsaWN0IHBhdGhzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4vY29udGludWUgYmVmb3JlIHRoZSBnYXRlcyBhbmQgdXN1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvcnQtY2lyY3VpdCBiZWZvcmUgZXZlciBzY2FubmluZyB0aGUgbG9nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3Blbkhvb2tXYWl0ID0gb25jZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChldmVudExvZy50eXBlID09PSAncmVhZHknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5Ib29rQW5kV2FpdFN0YXRlKGV2ZW50TG9nLmV2ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNpbmdsZSByZXRlbnRpb24gZGVjaXNpb246IGtlZXAgdGhlIHBhcmtlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Vzc2lvbiBvbmx5IGFjcm9zcyBhIHB1cmUgc3RlcCBib3VuZGFyeSB3aXRoIG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQtb2YtYmFuZCBjb250aW51YXRpb24gc291cmNlIGFuZCBwcm92YWJseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2l2ZSBzdGVwIGlucHV0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWluZWRTZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFjYW5SZXRhaW5Xb3JrZmxvd1Nlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQucmV0YWluZWRTdGVwSW5wdXRzU2FmZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuSG9va1dhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyArPSBzdXNwZW5zaW9uUmVzdWx0Lmhvb2tDcmVhdGlvbk1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0Lmhhc0F0dHJpYnV0ZUV2ZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdCZWZvcmVBdHRyTXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZVN0ZXBCbG9ja2luZ0JlZm9yZUF0dHJNcyA9IHByZVN0ZXBCbG9ja2luZ01zO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnU3VzcGVuc2lvbiBoYW5kbGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbk1zOiBEYXRlLm5vdygpIC0gc3VzcGVuc2lvblN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RlcHM6IHN1c3BlbnNpb25SZXN1bHQucGVuZGluZ1N0ZXBzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHM6IHN1c3BlbnNpb25SZXN1bHQud2FpdFRpbWVvdXQ/LnNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0hvb2tDb25mbGljdDogc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rQ29uZmxpY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F3YWl0ZWRIb29rQ3JlYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdHRyaWJ1dGVFdmVudHM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNBdHRyaWJ1dGVFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9vayBjb25mbGljdDogYnJlYWsgbG9vcCwgcmUtaW52b2tlIHZpYSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0NvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmF0aXZlIHdvcmtmbG93IGF0dHJpYnV0ZSBldmVudHMgYXJlIHJlc29sdmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHJlcGxheTogdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gcmVsb2FkcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyAobm93IGhvbGRpbmcgdGhlIGp1c3QtY29tbWl0dGVkIGF0dHJfc2V0KSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMsIHJlc29sdmluZyB0aGUgc2V0QXR0cmlidXRlcyBwcm9taXNlLiBTa2lwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHByb2Nlc3NpbmcgZm9yIHRoaXMgcGFzcyBzbyB0aGF0IHJlcGxheSBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByYWNlcyBmaXJzdCDigJQgaW4gUHJvbWlzZS5yYWNlKFtzZXRBdHRyaWJ1dGVzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwKCldKSwgdGhlIGR1cmFibGUgYXR0cmlidXRlIGV2ZW50IG11c3QgYmUgYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gd2luIHdpdGhvdXQgZXhlY3V0aW5nIHRoZSBsb3Npbmcgc3RlcC4gVGhlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFwcGVucyBpbi1wcm9jZXNzIHJhdGhlciB0aGFuIHZpYSBhIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1pbnZvY2F0aW9uOiB1bmxpa2UgaG9va3MgYW5kIHdhaXRzLCBhbiBhdHRyX3NldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50cm9kdWNlcyBubyBvdXQtb2YtYmFuZCBpbnZvY2F0aW9uIHNvdXJjZSB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciB3b3VsZCBuZWVkIHRvIHlpZWxkIHRoZSBtZXNzYWdlIGZvciwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBheWluZyBhIGRlbGl2ZXJ5IHJvdW5kLXRyaXAgaGVyZSB3b3VsZCBvbmx5IGFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBiZWZvcmUgdGhlIHdvcmtmbG93J3MgbmV4dCBzdGVwLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwZW5kaW5nU3RlcHMgPSBzdXNwZW5zaW9uUmVzdWx0LnBlbmRpbmdTdGVwcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV4ZWN1dGlvbiBpcyBnYXRlZCBvbiBvd25lcnNoaXAuIFRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuc2lvbiBoYW5kbGVyIGRlZmVycmVkIHRoZSBzdGVwX2NyZWF0ZWQgd3JpdGUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB0byBgZ2V0TWF4SW5saW5lU3RlcHMoKWAgc3RlcHMgKGBsYXp5SW5saW5lU3RlcHNgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJ1biB0aGVtIGlubGluZSDigJQgaW4gcGFyYWxsZWwg4oCUIHZpYSBsYXp5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgc3RlcF9zdGFydGVkYCBldmVudHMgdGhhdCBjcmVhdGUgZWFjaCBzdGVwIG9uIHRoZSBmbHksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZpbmcgb25lIHdvcmxkIHJvdW5kLXRyaXAgcGVyIGlubGluZSBzdGVwLiBPd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGF0b21pYyBhbmQgZXhhY3RseS1vbmUgcGVyIHN0ZXA6IHRoZSB3b3JsZCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0gaW5zaWRlIGVhY2ggc3RlcF9zdGFydGVkIHJldHVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBFbnRpdHlDb25mbGljdEVycm9yYCAo4oaSIGV4ZWN1dGVTdGVwIGBza2lwcGVkYCkgdG8gYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25jdXJyZW50IGxvc2VyLCBzbyBvbmx5IG9uZSBoYW5kbGVyIGV2ZXIgcnVucyBhIGdpdmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBib2R5LiBFdmVyeSBvdGhlciBwZW5kaW5nIHN0ZXAga2VlcHMgaXRzIGVhZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgKGluIGBjcmVhdGVkU3RlcENvcnJlbGF0aW9uSWRzYCkgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHN1c3BlbnNpb24gaGFuZGxlciBvbmx5IGRlc2lnbmF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBsYXp5SW5saW5lU3RlcHNgIHdoZW4gbm8gYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgcHJlc2VudC4gVGhhdCBhd2FpdGVyIGNhc2UgbXVzdCBleGVjdXRlIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZTogYW4gaW5saW5lIGBhd2FpdCBleGVjdXRlU3RlcCguLi4pYCBibG9ja3MgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlciBmb3IgdGhlIGZ1bGwgc3RlcCBkdXJhdGlvbiwgc28gdGhlIGF3YWl0ZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWF0aW9uICh3aGljaCBvbmx5IGFkdmFuY2VzIG9uIHRoZSBuZXh0IHJlcGxheSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlIHNlcmlhbGl6ZWQgYmVoaW5kIHRoZSBzdGVwIOKAlCBkZWZlYXRpbmcgd29ya1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtmbG93IGV4cHJlc3NlZCBhcyBwYXJhbGxlbCAoZS5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGhvb2suZ2V0Q29uZmxpY3QoKS50aGVuKCgpID0+IHN0ZXBCKCkpYCByYWNpbmcgYGF3YWl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwQSgpYCkuIEluIHRoYXQgY2FzZSBgbGF6eUlubGluZVN0ZXBzYCBpcyBlbXB0eSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IHN0ZXAgaXMgcXVldWVkIGZvciByZS1pbnZvY2F0aW9uLCB3aGljaCByZXBsYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyIHRoZSBqdXN0LWNvbW1pdHRlZCBob29rX2NyZWF0ZWQgYW5kIHJlc29sdmVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlciB3aGlsZSBxdWV1ZWQgc3RlcHMgcnVuIGluIHBhcmFsbGVsIGludm9jYXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUlubGluZVN0ZXBzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5sYXp5SW5saW5lU3RlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmxpbmVDb3JyZWxhdGlvbklkcyA9IG5ldyBTZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5tYXAoKHMpID0+IHMuY29ycmVsYXRpb25JZClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZpZWQgcXVldWUgZGlzcGF0Y2ggZm9yIGV2ZXJ5dGhpbmcgd2UgYXJlIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lLWV4ZWN1dGluZy4gU3RlcHMgYXJlIHF1ZXVlZCB3aXRoIHN0ZXBJZCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmVyIHJ1bnMgdGhlbTsgdGhlIHdhaXQgdGltZXIgaXMgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhIGdlbmVyaWMgY29udGludWF0aW9uIHRoYXQgZmlyZXMgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGVsYXBzZXMgYW5kIGxldHMgdGhlIG5leHQgcmVwbGF5IG9ic2VydmUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGFwc2VkIHdhaXQgdmlhIHRoZSBcImNvbXBsZXRlIGVsYXBzZWQgd2FpdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGRpc3BhdGNoIGRlY2lzaW9uIHRhYmxlIChwZXIgcGVuZGluZyBzdGVwIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzaWduYXRlZCBsYXp5LWlubGluZSk6XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAtIElubGluZS1vd25lZCwgb3duZXIgPT09IHRoaXMgbWVzc2FnZSAg4oaSXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZXhlY3V0ZSBpbiBUSElTIGludm9jYXRpb24gKG93bmVkIHJlY292ZXJ5OiBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmVkZWxpdmVyeSBvZiB0aGUgb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgc3RlcCBpdCBjcmFzaGVkIG9uLCB2aWEgYSBwYXlsb2FkLWxlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3N0YXJ0ZWQgcmUtc3RhbXBlZCB3aXRoIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIG93bmVyTWVzc2FnZUlkIOKAlCBub3QgYSBiYXJlIHN0YXJ0KS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBJbmxpbmUtb3duZWQsIG93bmVyICE9PSB0aGlzIG1lc3NhZ2UgIOKGklxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVuc3VyZSBhIERFTEFZRUQgYmFja3N0b3Agd2FrZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZGVsYXlTZWNvbmRzID0gb3duZXJzaGlwIGxlYXNlIHJlbWFpbmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnN0ZWFkIG9mIGVucXVldWVpbmcgdGhlIHN0ZXAuIFRoZSBvd25pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpbnZvY2F0aW9uIGlzIChsaWtlbHkpIHN0aWxsIHJ1bm5pbmcgdGhlIGJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYW4gaW1tZWRpYXRlIHN0ZXAgbWVzc2FnZSB3b3VsZCBiYXJlLXN0YXJ0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJ1bm5pbmcgc3RlcCBhbmQgZXhlY3V0ZSBpdCBhIHNlY29uZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgKHdvcmtmbG93IzI3ODApLiBUaGUgYmFja3N0b3AgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb250aW51YXRpb24sIE5PVCBhIHN0ZXAgbWVzc2FnZTogd2hlbiBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGZpcmVzLCB0aGlzIHNhbWUgZGVjaXNpb24gdGFibGUgaGFuZGxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdoYXRldmVyIHN0YXRlIHRoZSBzdGVwIGlzIGluIGJ5IHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAodGVybWluYWwg4oaSIG5vdGhpbmcgcGVuZGluZzsgcXVldWUtb3duZWQgYWZ0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzdGVwX3JldHJ5aW5nIOKGkiBub3JtYWwga2V5ZWQgZGlzcGF0Y2g7IG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGVhZCB3aXRoIGxlYXNlIGV4cGlyZWQg4oaSIGltbWVkaWF0ZSBkaXNwYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmVzZXJ2aW5nIHN0ZXAtbGV2ZWwgZmFpbHVyZSBzZW1hbnRpY3MgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcG9pc29uIHN0ZXBzOyBsZWFzZSByZWZyZXNoZWQgYnkgb3duZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICByZWNvdmVyeSDihpIgcmUtYXJtKS4gVGhlIGJhY2tzdG9wJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBpZGVtcG90ZW5jeUtleSBpcyBzY29wZWQgdG8gdGhlIG93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEVQT0NIIChsYXRlc3Qgc3RlcF9zdGFydGVkIHRpbWVzdGFtcCksIE5PVFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGp1c3QgdGhlIGNvcnJlbGF0aW9uIElELCBhbmQgbXVzdCBuZXZlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoZSBzdGVwIG1lc3NhZ2UncyBvd24ga2V5IOKAlCBzZWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiYWNrc3RvcElkZW1wb3RlbmN5S2V5IGZvciBib3RoIGludmFyaWFudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAoZml4ZWQga2V5cyBlaXRoZXIgYWJzb3JiIHRoZSByZXRyeSBoYW5kb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgb3IgZGVkdXBlIHRoZSByZWZyZXNoZWQtbGVhc2UgcmUtYXJtIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGUgaW4tZmxpZ2h0IGJhY2tzdG9wIGl0c2VsZikuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gTm90IG93bmVkIChuZXZlciBzdGFtcGVkIC8gZWFnZXIgLyBvd25lcnNoaXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsYXBzZWQgYXQgc3RlcF9yZXRyeWluZyAvIGxlYXNlIGV4cGlyZWQgL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGtpbGwtc3dpdGNoZWQpIOKGkiBpbW1lZGlhdGUgZW5xdWV1ZSwgZXhhY3RseSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlZm9yZS4gVGhpcyBjb3ZlcnMgY3Jhc2ggcmVjb3Zlcnk6IGlmIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBoYW5kbGVyIHdyb3RlIHN0ZXBfY3JlYXRlZCBidXQgY3Jhc2hlZCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBxdWV1ZWluZywgYSBsYXRlciBoYW5kbGVyIHF1ZXVlcyBpdDsgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3RlcC1pZGVudGl0eS1zY29wZWQgaWRlbXBvdGVuY3lLZXkgZGVkdXBlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJlZHVuZGFudCBxdWV1ZXMgYWNyb3NzIGNvbmN1cnJlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdhaXQgY29udGludWF0aW9uIGlzIHdoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQcm9taXNlLnJhY2Uoc3RlcCwgc2xlZXApYCBiZWhhdmUgY29ycmVjdGx5IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubGluZSBzdGVwIGV4ZWN1dGlvbjogZXZlbiBpZiB0aGUgaW5saW5lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsb2NrcyB0aGlzIGhhbmRsZXIgZm9yIHRoZSBmdWxsIHN0ZXAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2FpdCB0aW1lciBmaXJlcyBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9uLiBJZiB0aGUgc2xlZXAgd2lucywgdGhhdCBwYXJhbGxlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbiBjb21wbGV0ZXMgdGhlIHJ1bjsgaWYgdGhlIHN0ZXAgd2lucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3YWl0IGNvbnRpbnVhdGlvbiBmaXJlcyBsYXRlciBhbmQgbm8tb3BzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGVybWluYWwgcnVuLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250aW51YXRpb24ncyBkZWxheSBpcyBjbGFtcGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBxdWV1ZSBkZWxheSAobG9uZyB3YWl0cyBjaGFpbiBhY3Jvc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIGhvcHMpIGFuZCBpdHMgaWRlbXBvdGVuY3kga2V5IGRlZHVwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLW9ic2VydmF0aW9ucyBvZiB0aGUgc2FtZSBwZW5kaW5nIHdhaXQgYWNyb3NzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIHBhc3NlcyDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW50aW1lL3dhaXQtY29udGludWF0aW9uLnRzIGZvciB0aGUgZnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXkva2V5IHNlbGVjdGlvbiByYXRpb25hbGUuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXNwYXRjaGVzOiBQcm9taXNlPHVua25vd24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZU93bmVyc2hpcCA9IGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hOb3dNcyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZFJlY292ZXJ5U3RlcHM6IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtW10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYWNrc3RvcFdha2VzQXJtZWQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFRSIGhhbmQtb2ZmLiBUaGUgbWVhc3VyZW1lbnQgbWF5IG9ubHkgZ28gdG8gYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkgQVRURU1QVCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVyYWJsZSBzdGVwLCBhbmQgdGhlIGxvb3AgYmVsb3cgaXMgd2hhdCBkZWNpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aG9zZSBhcmUg4oCUIHNvIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBjbGFzc2lmaWNhdGlvbiwgbmV2ZXIgYWhlYWQgb2YgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpbnZvY2F0aW9uIGtlZXBzIHRoZSB0cmFja2luZyB3aGVuZXZlciBpdCB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gc29tZXRoaW5nIGl0c2VsZjogYSBkZWZlcnJlZCBsYXp5LWlubGluZSBzdGVwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYW4gb3duZWQtcmVjb3Zlcnkgc3RlcCAoYSByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duaW5nIG1lc3NhZ2UgcmUtZXhlY3V0aW5nIHRoZSBzdGVwIGl0IGNyYXNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uKS4gQm90aCBsYW5kIGluIGBpbmxpbmVFeGVjdXRpb25zYCBiZWxvdyBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgaXQgdGhlcmUuIE9ubHkgd2hlbiBuZWl0aGVyIGV4aXN0cyBpcyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGVkIHRvIHRoZSBGSVJTVCBzdGVwIHRoaXMgaW52b2NhdGlvbiBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5xdWV1ZXMgYXMgYSBzdGVwIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGVwIGNvbnZlcnRlZCBpbnRvIGEgZGVsYXllZCBiYWNrc3RvcCB3YWtlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1QgYW4gYXR0ZW1wdCDigJQgdGhlIHdha2UgaXMgYSBwbGFpbiBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiwgYW5kIHdoaWNoZXZlciBpbnZvY2F0aW9uIGV2ZW50dWFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnMgdGhlIHN0ZXAgaXMgYSBkaWZmZXJlbnQgZGVsaXZlcnkg4oCUIHNvIGl0IG11c3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0YWtlIHRoZSBzYW1wbGUuIElmIGV2ZXJ5IHBlbmRpbmcgc3RlcCBiZWNvbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGJhY2tzdG9wLCBub3RoaW5nIGhlcmUgYXR0ZW1wdHMgdGhlIHN0ZXAgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1wdGlvbiBnb2VzIHVucmVwb3J0ZWQsIHdoaWNoIGlzIHRoZSBob25lc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dGNvbWUgcmF0aGVyIHRoYW4gYSB0b3RhbCBhdHRyaWJ1dGVkIHRvIHdvcmsgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgbmV2ZXIgZGlkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhdGVkIG9uIHRoZXJlIGJlaW5nIGEgbWVhc3VyZW1lbnQgdG8gcGxhY2UgYXQgYWxsOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYCYmYCBzaG9ydC1jaXJjdWl0cywgc28gYSBkZWxpdmVyeSBjYXJyeWluZyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tpbmcg4oCUIGV2ZXJ5IG5vbi1yZXN1bWUgZGVsaXZlcnksIGFuZCBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdW1lIHBhc3QgdGhlIHN0ZXAgdGhhdCBjb25zdW1lZCBpdCDigJQgbmV2ZXIgcGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBwZW5kaW5nLXN0ZXAgc2Nhbi4gVGhhdCBtYXR0ZXJzIG9uIHdpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbi1vdXRzLCB3aGVyZSBgcGVuZGluZ1N0ZXBzYCBydW5zIHRvIGh1bmRyZWRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhbmRPZmZSZXN1bWVUaW1pbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlJbmxpbmVTdGVwcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXBlbmRpbmdTdGVwcy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGVwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlubGluZUNvcnJlbGF0aW9uSWRzLmhhcyhzdGVwLmNvcnJlbGF0aW9uSWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVPd25lcnNoaXAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RlcE93bmVyc2hpcEFjdGl2ZShzdGVwKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5vd25lck1lc3NhZ2VJZCA9PT0gbWV0YWRhdGEubWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgcGVuZGluZ1N0ZXBzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVDb3JyZWxhdGlvbklkcy5oYXMoc3RlcC5jb3JyZWxhdGlvbklkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgcHVibGlzaGVkIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXInc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNpbGllbnQgZGlzcGF0Y2ggKGNyZWF0ZSArIHF1ZXVlIGluIHBhcmFsbGVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGNhcnJ5aW5nIGBzdGVwSW5wdXRgKS4gQSByZS1wdWJsaXNoIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgZGVkdXBlIG9uIHRoZSBpZGVtcG90ZW5jeSBrZXkgYW55d2F5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgd2FzdGVkIHJvdW5kLXRyaXAuIE93bmVyc2hpcCBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIHRvIHRoZXNlOiB0aGV5IHdlcmUgY3JlYXRlZCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZXBfc3RhcnRlZCBzdGFtcCBjYW4gZXhpc3QgeWV0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5xdWV1ZWRTdGVwQ29ycmVsYXRpb25JZHMuaGFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5jb3JyZWxhdGlvbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lcnNoaXBBY3RpdmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZU93bmVyc2hpcCAmJiBpc1N0ZXBPd25lcnNoaXBBY3RpdmUoc3RlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnNoaXBBY3RpdmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLm93bmVyTWVzc2FnZUlkID09PSBtZXRhZGF0YS5tZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duZWQgcmVjb3Zlcnk6IHRoaXMgZGVsaXZlcnkgSVMgdGhlIG93bmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2U7IHJlLWV4ZWN1dGUgdGhlIHN0ZXAgaW4gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb24gaW5zdGVhZCBvZiBxdWV1ZWluZyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMucHVzaChzdGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxheWVkIGJhY2tzdG9wIHdha2Ugd2hpbGUgYW5vdGhlciBpbnZvY2F0aW9uJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIGxlYXNlIGlzIGxpdmU7IGltbWVkaWF0ZSBzdGVwIGVucXVldWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIChsZWFzZSBleHBpcmVkIOKHkiByZW1haW5pbmcgMCDih5Igc2FtZSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RheSwgd2hpY2ggaXMgYWxzbyB0aGUgZGVncmFkZWQgbW9kZSBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29ybGRzIHdpdGggdW5zdGFibGUgbWVzc2FnZSBJRHMg4oCUIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhYm92ZSBuZXZlciBtYXRjaGVzIHRoZXJlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja3N0b3BEZWxheVNlY29uZHMgPSBvd25lcnNoaXBBY3RpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0ZXBMZWFzZVJlbWFpbmluZ1NlY29uZHMoc3RlcCwgZGlzcGF0Y2hOb3dNcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrc3RvcERlbGF5U2Vjb25kcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrc3RvcFdha2VzQXJtZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BlbmRpbmcgc3RlcCBpcyBpbmxpbmUtb3duZWQgYnkgYSBsaXZlIGludm9jYXRpb247IGVuc3VyaW5nIGRlbGF5ZWQgYmFja3N0b3Agd2FrZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZSByZXF1ZXVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lck1lc3NhZ2VJZDogc3RlcC5vd25lck1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3N0b3BEZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IGJhY2tzdG9wRGVsYXlTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5OiBiYWNrc3RvcElkZW1wb3RlbmN5S2V5KHN0ZXApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0ZXAgSVMgYmVpbmcgYXR0ZW1wdGVkLCBieSB0aGUgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHBpY2tzIHRoZSBtZXNzYWdlIHVwLiBDb25zdW1lIHRoZSB0cmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIOKAlCB0aGUgZmlyc3Qgc3VjaCBzdGVwIGFuZCBubyBvdGhlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcFJlc3VtZVRpbWluZyA9IGhhbmRPZmZSZXN1bWVUaW1pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VtZVRpbWluZ0Zvck1lc3NhZ2UocmVzdW1lVHJhY2tpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdW1lVGltaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZE9mZlJlc3VtZVRpbWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZVRyYWNraW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHN0ZXBSZXN1bWVUaW1pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgaG9va1Jlc3VtZVRpbWluZzogc3RlcFJlc3VtZVRpbWluZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwLWlkZW50aXR5LXNjb3BlZDogZGVkdXBlcyBhZ2FpbnN0IGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIGRpc3BhdGNoIG9mIFRISVMgc3RlcCAoY29uY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVycywgY3Jhc2gtcmVjb3ZlcnkgcmUtZGlzcGF0Y2gsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGhhbmRsZXIncyByZXNpbGllbnQgcHVibGlzaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBhYnNvcmJpbmcgYSBkaXNwYXRjaCBvZiBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIHVuZGVyIGEgcmVhc3NpZ25lZCBjb3JyZWxhdGlvbiBpZCDigJRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuc3RlcE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG5hbWVzcGFjZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dC5zZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0LmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGlzcGF0Y2ggcHVibGlzaGVzIGFuZCB0aGUgaW5saW5lIGJvZGllcyBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuIENPTkNVUlJFTlRMWTogdGhlIHN1c3BlbnNpb24gY29tbWl0IGFscmVhZHkgbWFkZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgZGlzcGF0Y2hlZCBzdGVwIGR1cmFibGUgKGFuZCwgd2hlbiB0aGUgZm9sZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5nYWdlZCwgc2V0dGxlZCB0aGUgaW5saW5lIHBhaXJzJyBjbGFpbXMpLCB3aGljaCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9ubHkgb3JkZXJpbmcgYm90aCBzaWRlcyBuZWVkIOKAlCBzbyBuZWl0aGVyIHdhaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIG90aGVyLiBUaGUgam9pbnMgYmVsb3cgKGJlZm9yZSBzdGVwIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSByZWFkLCBhbmQgb24gdGhlIG5vLWlubGluZSBlYXJseSByZXR1cm5zKSBrZWVwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmFpbHVyZSBjb250cmFjdDogYSBkaXNwYXRjaCByZWplY3Rpb24gc3RpbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxzIHRoaXMgZGVsaXZlcnksIGFmdGVyIGluLWZsaWdodCBib2RpZXMgc2V0dGxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzcGF0Y2hlc1NldHRsZWQgPSBQcm9taXNlLmFsbChkaXNwYXRjaGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgcmVqZWN0aW9uIG11c3Qgbm90IHN1cmZhY2UgYXMgYW4gdW5oYW5kbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWplY3Rpb24gd2hpbGUgdGhlIGJvZGllcyBydW4gKG9yIGlmIHNldHVwIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgYW5kIHRoZSBqb2luIHRocm93cyBmaXJzdCk7IGF3YWl0aW5nIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgcHJvbWlzZSBiZWxvdyBzdGlsbCBvYnNlcnZlcyBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXNTZXR0bGVkLmNhdGNoKCgpID0+IHt9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNldCBvZiBzdGVwcyBUSElTIGludm9jYXRpb24gZXhlY3V0ZXM6IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXJyZWQgbGF6eS1pbmxpbmUgYmF0Y2ggcGx1cyBhbnkgb3duZWQtcmVjb3ZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBzICh0aGlzIG1lc3NhZ2UncyByZWRlbGl2ZXJ5IHJlLWV4ZWN1dGluZyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIGl0IGNyYXNoZWQgb24g4oCUIG5vIGxhenlTdGVwSW5wdXQ7IHRoZSBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaHlkcmF0ZXMgZnJvbSB0aGUgc3RlcCBlbnRpdHkgbGlrZSB0aGUgYmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aCwgYW5kIHRoZSBwYXlsb2FkLWxlc3Mgc3RlcF9zdGFydGVkIHJlLXN0YW1wc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIOKAlCB1bmxpa2UgdGhlIGJhY2tncm91bmQgcGF0aCdzIHN0YXJ0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBOT1QgYmFyZTogaXQgY2FycmllcyB0aGlzIG1lc3NhZ2Unc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJNZXNzYWdlSWQsIHdoaWNoIGlzIGFsc28gd2hhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHJldHJ5IGNlaWxpbmcgY291bnRzKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUV4ZWN1dGlvbnM6IEFycmF5PHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0PzogKHR5cGVvZiBsYXp5SW5saW5lU3RlcHMpW251bWJlcl1bJ2RlaHlkcmF0ZWRJbnB1dCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjbGFpbWVkU3RhcnQ/OiBQcmVjbGFpbWVkSW5saW5lU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9PiA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubGF6eUlubGluZVN0ZXBzLm1hcCgocykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZS1jbGFpbWVkIGJ5IHRoZSBzdXNwZW5zaW9uIGJhdGNoOiB0aGUgcGFpclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgc2V0dGxlZCB0aGlzIHN0ZXAncyBjcmVhdGUgKyBjbGFpbSwgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhlY3V0b3IgcnVucyAob3Igc2tpcHMpIHRoZSBib2R5IG9mZiB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyZGljdCBpbnN0ZWFkIG9mIHNlbmRpbmcgYSBsYXp5IHN0YXJ0IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhaW0gPSBzdXNwZW5zaW9uUmVzdWx0LmlubGluZUNsYWltcy5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFpbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNsYWltZWRTdGFydDogY2xhaW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZTogcy5zdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXp5U3RlcElucHV0OiBzLmRlaHlkcmF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLm93bmVkUmVjb3ZlcnlTdGVwcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3duZXJzaGlwIHRlbGVtZXRyeSAoZGVzaWduIGRvYyBQaGFzZSA3KTogc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlcyBzbyBwcm9kdWN0aW9uIHRyYWNlcyBzaG93IHdoZW4gY3Jhc2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJ5IHJhbiBvciBhIHdha2Ugd2FzIGNvbnZlcnRlZCBpbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tzdG9wLCBhbmQgYSB3YXJuIChhbHdheXMgcHJpbnRlZCwgdW5saWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Zy9pbmZvKSBmb3Igb3duZWQgcmVjb3Zlcnkg4oCUIGl0IG1lYW5zIGEgcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9mIHRoaXMgbWVzc2FnZSBkaWVkIG1pZC1zdGVwLWJvZHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ob3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93T3duZWRSZWNvdmVyeVN0ZXBzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVkUmVjb3ZlcnlTdGVwcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGJhY2tzdG9wV2FrZXNBcm1lZCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93QmFja3N0b3BXYWtlc0FybWVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzdG9wV2FrZXNBcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRSZWNvdmVyeVN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZS1leGVjdXRpbmcgaW5saW5lIHN0ZXBzIG93bmVkIGJ5IHRoaXMgcXVldWUgbWVzc2FnZSDigJQgYSBwcmV2aW91cyBkZWxpdmVyeSBjcmFzaGVkIG1pZC1ib2R5IGFuZCB0aGlzIHJlZGVsaXZlcnkgaXMgcmVjb3ZlcmluZyB0aGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZHM6IG93bmVkUmVjb3ZlcnlTdGVwcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzKSA9PiBzLmNvcnJlbGF0aW9uSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGV4ZWN1dGUgaW5saW5lIOKAlCBldmVyeXRoaW5nIGhhcyBiZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgKG9yIG5vIHdvcmsgbmVlZHMgc2NoZWR1bGluZykuIEV4aXQgYW5kIGxldFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHF1ZXVlIGRyaXZlIHN1YnNlcXVlbnQgcmVwbGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxpbmVFeGVjdXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHJ1bnMgY29uY3VycmVudGx5IHdpdGggdGhlIGRpc3BhdGNoZXMgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwYXRoIOKAlCBqb2luIHRoZW0gKGFuZCB0aGUgZm9sZCdzIGRlZmVycmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNodW5rIGNvbW1pdHMvcHVibGlzaGVzKSBoZXJlIHNvIGEgZmFpbHVyZSBmYWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVsaXZlcnkgZXhhY3RseSBhcyBpdCBhbHdheXMgaGFzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlc1NldHRsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5kZWZlcnJlZEJhdGNoV29yayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgYGhvb2suZ2V0Q29uZmxpY3QoKWAgYXdhaXRlciBuZWVkcyBhbiBpbW1lZGlhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmUtaW52b2NhdGlvbjogdGhlIHJlcGxheSBjb25zdW1lcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdC1jb21taXR0ZWQgaG9va19jcmVhdGVkIGFuZCByZXNvbHZlcyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRlci4gV2l0aG91dCBpdCAobm8gaW5saW5lIHN0ZXAsIGFsbCB3b3JrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlZCBvciBub25lIHBlbmRpbmcpIHRoZSBydW4gd291bGQgc2l0IGlkbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW50aWwgc29tZSB1bnJlbGF0ZWQgbWVzc2FnZSB3b2tlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VzcGVuc2lvblJlc3VsdC5oYXNBd2FpdGVkSG9va0NyZWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlaW52b2tlKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlbiBob29rcy93YWl0cyBhcmUgY29uc3VsdGVkIGJ5IGFsbCB0aHJlZSBnYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3c7IHJlc29sdmUgdGhlIG1lbW9pemVkIHNjYW4gb25jZSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3Blbkhvb2tXYWl0U3RhdGUgPSBvcGVuSG9va1dhaXQudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElubGluZS1kZWx0YSBmYXN0IHBhdGggZ2F0ZS4gV2UgcmVxdWVzdCB0aGUgZGVsdGEg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgb24gdGhlIG5leHQgaXRlcmF0aW9uIGNvbnN1bWUgaXQgaW4gcGxhY2Ugb2YgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMubGlzdCDigJQgb25seSB3aGVuIEFMTCBob2xkOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdlIGhhdmUgYSByZWFsIHByaW9yIGN1cnNvciB0byBkaWZmIGFnYWluc3QgKGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFdvcmxkIG1heSByZXR1cm4gbm9uZSBvbiB0aGUgaW5pdGlhbCBsb2FkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFRoaXMgaXMgdGhlIGNsZWFuIHNpbmdsZS1zdGVwIHNlcXVlbnRpYWwgY2FzZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoaXMgc3VzcGVuc2lvbiBwcm9kdWNlZCBleGFjdGx5IG9uZSBzdGVwIGFuZCBub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd2FpdHMgKGBlcnIue3N0ZXAsd2FpdH1Db3VudGApLCB0aGF0IG9uZSBzdGVwIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB0aGUgbG9uZSBwZW5kaW5nIHN0ZXAgKGBwZW5kaW5nU3RlcHMubGVuZ3RoID09PSAxYClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFuZCB0aGUgbG9uZSBpbmxpbmUgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGBsYXp5SW5saW5lU3RlcHMubGVuZ3RoID09PSAxYCDigJQgbm8gcGFyYWxsZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNpYmxpbmdzIHF1ZXVlZCB0byBiYWNrZ3JvdW5kIGhhbmRsZXJzLCBhbmQgbm8gb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGlubGluZSBzdGVwIHdyaXRpbmcgaXRzIG93biBldmVudHMgb3V0IG9mIGJhbmQpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gTm8gcGVuZGluZyB3YWl0IHRpbWVyIGZyb20gVEhJUyBzdXNwZW5zaW9uLCBhbmQgbm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIG9wZW4gd2FpdCBpbiB0aGUgY3VtdWxhdGl2ZSBsb2cuIEEgYHdhaXRfY29tcGxldGVkYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgYSByZXNvbHV0aW9uIHRoZSByZXBsYXkgaXMgd2FpdGluZyBvbiByYXRoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoYW4gYW4gZXZlbnQgaXQgY2FuIG9ic2VydmUgb25lIGl0ZXJhdGlvbiBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc28gY29uc3VtaW5nIGEgZGVsdGEgdGhhdCBwcmVkYXRlcyBpdCB3b3VsZCBzZXR0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHRoZSBzbGVlcCBmcm9tIGEgdmlldyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb21wbGV0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gQW4gb3BlbiAob3IgdGhpcy1zdXNwZW5zaW9uLWNyZWF0ZWQpIGhvb2sgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZpbmUsIGFuZCB0aGF0IGlzIHRoZSBnYXRlIHRoaXMgdXNlZCB0byBjYXJyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIFRoZSBkZWx0YSBzbmFwc2hvdHMgdGhlIGxvZyBhdCB0aGUgc3RlcF9jb21wbGV0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdyaXRlIGJ1dCBpcyBjb25zdW1lZCBvbiB0aGUgbmV4dCByZXBsYXksIHNvIGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBvdXQtb2YtYmFuZCBgaG9va19yZWNlaXZlZGAgbGFuZGluZyBpbiB0aGF0IHdpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXMgYWJzZW50IGZyb20gdGhlIGRlbHRhIGFuZCBvYnNlcnZlZCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGl0ZXJhdGlvbiBsYXRlciB0aGFuIGEgcmVhbCBmZXRjaCB3b3VsZCBvYnNlcnZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBpdC4gVGhhdCBzdGFsZW5lc3MgaXMgcXVhbGl0YXRpdmVseSB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmVhZC10by13cml0ZSByYWNlIHRoZSBmZXRjaCBwYXRoIGFscmVhZHkgaGFzIChhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZXZlbnQgY2FuIGxhbmQgcmlnaHQgYWZ0ZXIgYGV2ZW50cy5saXN0YCByZXR1cm5zXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBhbmQgYmVmb3JlIHRoZSBzdXNwZW5zaW9uJ3Mgd3JpdGVzKSwgYW5kIGl0IGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBib3VuZGVkIGJ5IHRoZSBzYW1lIHRoaW5nOiB3aGF0IGEgc3RhbGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBob2xkcyBpcyBhICpwcmVmaXgqIG9mIHRoZSBsb2csIG5ldmVyIGEgaG9sZSBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgaXQsIGFuZCByZXBsYXlpbmcgYSBwcmVmaXggdHdpY2UgcmVhY2hlcyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZGVjaXNpb25zLiBJdHMgbmV4dCB3cml0ZSBpcyBhbGxvY2F0ZWQgYWJvdmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHdoYXRldmVyIGl0IG1pc3NlZCBhbmQgY29tZXMgYmFjayBjYXJyeWluZyBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgKGByZXBvcnRTa2lwcGVkU2xvdHNgIG9uIHRoZSBsb2NhbCB3b3JsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBjb21taXQtdGltZSBhbGxvY2F0aW9uIG9uIHRoZSBWZXJjZWwgb25lKSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByZXBsYXkgY29ycmVjdHMgaXRzZWxmIG9uIHRoZSB3cml0ZSByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb24gYSByZWFkLiBBIFdvcmxkIE1BWSBpbnN0ZWFkIHJlZnVzZSB0aGUgd3JpdGUgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHN0YWxlICg0MTIpLCB3aGljaCB0aGUgcnVudGltZSBoYW5kbGVzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB3YXk7IG5vdGhpbmcgcmVxdWlyZXMgaXQgdG8uIEhvb2tzIGNyZWF0ZWQgYnkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc3VzcGVuc2lvbiBhcmUgaW5zaWRlIHRoZSBkZWx0YSAodGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGBob29rX2NyZWF0ZWRgIGxhbmRzIGJlZm9yZSB0aGUgc3RlcC10ZXJtaW5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgd3JpdGUpLCBzbyBvbmx5IHRoZWlyIGBob29rX3JlY2VpdmVkYCByZXNwb25zZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGFyZSBzdWJqZWN0IHRvIHRoZSBzYW1lIHdpbmRvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIFdpdGggbm8gaG9vayBvciB3YWl0IG9wZW4gYXQgYWxsLCB0aGUgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3V0LW9mLWJhbmQgd3JpdGVyIGlzIGNhbmNlbGxhdGlvbiwgd2hpY2ggaXMgc2FmZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdG8gb2JzZXJ2ZSBvbmUgaXRlcmF0aW9uIGxhdGUuIFNlZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgb3Blbkhvb2tBbmRXYWl0U3RhdGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHN0ZXAgcnVucyBpbmxpbmUsIGVhY2ggd3JpdGVzIGl0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duIGV2ZW50cyBhbmQgdGhlIHBlci13cml0ZSBkZWx0YSB3b3VsZCBiZSBwYXJ0aWFsLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhIGlzIG5vdCByZXF1ZXN0ZWQgKHRoZSBnYXRlIGJlbG93IGlzIGZhbHNlIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGktc3RlcCkgYW5kIHRoZSBuZXh0IGl0ZXJhdGlvbiBkb2VzIGEgbm9ybWFsIGZldGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdElubGluZURlbHRhID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50TG9nLmN1cnNvciA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnN0ZXBDb3VudCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIud2FpdENvdW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGVwcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUlubGluZVN0ZXBzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZFJlY292ZXJ5U3RlcHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuSG9va1dhaXRTdGF0ZS5vcGVuV2FpdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhbGUtc2Vuc2l0aXZlIGJhdGNoOiBhIGhvb2sgaXMgb3BlbiBpbiB0aGUgcnVuIChvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNyZWF0ZWQgYnkgdGhpcyBzdXNwZW5zaW9uLCBzbyBpdHMgaG9va19yZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIGxhbmQgYW55IG1vbWVudCkg4oCUIGFuIG91dC1vZi1iYW5kIGV2ZW50IGNhbiBtYWtlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdmlldyB0aGlzIGJhdGNoIHdhcyBzY2hlZHVsZWQgZnJvbSBzdGFsZSwgd2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHdoZW4gc2V2ZXJhbCBpbnZvY2F0aW9ucyByYWNlIGZvciBvbmUgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbS4gT3B0aW1pc3RpYyBzdGFydCBiZWdpbnMgdGhlIGJvZHkgYmVmb3JlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhaW0gc2V0dGxlcywgc28gdGhlIHdyaXRlciB0aGF0IExPU0VTIHRoZSBjbGFpbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGBFbnRpdHlDb25mbGljdEVycm9yYCDihpIgYHNraXBwZWRgKSBoYXMgYWxyZWFkeSBydW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZXIgY29kZSBpdCBkb2VzIG5vdCBvd24uIFN1cHByZXNzIGl0IGZvciB0aGVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2hlcywgc28gdGhlIGJvZHkgcnVucyBvbmx5IGFmdGVyIHRoZSBjbGFpbSBjYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHdvbi4gQ29zdHMgb25lIGNsYWltIHJvdW5kLXRyaXAgcGVyIHN0ZXAgd2hpbGUgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG9vayBpcyBvcGVuLCBhbmQgYnV5cyB0aGUgc2FtZSB0aGluZyBvbiBldmVyeSBXb3JsZDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgc3RlcCBib2R5IGV4ZWN1dGVzIG9uY2UgcGVyIGNsYWltLCBub3Qgb25jZSBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhY2VyLiAoQSBXb3JsZCB0aGF0IHJlZnVzZXMgdGhlIGNsYWltIGFzIHN0YWxlICg0MTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRzIHRoZSBzYW1lIHByb3RlY3Rpb24gdGhyb3VnaCB0aGUgc2FtZSBhd2FpdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbmUgb2YgdGhlIHNoaXBwZWQgb25lcyBkb2VzIHRoYXQgZm9yIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNsb3QtbnVtYmVyZWQgcnVuLilcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1cHByZXNzT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2sgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmhvb2tDb3VudCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC5oYXNIb29rRXZlbnRzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibyBtb2RlIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGFydCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmF0Y2gg4oCUIGJ1dCBvbmx5IHdoaWxlIHRoZSBydW4gaXMgc3RpbGwgXCJjbGVhblwiIChhIHB1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXAgc3VzcGVuc2lvbikuIFRoZSBtb21lbnQgYSBob29rIG9yIHdhaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQsIGxhdGVyIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBiZWNvbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlLCBzbyB0aGUgc2luZ2xlLWhhbmRsZXIgZ3VhcmFudGVlIHRoYXQgbWFrZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlZCBvcHRpbWlzdGljIHN0YXJ0IHNhZmUgbm8gbG9uZ2VyIGhvbGRzIOKAlCB0dXJib1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhpdHMgYW5kIHRoZSBzdGVwcyB0YWtlIHRoZSBub3JtYWwgKGVudi1nYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0LXRoZW4tcnVuIHBhdGguIFRoZSBob29rLWNvbmZsaWN0IGNhc2UgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgZWFybHkgYWJvdmUsIHRoZSBhdHRyIGNhc2UgY29udGludWVkIGludG8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlc2ggcmVwbGF5IChzbyBhIGJhdGNoLXNjaGVkdWxpbmcgc3VzcGVuc2lvbiBuZXZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FycmllcyBhdHRyIGV2ZW50cyksIGFuZCB0aGUgYXdhaXRlZC1ob29rIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHRpZWQgbGF6eUlubGluZVN0ZXBzOyB0aGUgY2hlY2tzIGJlbG93IGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmZW5zaXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgc3VzcGVuc2lvblJlc3VsdC4qYCBmbGFncyBvbmx5IHJlZmxlY3Qgd2hhdCBUSElTXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBjcmVhdGVkLCBzbyB0aGV5IGRvIG5vdCBjYXRjaCBhIGhvb2svd2FpdCBvcGVuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGFuIGVhcmxpZXIgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIGRlbGl2ZXJ5IChlLmcuIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcmUtYW5kLWZvcmdldCBgY3JlYXRlSG9vayguLi4pYCB0aGF0IGRvZXNuJ3QgYmxvY2sgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdywgbGV0dGluZyB0aGUgcmVwbGF5IGxvb3AgY29udGludWUgdG8gbGF0ZXIgcHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBzdXNwZW5zaW9ucykuIE9uY2UgYW55IGhvb2sgb3Igd2FpdCBpcyBvcGVuIGluIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VtdWxhdGl2ZSBsb2csIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyBhcmUgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLCBzbyB0dXJibyBtdXN0IGxhdGNoIG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWFuZW50bHkg4oCUIGNoZWNrZWQgaGVyZSB2aWEgYG9wZW5Ib29rQW5kV2FpdFN0YXRlYFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUgY3VtdWxhdGl2ZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogYFdPUktGTE9XX1NFUVVFTlRJQUxfUkVQTEFZUz0xYCAocGVyLXJ1biBmbG93XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3BpY3MgY29uc3VtZWQgd2l0aCBgbWF4Q29uY3VycmVuY3k6IDFgKSB3b3VsZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbmNpcGxlIHdhaXZlIHRoaXMgbGF0Y2gg4oCUIHNlcmlhbGl6ZWQgb3JjaGVzdHJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZvY2F0aW9ucyByZXN0b3JlIHRoZSBzaW5nbGUtaGFuZGxlciBndWFyYW50ZWUgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgZGVsaXZlcnkuIFRoZSB3YWl2ZXIgaXMgaW50ZW50aW9uYWxseSBOT1RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2VuOiB0aGUgZW52IHZhciBpcyBhIHJ1bnRpbWUtcHJvY2VzcyBzZXR0aW5nIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBwcm92ZSB0aGUgQlVJTFQgZmxvdyB0cmlnZ2VyIGFjdHVhbGx5IGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBtYXhDb25jdXJyZW5jeTogMWAgKGl0IG11c3QgYmUgc2V0IGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbywgYW5kIHNvbWUgaW50ZWdyYXRpb25zIHdyaXRlIHRoZWlyIG93biB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWcpLCBhbmQgYGNhcGFiaWxpdGllcy5tYXhDb25jdXJyZW5jeWAgb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjbGFyZXMgcXVldWUgc3VwcG9ydCwgbm90IGRlcGxveWVkIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnRpbCB0aGUgYnVpbGQgZW1pdHMgYSB2ZXJpZmlhYmxlIHNpZ25hbCB0aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwbG95ZWQgdHJpZ2dlciBpcyBzZXJpYWxpemVkLCB0aGUgY29uc2VydmF0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRjaCBzdGF5cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmNlT3B0aW1pc3RpY1N0YXJ0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXR0cmlidXRlRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0LndhaXRUaW1lb3V0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFzdXNwZW5zaW9uUmVzdWx0Lmhhc0hvb2tFdmVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIXN1c3BlbnNpb25SZXN1bHQuaGFzQXdhaXRlZEhvb2tDcmVhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhb3Blbkhvb2tXYWl0U3RhdGUub3Blbkhvb2sgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIW9wZW5Ib29rV2FpdFN0YXRlLm9wZW5XYWl0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBpbmxpbmUgc3RlcHMgaW4gcGFyYWxsZWwuIFRoZSByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZGdldCBpcyBwYXVzZWQgZm9yIHRoZSB3aG9sZSBiYXRjaCDigJQgc3RlcCBkdXJhdGlvbiBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm91bmRlZCBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvbiBtYXhEdXJhdGlvbiwgbm90IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHRpbWVvdXQg4oCUIHNvIHRoZSBidWRnZXQgY2hlY2sgYXQgdGhlIHRvcCBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5leHQgbG9vcCBpdGVyYXRpb24gZG9lc24ndCBjaGFyZ2UgdGhlIHN0ZXAgYm9kaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGF0ZW5jeSB0ZWxlbWV0cnk6IGRlY2lkZSB3aGV0aGVyIHRoaXMgYmF0Y2gncyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCBxdWFsaWZpZXMgZm9yIFRURlMvU1RTTyBtZWFzdXJlbWVudC4gT25seSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhdGNoJ3MgZmlyc3Qgc3RlcCBjYXJyaWVzIHRoZSB0cmFja2luZyBzbyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbGxlbCBiYXRjaCBlbWl0cyBvbmUgc2FtcGxlIHBlciBzY2hlZHVsaW5nIGdhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBvbmUgcGVyIHNpYmxpbmcuIFR1cmJvJ3Mgc3ludGhlc2l6ZWQgcnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBoYXMgYSBsb2NhbC1jbG9jayBjcmVhdGVkQXQsIHNvIHVuZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0dXJibyBvbmx5IHRoZSBydW4taWQgVUxJRCB0aW1lc3RhbXAgaXMgdHJ1c3RlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lUcmFja2luZyA9IGNvbXB1dGVTdGVwTGF0ZW5jeVRyYWNraW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBldmVudExvZy5ldmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25TdGFydGVkQ2xlYW46XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvblN0YXJ0ZWRDbGVhbiA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ3JlYXRlZEF0TXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRDcmVhdGVkQXQocnVuSWQpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR1cmJvID8gdW5kZWZpbmVkIDogK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXJ0ZWRSZWNlaXZlZEF0TXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheU1zOiByZXBsYXlEdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVTdGVwQmxvY2tpbmdNcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3RlcEJsb2NraW5nQmVmb3JlQXR0ck1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN1c3BlbnNpb24ncyBvd24gaG9vay93YWl0IHdyaXRlcyBhcmUgbm90IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2FkZWQgZXZlbnQgbG9nIHlldCwgc28gcmVwb3J0IHRoZW0gZXhwbGljaXRseS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvbkhhc1dhaXRzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci53YWl0Q291bnQgPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuc2lvblJlc3VsdC53YWl0VGltZW91dCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5zaW9uQ3JlYXRlZEhvb2tzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5ob29rQ291bnQgPiAwIHx8IHN1c3BlbnNpb25SZXN1bHQuaGFzSG9va0V2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYm8sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2xvdCBzbmFwc2hvdCBmb3IgdGhlIGlubGluZSBzdGVwX3N0YXJ0ZWQgY2xhaW1zOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhenkgY2xhaW0gaXMgdGhlIGZpcnN0IGR1cmFibGUgd3JpdGUgb2YgYSBob3QtcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlcCAoaXRzIHN0ZXBfY3JlYXRlZCBpcyBkZWZlcnJlZCksIHNvIHdpdGhvdXQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgaXQgd291bGQgbmFtZSBubyBwb3NpdGlvbiBhdCBhbGwgYW5kIGEgc3RhbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBjb3VsZCBjbGFpbSDigJQgYW5kIGNvbW1pdCDigJQgYSBzdGVwIHNjaGVkdWxlZCBvZmZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgdmlldyB0aGF0IG1pc3NlcyBhbiBldmVudCBpdCBuZXZlciBsb2FkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFrZW4gaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIGV4ZWN1dG9yIGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHZpZXcgdGhlIHNjaGVkdWxpbmcgZGVjaXNpb24gd2FzIG1hZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFnYWluc3QuIFRoZSBleGVjdXRvciBhZHZhbmNlcyBmcm9tIGl0IGFzIGl0cyBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlcyBsYW5kOyBzZWUgYHNsb3RTbmFwc2hvdGAgaW4gc3RlcC1leGVjdXRvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlZFNsb3RTbmFwc2hvdCA9IHNsb3RTbmFwc2hvdFBhcmFtcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhdGNoZWQgZmFuLW91dCdzIG93biBldmVudHMgYXJlIG5vdCBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBsb2cgeWV0ICh0aGUgbmV4dCBpdGVyYXRpb24gcmVsb2FkcyksIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpbnZvY2F0aW9uIHdyb3RlIHRoZW0g4oCUIGZvbGQgdGhlIGJhdGNoJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgaW4sIG9yIGV2ZXJ5IGlubGluZSB0ZXJtaW5hbCB3cml0ZSB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSBhIHByZS1iYXRjaCBwb3NpdGlvbiBhbmQgYmUgYW5zd2VyZWQgd2l0aCBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcGVkLXNsb3QgcmVwb3J0IGVjaG9pbmcgdGhlIGV2ZW50cyB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXNwZW5zaW9uIGp1c3QgY29tbWl0dGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hTbG90Q2VpbGluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuYmF0Y2hDb21taXR0ZWRTbG90Q2VpbGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubGluZUNsYWltU25hcHNob3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaFNsb3RDZWlsaW5nICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2hTbG90Q2VpbGluZyA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRlZFNsb3RTbmFwc2hvdC5ldmVudENvdW50ID8/IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7IGV2ZW50Q291bnQ6IGJhdGNoU2xvdENlaWxpbmcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbG9hZGVkU2xvdFNuYXBzaG90O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUVFI6IGNvbnN1bWVkIGJ5IHRoaXMgYmF0Y2guIEV2ZXJ5IHN0ZXAgaXMgaGFuZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgU0FNRSB0cmFja2luZyBvYmplY3QgYW5kIGl0cyBvbmUtc2hvdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHJlcG9ydGVkYCBsYXRjaCBwaWNrcyB0aGUgc2luZ2xlIHN0ZXAgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgcmVhY2hlcyB1c2VyIGNvZGUg4oCUIHNvIHRoZSBzYW1wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cnZpdmVzIHRoZSBiYXRjaCdzIGZpcnN0IHN0ZXAgbG9zaW5nIGl0cyBhdG9taWNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZS1jbGFpbSB0byBhIGNvbmN1cnJlbnQgaW52b2NhdGlvbiB3aGlsZSBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWJsaW5nIHJ1bnMsIHdpdGhvdXQgYSBwYXJhbGxlbCBiYXRjaCByZXBvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgcGVyIHNpYmxpbmcuIENsZWFyZWQgaGVyZSBzbyBhIGxhdGVyIGxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbidzIHN0ZXBzIOKAlCBhbmQgYW55IGluLXByb2Nlc3MgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0IOKAlCBjYW5ub3QgcmVwb3J0IHRoZSBzYW1lIHJlc3VtcHRpb24gYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaFJlc3VtZVRyYWNraW5nID0gcmVzdW1lVHJhY2tpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bWVUcmFja2luZyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5QnVkZ2V0LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcFJlc3VsdHM6IEF3YWl0ZWQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGU8dHlwZW9mIGV4ZWN1dGVTdGVwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPltdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RlcEV4ZWN1dGlvblByb21pc2VzID0gaW5saW5lRXhlY3V0aW9ucy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChzLCBzdGVwSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnRMb2cudHlwZSA9PT0gJ3JlYWR5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZVN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93RGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFJ1bklkOiByb290UnVuSWRGcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcElkOiBzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgbnVtYmVyID0gcHJpb3Igc3RlcF9zdGFydGVkIGNvdW50ICsgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhpcyBleGVjdXRpb24ncyBzdGFydCksIGNvdW50aW5nIG9ubHkgVEhJU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlJ3Mgb3duIHN0YXJ0czogdGhlIG93bmVkLXJlY292ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNlaWxpbmcgYm91bmRzIGhvdyBtYW55IHRpbWVzIHRoaXMgb3duaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmUtcnVucyBhIHN0ZXAgaXQgY3Jhc2hlZC90aW1lZCBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24sIGFuZCBlYWNoIG9mIHRob3NlIChyZSlzdGFydHMgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGFkYXRhLm1lc3NhZ2VJZC4gU3RhcnRzIHdyaXR0ZW4gYnkgcmFjaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludm9jYXRpb25zIChzdGFsZS93YWtlIHJlcGxheXMsIGEgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGRpc3BhdGNoZWQgb2ZmIGEgbG9zdCBjcmVhdGUtY2xhaW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJ5IG90aGVyIElEcyDigJQgb3Igbm9uZSDigJQgYW5kIG11c3Qgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50LCBvciB0aGUgY2VpbGluZyBmYWxzZWx5IGV4aGF1c3RzIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhbHRoeSBzdGVwIChzZWUgY291bnRTdGVwU3RhcnRlZEV2ZW50cykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbGF6eSBzdGVwIGlzIGJyYW5kLW5ldyBieSBjb25zdHJ1Y3Rpb24gKGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudGVycyB0aGUgYmF0Y2ggb25seSB3aGVuIGl0IGhhcyBub1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwX2NyZWF0ZWQgeWV0KSwgc28gaXQgaGFzIHplcm8gcHJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRzIGFuZCBpcyBhbHdheXMgYXR0ZW1wdCAxIOKAlCBza2lwIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgc2NhbiBlbnRpcmVseS4gT25seSBhbiBvd25lZC1yZWNvdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1ydW4gY2FuIGhhdmUgcHJpb3Igc3RhcnRzLCBhbmQgdGhhdCBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVuY29tbW9uLCBzbyByZXNlcnZlIHRoZSBPKG4pIHNjYW4gZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHdhbGtpbmcgdGhlIGdyb3dpbmcgbG9nIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBpbmxpbmUgc3RlcCAod2hpY2ggd291bGQgYmUgTyhuwrIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjcm9zcyBhIGxvbmcgc2VxdWVudGlhbCB3b3JrZmxvdykuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0YXRpdmVBdHRlbXB0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGF6eVN0ZXBJbnB1dCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wcmVjbGFpbWVkU3RhcnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvdW50U3RlcFN0YXJ0ZWRFdmVudHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRMb2cuZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb3duZWRCeScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXp5IGlubGluZSBzdGFydDogc2VuZCB0aGUgZGVmZXJyZWQgc3RlcCdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IG9uIHN0ZXBfc3RhcnRlZCBzbyB0aGUgd29ybGQgY3JlYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RlcCBvbiB0aGUgZmx5LiBBYnNlbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG93bmVkLXJlY292ZXJ5IHN0ZXBzLCB3aG9zZSBpbnB1dCBoeWRyYXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBleGlzdGluZyBzdGVwIGVudGl0eSwgYW5kIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmUtY2xhaW1lZCBzdGVwcywgd2hvc2UgcGFpciBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcnJpZWQgaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhenlTdGVwSW5wdXQ6IHMubGF6eVN0ZXBJbnB1dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlLWNsYWltZWQgaW5saW5lIHN0YXJ0OiB0aGUgc3VzcGVuc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYXRjaCBzZXR0bGVkIHRoaXMgc3RlcCdzIGNyZWF0ZSArIGNsYWltO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhlY3V0b3IgcnVucyAob3Igc2tpcHMpIHRoZSBib2R5IG9mZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHZlcmRpY3Qgd2l0aCBubyBzdGFydCB3cml0ZSBvZiBpdHMgb3duLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjbGFpbWVkU3RhcnQ6IHMucHJlY2xhaW1lZFN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmxpbmUgb3duZXJzaGlwOiBzdGFtcCAob3IgcmUtc3RhbXApIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52b2NhdGlvbidzIHF1ZXVlIG1lc3NhZ2UgSUQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCwgc28gd2FrZSByZXBsYXlzIHNlZSB0aGUgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBpbiBmbGlnaHQgaGVyZSBhbmQgc3VwcHJlc3MgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSByZXF1ZXVlICh3b3JrZmxvdyMyNzgwKS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXJNZXNzYWdlSWQ6IG1ldGFkYXRhLm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHVyYm86IGZvcmNlIG9wdGltaXN0aWMgc3RhcnQgYW5kIGhvbGQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhenkgc3RlcF9zdGFydGVkIHVudGlsIHRoZSBiYWNrZ3JvdW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQgbGFuZHMgKHRoZSBib2R5IHN0aWxsIHJ1bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkpLiBCb3RoIGFyZSB1bmRlZmluZWQvZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0c2lkZSB0dXJiby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkLWVuZm9yY2VkIGJhdGNoZXMgd2l0aCBhbiBvcGVuIGhvb2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdGhlIGNsYWltIGJlZm9yZSBydW5uaW5nIHRoZSBib2R5LCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIDQxMi1mZW5jZWQgc3RlcCBuZXZlciBleGVjdXRlcyB1c2VyIGNvZGUg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBzdXBwcmVzc09wdGltaXN0aWNTdGFydCBhYm92ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NPcHRpbWlzdGljU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlYWR5QmFycmllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdFNuYXBzaG90OiBpbmxpbmVDbGFpbVNuYXBzaG90LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oc3RlcEluZGV4ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLmxhenlTdGVwSW5wdXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJlY2xhaW1lZFN0YXJ0ICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3lUcmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyBsYXRlbmN5VHJhY2tpbmcgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oYmF0Y2hSZXN1bWVUcmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8geyByZXN1bWVUcmFja2luZzogYmF0Y2hSZXN1bWVUcmFja2luZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihyZXF1ZXN0SW5saW5lRGVsdGEgJiYgZXZlbnRMb2cuY3Vyc29yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZURlbHRhU2luY2VDdXJzb3I6IGV2ZW50TG9nLmN1cnNvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5UmVjb3ZlcnlSZXBvcnRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YXJpYW50IGJvb2trZWVwaW5nOiB0aGlzIGludm9jYXRpb24gb3duc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGJvZGllcyB1bnRpbCB0aGV5IHNldHRsZSDigJQgc2VlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0Tm9JbkZsaWdodE93bmVkU3RlcHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGlnaHRPd25lZFN0ZXBzLmFkZChzLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExhenkgYW5kIHByZS1jbGFpbWVkIHN0ZXBzIGFyZSBicmFuZC1uZXdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlaXIgY3JlYXRlLWNsYWltIGlzIHRoZSBleGFjdGx5LW9uY2UgZ2F0ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGFuIG93bmVkLXJlY292ZXJ5IHN0ZXAgYWxyZWFkeSBleGlzdHMgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRzIGRlbGF5ZWQgYmFja3N0b3AgbWVzc2FnZSBtYXkgZmlyZSBtaWQtYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgc2FtZSBwcm9jZXNzIOKAlCByb3V0ZSB0aG9zZSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGluLXByb2Nlc3Mgc2luZ2xlLWZsaWdodC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhenlTdGVwSW5wdXQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wcmVjbGFpbWVkU3RhcnQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJ1blN0ZXBTaW5nbGVGbGlnaHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBydW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0ZWQuZmluYWxseSgoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGlnaHRPd25lZFN0ZXBzLmRlbGV0ZShzLmNvcnJlbGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBqb2lucyBiZWxvdyBzaXQgQkVUV0VFTiB0aGVzZSBwcm9taXNlcycgY3JlYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgYFByb21pc2UuYWxsYCB0aGF0IHJlYWRzIHRoZW0sIHNvIGEgYm9keSB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWplY3RzIHdoaWxlIGEgcHVibGlzaCBvciBhIHRyYWlsaW5nIGNodW5rIGNvbW1pdCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgaW4gZmxpZ2h0IHdvdWxkIGhhdmUgbm8gaGFuZGxlciBhdHRhY2hlZCBhdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pY3JvdGFzayBjaGVja3BvaW50IOKAlCBhbiBgdW5oYW5kbGVkUmVqZWN0aW9uYCwgZmF0YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVyIE5vZGUncyBkZWZhdWx0IGAtLXVuaGFuZGxlZC1yZWplY3Rpb25zPXRocm93YC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgNDEyIHN0YWxlLWNsYWltIHJlamVjdGlvbiByYWNlcyBleGFjdGx5IHRoYXQgd2luZG93LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIG5vdzsgZXZlcnkgcmVqZWN0aW9uIGlzIHN0aWxsIG9ic2VydmVkIGJ5IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXRzIGJlbG93LCB3aGljaCBhcmUgd2hhdCBkZWNpZGUgdGhlIG91dGNvbWUuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb21pc2Ugb2Ygc3RlcEV4ZWN1dGlvblByb21pc2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSm9pbiB0aGUgZGlzcGF0Y2ggcHVibGlzaGVzIGxhdW5jaGVkIGFib3ZlIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm9sZCdzIGRlZmVycmVkIGJhdGNoIHdvcmsgKHRyYWlsaW5nIGNodW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdHMgKyBwZXItY2h1bmsgc3RlcC1tZXNzYWdlIHB1Ymxpc2hlcykg4oCUXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBib2RpZXMgYXJlIGFscmVhZHkgcnVubmluZyBpbiBwYXJhbGxlbCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGgsIGFuZCB0aGlzIGludm9jYXRpb24gbXVzdCBub3QgYWNrIGJlZm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBjcmVhdGUgYW5kIHB1Ymxpc2ggaXMgZHVyYWJsZS4gQSBmYWlsdXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIGl0cyBvbGQgY29udHJhY3QgKGZhaWwgdGhpcyBkZWxpdmVyeSBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWVzc2FnZSByZWRlbGl2ZXJzKSwgYnV0IHRoZSBpbi1mbGlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9kaWVzIG11c3Qgc2V0dGxlIGZpcnN0OiBhbiBvd25lZCBib2R5IGxlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVubmluZyBwYXN0IHRoaXMgaGFuZGxlciB3b3VsZCByYWNlIGl0cyBvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVkZWxpdmVyeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVzU2V0dGxlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlbnNpb25SZXN1bHQuZGVmZXJyZWRCYXRjaFdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGRpc3BhdGNoRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHN0ZXBFeGVjdXRpb25Qcm9taXNlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZGlzcGF0Y2hFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uUHJvbWlzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFsZSAoNDEyKSByZWplY3Rpb24gb2YgYW4gaW5saW5lIHN0ZXBfc3RhcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFpbTogdGhlIGxvYWRlZCB2aWV3IHRoaXMgYmF0Y2ggd2FzIHNjaGVkdWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGlzIG1pc3NpbmcgYW4gZXZlbnQgdGhlIGJhY2tlbmQgYWxyZWFkeSBoYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBjbGFpbSB3YXMgZmVuY2VkIGJ5IHRoZSBndWFyZCBhbmQgbm8gc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgd2VyZSB3cml0dGVuLiBBYmFuZG9uIHRoZSBiYXRjaCDigJQgYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGltaXN0aWMgYm9keSByZXN1bHQgaXMgZGlzY2FyZGVkIGJ5IGV4ZWN1dGVTdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25jaWxpYXRpb24g4oCUIGFuZCByZXN0YXJ0IHRoZSByZXBsYXkgc28gaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2ZXMgdGhlIG1pc3NpbmcgZXZlbnQuIFdhaXQgZm9yIHRoZSBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbnMgdG8gc2V0dGxlIGZpcnN0IHNvIG5vIG93bmVkIGJvZHkgaXMgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxpZ2h0IHdoZW4gdGhlIHJlc3RhcnQgKG9yIHRoZSBhY2sgcGF0aCkgcnVucy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKHN0ZXBFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBFeGVjdXRpb25Qcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzaWJsaW5nIHdob3NlIGNsYWltIHdhcyBhY2NlcHRlZCB3cm90ZSBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRzIG9mIGl0cyBvd24sIHBvc3NpYmx5IGFmdGVyIHRoZSBXb3JsZCBidWlsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgNDEyJ3MgZGVsdGEg4oCUIHNvIHRoYXQgZGVsdGEgY2FuIG5vIGxvbmdlciBiZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZWQgdG8gY29tcGxldGUgdGhlIGxvZywgYW5kIHRoZSByZXN0YXJ0IGhhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHJlbG9hZCBpdCBpbiBmdWxsLiBgc2tpcHBlZGAgKHRoZSBzdGVwIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGVkKSwgYGdvbmVgIGFuZCBgdGhyb3R0bGVkYCAoY2xhaW0gcmVqZWN0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JvdGUgbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWJsaW5nV3JvdGUgPSBzZXR0bGVkLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0Y29tZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRjb21lLnZhbHVlLnR5cGUgPT09ICdjb21wbGV0ZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZS52YWx1ZS50eXBlID09PSAnZmFpbGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUudmFsdWUudHlwZSA9PT0gJ3JldHJ5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnRSZXBsYXlJblByb2Nlc3MoJ2lubGluZS1jbGFpbScsIHN0ZXBFcnIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dEZWx0YTogIXNpYmxpbmdXcm90ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIG5leHQgaXRlcmF0aW9uIHN0YXJ0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmluYWxseSBiZWxvdyByZXN1bWVzIHRoZSByZXBsYXkgYnVkZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoaXMgcmV0dXJuIChvciB0aHJvdykgY29tcGxldGVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FsYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVpbnZva2VBZnRlclN0YWxlUmVqZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5saW5lLWNsYWltJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEVyclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXNjYWxhdGlvbi5yZWludm9rZWQpIHJldHVybiBlc2NhbGF0aW9uLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZXBFcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlCdWRnZXQucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFnZ3JlZ2F0ZSB0aGUgYmF0Y2ggcmVzdWx0cy4gYHJldHJ5YCBzdGVwcyAod2hpY2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZXhpc3Qg4oCUIHRoZWlyIGBzdGVwX3N0YXJ0ZWRgIHN1Y2NlZWRlZCkgYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1xdWV1ZWQgcGVyLXN0ZXAgYXMgYmFja2dyb3VuZCBzdGVwcyB3aXRoIHRoZWlyIG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsYXk7IGB0aHJvdHRsZWRgIHN0ZXBzIChyZWplY3RlZCBvbiB0aGUgY3JlYXRlLWNsYWltLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbmV2ZXIgY3JlYXRlZCkgaW5zdGVhZCBkZWZlciByZWRlbGl2ZXJ5IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHNvIHRoZXkgcmUtcnVuIGlubGluZSB3aXRoIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiByZXBsYXk7IGNvbXBsZXRlZC9mYWlsZWQgc3RlcHMgYWxyZWFkeSB3cm90ZSB0aGVpclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYWwgZXZlbnRzLiBXZSBvbmx5IGxvb3AgYmFjayB0byByZXBsYXkgd2hlbiBldmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIHN0ZXAgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIOKAlCBvdGhlcndpc2UgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbC1wZW5kaW5nIHN0ZXBzIHdpbGwgYmUgcmUtcnVuIGJ5IHRoZWlyIHF1ZXVlZCByZXRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZXMgYW5kIHRoZSBiYWNrZ3JvdW5kLXN0ZXAgcGF0aCByZXBsYXlzIG9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBzdGVwcyBhcmUgZG9uZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmV0cnk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogKHR5cGVvZiBpbmxpbmVFeGVjdXRpb25zKVtudW1iZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFueVBlbmRpbmdPcHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdGhyb3R0bGVkIGlubGluZSBzdGVwIGRlbGF5cyByZWRlbGl2ZXJ5IG9mIFRISVNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBtZXNzYWdlIHJhdGhlciB0aGFuIGJlaW5nIHJlLXF1ZXVlZCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAuIENydWNpYWxseSwgYSBgdGhyb3R0bGVkYCByZXN1bHQgbWVhbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5IGBzdGVwX3N0YXJ0ZWRgIHdhcyByZWplY3RlZCBvbiB0aGUgYXRvbWljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUtY2xhaW0g4oCUIHNvIHRoZSBzdGVwIHdhcyBORVZFUiBjcmVhdGVkIChub1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHN0ZXBfY3JlYXRlZGAsIG5vIHN0ZXAgZW50aXR5KS4gUmUtcXVldWluZyBpdCBhcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXAgd291bGQgc2VuZCBhIGJhcmUgYHN0ZXBfc3RhcnRlZGAgKG5vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCksIHdoaWNoIHRoZSB3b3JsZCByZWplY3RzIHdpdGggYFN0ZXAgXCI8aWQ+XCIgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZGAgYmVjYXVzZSBpdCBjYW5ub3QgbGF6aWx5IGNyZWF0ZSB0aGUgc3RlcCB3aXRob3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdHMgaW5wdXQ7IHRoYXQgZXJyb3IgaXNuJ3QgdHJhbnNsYXRhYmxlLCBzbyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyB1bnRpbCBNQVhfUVVFVUVfREVMSVZFUklFUyBhbmQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwIChhbmQgcnVuKSBmYWlsLiBEZWZlcnJpbmcgcmVkZWxpdmVyeSBvZiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBpbnN0ZWFkIHJlLWF0dGVtcHRzIHRoZSB0aHJvdHRsZWQgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5lIFdJVEggaXRzIGlucHV0IG9uIHJlcGxheS4gV2UgdHJhY2sgdGhlIGxvbmdlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tvZmYgc28gYSBiYXRjaCB3aXRoIG11bHRpcGxlIHRocm90dGxlcyB3YWl0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heC4gTm90ZTogYHJldHJ5YCByZXN1bHRzIGFyZSBzYWZlIHRvIHJlLXF1ZXVlIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kIHN0ZXBzIGJlY2F1c2UgYSByZXRyeSBpbXBsaWVzIGBzdGVwX3N0YXJ0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IHN1Y2NlZWRlZCBhbmQgdGhlIHN0ZXAgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlVGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmxpbmVFeGVjdXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBzdGVwUmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGlubGluZUV4ZWN1dGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5U2Vjb25kczogci50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnR5cGUgPT09ICd0aHJvdHRsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lb3V0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVvdXQgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudGltZW91dFNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhhc1BlbmRpbmdPcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55UGVuZGluZ09wcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmVyIHJlZGVsaXZlcnkgb2YgdGhlIG9yY2hlc3RyYXRvciBhZnRlciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3R0bGUgYmFja29mZi4gT24gcmVwbGF5IGV2ZXJ5IG5vbi10ZXJtaW5hbCBzdGVwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJlLWRpc3BhdGNoZWQgYnkgdGhlIHN1c3BlbnNpb24gaGFuZGxlcjogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsLXRocm90dGxlZCBzdGVwcyBydW4gaW5saW5lIGFnYWluIFdJVEggdGhlaXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgKHRoZWlyIGBzdGVwX2NyZWF0ZWRgIGlzIGRlZmVycmVkIGFuZXcpLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IGByZXRyeWAgc3RlcHMgaW4gdGhpcyBiYXRjaCBhcmUgcXVldWVkIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQgc3RlcHMgd2l0aCB0aGVpciBvd24gcmV0cnlBZnRlciBob25vcmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hbCBzdGVwcyAoY29tcGxldGVkL2ZhaWxlZC9za2lwcGVkL2dvbmUpIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlZCBmcm9tIHRoZWlyIGV2ZW50cyBhbmQgbm90IHJlLXJ1bi4gQmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVwbGF5IGRyaXZlcyBhbGwgcmVtYWluaW5nIHdvcmssIHdlIG11c3QgTk9UXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gcmUtcXVldWUgYHRvUmV0cnlgIGhlcmUg4oCUIHRoYXQgd291bGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlLWRpc3BhdGNoIHRob3NlIHN0ZXBzLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJldHVybnMgQkVGT1JFIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlbG93LCBzbyBhIGJhdGNoIHRoYXQgbWl4ZXMgYSB0aHJvdHRsZSB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVkIHN0ZXAgdGhhdCBsZWZ0IHVuZmx1c2hlZCBvcHMgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgdGhlIGV4cGxpY2l0IGZsdXNoIGNvbnRpbnVhdGlvbi4gVGhhdCBpcyBzYWZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRocm90dGxlIGJhY2tvZmYgKD49IDFzKSBhbHdheXMgZXhjZWVkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW4taW52b2NhdGlvbiBmbHVzaCB3aW5kb3cgKDw9IDUwMG1zICsgd2FpdFVudGlsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gb3BzIHNldHRsZSBiZWZvcmUgdGhlIHBvc3QtYmFja29mZiByZWRlbGl2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheXMgYW5kIHJlYWRzIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWludm9rZSh0aHJvdHRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9SZXRyeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5VHJhY2VDYXJyaWVyID0gYXdhaXQgbmV4dFRyYWNlQ2FycmllcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1JldHJ5Lm1hcCgoeyBzdGVwLCBkZWxheVNlY29uZHMgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogcmV0cnlUcmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2V5IHRoZSBkZWxheWVkIHJldHJ5IG9uIHRoZSBzdGVwJ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBrZXkgc28gaXQgZGVkdXBlcyBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtleWVkIHJlLWRpc3BhdGNoIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXJmb3JtcyBvbiByZXBsYXkgKGl0IHVzZXMgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaXRob3V0IHRoaXMsIGEgbWl4ZWQgYmF0Y2ggd2hlcmUgb25lIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgY29tcGxldGVkYCB3aXRoIHVuZmx1c2hlZCBiYWNrZ3JvdW5kIG9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChgYW55UGVuZGluZ09wc2ApIGFuZCBhbm90aGVyIHN0ZXAgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeWluZyB3b3VsZCBkb3VibGUtZGlzcGF0Y2ggdGhlIHJldHJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgYW55UGVuZGluZ09wc2AgYnJhbmNoIGJlbG93IHF1ZXVlcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZSBwbGFpbiBjb250aW51YXRpb24sIHdob3NlIHJlcGxheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZXMgdGhlIHN0aWxsLWByZXRyeWluZ2Agc3RlcCBhcyBwZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJlLWRpc3BhdGNoZXMgaXQgKmltbWVkaWF0ZWx5KiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAqd2l0aCogYSBrZXkuIFNpbmNlIHRoaXMgZGVsYXllZCByZXRyeSBoYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBrZXksIHRoZSB0d28gbWVzc2FnZXMgd291bGRuJ3QgZGVkdXBlIOKAlFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGVwIHdvdWxkIHJ1biB0d2ljZSwgdGhlIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBiYWNrb2ZmIHdvdWxkIGJlIGlnbm9yZWQgKHBsYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYEVycm9yYCByZXRyaWVzIHBlcnNpc3Qgbm8gYHJldHJ5QWZ0ZXJgLCBzb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3b3JsZCBoYXMgbm8gYFRvb0Vhcmx5YCBndWFyZCksIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXRyeSBib2R5IGNvdWxkIHJ1biBlYXJseS9jb25jdXJyZW50bHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hhcmluZyB0aGUga2V5IGxldHMgdGhlIGVhcmxpZXIgZGVsYXllZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2Ugd2luLCBob25vcmluZyB0aGUgYmFja29mZi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogc3RlcERpc3BhdGNoSWRlbXBvdGVuY3lLZXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwLnN0ZXBOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IHBlbmRpbmcgYmFja2dyb3VuZCBvcGVyYXRpb25zIGZsdXNoIGJlZm9yZSB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGF5IHJlYWRzIHRoZWlyIHJlc3VsdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW55UGVuZGluZ09wcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCcmVha2luZyBsb29wOiBpbmxpbmUgc3RlcCBoYXMgcGVuZGluZyBvcHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGxvb3BJdGVyYXRpb24gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUmV0cnkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGlubGluZSBzdGVwcyB3aWxsIGJlIHJlLXJ1biB2aWEgdGhlaXIgcXVldWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IG1lc3NhZ2VzOyB0aGUgYmFja2dyb3VuZC1zdGVwIHBhdGggcmVwbGF5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIGFsbCBzdGVwcyBhcmUgdGVybWluYWwuIERvbid0IGxvb3AgaGVyZSDigJQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nIHN0ZXBzIGhhdmUgbm8gdGVybWluYWwgZXZlbnQgdG8gb2JzZXJ2ZSB5ZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGlubGluZSBzdGVwcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChjb21wbGV0ZWQvZmFpbGVkL3NraXBwZWQvZ29uZSkg4oCUIGxvb3AgYmFjayB0byByZXBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICh0aGUgd29ya2Zsb3cgb2JzZXJ2ZXMgdGhlIHRlcm1pbmFsIGV2ZW50cyBvbiByZXBsYXkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIGFueSBpbmxpbmUgZGVsdGEuIElmIGl0IGlzIHBhcnRpYWwsIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGl0cyBjdXJzb3IgaW5zdGVhZCBvZiByZWFkaW5nIHRoZSBwYWdlIGFnYWluLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubGluZUV4ZWN1dGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ubHkgPSBzdGVwUmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHkudHlwZSA9PT0gJ2NvbXBsZXRlZCcgJiYgb25seS5pbmxpbmVEZWx0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEV2ZW50TG9nKGV2ZW50TG9nLCBvbmx5LmlubGluZURlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExvZyA9IG9ubHkuaW5saW5lRGVsdGEuaGFzTW9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0RXZlbnRMb2dMb2FkKGV2ZW50TG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmV2ZW50TG9nLCB0eXBlOiAncmVhZHknIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nID0gbmV4dEV2ZW50TG9nTG9hZChldmVudExvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWxlLXNuYXBzaG90IHJlamVjdGlvbiBvZiBhIGd1YXJkZWQgd3JpdGUgbWFkZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYnkgdGhlIHJlcGxheSBsb29wIOKAlCB0aGUgcmVzdWx0LWJlYXJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBydW5fY29tcGxldGVkYCwgb3IgdGhlIGB3YWl0X2NvbXBsZXRlZGAgb2YgdGhlIHdhaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MuIEJvdGggcmVhY2ggdGhpcyBvbmUgY2F0Y2ggYW5kIHRoZSByZWplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IHNheSB3aGljaCwgaGVuY2UgdGhlIG5ldXRyYWwgbGFiZWwuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWl0aGVyIG1heSBiZSByZS1wb3N0ZWQgaW4gcGxhY2U6IHRoZSBjb3JyZWxhdGlvbiBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIChmb3IgcnVuX2NvbXBsZXRlZCkgdGhlIHJlc3VsdCBpdHNlbGYgY2FtZSBmcm9tXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcGxheSwgYW5kIGEgY29ycmVjdGVkIGxvZyBtYXkgcHJvZHVjZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IG9uZXMuIERvbid0IGZhaWwgdGhlIHJ1biDigJQgcmVzdGFydCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxheSBpbiB0aGlzIGludm9jYXRpb24sIGFuZCBvbmx5IG9uY2UgdGhhdCBidWRnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNwZW50IHNjaGVkdWxlIGFuIGV4cGxpY2l0IHJlLWludm9jYXRpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXRocm93aW5nIGluc3RlYWQgd291bGQgcmVseSBvbiByZWRlbGl2ZXJ5IG9mIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1VSUkVOVCBtZXNzYWdlLCB3aGljaCB0aGUgdHVyYm8gcGF0aCBoYXMgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNrZWQg4oCUIGVtcGlyaWNhbGx5IHRoZSBydW4gdGhlbiBzdGFsbHMgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUncyB+MzAwcyBkZWZhdWx0IHZpc2liaWxpdHkgdGltZW91dCBiZWZvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVybWluYWxFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0YXJ0UmVwbGF5SW5Qcm9jZXNzKCdyZXBsYXktd3JpdGUnLCBlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYWxhdGlvbiA9IGF3YWl0IHJlaW52b2tlQWZ0ZXJTdGFsZVJlamVjdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwbGF5LXdyaXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FsYXRpb24ucmVpbnZva2VkKSByZXR1cm4gZXNjYWxhdGlvbi5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlci1ydW4gYnVkZ2V0IHNwZW50LiBGYWxsIHRocm91Z2ggdG8gdGhlIHRlcm1pbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggYmVsb3cgaW5zdGVhZCBvZiByZXRocm93aW5nOiB0aGlzIGNhdGNoIG93bnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyB0aGUgcnVuLCBhbmQgYSByZXRocm93IHdvdWxkIGVzY2FwZSB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgaGFuZGxlciBhbmQgYmUgcmVkZWxpdmVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBlc2NhbGF0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2llbnQgaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZXMgdGFsa2luZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmxkICh3b3JrZmxvdy1zZXJ2ZXIpIOKAlCBhbiBleGhhdXN0ZWQgUmV0cnlBZ2VudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFVORF9FUlJfUkVRX1JFVFJZIGZyb20gYSBzdXN0YWluZWQgNDI5LzUwMyBzdG9ybSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGRyb3BwZWQgc29ja2V0LCBhIGNvbm5lY3QvRE5TIGZhaWx1cmUsIG9yIGEgY2xpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IOKAlCBtdXN0IE5PVCBmYWlsIHRoZSBydW4uIFJldGhyb3cgc28gdGhlIHF1ZXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWRlbGl2ZXJzIGFuZCBhIGZyZXNoIGludm9jYXRpb24gcmV0cmllcyB0aGUgcmVwbGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmNlIHRoZSBiYWNrZW5kIHJlY292ZXJzLiBUaGUgQHZlcmNlbC9xdWV1ZSBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWVzIGEgZmFzdCAoMXPihpI2MHMpIGJhY2tvZmYgYnkgZGVsaXZlcnkgY291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZGluZyB0aGUgfjVtaW4gZGVmYXVsdCB2aXNpYmlsaXR5LXRpbWVvdXQgcmVkcml2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBuZXZlciBraWxsaW5nIHRoZSBwcm9jZXNzIHZpYSBydW5fZmFpbGVkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBydW5Mb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHJhbnNpZW50IHdvcmxkIGVycm9yIGR1cmluZyByZXBsYXk7IHJlZGVsaXZlcmluZyB2aWEgcXVldWUgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVW5rbm93bkVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5QXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXBsYXlEaXZlcmdlbmNlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXZlcmdlbmNlQ291bnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYXlEaXZlcmdlbmNlPy5jb3VudCA/PyAwKSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFJlY292ZXJ5UmVwbGF5cyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVwbGF5RGl2ZXJnZW5jZU1heFJldHJpZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGl2ZXJnZW5jZUNvdW50IDw9IG1heFJlY292ZXJ5UmVwbGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJlcGxheSBkaXZlcmdlZDsgcXVldWVpbmcgYSByZWNvdmVyeSByZXBsYXkgYmVmb3JlIGRlY2xhcmluZyB0aGUgZXZlbnQgbG9nIGNvcnJ1cHRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZlcmdlbmNlRXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yRGl2ZXJnZW5jZUV2ZW50SWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZT8uZXZlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2ZXJnZW5jZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyeUF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlY292ZXJ5UmVwbGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBuYW1lc3BhY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBuZXh0VHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlEaXZlcmdlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogZXJyLmV2ZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IGRpdmVyZ2VuY2VDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgPSBkaXZlcmdlbmNlQ291bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IgPSBuZXcgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgV29ya2Zsb3cgcmVwbGF5IGRpdmVyZ2VkICR7ZGl2ZXJnZW5jZUNvdW50fSB0aW1lcyBhZnRlciAke21heFJlY292ZXJ5UmVwbGF5c30gcmVjb3ZlcnkgcmVwbGF5czsgbGF0ZXN0IGRpdmVyZ2VudCBldmVudCB3YXMgJHtlcnIuZXZlbnRJZH0uIExhc3QgZGl2ZXJnZW5jZTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheVN0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlSZWNvdmVyeVJlcG9ydGVyLmFjdGl2YXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgY29kZSBlcnJvcnMgYW5kIHRlcm1pbmFsIHJ1bnRpbWUgZXJyb3JzIGZhaWwgdGhlIHJ1bi5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXJtaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8ucmVjb3JkRXhjZXB0aW9uPy4odGVybWluYWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcih0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5uYW1lIHx8IGdldEVycm9yTmFtZSh0ZXJtaW5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yU3RhY2sgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkRXJyb3Iuc3RhY2sgfHwgZ2V0RXJyb3JTdGFjayh0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWROYW1lPy5tb2R1bGVTcGVjaWZpZXIgfHwgd29ya2Zsb3dOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrID0gcmVtYXBFcnJvclN0YWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dDb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzaWZ5IHRoZSBlcnJvcjogV29ya2Zsb3dSdW50aW1lRXJyb3IgaW5kaWNhdGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBTREsvcnVudGltZSBpc3N1ZSwgYW5kIHNlbGVjdGVkIHN1YmNsYXNzZXMgdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIHNwZWNpZmljIGNvZGVzIGZvciBiYWNrZW5kIHRyYWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gY2xhc3NpZnlSdW5FcnJvcih0ZXJtaW5hbEVycm9yKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcignRXJyb3Igd2hpbGUgcnVubmluZyB3b3JrZmxvdycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBzb3VyY2UtbWFwLXJlbWFwcGVkIHN0YWNrIHRvIHRoZSB0aHJvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHNvIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZXJyb3IgcHJlc2VydmVzIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY29uc3VtZXJzLiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGBlcnIgaW5zdGFuY2VvZiBFcnJvcmAgYmVjYXVzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvcmtmbG93IHJ1bnMgaW4gYSBzZXBhcmF0ZSBWTSByZWFsbSDigJQgaXRzIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFzcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBob3N0J3MsIHNvIGBpbnN0YW5jZW9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcmAgaXMgYGZhbHNlYCBmb3IgVk0tdGhyb3duIGVycm9ycy4gVGhlIFY4XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIHRhZyB3b3JrcyBhY3Jvc3MgcmVhbG1zLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmlzTmF0aXZlRXJyb3IodGVybWluYWxFcnJvcikgJiYgZXJyb3JTdGFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGVybWluYWxFcnJvciBhcyBFcnJvcikuc3RhY2sgPSBlcnJvclN0YWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdyBydW4gdmlhIGV2ZW50IChldmVudC1zb3VyY2VkKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIGlkZW50aXR5IGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGlrZSBldmVyeSBvdGhlciB3cml0ZSBmcm9tIHRoaXMgbG9vcCBpdCBjYXJyaWVzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2xvdCBzbmFwc2hvdCwgc28gYSBXb3JsZCB0aGF0IGZlbmNlcyBjYW4gcmVqZWN0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYSBzbG90LWFsbG9jYXRpbmcgb25lIHJlcG9ydHMgYmFjayB3aGF0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGluZyByZXBsYXkgaGFkIG5vdCBzZWVuLiBGYWlsLW9wZW4gb24gcHVycG9zZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgbmVpdGhlciBhcHBsaWVzOiBhIHNwdXJpb3VzIGZhaWx1cmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY292ZXJhYmxlICh0aGUgcnVuIGNhbiBiZSByZS1ydW4gZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhc2hib2FyZCksIHdoZXJlYXMgYSBzcHVyaW91cyAqY29tcGxldGlvbiogY29tbWl0cyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyByZXN1bHQuXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUdXJibzogb3JkZXIgdGhlIHRlcm1pbmFsIHdyaXRlIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kZWQgcnVuX3N0YXJ0ZWQgc28gdGhlIHJ1biBleGlzdHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGF3YWl0UnVuUmVhZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncnVuX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVJ1bkVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrZmxvd1J1bj8uc3BlY1ZlcnNpb24gPz8gMCkgPj1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJlcGxheURpdmVyZ2VuY2VDb3VudEZvckZhaWx1cmUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheURpdmVyZ2VuY2VDb3VudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5RGl2ZXJnZW5jZUNvdW50Rm9yRmFpbHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5FeHBpcmVkRXJyb3IuaXMoZmFpbEVycilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgd29ya2Zsb3cgcnVuLCBidXQgcnVuIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV29ybGRDb250cmFjdEVycm9yKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYXRhbCB3b3JsZCBjb250cmFjdCBlcnJvciB3aGlsZSByZWNvcmRpbmcgd29ya2Zsb3cgZmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbEVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGZhaWxFcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoZmFpbEVyciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmFpbEVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0Vycm9yQ29kZShlcnJvckNvZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFcnJvck5hbWUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZXJyb3JOYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gIGxldCBjYWNoZWRIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuICBsZXQgaW52b2NhdGlvbkNvdW50ID0gMDtcbiAgY29uc3QgZW50cnlwb2ludENyZWF0ZWRBdCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvdXRlTW9kdWxlQm9keUluaXRNcyA9XG4gICAgdHlwZW9mIG9wdGlvbnM/LnJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9PT0gJ251bWJlcidcbiAgICAgID8gZW50cnlwb2ludENyZWF0ZWRBdCAtIG9wdGlvbnMucm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpbnZvY2F0aW9uQ291bnQgKz0gMTtcbiAgICBjb25zdCBoYW5kbGVyQ2FjaGVkID0gY2FjaGVkSGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwYW5LaW5kID0gYXdhaXQgZ2V0U3BhbktpbmQoJ1NFUlZFUicpO1xuXG4gICAgcmV0dXJuIHRyYWNlKFxuICAgICAgJ3dvcmtmbG93LnJvdXRlLmZsb3cnLFxuICAgICAge1xuICAgICAgICBraW5kOiBzcGFuS2luZCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlVHlwZSgnZmxvdycpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5GYWFzSW5zdGFuY2UoQ09NUFVURV9JTlNUQU5DRV9JRCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVIYW5kbGVyQ2FjaGVkKGhhbmRsZXJDYWNoZWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlSW52b2NhdGlvbkNvdW50KGludm9jYXRpb25Db3VudCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93Um91dGVFbnRyeXBvaW50QWdlTXMoXG4gICAgICAgICAgICBEYXRlLm5vdygpIC0gZW50cnlwb2ludENyZWF0ZWRBdFxuICAgICAgICAgICksXG4gICAgICAgICAgLi4uKHJvdXRlTW9kdWxlQm9keUluaXRNcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICA6IEF0dHJpYnV0ZS5Xb3JrZmxvd1JvdXRlTW9kdWxlQm9keUluaXRNcyhyb3V0ZU1vZHVsZUJvZHlJbml0TXMpKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSHR0cFJlcXVlc3RNZXRob2QocmVxLm1ldGhvZCksXG4gICAgICAgICAgLi4uQXR0cmlidXRlLkh0dHBSb3V0ZSgnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICBpZiAoIWNhY2hlZEhhbmRsZXIpIHtcbiAgICAgICAgICBjYWNoZWRIYW5kbGVyID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LnJvdXRlLmluaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3b3JsZEhhbmRsZXJzID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICd3b3JrZmxvdy5yb3V0ZS5nZXRfd29ybGRfaGFuZGxlcnMnLFxuICAgICAgICAgICAgICBhc3luYyAoKSA9PiBnZXRXb3JsZEhhbmRsZXJzKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlcih3b3JsZEhhbmRsZXJzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2FjaGVkSGFuZGxlcihyZXEpO1xuICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICBBdHRyaWJ1dGUuSHR0cFJlc3BvbnNlU3RhdHVzQ29kZShyZXNwb25zZS5zdGF0dXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG4iXX0=