@workflow/core 5.0.0-beta.41 → 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 (65) 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/events-consumer.d.ts +97 -0
  5. package/dist/events-consumer.d.ts.map +1 -1
  6. package/dist/events-consumer.js +147 -14
  7. package/dist/private.d.ts +31 -12
  8. package/dist/private.d.ts.map +1 -1
  9. package/dist/private.js +149 -26
  10. package/dist/runtime/constants.d.ts +62 -0
  11. package/dist/runtime/constants.d.ts.map +1 -1
  12. package/dist/runtime/constants.js +70 -1
  13. package/dist/runtime/helpers.d.ts +127 -93
  14. package/dist/runtime/helpers.d.ts.map +1 -1
  15. package/dist/runtime/helpers.js +149 -132
  16. package/dist/runtime/quickjs-entrypoint.d.ts +10 -9
  17. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  18. package/dist/runtime/quickjs-entrypoint.js +162 -38
  19. package/dist/runtime/replay-budget.d.ts +8 -0
  20. package/dist/runtime/replay-budget.d.ts.map +1 -1
  21. package/dist/runtime/replay-budget.js +3 -3
  22. package/dist/runtime/resume-hook.d.ts.map +1 -1
  23. package/dist/runtime/resume-hook.js +53 -13
  24. package/dist/runtime/resume-latency.d.ts +143 -0
  25. package/dist/runtime/resume-latency.d.ts.map +1 -0
  26. package/dist/runtime/resume-latency.js +153 -0
  27. package/dist/runtime/run.d.ts.map +1 -1
  28. package/dist/runtime/run.js +54 -29
  29. package/dist/runtime/step-executor.d.ts +76 -13
  30. package/dist/runtime/step-executor.d.ts.map +1 -1
  31. package/dist/runtime/step-executor.js +171 -19
  32. package/dist/runtime/step-latency.d.ts +6 -0
  33. package/dist/runtime/step-latency.d.ts.map +1 -1
  34. package/dist/runtime/step-latency.js +3 -1
  35. package/dist/runtime/suspension-handler.d.ts +119 -8
  36. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  37. package/dist/runtime/suspension-handler.js +643 -46
  38. package/dist/runtime/world-compatibility.d.ts +6 -5
  39. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  40. package/dist/runtime/world-compatibility.js +7 -6
  41. package/dist/runtime.d.ts.map +1 -1
  42. package/dist/runtime.js +583 -142
  43. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  44. package/dist/serialization/codec-devalue.js +15 -4
  45. package/dist/serialization.d.ts +10 -2
  46. package/dist/serialization.d.ts.map +1 -1
  47. package/dist/serialization.js +55 -8
  48. package/dist/telemetry/semantic-conventions.d.ts +81 -0
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +67 -1
  51. package/dist/telemetry.d.ts +6 -0
  52. package/dist/telemetry.d.ts.map +1 -1
  53. package/dist/telemetry.js +22 -1
  54. package/dist/test-support/orchestrator-context.d.ts +25 -0
  55. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  56. package/dist/test-support/orchestrator-context.js +91 -0
  57. package/dist/version.d.ts +1 -1
  58. package/dist/version.js +2 -2
  59. package/dist/workflow/create-hook.js +2 -2
  60. package/dist/workflow/hook.js +3 -3
  61. package/dist/workflow.js +43 -2
  62. package/docs/foundations/hooks.mdx +2 -2
  63. package/docs/foundations/streaming.mdx +24 -0
  64. package/docs/how-it-works/event-sourcing.mdx +39 -1
  65. package/package.json +5 -5
package/dist/workflow.js CHANGED
@@ -258,6 +258,38 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
258
258
  onUnconsumedEvent: (event) => {
259
259
  onWorkflowError(new ReplayDivergenceError(`Replay could not consume event: eventType=${event.eventType}, correlationId=${event.correlationId}, eventId=${event.eventId}.`, { eventId: event.eventId }));
260
260
  },
261
+ // Both branches log at `debug`, so neither reaches the console unless
262
+ // `DEBUG` matches. A duplicate is a permanent feature of the log: every
263
+ // later replay re-reads it and lands here again, so anything the logger
264
+ // prints unconditionally would print once per replay for the life of the
265
+ // run. There is also nothing to act on. Ignoring the event is the correct
266
+ // outcome, not a degraded one, and no user change makes the straggler go
267
+ // away. What the levels are for is diagnosis after the fact, which is
268
+ // exactly what `DEBUG=workflow:runtime:debug` is for.
269
+ onDuplicateEvent: (event, firstEventType) => {
270
+ const details = {
271
+ workflowRunId: workflowRun.runId,
272
+ eventId: event.eventId,
273
+ eventType: event.eventType,
274
+ firstEventType,
275
+ correlationId: event.correlationId,
276
+ };
277
+ if (firstEventType !== event.eventType) {
278
+ // Two writers reached opposite conclusions about one entity: a
279
+ // `step_failed` behind a `step_completed`, or the reverse. Ignoring it
280
+ // is still correct and still deterministic (replay reads the first one
281
+ // at the same position every time), but unlike a re-commit of the same
282
+ // outcome there is no reading of this where both writers were right,
283
+ // so the discarded outcome gets its own message.
284
+ runtimeLogger.debug('Ignoring inert event that decides an already-decided outcome differently', details);
285
+ return;
286
+ }
287
+ // The first event of this class decided the outcome at a lower log
288
+ // position and replay reads that one. Recorded because a straggler is
289
+ // still evidence of two replays writing for the same entity, which is
290
+ // worth seeing when diagnosing a run.
291
+ runtimeLogger.debug('Ignoring inert event that repeats a class already in the event log', details);
292
+ },
261
293
  getPromiseQueue: () => promiseQueueHolder.current,
262
294
  isDeliveryIdle: () => deliveryIdleHolder.current(),
263
295
  });
@@ -288,6 +320,7 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
288
320
  // Consume run lifecycle events - these are structural events that don't
289
321
  // need special handling in the workflow, but must be consumed to advance
290
322
  // past them in the event log
323
+ let consumedRunStarted = false;
291
324
  workflowContext.eventsConsumer.subscribe((event) => {
292
325
  if (!event) {
293
326
  return EventConsumerResult.NotConsumed;
@@ -296,8 +329,16 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
296
329
  if (event.eventType === 'run_created') {
297
330
  return EventConsumerResult.Consumed;
298
331
  }
299
- // Consume run_started - every run has exactly one
332
+ // Consume the first run_started. Two replays can each write one (the
333
+ // create is idempotent for a run already running, which makes the write
334
+ // safe, not single-shot); the first is the one the replay observes, and
335
+ // the consumer skips the rest rather than advancing the workflow clock
336
+ // twice.
300
337
  if (event.eventType === 'run_started') {
338
+ if (consumedRunStarted) {
339
+ return EventConsumerResult.NotConsumed;
340
+ }
341
+ consumedRunStarted = true;
301
342
  return EventConsumerResult.Consumed;
302
343
  }
303
344
  // Attribute writes performed from a step have no workflow-body call to
@@ -887,4 +928,4 @@ async function createWorkflowSession({ workflowCode, workflowRun, events, encryp
887
928
  execution: waitForExecution(initialInterruption),
888
929
  };
889
930
  }
890
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFFckIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFh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LE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUyxFQUFFLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDO0tBQ2pELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVSUk9SX1NMVUdTLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsXG4gIHdpdGhSZXNvbHZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuLCBXb3JsZENhcGFiaWxpdGllcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0ICogYXMgbmFub2lkIGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBFdmVudENvbnN1bWVyUmVzdWx0LCBFdmVudHNDb25zdW1lciB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVJdGVtIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgRU5PVFNVUCwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0IH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IGlzRGVsaXZlcnlJZGxlIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydExhenkgfSBmcm9tICcuL3J1bnRpbWUvZ2V0LXBvcnQtbGF6eS5qcyc7XG5pbXBvcnQgeyBydW5JZENyZWF0ZWRBdCB9IGZyb20gJy4vcnVudGltZS9ydW4taWQtdGltZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVTdXNwZW5zaW9uIH0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlLFxuICBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVVc2VTdGVwIH0gZnJvbSAnLi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIEJPRFlfSU5JVF9TWU1CT0wsXG4gIFNUQUJMRV9VTElELFxuICBXT1JLRkxPV19DUkVBVEVfSE9PSyxcbiAgV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCxcbiAgV09SS0ZMT1dfU0VUX0FUVFJJQlVURVMsXG4gIFdPUktGTE9XX1NMRUVQLFxuICBXT1JLRkxPV19VU0VfU1RFUCxcbn0gZnJvbSAnLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBhcHBseVdvcmtmbG93U3VzcGVuc2lvblRvU3BhbiwgdHJhY2UgfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1J1blN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL3ZtL2luZGV4LmpzJztcbmltcG9ydCB7IHJ1bkNhY2hlZFdvcmtmbG93U2NyaXB0IH0gZnJvbSAnLi92bS9zY3JpcHQtY2FjaGUuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQWJvcnRTaWduYWxTdGF0aWNzLFxuICBjcmVhdGVDcmVhdGVBYm9ydENvbnRyb2xsZXIsXG59IGZyb20gJy4vd29ya2Zsb3cvYWJvcnQtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi93b3JrZmxvdy9hdHRyaWJ1dGUtZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL3dvcmtmbG93L2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5pbXBvcnQgeyBXT1JLRkxPV19DT05URVhUX1NZTUJPTCB9IGZyb20gJy4vd29ya2Zsb3cvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNyZWF0ZUhvb2sgfSBmcm9tICcuL3dvcmtmbG93L2hvb2suanMnO1xuaW1wb3J0IHsgY3JlYXRlU2xlZXAgfSBmcm9tICcuL3dvcmtmbG93L3NsZWVwLmpzJztcblxuLyoqXG4gKiBEcmFpbiBwZW5kaW5nIHF1ZXVlIGl0ZW1zIGF0IHdvcmtmbG93IGNvbXBsZXRpb24gKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkuXG4gKlxuICogVHJlYXRzIGNvbXBsZXRpb24gYXMgYSBmaW5hbCBzdXNwZW5zaW9uIHNvIHVuYXdhaXRlZCBob29rLCB3YWl0LCBhbmRcbiAqIGF0dHJpYnV0ZSBvcGVyYXRpb25zIGFyZSByZWNvcmRlZCBiZWZvcmUgdGhlIHJ1biBiZWNvbWVzIHRlcm1pbmFsLiBUaGlzXG4gKiBhbHNvIGxldHMgYSBmaW5hbCBgY29udHJvbGxlci5hYm9ydCgpYCByZWFjaCBpbi1mbGlnaHQgc3RlcHMuXG4gKlxuICogSXQgcmVjb3JkcyBgKl9jcmVhdGVkYCBhbmQgbmF0aXZlIGF0dHJpYnV0ZSBldmVudHMsIGJ1dCBuZXZlciBleGVjdXRlcyBzdGVwXG4gKiBib2RpZXM6IGBzdGVwX3N0YXJ0ZWRgIGlzIHJlamVjdGVkIGFmdGVyIHRoZSBydW4gYmVjb21lcyB0ZXJtaW5hbC4gQVxuICogZmlyZS1hbmQtZm9yZ2V0IHN0ZXAgdGhlcmVmb3JlIG5lZWRzIGEgbGF0ZXIgc3VzcGVuc2lvbiB0byBiZSBzY2hlZHVsZWQuXG4gKlxuICogRHJhaW4gZmFpbHVyZXMgZG8gbm90IGNoYW5nZSB0aGUgd29ya2Zsb3cncyB0ZXJtaW5hbCBvdXRjb21lLlxuICovXG5hc3luYyBmdW5jdGlvbiBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICBydW5JZDogc3RyaW5nLFxuICBwZW5kaW5nUXVldWU6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT4sXG4gIHZtR2xvYmFsVGhpczogdHlwZW9mIGdsb2JhbFRoaXMsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgb3V0Y29tZTogJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyxcbiAgLyoqXG4gICAqIEluIHR1cmJvIG1vZGUsIGdhdGVzIGZpbmFsIGAqX2NyZWF0ZWRgIHdyaXRlcyBvbiBiYWNrZ3JvdW5kZWRcbiAgICogYHJ1bl9zdGFydGVkYC4gVW5kZWZpbmVkIHdoZW4gYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkLlxuICAgKi9cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwZW5kaW5nUXVldWUuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAvLyBJbXBsaWNpdGx5IGRpc3Bvc2UgYW55IGFib3J0IGhvb2tzIChzeXN0ZW0gaG9va3MpIHRoYXQgYXJlIHN0aWxsIGFsaXZlIGF0XG4gIC8vIHdvcmtmbG93IGNvbXBsZXRpb24gc28gdGhleSBkb24ndCBsZWFrIHJvd3MgaW4gdGhlIGhvb2tzIHRhYmxlIGZvciB0aGVcbiAgLy8gcnVuJ3MgbGlmZXRpbWUuIFNraXAgaG9va3MgdGhhdCBhbHJlYWR5IGhhdmUgYW4gYWJvcnQgaW4gZmxpZ2h0IOKAlCB0aG9zZVxuICAvLyB3aWxsIGVtaXQgaG9va19yZWNlaXZlZCB2aWEgdGhlIGFib3J0IHByb2Nlc3NpbmcgcGF0aC4gVXNlciBob29rc1xuICAvLyAoaXNTeXN0ZW0gIT09IHRydWUpIGFyZSBpbnRlbnRpb25hbGx5IGxlZnQgYWxvbmU6IHRoZWlyIGxpZmV0aW1lIGlzXG4gIC8vIG1hbmFnZWQgYnkgdGhlIHVzZXIncyBjb2RlLCBub3QgdGhlIHJ1bnRpbWUuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwZW5kaW5nUXVldWUudmFsdWVzKCkpIHtcbiAgICBpZiAoXG4gICAgICBpdGVtLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgaXRlbS5pc1N5c3RlbSAmJlxuICAgICAgIWl0ZW0uZGlzcG9zZWQgJiZcbiAgICAgICFpdGVtLmFib3J0UmVxdWVzdGVkXG4gICAgKSB7XG4gICAgICBpdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKHBlbmRpbmdRdWV1ZSwgdm1HbG9iYWxUaGlzKTtcbiAgICBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgIHN1c3BlbnNpb246IHN5bnRoZXNpemVkLFxuICAgICAgd29ybGQsXG4gICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICBgRmFpbGVkIHRvIGRyYWluIHBlbmRpbmcgcXVldWUgaXRlbXMgZm9yICR7b3V0Y29tZX0gd29ya2Zsb3cgcnVuYCxcbiAgICAgIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbi8qKiBFdmVyeXRoaW5nIG5lZWRlZCB0byBjb2xkLXN0YXJ0IGEgd29ya2Zsb3cgVk0gb3ZlciBhbiBldmVudCBsb2cuICovXG5pbnRlcmZhY2UgV29ya2Zsb3dTZXNzaW9uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHdvcmtmbG93Q29kZTogc3RyaW5nO1xuICByZWFkb25seSB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgcmVwbGF5UGF5bG9hZENhY2hlOiBSZXBsYXlQYXlsb2FkQ2FjaGU7XG4gIHJlYWRvbmx5IHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj47XG4gIHJlYWRvbmx5IHdvcmxkQ2FwYWJpbGl0aWVzPzogV29ybGRDYXBhYmlsaXRpZXM7XG59XG5cbi8qKlxuICogQSBsaXZlIHdvcmtmbG93IFZNLCBwYXJrZWQgYXQgYSBzdXNwZW5zaW9uIGJvdW5kYXJ5LiBgcmVzdW1lYCBhZHZhbmNlcyBpdFxuICogYnkgYXBwZW5kaW5nIGV2ZW50cyBpbnN0ZWFkIG9mIHJlcGxheWluZyBmcm9tIHNjcmF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICByZWFkb25seSBhcmd1bWVudENvdW50OiBudW1iZXI7XG4gIHJlc3VtZShldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPFdvcmtmbG93UmVzdW1lUmVzdWx0Pjtcbn1cblxuLyoqIEEgZmluaXNoZWQgZXhlY3V0aW9uIGF0dGVtcHQ6IHRoZSB3b3JrZmxvdydzIG91dHB1dCBvciBhIGxpdmUgYm91bmRhcnkuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2NvbXBsZXRlZCc7XG4gICAgICByZWFkb25seSBvdXRwdXQ6IHVua25vd247XG4gICAgICAvKiogYHR5cGVvZmAgdGhlIHJhdyByZXR1cm4gdmFsdWUsIGZvciB0ZWxlbWV0cnkuICovXG4gICAgICByZWFkb25seSByZXN1bHRUeXBlOiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdzdXNwZW5kZWQnO1xuICAgICAgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uO1xuICAgICAgcmVhZG9ubHkgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uO1xuICAgICAgLyoqXG4gICAgICAgKiBFdmVudHMgdGhlIHJlcGxheSB3YWxrZWQgcGFzdCB1bmNsYWltZWQgYW5kIGlzIHN0aWxsIGhvbGRpbmcsIGlmIGFueS5cbiAgICAgICAqIE9yZGluYXJ5IG9uIGEgc3VzcGVuc2lvbiwgYW5kIG9ubHkgYWN0aW9uYWJsZSBhY3Jvc3MgYSBydW4nc1xuICAgICAgICogc3VzcGVuc2lvbnMsIHNvIGl0IGlzIHJlcG9ydGVkIGZvciB0ZWxlbWV0cnkgcmF0aGVyIHRoYW4gYWN0ZWQgb24gaGVyZS5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcGFya2VkPzoge1xuICAgICAgICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGV2ZW50VHlwZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9O1xuXG4vKipcbiAqIGByZXN1bWVgIGNhbiBhZGRpdGlvbmFsbHkgZGVjbGluZSDigJQgYHsgdHlwZTogJ3JlcGxheScgfWAgbWVhbnMgXCJ0aGlzXG4gKiBzZXNzaW9uIGlzIHVudXNhYmxlLCBjb2xkLXJlcGxheSBpbnN0ZWFkXCIuIEEgZnJlc2ggcmVwbGF5IG5ldmVyIGRlY2xpbmVzLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VtZVJlc3VsdCA9IFdvcmtmbG93UmVzdWx0IHwgeyByZWFkb25seSB0eXBlOiAncmVwbGF5JyB9O1xuXG4vKiogVGhlIHNlc3Npb24ncyBwcml2YXRlIHN0YXRlIG1hY2hpbmUuICovXG50eXBlIFdvcmtmbG93U2Vzc2lvblN0YXRlID1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAncnVubmluZyc7XG4gICAgICByZWFkb25seSBpbnRlcnJ1cHRpb246IFByb21pc2VXaXRoUmVzb2x2ZXJzPG5ldmVyPjtcbiAgICB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnc3VzcGVuZGVkJzsgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdyZXBsYXknIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdjb21wbGV0ZWQnIH07XG5cbi8qKiBDb2xkLXN0YXJ0OiBidWlsZCBhIGZyZXNoIFZNIHNlc3Npb24gYW5kIHJlcGxheSBpdCBvdmVyIGBldmVudHNgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVdvcmtmbG93KFxuICBvcHRpb25zOiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zXG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0PiB7XG4gIHJldHVybiB0cmFjZUV4ZWN1dGlvbihcbiAgICAncmVwbGF5JyxcbiAgICBvcHRpb25zLndvcmtmbG93UnVuLFxuICAgIG9wdGlvbnMuZXZlbnRzLFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb24sIGV4ZWN1dGlvbiB9ID0gYXdhaXQgY3JlYXRlV29ya2Zsb3dTZXNzaW9uKG9wdGlvbnMpO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZWNvcmRSZXN1bHQoYXdhaXQgZXhlY3V0aW9uLCBzcGFuKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKiBXYXJtLXN0YXJ0OiBhZHZhbmNlIGEgcmV0YWluZWQgc2Vzc2lvbiBieSBhcHBlbmRpbmcgZXZlbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZVdvcmtmbG93KFxuICBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24sXG4gIGV2ZW50czogRXZlbnRbXVxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VtZVJlc3VsdD4ge1xuICByZXR1cm4gdHJhY2VFeGVjdXRpb24oXG4gICAgJ3JldGFpbmVkJyxcbiAgICBzZXNzaW9uLndvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb24ucmVzdW1lKGV2ZW50cyk7XG4gICAgICByZXR1cm4gcmVzdWx0LnR5cGUgPT09ICdyZXBsYXknID8gcmVzdWx0IDogcmVjb3JkUmVzdWx0KHJlc3VsdCwgc3Bhbik7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiB0cmFjZUV4ZWN1dGlvbjxUPihcbiAgbW9kZTogJ3JlcGxheScgfCAncmV0YWluZWQnLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgZm46IChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHRyYWNlKGB3b3JrZmxvdy5ydW4gJHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9YCwgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHdvcmtmbG93UnVuLnJ1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQoZXZlbnRzLmxlbmd0aCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFeGVjdXRpb25Nb2RlKG1vZGUpLFxuICAgIH0pO1xuICAgIHJldHVybiBmbihzcGFuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZFJlc3VsdChcbiAgcmVzdWx0OiBXb3JrZmxvd1Jlc3VsdCxcbiAgc3BhbjogU3BhbiB8IHVuZGVmaW5lZFxuKTogV29ya2Zsb3dSZXN1bHQge1xuICBpZiAocmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSZXN1bHRUeXBlKHJlc3VsdC5yZXN1bHRUeXBlKSxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChzcGFuKSB7XG4gICAgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4ocmVzdWx0LnN1c3BlbnNpb24sIHNwYW4pO1xuICAgIC8vIEV2ZW50cyB0aGlzIHBhc3Mgd2Fsa2VkIHBhc3QgdW5jbGFpbWVkIGFuZCBpcyBzdGlsbCBob2xkaW5nLiBPcmRpbmFyeSBvblxuICAgIC8vIGEgc3VzcGVuc2lvbjogYW4gb3V0LW9mLWJhbmQgZGVsaXZlcnkgdGhhdCBsYW5kZWQgYWhlYWQgb2YgdGhlIGNvZGUgdGhhdFxuICAgIC8vIHJlYWRzIGl0IHdhaXRzIGZvciB0aGUgcGFzcyB0aGF0IHJlYWNoZXMgdGhhdCBjb2RlLCBhbmQgZmFpbGluZyBoZXJlXG4gICAgLy8gd291bGQgZmFpbCBleGFjdGx5IHRoZSBydW5zIHRoYXQgdG9sZXJhbmNlIGV4aXN0cyBmb3IuIFRoZSBjYXNlIHRoYXQgaXNcbiAgICAvLyBub3Qgb3JkaW5hcnkg4oCUIHRoZSBzYW1lIGV2ZW50IHN0aWxsIGhlbGQgcGFzcyBhZnRlciBwYXNzIOKAlCBpcyBhIHNoYXBlXG4gICAgLy8gYWNyb3NzIHRoZXNlIHNwYW5zLCB3aGljaCBpcyB3aHkgdGhlIGV2ZW50SWQgaXMgb24gZWFjaCBvbmUgYW5kIG5vIHBhc3NcbiAgICAvLyB0cmllcyB0byBydWxlIG9uIGl0IGFsb25lLlxuICAgIGlmIChyZXN1bHQucGFya2VkKSB7XG4gICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudHNDb3VudChyZXN1bHQucGFya2VkLmNvdW50KSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRJZChyZXN1bHQucGFya2VkLmV2ZW50SWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudFR5cGUocmVzdWx0LnBhcmtlZC5ldmVudFR5cGUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2luZ2xlLXNob3QgcmVwbGF5OiBleGVjdXRlIHRoZSB3b3JrZmxvdyBvdmVyIGBldmVudHNgIGFuZCBlaXRoZXIgcmV0dXJuXG4gKiBpdHMgb3V0cHV0IG9yIHRocm93IGl0cyBzdXNwZW5zaW9uLiBLZXB0IGZvciB0aGUgZXh0ZW5zaXZlIGV4aXN0aW5nIHRlc3RcbiAqIHN1aXRlcyDigJQgcHJvZHVjdGlvbiBjb2RlIGdvZXMgdGhyb3VnaCBgcmVwbGF5V29ya2Zsb3dgL2ByZXN1bWVXb3JrZmxvd2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvdyhcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICAvKipcbiAgICogT3B0aW9uYWwgcGVyLXJ1biBjYWNoZSBmb3IgcmVwbGF5IHBheWxvYWQgcHJlcGFyYXRpb24gYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIE93bmVkIGJ5IHRoZSBpbmxpbmUgZXhlY3V0aW9uIGxvb3AgZm9yIHRoaXMgaW52b2NhdGlvbi5cbiAgICovXG4gIHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICBlbmNyeXB0aW9uS2V5XG4gICksXG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuXG4gICAqIFRocmVhZGVkIGludG8gdGhlIGVuZC1vZi1ydW4gZHJhaW4gc28gZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgIHdyaXRlc1xuICAgKiBjb21taXR0ZWQgYXQgd29ya2Zsb3cgY29tcGxldGlvbiBvcmRlciBhZnRlciB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZFxuICAgKiBvdXRzaWRlIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+LFxuICAvKipcbiAgICogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gTWlzc2luZ1xuICAgKiBjYXBhYmlsaXRpZXMgYXJlIHRyZWF0ZWQgYXMgdW5zdXBwb3J0ZWQuXG4gICAqL1xuICB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVdvcmtmbG93KHtcbiAgICB3b3JrZmxvd0NvZGUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICAgIHJ1blJlYWR5QmFycmllcixcbiAgICB3b3JsZENhcGFiaWxpdGllcyxcbiAgfSk7XG4gIGlmIChyZXN1bHQudHlwZSA9PT0gJ3N1c3BlbmRlZCcpIHRocm93IHJlc3VsdC5zdXNwZW5zaW9uO1xuICByZXR1cm4gcmVzdWx0Lm91dHB1dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ya2Zsb3dTZXNzaW9uKHtcbiAgd29ya2Zsb3dDb2RlLFxuICB3b3JrZmxvd1J1bixcbiAgZXZlbnRzLFxuICBlbmNyeXB0aW9uS2V5LFxuICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gIHJ1blJlYWR5QmFycmllcixcbiAgd29ybGRDYXBhYmlsaXRpZXMsXG59OiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zKTogUHJvbWlzZTx7XG4gIHNlc3Npb246IFdvcmtmbG93U2Vzc2lvbjtcbiAgZXhlY3V0aW9uOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0Pjtcbn0+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0O1xuICBpZiAoIXN0YXJ0ZWRBdCkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgIGBXb3JrZmxvdyBydW4gXCIke3dvcmtmbG93UnVuLnJ1bklkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcCAoc2hvdWxkIG5vdCBoYXBwZW4pYFxuICAgICk7XG4gIH1cblxuICAvLyBTZWVkIGFuZCBpbml0aWFsIGNsb2NrIG11c3QgYmUgYXZhaWxhYmxlIGJlZm9yZSBJL08gYW5kIHJlbWFpbiBzdGFibGUgb25cbiAgLy8gcmVwbGF5LiBBZnRlciB0aGUgZmlyc3QgZXZlbnQsIEV2ZW50c0NvbnN1bWVyIGFkdmFuY2VzIHRoZSBWTSBjbG9jayBmcm9tXG4gIC8vIGVhY2ggZXZlbnQncyBgY3JlYXRlZEF0YC5cbiAgY29uc3QgZml4ZWRUaW1lc3RhbXAgPVxuICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/PyArd29ya2Zsb3dSdW4uY3JlYXRlZEF0O1xuXG4gIC8vIFRydXRoaW5lc3MsIG5vdCBwcmVzZW5jZTogYHZlcmNlbCBlbnYgcHVsbGAgd3JpdGVzIGBWRVJDRUxfVVJMPVwiXCJgIGludG9cbiAgLy8gYC5lbnYubG9jYWxgLCBhbmQgYSBmcmFtZXdvcmsgdGhhdCBsb2FkcyB0aGF0IGZpbGUgbG9jYWxseSB3b3VsZCBvdGhlcndpc2VcbiAgLy8gcHV0IHVzIG9uIHRoZSBWZXJjZWwgYnJhbmNoIHdpdGggbm90aGluZyB0byBidWlsZCBhIGhvc3QgZnJvbSwgbWFraW5nXG4gIC8vIGBodHRwczovL2AgdGhlIGJhc2UgVVJMIG9mIGV2ZXJ5IHJ1bi5cbiAgY29uc3QgaXNWZXJjZWwgPSBCb29sZWFuKHByb2Nlc3MuZW52LlZFUkNFTF9VUkwpO1xuICAvLyBMb2FkIGdldFBvcnQgbGF6aWx5IHRvIHByZXZlbnQgVHVyYm9wYWNrIGZyb20gdHJhY2luZyBnZXQtcG9ydCdzXG4gIC8vIGZzIG9wcyAocmVhZGRpciwgcmVhZEZpbGUpIGludG8gdGhlIGZsb3cgcm91dGUgYnVuZGxlLiBUaGUgcmVzb2x2ZWRcbiAgLy8gcG9ydCBpcyBjYWNoZWQgcGVyIHByb2Nlc3MgKHNlZSBnZXQtcG9ydC1sYXp5LnRzKSwgc28gdGhpcyBpcyBjaGVhcFxuICAvLyBvbiByZXBsYXlzIGFmdGVyIHRoZSBmaXJzdC5cbiAgY29uc3Qgd29ya2Zsb3dCYXNlVXJsID0gY3JlYXRlV29ya2Zsb3dCYXNlVXJsKFxuICAgIGlzVmVyY2VsXG4gICAgICA/IGBodHRwczovLyR7cHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTH1gXG4gICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7KGF3YWl0IGdldFBvcnRMYXp5KCkpID8/IDMwMDB9YFxuICApO1xuXG4gIGNvbnN0IHtcbiAgICBjb250ZXh0LFxuICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICB1cGRhdGVUaW1lc3RhbXAsXG4gIH0gPSBjcmVhdGVDb250ZXh0KHtcbiAgICBzZWVkOiBgJHt3b3JrZmxvd1J1bi5ydW5JZH06JHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9OiR7d29ya2Zsb3dSdW4uZGVwbG95bWVudElkfWAsXG4gICAgZml4ZWRUaW1lc3RhbXAsXG4gIH0pO1xuXG4gIGNvbnN0IGluaXRpYWxJbnRlcnJ1cHRpb24gPSB3aXRoUmVzb2x2ZXJzPG5ldmVyPigpO1xuICBsZXQgc3RhdGU6IFdvcmtmbG93U2Vzc2lvblN0YXRlID0ge1xuICAgIHR5cGU6ICdydW5uaW5nJyxcbiAgICBpbnRlcnJ1cHRpb246IGluaXRpYWxJbnRlcnJ1cHRpb24sXG4gIH07XG5cbiAgY29uc3Qgb25Xb3JrZmxvd0Vycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgY2FzZSAncnVubmluZyc6IHtcbiAgICAgICAgY29uc3QgeyBpbnRlcnJ1cHRpb24gfSA9IHN0YXRlO1xuICAgICAgICBzdGF0ZSA9IFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnJvcilcbiAgICAgICAgICA/IHsgdHlwZTogJ3N1c3BlbmRlZCcsIHN1c3BlbnNpb246IGVycm9yIH1cbiAgICAgICAgICA6IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgLy8gRWFjaCBwYXJrZWQgc3RlcCBjb25zdW1lciBzY2hlZHVsZXMgaXRzIG93biAoaWRlbnRpY2FsKSBzdXNwZW5zaW9uXG4gICAgICAgIC8vIHNpZ25hbDsgdGhlIGZpcnN0IG9uZSBsYW5kcyBoZXJlLCBhbmQgYnVtcGluZyB0aGUgZ2VuZXJhdGlvbiBtYWtlc1xuICAgICAgICAvLyB0aGUgc3RlcC1jb25zdW1lciBndWFyZCBkcm9wIHRoZSByZXN0IGF0IGZpcmUgdGltZS5cbiAgICAgICAgd29ya2Zsb3dDb250ZXh0LnN1c3BlbnNpb25HZW5lcmF0aW9uKys7XG4gICAgICAgIGludGVycnVwdGlvbi5yZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdzdXNwZW5kZWQnOlxuICAgICAgICAvLyBTYW1lLWJvdW5kYXJ5IGR1cGxpY2F0ZXMgd2VyZSBzdGFsZWQgYnkgdGhlIGdlbmVyYXRpb24gYnVtcCBhYm92ZSxcbiAgICAgICAgLy8gc28gYW55dGhpbmcgbGFuZGluZyBoZXJlIGlzIG91dC1vZi1iYW5kIOKAlCBhbiB1bmd1YXJkZWQgc2xlZXAvaG9vay9cbiAgICAgICAgLy8gYXR0cmlidXRlIHNpZ25hbCBvciBhIGRpdmVyZ2VuY2UuIFRob3NlIGJvdW5kYXJpZXMgYXJlIHVucmV0YWluYWJsZVxuICAgICAgICAvLyAodGhlIHJ1bnRpbWUgZGVtb3RlcyB0aGVtIHRvbyksIHNvIGZhbGwgYmFjayB0byByZXBsYXkuXG4gICAgICAgIHN0YXRlID0geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdyZXBsYXknOlxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZSBzYXRpc2ZpZXMgbmV2ZXI7XG4gIH07XG5cbiAgY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gdm1HbG9iYWxUaGlzLk1hdGgucmFuZG9tKCkpO1xuICAvLyBDb3JyZWxhdGlvbiBJRHMgbXVzdCBiZSByZXBsYXktc3RhYmxlLiBgc3RhcnRlZEF0YCBkaWZmZXJzIGJldHdlZW4gYSB0dXJib1xuICAvLyBkZWxpdmVyeSBhbmQgYSBsYXRlciBzZXJ2ZXItYmFja2VkIHJlcGxheSwgc28gdXNlIGZpeGVkVGltZXN0YW1wLlxuICBjb25zdCBnZW5lcmF0ZVVsaWQgPSAoKSA9PiB1bGlkKGZpeGVkVGltZXN0YW1wKTtcbiAgY29uc3QgZ2VuZXJhdGVOYW5vaWQgPSBuYW5vaWQuY3VzdG9tUmFuZG9tKG5hbm9pZC51cmxBbHBoYWJldCwgMjEsIChzaXplKSA9PlxuICAgIG5ldyBVaW50OEFycmF5KHNpemUpLm1hcCgoKSA9PiAyNTYgKiB2bUdsb2JhbFRoaXMuTWF0aC5yYW5kb20oKSlcbiAgKTtcblxuICAvLyBDcmVhdGUgYSBtdXRhYmxlIGhvbGRlciBmb3IgdGhlIHByb21pc2UgcXVldWUgc28gdGhlIEV2ZW50c0NvbnN1bWVyXG4gIC8vIGNhbiBhY2Nlc3MgdGhlIGN1cnJlbnQgcXVldWUgc3RhdGUgdmlhIGEgZ2V0dGVyLiBUaGUgcXVldWUgaXMgbXV0YXRlZFxuICAvLyBieSBzdGVwL2hvb2svc2xlZXAgY2FsbGJhY2tzIGFzIGV2ZW50cyBhcmUgcHJvY2Vzc2VkLlxuICBjb25zdCBwcm9taXNlUXVldWVIb2xkZXIgPSB7IGN1cnJlbnQ6IFByb21pc2UucmVzb2x2ZSgpIH07XG5cbiAgLy8gU2FtZSByZWFzb24gYXMgdGhlIHF1ZXVlIGhvbGRlcjogdGhlIGNvbnN1bWVyIGlzIGJ1aWx0IGJlZm9yZSB0aGUgY29udGV4dFxuICAvLyB3aG9zZSBkZWxpdmVyeSBzdGF0ZSBpdCBoYXMgdG8gcmVhZC4gSWRsZSB1bnRpbCB0aGUgY29udGV4dCBleGlzdHMsIHdoaWNoXG4gIC8vIGlzIGJlZm9yZSBhbnkgZGVsaXZlcnkgY2FuIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCBpdC5cbiAgY29uc3QgZGVsaXZlcnlJZGxlSG9sZGVyID0geyBjdXJyZW50OiAoKTogYm9vbGVhbiA9PiB0cnVlIH07XG5cbiAgLy8gVGhlIFZNIGNsb2NrIG9ubHkgZXZlciBtb3ZlcyBmb3J3YXJkLiBDb25zdW1wdGlvbiBvcmRlciBpcyBsb2cgb3JkZXIgZm9yXG4gIC8vIGV2ZXJ5dGhpbmcgd2hvc2Ugb3JkZXIgdGhlIHJlcGxheSBkZWNpZGVzLCBidXQgYW4gZXZlbnQgdGhlIGNvbnN1bWVyXG4gIC8vIHBhcmtlZCBpcyBkZWxpdmVyZWQgYWZ0ZXIgdGhlIHdhbGsgaGFzIGFscmVhZHkgcGFzc2VkIGV2ZW50cyB3cml0dGVuIGFmdGVyXG4gIC8vIGl0LCBhbmQgbGV0dGluZyBpdHMgYGNyZWF0ZWRBdGAgc2V0IHRoZSBjbG9jayB3b3VsZCBtYWtlIGBEYXRlLm5vdygpYCBnb1xuICAvLyBiYWNrd2FyZHMgaW5zaWRlIGEgc2luZ2xlIHJlcGxheS5cbiAgbGV0IGNsb2NrID0gZml4ZWRUaW1lc3RhbXA7XG5cbiAgY29uc3QgZXZlbnRzQ29uc3VtZXIgPSBuZXcgRXZlbnRzQ29uc3VtZXIoZXZlbnRzLCB7XG4gICAgb25Db25zdW1lZEV2ZW50OiAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGF0ID0gK2V2ZW50LmNyZWF0ZWRBdDtcbiAgICAgIGlmIChhdCA+IGNsb2NrKSB7XG4gICAgICAgIGNsb2NrID0gYXQ7XG4gICAgICAgIHVwZGF0ZVRpbWVzdGFtcChhdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50KSA9PiB7XG4gICAgICBvbldvcmtmbG93RXJyb3IoXG4gICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgYFJlcGxheSBjb3VsZCBub3QgY29uc3VtZSBldmVudDogZXZlbnRUeXBlPSR7ZXZlbnQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke2V2ZW50LmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7ZXZlbnQuZXZlbnRJZH0uYCxcbiAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG4gICAgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBwcm9taXNlUXVldWVIb2xkZXIuY3VycmVudCxcbiAgICBpc0RlbGl2ZXJ5SWRsZTogKCkgPT4gZGVsaXZlcnlJZGxlSG9sZGVyLmN1cnJlbnQoKSxcbiAgfSk7XG5cbiAgY29uc3Qgd29ya2Zsb3dDb250ZXh0OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQgPSB7XG4gICAgcnVuSWQ6IHdvcmtmbG93UnVuLnJ1bklkLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgd29ybGRDYXBhYmlsaXRpZXMsXG4gICAgZ2xvYmFsVGhpczogdm1HbG9iYWxUaGlzLFxuICAgIG9uV29ya2Zsb3dFcnJvcixcbiAgICBldmVudHNDb25zdW1lcixcbiAgICBnZW5lcmF0ZVVsaWQsXG4gICAgZ2VuZXJhdGVOYW5vaWQsXG4gICAgaW52b2NhdGlvbnNRdWV1ZTogbmV3IE1hcCgpLFxuICAgIC8vIFVzZSBnZXR0ZXIvc2V0dGVyIHNvIHRoZSBFdmVudHNDb25zdW1lcidzIGdldFByb21pc2VRdWV1ZSgpIGFsd2F5c1xuICAgIC8vIHNlZXMgdGhlIGxhdGVzdCBxdWV1ZSBzdGF0ZSBhcyBpdCdzIG11dGF0ZWQgYnkgc3RlcC9ob29rL3NsZWVwIGNhbGxiYWNrcy5cbiAgICBnZXQgcHJvbWlzZVF1ZXVlKCkge1xuICAgICAgcmV0dXJuIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50O1xuICAgIH0sXG4gICAgc2V0IHByb21pc2VRdWV1ZSh2YWx1ZTogUHJvbWlzZTx2b2lkPikge1xuICAgICAgcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIHBlbmRpbmdEZWxpdmVyaWVzOiAwLFxuICAgIHN1c3BlbnNpb25HZW5lcmF0aW9uOiAwLFxuICAgIHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzOiBuZXcgTWFwKCksXG4gICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICB9O1xuXG4gIGRlbGl2ZXJ5SWRsZUhvbGRlci5jdXJyZW50ID0gKCkgPT4gaXNEZWxpdmVyeUlkbGUod29ya2Zsb3dDb250ZXh0KTtcblxuICAvLyBDb25zdW1lIHJ1biBsaWZlY3ljbGUgZXZlbnRzIC0gdGhlc2UgYXJlIHN0cnVjdHVyYWwgZXZlbnRzIHRoYXQgZG9uJ3RcbiAgLy8gbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGluIHRoZSB3b3JrZmxvdywgYnV0IG11c3QgYmUgY29uc3VtZWQgdG8gYWR2YW5jZVxuICAvLyBwYXN0IHRoZW0gaW4gdGhlIGV2ZW50IGxvZ1xuICB3b3JrZmxvd0NvbnRleHQuZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgIH1cblxuICAgIC8vIENvbnN1bWUgcnVuX2NyZWF0ZWQgLSBldmVyeSBydW4gaGFzIGV4YWN0bHkgb25lXG4gICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJykge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZSBydW5fc3RhcnRlZCAtIGV2ZXJ5IHJ1biBoYXMgZXhhY3RseSBvbmVcbiAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICB9XG5cbiAgICAvLyBBdHRyaWJ1dGUgd3JpdGVzIHBlcmZvcm1lZCBmcm9tIGEgc3RlcCBoYXZlIG5vIHdvcmtmbG93LWJvZHkgY2FsbCB0b1xuICAgIC8vIGNvbnN1bWUgdGhlbSBkdXJpbmcgcmVwbGF5OyB0aGV5IGFyZSBhbHJlYWR5IHJlZmxlY3RlZCBpbiB0aGUgcnVuXG4gICAgLy8gc25hcHNob3QgYW5kIHJlbWFpbiBzdHJ1Y3R1cmFsIHVudGlsIGEgcmVhZCBBUEkgaXMgaW50cm9kdWNlZC5cbiAgICBpZiAoXG4gICAgICBldmVudC5ldmVudFR5cGUgPT09ICdhdHRyX3NldCcgJiZcbiAgICAgIGV2ZW50LmV2ZW50RGF0YS53cml0ZXIudHlwZSA9PT0gJ3N0ZXAnXG4gICAgKSB7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgfSk7XG5cbiAgY29uc3QgdXNlU3RlcCA9IGNyZWF0ZVVzZVN0ZXAod29ya2Zsb3dDb250ZXh0KTtcbiAgY29uc3QgY3JlYXRlSG9vayA9IGNyZWF0ZUNyZWF0ZUhvb2sod29ya2Zsb3dDb250ZXh0KTtcbiAgY29uc3Qgc2xlZXAgPSBjcmVhdGVTbGVlcCh3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBzZXRBdHRyaWJ1dGVzID0gY3JlYXRlU2V0QXR0cmlidXRlcyh3b3JrZmxvd0NvbnRleHQpO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfVVNFX1NURVBdID0gdXNlU3RlcDtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19TRVRfQVRUUklCVVRFU10gPSBzZXRBdHRyaWJ1dGVzO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0NSRUFURV9IT09LXSA9IGNyZWF0ZUhvb2s7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfU0xFRVBdID0gc2xlZXA7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfR0VUX1NUUkVBTV9JRF0gPSAobmFtZXNwYWNlPzogc3RyaW5nKSA9PlxuICAgIGdldFdvcmtmbG93UnVuU3RyZWFtSWQod29ya2Zsb3dSdW4ucnVuSWQsIG5hbWVzcGFjZSk7XG5cbiAgLy8gRm9yIHRoZSB3b3JrZmxvdyBWTSwgd2Ugc3RvcmUgdGhlIGNvbnRleHQgaW4gYSBzeW1ib2wgb24gdGhlIGBnbG9iYWxUaGlzYCBvYmplY3RcbiAgY29uc3QgY3R4OiBXb3JrZmxvd01ldGFkYXRhID0ge1xuICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93UnVuSWQ6IHdvcmtmbG93UnVuLnJ1bklkLFxuICAgIHdvcmtmbG93U3RhcnRlZEF0OiBuZXcgdm1HbG9iYWxUaGlzLkRhdGUoK3N0YXJ0ZWRBdCksXG4gICAgdXJsOiB3b3JrZmxvd0Jhc2VVcmwsXG4gICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gIH07XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19DT05URVhUX1NZTUJPTF0gPSBjdHg7XG4gIC8vIFNlcmlhbGl6YXRpb24gbWludHMgc3RyZWFtIGlkcyB0aHJvdWdoIHRoaXMgc3ltYm9sLCBhbmQgY2FsbHMgaXQgd2l0aCBub1xuICAvLyBzZWVkIHRpbWUuIGBtb25vdG9uaWNGYWN0b3J5YCByZXR1cm5zIGBlbmNvZGVUaW1lKGxhc3RUaW1lKWAgb24gaXRzXG4gIC8vIGluY3JlbWVudCBicmFuY2gsIHNvIG9uZSBzdWNoIGNhbGwgbGF0Y2hlcyB0aGUgKmhvc3QqIHdhbGwgY2xvY2sgaW50b1xuICAvLyBgbGFzdFRpbWVgLCBhbmQgZXZlcnkgaWQgdGhlIHJ1biBtaW50cyBhZnRlcndhcmRzIGNhcnJpZXMgdGhhdCB0aW1lc3RhbXBcbiAgLy8gaW5zdGVhZCBvZiBgZml4ZWRUaW1lc3RhbXBgLCBhIHZhbHVlIHRoYXQgZGlmZmVycyBvbiBldmVyeSByZXBsYXkuIEJpbmRpbmdcbiAgLy8gdGhlIHNlZWQgdGltZSBoZXJlIGtlZXBzIHRoZSB3aG9sZSBydW4gb24gb25lIHJlcGxheS1zdGFibGUgY2xvY2suXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbU1RBQkxFX1VMSURdID0gZ2VuZXJhdGVVbGlkO1xuXG4gIC8vIFdvcmtmbG93IGNvZGUgbXVzdCBpbXBvcnQgdGhlIGRldGVybWluaXN0aWMgYGZldGNoYCBzdGVwIGZyb20gYHdvcmtmbG93YC5cbiAgdm1HbG9iYWxUaGlzLmZldGNoID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyB2bUdsb2JhbFRoaXMuRXJyb3IoXG4gICAgICBgR2xvYmFsIFwiZmV0Y2hcIiBpcyB1bmF2YWlsYWJsZSBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuIFVzZSB0aGUgXCJmZXRjaFwiIHN0ZXAgZnVuY3Rpb24gZnJvbSBcIndvcmtmbG93XCIgdG8gbWFrZSBIVFRQIHJlcXVlc3RzLlxcblxcbkxlYXJuIG1vcmU6IGh0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9lcnIvJHtFUlJPUl9TTFVHUy5GRVRDSF9JTl9XT1JLRkxPV19GVU5DVElPTn1gXG4gICAgKTtcbiAgfTtcblxuICAvLyBPdmVycmlkZSB0aW1lb3V0L2ludGVydmFsIGZ1bmN0aW9ucyB0byB0aHJvdyBoZWxwZnVsIGVycm9yc1xuICAvLyBUaGVzZSBhcmUgbm90IHN1cHBvcnRlZCBpbiB3b3JrZmxvdyBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IHJlbHkgb25cbiAgLy8gYXN5bmNocm9ub3VzIHNjaGVkdWxpbmcgd2hpY2ggYnJlYWtzIGRldGVybWluaXN0aWMgcmVwbGF5XG4gIGNvbnN0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPVxuICAgICdUaW1lb3V0IGZ1bmN0aW9ucyBsaWtlIFwic2V0VGltZW91dFwiIGFuZCBcInNldEludGVydmFsXCIgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiBVc2UgdGhlIFwic2xlZXBcIiBmdW5jdGlvbiBmcm9tIFwid29ya2Zsb3dcIiBmb3IgdGltZS1iYXNlZCBkZWxheXMuJztcblxuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0VGltZW91dCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5zZXRJbnRlcnZhbCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhclRpbWVvdXQgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuY2xlYXJJbnRlcnZhbCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5zZXRJbW1lZGlhdGUgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuY2xlYXJJbW1lZGlhdGUgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIGBBYm9ydENvbnRyb2xsZXJgIGFuZCBgQWJvcnRTaWduYWxgIGluIHRoZSB3b3JrZmxvdyBWTSBhcmUgaG9vay1iYWNrZWRcbiAgLy8gZm9yIGRldGVybWluaXN0aWMgcmVwbGF5LiBUaGUgY29udHJvbGxlcidzIGFib3J0KCkgcXVldWVzIGEgaG9vayByZXN1bXB0aW9uLFxuICAvLyBhbmQgc2lnbmFsLmFib3J0ZWQgaXMgdXBkYXRlZCB3aGVuIHRoZSBob29rIGV2ZW50IGlzIHByb2Nlc3NlZCBkdXJpbmcgcmVwbGF5LlxuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuQWJvcnRDb250cm9sbGVyID1cbiAgICBjcmVhdGVDcmVhdGVBYm9ydENvbnRyb2xsZXIod29ya2Zsb3dDb250ZXh0KTtcbiAgY29uc3QgYWJvcnRTaWduYWxTdGF0aWNzID0gY3JlYXRlQWJvcnRTaWduYWxTdGF0aWNzKCk7XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5BYm9ydFNpZ25hbCA9IHtcbiAgICBhYm9ydDogYWJvcnRTaWduYWxTdGF0aWNzLmFib3J0LFxuICAgIGFueTogYWJvcnRTaWduYWxTdGF0aWNzLmFueSxcbiAgICB0aW1lb3V0OiBhYm9ydFNpZ25hbFN0YXRpY3MudGltZW91dCxcbiAgfTtcblxuICAvLyBgUmVxdWVzdGAgYW5kIGBSZXNwb25zZWAgYXJlIHNwZWNpYWwgYnVpbHQtaW4gY2xhc3NlcyB0aGF0IGludm9rZSBzdGVwc1xuICAvLyBmb3IgdGhlIGBqc29uKClgLCBgdGV4dCgpYCBhbmQgYGFycmF5QnVmZmVyKClgIGluc3RhbmNlIG1ldGhvZHNcbiAgY2xhc3MgUmVxdWVzdCBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuUmVxdWVzdCB7XG4gICAgY2FjaGUhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ2NhY2hlJ107XG4gICAgY3JlZGVudGlhbHMhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ2NyZWRlbnRpYWxzJ107XG4gICAgZGVzdGluYXRpb24hOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ2Rlc3RpbmF0aW9uJ107XG4gICAgaGVhZGVycyE6IEhlYWRlcnM7XG4gICAgaW50ZWdyaXR5ITogc3RyaW5nO1xuICAgIG1ldGhvZCE6IHN0cmluZztcbiAgICBtb2RlITogZ2xvYmFsVGhpcy5SZXF1ZXN0Wydtb2RlJ107XG4gICAgcmVkaXJlY3QhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ3JlZGlyZWN0J107XG4gICAgcmVmZXJyZXIhOiBzdHJpbmc7XG4gICAgcmVmZXJyZXJQb2xpY3khOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ3JlZmVycmVyUG9saWN5J107XG4gICAgdXJsITogc3RyaW5nO1xuICAgIGtlZXBhbGl2ZSE6IGJvb2xlYW47XG4gICAgc2lnbmFsITogQWJvcnRTaWduYWw7XG4gICAgZHVwbGV4ITogJ2hhbGYnO1xuICAgIGJvZHkhOiBSZWFkYWJsZVN0cmVhbTxhbnk+IHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0OiBhbnksIGluaXQ/OiBSZXF1ZXN0SW5pdCkge1xuICAgICAgLy8gSGFuZGxlIFVSTCBpbnB1dFxuICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiB2bUdsb2JhbFRoaXMuVVJMKSB7XG4gICAgICAgIGNvbnN0IHVybFN0cmluZyA9IFN0cmluZyhpbnB1dCk7XG4gICAgICAgIC8vIFZhbGlkYXRlIFVSTCBmb3JtYXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXcgdm1HbG9iYWxUaGlzLlVSTCh1cmxTdHJpbmcpO1xuICAgICAgICAgIHRoaXMudXJsID0gdXJsU3RyaW5nO1xuICAgICAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAke3VybFN0cmluZ31gLCB7XG4gICAgICAgICAgICBjYXVzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW5wdXQgaXMgYSBSZXF1ZXN0IG9iamVjdCAtIGNsb25lIGl0cyBwcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMudXJsID0gaW5wdXQudXJsO1xuICAgICAgICBpZiAoIWluaXQpIHtcbiAgICAgICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5wdXQuaGVhZGVycyk7XG4gICAgICAgICAgdGhpcy5ib2R5ID0gaW5wdXQuYm9keTtcbiAgICAgICAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlO1xuICAgICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFscztcbiAgICAgICAgICB0aGlzLmNhY2hlID0gaW5wdXQuY2FjaGU7XG4gICAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGlucHV0LnJlZGlyZWN0O1xuICAgICAgICAgIHRoaXMucmVmZXJyZXIgPSBpbnB1dC5yZWZlcnJlcjtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5wdXQucmVmZXJyZXJQb2xpY3k7XG4gICAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSBpbnB1dC5pbnRlZ3JpdHk7XG4gICAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBpbnB1dC5rZWVwYWxpdmU7XG4gICAgICAgICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWw7XG4gICAgICAgICAgdGhpcy5kdXBsZXggPSBpbnB1dC5kdXBsZXg7XG4gICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGlucHV0LmRlc3RpbmF0aW9uO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBpbml0IGlzIHByb3ZpZGVkLCBtZXJnZTogdXNlIHNvdXJjZSBwcm9wZXJ0aWVzLCB0aGVuIG92ZXJyaWRlIHdpdGggaW5pdFxuICAgICAgICAvLyBDb3B5IGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBSZXF1ZXN0IGZpcnN0XG4gICAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5wdXQuaGVhZGVycyk7XG4gICAgICAgIHRoaXMuYm9keSA9IGlucHV0LmJvZHk7XG4gICAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbnB1dC5jcmVkZW50aWFscztcbiAgICAgICAgdGhpcy5jYWNoZSA9IGlucHV0LmNhY2hlO1xuICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5wdXQucmVkaXJlY3Q7XG4gICAgICAgIHRoaXMucmVmZXJyZXIgPSBpbnB1dC5yZWZlcnJlcjtcbiAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9IGlucHV0LnJlZmVycmVyUG9saWN5O1xuICAgICAgICB0aGlzLmludGVncml0eSA9IGlucHV0LmludGVncml0eTtcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBpbnB1dC5rZWVwYWxpdmU7XG4gICAgICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsO1xuICAgICAgICB0aGlzLmR1cGxleCA9IGlucHV0LmR1cGxleDtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGlucHV0LmRlc3RpbmF0aW9uO1xuICAgICAgfVxuXG4gICAgICAvLyBPdmVycmlkZSB3aXRoIGluaXQgb3B0aW9ucyBpZiBwcm92aWRlZFxuICAgICAgLy8gU2V0IG1ldGhvZFxuICAgICAgaWYgKGluaXQ/Lm1ldGhvZCkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IGluaXQubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLm1ldGhvZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGVmYXVsdCBmb3Igc3RyaW5nIGlucHV0IGNhc2VcbiAgICAgICAgdGhpcy5tZXRob2QgPSAnR0VUJztcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGhlYWRlcnNcbiAgICAgIGlmIChpbml0Py5oZWFkZXJzKSB7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIHZtR2xvYmFsVGhpcy5VUkxcbiAgICAgICkge1xuICAgICAgICAvLyBGb3Igc3RyaW5nL1VSTCBpbnB1dCwgY3JlYXRlIGVtcHR5IGhlYWRlcnNcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBvdGhlciBwcm9wZXJ0aWVzIHdpdGggaW5pdCB2YWx1ZXMgb3IgZGVmYXVsdHNcbiAgICAgIGlmIChpbml0Py5tb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gaW5pdC5tb2RlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5tb2RlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLm1vZGUgPSAnY29ycyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5jcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBpbml0LmNyZWRlbnRpYWxzO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5jcmVkZW50aWFscyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9ICdzYW1lLW9yaWdpbic7XG4gICAgICB9XG5cbiAgICAgIC8vIGBhbnlgIGNhc3QgaGVyZSBiZWNhdXNlIEB0eXBlcy9ub2RlIHYyMiBkb2VzIG5vdCB5ZXQgaGF2ZSBgY2FjaGVgXG4gICAgICBpZiAoKGluaXQgYXMgYW55KT8uY2FjaGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNhY2hlID0gKGluaXQgYXMgYW55KS5jYWNoZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY2FjaGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSAnZGVmYXVsdCc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5yZWRpcmVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbml0LnJlZGlyZWN0O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWRpcmVjdCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZWRpcmVjdCA9ICdmb2xsb3cnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ucmVmZXJyZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5pdC5yZWZlcnJlcjtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVmZXJyZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXIgPSAnYWJvdXQ6Y2xpZW50JztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnJlZmVycmVyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9IGluaXQucmVmZXJyZXJQb2xpY3k7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZmVycmVyUG9saWN5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5pbnRlZ3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmludGVncml0eSA9IGluaXQuaW50ZWdyaXR5O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5pbnRlZ3JpdHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5rZWVwYWxpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGluaXQua2VlcGFsaXZlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5rZWVwYWxpdmUgIT09ICdib29sZWFuJykge1xuICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8uc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEFib3J0U2lnbmFsIHN0dWJcbiAgICAgICAgdGhpcy5zaWduYWwgPSBpbml0LnNpZ25hbDtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2lnbmFsKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBBYm9ydFNpZ25hbCBzdHViXG4gICAgICAgIHRoaXMuc2lnbmFsID0geyBhYm9ydGVkOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZHVwbGV4KSB7XG4gICAgICAgIHRoaXMuZHVwbGV4ID0gJ2hhbGYnO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZGVzdGluYXRpb24pIHtcbiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9ICdkb2N1bWVudCc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBpbml0Py5ib2R5O1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IEdFVC9IRUFEIG1ldGhvZHMgZG9uJ3QgaGF2ZSBhIGJvZHlcbiAgICAgIGlmIChcbiAgICAgICAgYm9keSAhPT0gbnVsbCAmJlxuICAgICAgICBib2R5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHRoaXMubWV0aG9kID09PSAnR0VUJyB8fCB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFJlcXVlc3Qgd2l0aCBHRVQvSEVBRCBtZXRob2QgY2Fubm90IGhhdmUgYm9keS5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIEJvZHlJbml0IGZvciBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAoYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgXCJmYWtlXCIgUmVhZGFibGVTdHJlYW0gdGhhdCBzdG9yZXMgdGhlIG9yaWdpbmFsIGJvZHlcbiAgICAgICAgLy8gVGhpcyBhdm9pZHMgZG9pbmcgYXN5bmMgd29yayBkdXJpbmcgd29ya2Zsb3cgcmVwbGF5XG4gICAgICAgIHRoaXMuYm9keSA9IE9iamVjdC5jcmVhdGUodm1HbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICAgIFtCT0RZX0lOSVRfU1lNQk9MXToge1xuICAgICAgICAgICAgdmFsdWU6IGJvZHksXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJvZHkgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsb25lKCk6IFJlcXVlc3Qge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldCBib2R5VXNlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhlc2VcbiAgICBibG9iITogKCkgPT4gUHJvbWlzZTxCbG9iPjtcbiAgICBmb3JtRGF0YSE6ICgpID0+IFByb21pc2U8Rm9ybURhdGE+O1xuXG4gICAgYXJyYXlCdWZmZXIhOiAoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICBqc29uITogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHRleHQhOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbiAgICBhc3luYyBieXRlcygpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCB0aGlzLmFycmF5QnVmZmVyKCkpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdC5wcm90b3R5cGUsIHtcbiAgICBhcnJheUJ1ZmZlcjoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIEFycmF5QnVmZmVyPignX19idWlsdGluX3Jlc3BvbnNlX2FycmF5X2J1ZmZlcicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICBqc29uOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgYW55PignX19idWlsdGluX3Jlc3BvbnNlX2pzb24nKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAgdGV4dDoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIHN0cmluZz4oJ19fYnVpbHRpbl9yZXNwb25zZV90ZXh0JyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICBjbGFzcyBSZXNwb25zZSBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuUmVzcG9uc2Uge1xuICAgIHR5cGUhOiBnbG9iYWxUaGlzLlJlc3BvbnNlWyd0eXBlJ107XG4gICAgdXJsITogc3RyaW5nO1xuICAgIHN0YXR1cyE6IG51bWJlcjtcbiAgICBzdGF0dXNUZXh0ITogc3RyaW5nO1xuICAgIGJvZHkhOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PiB8IG51bGw7XG4gICAgaGVhZGVycyE6IEhlYWRlcnM7XG4gICAgcmVkaXJlY3RlZCE6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihib2R5PzogYW55LCBpbml0PzogUmVzcG9uc2VJbml0KSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IGluaXQ/LnN0YXR1cyA/PyAyMDA7XG4gICAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0Py5zdGF0dXNUZXh0ID8/ICcnO1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQ/LmhlYWRlcnMpO1xuICAgICAgdGhpcy50eXBlID0gJ2RlZmF1bHQnO1xuICAgICAgdGhpcy51cmwgPSAnJztcbiAgICAgIHRoaXMucmVkaXJlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IG51bGwtYm9keSBzdGF0dXMgY29kZXMgZG9uJ3QgaGF2ZSBhIGJvZHlcbiAgICAgIC8vIFBlciBIVFRQIHNwZWM6IDIwNCAoTm8gQ29udGVudCksIDIwNSAoUmVzZXQgQ29udGVudCksIGFuZCAzMDQgKE5vdCBNb2RpZmllZClcbiAgICAgIGlmIChcbiAgICAgICAgYm9keSAhPT0gbnVsbCAmJlxuICAgICAgICBib2R5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHRoaXMuc3RhdHVzID09PSAyMDQgfHwgdGhpcy5zdGF0dXMgPT09IDIwNSB8fCB0aGlzLnN0YXR1cyA9PT0gMzA0KVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgYFJlc3BvbnNlIGNvbnN0cnVjdG9yOiBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyBjb2RlICR7dGhpcy5zdGF0dXN9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgQm9keUluaXQgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBcImZha2VcIiBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyB0aGUgb3JpZ2luYWwgYm9keVxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBkb2luZyBhc3luYyB3b3JrIGR1cmluZyB3b3JrZmxvdyByZXBsYXlcbiAgICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZSh2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogYm9keSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZXNlXG4gICAgY2xvbmUhOiAoKSA9PiBSZXNwb25zZTtcbiAgICBibG9iITogKCkgPT4gUHJvbWlzZTxnbG9iYWxUaGlzLkJsb2I+O1xuICAgIGZvcm1EYXRhITogKCkgPT4gUHJvbWlzZTxnbG9iYWxUaGlzLkZvcm1EYXRhPjtcblxuICAgIGdldCBvaygpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCAzMDA7XG4gICAgfVxuXG4gICAgZ2V0IGJvZHlVc2VkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFycmF5QnVmZmVyITogKCkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAganNvbiE6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICB0ZXh0ITogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgdGhpcy5hcnJheUJ1ZmZlcigpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMganNvbihkYXRhOiBhbnksIGluaXQ/OiBSZXNwb25zZUluaXQpOiBSZXNwb25zZSB7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQ/LmhlYWRlcnMpO1xuICAgICAgaWYgKCFoZWFkZXJzLmhhcygnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGJvZHksIHsgLi4uaW5pdCwgaGVhZGVycyB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXJyb3IoKTogUmVzcG9uc2Uge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHN0YXRpYyByZWRpcmVjdCh1cmw6IHN0cmluZyB8IFVSTCwgc3RhdHVzOiBudW1iZXIgPSAzMDIpOiBSZXNwb25zZSB7XG4gICAgICAvLyBWYWxpZGF0ZSBzdGF0dXMgY29kZSAtIG9ubHkgc3BlY2lmaWMgcmVkaXJlY3QgY29kZXMgYXJlIGFsbG93ZWRcbiAgICAgIGlmICghWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XS5pbmNsdWRlcyhzdGF0dXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHJlZGlyZWN0IHN0YXR1cyBjb2RlOiAke3N0YXR1c30uIE11c3QgYmUgb25lIG9mOiAzMDEsIDMwMiwgMzAzLCAzMDcsIDMwOGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHJlc3BvbnNlIHdpdGggTG9jYXRpb24gaGVhZGVyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKCk7XG4gICAgICBoZWFkZXJzLnNldCgnTG9jYXRpb24nLCBTdHJpbmcodXJsKSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gT2JqZWN0LmNyZWF0ZShSZXNwb25zZS5wcm90b3R5cGUpO1xuICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCA9ICcnO1xuICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICByZXNwb25zZS5ib2R5ID0gbnVsbDtcbiAgICAgIHJlc3BvbnNlLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICByZXNwb25zZS51cmwgPSAnJztcbiAgICAgIHJlc3BvbnNlLnJlZGlyZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuUmVzcG9uc2UgPSBSZXNwb25zZTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZS5wcm90b3R5cGUsIHtcbiAgICBhcnJheUJ1ZmZlcjoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIEFycmF5QnVmZmVyPignX19idWlsdGluX3Jlc3BvbnNlX2FycmF5X2J1ZmZlcicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICBqc29uOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgYW55PignX19idWlsdGluX3Jlc3BvbnNlX2pzb24nKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAgdGV4dDoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIHN0cmluZz4oJ19fYnVpbHRpbl9yZXNwb25zZV90ZXh0JyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICBjbGFzcyBSZWFkYWJsZVN0cmVhbTxUPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08VD4ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2FuY2VsKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0UmVhZGVyKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgcGlwZVRocm91Z2goKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBwaXBlVG8oKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICB0ZWUoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICB2YWx1ZXMoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtID0gUmVhZGFibGVTdHJlYW07XG5cbiAgY2xhc3MgV3JpdGFibGVTdHJlYW08VD4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFib3J0KCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgY2xvc2UoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXRXcml0ZXIoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtID0gV3JpdGFibGVTdHJlYW07XG5cbiAgY2xhc3MgVHJhbnNmb3JtU3RyZWFtPEksIE8+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5UcmFuc2Zvcm1TdHJlYW08SSwgTz4ge1xuICAgIHJlYWRhYmxlOiBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPE8+O1xuICAgIHdyaXRhYmxlOiBnbG9iYWxUaGlzLldyaXRhYmxlU3RyZWFtPEk+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5UcmFuc2Zvcm1TdHJlYW0gPSBUcmFuc2Zvcm1TdHJlYW07XG5cbiAgdm1HbG9iYWxUaGlzLmNvbnNvbGUgPSBnbG9iYWxUaGlzLmNvbnNvbGU7XG5cbiAgLy8gRXhwb3NlIHRoZSByZXF1ZXN0LWNvbnRleHQgc3ltYm9sIHJlcXVpcmVkIGJ5IEFJIEdhdGV3YXkuXG4gIGNvbnN0IFNZTUJPTF9GT1JfUkVRX0NPTlRFWFQgPSBTeW1ib2wuZm9yKCdAdmVyY2VsL3JlcXVlc3QtY29udGV4dCcpO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1NZTUJPTF9GT1JfUkVRX0NPTlRFWFRdID0gKGdsb2JhbFRoaXMgYXMgYW55KVtcbiAgICBTWU1CT0xfRk9SX1JFUV9DT05URVhUXG4gIF07XG5cbiAgLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB1c2VyLWRlZmluZWQgd29ya2Zsb3cgZnVuY3Rpb24uXG4gIC8vIFRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgZW5zdXJlcyBzdGFjayB0cmFjZXMgc2hvdyBhIG1lYW5pbmdmdWwgbmFtZVxuICAvLyAoZS5nLiwgXCJleGFtcGxlL3dvcmtmbG93cy85OV9lMmUudHNcIikgaW5zdGVhZCBvZiBcImV2YWxtYWNoaW5lLjxhbm9ueW1vdXM+XCIuXG4gIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpO1xuICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWU7XG5cbiAgLy8gUmV1c2UgY29tcGlsZWQgc2NyaXB0cyBieSBgKGNvZGUsIGZpbGVuYW1lKWA6IGNvbXBpbGF0aW9uIGlzIGRldGVybWluaXN0aWNcbiAgLy8gYW5kIHRoZSBmaWxlbmFtZSBwcmVzZXJ2ZXMgd29ya2Zsb3cgc291cmNlIGF0dHJpYnV0aW9uIGluIHN0YWNrIHRyYWNlcy5cbiAgLy8gVGhlIGJ1bmRsZSByZWdpc3RlcnMgd29ya2Zsb3dzIG9uIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3NgLlxuICBydW5DYWNoZWRXb3JrZmxvd1NjcmlwdCh3b3JrZmxvd0NvZGUsIGZpbGVuYW1lLCBjb250ZXh0KTtcbiAgY29uc3Qgd29ya2Zsb3dGbiA9IHJ1bkNhY2hlZFdvcmtmbG93U2NyaXB0KFxuICAgIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3M/LmdldCgke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSl9KWAsXG4gICAgZmlsZW5hbWUsXG4gICAgY29udGV4dFxuICApO1xuXG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpO1xuICB9XG5cbiAgLy8gQ2hhaW4gd29ya2Zsb3cgYXJndW1lbnQgaHlkcmF0aW9uIG9udG8gdGhlIHByb21pc2VRdWV1ZSBzbyB0aGF0IHRoZVxuICAvLyB1bmNvbnN1bWVkIGV2ZW50IGNoZWNrICh3aGljaCB3YWl0cyBmb3IgdGhlIHF1ZXVlIHRvIGRyYWluKSBkb2Vzbid0XG4gIC8vIGZpcmUgZHVyaW5nIHRoZSBhc3luYyBnYXAgYmV0d2VlbiBydW5fc3RhcnRlZCBjb25zdW1wdGlvbiBhbmQgdGhlXG4gIC8vIHdvcmtmbG93IGZ1bmN0aW9uIHN1YnNjcmliaW5nIGl0cyBmaXJzdCBzdGVwIGNhbGxiYWNrcy5cbiAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlID0gd29ya2Zsb3dDb250ZXh0LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwcmVwYXJlZCA9IGF3YWl0IHJlcGxheVBheWxvYWRDYWNoZS5wcmVwYXJlV29ya2Zsb3dJbnB1dCh3b3JrZmxvd1J1bik7XG4gICAgYXJncyA9IGF3YWl0IGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgIHdvcmtmbG93UnVuLmlucHV0LFxuICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAge30sXG4gICAgICBwcmVwYXJlZFxuICAgICk7XG4gIH0pO1xuICBhd2FpdCB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlO1xuXG4gIC8vIFRoZSB1c2VyIGZ1bmN0aW9uJ3MgcHJvbWlzZS4gSXQgbWF5IHN0YXkgcGVuZGluZyBhY3Jvc3MgbWFueSByZXN1bWVzXG4gIC8vIChlYWNoIHBhcmtlZCBzdGVwIHByb21pc2UgaG9sZHMgaXQgdXApIGFuZCBpcyByYWNlZCBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gIC8vIGF0dGVtcHQncyBpbnRlcnJ1cHRpb24gaW4gd2FpdEZvckV4ZWN1dGlvbi5cbiAgY29uc3Qgd29ya2Zsb3dCb2R5ID0gKGFzeW5jICgpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICByZXR1cm4gYXdhaXQgd29ya2Zsb3dGbiguLi5hcmdzKTtcbiAgfSkoKTtcblxuICBjb25zdCBmYWlsV29ya2Zsb3cgPSBhc3luYyAoZXJyb3I6IHVua25vd24pOiBQcm9taXNlPG5ldmVyPiA9PiB7XG4gICAgLy8gQ29udHJvbC1mbG93IHNpZ25hbHMgYXJlIGhhbmRsZWQgYnkgdGhlIHJ1bnRpbWUgYW5kIGRvIG5vdCBtZWFuIHRoZVxuICAgIC8vIHdvcmtmbG93IGhhcyB0ZXJtaW5hbGx5IGZhaWxlZC4gYG9uV29ya2Zsb3dFcnJvcmAgdXN1YWxseSBhbHJlYWR5IG1vdmVkXG4gICAgLy8gdGhlIHN0YXRlIG1hY2hpbmUsIGJ1dCBhIGRpdmVyZ2VuY2UgY2FuIGFsc28gYXJyaXZlIHZpYSBhIHN0ZXBcbiAgICAvLyBwcm9taXNlJ3MgZGlyZWN0IHJlamVjdGlvbiAoYnlwYXNzaW5nIGBvbldvcmtmbG93RXJyb3JgKSDigJQgZGVtb3RlIHNvXG4gICAgLy8gZXZlcnkgY29udHJvbC1mbG93IHBhdGggY29udmVyZ2VzIG9uIGByZXBsYXlgIGFuZCBhIGxhdGVyIHJlc3VtZSBmYWxsc1xuICAgIC8vIGJhY2sgaW5zdGVhZCBvZiB0aHJvd2luZy5cbiAgICBpZiAoV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycm9yKSB8fCBSZXBsYXlEaXZlcmdlbmNlRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgICBpZiAoc3RhdGUudHlwZSA9PT0gJ3J1bm5pbmcnKSBzdGF0ZSA9IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBzdGF0ZSA9IHsgdHlwZTogJ2NvbXBsZXRlZCcgfTtcblxuICAgIGF3YWl0IGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMoXG4gICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgIHdvcmtmbG93Q29udGV4dC5pbnZvY2F0aW9uc1F1ZXVlLFxuICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAnZmFpbGVkJyxcbiAgICAgIHJ1blJlYWR5QmFycmllclxuICAgICk7XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfTtcblxuICBjb25zdCB3YWl0Rm9yRXhlY3V0aW9uID0gYXN5bmMgKFxuICAgIGludGVycnVwdGlvbjogUHJvbWlzZVdpdGhSZXNvbHZlcnM8bmV2ZXI+XG4gICk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHQ+ID0+IHtcbiAgICBsZXQgcmVzdWx0OiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3dvcmtmbG93Qm9keSwgaW50ZXJydXB0aW9uLnByb21pc2VdKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHN0YXRlLnR5cGUgPT09ICdzdXNwZW5kZWQnICYmIGVycm9yID09PSBzdGF0ZS5zdXNwZW5zaW9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ3N1c3BlbmRlZCcsXG4gICAgICAgICAgc3VzcGVuc2lvbjogc3RhdGUuc3VzcGVuc2lvbixcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIC8vIEEgc3VzcGVuc2lvbiBpcyBub3QgYSBzZXR0bGluZyBwb2ludDogdGhlIGNvbnN1bWVyIGZvciBzb21ldGhpbmdcbiAgICAgICAgICAvLyBoZWxkIG1heSB3ZWxsIGJlIHJlZ2lzdGVyZWQgYnkgdGhlIHJlcGxheSB0aGF0IGZvbGxvd3MgdGhpcyBvbmUuXG4gICAgICAgICAgLy8gU28gaXQgaXMgY2FycmllZCBvdXQgZm9yIHRoZSBzcGFuIGluc3RlYWQgb2YgYmVpbmcganVkZ2VkIGhlcmUuXG4gICAgICAgICAgcGFya2VkOiBldmVudHNDb25zdW1lci5wYXJrZWRTdW1tYXJ5LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhaWxXb3JrZmxvdyhlcnJvcik7XG4gICAgfVxuXG4gICAgc3RhdGUgPSB7IHR5cGU6ICdjb21wbGV0ZWQnIH07XG4gICAgLy8gVGhlIGNvbnN1bWVyIHdhbGtzIHBhc3QgZXZlbnRzIHdob3NlIHR5cGUgY2FycmllcyBubyBvcmRlcmluZyBjbGFpbSBhbmRcbiAgICAvLyBob2xkcyB0aGVtIGZvciBhIGNvbnN1bWVyIGl0IGV4cGVjdHMgYSBsYXRlciBgc3Vic2NyaWJlKClgIHRvIHJlZ2lzdGVyLlxuICAgIC8vIFRoZSB3b3JrZmxvdyBmdW5jdGlvbiByZXR1cm5pbmcgaXMgdGhlIHBvaW50IHdoZXJlIHRoYXQgZXhwZWN0YXRpb24gaXNcbiAgICAvLyBzZXR0bGVkOiBub3RoaW5nIG1vcmUgd2lsbCBzdWJzY3JpYmUsIHNvIGFueXRoaW5nIHN0aWxsIGhlbGQgd2FzIG5ldmVyXG4gICAgLy8gYW55b25lJ3MsIGFuZCBjb21wbGV0aW5nIGhlcmUgd291bGQgZHJvcCBpdCBzaWxlbnRseS5cbiAgICBjb25zdCBzdHJhbmRlZCA9IGV2ZW50c0NvbnN1bWVyLnN0cmFuZGVkRXZlbnQ7XG4gICAgaWYgKHN0cmFuZGVkKSB7XG4gICAgICByZXR1cm4gZmFpbFdvcmtmbG93KFxuICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgIGBSZXBsYXkgZmluaXNoZWQgd2l0aG91dCBjb25zdW1pbmcgZXZlbnQ6IGV2ZW50VHlwZT0ke3N0cmFuZGVkLmV2ZW50VHlwZX0sIGNvcnJlbGF0aW9uSWQ9JHtzdHJhbmRlZC5jb3JyZWxhdGlvbklkfSwgZXZlbnRJZD0ke3N0cmFuZGVkLmV2ZW50SWR9LmAsXG4gICAgICAgICAgeyBldmVudElkOiBzdHJhbmRlZC5ldmVudElkIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIC8vIE9ubHkgY29tcHJlc3Npb24tY2FwYWJsZSBydW5zIChzcGVjID49IDUpIG1heSB3cml0ZSBjb21wcmVzc2VkXG4gICAgICAgIC8vIHBheWxvYWRzLiBUaGUgc2VyaWFsaXplciB1c2VzIHpzdGQgd2hlbiBzdXBwb3J0ZWQgYW5kIG1heSB1c2UgZ3ppcC5cbiAgICAgICAgKHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgKTtcblxuICAgICAgYXdhaXQgZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIHdvcmtmbG93Q29udGV4dC5pbnZvY2F0aW9uc1F1ZXVlLFxuICAgICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAnY29tcGxldGVkJyxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAnY29tcGxldGVkJywgb3V0cHV0LCByZXN1bHRUeXBlOiB0eXBlb2YgcmVzdWx0IH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWlsV29ya2Zsb3coZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24gPSB7XG4gICAgd29ya2Zsb3dSdW4sXG4gICAgYXJndW1lbnRDb3VudDogYXJncy5sZW5ndGgsXG4gICAgYXN5bmMgcmVzdW1lKG5leHRFdmVudHMpIHtcbiAgICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlICdzdXNwZW5kZWQnOiB7XG4gICAgICAgICAgLy8gVGhlIGZ1bGwgTyhrbm93biBldmVudHMpIHByZWZpeCBjb21wYXJlIGlzIHJlcXVpcmVkOiB0aGUgcnVudGltZVxuICAgICAgICAgIC8vIHVzdWFsbHkgZ3Jvd3Mgb25lIGFycmF5IGluIHBsYWNlLCBidXQgaXRzIHdhaXQtY29tcGxldGlvbiBhbmRcbiAgICAgICAgICAvLyBzdGFsZS1yZWxvYWQgcGF0aHMgUkVQTEFDRSB0aGUgYXJyYXkgd2l0aCBhIGZyZXNoIGZ1bGwgZmV0Y2gsIHNvXG4gICAgICAgICAgLy8gYSByZXdyaXR0ZW4gcHJlZml4IGlzIGEgcmVhbCBpbnB1dCwgbm90IHBhcmFub2lhLiBUaGUgY29tcGFyZXNcbiAgICAgICAgICAvLyBhcmUgY2hlYXAgc3RyaW5nIGVxdWFsaXR5IGFuZCBkd2FyZmVkIGJ5IHRoZSByZXBsYXkgdGhleSBhdm9pZC5cbiAgICAgICAgICBjb25zdCBrbm93bkV2ZW50cyA9IGV2ZW50c0NvbnN1bWVyLmV2ZW50cztcbiAgICAgICAgICBjb25zdCBpc1N0cmljdEV4dGVuc2lvbiA9XG4gICAgICAgICAgICBuZXh0RXZlbnRzLmxlbmd0aCA+IGtub3duRXZlbnRzLmxlbmd0aCAmJlxuICAgICAgICAgICAga25vd25FdmVudHMuZXZlcnkoXG4gICAgICAgICAgICAgIChldmVudCwgaW5kZXgpID0+IGV2ZW50LmV2ZW50SWQgPT09IG5leHRFdmVudHNbaW5kZXhdLmV2ZW50SWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFpc1N0cmljdEV4dGVuc2lvbikge1xuICAgICAgICAgICAgc3RhdGUgPSB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBpbnRlcnJ1cHRpb24gPSB3aXRoUmVzb2x2ZXJzPG5ldmVyPigpO1xuICAgICAgICAgIHN0YXRlID0geyB0eXBlOiAncnVubmluZycsIGludGVycnVwdGlvbiB9O1xuICAgICAgICAgIHdvcmtmbG93Q29udGV4dC5zdXNwZW5zaW9uR2VuZXJhdGlvbisrO1xuICAgICAgICAgIGV2ZW50c0NvbnN1bWVyLmFwcGVuZChuZXh0RXZlbnRzLnNsaWNlKGtub3duRXZlbnRzLmxlbmd0aCkpO1xuICAgICAgICAgIHJldHVybiB3YWl0Rm9yRXhlY3V0aW9uKGludGVycnVwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmVwbGF5JzpcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICBjYXNlICdydW5uaW5nJzpcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlc3VtZSAke3N0YXRlLnR5cGV9IHdvcmtmbG93IFwiJHt3b3JrZmxvd1J1bi5ydW5JZH1cImBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3RhdGUgc2F0aXNmaWVzIG5ldmVyO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uLFxuICAgIGV4ZWN1dGlvbjogd2FpdEZvckV4ZWN1dGlvbihpbml0aWFsSW50ZXJydXB0aW9uKSxcbiAgfTtcbn1cbiJdfQ==
931
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFFckIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFh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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVSUk9SX1NMVUdTLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsXG4gIHdpdGhSZXNvbHZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuLCBXb3JsZENhcGFiaWxpdGllcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0ICogYXMgbmFub2lkIGZyb20gJ25hbm9pZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBFdmVudENvbnN1bWVyUmVzdWx0LCBFdmVudHNDb25zdW1lciB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVJdGVtIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgRU5PVFNVUCwgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0IH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IGlzRGVsaXZlcnlJZGxlIH0gZnJvbSAnLi9wcml2YXRlLmpzJztcbmltcG9ydCB7IFJlcGxheVBheWxvYWRDYWNoZSB9IGZyb20gJy4vcmVwbGF5LXBheWxvYWQtY2FjaGUuanMnO1xuaW1wb3J0IHsgZ2V0UG9ydExhenkgfSBmcm9tICcuL3J1bnRpbWUvZ2V0LXBvcnQtbGF6eS5qcyc7XG5pbXBvcnQgeyBydW5JZENyZWF0ZWRBdCB9IGZyb20gJy4vcnVudGltZS9ydW4taWQtdGltZS5qcyc7XG5pbXBvcnQgeyBoYW5kbGVTdXNwZW5zaW9uIH0gZnJvbSAnLi9ydW50aW1lL3N1c3BlbnNpb24taGFuZGxlci5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZCB9IGZyb20gJy4vcnVudGltZS93b3JsZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVXb3JrZmxvd1JldHVyblZhbHVlLFxuICBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVVc2VTdGVwIH0gZnJvbSAnLi9zdGVwLmpzJztcbmltcG9ydCB7XG4gIEJPRFlfSU5JVF9TWU1CT0wsXG4gIFNUQUJMRV9VTElELFxuICBXT1JLRkxPV19DUkVBVEVfSE9PSyxcbiAgV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCxcbiAgV09SS0ZMT1dfU0VUX0FUVFJJQlVURVMsXG4gIFdPUktGTE9XX1NMRUVQLFxuICBXT1JLRkxPV19VU0VfU1RFUCxcbn0gZnJvbSAnLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBhcHBseVdvcmtmbG93U3VzcGVuc2lvblRvU3BhbiwgdHJhY2UgfSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1J1blN0cmVhbUlkIH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL3ZtL2luZGV4LmpzJztcbmltcG9ydCB7IHJ1bkNhY2hlZFdvcmtmbG93U2NyaXB0IH0gZnJvbSAnLi92bS9zY3JpcHQtY2FjaGUuanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQWJvcnRTaWduYWxTdGF0aWNzLFxuICBjcmVhdGVDcmVhdGVBYm9ydENvbnRyb2xsZXIsXG59IGZyb20gJy4vd29ya2Zsb3cvYWJvcnQtY29udHJvbGxlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXRBdHRyaWJ1dGVzIH0gZnJvbSAnLi93b3JrZmxvdy9hdHRyaWJ1dGUtZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL3dvcmtmbG93L2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5pbXBvcnQgeyBXT1JLRkxPV19DT05URVhUX1NZTUJPTCB9IGZyb20gJy4vd29ya2Zsb3cvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNyZWF0ZUhvb2sgfSBmcm9tICcuL3dvcmtmbG93L2hvb2suanMnO1xuaW1wb3J0IHsgY3JlYXRlU2xlZXAgfSBmcm9tICcuL3dvcmtmbG93L3NsZWVwLmpzJztcblxuLyoqXG4gKiBEcmFpbiBwZW5kaW5nIHF1ZXVlIGl0ZW1zIGF0IHdvcmtmbG93IGNvbXBsZXRpb24gKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkuXG4gKlxuICogVHJlYXRzIGNvbXBsZXRpb24gYXMgYSBmaW5hbCBzdXNwZW5zaW9uIHNvIHVuYXdhaXRlZCBob29rLCB3YWl0LCBhbmRcbiAqIGF0dHJpYnV0ZSBvcGVyYXRpb25zIGFyZSByZWNvcmRlZCBiZWZvcmUgdGhlIHJ1biBiZWNvbWVzIHRlcm1pbmFsLiBUaGlzXG4gKiBhbHNvIGxldHMgYSBmaW5hbCBgY29udHJvbGxlci5hYm9ydCgpYCByZWFjaCBpbi1mbGlnaHQgc3RlcHMuXG4gKlxuICogSXQgcmVjb3JkcyBgKl9jcmVhdGVkYCBhbmQgbmF0aXZlIGF0dHJpYnV0ZSBldmVudHMsIGJ1dCBuZXZlciBleGVjdXRlcyBzdGVwXG4gKiBib2RpZXM6IGBzdGVwX3N0YXJ0ZWRgIGlzIHJlamVjdGVkIGFmdGVyIHRoZSBydW4gYmVjb21lcyB0ZXJtaW5hbC4gQVxuICogZmlyZS1hbmQtZm9yZ2V0IHN0ZXAgdGhlcmVmb3JlIG5lZWRzIGEgbGF0ZXIgc3VzcGVuc2lvbiB0byBiZSBzY2hlZHVsZWQuXG4gKlxuICogRHJhaW4gZmFpbHVyZXMgZG8gbm90IGNoYW5nZSB0aGUgd29ya2Zsb3cncyB0ZXJtaW5hbCBvdXRjb21lLlxuICovXG5hc3luYyBmdW5jdGlvbiBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICBydW5JZDogc3RyaW5nLFxuICBwZW5kaW5nUXVldWU6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT4sXG4gIHZtR2xvYmFsVGhpczogdHlwZW9mIGdsb2JhbFRoaXMsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgb3V0Y29tZTogJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyxcbiAgLyoqXG4gICAqIEluIHR1cmJvIG1vZGUsIGdhdGVzIGZpbmFsIGAqX2NyZWF0ZWRgIHdyaXRlcyBvbiBiYWNrZ3JvdW5kZWRcbiAgICogYHJ1bl9zdGFydGVkYC4gVW5kZWZpbmVkIHdoZW4gYHJ1bl9zdGFydGVkYCBpcyBhd2FpdGVkLlxuICAgKi9cbiAgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwZW5kaW5nUXVldWUuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuICAvLyBJbXBsaWNpdGx5IGRpc3Bvc2UgYW55IGFib3J0IGhvb2tzIChzeXN0ZW0gaG9va3MpIHRoYXQgYXJlIHN0aWxsIGFsaXZlIGF0XG4gIC8vIHdvcmtmbG93IGNvbXBsZXRpb24gc28gdGhleSBkb24ndCBsZWFrIHJvd3MgaW4gdGhlIGhvb2tzIHRhYmxlIGZvciB0aGVcbiAgLy8gcnVuJ3MgbGlmZXRpbWUuIFNraXAgaG9va3MgdGhhdCBhbHJlYWR5IGhhdmUgYW4gYWJvcnQgaW4gZmxpZ2h0IOKAlCB0aG9zZVxuICAvLyB3aWxsIGVtaXQgaG9va19yZWNlaXZlZCB2aWEgdGhlIGFib3J0IHByb2Nlc3NpbmcgcGF0aC4gVXNlciBob29rc1xuICAvLyAoaXNTeXN0ZW0gIT09IHRydWUpIGFyZSBpbnRlbnRpb25hbGx5IGxlZnQgYWxvbmU6IHRoZWlyIGxpZmV0aW1lIGlzXG4gIC8vIG1hbmFnZWQgYnkgdGhlIHVzZXIncyBjb2RlLCBub3QgdGhlIHJ1bnRpbWUuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwZW5kaW5nUXVldWUudmFsdWVzKCkpIHtcbiAgICBpZiAoXG4gICAgICBpdGVtLnR5cGUgPT09ICdob29rJyAmJlxuICAgICAgaXRlbS5pc1N5c3RlbSAmJlxuICAgICAgIWl0ZW0uZGlzcG9zZWQgJiZcbiAgICAgICFpdGVtLmFib3J0UmVxdWVzdGVkXG4gICAgKSB7XG4gICAgICBpdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKHBlbmRpbmdRdWV1ZSwgdm1HbG9iYWxUaGlzKTtcbiAgICBhd2FpdCBoYW5kbGVTdXNwZW5zaW9uKHtcbiAgICAgIHN1c3BlbnNpb246IHN5bnRoZXNpemVkLFxuICAgICAgd29ybGQsXG4gICAgICBydW46IHdvcmtmbG93UnVuLFxuICAgICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICBgRmFpbGVkIHRvIGRyYWluIHBlbmRpbmcgcXVldWUgaXRlbXMgZm9yICR7b3V0Y29tZX0gd29ya2Zsb3cgcnVuYCxcbiAgICAgIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIG1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbi8qKiBFdmVyeXRoaW5nIG5lZWRlZCB0byBjb2xkLXN0YXJ0IGEgd29ya2Zsb3cgVk0gb3ZlciBhbiBldmVudCBsb2cuICovXG5pbnRlcmZhY2UgV29ya2Zsb3dTZXNzaW9uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHdvcmtmbG93Q29kZTogc3RyaW5nO1xuICByZWFkb25seSB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgcmVwbGF5UGF5bG9hZENhY2hlOiBSZXBsYXlQYXlsb2FkQ2FjaGU7XG4gIHJlYWRvbmx5IHJ1blJlYWR5QmFycmllcj86IFByb21pc2U8dW5rbm93bj47XG4gIHJlYWRvbmx5IHdvcmxkQ2FwYWJpbGl0aWVzPzogV29ybGRDYXBhYmlsaXRpZXM7XG59XG5cbi8qKlxuICogQSBsaXZlIHdvcmtmbG93IFZNLCBwYXJrZWQgYXQgYSBzdXNwZW5zaW9uIGJvdW5kYXJ5LiBgcmVzdW1lYCBhZHZhbmNlcyBpdFxuICogYnkgYXBwZW5kaW5nIGV2ZW50cyBpbnN0ZWFkIG9mIHJlcGxheWluZyBmcm9tIHNjcmF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICByZWFkb25seSBhcmd1bWVudENvdW50OiBudW1iZXI7XG4gIHJlc3VtZShldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPFdvcmtmbG93UmVzdW1lUmVzdWx0Pjtcbn1cblxuLyoqIEEgZmluaXNoZWQgZXhlY3V0aW9uIGF0dGVtcHQ6IHRoZSB3b3JrZmxvdydzIG91dHB1dCBvciBhIGxpdmUgYm91bmRhcnkuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2NvbXBsZXRlZCc7XG4gICAgICByZWFkb25seSBvdXRwdXQ6IHVua25vd247XG4gICAgICAvKiogYHR5cGVvZmAgdGhlIHJhdyByZXR1cm4gdmFsdWUsIGZvciB0ZWxlbWV0cnkuICovXG4gICAgICByZWFkb25seSByZXN1bHRUeXBlOiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdzdXNwZW5kZWQnO1xuICAgICAgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uO1xuICAgICAgcmVhZG9ubHkgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uO1xuICAgICAgLyoqXG4gICAgICAgKiBFdmVudHMgdGhlIHJlcGxheSB3YWxrZWQgcGFzdCB1bmNsYWltZWQgYW5kIGlzIHN0aWxsIGhvbGRpbmcsIGlmIGFueS5cbiAgICAgICAqIE9yZGluYXJ5IG9uIGEgc3VzcGVuc2lvbiwgYW5kIG9ubHkgYWN0aW9uYWJsZSBhY3Jvc3MgYSBydW4nc1xuICAgICAgICogc3VzcGVuc2lvbnMsIHNvIGl0IGlzIHJlcG9ydGVkIGZvciB0ZWxlbWV0cnkgcmF0aGVyIHRoYW4gYWN0ZWQgb24gaGVyZS5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcGFya2VkPzoge1xuICAgICAgICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGV2ZW50VHlwZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9O1xuXG4vKipcbiAqIGByZXN1bWVgIGNhbiBhZGRpdGlvbmFsbHkgZGVjbGluZSDigJQgYHsgdHlwZTogJ3JlcGxheScgfWAgbWVhbnMgXCJ0aGlzXG4gKiBzZXNzaW9uIGlzIHVudXNhYmxlLCBjb2xkLXJlcGxheSBpbnN0ZWFkXCIuIEEgZnJlc2ggcmVwbGF5IG5ldmVyIGRlY2xpbmVzLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VtZVJlc3VsdCA9IFdvcmtmbG93UmVzdWx0IHwgeyByZWFkb25seSB0eXBlOiAncmVwbGF5JyB9O1xuXG4vKiogVGhlIHNlc3Npb24ncyBwcml2YXRlIHN0YXRlIG1hY2hpbmUuICovXG50eXBlIFdvcmtmbG93U2Vzc2lvblN0YXRlID1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAncnVubmluZyc7XG4gICAgICByZWFkb25seSBpbnRlcnJ1cHRpb246IFByb21pc2VXaXRoUmVzb2x2ZXJzPG5ldmVyPjtcbiAgICB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnc3VzcGVuZGVkJzsgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdyZXBsYXknIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdjb21wbGV0ZWQnIH07XG5cbi8qKiBDb2xkLXN0YXJ0OiBidWlsZCBhIGZyZXNoIFZNIHNlc3Npb24gYW5kIHJlcGxheSBpdCBvdmVyIGBldmVudHNgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVdvcmtmbG93KFxuICBvcHRpb25zOiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zXG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0PiB7XG4gIHJldHVybiB0cmFjZUV4ZWN1dGlvbihcbiAgICAncmVwbGF5JyxcbiAgICBvcHRpb25zLndvcmtmbG93UnVuLFxuICAgIG9wdGlvbnMuZXZlbnRzLFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb24sIGV4ZWN1dGlvbiB9ID0gYXdhaXQgY3JlYXRlV29ya2Zsb3dTZXNzaW9uKG9wdGlvbnMpO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZWNvcmRSZXN1bHQoYXdhaXQgZXhlY3V0aW9uLCBzcGFuKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKiBXYXJtLXN0YXJ0OiBhZHZhbmNlIGEgcmV0YWluZWQgc2Vzc2lvbiBieSBhcHBlbmRpbmcgZXZlbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZVdvcmtmbG93KFxuICBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24sXG4gIGV2ZW50czogRXZlbnRbXVxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VtZVJlc3VsdD4ge1xuICByZXR1cm4gdHJhY2VFeGVjdXRpb24oXG4gICAgJ3JldGFpbmVkJyxcbiAgICBzZXNzaW9uLndvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb24ucmVzdW1lKGV2ZW50cyk7XG4gICAgICByZXR1cm4gcmVzdWx0LnR5cGUgPT09ICdyZXBsYXknID8gcmVzdWx0IDogcmVjb3JkUmVzdWx0KHJlc3VsdCwgc3Bhbik7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiB0cmFjZUV4ZWN1dGlvbjxUPihcbiAgbW9kZTogJ3JlcGxheScgfCAncmV0YWluZWQnLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgZm46IChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHRyYWNlKGB3b3JrZmxvdy5ydW4gJHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9YCwgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHdvcmtmbG93UnVuLnJ1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQoZXZlbnRzLmxlbmd0aCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFeGVjdXRpb25Nb2RlKG1vZGUpLFxuICAgIH0pO1xuICAgIHJldHVybiBmbihzcGFuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZFJlc3VsdChcbiAgcmVzdWx0OiBXb3JrZmxvd1Jlc3VsdCxcbiAgc3BhbjogU3BhbiB8IHVuZGVmaW5lZFxuKTogV29ya2Zsb3dSZXN1bHQge1xuICBpZiAocmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSZXN1bHRUeXBlKHJlc3VsdC5yZXN1bHRUeXBlKSxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChzcGFuKSB7XG4gICAgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4ocmVzdWx0LnN1c3BlbnNpb24sIHNwYW4pO1xuICAgIC8vIEV2ZW50cyB0aGlzIHBhc3Mgd2Fsa2VkIHBhc3QgdW5jbGFpbWVkIGFuZCBpcyBzdGlsbCBob2xkaW5nLiBPcmRpbmFyeSBvblxuICAgIC8vIGEgc3VzcGVuc2lvbjogYW4gb3V0LW9mLWJhbmQgZGVsaXZlcnkgdGhhdCBsYW5kZWQgYWhlYWQgb2YgdGhlIGNvZGUgdGhhdFxuICAgIC8vIHJlYWRzIGl0IHdhaXRzIGZvciB0aGUgcGFzcyB0aGF0IHJlYWNoZXMgdGhhdCBjb2RlLCBhbmQgZmFpbGluZyBoZXJlXG4gICAgLy8gd291bGQgZmFpbCBleGFjdGx5IHRoZSBydW5zIHRoYXQgdG9sZXJhbmNlIGV4aXN0cyBmb3IuIFRoZSBjYXNlIHRoYXQgaXNcbiAgICAvLyBub3Qgb3JkaW5hcnkg4oCUIHRoZSBzYW1lIGV2ZW50IHN0aWxsIGhlbGQgcGFzcyBhZnRlciBwYXNzIOKAlCBpcyBhIHNoYXBlXG4gICAgLy8gYWNyb3NzIHRoZXNlIHNwYW5zLCB3aGljaCBpcyB3aHkgdGhlIGV2ZW50SWQgaXMgb24gZWFjaCBvbmUgYW5kIG5vIHBhc3NcbiAgICAvLyB0cmllcyB0byBydWxlIG9uIGl0IGFsb25lLlxuICAgIGlmIChyZXN1bHQucGFya2VkKSB7XG4gICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudHNDb3VudChyZXN1bHQucGFya2VkLmNvdW50KSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRJZChyZXN1bHQucGFya2VkLmV2ZW50SWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudFR5cGUocmVzdWx0LnBhcmtlZC5ldmVudFR5cGUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2luZ2xlLXNob3QgcmVwbGF5OiBleGVjdXRlIHRoZSB3b3JrZmxvdyBvdmVyIGBldmVudHNgIGFuZCBlaXRoZXIgcmV0dXJuXG4gKiBpdHMgb3V0cHV0IG9yIHRocm93IGl0cyBzdXNwZW5zaW9uLiBLZXB0IGZvciB0aGUgZXh0ZW5zaXZlIGV4aXN0aW5nIHRlc3RcbiAqIHN1aXRlcyDigJQgcHJvZHVjdGlvbiBjb2RlIGdvZXMgdGhyb3VnaCBgcmVwbGF5V29ya2Zsb3dgL2ByZXN1bWVXb3JrZmxvd2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvdyhcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICAvKipcbiAgICogT3B0aW9uYWwgcGVyLXJ1biBjYWNoZSBmb3IgcmVwbGF5IHBheWxvYWQgcHJlcGFyYXRpb24gYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIE93bmVkIGJ5IHRoZSBpbmxpbmUgZXhlY3V0aW9uIGxvb3AgZm9yIHRoaXMgaW52b2NhdGlvbi5cbiAgICovXG4gIHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICBlbmNyeXB0aW9uS2V5XG4gICksXG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuXG4gICAqIFRocmVhZGVkIGludG8gdGhlIGVuZC1vZi1ydW4gZHJhaW4gc28gZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgIHdyaXRlc1xuICAgKiBjb21taXR0ZWQgYXQgd29ya2Zsb3cgY29tcGxldGlvbiBvcmRlciBhZnRlciB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZFxuICAgKiBvdXRzaWRlIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+LFxuICAvKipcbiAgICogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gTWlzc2luZ1xuICAgKiBjYXBhYmlsaXRpZXMgYXJlIHRyZWF0ZWQgYXMgdW5zdXBwb3J0ZWQuXG4gICAqL1xuICB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVdvcmtmbG93KHtcbiAgICB3b3JrZmxvd0NvZGUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICAgIHJ1blJlYWR5QmFycmllcixcbiAgICB3b3JsZENhcGFiaWxpdGllcyxcbiAgfSk7XG4gIGlmIChyZXN1bHQudHlwZSA9PT0gJ3N1c3BlbmRlZCcpIHRocm93IHJlc3VsdC5zdXNwZW5zaW9uO1xuICByZXR1cm4gcmVzdWx0Lm91dHB1dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ya2Zsb3dTZXNzaW9uKHtcbiAgd29ya2Zsb3dDb2RlLFxuICB3b3JrZmxvd1J1bixcbiAgZXZlbnRzLFxuICBlbmNyeXB0aW9uS2V5LFxuICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gIHJ1blJlYWR5QmFycmllcixcbiAgd29ybGRDYXBhYmlsaXRpZXMsXG59OiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zKTogUHJvbWlzZTx7XG4gIHNlc3Npb246IFdvcmtmbG93U2Vzc2lvbjtcbiAgZXhlY3V0aW9uOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0Pjtcbn0+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0O1xuICBpZiAoIXN0YXJ0ZWRBdCkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgIGBXb3JrZmxvdyBydW4gXCIke3dvcmtmbG93UnVuLnJ1bklkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcCAoc2hvdWxkIG5vdCBoYXBwZW4pYFxuICAgICk7XG4gIH1cblxuICAvLyBTZWVkIGFuZCBpbml0aWFsIGNsb2NrIG11c3QgYmUgYXZhaWxhYmxlIGJlZm9yZSBJL08gYW5kIHJlbWFpbiBzdGFibGUgb25cbiAgLy8gcmVwbGF5LiBBZnRlciB0aGUgZmlyc3QgZXZlbnQsIEV2ZW50c0NvbnN1bWVyIGFkdmFuY2VzIHRoZSBWTSBjbG9jayBmcm9tXG4gIC8vIGVhY2ggZXZlbnQncyBgY3JlYXRlZEF0YC5cbiAgY29uc3QgZml4ZWRUaW1lc3RhbXAgPVxuICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/PyArd29ya2Zsb3dSdW4uY3JlYXRlZEF0O1xuXG4gIC8vIFRydXRoaW5lc3MsIG5vdCBwcmVzZW5jZTogYHZlcmNlbCBlbnYgcHVsbGAgd3JpdGVzIGBWRVJDRUxfVVJMPVwiXCJgIGludG9cbiAgLy8gYC5lbnYubG9jYWxgLCBhbmQgYSBmcmFtZXdvcmsgdGhhdCBsb2FkcyB0aGF0IGZpbGUgbG9jYWxseSB3b3VsZCBvdGhlcndpc2VcbiAgLy8gcHV0IHVzIG9uIHRoZSBWZXJjZWwgYnJhbmNoIHdpdGggbm90aGluZyB0byBidWlsZCBhIGhvc3QgZnJvbSwgbWFraW5nXG4gIC8vIGBodHRwczovL2AgdGhlIGJhc2UgVVJMIG9mIGV2ZXJ5IHJ1bi5cbiAgY29uc3QgaXNWZXJjZWwgPSBCb29sZWFuKHByb2Nlc3MuZW52LlZFUkNFTF9VUkwpO1xuICAvLyBMb2FkIGdldFBvcnQgbGF6aWx5IHRvIHByZXZlbnQgVHVyYm9wYWNrIGZyb20gdHJhY2luZyBnZXQtcG9ydCdzXG4gIC8vIGZzIG9wcyAocmVhZGRpciwgcmVhZEZpbGUpIGludG8gdGhlIGZsb3cgcm91dGUgYnVuZGxlLiBUaGUgcmVzb2x2ZWRcbiAgLy8gcG9ydCBpcyBjYWNoZWQgcGVyIHByb2Nlc3MgKHNlZSBnZXQtcG9ydC1sYXp5LnRzKSwgc28gdGhpcyBpcyBjaGVhcFxuICAvLyBvbiByZXBsYXlzIGFmdGVyIHRoZSBmaXJzdC5cbiAgY29uc3Qgd29ya2Zsb3dCYXNlVXJsID0gY3JlYXRlV29ya2Zsb3dCYXNlVXJsKFxuICAgIGlzVmVyY2VsXG4gICAgICA/IGBodHRwczovLyR7cHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTH1gXG4gICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7KGF3YWl0IGdldFBvcnRMYXp5KCkpID8/IDMwMDB9YFxuICApO1xuXG4gIGNvbnN0IHtcbiAgICBjb250ZXh0LFxuICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICB1cGRhdGVUaW1lc3RhbXAsXG4gIH0gPSBjcmVhdGVDb250ZXh0KHtcbiAgICBzZWVkOiBgJHt3b3JrZmxvd1J1bi5ydW5JZH06JHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9OiR7d29ya2Zsb3dSdW4uZGVwbG95bWVudElkfWAsXG4gICAgZml4ZWRUaW1lc3RhbXAsXG4gIH0pO1xuXG4gIGNvbnN0IGluaXRpYWxJbnRlcnJ1cHRpb24gPSB3aXRoUmVzb2x2ZXJzPG5ldmVyPigpO1xuICBsZXQgc3RhdGU6IFdvcmtmbG93U2Vzc2lvblN0YXRlID0ge1xuICAgIHR5cGU6ICdydW5uaW5nJyxcbiAgICBpbnRlcnJ1cHRpb246IGluaXRpYWxJbnRlcnJ1cHRpb24sXG4gIH07XG5cbiAgY29uc3Qgb25Xb3JrZmxvd0Vycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgY2FzZSAncnVubmluZyc6IHtcbiAgICAgICAgY29uc3QgeyBpbnRlcnJ1cHRpb24gfSA9IHN0YXRlO1xuICAgICAgICBzdGF0ZSA9IFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnJvcilcbiAgICAgICAgICA/IHsgdHlwZTogJ3N1c3BlbmRlZCcsIHN1c3BlbnNpb246IGVycm9yIH1cbiAgICAgICAgICA6IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgLy8gRWFjaCBwYXJrZWQgc3RlcCBjb25zdW1lciBzY2hlZHVsZXMgaXRzIG93biAoaWRlbnRpY2FsKSBzdXNwZW5zaW9uXG4gICAgICAgIC8vIHNpZ25hbDsgdGhlIGZpcnN0IG9uZSBsYW5kcyBoZXJlLCBhbmQgYnVtcGluZyB0aGUgZ2VuZXJhdGlvbiBtYWtlc1xuICAgICAgICAvLyB0aGUgc3RlcC1jb25zdW1lciBndWFyZCBkcm9wIHRoZSByZXN0IGF0IGZpcmUgdGltZS5cbiAgICAgICAgd29ya2Zsb3dDb250ZXh0LnN1c3BlbnNpb25HZW5lcmF0aW9uKys7XG4gICAgICAgIGludGVycnVwdGlvbi5yZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdzdXNwZW5kZWQnOlxuICAgICAgICAvLyBTYW1lLWJvdW5kYXJ5IGR1cGxpY2F0ZXMgd2VyZSBzdGFsZWQgYnkgdGhlIGdlbmVyYXRpb24gYnVtcCBhYm92ZSxcbiAgICAgICAgLy8gc28gYW55dGhpbmcgbGFuZGluZyBoZXJlIGlzIG91dC1vZi1iYW5kIOKAlCBhbiB1bmd1YXJkZWQgc2xlZXAvaG9vay9cbiAgICAgICAgLy8gYXR0cmlidXRlIHNpZ25hbCBvciBhIGRpdmVyZ2VuY2UuIFRob3NlIGJvdW5kYXJpZXMgYXJlIHVucmV0YWluYWJsZVxuICAgICAgICAvLyAodGhlIHJ1bnRpbWUgZGVtb3RlcyB0aGVtIHRvbyksIHNvIGZhbGwgYmFjayB0byByZXBsYXkuXG4gICAgICAgIHN0YXRlID0geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdyZXBsYXknOlxuICAgICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZSBzYXRpc2ZpZXMgbmV2ZXI7XG4gIH07XG5cbiAgY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gdm1HbG9iYWxUaGlzLk1hdGgucmFuZG9tKCkpO1xuICAvLyBDb3JyZWxhdGlvbiBJRHMgbXVzdCBiZSByZXBsYXktc3RhYmxlLiBgc3RhcnRlZEF0YCBkaWZmZXJzIGJldHdlZW4gYSB0dXJib1xuICAvLyBkZWxpdmVyeSBhbmQgYSBsYXRlciBzZXJ2ZXItYmFja2VkIHJlcGxheSwgc28gdXNlIGZpeGVkVGltZXN0YW1wLlxuICBjb25zdCBnZW5lcmF0ZVVsaWQgPSAoKSA9PiB1bGlkKGZpeGVkVGltZXN0YW1wKTtcbiAgY29uc3QgZ2VuZXJhdGVOYW5vaWQgPSBuYW5vaWQuY3VzdG9tUmFuZG9tKG5hbm9pZC51cmxBbHBoYWJldCwgMjEsIChzaXplKSA9PlxuICAgIG5ldyBVaW50OEFycmF5KHNpemUpLm1hcCgoKSA9PiAyNTYgKiB2bUdsb2JhbFRoaXMuTWF0aC5yYW5kb20oKSlcbiAgKTtcblxuICAvLyBDcmVhdGUgYSBtdXRhYmxlIGhvbGRlciBmb3IgdGhlIHByb21pc2UgcXVldWUgc28gdGhlIEV2ZW50c0NvbnN1bWVyXG4gIC8vIGNhbiBhY2Nlc3MgdGhlIGN1cnJlbnQgcXVldWUgc3RhdGUgdmlhIGEgZ2V0dGVyLiBUaGUgcXVldWUgaXMgbXV0YXRlZFxuICAvLyBieSBzdGVwL2hvb2svc2xlZXAgY2FsbGJhY2tzIGFzIGV2ZW50cyBhcmUgcHJvY2Vzc2VkLlxuICBjb25zdCBwcm9taXNlUXVldWVIb2xkZXIgPSB7IGN1cnJlbnQ6IFByb21pc2UucmVzb2x2ZSgpIH07XG5cbiAgLy8gU2FtZSByZWFzb24gYXMgdGhlIHF1ZXVlIGhvbGRlcjogdGhlIGNvbnN1bWVyIGlzIGJ1aWx0IGJlZm9yZSB0aGUgY29udGV4dFxuICAvLyB3aG9zZSBkZWxpdmVyeSBzdGF0ZSBpdCBoYXMgdG8gcmVhZC4gSWRsZSB1bnRpbCB0aGUgY29udGV4dCBleGlzdHMsIHdoaWNoXG4gIC8vIGlzIGJlZm9yZSBhbnkgZGVsaXZlcnkgY2FuIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCBpdC5cbiAgY29uc3QgZGVsaXZlcnlJZGxlSG9sZGVyID0geyBjdXJyZW50OiAoKTogYm9vbGVhbiA9PiB0cnVlIH07XG5cbiAgLy8gVGhlIFZNIGNsb2NrIG9ubHkgZXZlciBtb3ZlcyBmb3J3YXJkLiBDb25zdW1wdGlvbiBvcmRlciBpcyBsb2cgb3JkZXIgZm9yXG4gIC8vIGV2ZXJ5dGhpbmcgd2hvc2Ugb3JkZXIgdGhlIHJlcGxheSBkZWNpZGVzLCBidXQgYW4gZXZlbnQgdGhlIGNvbnN1bWVyXG4gIC8vIHBhcmtlZCBpcyBkZWxpdmVyZWQgYWZ0ZXIgdGhlIHdhbGsgaGFzIGFscmVhZHkgcGFzc2VkIGV2ZW50cyB3cml0dGVuIGFmdGVyXG4gIC8vIGl0LCBhbmQgbGV0dGluZyBpdHMgYGNyZWF0ZWRBdGAgc2V0IHRoZSBjbG9jayB3b3VsZCBtYWtlIGBEYXRlLm5vdygpYCBnb1xuICAvLyBiYWNrd2FyZHMgaW5zaWRlIGEgc2luZ2xlIHJlcGxheS5cbiAgbGV0IGNsb2NrID0gZml4ZWRUaW1lc3RhbXA7XG5cbiAgY29uc3QgZXZlbnRzQ29uc3VtZXIgPSBuZXcgRXZlbnRzQ29uc3VtZXIoZXZlbnRzLCB7XG4gICAgb25Db25zdW1lZEV2ZW50OiAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGF0ID0gK2V2ZW50LmNyZWF0ZWRBdDtcbiAgICAgIGlmIChhdCA+IGNsb2NrKSB7XG4gICAgICAgIGNsb2NrID0gYXQ7XG4gICAgICAgIHVwZGF0ZVRpbWVzdGFtcChhdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50KSA9PiB7XG4gICAgICBvbldvcmtmbG93RXJyb3IoXG4gICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgYFJlcGxheSBjb3VsZCBub3QgY29uc3VtZSBldmVudDogZXZlbnRUeXBlPSR7ZXZlbnQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke2V2ZW50LmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7ZXZlbnQuZXZlbnRJZH0uYCxcbiAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG4gICAgLy8gQm90aCBicmFuY2hlcyBsb2cgYXQgYGRlYnVnYCwgc28gbmVpdGhlciByZWFjaGVzIHRoZSBjb25zb2xlIHVubGVzc1xuICAgIC8vIGBERUJVR2AgbWF0Y2hlcy4gQSBkdXBsaWNhdGUgaXMgYSBwZXJtYW5lbnQgZmVhdHVyZSBvZiB0aGUgbG9nOiBldmVyeVxuICAgIC8vIGxhdGVyIHJlcGxheSByZS1yZWFkcyBpdCBhbmQgbGFuZHMgaGVyZSBhZ2Fpbiwgc28gYW55dGhpbmcgdGhlIGxvZ2dlclxuICAgIC8vIHByaW50cyB1bmNvbmRpdGlvbmFsbHkgd291bGQgcHJpbnQgb25jZSBwZXIgcmVwbGF5IGZvciB0aGUgbGlmZSBvZiB0aGVcbiAgICAvLyBydW4uIFRoZXJlIGlzIGFsc28gbm90aGluZyB0byBhY3Qgb24uIElnbm9yaW5nIHRoZSBldmVudCBpcyB0aGUgY29ycmVjdFxuICAgIC8vIG91dGNvbWUsIG5vdCBhIGRlZ3JhZGVkIG9uZSwgYW5kIG5vIHVzZXIgY2hhbmdlIG1ha2VzIHRoZSBzdHJhZ2dsZXIgZ29cbiAgICAvLyBhd2F5LiBXaGF0IHRoZSBsZXZlbHMgYXJlIGZvciBpcyBkaWFnbm9zaXMgYWZ0ZXIgdGhlIGZhY3QsIHdoaWNoIGlzXG4gICAgLy8gZXhhY3RseSB3aGF0IGBERUJVRz13b3JrZmxvdzpydW50aW1lOmRlYnVnYCBpcyBmb3IuXG4gICAgb25EdXBsaWNhdGVFdmVudDogKGV2ZW50LCBmaXJzdEV2ZW50VHlwZSkgPT4ge1xuICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBmaXJzdEV2ZW50VHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgIH07XG4gICAgICBpZiAoZmlyc3RFdmVudFR5cGUgIT09IGV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgICAvLyBUd28gd3JpdGVycyByZWFjaGVkIG9wcG9zaXRlIGNvbmNsdXNpb25zIGFib3V0IG9uZSBlbnRpdHk6IGFcbiAgICAgICAgLy8gYHN0ZXBfZmFpbGVkYCBiZWhpbmQgYSBgc3RlcF9jb21wbGV0ZWRgLCBvciB0aGUgcmV2ZXJzZS4gSWdub3JpbmcgaXRcbiAgICAgICAgLy8gaXMgc3RpbGwgY29ycmVjdCBhbmQgc3RpbGwgZGV0ZXJtaW5pc3RpYyAocmVwbGF5IHJlYWRzIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgLy8gYXQgdGhlIHNhbWUgcG9zaXRpb24gZXZlcnkgdGltZSksIGJ1dCB1bmxpa2UgYSByZS1jb21taXQgb2YgdGhlIHNhbWVcbiAgICAgICAgLy8gb3V0Y29tZSB0aGVyZSBpcyBubyByZWFkaW5nIG9mIHRoaXMgd2hlcmUgYm90aCB3cml0ZXJzIHdlcmUgcmlnaHQsXG4gICAgICAgIC8vIHNvIHRoZSBkaXNjYXJkZWQgb3V0Y29tZSBnZXRzIGl0cyBvd24gbWVzc2FnZS5cbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAnSWdub3JpbmcgaW5lcnQgZXZlbnQgdGhhdCBkZWNpZGVzIGFuIGFscmVhZHktZGVjaWRlZCBvdXRjb21lIGRpZmZlcmVudGx5JyxcbiAgICAgICAgICBkZXRhaWxzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBmaXJzdCBldmVudCBvZiB0aGlzIGNsYXNzIGRlY2lkZWQgdGhlIG91dGNvbWUgYXQgYSBsb3dlciBsb2dcbiAgICAgIC8vIHBvc2l0aW9uIGFuZCByZXBsYXkgcmVhZHMgdGhhdCBvbmUuIFJlY29yZGVkIGJlY2F1c2UgYSBzdHJhZ2dsZXIgaXNcbiAgICAgIC8vIHN0aWxsIGV2aWRlbmNlIG9mIHR3byByZXBsYXlzIHdyaXRpbmcgZm9yIHRoZSBzYW1lIGVudGl0eSwgd2hpY2ggaXNcbiAgICAgIC8vIHdvcnRoIHNlZWluZyB3aGVuIGRpYWdub3NpbmcgYSBydW4uXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAnSWdub3JpbmcgaW5lcnQgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nJyxcbiAgICAgICAgZGV0YWlsc1xuICAgICAgKTtcbiAgICB9LFxuICAgIGdldFByb21pc2VRdWV1ZTogKCkgPT4gcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQsXG4gICAgaXNEZWxpdmVyeUlkbGU6ICgpID0+IGRlbGl2ZXJ5SWRsZUhvbGRlci5jdXJyZW50KCksXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtmbG93Q29udGV4dDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0ID0ge1xuICAgIHJ1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzLFxuICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICBvbldvcmtmbG93RXJyb3IsXG4gICAgZXZlbnRzQ29uc3VtZXIsXG4gICAgZ2VuZXJhdGVVbGlkLFxuICAgIGdlbmVyYXRlTmFub2lkLFxuICAgIGludm9jYXRpb25zUXVldWU6IG5ldyBNYXAoKSxcbiAgICAvLyBVc2UgZ2V0dGVyL3NldHRlciBzbyB0aGUgRXZlbnRzQ29uc3VtZXIncyBnZXRQcm9taXNlUXVldWUoKSBhbHdheXNcbiAgICAvLyBzZWVzIHRoZSBsYXRlc3QgcXVldWUgc3RhdGUgYXMgaXQncyBtdXRhdGVkIGJ5IHN0ZXAvaG9vay9zbGVlcCBjYWxsYmFja3MuXG4gICAgZ2V0IHByb21pc2VRdWV1ZSgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUXVldWVIb2xkZXIuY3VycmVudDtcbiAgICB9LFxuICAgIHNldCBwcm9taXNlUXVldWUodmFsdWU6IFByb21pc2U8dm9pZD4pIHtcbiAgICAgIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50ID0gdmFsdWU7XG4gICAgfSxcbiAgICBwZW5kaW5nRGVsaXZlcmllczogMCxcbiAgICBzdXNwZW5zaW9uR2VuZXJhdGlvbjogMCxcbiAgICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyczogbmV3IE1hcCgpLFxuICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgfTtcblxuICBkZWxpdmVyeUlkbGVIb2xkZXIuY3VycmVudCA9ICgpID0+IGlzRGVsaXZlcnlJZGxlKHdvcmtmbG93Q29udGV4dCk7XG5cbiAgLy8gQ29uc3VtZSBydW4gbGlmZWN5Y2xlIGV2ZW50cyAtIHRoZXNlIGFyZSBzdHJ1Y3R1cmFsIGV2ZW50cyB0aGF0IGRvbid0XG4gIC8vIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgd29ya2Zsb3csIGJ1dCBtdXN0IGJlIGNvbnN1bWVkIHRvIGFkdmFuY2VcbiAgLy8gcGFzdCB0aGVtIGluIHRoZSBldmVudCBsb2dcbiAgbGV0IGNvbnN1bWVkUnVuU3RhcnRlZCA9IGZhbHNlO1xuICB3b3JrZmxvd0NvbnRleHQuZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgIH1cblxuICAgIC8vIENvbnN1bWUgcnVuX2NyZWF0ZWQgLSBldmVyeSBydW4gaGFzIGV4YWN0bHkgb25lXG4gICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJykge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZSB0aGUgZmlyc3QgcnVuX3N0YXJ0ZWQuIFR3byByZXBsYXlzIGNhbiBlYWNoIHdyaXRlIG9uZSAodGhlXG4gICAgLy8gY3JlYXRlIGlzIGlkZW1wb3RlbnQgZm9yIGEgcnVuIGFscmVhZHkgcnVubmluZywgd2hpY2ggbWFrZXMgdGhlIHdyaXRlXG4gICAgLy8gc2FmZSwgbm90IHNpbmdsZS1zaG90KTsgdGhlIGZpcnN0IGlzIHRoZSBvbmUgdGhlIHJlcGxheSBvYnNlcnZlcywgYW5kXG4gICAgLy8gdGhlIGNvbnN1bWVyIHNraXBzIHRoZSByZXN0IHJhdGhlciB0aGFuIGFkdmFuY2luZyB0aGUgd29ya2Zsb3cgY2xvY2tcbiAgICAvLyB0d2ljZS5cbiAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICBpZiAoY29uc3VtZWRSdW5TdGFydGVkKSB7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuICAgICAgY29uc3VtZWRSdW5TdGFydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgIH1cblxuICAgIC8vIEF0dHJpYnV0ZSB3cml0ZXMgcGVyZm9ybWVkIGZyb20gYSBzdGVwIGhhdmUgbm8gd29ya2Zsb3ctYm9keSBjYWxsIHRvXG4gICAgLy8gY29uc3VtZSB0aGVtIGR1cmluZyByZXBsYXk7IHRoZXkgYXJlIGFscmVhZHkgcmVmbGVjdGVkIGluIHRoZSBydW5cbiAgICAvLyBzbmFwc2hvdCBhbmQgcmVtYWluIHN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkLlxuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJlxuICAgICAgZXZlbnQuZXZlbnREYXRhLndyaXRlci50eXBlID09PSAnc3RlcCdcbiAgICApIHtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgIH1cblxuICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICB9KTtcblxuICBjb25zdCB1c2VTdGVwID0gY3JlYXRlVXNlU3RlcCh3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBjcmVhdGVIb29rID0gY3JlYXRlQ3JlYXRlSG9vayh3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBzbGVlcCA9IGNyZWF0ZVNsZWVwKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSBjcmVhdGVTZXRBdHRyaWJ1dGVzKHdvcmtmbG93Q29udGV4dCk7XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19VU0VfU1RFUF0gPSB1c2VTdGVwO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX1NFVF9BVFRSSUJVVEVTXSA9IHNldEF0dHJpYnV0ZXM7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfQ1JFQVRFX0hPT0tdID0gY3JlYXRlSG9vaztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19TTEVFUF0gPSBzbGVlcDtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19HRVRfU1RSRUFNX0lEXSA9IChuYW1lc3BhY2U/OiBzdHJpbmcpID0+XG4gICAgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCh3b3JrZmxvd1J1bi5ydW5JZCwgbmFtZXNwYWNlKTtcblxuICAvLyBGb3IgdGhlIHdvcmtmbG93IFZNLCB3ZSBzdG9yZSB0aGUgY29udGV4dCBpbiBhIHN5bWJvbCBvbiB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdFxuICBjb25zdCBjdHg6IFdvcmtmbG93TWV0YWRhdGEgPSB7XG4gICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyB2bUdsb2JhbFRoaXMuRGF0ZSgrc3RhcnRlZEF0KSxcbiAgICB1cmw6IHdvcmtmbG93QmFzZVVybCxcbiAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgfTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0NPTlRFWFRfU1lNQk9MXSA9IGN0eDtcbiAgLy8gU2VyaWFsaXphdGlvbiBtaW50cyBzdHJlYW0gaWRzIHRocm91Z2ggdGhpcyBzeW1ib2wsIGFuZCBjYWxscyBpdCB3aXRoIG5vXG4gIC8vIHNlZWQgdGltZS4gYG1vbm90b25pY0ZhY3RvcnlgIHJldHVybnMgYGVuY29kZVRpbWUobGFzdFRpbWUpYCBvbiBpdHNcbiAgLy8gaW5jcmVtZW50IGJyYW5jaCwgc28gb25lIHN1Y2ggY2FsbCBsYXRjaGVzIHRoZSAqaG9zdCogd2FsbCBjbG9jayBpbnRvXG4gIC8vIGBsYXN0VGltZWAsIGFuZCBldmVyeSBpZCB0aGUgcnVuIG1pbnRzIGFmdGVyd2FyZHMgY2FycmllcyB0aGF0IHRpbWVzdGFtcFxuICAvLyBpbnN0ZWFkIG9mIGBmaXhlZFRpbWVzdGFtcGAsIGEgdmFsdWUgdGhhdCBkaWZmZXJzIG9uIGV2ZXJ5IHJlcGxheS4gQmluZGluZ1xuICAvLyB0aGUgc2VlZCB0aW1lIGhlcmUga2VlcHMgdGhlIHdob2xlIHJ1biBvbiBvbmUgcmVwbGF5LXN0YWJsZSBjbG9jay5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tTVEFCTEVfVUxJRF0gPSBnZW5lcmF0ZVVsaWQ7XG5cbiAgLy8gV29ya2Zsb3cgY29kZSBtdXN0IGltcG9ydCB0aGUgZGV0ZXJtaW5pc3RpYyBgZmV0Y2hgIHN0ZXAgZnJvbSBgd29ya2Zsb3dgLlxuICB2bUdsb2JhbFRoaXMuZmV0Y2ggPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IHZtR2xvYmFsVGhpcy5FcnJvcihcbiAgICAgIGBHbG9iYWwgXCJmZXRjaFwiIGlzIHVuYXZhaWxhYmxlIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gVXNlIHRoZSBcImZldGNoXCIgc3RlcCBmdW5jdGlvbiBmcm9tIFwid29ya2Zsb3dcIiB0byBtYWtlIEhUVFAgcmVxdWVzdHMuXFxuXFxuTGVhcm4gbW9yZTogaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2Vyci8ke0VSUk9SX1NMVUdTLkZFVENIX0lOX1dPUktGTE9XX0ZVTkNUSU9OfWBcbiAgICApO1xuICB9O1xuXG4gIC8vIE92ZXJyaWRlIHRpbWVvdXQvaW50ZXJ2YWwgZnVuY3Rpb25zIHRvIHRocm93IGhlbHBmdWwgZXJyb3JzXG4gIC8vIFRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgcmVseSBvblxuICAvLyBhc3luY2hyb25vdXMgc2NoZWR1bGluZyB3aGljaCBicmVha3MgZGV0ZXJtaW5pc3RpYyByZXBsYXlcbiAgY29uc3QgdGltZW91dEVycm9yTWVzc2FnZSA9XG4gICAgJ1RpbWVvdXQgZnVuY3Rpb25zIGxpa2UgXCJzZXRUaW1lb3V0XCIgYW5kIFwic2V0SW50ZXJ2YWxcIiBhcmUgbm90IHN1cHBvcnRlZCBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuIFVzZSB0aGUgXCJzbGVlcFwiIGZ1bmN0aW9uIGZyb20gXCJ3b3JrZmxvd1wiIGZvciB0aW1lLWJhc2VkIGRlbGF5cy4nO1xuXG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5zZXRUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEludGVydmFsID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFyVGltZW91dCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhckludGVydmFsID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhckltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gYEFib3J0Q29udHJvbGxlcmAgYW5kIGBBYm9ydFNpZ25hbGAgaW4gdGhlIHdvcmtmbG93IFZNIGFyZSBob29rLWJhY2tlZFxuICAvLyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuIFRoZSBjb250cm9sbGVyJ3MgYWJvcnQoKSBxdWV1ZXMgYSBob29rIHJlc3VtcHRpb24sXG4gIC8vIGFuZCBzaWduYWwuYWJvcnRlZCBpcyB1cGRhdGVkIHdoZW4gdGhlIGhvb2sgZXZlbnQgaXMgcHJvY2Vzc2VkIGR1cmluZyByZXBsYXkuXG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5BYm9ydENvbnRyb2xsZXIgPVxuICAgIGNyZWF0ZUNyZWF0ZUFib3J0Q29udHJvbGxlcih3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBhYm9ydFNpZ25hbFN0YXRpY3MgPSBjcmVhdGVBYm9ydFNpZ25hbFN0YXRpY3MoKTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLkFib3J0U2lnbmFsID0ge1xuICAgIGFib3J0OiBhYm9ydFNpZ25hbFN0YXRpY3MuYWJvcnQsXG4gICAgYW55OiBhYm9ydFNpZ25hbFN0YXRpY3MuYW55LFxuICAgIHRpbWVvdXQ6IGFib3J0U2lnbmFsU3RhdGljcy50aW1lb3V0LFxuICB9O1xuXG4gIC8vIGBSZXF1ZXN0YCBhbmQgYFJlc3BvbnNlYCBhcmUgc3BlY2lhbCBidWlsdC1pbiBjbGFzc2VzIHRoYXQgaW52b2tlIHN0ZXBzXG4gIC8vIGZvciB0aGUgYGpzb24oKWAsIGB0ZXh0KClgIGFuZCBgYXJyYXlCdWZmZXIoKWAgaW5zdGFuY2UgbWV0aG9kc1xuICBjbGFzcyBSZXF1ZXN0IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXF1ZXN0IHtcbiAgICBjYWNoZSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnY2FjaGUnXTtcbiAgICBjcmVkZW50aWFscyE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnY3JlZGVudGlhbHMnXTtcbiAgICBkZXN0aW5hdGlvbiE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnZGVzdGluYXRpb24nXTtcbiAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICBpbnRlZ3JpdHkhOiBzdHJpbmc7XG4gICAgbWV0aG9kITogc3RyaW5nO1xuICAgIG1vZGUhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ21vZGUnXTtcbiAgICByZWRpcmVjdCE6IGdsb2JhbFRoaXMuUmVxdWVzdFsncmVkaXJlY3QnXTtcbiAgICByZWZlcnJlciE6IHN0cmluZztcbiAgICByZWZlcnJlclBvbGljeSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsncmVmZXJyZXJQb2xpY3knXTtcbiAgICB1cmwhOiBzdHJpbmc7XG4gICAga2VlcGFsaXZlITogYm9vbGVhbjtcbiAgICBzaWduYWwhOiBBYm9ydFNpZ25hbDtcbiAgICBkdXBsZXghOiAnaGFsZic7XG4gICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPGFueT4gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IGFueSwgaW5pdD86IFJlcXVlc3RJbml0KSB7XG4gICAgICAvLyBIYW5kbGUgVVJMIGlucHV0XG4gICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIHZtR2xvYmFsVGhpcy5VUkwpIHtcbiAgICAgICAgY29uc3QgdXJsU3RyaW5nID0gU3RyaW5nKGlucHV0KTtcbiAgICAgICAgLy8gVmFsaWRhdGUgVVJMIGZvcm1hdFxuICAgICAgICB0cnkge1xuICAgICAgICAgIG5ldyB2bUdsb2JhbFRoaXMuVVJMKHVybFN0cmluZyk7XG4gICAgICAgICAgdGhpcy51cmwgPSB1cmxTdHJpbmc7XG4gICAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICR7dXJsU3RyaW5nfWAsIHtcbiAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnB1dCBpcyBhIFJlcXVlc3Qgb2JqZWN0IC0gY2xvbmUgaXRzIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmw7XG4gICAgICAgIGlmICghaW5pdCkge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgICB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgICAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICAgIHRoaXMuY2FjaGUgPSBpbnB1dC5jYWNoZTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5wdXQucmVkaXJlY3Q7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbnB1dC5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgICB0aGlzLmludGVncml0eSA9IGlucHV0LmludGVncml0eTtcbiAgICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbDtcbiAgICAgICAgICB0aGlzLmR1cGxleCA9IGlucHV0LmR1cGxleDtcbiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGluaXQgaXMgcHJvdmlkZWQsIG1lcmdlOiB1c2Ugc291cmNlIHByb3BlcnRpZXMsIHRoZW4gb3ZlcnJpZGUgd2l0aCBpbml0XG4gICAgICAgIC8vIENvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIFJlcXVlc3QgZmlyc3RcbiAgICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgdGhpcy5ib2R5ID0gaW5wdXQuYm9keTtcbiAgICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICB0aGlzLmNhY2hlID0gaW5wdXQuY2FjaGU7XG4gICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbnB1dC5yZWRpcmVjdDtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5wdXQucmVmZXJyZXJQb2xpY3k7XG4gICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5wdXQuaW50ZWdyaXR5O1xuICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWw7XG4gICAgICAgIHRoaXMuZHVwbGV4ID0gaW5wdXQuZHVwbGV4O1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIE92ZXJyaWRlIHdpdGggaW5pdCBvcHRpb25zIGlmIHByb3ZpZGVkXG4gICAgICAvLyBTZXQgbWV0aG9kXG4gICAgICBpZiAoaW5pdD8ubWV0aG9kKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGZvciBzdHJpbmcgaW5wdXQgY2FzZVxuICAgICAgICB0aGlzLm1ldGhvZCA9ICdHRVQnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaGVhZGVyc1xuICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2Ygdm1HbG9iYWxUaGlzLlVSTFxuICAgICAgKSB7XG4gICAgICAgIC8vIEZvciBzdHJpbmcvVVJMIGlucHV0LCBjcmVhdGUgZW1wdHkgaGVhZGVyc1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IG90aGVyIHByb3BlcnRpZXMgd2l0aCBpbml0IHZhbHVlcyBvciBkZWZhdWx0c1xuICAgICAgaWYgKGluaXQ/Lm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm1vZGUgPSBpbml0Lm1vZGU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLm1vZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMubW9kZSA9ICdjb3JzJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGluaXQuY3JlZGVudGlhbHM7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNyZWRlbnRpYWxzICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJztcbiAgICAgIH1cblxuICAgICAgLy8gYGFueWAgY2FzdCBoZXJlIGJlY2F1c2UgQHR5cGVzL25vZGUgdjIyIGRvZXMgbm90IHlldCBoYXZlIGBjYWNoZWBcbiAgICAgIGlmICgoaW5pdCBhcyBhbnkpPy5jYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSAoaW5pdCBhcyBhbnkpLmNhY2hlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5jYWNoZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9ICdkZWZhdWx0JztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnJlZGlyZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGluaXQucmVkaXJlY3Q7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZGlyZWN0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlZGlyZWN0ID0gJ2ZvbGxvdyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5yZWZlcnJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXIgPSBpbml0LnJlZmVycmVyO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWZlcnJlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9ICdhYm91dDpjbGllbnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ucmVmZXJyZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5pdC5yZWZlcnJlclBvbGljeTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVmZXJyZXJQb2xpY3kgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmludGVncml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5pdC5pbnRlZ3JpdHk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmludGVncml0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmtlZXBhbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5pdC5rZWVwYWxpdmU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmtlZXBhbGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5zaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQWJvcnRTaWduYWwgc3R1YlxuICAgICAgICB0aGlzLnNpZ25hbCA9IGluaXQuc2lnbmFsO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEFib3J0U2lnbmFsIHN0dWJcbiAgICAgICAgdGhpcy5zaWduYWwgPSB7IGFib3J0ZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kdXBsZXgpIHtcbiAgICAgICAgdGhpcy5kdXBsZXggPSAnaGFsZic7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gJ2RvY3VtZW50JztcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IGluaXQ/LmJvZHk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgR0VUL0hFQUQgbWV0aG9kcyBkb24ndCBoYXZlIGEgYm9keVxuICAgICAgaWYgKFxuICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgIGJvZHkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5LmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgQm9keUluaXQgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBcImZha2VcIiBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyB0aGUgb3JpZ2luYWwgYm9keVxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBkb2luZyBhc3luYyB3b3JrIGR1cmluZyB3b3JrZmxvdyByZXBsYXlcbiAgICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZSh2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogYm9keSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKTogUmVxdWVzdCB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGJvZHlVc2VkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGVzZVxuICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPEJsb2I+O1xuICAgIGZvcm1EYXRhITogKCkgPT4gUHJvbWlzZTxGb3JtRGF0YT47XG5cbiAgICBhcnJheUJ1ZmZlciE6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGpzb24hOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgdGV4dCE6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIGFzeW5jIGJ5dGVzKCkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZXF1ZXN0ID0gUmVxdWVzdDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgQXJyYXlCdWZmZXI+KCdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIGpzb246IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgc3RyaW5nPignX19idWlsdGluX3Jlc3BvbnNlX3RleHQnKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNsYXNzIFJlc3BvbnNlIGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXNwb25zZSB7XG4gICAgdHlwZSE6IGdsb2JhbFRoaXMuUmVzcG9uc2VbJ3R5cGUnXTtcbiAgICB1cmwhOiBzdHJpbmc7XG4gICAgc3RhdHVzITogbnVtYmVyO1xuICAgIHN0YXR1c1RleHQhOiBzdHJpbmc7XG4gICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgbnVsbDtcbiAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICByZWRpcmVjdGVkITogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGJvZHk/OiBhbnksIGluaXQ/OiBSZXNwb25zZUluaXQpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gaW5pdD8uc3RhdHVzID8/IDIwMDtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dCA9IGluaXQ/LnN0YXR1c1RleHQgPz8gJyc7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICB0aGlzLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICB0aGlzLnVybCA9ICcnO1xuICAgICAgdGhpcy5yZWRpcmVjdGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgbnVsbC1ib2R5IHN0YXR1cyBjb2RlcyBkb24ndCBoYXZlIGEgYm9keVxuICAgICAgLy8gUGVyIEhUVFAgc3BlYzogMjA0IChObyBDb250ZW50KSwgMjA1IChSZXNldCBDb250ZW50KSwgYW5kIDMwNCAoTm90IE1vZGlmaWVkKVxuICAgICAgaWYgKFxuICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgIGJvZHkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodGhpcy5zdGF0dXMgPT09IDIwNCB8fCB0aGlzLnN0YXR1cyA9PT0gMjA1IHx8IHRoaXMuc3RhdHVzID09PSAzMDQpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgUmVzcG9uc2UgY29uc3RydWN0b3I6IEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJHt0aGlzLnN0YXR1c31gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBCb2R5SW5pdCBmb3Igc2VyaWFsaXphdGlvblxuICAgICAgaWYgKGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIFwiZmFrZVwiIFJlYWRhYmxlU3RyZWFtIHRoYXQgc3RvcmVzIHRoZSBvcmlnaW5hbCBib2R5XG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIGRvaW5nIGFzeW5jIHdvcmsgZHVyaW5nIHdvcmtmbG93IHJlcGxheVxuICAgICAgICB0aGlzLmJvZHkgPSBPYmplY3QuY3JlYXRlKHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBbQk9EWV9JTklUX1NZTUJPTF06IHtcbiAgICAgICAgICAgIHZhbHVlOiBib2R5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhlc2VcbiAgICBjbG9uZSE6ICgpID0+IFJlc3BvbnNlO1xuICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPGdsb2JhbFRoaXMuQmxvYj47XG4gICAgZm9ybURhdGEhOiAoKSA9PiBQcm9taXNlPGdsb2JhbFRoaXMuRm9ybURhdGE+O1xuXG4gICAgZ2V0IG9rKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDtcbiAgICB9XG5cbiAgICBnZXQgYm9keVVzZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXJyYXlCdWZmZXIhOiAoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICBqc29uITogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHRleHQhOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbiAgICBhc3luYyBieXRlcygpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCB0aGlzLmFycmF5QnVmZmVyKCkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBqc29uKGRhdGE6IGFueSwgaW5pdD86IFJlc3BvbnNlSW5pdCk6IFJlc3BvbnNlIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBlcnJvcigpOiBSZXNwb25zZSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlZGlyZWN0KHVybDogc3RyaW5nIHwgVVJMLCBzdGF0dXM6IG51bWJlciA9IDMwMik6IFJlc3BvbnNlIHtcbiAgICAgIC8vIFZhbGlkYXRlIHN0YXR1cyBjb2RlIC0gb25seSBzcGVjaWZpYyByZWRpcmVjdCBjb2RlcyBhcmUgYWxsb3dlZFxuICAgICAgaWYgKCFbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdLmluY2x1ZGVzKHN0YXR1cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgcmVkaXJlY3Qgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfS4gTXVzdCBiZSBvbmUgb2Y6IDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgcmVzcG9uc2Ugd2l0aCBMb2NhdGlvbiBoZWFkZXJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgIGhlYWRlcnMuc2V0KCdMb2NhdGlvbicsIFN0cmluZyh1cmwpKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBPYmplY3QuY3JlYXRlKFJlc3BvbnNlLnByb3RvdHlwZSk7XG4gICAgICByZXNwb25zZS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICByZXNwb25zZS5zdGF0dXNUZXh0ID0gJyc7XG4gICAgICByZXNwb25zZS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgIHJlc3BvbnNlLmJvZHkgPSBudWxsO1xuICAgICAgcmVzcG9uc2UudHlwZSA9ICdkZWZhdWx0JztcbiAgICAgIHJlc3BvbnNlLnVybCA9ICcnO1xuICAgICAgcmVzcG9uc2UucmVkaXJlY3RlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgQXJyYXlCdWZmZXI+KCdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIGpzb246IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgc3RyaW5nPignX19idWlsdGluX3Jlc3BvbnNlX3RleHQnKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNsYXNzIFJlYWRhYmxlU3RyZWFtPFQ+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxUPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYW5jZWwoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXRSZWFkZXIoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBwaXBlVGhyb3VnaCgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHBpcGVUbygpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHRlZSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHZhbHVlcygpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSBSZWFkYWJsZVN0cmVhbTtcblxuICBjbGFzcyBXcml0YWJsZVN0cmVhbTxUPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW08VD4ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYWJvcnQoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldFdyaXRlcigpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTtcblxuICBjbGFzcyBUcmFuc2Zvcm1TdHJlYW08SSwgTz4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbTxJLCBPPiB7XG4gICAgcmVhZGFibGU6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08Tz47XG4gICAgd3JpdGFibGU6IGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW08ST47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IFRyYW5zZm9ybVN0cmVhbTtcblxuICB2bUdsb2JhbFRoaXMuY29uc29sZSA9IGdsb2JhbFRoaXMuY29uc29sZTtcblxuICAvLyBFeHBvc2UgdGhlIHJlcXVlc3QtY29udGV4dCBzeW1ib2wgcmVxdWlyZWQgYnkgQUkgR2F0ZXdheS5cbiAgY29uc3QgU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ0B2ZXJjZWwvcmVxdWVzdC1jb250ZXh0Jyk7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVF0gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgIFNZTUJPTF9GT1JfUkVRX0NPTlRFWFRcbiAgXTtcblxuICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHVzZXItZGVmaW5lZCB3b3JrZmxvdyBmdW5jdGlvbi5cbiAgLy8gVGhlIGZpbGVuYW1lIHBhcmFtZXRlciBlbnN1cmVzIHN0YWNrIHRyYWNlcyBzaG93IGEgbWVhbmluZ2Z1bCBuYW1lXG4gIC8vIChlLmcuLCBcImV4YW1wbGUvd29ya2Zsb3dzLzk5X2UyZS50c1wiKSBpbnN0ZWFkIG9mIFwiZXZhbG1hY2hpbmUuPGFub255bW91cz5cIi5cbiAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSk7XG4gIGNvbnN0IGZpbGVuYW1lID0gcGFyc2VkTmFtZT8ubW9kdWxlU3BlY2lmaWVyIHx8IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZTtcblxuICAvLyBSZXVzZSBjb21waWxlZCBzY3JpcHRzIGJ5IGAoY29kZSwgZmlsZW5hbWUpYDogY29tcGlsYXRpb24gaXMgZGV0ZXJtaW5pc3RpY1xuICAvLyBhbmQgdGhlIGZpbGVuYW1lIHByZXNlcnZlcyB3b3JrZmxvdyBzb3VyY2UgYXR0cmlidXRpb24gaW4gc3RhY2sgdHJhY2VzLlxuICAvLyBUaGUgYnVuZGxlIHJlZ2lzdGVycyB3b3JrZmxvd3Mgb24gYGdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93c2AuXG4gIHJ1bkNhY2hlZFdvcmtmbG93U2NyaXB0KHdvcmtmbG93Q29kZSwgZmlsZW5hbWUsIGNvbnRleHQpO1xuICBjb25zdCB3b3JrZmxvd0ZuID0gcnVuQ2FjaGVkV29ya2Zsb3dTY3JpcHQoXG4gICAgYGdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cz8uZ2V0KCR7SlNPTi5zdHJpbmdpZnkod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKX0pYCxcbiAgICBmaWxlbmFtZSxcbiAgICBjb250ZXh0XG4gICk7XG5cbiAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSk7XG4gIH1cblxuICAvLyBDaGFpbiB3b3JrZmxvdyBhcmd1bWVudCBoeWRyYXRpb24gb250byB0aGUgcHJvbWlzZVF1ZXVlIHNvIHRoYXQgdGhlXG4gIC8vIHVuY29uc3VtZWQgZXZlbnQgY2hlY2sgKHdoaWNoIHdhaXRzIGZvciB0aGUgcXVldWUgdG8gZHJhaW4pIGRvZXNuJ3RcbiAgLy8gZmlyZSBkdXJpbmcgdGhlIGFzeW5jIGdhcCBiZXR3ZWVuIHJ1bl9zdGFydGVkIGNvbnN1bXB0aW9uIGFuZCB0aGVcbiAgLy8gd29ya2Zsb3cgZnVuY3Rpb24gc3Vic2NyaWJpbmcgaXRzIGZpcnN0IHN0ZXAgY2FsbGJhY2tzLlxuICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gIHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWUgPSB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgcmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVXb3JrZmxvd0lucHV0KHdvcmtmbG93UnVuKTtcbiAgICBhcmdzID0gYXdhaXQgaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgd29ya2Zsb3dSdW4uaW5wdXQsXG4gICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICB7fSxcbiAgICAgIHByZXBhcmVkXG4gICAgKTtcbiAgfSk7XG4gIGF3YWl0IHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWU7XG5cbiAgLy8gVGhlIHVzZXIgZnVuY3Rpb24ncyBwcm9taXNlLiBJdCBtYXkgc3RheSBwZW5kaW5nIGFjcm9zcyBtYW55IHJlc3VtZXNcbiAgLy8gKGVhY2ggcGFya2VkIHN0ZXAgcHJvbWlzZSBob2xkcyBpdCB1cCkgYW5kIGlzIHJhY2VkIGFnYWluc3QgdGhlIGN1cnJlbnRcbiAgLy8gYXR0ZW1wdCdzIGludGVycnVwdGlvbiBpbiB3YWl0Rm9yRXhlY3V0aW9uLlxuICBjb25zdCB3b3JrZmxvd0JvZHkgPSAoYXN5bmMgKCk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB3b3JrZmxvd0ZuKC4uLmFyZ3MpO1xuICB9KSgpO1xuXG4gIGNvbnN0IGZhaWxXb3JrZmxvdyA9IGFzeW5jIChlcnJvcjogdW5rbm93bik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICAvLyBDb250cm9sLWZsb3cgc2lnbmFscyBhcmUgaGFuZGxlZCBieSB0aGUgcnVudGltZSBhbmQgZG8gbm90IG1lYW4gdGhlXG4gICAgLy8gd29ya2Zsb3cgaGFzIHRlcm1pbmFsbHkgZmFpbGVkLiBgb25Xb3JrZmxvd0Vycm9yYCB1c3VhbGx5IGFscmVhZHkgbW92ZWRcbiAgICAvLyB0aGUgc3RhdGUgbWFjaGluZSwgYnV0IGEgZGl2ZXJnZW5jZSBjYW4gYWxzbyBhcnJpdmUgdmlhIGEgc3RlcFxuICAgIC8vIHByb21pc2UncyBkaXJlY3QgcmVqZWN0aW9uIChieXBhc3NpbmcgYG9uV29ya2Zsb3dFcnJvcmApIOKAlCBkZW1vdGUgc29cbiAgICAvLyBldmVyeSBjb250cm9sLWZsb3cgcGF0aCBjb252ZXJnZXMgb24gYHJlcGxheWAgYW5kIGEgbGF0ZXIgcmVzdW1lIGZhbGxzXG4gICAgLy8gYmFjayBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyb3IpIHx8IFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgIGlmIChzdGF0ZS50eXBlID09PSAncnVubmluZycpIHN0YXRlID0geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHN0YXRlID0geyB0eXBlOiAnY29tcGxldGVkJyB9O1xuXG4gICAgYXdhaXQgZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICB3b3JrZmxvd1J1bixcbiAgICAgICdmYWlsZWQnLFxuICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgKTtcblxuICAgIHRocm93IGVycm9yO1xuICB9O1xuXG4gIGNvbnN0IHdhaXRGb3JFeGVjdXRpb24gPSBhc3luYyAoXG4gICAgaW50ZXJydXB0aW9uOiBQcm9taXNlV2l0aFJlc29sdmVyczxuZXZlcj5cbiAgKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdD4gPT4ge1xuICAgIGxldCByZXN1bHQ6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbd29ya2Zsb3dCb2R5LCBpbnRlcnJ1cHRpb24ucHJvbWlzZV0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoc3RhdGUudHlwZSA9PT0gJ3N1c3BlbmRlZCcgJiYgZXJyb3IgPT09IHN0YXRlLnN1c3BlbnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnc3VzcGVuZGVkJyxcbiAgICAgICAgICBzdXNwZW5zaW9uOiBzdGF0ZS5zdXNwZW5zaW9uLFxuICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGlzIG5vdCBhIHNldHRsaW5nIHBvaW50OiB0aGUgY29uc3VtZXIgZm9yIHNvbWV0aGluZ1xuICAgICAgICAgIC8vIGhlbGQgbWF5IHdlbGwgYmUgcmVnaXN0ZXJlZCBieSB0aGUgcmVwbGF5IHRoYXQgZm9sbG93cyB0aGlzIG9uZS5cbiAgICAgICAgICAvLyBTbyBpdCBpcyBjYXJyaWVkIG91dCBmb3IgdGhlIHNwYW4gaW5zdGVhZCBvZiBiZWluZyBqdWRnZWQgaGVyZS5cbiAgICAgICAgICBwYXJrZWQ6IGV2ZW50c0NvbnN1bWVyLnBhcmtlZFN1bW1hcnksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbFdvcmtmbG93KGVycm9yKTtcbiAgICB9XG5cbiAgICBzdGF0ZSA9IHsgdHlwZTogJ2NvbXBsZXRlZCcgfTtcbiAgICAvLyBUaGUgY29uc3VtZXIgd2Fsa3MgcGFzdCBldmVudHMgd2hvc2UgdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltIGFuZFxuICAgIC8vIGhvbGRzIHRoZW0gZm9yIGEgY29uc3VtZXIgaXQgZXhwZWN0cyBhIGxhdGVyIGBzdWJzY3JpYmUoKWAgdG8gcmVnaXN0ZXIuXG4gICAgLy8gVGhlIHdvcmtmbG93IGZ1bmN0aW9uIHJldHVybmluZyBpcyB0aGUgcG9pbnQgd2hlcmUgdGhhdCBleHBlY3RhdGlvbiBpc1xuICAgIC8vIHNldHRsZWQ6IG5vdGhpbmcgbW9yZSB3aWxsIHN1YnNjcmliZSwgc28gYW55dGhpbmcgc3RpbGwgaGVsZCB3YXMgbmV2ZXJcbiAgICAvLyBhbnlvbmUncywgYW5kIGNvbXBsZXRpbmcgaGVyZSB3b3VsZCBkcm9wIGl0IHNpbGVudGx5LlxuICAgIGNvbnN0IHN0cmFuZGVkID0gZXZlbnRzQ29uc3VtZXIuc3RyYW5kZWRFdmVudDtcbiAgICBpZiAoc3RyYW5kZWQpIHtcbiAgICAgIHJldHVybiBmYWlsV29ya2Zsb3coXG4gICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgYFJlcGxheSBmaW5pc2hlZCB3aXRob3V0IGNvbnN1bWluZyBldmVudDogZXZlbnRUeXBlPSR7c3RyYW5kZWQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke3N0cmFuZGVkLmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7c3RyYW5kZWQuZXZlbnRJZH0uYCxcbiAgICAgICAgICB7IGV2ZW50SWQ6IHN0cmFuZGVkLmV2ZW50SWQgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgLy8gT25seSBjb21wcmVzc2lvbi1jYXBhYmxlIHJ1bnMgKHNwZWMgPj0gNSkgbWF5IHdyaXRlIGNvbXByZXNzZWRcbiAgICAgICAgLy8gcGF5bG9hZHMuIFRoZSBzZXJpYWxpemVyIHVzZXMgenN0ZCB3aGVuIHN1cHBvcnRlZCBhbmQgbWF5IHVzZSBnemlwLlxuICAgICAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICApO1xuXG4gICAgICBhd2FpdCBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICdjb21wbGV0ZWQnLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdjb21wbGV0ZWQnLCBvdXRwdXQsIHJlc3VsdFR5cGU6IHR5cGVvZiByZXN1bHQgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWxXb3JrZmxvdyhlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNlc3Npb246IFdvcmtmbG93U2Vzc2lvbiA9IHtcbiAgICB3b3JrZmxvd1J1bixcbiAgICBhcmd1bWVudENvdW50OiBhcmdzLmxlbmd0aCxcbiAgICBhc3luYyByZXN1bWUobmV4dEV2ZW50cykge1xuICAgICAgc3dpdGNoIChzdGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N1c3BlbmRlZCc6IHtcbiAgICAgICAgICAvLyBUaGUgZnVsbCBPKGtub3duIGV2ZW50cykgcHJlZml4IGNvbXBhcmUgaXMgcmVxdWlyZWQ6IHRoZSBydW50aW1lXG4gICAgICAgICAgLy8gdXN1YWxseSBncm93cyBvbmUgYXJyYXkgaW4gcGxhY2UsIGJ1dCBpdHMgd2FpdC1jb21wbGV0aW9uIGFuZFxuICAgICAgICAgIC8vIHN0YWxlLXJlbG9hZCBwYXRocyBSRVBMQUNFIHRoZSBhcnJheSB3aXRoIGEgZnJlc2ggZnVsbCBmZXRjaCwgc29cbiAgICAgICAgICAvLyBhIHJld3JpdHRlbiBwcmVmaXggaXMgYSByZWFsIGlucHV0LCBub3QgcGFyYW5vaWEuIFRoZSBjb21wYXJlc1xuICAgICAgICAgIC8vIGFyZSBjaGVhcCBzdHJpbmcgZXF1YWxpdHkgYW5kIGR3YXJmZWQgYnkgdGhlIHJlcGxheSB0aGV5IGF2b2lkLlxuICAgICAgICAgIGNvbnN0IGtub3duRXZlbnRzID0gZXZlbnRzQ29uc3VtZXIuZXZlbnRzO1xuICAgICAgICAgIGNvbnN0IGlzU3RyaWN0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIG5leHRFdmVudHMubGVuZ3RoID4ga25vd25FdmVudHMubGVuZ3RoICYmXG4gICAgICAgICAgICBrbm93bkV2ZW50cy5ldmVyeShcbiAgICAgICAgICAgICAgKGV2ZW50LCBpbmRleCkgPT4gZXZlbnQuZXZlbnRJZCA9PT0gbmV4dEV2ZW50c1tpbmRleF0uZXZlbnRJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWlzU3RyaWN0RXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGludGVycnVwdGlvbiA9IHdpdGhSZXNvbHZlcnM8bmV2ZXI+KCk7XG4gICAgICAgICAgc3RhdGUgPSB7IHR5cGU6ICdydW5uaW5nJywgaW50ZXJydXB0aW9uIH07XG4gICAgICAgICAgd29ya2Zsb3dDb250ZXh0LnN1c3BlbnNpb25HZW5lcmF0aW9uKys7XG4gICAgICAgICAgZXZlbnRzQ29uc3VtZXIuYXBwZW5kKG5leHRFdmVudHMuc2xpY2Uoa25vd25FdmVudHMubGVuZ3RoKSk7XG4gICAgICAgICAgcmV0dXJuIHdhaXRGb3JFeGVjdXRpb24oaW50ZXJydXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdyZXBsYXknOlxuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVzdW1lICR7c3RhdGUudHlwZX0gd29ya2Zsb3cgXCIke3dvcmtmbG93UnVuLnJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGF0ZSBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNlc3Npb24sXG4gICAgZXhlY3V0aW9uOiB3YWl0Rm9yRXhlY3V0aW9uKGluaXRpYWxJbnRlcnJ1cHRpb24pLFxuICB9O1xufVxuIl19
@@ -116,7 +116,7 @@ Calling `createHook()` on its own does not register the hook — registration is
116
116
 
117
117
  ### Custom Tokens for Deterministic Hooks
118
118
 
119
- By default, hooks generate a random token. However, you often want to use a **custom token** that external systems can reconstruct. This is especially useful for long-running workflows where the same workflow instance should handle multiple events.
119
+ By default, hooks generate their own token. However, you often want to use a **custom token** that external systems can reconstruct. This is especially useful for long-running workflows where the same workflow instance should handle multiple events.
120
120
 
121
121
  For example, imagine a Slack bot where each channel should have its own workflow instance:
122
122
 
@@ -480,7 +480,7 @@ This pattern is especially valuable in larger applications where the workflow an
480
480
 
481
481
  ### Token Design
482
482
 
483
- Custom tokens are available for `createHook()` with server-side `resumeHook()` only. Webhooks (`createWebhook()`) always use randomly generated tokens to prevent unauthorized access to public webhook endpoints.
483
+ Custom tokens are available for `createHook()` with server-side `resumeHook()` only. Webhooks (`createWebhook()`) always generate their own unique tokens. A generated token is not trivial to guess, but it is not a strong security contract either, so anyone who obtains the URL can invoke an unintended webhook resumption. To prevent unauthenticated run resumptions entirely, prefer a **hook** over the **webhook** convenience and implement your own authentication on the route that calls `resumeHook()`.
484
484
 
485
485
  When using custom tokens with `createHook()`:
486
486
 
@@ -58,6 +58,30 @@ export async function POST() {
58
58
 
59
59
  When a client makes a request to this endpoint, they'll receive each message as it's written, without waiting for the workflow to complete.
60
60
 
61
+ ### Avoiding Function Timeouts After Client Disconnects
62
+
63
+ On Vercel, `run.readable` and `run.getReadable()` reconnect to Workflow's stream storage while the workflow is still running. By default, a client disconnect does not terminate the Vercel Function serving the stream. If a user closes the page or stops the request, the function can therefore keep reconnecting until it reaches its maximum duration and fails with `FUNCTION_INVOCATION_TIMEOUT`.
64
+
65
+ For streaming routes using the Node.js runtime, opt in to [request cancellation](https://vercel.com/docs/functions/functions-api-reference#enable-cancellation) in `vercel.json`:
66
+
67
+ ```json filename="vercel.json"
68
+ {
69
+ "functions": {
70
+ "app/api/stream/route.ts": {
71
+ "supportsCancellation": true
72
+ }
73
+ }
74
+ }
75
+ ```
76
+
77
+ Replace the function path with the path or glob for your streaming route. When the downstream client disconnects, Vercel terminates the matching function invocation instead of leaving its stream reader running. The workflow run and its durable stream continue independently, so the client can reconnect through another route invocation later.
78
+
79
+ <Callout type="warn">
80
+ Cancellation applies to every function matching the configured path or glob, even if the route does not listen to `request.signal`. Any other work in that invocation which is not wrapped in [`waitUntil`](https://vercel.com/docs/functions/functions-api-reference/vercel-functions-package#waituntil) or [`after`](https://nextjs.org/docs/app/api-reference/functions/after) can be lost. Only enable it for routes that are safe to terminate when their client disconnects.
81
+ </Callout>
82
+
83
+ This setting prevents abandoned stream readers from consuming the rest of a function invocation. It does not extend the function's maximum duration: an actively connected streaming response can still reach the configured limit, at which point the client should reconnect to the durable stream.
84
+
61
85
  ### Resuming Streams from a Specific Point
62
86
 
63
87
  Use `run.getReadable({ startIndex })` to resume a stream from a specific position. This is useful for reconnecting after timeouts or network interruptions:
@@ -94,7 +94,7 @@ flowchart TD
94
94
  - `cancelled`: Reserved for future use (not currently emitted)
95
95
 
96
96
  <Callout type="info">
97
- The `step_retrying` event is optional. Steps can retry without it - the retry mechanism works regardless of whether this event is emitted. You may see back-to-back `step_started` events in logs when a step retries after a timeout or when the error is not explicitly captured. See [Errors and Retries](/docs/foundations/errors-and-retries) for more on how retries work.
97
+ The `step_retrying` event is optional. Steps can retry without it - the retry mechanism works regardless of whether this event is emitted. You may see back-to-back `step_started` events in logs when a step retries after a timeout or when the error is not explicitly captured, and also when concurrent replays each commit one (see [Duplicate Events](#duplicate-events)). See [Errors and Retries](/docs/foundations/errors-and-retries) for more on how retries work.
98
98
  </Callout>
99
99
 
100
100
  When present, the `step_retrying` event moves a step back to `pending` state and records the error that caused the retry. This provides two benefits:
@@ -225,6 +225,44 @@ Terminal states represent the end of an entity's lifecycle. Once an entity reach
225
225
 
226
226
  Attempting to create an event that would transition an entity out of a terminal state will result in an error. This prevents inconsistent state and ensures the integrity of the event log.
227
227
 
228
+ That guard sits on the write path. A duplicate the write path does permit — a second `step_created` for a step that is not yet terminal, for example — is handled during replay instead, described next.
229
+
230
+ ## Duplicate Events
231
+
232
+ Concurrent invocations replaying the same run share one event log. An invocation working from a stale prefix — one that predates another invocation's write — can commit its own `step_created`, `step_started`, or `wait_created` for an entity the log already records one of. These writes pass the terminal-state guard above, so the write path commits them even when a backend validates transitions atomically with the insert.
233
+
234
+ Those duplicates are committed but inert. The outcome was decided by the first event of its kind at a lower position in the log, and every replay reads that same event at that same position, so a later copy cannot change what the workflow observes.
235
+
236
+ To keep an inert copy from failing an otherwise healthy run, the runtime groups event types into **classes** and tracks, per entity, which classes the current replay has already consumed. When an event is offered to every registered consumer and none wants it, and its class is already recorded for that entity, the replay steps over it instead of reporting a [replay divergence](/docs/errors/replay-divergence) — which, once the recovery budget is exhausted, ends the run with [`CORRUPTED_EVENT_LOG`](/docs/errors/corrupted-event-log).
237
+
238
+ | Class | Event types |
239
+ |-------|-------------|
240
+ | `run_started` | `run_started` |
241
+ | `step_created` | `step_created` |
242
+ | `step_started` | `step_started` |
243
+ | `step_retrying` | `step_retrying` |
244
+ | `step_terminal` | `step_completed`, `step_failed` |
245
+ | `wait_created` | `wait_created` |
246
+ | `wait_completed` | `wait_completed` |
247
+ | `hook_created` | `hook_created` |
248
+ | `hook_disposed` | `hook_disposed` |
249
+
250
+ Types that share a class are the mutually exclusive outcomes of one decision: a step either completes or fails, and the first outcome recorded is the one that counts. Classes are independent of one another, so passing over one does not suppress another. A step whose result is already in the log has still recorded exactly one `step_created`, which is what makes a second one ignorable on its own terms.
251
+
252
+ The two hook classes cover the same shape of duplicate, and replay reaches them less often because the write path resolves most hook duplicates before they reach the log: a run re-creating a hook it already owns converges on the existing `hook_created` rather than appending a second one, and a second `hook_disposed` for the same hook is refused as an idempotent no-op. A log that holds either anyway is read past like any other repeat.
253
+
254
+ The remaining event types belong to no class and are never skipped:
255
+
256
+ - `hook_received`: a hook legitimately receives many payloads under one ID, so a second `hook_received` is not a repeat of anything.
257
+ - `hook_conflict`: records a failed acquisition of a hook's token, which the same run can hit repeatedly over its lifetime as other runs take and release that token. The hook's own consumer stays registered and claims every copy it is offered, so a repeat is consumed rather than reaching the class check.
258
+ - `attr_set`: written on every [`setAttributes()`](/docs/api-reference/workflow/set-attributes) call, so a second write of the same key is a new fact rather than a repeat.
259
+ - `run_created` precedes every replay and is always consumed.
260
+ - `run_completed`, `run_failed`, and `run_cancelled` never reach the check. The runtime exits before replaying the workflow body once the log holds one of them, so no consumer ever takes one and no class is ever recorded for them.
261
+
262
+ Both kinds of skip are logged at `debug`, so neither reaches the console unless you run with `DEBUG=workflow:runtime:*`. A duplicate is a permanent feature of the log: every later replay re-reads it and lands on the same check, so anything printed unconditionally would print once per replay for the life of the run, and there is nothing to act on either way. A repeat that decides a class differently — a `step_failed` behind a `step_completed`, or the reverse — gets its own message, because unlike a re-commit of the same outcome there is no reading in which both writers were right.
263
+
264
+ The observability UI greys out the events it can identify this way, with the reason on hover. Its set is narrower than the runtime's: it reads the log without consumer state, and a consumer for an entity that is still open legitimately claims a repeat — each retry of a step writes another `step_started`. So it marks a repeat only once no consumer can remain for it: past a terminal event for the same entity, or a second `run_started`, of which the log records one per run. On a partial view of the log — one page of a paginated list, or search results — it marks nothing, since which copy came first is a property of the whole log.
265
+
228
266
  ## Event Correlation
229
267
 
230
268
  Events use a `correlationId` to link related events together. For step, hook, and wait events, the correlation ID identifies the specific entity instance: