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

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 (217) hide show
  1. package/dist/capabilities.d.ts +4 -4
  2. package/dist/capabilities.js +5 -5
  3. package/dist/capture-stack.d.ts +1 -1
  4. package/dist/capture-stack.js +2 -2
  5. package/dist/class-serialization.d.ts +8 -8
  6. package/dist/class-serialization.js +9 -9
  7. package/dist/classify-error.js +5 -5
  8. package/dist/context-violation-error.d.ts +5 -5
  9. package/dist/context-violation-error.d.ts.map +1 -1
  10. package/dist/context-violation-error.js +5 -5
  11. package/dist/create-hook.d.ts +2 -2
  12. package/dist/create-hook.js +1 -1
  13. package/dist/define-hook.js +2 -2
  14. package/dist/describe-error.d.ts +7 -7
  15. package/dist/describe-error.js +8 -8
  16. package/dist/encryption.d.ts +5 -5
  17. package/dist/encryption.js +7 -7
  18. package/dist/events-consumer.d.ts +19 -7
  19. package/dist/events-consumer.d.ts.map +1 -1
  20. package/dist/events-consumer.js +33 -12
  21. package/dist/flushable-stream.d.ts +4 -4
  22. package/dist/flushable-stream.js +12 -12
  23. package/dist/global.d.ts +1 -1
  24. package/dist/global.js +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.js +2 -2
  27. package/dist/log-format.d.ts +2 -2
  28. package/dist/log-format.js +5 -5
  29. package/dist/logger.js +4 -4
  30. package/dist/private.d.ts +21 -65
  31. package/dist/private.d.ts.map +1 -1
  32. package/dist/private.js +160 -38
  33. package/dist/replay-payload-cache.d.ts +1 -1
  34. package/dist/replay-payload-cache.js +4 -4
  35. package/dist/runtime/compute-instance.d.ts +4 -3
  36. package/dist/runtime/compute-instance.d.ts.map +1 -1
  37. package/dist/runtime/compute-instance.js +5 -4
  38. package/dist/runtime/constants.d.ts +24 -24
  39. package/dist/runtime/constants.d.ts.map +1 -1
  40. package/dist/runtime/constants.js +49 -43
  41. package/dist/runtime/count-step-started-events.d.ts +7 -7
  42. package/dist/runtime/count-step-started-events.js +4 -4
  43. package/dist/runtime/deployment-guard.d.ts +7 -7
  44. package/dist/runtime/deployment-guard.js +8 -8
  45. package/dist/runtime/get-port-lazy.d.ts +2 -2
  46. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  47. package/dist/runtime/get-port-lazy.js +37 -30
  48. package/dist/runtime/get-world-lazy.d.ts +2 -2
  49. package/dist/runtime/get-world-lazy.js +3 -3
  50. package/dist/runtime/helpers.d.ts +18 -18
  51. package/dist/runtime/helpers.js +27 -27
  52. package/dist/runtime/quickjs-entrypoint.d.ts +21 -10
  53. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  54. package/dist/runtime/quickjs-entrypoint.js +199 -81
  55. package/dist/runtime/quickjs-runtime.d.ts +31 -15
  56. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  57. package/dist/runtime/quickjs-runtime.js +126 -77
  58. package/dist/runtime/quickjs-serde.d.ts +10 -10
  59. package/dist/runtime/quickjs-serde.js +20 -20
  60. package/dist/runtime/replay-budget.d.ts +4 -4
  61. package/dist/runtime/replay-budget.js +5 -5
  62. package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
  63. package/dist/runtime/replay-recovery-reporter.js +2 -2
  64. package/dist/runtime/resume-hook.d.ts +2 -2
  65. package/dist/runtime/resume-hook.js +27 -27
  66. package/dist/runtime/resume-latency.d.ts +25 -25
  67. package/dist/runtime/resume-latency.d.ts.map +1 -1
  68. package/dist/runtime/resume-latency.js +4 -4
  69. package/dist/runtime/run-id-time.d.ts +2 -2
  70. package/dist/runtime/run-id-time.js +5 -5
  71. package/dist/runtime/run.d.ts +21 -4
  72. package/dist/runtime/run.d.ts.map +1 -1
  73. package/dist/runtime/run.js +104 -10
  74. package/dist/runtime/runs.d.ts +4 -4
  75. package/dist/runtime/runs.js +2 -2
  76. package/dist/runtime/start.d.ts +3 -3
  77. package/dist/runtime/start.d.ts.map +1 -1
  78. package/dist/runtime/start.js +27 -23
  79. package/dist/runtime/step-executor.d.ts +14 -14
  80. package/dist/runtime/step-executor.d.ts.map +1 -1
  81. package/dist/runtime/step-executor.js +54 -39
  82. package/dist/runtime/step-latency.d.ts +14 -14
  83. package/dist/runtime/step-latency.js +11 -11
  84. package/dist/runtime/step-ownership.d.ts +6 -6
  85. package/dist/runtime/step-ownership.js +8 -8
  86. package/dist/runtime/step-single-flight.d.ts +1 -1
  87. package/dist/runtime/step-single-flight.d.ts.map +1 -1
  88. package/dist/runtime/step-single-flight.js +17 -11
  89. package/dist/runtime/suspension-handler.d.ts +29 -17
  90. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  91. package/dist/runtime/suspension-handler.js +206 -71
  92. package/dist/runtime/unserializable-step.d.ts +34 -0
  93. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  94. package/dist/runtime/unserializable-step.js +52 -0
  95. package/dist/runtime/vm-mode.d.ts +1 -1
  96. package/dist/runtime/vm-mode.js +2 -2
  97. package/dist/runtime/wait-continuation.d.ts +31 -9
  98. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  99. package/dist/runtime/wait-continuation.js +44 -13
  100. package/dist/runtime/wait-until.d.ts +1 -1
  101. package/dist/runtime/wait-until.js +2 -2
  102. package/dist/runtime/world-compatibility.d.ts +20 -9
  103. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  104. package/dist/runtime/world-compatibility.js +24 -13
  105. package/dist/runtime/world-init.d.ts +5 -5
  106. package/dist/runtime/world-init.js +6 -6
  107. package/dist/runtime/world.d.ts.map +1 -1
  108. package/dist/runtime/world.js +13 -3
  109. package/dist/runtime.d.ts.map +1 -1
  110. package/dist/runtime.js +300 -206
  111. package/dist/sealed-box.d.ts +7 -7
  112. package/dist/sealed-box.js +15 -15
  113. package/dist/serialization/client.js +2 -2
  114. package/dist/serialization/codec-devalue-vm.d.ts +1 -1
  115. package/dist/serialization/codec-devalue-vm.js +4 -4
  116. package/dist/serialization/codec-devalue.d.ts +1 -1
  117. package/dist/serialization/codec-devalue.js +2 -2
  118. package/dist/serialization/codec.d.ts +4 -4
  119. package/dist/serialization/codec.js +2 -2
  120. package/dist/serialization/compression.d.ts +12 -11
  121. package/dist/serialization/compression.d.ts.map +1 -1
  122. package/dist/serialization/compression.js +16 -15
  123. package/dist/serialization/encryption.d.ts +7 -7
  124. package/dist/serialization/encryption.d.ts.map +1 -1
  125. package/dist/serialization/encryption.js +8 -8
  126. package/dist/serialization/errors.js +2 -2
  127. package/dist/serialization/format.d.ts +6 -6
  128. package/dist/serialization/format.js +7 -7
  129. package/dist/serialization/hardened.d.ts +18 -18
  130. package/dist/serialization/hardened.d.ts.map +1 -1
  131. package/dist/serialization/hardened.js +41 -32
  132. package/dist/serialization/index.d.ts +1 -1
  133. package/dist/serialization/index.js +2 -2
  134. package/dist/serialization/reducers/class-vm.d.ts +1 -1
  135. package/dist/serialization/reducers/class-vm.js +2 -2
  136. package/dist/serialization/reducers/class.js +2 -2
  137. package/dist/serialization/reducers/common-vm.js +12 -12
  138. package/dist/serialization/reducers/common.js +12 -12
  139. package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
  140. package/dist/serialization/reducers/step-function-vm.js +2 -2
  141. package/dist/serialization/reducers/step-function.js +2 -2
  142. package/dist/serialization/step.js +2 -2
  143. package/dist/serialization/types.d.ts +5 -5
  144. package/dist/serialization/types.js +2 -2
  145. package/dist/serialization/workflow-vm.d.ts +1 -1
  146. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  147. package/dist/serialization/workflow-vm.js +13 -10
  148. package/dist/serialization-format.d.ts +11 -11
  149. package/dist/serialization-format.d.ts.map +1 -1
  150. package/dist/serialization-format.js +29 -23
  151. package/dist/serialization.d.ts +10 -10
  152. package/dist/serialization.js +98 -98
  153. package/dist/set-attributes.js +2 -2
  154. package/dist/source-map.d.ts +1 -1
  155. package/dist/source-map.d.ts.map +1 -1
  156. package/dist/source-map.js +18 -12
  157. package/dist/step/context-storage.d.ts +5 -5
  158. package/dist/step/context-storage.js +1 -1
  159. package/dist/step/writable-stream.d.ts +3 -3
  160. package/dist/step/writable-stream.js +7 -7
  161. package/dist/step.js +12 -12
  162. package/dist/symbols.d.ts +2 -2
  163. package/dist/symbols.js +3 -3
  164. package/dist/telemetry/semantic-conventions.d.ts +21 -13
  165. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  166. package/dist/telemetry/semantic-conventions.js +21 -15
  167. package/dist/telemetry.d.ts +3 -3
  168. package/dist/telemetry.d.ts.map +1 -1
  169. package/dist/telemetry.js +19 -10
  170. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  171. package/dist/test-support/orchestrator-context.js +12 -2
  172. package/dist/version.d.ts +1 -1
  173. package/dist/version.js +2 -2
  174. package/dist/vm/index.js +4 -4
  175. package/dist/vm/script-cache.d.ts.map +1 -1
  176. package/dist/vm/script-cache.js +23 -17
  177. package/dist/vm/uint8array-base64.js +1 -1
  178. package/dist/workflow/abort-controller.d.ts +1 -1
  179. package/dist/workflow/abort-controller.js +12 -12
  180. package/dist/workflow/create-hook.js +2 -2
  181. package/dist/workflow/get-workflow-metadata.js +2 -2
  182. package/dist/workflow/hook.js +16 -16
  183. package/dist/workflow/set-attributes.d.ts +1 -1
  184. package/dist/workflow/set-attributes.js +2 -2
  185. package/dist/workflow/sleep.js +2 -2
  186. package/dist/workflow/world-init-stub.d.ts +1 -1
  187. package/dist/workflow/world-init-stub.js +2 -2
  188. package/dist/workflow.d.ts +2 -2
  189. package/dist/workflow.js +21 -7
  190. package/docs/api-reference/create-hook.mdx +15 -15
  191. package/docs/api-reference/create-webhook.mdx +15 -15
  192. package/docs/api-reference/define-hook.mdx +10 -10
  193. package/docs/api-reference/fatal-error.mdx +2 -2
  194. package/docs/api-reference/fetch.mdx +7 -7
  195. package/docs/api-reference/get-step-metadata.mdx +2 -2
  196. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  197. package/docs/api-reference/get-writable.mdx +7 -7
  198. package/docs/api-reference/index.mdx +1 -1
  199. package/docs/api-reference/retryable-error.mdx +1 -1
  200. package/docs/api-reference/set-attributes.mdx +2 -2
  201. package/docs/api-reference/sleep.mdx +3 -3
  202. package/docs/foundations/cancellation.mdx +31 -31
  203. package/docs/foundations/errors-and-retries.mdx +42 -11
  204. package/docs/foundations/hooks.mdx +35 -35
  205. package/docs/foundations/idempotency.mdx +9 -9
  206. package/docs/foundations/serialization.mdx +21 -22
  207. package/docs/foundations/starting-workflows.mdx +36 -37
  208. package/docs/foundations/streaming.mdx +46 -41
  209. package/docs/foundations/versioning.mdx +3 -3
  210. package/docs/foundations/workflows-and-steps.mdx +9 -9
  211. package/docs/how-it-works/cancellation.mdx +62 -62
  212. package/docs/how-it-works/code-transform.mdx +66 -54
  213. package/docs/how-it-works/encryption.mdx +25 -21
  214. package/docs/how-it-works/event-sourcing.mdx +53 -35
  215. package/docs/how-it-works/framework-integrations.mdx +12 -12
  216. package/docs/how-it-works/understanding-directives.mdx +21 -21
  217. package/package.json +7 -7
@@ -72,7 +72,7 @@ export async function handleHealthCheckMessage(healthCheck, worldSpecVersion) {
72
72
  //
73
73
  // Only a *public* key may travel this way: the probe response stream is
74
74
  // deliberately unauthenticated, so anything secret would be exposed.
75
- // Best-effort a failure here must not fail the health check itself, which
75
+ // Best-effort: a failure here must not fail the health check itself, which
76
76
  // callers also rely on for plain capability detection.
77
77
  let encryptionPublicKey;
78
78
  if (healthCheck.runId) {
@@ -95,7 +95,7 @@ export async function handleHealthCheckMessage(healthCheck, worldSpecVersion) {
95
95
  specVersion: worldSpecVersion ?? SPEC_VERSION_CURRENT,
96
96
  workflowCoreVersion,
97
97
  // We are executing inside the target deployment, so this constant reflects
98
- // the *consumer's* hook-resume protocol version exactly what a
98
+ // the *consumer's* hook-resume protocol version, exactly what a
99
99
  // cross-deployment caller needs to gate its parallel resume path on.
100
100
  hookResumeInputVersion: HOOK_RESUME_INPUT_VERSION,
101
101
  ...(encryptionPublicKey ? { encryptionPublicKey } : {}),
@@ -133,7 +133,7 @@ const HEALTH_CHECK_READ_TIMEOUT = 500;
133
133
  * health-check poll loop: some worlds hold that request open until the
134
134
  * stream has data (e.g. workflow-server holds unwritten streams open for
135
135
  * ~2 minutes), which would otherwise blow through the configured health
136
- * check timeout the `while` condition is only re-checked between
136
+ * check timeout, since the `while` condition is only re-checked between
137
137
  * iterations.
138
138
  */
139
139
  function withDeadline(promise, ms) {
@@ -302,7 +302,7 @@ function recordRequestedEventCursor(runId, cursor, requestedCursors) {
302
302
  * re-sorted. Every append source is already in canonical order relative to the
303
303
  * tail (a cursor-delimited page, or a write-response delta), so receipt order is
304
304
  * the order to keep, and re-sorting here would only cost a pass over the log.
305
- * Nothing downstream may assume the tail is the newest event — see
305
+ * Nothing downstream may assume the tail is the newest event. See
306
306
  * {@link maxEventSlot}.
307
307
  */
308
308
  export function appendUniqueEvents(target, events, targetIds) {
@@ -325,7 +325,7 @@ export function appendUniqueEvents(target, events, targetIds) {
325
325
  *
326
326
  * `preloadedEvents` is loaded `sortOrder: 'asc'` and is never re-sorted
327
327
  * client-side, so a `hook_received` spliced in by the lazy-resume consumer must
328
- * land in `eventId` order a plain `push` would place a late-committing
328
+ * land in `eventId` order: a plain `push` would place a late-committing
329
329
  * earlier event after events that sort before it, corrupting replay.
330
330
  *
331
331
  * Lexicographic string order is the log's order: a slot id is a fixed-width
@@ -341,7 +341,7 @@ export function insertEventByEventId(target, event) {
341
341
  while (i > 0) {
342
342
  const existing = target[i - 1];
343
343
  if (existing.eventId === event.eventId) {
344
- // Already present keep the splice idempotent.
344
+ // Already present: keep the splice idempotent.
345
345
  return;
346
346
  }
347
347
  if (existing.eventId < event.eventId) {
@@ -395,7 +395,7 @@ export async function loadWorkflowRunEvents(runId, afterCursor) {
395
395
  const world = await getWorldLazy();
396
396
  const loadStart = Date.now();
397
397
  while (hasMore) {
398
- // TODO: we're currently loading all the data with resolveRef behaviour. We need to update this
398
+ // TODO: we're currently loading all the data with resolveRef behavior. We need to update this
399
399
  // to lazyload the data from the world instead so that we can optimize and make the event log loading
400
400
  // much faster and memory efficient
401
401
  const pageStart = Date.now();
@@ -428,9 +428,9 @@ export async function loadWorkflowRunEvents(runId, afterCursor) {
428
428
  assertEventPaginationProgress(runId, hasMore, response.cursor, requestedCursors);
429
429
  // Preserve the last non-null cursor across pages. A World may
430
430
  // legitimately return `{ data: [], cursor: null, hasMore: false }`
431
- // on a trailing empty page for example when the previous page's
431
+ // on a trailing empty page, for example when the previous page's
432
432
  // underlying DB query hit the limit exactly and returned a
433
- // `LastEvaluatedKey` "just in case". Overwriting with that null
433
+ // precautionary `LastEvaluatedKey`. Overwriting with that null
434
434
  // would lose the position past the last real event we loaded and
435
435
  // force the runtime into the "no cursor after initial load" full-
436
436
  // reload fallback on every subsequent replay iteration.
@@ -492,8 +492,8 @@ export function isSlotGapCheckEnabled() {
492
492
  * bump-and-report write hands back the slots it skipped ({@link
493
493
  * mergeReportedEvents}), an inline delta extends the tail (`absorbCreateDelta`
494
494
  * in `runtime.ts`), and a listed page appends ({@link appendUniqueEvents}).
495
- * They look alarming the replay is reading an array while something else
496
- * writes to it and they are safe for one reason worth stating plainly, since
495
+ * They look alarming (the replay is reading an array while something else
496
+ * writes to it) and they are safe for one reason worth stating plainly, since
497
497
  * every correctness argument in this file leans on it.
498
498
  *
499
499
  * **An event in the log is a fact, and a longer log cannot retract one.** The
@@ -505,8 +505,8 @@ export function isSlotGapCheckEnabled() {
505
505
  *
506
506
  * Merging is therefore monotone: it can only add facts this replay has yet to
507
507
  * reconcile to, never remove one it already has. That is why absorbing is
508
- * always optional and never wrong to decline an unabsorbed event is one the
509
- * next read returns and why the guards below can afford to be strict.
508
+ * always optional and never wrong to decline (an unabsorbed event is one the
509
+ * next read returns), and why the guards below can afford to be strict.
510
510
  */
511
511
  /**
512
512
  * Merge the events a bump-and-report write handed back into the log it was
@@ -540,7 +540,7 @@ export function mergeReportedEvents(target, events) {
540
540
  * would raise the log's highest position past a position whose event is
541
541
  * missing. Later writes read that maximum to say what they have seen, so each
542
542
  * would claim a position it never saw, and the World only reports the span a
543
- * write skips it would never send the missing one. Dropping costs one more
543
+ * write skips: it would never send the missing one. Dropping costs one more
544
544
  * round of the same events on the next write and keeps the log a prefix of the
545
545
  * truth, which the note above {@link mergeReportedEvents} explains is always an
546
546
  * available answer.
@@ -659,7 +659,7 @@ export function findEventSlotGap(events) {
659
659
  *
660
660
  * A hole can be transient. The World allocates a slot inside the insert that
661
661
  * occupies it, so two concurrent writers can collide, one retry past the other,
662
- * and the higher slot commit first leaving a window in which the lower one is
662
+ * and the higher slot commit first, leaving a window in which the lower one is
663
663
  * genuinely absent from a strongly-consistent read and fills in a moment later.
664
664
  * The window is one commit wide, so a short backoff clears it; anything that
665
665
  * survives all three re-reads is a position no write will ever occupy.
@@ -671,7 +671,7 @@ const SLOT_GAP_RECHECK_BASE_DELAY_MS = 25;
671
671
  * out, and return the settled log alongside the hole that survived.
672
672
  *
673
673
  * Reads are strongly consistent, so a hole is not an artifact of *when* the log
674
- * was read but it can be an artifact of a write that had not committed yet
674
+ * was read, but it can be an artifact of a write that had not committed yet
675
675
  * (see {@link SLOT_GAP_RECHECK_ATTEMPTS}). Distinguishing the two costs a
676
676
  * re-read, which is only ever paid by a replay that already found a hole.
677
677
  *
@@ -708,14 +708,14 @@ export function slotSnapshotParams(events) {
708
708
  * The events a rejecting World attached to a `PreconditionFailedError`, when it
709
709
  * returned the ones the client's snapshot was missing inline.
710
710
  *
711
- * Returns `null` for anything else no details, a World that did not implement
711
+ * Returns `null` for anything else: no details, a World that did not implement
712
712
  * this, or a payload that does not narrow cleanly. Callers fall back to
713
713
  * reloading the event log, which is always correct; this is untrusted-shaped
714
714
  * data on a failure path, so nothing here is repaired.
715
715
  *
716
716
  * `runId` is the caller's run. Every event must belong to it: the delta is
717
717
  * merged straight into the replay's log, and one foreign event there is a
718
- * corrupt log rather than a corrected one the replay would consume a
718
+ * corrupt log rather than a corrected one: the replay would consume a
719
719
  * correlation id for an event that does not exist on this run.
720
720
  */
721
721
  export function preconditionEventDelta(error, runId) {
@@ -785,7 +785,7 @@ export function withHealthCheck(handler, worldSpecVersion) {
785
785
  };
786
786
  }
787
787
  /** FNV-1a 32-bit hash of a string, as 8 hex chars. Tiny, deterministic, and
788
- * dependency-free used only to scope idempotency keys, not for security. */
788
+ * dependency-free. Used only to scope idempotency keys, not for security. */
789
789
  function fnv1a32Hex(value) {
790
790
  let hash = 0x811c9dc5;
791
791
  for (let i = 0; i < value.length; i++) {
@@ -796,19 +796,19 @@ function fnv1a32Hex(value) {
796
796
  }
797
797
  /**
798
798
  * Idempotency key for a step's background-dispatch queue message, scoped to
799
- * the step's IDENTITY correlation id plus (hashed) step name rather than
799
+ * the step's IDENTITY, correlation id plus (hashed) step name, rather than
800
800
  * the bare correlation id.
801
801
  *
802
802
  * The scoping matters for resilient step dispatch under the precondition
803
803
  * guard: a guard-rejected `step_created` leaves its (revoked) step message in
804
804
  * flight, and the corrected replay may re-derive the same correlation id for
805
805
  * a DIFFERENT step. Under a bare-correlationId key the corrected replay's
806
- * dispatch would silently dedupe against the revoked in-flight message
806
+ * dispatch would silently dedupe against the revoked in-flight message,
807
807
  * which then resolves `skipped` against the re-created entity (the server's
808
- * stepName fence rejects its bare start) and the legitimate step would
808
+ * stepName fence rejects its bare start), and the legitimate step would
809
809
  * never be executed. Scoping by step name keeps every dedup property that
810
810
  * matters (crash recovery re-dispatch, concurrent handlers, the delayed
811
- * retry sharing the suspension re-dispatch's key all name the same step)
811
+ * retry sharing the suspension re-dispatch's key: all name the same step)
812
812
  * while letting the corrected schedule's dispatch through.
813
813
  *
814
814
  * Every producer of a step-dispatch (or step-retry) message must use this
@@ -866,15 +866,15 @@ export function getQueueOverhead(message) {
866
866
  * If the world doesn't support encryption or the run has no key configured,
867
867
  * the cached value is `undefined`.
868
868
  *
869
- * The resolved value is deliberately the *full* capability the symmetric AES
870
- * key plus the run's X25519 keypair not just a `CryptoKey`. A run reading
869
+ * The resolved value is deliberately the *full* capability (the symmetric AES
870
+ * key plus the run's X25519 keypair), not just a `CryptoKey`. A run reading
871
871
  * its own event log can encounter sealed (`encp`) payloads that another run
872
872
  * wrote to it (a cross-deployment hook resumption, say), and opening those
873
873
  * needs the keypair. Resolving only the symmetric key would leave those
874
874
  * payloads unopenable and wedge the run.
875
875
  *
876
876
  * Used by step / workflow handlers to defer the (potentially expensive)
877
- * key fetch until the first code path that actually needs it typically
877
+ * key fetch until the first code path that actually needs it: typically
878
878
  * input hydration on the success path, or error dehydration on a failure
879
879
  * path. Both paths can race-call the accessor without triggering duplicate
880
880
  * fetches.
@@ -907,4 +907,4 @@ export function memoizeEncryptionKey(world, runOrId) {
907
907
  return cached;
908
908
  };
909
909
  }
910
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFXMUIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxJQUFJLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCx3REFBd0Q7QUFDeEQsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUM7QUFFNUM7Ozs7R0FJRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsc0JBQXNCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsWUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxD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QU0sR0FDVixPQUFPLE9BQU8sS0FBSyxRQUFRO29CQUN6QixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQy9DLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxtRUFBbUU7Z0JBQ25FLG1FQUFtRTtnQkFDbkUsa0VBQWtFO2dCQUNsRSx5QkFBeUI7Z0JBQ3pCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3JlYXRlRXZlbnRQYXJhbXMsXG4gIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIZWFsdGhDaGVja1BheWxvYWQsXG4gIFZhbGlkUXVldWVOYW1lLFxuICBXb3JrZmxvd1J1bixcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBGSVJTVF9FVkVOVF9TTE9ULFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEsXG4gIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gIHJlcXVpcmVFdmVudFNsb3QsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGJ5dGVzVG9CYXNlNjQsIGRlcml2ZVJ1bktleVBhaXIgfSBmcm9tICcuLi9zZWFsZWQtYm94LmpzJztcbmltcG9ydCB7XG4gIGRlcml2ZVJ1blBheWxvYWRLZXlzLFxuICB0eXBlIFBheWxvYWRLZXksXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldFNwYW5LaW5kLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuXG4vKiogRGVmYXVsdCB0aW1lb3V0IGZvciBoZWFsdGggY2hlY2tzIGluIG1pbGxpc2Vjb25kcyAqL1xuY29uc3QgREVGQVVMVF9IRUFMVEhfQ0hFQ0tfVElNRU9VVCA9IDMwXzAwMDtcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBzYWZlIHdvcmtmbG93IG5hbWVzLiBPbmx5IGFsbG93cyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyxcbiAqIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBkb3RzLCBmb3J3YXJkIHNsYXNoZXMgKGZvciBuYW1lc3BhY2VkIHdvcmtmbG93cyksXG4gKiBhbmQgYXQgc2lnbnMgKGZvciBzY29wZWQgcGFja2FnZXMpLlxuICovXG5jb25zdCBTQUZFX1dPUktGTE9XX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWjAtOV9cXC0uL0BdKyQvO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHdvcmtmbG93IG5hbWUgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcXVldWUgbmFtZS5cbiAqIEVuc3VyZXMgdGhlIHdvcmtmbG93IG5hbWUgb25seSBjb250YWlucyBzYWZlIGNoYXJhY3RlcnMgYmVmb3JlXG4gKiBpbnRlcnBvbGF0aW5nIGl0IGludG8gdGhlIHF1ZXVlIG5hbWUgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dRdWV1ZU5hbWUoXG4gIHdvcmtmbG93TmFtZTogc3RyaW5nLFxuICBuYW1lc3BhY2U/OiBzdHJpbmdcbik6IFZhbGlkUXVldWVOYW1lIHtcbiAgaWYgKCFTQUZFX1dPUktGTE9XX05BTUVfUEFUVEVSTi50ZXN0KHdvcmtmbG93TmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCB3b3JrZmxvdyBuYW1lIFwiJHt3b3JrZmxvd05hbWV9XCI6IG11c3Qgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlcywgaHlwaGVucywgZG90cywgZm9yd2FyZCBzbGFzaGVzLCBvciBhdCBzaWduc2BcbiAgICApO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoXG4gICAgJ3dvcmtmbG93JyxcbiAgICByZXNvbHZlUXVldWVOYW1lc3BhY2UobmFtZXNwYWNlKVxuICApO1xuICByZXR1cm4gYCR7cHJlZml4fSR7d29ya2Zsb3dOYW1lfWAgYXMgVmFsaWRRdWV1ZU5hbWU7XG59XG5cbmNvbnN0IGdlbmVyYXRlSWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RyZWFtIG5hbWUgZm9yIGEgaGVhbHRoIGNoZWNrIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uIElELlxuICovXG5mdW5jdGlvbiBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBfX2hlYWx0aF9jaGVja19fJHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgaGVhbHRoIGNoZWNrIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3VsdCB7XG4gIGhlYWx0aHk6IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIGlmIGhlYWx0aCBjaGVjayBmYWlsZWQgKi9cbiAgZXJyb3I/OiBzdHJpbmc7XG4gIC8qKiBMYXRlbmN5IGlmIHRoZSBoZWFsdGggY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgKi9cbiAgbGF0ZW5jeU1zPzogbnVtYmVyO1xuICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gb2YgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCwgdXNlZCBmb3JcbiAgICogY2FwYWJpbGl0eSBkZXRlY3Rpb24gKHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCkuIE9taXR0ZWQgd2hlbiB0aGVcbiAgICogcmVzcG9uZGluZyBkZXBsb3ltZW50IGRpZCBub3QgcHJvdmlkZSB0aGUgZmllbGQgYXMgYSBzdHJpbmcg4oCUXG4gICAqIGZvciBleGFtcGxlLCBhbiBvbGRlciBgQHdvcmtmbG93L2NvcmVgIHRoYXQgcHJlZGF0ZXMgdGhpcyBmaWVsZCxcbiAgICogb3IgYSBub24tSlNPTiBwbGFpbi10ZXh0IGhlYWx0aCByZXNwb25zZS5cbiAgICovXG4gIHdvcmtmbG93Q29yZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IChiYXNlNjQpLCByZXR1cm5lZCBvbmx5IHdoZW4gdGhlIHByb2JlXG4gICAqIGNhcnJpZWQgYSBgcnVuSWRgIGFuZCB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50IGhhcyBlbmNyeXB0aW9uIGVuYWJsZWQuXG4gICAqXG4gICAqIExldHMgYSBjcm9zcy1kZXBsb3ltZW50IGBzdGFydCgpYCBzZWFsIHRoZSB3b3JrZmxvdyBhcmd1bWVudHMgdXNpbmcgYVxuICAgKiByZXNwb25zZSBpdCB3YXMgYWxyZWFkeSB3YWl0aW5nIG9uLCBpbnN0ZWFkIG9mIG1ha2luZyBhIHNlcGFyYXRlXG4gICAqIGtleS1sb29rdXAgcmVxdWVzdC5cbiAgICovXG4gIGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uZGluZyBkZXBsb3ltZW50J3MgYEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT05gIOKAlCB0aGUgcHJvdG9jb2xcbiAgICogdmVyc2lvbiBhdCB3aGljaCB0aGUgKmNvbnN1bWVyKiAocXVldWUtbWVzc2FnZSB0YXJnZXQpIHJlLWVuc3VyZXMgdGhlXG4gICAqIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIGBob29rSW5wdXRgIG9uIHJlcGxheS4gQSBjcm9zcy1kZXBsb3ltZW50XG4gICAqIGBzdGFydCgpYCBzdGFtcHMgdGhlICp0YXJnZXQncyogdmFsdWUgKG5vdCB0aGUgY2FsbGVyJ3MpIGludG8gdGhlIG5ld1xuICAgKiBydW4ncyBgZXhlY3V0aW9uQ29udGV4dC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uYCBzbyB0aGF0IGByZXN1bWVIb29rKClgXG4gICAqIG9ubHkgdGFrZXMgdGhlIHBhcmFsbGVsIHBhdGggd2hlbiB0aGUgZGVwbG95bWVudCB0aGF0IHdpbGwgYWN0dWFsbHlcbiAgICogY29uc3VtZSB0aGUgcXVldWUgbWVzc2FnZSBpcyBrbm93biB0byBob25vciBgaG9va0lucHV0YC4gT21pdHRlZCB3aGVuIHRoZVxuICAgKiByZXNwb25kaW5nIGRlcGxveW1lbnQgcHJlZGF0ZXMgdGhpcyBmaWVsZCAoYW4gb2xkZXIgY29uc3VtZXIgdGhhdCBpZ25vcmVzXG4gICAqIGBob29rSW5wdXRgKSwgd2hpY2ggZmFpbHMgdGhlIGdhdGUgY2xvc2VkLlxuICAgKi9cbiAgaG9va1Jlc3VtZUlucHV0VmVyc2lvbj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBoZWFsdGggY2hlY2sgcGF5bG9hZC5cbiAqIElmIHNvLCByZXR1cm5zIHRoZSBwYXJzZWQgcGF5bG9hZC4gT3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQoXG4gIG1lc3NhZ2U6IHVua25vd25cbik6IEhlYWx0aENoZWNrUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc3VsdCA9IEhlYWx0aENoZWNrUGF5bG9hZFNjaGVtYS5zYWZlUGFyc2UobWVzc2FnZSk7XG4gIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGRldGVybWluaXN0aWMgZmFrZSBydW5JZCBmb3IgaGVhbHRoIGNoZWNrIHN0cmVhbXMuXG4gKiBCb3RoIHRoZSB3cml0ZXIgKGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSkgYW5kIHJlYWRlciAoaGVhbHRoQ2hlY2spIGRlcml2ZVxuICogdGhlIHNhbWUgcnVuSWQgZnJvbSB0aGUgY29ycmVsYXRpb25JZCBzbyB0aGF0IGltcGxlbWVudGF0aW9ucyB0aGF0IHNjb3BlXG4gKiBzdHJlYW0gcmVhZHMgYnkgcnVuSWQgc3RpbGwgd29yayBjb3JyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHdydW5faGNfJHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlIGJ5IHdyaXRpbmcgdGhlIHJlc3VsdCB0byB0aGUgd29ybGQncyBzdHJlYW0uXG4gKiBUaGUgY2FsbGVyIGNhbiBsaXN0ZW4gdG8gdGhpcyBzdHJlYW0gdG8gZ2V0IHRoZSBoZWFsdGggY2hlY2sgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGhlYWx0aENoZWNrIC0gVGhlIHBhcnNlZCBoZWFsdGggY2hlY2sgcGF5bG9hZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICBoZWFsdGhDaGVjazogSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICB3b3JsZFNwZWNWZXJzaW9uPzogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgY29uc3Qgc3RyZWFtTmFtZSA9IGdldEhlYWx0aENoZWNrU3RyZWFtTmFtZShoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkKTtcblxuICAvLyBXaGVuIHRoZSBwcm9iZSBuYW1lcyBhIHJ1biB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGNyZWF0ZSwgcHVibGlzaCB0aGF0XG4gIC8vIHJ1bidzIHB1YmxpYyBrZXkuIFdlIGFyZSBleGVjdXRpbmcgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gaXRzXG4gIC8vIGtleSBtYXRlcmlhbCBpcyBhdmFpbGFibGUgbG9jYWxseSAobm8gQVBJIGNhbGwpLCBhbmQgdGhlIGNhbGxlciBjYW4gdGhlblxuICAvLyBzZWFsIHRoZSB3b3JrZmxvdyBhcmd1bWVudHMgc3RyYWlnaHQgZnJvbSB0aGlzIHJlc3BvbnNlIHJhdGhlciB0aGFuXG4gIC8vIG1ha2luZyBhIHNlcGFyYXRlIGtleS1sb29rdXAgcmVxdWVzdC5cbiAgLy9cbiAgLy8gT25seSBhICpwdWJsaWMqIGtleSBtYXkgdHJhdmVsIHRoaXMgd2F5OiB0aGUgcHJvYmUgcmVzcG9uc2Ugc3RyZWFtIGlzXG4gIC8vIGRlbGliZXJhdGVseSB1bmF1dGhlbnRpY2F0ZWQsIHNvIGFueXRoaW5nIHNlY3JldCB3b3VsZCBiZSBleHBvc2VkLlxuICAvLyBCZXN0LWVmZm9ydCDigJQgYSBmYWlsdXJlIGhlcmUgbXVzdCBub3QgZmFpbCB0aGUgaGVhbHRoIGNoZWNrIGl0c2VsZiwgd2hpY2hcbiAgLy8gY2FsbGVycyBhbHNvIHJlbHkgb24gZm9yIHBsYWluIGNhcGFiaWxpdHkgZGV0ZWN0aW9uLlxuICBsZXQgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoaGVhbHRoQ2hlY2sucnVuSWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGhlYWx0aENoZWNrLnJ1bklkKTtcbiAgICAgIGlmIChyYXdLZXkpIHtcbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IGJ5dGVzVG9CYXNlNjQoXG4gICAgICAgICAgKGF3YWl0IGRlcml2ZVJ1bktleVBhaXIocmF3S2V5KSkucHVibGljS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdIZWFsdGggY2hlY2sgY291bGQgbm90IGRlcml2ZSBhIHJ1biBwdWJsaWMga2V5OyB0aGUgY2FsbGVyIHdpbGwgZmFsbCBiYWNrIHRvIGEga2V5IGxvb2t1cCcsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgaGVhbHRoeTogdHJ1ZSxcbiAgICBjb3JyZWxhdGlvbklkOiBoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkLFxuICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgLy8gV2UgYXJlIGV4ZWN1dGluZyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50LCBzbyB0aGlzIGNvbnN0YW50IHJlZmxlY3RzXG4gICAgLy8gdGhlICpjb25zdW1lcidzKiBob29rLXJlc3VtZSBwcm90b2NvbCB2ZXJzaW9uIOKAlCBleGFjdGx5IHdoYXQgYVxuICAgIC8vIGNyb3NzLWRlcGxveW1lbnQgY2FsbGVyIG5lZWRzIHRvIGdhdGUgaXRzIHBhcmFsbGVsIHJlc3VtZSBwYXRoIG9uLlxuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb246IEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gICAgLi4uKGVuY3J5cHRpb25QdWJsaWNLZXkgPyB7IGVuY3J5cHRpb25QdWJsaWNLZXkgfSA6IHt9KSxcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gIH0pO1xuICAvLyBVc2UgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZGVyaXZlZCBmcm9tIHRoZSBjb3JyZWxhdGlvbklkIHNvIHRoYXRcbiAgLy8gdGhlIHJlYWRlciBzaWRlIHByb2R1Y2VzIHRoZSBzYW1lIHZhbHVlLlxuICBjb25zdCBmYWtlUnVuSWQgPSBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG4gIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUoZmFrZVJ1bklkLCBzdHJlYW1OYW1lLCByZXNwb25zZSk7XG4gIGF3YWl0IHdvcmxkLnN0cmVhbXMuY2xvc2UoZmFrZVJ1bklkLCBzdHJlYW1OYW1lKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja09wdGlvbnMge1xuICAvKiogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLiBEZWZhdWx0OiAzMDAwMCAoMzBzKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVwbG95bWVudCBJRCB0byBzZW5kIHRoZSBoZWFsdGggY2hlY2sgdG8uIEZhbGxzIGJhY2sgdG8gcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQuICovXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gaWQgdGhlIGNhbGxlciBpcyBhYm91dCB0byBjcmVhdGUuIFdoZW4gc2V0LCB0aGUgcmVzcG9uZGluZ1xuICAgKiBkZXBsb3ltZW50IGRlcml2ZXMgdGhhdCBydW4ncyBwdWJsaWMga2V5IGxvY2FsbHkgYW5kIHJldHVybnMgaXQgYXNcbiAgICogYGVuY3J5cHRpb25QdWJsaWNLZXlgLCBsZXR0aW5nIGEgY3Jvc3MtZGVwbG95bWVudCBgc3RhcnQoKWAgc2VhbCB0aGVcbiAgICogd29ya2Zsb3cgYXJndW1lbnRzIHdpdGhvdXQgYSBzZXBhcmF0ZSBrZXkgbG9va3VwLlxuICAgKi9cbiAgcnVuSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2Ugb2YgdGhlIHRhcmdldCBkZXBsb3ltZW50IChlLmcuIGAnZXZlJ2AgZm9yIHRvcGljcyBsaWtlXG4gICAqIGBfX2V2ZV93a2Zfd29ya2Zsb3dfKmApLiBGYWxscyBiYWNrIHRvIGBXT1JLRkxPV19RVUVVRV9OQU1FU1BBQ0VgIGluIHRoZVxuICAgKiBjYWxsaW5nIHByb2Nlc3MuIENyb3NzLWNvbnRleHQgY2FsbGVycyAoZS5nLiB0aGUgb2JzZXJ2YWJpbGl0eVxuICAgKiBkYXNoYm9hcmQpIG11c3QgcGFzcyB0aGUgdGFyZ2V0IGRlcGxveW1lbnQncyBuYW1lc3BhY2UgZXhwbGljaXRseSDigJRcbiAgICogdGhlIGVudiBmYWxsYmFjayByZXNvbHZlcyBpbiB0aGUgY2FsbGVyJ3MgcHJvY2VzcywgYW5kIGEgbWVzc2FnZVxuICAgKiBwdWJsaXNoZWQgdG8gYSBtaXNtYXRjaGVkIHRvcGljIGhhcyBubyBjb25zdW1lciwgc28gdGhlIGNoZWNrIHdvdWxkXG4gICAqIGFsd2F5cyB0aW1lIG91dC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlYWx0aCBjaGVjayBieSBzZW5kaW5nIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBxdWV1ZSBwaXBlbGluZVxuICogYW5kIHZlcmlmeWluZyBpdCBpcyBwcm9jZXNzZWQgYnkgdGhlIGNvbWJpbmVkIHdvcmtmbG93IGVuZHBvaW50LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gYnlwYXNzZXMgRGVwbG95bWVudCBQcm90ZWN0aW9uIG9uIFZlcmNlbCBiZWNhdXNlIGl0IGdvZXNcbiAqIHRocm91Z2ggdGhlIHF1ZXVlIGluZnJhc3RydWN0dXJlIHJhdGhlciB0aGFuIGRpcmVjdCBIVFRQLlxuICpcbiAqIEBwYXJhbSB3b3JsZCAtIFRoZSBXb3JsZCBpbnN0YW5jZSB0byB1c2UgZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGhlYWx0aCBjaGVja1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gaGVhbHRoIGNoZWNrIHJlc3VsdFxuICovXG4vLyBQb2xsIGludGVydmFsIGZvciBoZWFsdGggY2hlY2sgcmV0cmllcyAobXMpXG5jb25zdCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTCA9IDEwMDtcbi8vIFBlci1yZWFkIHRpbWVvdXQgdG8gcHJldmVudCBibG9ja2luZyBmb3JldmVyIG9uIGxvY2FsIHdvcmxkJ3MgRXZlbnRFbWl0dGVyXG4vLyAod2hpY2ggZG9lc24ndCB3b3JrIGFjcm9zcyBwcm9jZXNzZXMpXG5jb25zdCBIRUFMVEhfQ0hFQ0tfUkVBRF9USU1FT1VUID0gNTAwO1xuXG4vKipcbiAqIFJlYWQgY2h1bmtzIGZyb20gYSBzdHJlYW0gd2l0aCBhIHRpbWVvdXQgcGVyIHJlYWQgb3BlcmF0aW9uLlxuICogUmV0dXJucyB7IGNodW5rcywgdGltZWRPdXQgfSB3aGVyZSB0aW1lZE91dCBpbmRpY2F0ZXMgaWYgYSByZWFkIHRpbWVkIG91dC5cbiAqL1xuLyoqXG4gKiBSYWNlIGEgcHJvbWlzZSBhZ2FpbnN0IGEgZGVhZGxpbmUuIFJlamVjdHMgd2l0aCBhIHRpbWVvdXQgZXJyb3Igd2hlbiB0aGVcbiAqIGRlYWRsaW5lIGVsYXBzZXMgZmlyc3QuIFVzZWQgdG8gYm91bmQgYHdvcmxkLnN0cmVhbXMuZ2V0KClgIGluc2lkZSB0aGVcbiAqIGhlYWx0aC1jaGVjayBwb2xsIGxvb3A6IHNvbWUgd29ybGRzIGhvbGQgdGhhdCByZXF1ZXN0IG9wZW4gdW50aWwgdGhlXG4gKiBzdHJlYW0gaGFzIGRhdGEgKGUuZy4gd29ya2Zsb3ctc2VydmVyIGhvbGRzIHVud3JpdHRlbiBzdHJlYW1zIG9wZW4gZm9yXG4gKiB+MiBtaW51dGVzKSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJsb3cgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBoZWFsdGhcbiAqIGNoZWNrIHRpbWVvdXQg4oCUIHRoZSBgd2hpbGVgIGNvbmRpdGlvbiBpcyBvbmx5IHJlLWNoZWNrZWQgYmV0d2VlblxuICogaXRlcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gd2l0aERlYWRsaW5lPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIG1zOiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgcHJvbWlzZSxcbiAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGBPcGVyYXRpb24gdGltZWQgb3V0IGFmdGVyICR7bXN9bXNgKSksXG4gICAgICAgIG1zXG4gICAgICApO1xuICAgIH0pLFxuICBdKS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dCh0aW1lcikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gIHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+LFxuICByZWFkVGltZW91dDogbnVtYmVyXG4pOiBQcm9taXNlPHsgY2h1bmtzOiBVaW50OEFycmF5W107IHRpbWVkT3V0OiBib29sZWFuIH0+IHtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IHRpbWVkT3V0ID0gZmFsc2U7XG5cbiAgd2hpbGUgKCFkb25lICYmICF0aW1lZE91dCkge1xuICAgIGNvbnN0IHJlYWRQcm9taXNlID0gcmVhZGVyLnJlYWQoKTtcbiAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHsgZG9uZTogdHJ1ZTsgdmFsdWU6IHVuZGVmaW5lZCB9PihcbiAgICAgIChyZXNvbHZlKSA9PlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aW1lZE91dCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0sIHJlYWRUaW1lb3V0KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3JlYWRQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgIGRvbmUgPSByZXN1bHQuZG9uZTtcbiAgICBpZiAocmVzdWx0LnZhbHVlKSBjaHVua3MucHVzaChyZXN1bHQudmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHsgY2h1bmtzLCB0aW1lZE91dCB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIGhlYWx0aCBjaGVjayByZXNwb25zZSBmcm9tIHN0cmVhbSBjaHVua3MuXG4gKiBSZXR1cm5zIHRoZSBwYXJzZWQgcmVzcG9uc2Ugb3IgbnVsbCBpZiBpbnZhbGlkLlxuICovXG5mdW5jdGlvbiBwYXJzZUhlYWx0aENoZWNrUmVzcG9uc2UoY2h1bmtzOiBVaW50OEFycmF5W10pOiB7XG4gIGhlYWx0aHk6IGJvb2xlYW47XG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xufSB8IG51bGwge1xuICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdG90YWxMZW5ndGggPSBjaHVua3MucmVkdWNlKChzdW0sIGNodW5rKSA9PiBzdW0gKyBjaHVuay5sZW5ndGgsIDApO1xuICBjb25zdCBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgY29tYmluZWQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VUZXh0ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbWJpbmVkKTtcblxuICBsZXQgcmVzcG9uc2U6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE9sZCBkZXBsb3ltZW50cyAoc3BlY1ZlcnNpb24gPCAzKSByZXR1cm4gcGxhaW4gdGV4dCBsaWtlXG4gICAgLy8gJ1dvcmtmbG93IFNESyBcIi4uLlwiIGVuZHBvaW50IGlzIGhlYWx0aHknLiBUcmVhdCBhbnkgbm9uLWVtcHR5XG4gICAgLy8gdGV4dCByZXNwb25zZSBhcyBhIGhlYWx0aHkgZGVwbG95bWVudCB3aXRoIHVua25vd24gc3BlY1ZlcnNpb24uXG4gICAgaWYgKHJlc3BvbnNlVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4geyBoZWFsdGh5OiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiByZXNwb25zZSAhPT0gJ29iamVjdCcgfHxcbiAgICByZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICEoJ2hlYWx0aHknIGluIHJlc3BvbnNlKSB8fFxuICAgIHR5cGVvZiAocmVzcG9uc2UgYXMgeyBoZWFsdGh5OiB1bmtub3duIH0pLmhlYWx0aHkgIT09ICdib29sZWFuJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcGFyc2VkOiB7XG4gICAgaGVhbHRoeTogYm9vbGVhbjtcbiAgICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICAgIGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmc7XG4gICAgaG9va1Jlc3VtZUlucHV0VmVyc2lvbj86IG51bWJlcjtcbiAgfSA9IHtcbiAgICBoZWFsdGh5OiByLmhlYWx0aHkgYXMgYm9vbGVhbixcbiAgfTtcbiAgaWYgKHR5cGVvZiByLnNwZWNWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5zcGVjVmVyc2lvbiA9IHIuc3BlY1ZlcnNpb247XG4gIH1cbiAgaWYgKHR5cGVvZiByLndvcmtmbG93Q29yZVZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgcGFyc2VkLndvcmtmbG93Q29yZVZlcnNpb24gPSByLndvcmtmbG93Q29yZVZlcnNpb247XG4gIH1cbiAgaWYgKHR5cGVvZiByLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcGFyc2VkLmVuY3J5cHRpb25QdWJsaWNLZXkgPSByLmVuY3J5cHRpb25QdWJsaWNLZXk7XG4gIH1cbiAgaWYgKHR5cGVvZiByLmhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgcGFyc2VkLmhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSByLmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlYWx0aENoZWNrKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdGlvbnM/OiBIZWFsdGhDaGVja09wdGlvbnNcbik6IFByb21pc2U8SGVhbHRoQ2hlY2tSZXN1bHQ+IHtcbiAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPz8gREVGQVVMVF9IRUFMVEhfQ0hFQ0tfVElNRU9VVDtcbiAgLy8gVXNlIHRoZSB3b3JsZCdzIElEIGdlbmVyYXRvciB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgY29ycmVsYXRpb25JZCBpcyBhXG4gIC8vIHJlZ2lvbi10YWdnZWQgVUxJRC4gVGhlIGhlYWx0aC1jaGVjayByZXNwb25zZSBpcyBkZWxpdmVyZWQgb3ZlciBhIHN0cmVhbVxuICAvLyB3aG9zZSBuYW1lIGVtYmVkcyB0aGlzIGNvcnJlbGF0aW9uSWQ7IHVuZGVyIHBsYXRmb3JtLWRpcmVjdGVkIHJvdXRpbmcgdGhlXG4gIC8vIHJlYWRlciBhbmQgdGhlIHJlc3BvbmRpbmcgZW5kcG9pbnQgY2FuIGJlIHNlcnZlZCBmcm9tIGRpZmZlcmVudCBwaHlzaWNhbFxuICAvLyByZWdpb25zLCBzbyB0aGUgcmVnaW9uIG11c3QgYmUgZW5jb2RlZCBpbiB0aGUgSUQgaXRzZWxmIGZvciBib3RoIHNpZGVzIHRvXG4gIC8vIHJlc29sdmUgdGhlIHNhbWUgKHJlZ2lvbi1waW5uZWQpIGJhY2tlbmQuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBVTElEIGZvclxuICAvLyB3b3JsZHMgdGhhdCBkb24ndCB0YWcgSURzIChlLmcuIGxvY2FsKSwgd2hpY2ggcmVzb2x2ZSB0byB0aGUgZGVmYXVsdFxuICAvLyByZWdpb24gb24gYm90aCBzaWRlcy5cbiAgY29uc3QgY29ycmVsYXRpb25JZCA9IHdvcmxkLmNyZWF0ZVJ1bklkPy4oKSA/PyBnZW5lcmF0ZUlkKCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZCk7XG5cbiAgY29uc3QgcXVldWVOYW1lID1cbiAgICBgJHtnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpKX1oZWFsdGhfY2hlY2tgIGFzIFZhbGlkUXVldWVOYW1lO1xuXG4gIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3b3JsZC5xdWV1ZShcbiAgICAgIHF1ZXVlTmFtZSxcbiAgICAgIHtcbiAgICAgICAgX19oZWFsdGhDaGVjazogdHJ1ZSxcbiAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgLi4uKG9wdGlvbnM/LnJ1bklkID8geyBydW5JZDogb3B0aW9ucy5ydW5JZCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gVXNlIEpTT04gdHJhbnNwb3J0IHNvIHRoZSBoZWFsdGggY2hlY2sgd29ya3MgYWdhaW5zdCBib3RoXG4gICAgICAgIC8vIG9sZCAoSlNPTi1vbmx5KSBhbmQgbmV3IChkdWFsKSBkZXBsb3ltZW50cy5cbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gICAgICAgIGRlcGxveW1lbnRJZDogb3B0aW9ucz8uZGVwbG95bWVudElkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd2l0aERlYWRsaW5lKFxuICAgICAgICAgIHdvcmxkLnN0cmVhbXMuZ2V0KFxuICAgICAgICAgICAgZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGNvcnJlbGF0aW9uSWQpLFxuICAgICAgICAgICAgc3RyZWFtTmFtZVxuICAgICAgICAgICksXG4gICAgICAgICAgcmVtYWluaW5nTXNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCB7IGNodW5rcywgdGltZWRPdXQgfSA9IGF3YWl0IHJlYWRTdHJlYW1XaXRoVGltZW91dChcbiAgICAgICAgICByZWFkZXIsXG4gICAgICAgICAgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aW1lZE91dCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFkZXIuY2FuY2VsKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgY2FuY2VsIGVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcGFyc2VIZWFsdGhDaGVja1Jlc3BvbnNlKGNodW5rcyk7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZXNwb25zZSxcbiAgICAgICAgICAgIGxhdGVuY3lNczogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogYEhlYWx0aCBjaGVjayB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zYCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFsdGh5OiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKFxuICBydW5JZDogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmdcbik6IFdvcmtmbG93V29ybGRFcnJvciB7XG4gIHJldHVybiBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgIGBFdmVudCBwYWdpbmF0aW9uICR7bWVzc2FnZX0gZm9yIHdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIuYCxcbiAgICB7IGNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUiB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZFJlcXVlc3RlZEV2ZW50Q3Vyc29yKFxuICBydW5JZDogc3RyaW5nLFxuICBjdXJzb3I6IHN0cmluZyB8IG51bGwsXG4gIHJlcXVlc3RlZEN1cnNvcnM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjdXJzb3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHJlcXVlc3RlZEN1cnNvcnMuaGFzKGN1cnNvcikpIHtcbiAgICB0aHJvdyBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKHJ1bklkLCAnZGlkIG5vdCBhZHZhbmNlJyk7XG4gIH1cbiAgcmVxdWVzdGVkQ3Vyc29ycy5hZGQoY3Vyc29yKTtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGV2ZW50cyB3aG9zZSBJRHMgYXJlIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gYHRhcmdldGAuXG4gKlxuICogUGFzcyB0aGUgSURzIGN1cnJlbnRseSBwcmVzZW50IGluIGB0YXJnZXRgIHdoZW4gYXBwZW5kaW5nIHJlcGVhdGVkbHkgdG8gdGhlXG4gKiBzYW1lIGFycmF5LiBUaGUgc2V0IGlzIHVwZGF0ZWQgYWxvbmdzaWRlIGB0YXJnZXRgLlxuICpcbiAqIEV2ZW50cyBhcmUgYXBwZW5kZWQgaW4gdGhlIG9yZGVyIHRoZSBXb3JsZCByZXR1cm5lZCB0aGVtLCBhbmQgYXJlIG5vdFxuICogcmUtc29ydGVkLiBFdmVyeSBhcHBlbmQgc291cmNlIGlzIGFscmVhZHkgaW4gY2Fub25pY2FsIG9yZGVyIHJlbGF0aXZlIHRvIHRoZVxuICogdGFpbCAoYSBjdXJzb3ItZGVsaW1pdGVkIHBhZ2UsIG9yIGEgd3JpdGUtcmVzcG9uc2UgZGVsdGEpLCBzbyByZWNlaXB0IG9yZGVyIGlzXG4gKiB0aGUgb3JkZXIgdG8ga2VlcCwgYW5kIHJlLXNvcnRpbmcgaGVyZSB3b3VsZCBvbmx5IGNvc3QgYSBwYXNzIG92ZXIgdGhlIGxvZy5cbiAqIE5vdGhpbmcgZG93bnN0cmVhbSBtYXkgYXNzdW1lIHRoZSB0YWlsIGlzIHRoZSBuZXdlc3QgZXZlbnQg4oCUIHNlZVxuICoge0BsaW5rIG1heEV2ZW50U2xvdH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRVbmlxdWVFdmVudHMoXG4gIHRhcmdldDogRXZlbnRbXSxcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdLFxuICB0YXJnZXRJZHM/OiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaWRzID0gdGFyZ2V0SWRzID8/IG5ldyBTZXQodGFyZ2V0Lm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBpZiAoaWRzLmhhcyhldmVudC5ldmVudElkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlkcy5hZGQoZXZlbnQuZXZlbnRJZCk7XG4gICAgdGFyZ2V0LnB1c2goZXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogSW5zZXJ0cyBgZXZlbnRgIGludG8gYHRhcmdldGAgYXQgdGhlIHBvc2l0aW9uIHRoYXQga2VlcHMgYHRhcmdldGAgb3JkZXJlZCBieVxuICogYXNjZW5kaW5nIGBldmVudElkYCwgb3Igbm8tb3BzIGlmIGFuIGV2ZW50IHdpdGggdGhlIHNhbWUgYGV2ZW50SWRgIGlzIGFscmVhZHlcbiAqIHByZXNlbnQgKGlkZW1wb3RlbnQpLlxuICpcbiAqIGBwcmVsb2FkZWRFdmVudHNgIGlzIGxvYWRlZCBgc29ydE9yZGVyOiAnYXNjJ2AgYW5kIGlzIG5ldmVyIHJlLXNvcnRlZFxuICogY2xpZW50LXNpZGUsIHNvIGEgYGhvb2tfcmVjZWl2ZWRgIHNwbGljZWQgaW4gYnkgdGhlIGxhenktcmVzdW1lIGNvbnN1bWVyIG11c3RcbiAqIGxhbmQgaW4gYGV2ZW50SWRgIG9yZGVyIOKAlCBhIHBsYWluIGBwdXNoYCB3b3VsZCBwbGFjZSBhIGxhdGUtY29tbWl0dGluZ1xuICogZWFybGllciBldmVudCBhZnRlciBldmVudHMgdGhhdCBzb3J0IGJlZm9yZSBpdCwgY29ycnVwdGluZyByZXBsYXkuXG4gKlxuICogTGV4aWNvZ3JhcGhpYyBzdHJpbmcgb3JkZXIgaXMgdGhlIGxvZydzIG9yZGVyOiBhIHNsb3QgaWQgaXMgYSBmaXhlZC13aWR0aFxuICogemVyby1wYWRkZWQgcG9zaXRpb24sIHNvIGNvbXBhcmluZyB0aGUgc3RyaW5ncyBjb21wYXJlcyB0aGUgcG9zaXRpb25zLiBUaGlzXG4gKiBuZWVkcyBubyBwYXJzZSBvZiBpdHMgb3duIGZvciB0aGF0IHJlYXNvbiwgYW5kIHRoZSBjb21wYXJpc29uIGlzIGV4YWN0IHJhdGhlclxuICogdGhhbiBhIHJlY29uc3RydWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0RXZlbnRCeUV2ZW50SWQodGFyZ2V0OiBFdmVudFtdLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgLy8gTGluZWFyIHNjYW4gZnJvbSB0aGUgZW5kOiB0aGUgc3BsaWNlZCBldmVudCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBuZXdlc3RcbiAgLy8gKGl0IHNvcnRzIGF0IG9yIG5lYXIgdGhlIHRhaWwpLCBzbyB0aGlzIGZpbmRzIHRoZSBzbG90IGluIE8oMSnigJNPKGspIGZvciB0aGVcbiAgLy8gY29tbW9uIGNhc2Ugd2hpbGUgc3RpbGwgaGFuZGxpbmcgYW4gb3V0LW9mLW9yZGVyIGxhdGUgYXJyaXZhbCBjb3JyZWN0bHkuXG4gIGxldCBpID0gdGFyZ2V0Lmxlbmd0aDtcbiAgd2hpbGUgKGkgPiAwKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0YXJnZXRbaSAtIDFdO1xuICAgIGlmIChleGlzdGluZy5ldmVudElkID09PSBldmVudC5ldmVudElkKSB7XG4gICAgICAvLyBBbHJlYWR5IHByZXNlbnQg4oCUIGtlZXAgdGhlIHNwbGljZSBpZGVtcG90ZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXhpc3RpbmcuZXZlbnRJZCA8IGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpLS07XG4gIH1cbiAgdGFyZ2V0LnNwbGljZShpLCAwLCBldmVudCk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydEV2ZW50UGFnaW5hdGlvblByb2dyZXNzKFxuICBydW5JZDogc3RyaW5nLFxuICBoYXNNb3JlOiBib29sZWFuLFxuICBjdXJzb3I6IHN0cmluZyB8IG51bGwsXG4gIHJlcXVlc3RlZEN1cnNvcnM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgaWYgKCFoYXNNb3JlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjdXJzb3IgPT09IG51bGwpIHtcbiAgICB0aHJvdyBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKFxuICAgICAgcnVuSWQsXG4gICAgICAncmV0dXJuZWQgbW9yZSBwYWdlcyB3aXRob3V0IGEgY3Vyc29yJ1xuICAgICk7XG4gIH1cbiAgaWYgKHJlcXVlc3RlZEN1cnNvcnMuaGFzKGN1cnNvcikpIHtcbiAgICB0aHJvdyBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKHJ1bklkLCAncmVwZWF0ZWQgYSBjdXJzb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRSZXRyeVdpdGhvdXRFdmVudEN1cnNvcihcbiAgZXJyb3I6IHVua25vd24sXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgYWxyZWFkeVJldHJpZWQ6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGN1cnNvciAhPT0gbnVsbCAmJlxuICAgICFhbHJlYWR5UmV0cmllZCAmJlxuICAgIFdvcmtmbG93V29ybGRFcnJvci5pcyhlcnJvcikgJiZcbiAgICBlcnJvci5zdGF0dXMgPT09IDQwMFxuICApO1xufVxuXG4vKipcbiAqIExvYWRzIHdvcmtmbG93IHJ1biBldmVudHMgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHBhZ2VzIG9mIHBhZ2luYXRlZFxuICogcmVzdWx0cy4gRXZlbnRzIGFyZSByZXR1cm5lZCBpbiBjaHJvbm9sb2dpY2FsIChhc2NlbmRpbmcpIG9yZGVyIGZvclxuICogZGV0ZXJtaW5pc3RpYyB3b3JrZmxvdyByZXBsYXkuXG4gKlxuICogQHBhcmFtIHJ1bklkIC0gVGhlIHdvcmtmbG93IHJ1biBJRC5cbiAqIEBwYXJhbSBhZnRlckN1cnNvciAtIElmIHByb3ZpZGVkLCBvbmx5IGV2ZW50cyBhZnRlciB0aGlzIGN1cnNvciBhcmVcbiAqICAgcmV0dXJuZWQgKGluY3JlbWVudGFsIGxvYWQpLiBJZiBvbWl0dGVkLCBhbGwgZXZlbnRzIGFyZSByZXR1cm5lZC5cbiAqICAgVGhlIHJldHVybmVkIGN1cnNvciBjYW4gYmUgcGFzc2VkIGJhY2sgaW4gb24gYSBzdWJzZXF1ZW50IGNhbGwgZm9yXG4gKiAgIGluY3JlbWVudGFsIGxvYWRpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGFmdGVyQ3Vyc29yPzogc3RyaW5nXG4pOiBQcm9taXNlPExvYWRlZEV2ZW50TG9nPiB7XG4gIGNvbnN0IGluY3JlbWVudGFsID0gYWZ0ZXJDdXJzb3IgIT09IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRyYWNlKFxuICAgIGluY3JlbWVudGFsID8gJ3dvcmtmbG93LmxvYWROZXdFdmVudHMnIDogJ3dvcmtmbG93LmxvYWRFdmVudHMnLFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGxvYWRlZEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgICAgY29uc3QgbG9hZGVkRXZlbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBhZnRlckN1cnNvciA/PyBudWxsO1xuICAgICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICAgICAgbGV0IHBhZ2VzTG9hZGVkID0gMDtcbiAgICAgIGxldCByZXRyaWVkV2l0aG91dEN1cnNvciA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgY29uc3QgbG9hZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICAgIC8vIFRPRE86IHdlJ3JlIGN1cnJlbnRseSBsb2FkaW5nIGFsbCB0aGUgZGF0YSB3aXRoIHJlc29sdmVSZWYgYmVoYXZpb3VyLiBXZSBuZWVkIHRvIHVwZGF0ZSB0aGlzXG4gICAgICAgIC8vIHRvIGxhenlsb2FkIHRoZSBkYXRhIGZyb20gdGhlIHdvcmxkIGluc3RlYWQgc28gdGhhdCB3ZSBjYW4gb3B0aW1pemUgYW5kIG1ha2UgdGhlIGV2ZW50IGxvZyBsb2FkaW5nXG4gICAgICAgIC8vIG11Y2ggZmFzdGVyIGFuZCBtZW1vcnkgZWZmaWNpZW50XG4gICAgICAgIGNvbnN0IHBhZ2VTdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvciA9IGN1cnNvcjtcbiAgICAgICAgcmVjb3JkUmVxdWVzdGVkRXZlbnRDdXJzb3IocnVuSWQsIHJlcXVlc3RlZEN1cnNvciwgcmVxdWVzdGVkQ3Vyc29ycyk7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHdvcmxkLmV2ZW50cy5saXN0Pj47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB3b3JsZC5ldmVudHMubGlzdCh7XG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgc29ydE9yZGVyOiAnYXNjJyxcbiAgICAgICAgICAgICAgY3Vyc29yOiByZXF1ZXN0ZWRDdXJzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzaG91bGRSZXRyeVdpdGhvdXRFdmVudEN1cnNvcihcbiAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgIHJlcXVlc3RlZEN1cnNvcixcbiAgICAgICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3JcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgJ0V2ZW50IGN1cnNvciB3YXMgcmVqZWN0ZWQ7IHJldHJ5aW5nIHdpdGggYSBmdWxsIGV2ZW50IHJlbG9hZC4nLFxuICAgICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2FkZWRFdmVudHMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxvYWRlZEV2ZW50SWRzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzLmNsZWFyKCk7XG4gICAgICAgICAgICBjdXJzb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3IgPSB0cnVlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kVW5pcXVlRXZlbnRzKGxvYWRlZEV2ZW50cywgcmVzcG9uc2UuZGF0YSwgbG9hZGVkRXZlbnRJZHMpO1xuICAgICAgICBoYXNNb3JlID0gcmVzcG9uc2UuaGFzTW9yZTtcbiAgICAgICAgYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgICByZXNwb25zZS5jdXJzb3IsXG4gICAgICAgICAgcmVxdWVzdGVkQ3Vyc29yc1xuICAgICAgICApO1xuICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgbGFzdCBub24tbnVsbCBjdXJzb3IgYWNyb3NzIHBhZ2VzLiBBIFdvcmxkIG1heVxuICAgICAgICAvLyBsZWdpdGltYXRlbHkgcmV0dXJuIGB7IGRhdGE6IFtdLCBjdXJzb3I6IG51bGwsIGhhc01vcmU6IGZhbHNlIH1gXG4gICAgICAgIC8vIG9uIGEgdHJhaWxpbmcgZW1wdHkgcGFnZSDigJQgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcHJldmlvdXMgcGFnZSdzXG4gICAgICAgIC8vIHVuZGVybHlpbmcgREIgcXVlcnkgaGl0IHRoZSBsaW1pdCBleGFjdGx5IGFuZCByZXR1cm5lZCBhXG4gICAgICAgIC8vIGBMYXN0RXZhbHVhdGVkS2V5YCBcImp1c3QgaW4gY2FzZVwiLiBPdmVyd3JpdGluZyB3aXRoIHRoYXQgbnVsbFxuICAgICAgICAvLyB3b3VsZCBsb3NlIHRoZSBwb3NpdGlvbiBwYXN0IHRoZSBsYXN0IHJlYWwgZXZlbnQgd2UgbG9hZGVkIGFuZFxuICAgICAgICAvLyBmb3JjZSB0aGUgcnVudGltZSBpbnRvIHRoZSBcIm5vIGN1cnNvciBhZnRlciBpbml0aWFsIGxvYWRcIiBmdWxsLVxuICAgICAgICAvLyByZWxvYWQgZmFsbGJhY2sgb24gZXZlcnkgc3Vic2VxdWVudCByZXBsYXkgaXRlcmF0aW9uLlxuICAgICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3IgPz8gY3Vyc29yO1xuICAgICAgICBwYWdlc0xvYWRlZCsrO1xuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ0xvYWRlZCBldmVudCBwYWdlJywge1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICAgIHBhZ2U6IHBhZ2VzTG9hZGVkLFxuICAgICAgICAgIHBhZ2VFdmVudHM6IHJlc3BvbnNlLmRhdGEubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICAgIGhhc01vcmUsXG4gICAgICAgICAgcGFnZU1zOiBEYXRlLm5vdygpIC0gcGFnZVN0YXJ0LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRXZlbnQgbG9hZCBjb21wbGV0ZScsIHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgIGluY3JlbWVudGFsLFxuICAgICAgICB0b3RhbEV2ZW50czogbG9hZGVkRXZlbnRzLmxlbmd0aCxcbiAgICAgICAgcGFnZXNMb2FkZWQsXG4gICAgICAgIHRvdGFsTXM6IERhdGUubm93KCkgLSBsb2FkU3RhcnQsXG4gICAgICB9KTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c0NvdW50KGxvYWRlZEV2ZW50cy5sZW5ndGgpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNQYWdlc0xvYWRlZChwYWdlc0xvYWRlZCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHsgZXZlbnRzOiBsb2FkZWRFdmVudHMsIGN1cnNvciB9O1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSdzIGxvYWRlZCBldmVudC1sb2cgc25hcHNob3Q6IHRoZSBldmVudHMgcmVwbGF5ZWQgc28gZmFyIGFuZCB0aGVcbiAqIGN1cnNvciBwb3NpdGlvbmVkIGFmdGVyIHRoZW0uIEhhbmRlZCB0byBoZWxwZXJzIHRoYXQgZGVyaXZlIHRoZSBwcmVjb25kaXRpb25cbiAqIHNuYXBzaG90IGZyb20gaXQ7IHRoZXkgZG8gbm90IG11dGF0ZSBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWRFdmVudExvZyB7XG4gIGV2ZW50czogRXZlbnRbXTtcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSByZXBsYXkgcmVmdXNlcyB0byBydW4gb3ZlciBhIGxvZyB3aXRoIGEgaG9sZSBpbiBpdCAoc2VlXG4gKiB7QGxpbmsgZmluZEV2ZW50U2xvdEdhcH0pLiAqKk9uIGJ5IGRlZmF1bHQqKjsgc2V0XG4gKiBgV09SS0ZMT1dfU0xPVF9HQVBfQ0hFQ0s9MGAgdG8gcmVwbGF5IGFjcm9zcyBob2xlcyBpbnN0ZWFkLlxuICpcbiAqIEEgV29ybGQgdGhhdCBhbGxvY2F0ZXMgYSBwb3NpdGlvbiBhdCB0aGUgbW9tZW50IGl0IGNvbW1pdHMgbGVhdmVzIG5vIGhvbGVcbiAqIGJlaGluZCB3aGVuIGEgd3JpdGUgZmFpbHMsIHNvIGRlbnNpdHkgaXMgYSBwcm9wZXJ0eSB0aGUgbG9nIGhhcyBieVxuICogY29uc3RydWN0aW9uIHJhdGhlciB0aGFuIG9uZSB0aGlzIGNoZWNrIG1haW50YWlucy4gV2hhdCB0aGUgY2hlY2sgaXMgZm9yIGlzXG4gKiB0aGUgcmVhZHMgYW5kIHRoZSBXb3JsZHMgd2hlcmUgdGhhdCBkb2VzIG5vdCBob2xkLCBhbmQgYnkgdGhlIHRpbWUgaXQgcnVuc1xuICogdGhlIGJlbmlnbiBleHBsYW5hdGlvbnMgYXJlIHNwZW50OiBhIHBvc2l0aW9uIG1pc3NpbmcgYmVjYXVzZSBhIGNvbmN1cnJlbnRcbiAqIGNvbW1pdCBpcyBub3QgdmlzaWJsZSB5ZXQgY2xlYXJzIG9uIGEgcmUtcmVhZCwgd2hpY2ggaXMgd2hhdFxuICoge0BsaW5rIHNldHRsZUV2ZW50U2xvdEdhcH0gZG9lcyBmaXJzdC5cbiAqXG4gKiBXaGF0IGlzIGxlZnQgaXMgYSBob2xlIHRoYXQgcGVyc2lzdHMsIGFuZCBpdHMgdHdvIGNhdXNlcyBhcmVcbiAqIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGxvZy4gRWl0aGVyIGEgV29ybGQgYWxsb2NhdGVkIHRoZSBwb3NpdGlvbiBvdXRzaWRlXG4gKiB0aGUgY29tbWl0IGFuZCBsb3N0IHRoZSB3cml0ZSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIGhhcHBlbmVkIHRoZXJlIGFuZFxuICogcmVwbGF5aW5nIHBhc3QgaXQgaXMgY29ycmVjdCwgb3IgYW4gZXZlbnQgdGhhdCBkaWQgaGFwcGVuIGlzIG1pc3NpbmcsIGluXG4gKiB3aGljaCBjYXNlIHJlcGxheWluZyBwYXN0IGl0IGRlY2lkZXMgYSBicmFuY2ggb24gYWJzZW5jZSBhbmQgcHJvZHVjZXMgYSB3cm9uZ1xuICogcmVzdWx0IHdpdGggbm90aGluZyB0byBzaG93IGZvciBpdC4gRmFpbGluZyBpcyB0aGUgcmVjb3ZlcmFibGUgc2lkZSBvZiB0aGF0XG4gKiB0cmFkZSwgYW5kIHRoaXMgaXMgdGhlIHdheSBiYWNrIG91dCBpZiBhIGZsZWV0IHR1cm5zIG91dCB0byBjYXJyeSBob2xlcyBvZlxuICogdGhlIGZpcnN0IGtpbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Nsb3RHYXBDaGVja0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19TTE9UX0dBUF9DSEVDSyAhPT0gJzAnO1xufVxuXG4vKlxuICogTWVyZ2luZyBpbnRvIGEgbG9nIGEgcmVwbGF5IGlzIG1pZHdheSB0aHJvdWdoIHJlYWRpbmcuXG4gKlxuICogVGhyZWUgcGF0aHMgYWRkIGV2ZW50cyB0byBhIGxvYWRlZCBsb2cgYWZ0ZXIgdGhlIHJlcGxheSBoYXMgc3RhcnRlZDogYVxuICogYnVtcC1hbmQtcmVwb3J0IHdyaXRlIGhhbmRzIGJhY2sgdGhlIHNsb3RzIGl0IHNraXBwZWQgKHtAbGlua1xuICogbWVyZ2VSZXBvcnRlZEV2ZW50c30pLCBhbiBpbmxpbmUgZGVsdGEgZXh0ZW5kcyB0aGUgdGFpbCAoYGFic29yYkNyZWF0ZURlbHRhYFxuICogaW4gYHJ1bnRpbWUudHNgKSwgYW5kIGEgbGlzdGVkIHBhZ2UgYXBwZW5kcyAoe0BsaW5rIGFwcGVuZFVuaXF1ZUV2ZW50c30pLlxuICogVGhleSBsb29rIGFsYXJtaW5nIOKAlCB0aGUgcmVwbGF5IGlzIHJlYWRpbmcgYW4gYXJyYXkgd2hpbGUgc29tZXRoaW5nIGVsc2VcbiAqIHdyaXRlcyB0byBpdCDigJQgYW5kIHRoZXkgYXJlIHNhZmUgZm9yIG9uZSByZWFzb24gd29ydGggc3RhdGluZyBwbGFpbmx5LCBzaW5jZVxuICogZXZlcnkgY29ycmVjdG5lc3MgYXJndW1lbnQgaW4gdGhpcyBmaWxlIGxlYW5zIG9uIGl0LlxuICpcbiAqICoqQW4gZXZlbnQgaW4gdGhlIGxvZyBpcyBhIGZhY3QsIGFuZCBhIGxvbmdlciBsb2cgY2Fubm90IHJldHJhY3Qgb25lLioqIFRoZVxuICogbG9nIGlzIGFwcGVuZC1vbmx5IGFuZCBwb3NpdGlvbnMgYXJlIG5ldmVyIHJldXNlZCwgc28gYSByZXBsYXkgdGhhdCBwcm9kdWNlZFxuICogZXZlbnQgRSBmcm9tIHRoZSBwcmVmaXggaXQgaGFkIGxvYWRlZCBoYXMgbWFkZSBFIHRydWUgZm9yIGV2ZXJ5IHJlcGxheSB0aGF0XG4gKiBmb2xsb3dzLiBBIGxhdGVyIHJlcGxheSByZWFkaW5nIGEgZnVsbGVyIGxvZyBkb2VzIG5vdCBnZXQgdG8gZGVjaWRlIEUgc2hvdWxkXG4gKiBub3QgYmUgdGhlcmU7IGl0IGNvbnN1bWVzIEUgYW5kIHJlY29uY2lsZXMgdG8gaXQsIHdoaWNoIGlzIHdoYXQgdGhlIGV2ZW50c1xuICogY29uc3VtZXIgZG9lcyB3aGVuIGl0IHdhbGtzIGEgbG9nIGhvbGRpbmcgd3JpdGVzIGZyb20gYSByZXBsYXkgdGhhdCByYWNlZCBpdC5cbiAqXG4gKiBNZXJnaW5nIGlzIHRoZXJlZm9yZSBtb25vdG9uZTogaXQgY2FuIG9ubHkgYWRkIGZhY3RzIHRoaXMgcmVwbGF5IGhhcyB5ZXQgdG9cbiAqIHJlY29uY2lsZSB0bywgbmV2ZXIgcmVtb3ZlIG9uZSBpdCBhbHJlYWR5IGhhcy4gVGhhdCBpcyB3aHkgYWJzb3JiaW5nIGlzXG4gKiBhbHdheXMgb3B0aW9uYWwgYW5kIG5ldmVyIHdyb25nIHRvIGRlY2xpbmUg4oCUIGFuIHVuYWJzb3JiZWQgZXZlbnQgaXMgb25lIHRoZVxuICogbmV4dCByZWFkIHJldHVybnMg4oCUIGFuZCB3aHkgdGhlIGd1YXJkcyBiZWxvdyBjYW4gYWZmb3JkIHRvIGJlIHN0cmljdC5cbiAqL1xuXG4vKipcbiAqIE1lcmdlIHRoZSBldmVudHMgYSBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZGVkIGJhY2sgaW50byB0aGUgbG9nIGl0IHdhc1xuICogZGVyaXZlZCBmcm9tLCBhbmQgYW5zd2VyIGhvdyBtYW55IG9mIHRoZW0gd2VyZSBuZXcuXG4gKlxuICogVW5saWtlIHtAbGluayBhcHBlbmRVbmlxdWVFdmVudHN9LCB0aGlzIHJlLXNvcnRzLiBUaGUgcmVwb3J0ZWQgZXZlbnRzIG9jY3VweVxuICogc2xvdHMgKmJlbG93KiB0aGUgd3JpdGUgdGhhdCByZXBvcnRlZCB0aGVtLCBzbyBhcHBlbmRpbmcgdGhlbSB3b3VsZCBwdXQgdGhlbVxuICogYWZ0ZXIgZXZlbnRzIHRoZXkgcHJlY2VkZS4gU29ydGluZyBieSBpZCByZXN0b3JlcyB0aGUgV29ybGQncyBjYW5vbmljYWwgb3JkZXJcbiAqIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGF0IGl0OiBhIHNsb3QgaWQgaXMgdGhhdCBvcmRlciwgd3JpdHRlbiBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSZXBvcnRlZEV2ZW50cyhcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IG51bWJlciB7XG4gIGNvbnN0IGJlZm9yZSA9IHRhcmdldC5sZW5ndGg7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyh0YXJnZXQsIGV2ZW50cyk7XG4gIGNvbnN0IGFkZGVkID0gdGFyZ2V0Lmxlbmd0aCAtIGJlZm9yZTtcbiAgaWYgKGFkZGVkID4gMCkge1xuICAgIHRhcmdldC5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5ldmVudElkIDwgYi5ldmVudElkID8gLTEgOiBhLmV2ZW50SWQgPiBiLmV2ZW50SWQgPyAxIDogMFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGFkZGVkO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnR9IGRpZCB3aXRoIGEgd3JpdGUncyByZXBvcnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNraXBwZWRTbG90UmVwb3J0IHtcbiAgLyoqIEhvdyBtYW55IG9mIHRoZSByZXBvcnRlZCBldmVudHMgd2VyZSBuZXcgdG8gdGhlIGxvZy4gWmVybyBpZiBkcm9wcGVkLiAqL1xuICBhZGRlZDogbnVtYmVyO1xuICAvKiogSG93IG1hbnkgZXZlbnRzIHRoZSByZXBvcnQgb2ZmZXJlZCwgd2hldGhlciBvciBub3QgdGhleSB3ZXJlIHRha2VuLiAqL1xuICBvZmZlcmVkOiBudW1iZXI7XG4gIC8qKiBUaGUgcmVwb3J0IHdhcyB0cnVuY2F0ZWQsIHNvIGl0IHdhcyBkcm9wcGVkIHdob2xlIGluc3RlYWQgb2YgbWVyZ2VkLiAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQXBwbHkgYSB3cml0ZSdzIHNraXBwZWQtc2xvdCByZXBvcnQgdG8gdGhlIGxvZyBpdCB3YXMgZGVyaXZlZCBmcm9tLCBkZWNpZGluZ1xuICogd2hldGhlciB0aGUgcmVwb3J0IG1heSBiZSB0YWtlbiBhdCBhbGwuXG4gKlxuICogRXZlcnkgcmVwbGF5LWNvbnRleHQgd3JpdGUgY2FuIGNvbWUgYmFjayBjYXJyeWluZyB0aGUgZXZlbnRzIG9uIHRoZSBzbG90cyBpdFxuICogc2tpcHBlZCBvdmVyLCBhbmQgZXZlcnkgY2FsbGVyIHdhbnRzIHRoZSBzYW1lIHRoaW5nIGZyb20gdGhlbTogZm9sZCB0aGVtIGluXG4gKiBzbyB0aGUgd3JpdGVzIHRoYXQgZm9sbG93IG5hbWUgYSBwb3NpdGlvbiBhYm92ZSB0aGVtLCBhbmQgc28gdGhlIHJlcGxheVxuICogcmVzdW1pbmcgZnJvbSB0aGlzIGxvZyBzZWVzIHRoZW0gd2l0aG91dCBhIHJlbG9hZC5cbiAqXG4gKiBUaGUgb25lIHBvbGljeSBpcyB0aGF0IGEgKip0cnVuY2F0ZWQgcmVwb3J0IGlzIGRyb3BwZWQgd2hvbGUqKi4gSXQgY292ZXJzIGFcbiAqIHNwYW4gb2YgcG9zaXRpb25zIGJ1dCBjYXJyaWVzIG9ubHkgc29tZSBvZiB0aGUgZXZlbnRzIG9uIHRoZW0sIHNvIG1lcmdpbmcgaXRcbiAqIHdvdWxkIHJhaXNlIHRoZSBsb2cncyBoaWdoZXN0IHBvc2l0aW9uIHBhc3QgYSBwb3NpdGlvbiB3aG9zZSBldmVudCBpc1xuICogbWlzc2luZy4gTGF0ZXIgd3JpdGVzIHJlYWQgdGhhdCBtYXhpbXVtIHRvIHNheSB3aGF0IHRoZXkgaGF2ZSBzZWVuLCBzbyBlYWNoXG4gKiB3b3VsZCBjbGFpbSBhIHBvc2l0aW9uIGl0IG5ldmVyIHNhdywgYW5kIHRoZSBXb3JsZCBvbmx5IHJlcG9ydHMgdGhlIHNwYW4gYVxuICogd3JpdGUgc2tpcHMg4oCUIGl0IHdvdWxkIG5ldmVyIHNlbmQgdGhlIG1pc3Npbmcgb25lLiBEcm9wcGluZyBjb3N0cyBvbmUgbW9yZVxuICogcm91bmQgb2YgdGhlIHNhbWUgZXZlbnRzIG9uIHRoZSBuZXh0IHdyaXRlIGFuZCBrZWVwcyB0aGUgbG9nIGEgcHJlZml4IG9mIHRoZVxuICogdHJ1dGgsIHdoaWNoIHRoZSBub3RlIGFib3ZlIHtAbGluayBtZXJnZVJlcG9ydGVkRXZlbnRzfSBleHBsYWlucyBpcyBhbHdheXMgYW5cbiAqIGF2YWlsYWJsZSBhbnN3ZXIuXG4gKlxuICogQ2FsbGVycyB0aGF0IGxvZyBkbyBzbyBmcm9tIHRoZSByZXR1cm5lZCBjb3VudHM7IHRoZSBkZWNpc2lvbiBpcyBub3QgdGhlaXJzXG4gKiB0byByZS1kZXJpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICByZXN1bHQ6IHsgZXZlbnRzPzogcmVhZG9ubHkgRXZlbnRbXTsgaGFzTW9yZT86IGJvb2xlYW4gfVxuKTogU2tpcHBlZFNsb3RSZXBvcnQge1xuICBjb25zdCBvZmZlcmVkID0gcmVzdWx0LmV2ZW50cz8ubGVuZ3RoID8/IDA7XG4gIGlmIChvZmZlcmVkID09PSAwKSB7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IDAsIG9mZmVyZWQ6IDAsIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgfVxuICBpZiAocmVzdWx0Lmhhc01vcmUgPT09IHRydWUpIHtcbiAgICByZXR1cm4geyBhZGRlZDogMCwgb2ZmZXJlZCwgdHJ1bmNhdGVkOiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhZGRlZDogbWVyZ2VSZXBvcnRlZEV2ZW50cyh0YXJnZXQsIHJlc3VsdC5ldmVudHMgPz8gW10pLFxuICAgIG9mZmVyZWQsXG4gICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBsb2FkZWQgbG9nIG9jY3VwaWVzLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gZW1wdHkgbG9nLlxuICpcbiAqIFRoZSBtYXhpbXVtLCBub3QgdGhlIGNvdW50LCBhbmQgdGhlIHR3byBhcmUgbm90IGludGVyY2hhbmdlYWJsZSBldmVuIHRob3VnaFxuICogYSBoZWFsdGh5IGxvZyBtYWtlcyB0aGVtIGVxdWFsLiBBIFdvcmxkIGhhbmRzIGEgcG9zaXRpb24gdG8gdGhlIGluc2VydCB0aGF0XG4gKiBvY2N1cGllcyBpdCwgc28gYSB3cml0ZSB0aGF0IG5ldmVyIGxhbmRzIGxlYXZlcyBubyBob2xlIGJlaGluZCBhbmQgdGhlIGxvZ1xuICogc3RheXMgZGVuc2UuIFdoYXQgdGhlIGNvdW50IGNhbm5vdCBzdXJ2aXZlIGlzIGEgKnBhcnRpYWwqIHJlYWQ6IGEgbG9nXG4gKiBhc3NlbWJsZWQgZnJvbSBhIHRydW5jYXRlZCByZXBvcnQsIG9yIHJlYWQgd2hpbGUgYSBjb25jdXJyZW50IHdyaXRlIGlzXG4gKiBjb21taXR0aW5nLCBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbi4gQ291bnRpbmcgdGhvc2VcbiAqIHdvdWxkIG1ha2UgdGhlIG5leHQgd3JpdGUgY2xhaW0gdG8gaGF2ZSBzZWVuIGxlc3MgdGhhbiBpdCBoYXMsIHNvIHRoZSBXb3JsZFxuICogd291bGQgcmVwb3J0IHRoZSBzYW1lIGV2ZW50cyBiYWNrIHRvIGl0IG9uIGV2ZXJ5IGF0dGVtcHQuXG4gKlxuICogQSBob2xlIGJlbG93IHRoZSBtYXhpbXVtIGlzIHRoZXJlZm9yZSBhIHByb3BlcnR5IG9mIHRoZSByZWFkLCBub3Qgb2YgdGhlIGxvZyxcbiAqIHdoaWNoIGlzIHdoYXQgbGV0cyB7QGxpbmsgc2V0dGxlRXZlbnRTbG90R2FwfSByZS1yZWFkIGluc3RlYWQgb2YgZ2l2aW5nIHVwLlxuICpcbiAqIEB0aHJvd3MgaWYgYW55IGV2ZW50IGlkIGNhcnJpZXMgbm8gc2xvdC4gRXZlcnkgV29ybGQgdGhlIHJ1bnRpbWUgcmVwbGF5c1xuICogYWdhaW5zdCBudW1iZXJzIGV2ZW50cyBieSBzbG90LCBzbyBhbiBpZCB0aGF0IGRvZXMgbm90IGlzIGEgYnJva2VuIGxvZyByYXRoZXJcbiAqIHRoYW4gYW4gb2xkZXIgb25lLCBhbmQgYSBtYXhpbXVtIGRlcml2ZWQgYnkgc2tpcHBpbmcgaXQgd291bGQgdW5kZXJzdGF0ZSB0aGVcbiAqIGxvZyB0byBldmVyeSB3cml0ZSB0aGF0IHJlYWRzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4RXZlbnRTbG90KGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCBtYXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBzbG90ID0gcmVxdWlyZUV2ZW50U2xvdChldmVudC5ldmVudElkKTtcbiAgICBpZiAobWF4ID09PSB1bmRlZmluZWQgfHwgc2xvdCA+IG1heCkge1xuICAgICAgbWF4ID0gc2xvdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cblxuLyoqIEEgcG9zaXRpb24gdGhlIGxvZyBza2lwcyBvdmVyLCBkZXNjcmliZWQgd2VsbCBlbm91Z2ggdG8gbmFtZSBpbiBhbiBlcnJvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTbG90R2FwIHtcbiAgLyoqIFRoZSBsb3dlc3Qgc2xvdCBiZWxvdyB0aGUgbG9nJ3MgbWF4aW11bSB0aGF0IG5vIGV2ZW50IG9jY3VwaWVzLiAqL1xuICBmaXJzdE1pc3NpbmdTbG90OiBudW1iZXI7XG4gIC8qKiBIb3cgbWFueSBzbG90cyBiZWxvdyB0aGUgbWF4aW11bSBubyBldmVudCBvY2N1cGllcy4gKi9cbiAgbWlzc2luZ0NvdW50OiBudW1iZXI7XG4gIC8qKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBsb2cgb2NjdXBpZXMuICovXG4gIG1heFNsb3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgaG9sZSBpbiBhIGxvYWRlZCBsb2csIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZSB0byBmaW5kLlxuICpcbiAqIFRoZSBXb3JsZCBhbGxvY2F0ZXMgZXZlcnkgcG9zaXRpb24sIHNvIGEgbG9nIHRoYXQgaG9sZHMgYG5gIGV2ZW50cyBiZWxvdyBzbG90XG4gKiBgbmAgaXMgbWlzc2luZyBvbmUuIFRoYXQgbWF0dGVycyBiZWZvcmUgYSByZXBsYXlcbiAqIGFuZCBub3doZXJlIGVsc2U6IHRoZSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXQgaGFzXG4gKiBoYXBwZW5lZCwgYW5kIGFuIGFic2VudCBwb3NpdGlvbiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGV2ZW50IHRoYXRcbiAqIG5ldmVyIG9jY3VycmVkLiBUaGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyIHdheSxcbiAqIGFuZCB0aGUgcnVuIGRpdmVyZ2VzIHF1aWV0bHkgcmF0aGVyIHRoYW4gZmFpbGluZy5cbiAqXG4gKiBPcmRlci1pbmRlcGVuZGVudCwgdW5saWtlIHRoZSBlcXVpdmFsZW50IGF1ZGl0IHRoZSBXb3JsZCBydW5zIG92ZXIgYSBwYWdlIGl0XG4gKiBqdXN0IHJlYWQuIEEgbG9hZGVkIGxvZyBpcyBhc3NlbWJsZWQgZnJvbSBsaXN0ZWQgcGFnZXMgcGx1cyB3aGF0ZXZlciBhXG4gKiBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZGVkIGJhY2ssIGFuZCB3aGlsZSB7QGxpbmsgbWVyZ2VSZXBvcnRlZEV2ZW50c31cbiAqIHJlc3RvcmVzIGlkIG9yZGVyLCBhIGNoZWNrIHRoYXQgY2FuIGZhaWwgYSBoZWFsdGh5IHJ1biBzaG91bGQgbm90IGRlcGVuZCBvblxuICogdGhhdCBoYXZpbmcgaGFwcGVuZWQuXG4gKlxuICogVGhlIGZpcnN0IHNsb3QgaXMgbmV2ZXIgY291bnRlZC4gSXQgYmVsb25ncyB0byBgcnVuX2NyZWF0ZWRgLCB3aGljaCBgc3RhcnQoKWBcbiAqIHBvc3RzIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBxdWV1ZSBzZW5kLCBzbyBhIGxvZyByZWFkIGluIHRoYXQgd2luZG93XG4gKiBsZWdpdGltYXRlbHkgYmVnaW5zIGF0IHRoZSBzZWNvbmQgc2xvdCBhbmQgZmlsbHMgaW4gb24gaXRzIG93bi4gRXZlcnkgcmVwbGF5XG4gKiB0aGF0IHJhY2VzIGEgcnVuJ3Mgb3duIHN0YXJ0IHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBob2xlLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGFuIGVtcHR5IGxvZywgd2hpY2ggaGFzIG5vIGRlbnNpdHkgdG8gY2hlY2suXG4gKlxuICogQHRocm93cyBpZiBhbnkgZXZlbnQgaWQgY2FycmllcyBubyBzbG90LCBmb3IgdGhlIHJlYXNvbiB7QGxpbmsgbWF4RXZlbnRTbG90fVxuICogZ2l2ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXZlbnRTbG90R2FwKFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IEV2ZW50U2xvdEdhcCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG9jY3VwaWVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCBtYXhTbG90ID0gMDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBzbG90ID0gcmVxdWlyZUV2ZW50U2xvdChldmVudC5ldmVudElkKTtcbiAgICBvY2N1cGllZC5hZGQoc2xvdCk7XG4gICAgaWYgKHNsb3QgPiBtYXhTbG90KSB7XG4gICAgICBtYXhTbG90ID0gc2xvdDtcbiAgICB9XG4gIH1cbiAgaWYgKG1heFNsb3QgPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGZsb29yID0gb2NjdXBpZWQuaGFzKEZJUlNUX0VWRU5UX1NMT1QpXG4gICAgPyBGSVJTVF9FVkVOVF9TTE9UXG4gICAgOiBGSVJTVF9FVkVOVF9TTE9UICsgMTtcbiAgLy8gRXZlcnkgc2xvdCBpcyBhdCBvciBhYm92ZSBgZmxvb3JgIGJ5IGNvbnN0cnVjdGlvbiwgc28gdGhlIGxvZyBpcyBkZW5zZVxuICAvLyBleGFjdGx5IHdoZW4gaXQgaG9sZHMgb25lIGV2ZW50IHBlciBwb3NpdGlvbiBpbiBgW2Zsb29yLCBtYXhTbG90XWAuIFRoZVxuICAvLyBzY2FuIGJlbG93IG9ubHkgcnVucyBvbmNlIHRoYXQgaGFzIGFscmVhZHkgYW5zd2VyZWQgbm8uXG4gIGlmIChvY2N1cGllZC5zaXplID09PSBtYXhTbG90IC0gZmxvb3IgKyAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgZmlyc3RNaXNzaW5nU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgbWlzc2luZ0NvdW50ID0gMDtcbiAgZm9yIChsZXQgc2xvdCA9IGZsb29yOyBzbG90IDw9IG1heFNsb3Q7IHNsb3QrKykge1xuICAgIGlmICghb2NjdXBpZWQuaGFzKHNsb3QpKSB7XG4gICAgICBmaXJzdE1pc3NpbmdTbG90ID8/PSBzbG90O1xuICAgICAgbWlzc2luZ0NvdW50Kys7XG4gICAgfVxuICB9XG4gIGlmIChmaXJzdE1pc3NpbmdTbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IGZpcnN0TWlzc2luZ1Nsb3QsIG1pc3NpbmdDb3VudCwgbWF4U2xvdCB9O1xufVxuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGEgZGV0ZWN0ZWQgaG9sZSBpcyByZS1yZWFkIGJlZm9yZSB0aGUgbG9nIGlzIHRha2VuIGF0IGl0c1xuICogd29yZCwgYW5kIHRoZSBiYWNrb2ZmIGJlZm9yZSBlYWNoIHJlLXJlYWQgKGRvdWJsaW5nIHBlciBhdHRlbXB0KS5cbiAqXG4gKiBBIGhvbGUgY2FuIGJlIHRyYW5zaWVudC4gVGhlIFdvcmxkIGFsbG9jYXRlcyBhIHNsb3QgaW5zaWRlIHRoZSBpbnNlcnQgdGhhdFxuICogb2NjdXBpZXMgaXQsIHNvIHR3byBjb25jdXJyZW50IHdyaXRlcnMgY2FuIGNvbGxpZGUsIG9uZSByZXRyeSBwYXN0IHRoZSBvdGhlcixcbiAqIGFuZCB0aGUgaGlnaGVyIHNsb3QgY29tbWl0IGZpcnN0IOKAlCBsZWF2aW5nIGEgd2luZG93IGluIHdoaWNoIHRoZSBsb3dlciBvbmUgaXNcbiAqIGdlbnVpbmVseSBhYnNlbnQgZnJvbSBhIHN0cm9uZ2x5LWNvbnNpc3RlbnQgcmVhZCBhbmQgZmlsbHMgaW4gYSBtb21lbnQgbGF0ZXIuXG4gKiBUaGUgd2luZG93IGlzIG9uZSBjb21taXQgd2lkZSwgc28gYSBzaG9ydCBiYWNrb2ZmIGNsZWFycyBpdDsgYW55dGhpbmcgdGhhdFxuICogc3Vydml2ZXMgYWxsIHRocmVlIHJlLXJlYWRzIGlzIGEgcG9zaXRpb24gbm8gd3JpdGUgd2lsbCBldmVyIG9jY3VweS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFMgPSAzO1xuY29uc3QgU0xPVF9HQVBfUkVDSEVDS19CQVNFX0RFTEFZX01TID0gMjU7XG5cbi8qKlxuICogUmUtcmVhZCBhIGxvZyB0aGF0IGxvb2tzIGhvbGV5IHVudGlsIHRoZSBob2xlIGZpbGxzIGluIG9yIHRoZSByZS1yZWFkcyBydW5cbiAqIG91dCwgYW5kIHJldHVybiB0aGUgc2V0dGxlZCBsb2cgYWxvbmdzaWRlIHRoZSBob2xlIHRoYXQgc3Vydml2ZWQuXG4gKlxuICogUmVhZHMgYXJlIHN0cm9uZ2x5IGNvbnNpc3RlbnQsIHNvIGEgaG9sZSBpcyBub3QgYW4gYXJ0aWZhY3Qgb2YgKndoZW4qIHRoZSBsb2dcbiAqIHdhcyByZWFkIOKAlCBidXQgaXQgY2FuIGJlIGFuIGFydGlmYWN0IG9mIGEgd3JpdGUgdGhhdCBoYWQgbm90IGNvbW1pdHRlZCB5ZXRcbiAqIChzZWUge0BsaW5rIFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFN9KS4gRGlzdGluZ3Vpc2hpbmcgdGhlIHR3byBjb3N0cyBhXG4gKiByZS1yZWFkLCB3aGljaCBpcyBvbmx5IGV2ZXIgcGFpZCBieSBhIHJlcGxheSB0aGF0IGFscmVhZHkgZm91bmQgYSBob2xlLlxuICpcbiAqIFRoZSByZWxvYWQgaXMgZnVsbCByYXRoZXIgdGhhbiBpbmNyZW1lbnRhbDogdGhlIG1pc3NpbmcgcG9zaXRpb24gaXMgYmVsb3cgdGhlXG4gKiBsb2cncyBtYXhpbXVtLCBzbyBhIGN1cnNvci1hbmNob3JlZCByZWFkIHN0YXJ0cyBwYXN0IGl0IGFuZCBjYW4gbmV2ZXIgc2VlIGl0XG4gKiBhcnJpdmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR0bGVFdmVudFNsb3RHYXAoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGxvYWRlZDogTG9hZGVkRXZlbnRMb2dcbik6IFByb21pc2U8eyBsb2c6IExvYWRlZEV2ZW50TG9nOyBnYXA6IEV2ZW50U2xvdEdhcCB8IHVuZGVmaW5lZCB9PiB7XG4gIGxldCBsb2cgPSBsb2FkZWQ7XG4gIGxldCBnYXAgPSBmaW5kRXZlbnRTbG90R2FwKGxvZy5ldmVudHMpO1xuICBmb3IgKFxuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICBnYXAgIT09IHVuZGVmaW5lZCAmJiBhdHRlbXB0IDwgU0xPVF9HQVBfUkVDSEVDS19BVFRFTVBUUztcbiAgICBhdHRlbXB0KytcbiAgKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIFNMT1RfR0FQX1JFQ0hFQ0tfQkFTRV9ERUxBWV9NUyAqIDIgKiogYXR0ZW1wdClcbiAgICApO1xuICAgIGxvZyA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgZ2FwID0gZmluZEV2ZW50U2xvdEdhcChsb2cuZXZlbnRzKTtcbiAgfVxuICByZXR1cm4geyBsb2csIGdhcCB9O1xufVxuXG4vKipcbiAqIEhvdyBtdWNoIG9mIGl0cyBydW4ncyBsb2cgYSByZXBsYXktY29udGV4dCBldmVudCBjcmVhdGlvbiBoYWQgbG9hZGVkIHdoZW4gaXRcbiAqIGRlY2lkZWQgdG8gd3JpdGUsIGFzIHRoZSBoaWdoZXN0IHNsb3QgdGhhdCBsb2cgb2NjdXBpZXMuXG4gKlxuICogT25lIGludGVnZXIgc2F5cyBpdCBiZWNhdXNlIHRoZSBXb3JsZCBrZWVwcyBpdHMgcG9zaXRpb25zIGRlbnNlOiBhIHdyaXRlclxuICogdGhhdCBuYW1lcyBzbG90IE4gaXMgY2xhaW1pbmcgdG8gaG9sZCBldmVyeSBldmVudCBmcm9tIDEgdG8gTiBhbmQgbm90aGluZ1xuICogYWJvdmUuIFRoZSBXb3JsZCBhbnN3ZXJzIGJ5IG51bWJlcmluZyB0aGUgd3JpdGUgYWJvdmUgd2hhdGV2ZXIgdGhlIGxvZyBoYXNcbiAqIGFjdHVhbGx5IHJlYWNoZWQgYW5kIGhhbmRpbmcgYmFjayB0aGUgZXZlbnRzIG9uIHRoZSBzbG90cyBpbiBiZXR3ZWVuIOKAlCB0aGVcbiAqIG9uZXMgdGhpcyB3cml0ZXIgZGVjaWRlZCB3aXRob3V0LlxuICpcbiAqIERlbnNpdHkgaXMgdGhlIFdvcmxkJ3MgaW52YXJpYW50LCBub3QgYSBjbGFpbSBhYm91dCB0aGlzIHBhcnRpY3VsYXIgcmVhZC4gQVxuICogcmVhZGVyIHRoYXQgaXMgc2hvcnQgb2YgYSBwb3NpdGlvbiBpdCBob2xkcyBubyBldmVudCBmb3IgbmFtZXMgYSBsb3dlciBOLFxuICogd2hpY2ggdW5kZXJzdGF0ZXMgd2hhdCBpdCBoYXMgc2VlbiBhbmQgb25seSBjb3N0cyBpdCBhIHdpZGVyIHJlcG9ydC4gTmFtaW5nXG4gKiBhIHBvc2l0aW9uIGl0IGNhbm5vdCBhY2NvdW50IGZvciBpcyB0aGUgZGlyZWN0aW9uIHRoYXQgaXMgdW5zYWZlLCB3aGljaCBpc1xuICogd2h5IHtAbGluayBzbG90U25hcHNob3RQYXJhbXN9IHRha2VzIHRoZSBtYXhpbXVtIHJhdGhlciB0aGFuIHRoZSBjb3VudC5cbiAqXG4gKiBJdHMgb3duIG9iamVjdCByYXRoZXIgdGhhbiBhIGJhcmUgbnVtYmVyIHNvIGEgY2FsbCBzaXRlIGNhbm5vdCBoYWxmLXNlbmQgaXQsXG4gKiBhbmQgc28gdGhlIGVtcHR5IGNhc2Ugc3ByZWFkcyB0byBub3RoaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsb3RTbmFwc2hvdFBhcmFtcyB7XG4gIGV2ZW50Q291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNsb3Qgc25hcHNob3QgdG8gYXR0YWNoIHRvIGEgcmVwbGF5LWNvbnRleHQgZXZlbnQgY3JlYXRpb24uXG4gKlxuICogRW1wdHkgZm9yIGFuIGVtcHR5IGxvZywgd2hpY2ggaXMgdGhlIHN0YXRlIGEgYHJ1bl9jcmVhdGVkYCB3cml0ZSBpcyBpc3N1ZWRcbiAqIGZyb206IHRoZXJlIGlzIG5vIHBvc2l0aW9uIGhlbGQgeWV0IHRvIG5hbWUuXG4gKlxuICogVGhlIG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIGxlbmd0aCwgZm9yIHRoZSByZWFzb24ge0BsaW5rIG1heEV2ZW50U2xvdH1cbiAqIGdpdmVzOiBhIHBhcnRpYWxseS1yZWFkIGxvZyBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbiwgYW5kXG4gKiBjb3VudGluZyB0aG9zZSB3b3VsZCBtYWtlIHRoZSB3cml0ZSBjbGFpbSB0byBoYXZlIHNlZW4gbGVzcyB0aGFuIGl0IGhhcywgc29cbiAqIHRoZSBXb3JsZCB3b3VsZCByZXBvcnQgdGhlIHNhbWUgZXZlbnRzIGJhY2sgb24gZXZlcnkgYXR0ZW1wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsb3RTbmFwc2hvdFBhcmFtcyhcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBTbG90U25hcHNob3RQYXJhbXMge1xuICBjb25zdCBldmVudENvdW50ID0gbWF4RXZlbnRTbG90KGV2ZW50cyk7XG4gIHJldHVybiBldmVudENvdW50ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZXZlbnRDb3VudCB9O1xufVxuXG4vKipcbiAqIFRoZSBldmVudHMgYSByZWplY3RpbmcgV29ybGQgYXR0YWNoZWQgdG8gYSBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgLCB3aGVuIGl0XG4gKiByZXR1cm5lZCB0aGUgb25lcyB0aGUgY2xpZW50J3Mgc25hcHNob3Qgd2FzIG1pc3NpbmcgaW5saW5lLlxuICpcbiAqIFJldHVybnMgYG51bGxgIGZvciBhbnl0aGluZyBlbHNlIOKAlCBubyBkZXRhaWxzLCBhIFdvcmxkIHRoYXQgZGlkIG5vdCBpbXBsZW1lbnRcbiAqIHRoaXMsIG9yIGEgcGF5bG9hZCB0aGF0IGRvZXMgbm90IG5hcnJvdyBjbGVhbmx5LiBDYWxsZXJzIGZhbGwgYmFjayB0b1xuICogcmVsb2FkaW5nIHRoZSBldmVudCBsb2csIHdoaWNoIGlzIGFsd2F5cyBjb3JyZWN0OyB0aGlzIGlzIHVudHJ1c3RlZC1zaGFwZWRcbiAqIGRhdGEgb24gYSBmYWlsdXJlIHBhdGgsIHNvIG5vdGhpbmcgaGVyZSBpcyByZXBhaXJlZC5cbiAqXG4gKiBgcnVuSWRgIGlzIHRoZSBjYWxsZXIncyBydW4uIEV2ZXJ5IGV2ZW50IG11c3QgYmVsb25nIHRvIGl0OiB0aGUgZGVsdGEgaXNcbiAqIG1lcmdlZCBzdHJhaWdodCBpbnRvIHRoZSByZXBsYXkncyBsb2csIGFuZCBvbmUgZm9yZWlnbiBldmVudCB0aGVyZSBpcyBhXG4gKiBjb3JydXB0IGxvZyByYXRoZXIgdGhhbiBhIGNvcnJlY3RlZCBvbmUg4oCUIHRoZSByZXBsYXkgd291bGQgY29uc3VtZSBhXG4gKiBjb3JyZWxhdGlvbiBpZCBmb3IgYW4gZXZlbnQgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoXG4gIGVycm9yOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nXG4pOiB7IGV2ZW50czogRXZlbnRbXTsgY3Vyc29yOiBzdHJpbmcgfCBudWxsIH0gfCBudWxsIHtcbiAgaWYgKCFQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnJvcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkZXRhaWxzID0gZXJyb3IuZGV0YWlscztcbiAgaWYgKHR5cGVvZiBkZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBkZXRhaWxzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBldmVudHMsIGN1cnNvciB9ID0gZGV0YWlscyBhcyB7IGV2ZW50cz86IHVua25vd247IGN1cnNvcj86IHVua25vd24gfTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykgfHwgZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgZXZlbnQgPT09IG51bGwgfHxcbiAgICAgIHR5cGVvZiAoZXZlbnQgYXMgeyBldmVudElkPzogdW5rbm93biB9KS5ldmVudElkICE9PSAnc3RyaW5nJyB8fFxuICAgICAgKGV2ZW50IGFzIHsgcnVuSWQ/OiB1bmtub3duIH0pLnJ1bklkICE9PSBydW5JZFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiBldmVudHMgYXMgRXZlbnRbXSxcbiAgICBjdXJzb3I6IHR5cGVvZiBjdXJzb3IgPT09ICdzdHJpbmcnID8gY3Vyc29yIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZXMgb25lIGV2ZW50IG9uIGEgYm91bmQgcnVuLCBjYXJyeWluZyByZXBsYXktcmVjb3ZlcnkgdGVsZW1ldHJ5LiAqL1xuZXhwb3J0IHR5cGUgRXZlbnRDcmVhdG9yID0gKFxuICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4pID0+IFByb21pc2U8RXZlbnRSZXN1bHQ+O1xuXG4vKipcbiAqIENPUlMgaGVhZGVycyBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlcy5cbiAqIEFsbG93cyB0aGUgb2JzZXJ2YWJpbGl0eSBVSSB0byBjaGVjayBlbmRwb2ludCBoZWFsdGggZnJvbSBhIGRpZmZlcmVudCBvcmlnaW4uXG4gKi9cbmNvbnN0IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMgPSB7XG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ1BPU1QsIE9QVElPTlMsIEdFVCwgSEVBRCcsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0NvbnRlbnQtVHlwZScsXG59O1xuXG4vKipcbiAqIFdyYXBzIGEgcmVxdWVzdC9yZXNwb25zZSBoYW5kbGVyIGFuZCBhZGRzIGEgaGVhbHRoIGNoZWNrIFwibW9kZVwiXG4gKiBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBgX19oZWFsdGhgIHF1ZXJ5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhIZWFsdGhDaGVjayhcbiAgaGFuZGxlcjogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpO1xuICAgIGNvbnN0IGlzSGVhbHRoQ2hlY2sgPSB1cmwuc2VhcmNoUGFyYW1zLmhhcygnX19oZWFsdGgnKTtcbiAgICBpZiAoaXNIZWFsdGhDaGVjaykge1xuICAgICAgLy8gSGFuZGxlIENPUlMgcHJlZmxpZ2h0IGZvciBoZWFsdGggY2hlY2tcbiAgICAgIGlmIChyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgICAgaGVhZGVyczogSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGVhbHRoeTogdHJ1ZSxcbiAgICAgICAgICBlbmRwb2ludDogdXJsLnBhdGhuYW1lLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIC4uLkhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgfTtcbn1cblxuLyoqIEZOVi0xYSAzMi1iaXQgaGFzaCBvZiBhIHN0cmluZywgYXMgOCBoZXggY2hhcnMuIFRpbnksIGRldGVybWluaXN0aWMsIGFuZFxuICogIGRlcGVuZGVuY3ktZnJlZSDigJQgdXNlZCBvbmx5IHRvIHNjb3BlIGlkZW1wb3RlbmN5IGtleXMsIG5vdCBmb3Igc2VjdXJpdHkuICovXG5mdW5jdGlvbiBmbnYxYTMySGV4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgaGFzaCA9IDB4ODExYzlkYzU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBoYXNoIF49IHZhbHVlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IE1hdGguaW11bChoYXNoLCAweDAxMDAwMTkzKTtcbiAgfVxuICByZXR1cm4gKGhhc2ggPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAnMCcpO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbmN5IGtleSBmb3IgYSBzdGVwJ3MgYmFja2dyb3VuZC1kaXNwYXRjaCBxdWV1ZSBtZXNzYWdlLCBzY29wZWQgdG9cbiAqIHRoZSBzdGVwJ3MgSURFTlRJVFkg4oCUIGNvcnJlbGF0aW9uIGlkIHBsdXMgKGhhc2hlZCkgc3RlcCBuYW1lIOKAlCByYXRoZXIgdGhhblxuICogdGhlIGJhcmUgY29ycmVsYXRpb24gaWQuXG4gKlxuICogVGhlIHNjb3BpbmcgbWF0dGVycyBmb3IgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggdW5kZXIgdGhlIHByZWNvbmRpdGlvblxuICogZ3VhcmQ6IGEgZ3VhcmQtcmVqZWN0ZWQgYHN0ZXBfY3JlYXRlZGAgbGVhdmVzIGl0cyAocmV2b2tlZCkgc3RlcCBtZXNzYWdlIGluXG4gKiBmbGlnaHQsIGFuZCB0aGUgY29ycmVjdGVkIHJlcGxheSBtYXkgcmUtZGVyaXZlIHRoZSBzYW1lIGNvcnJlbGF0aW9uIGlkIGZvclxuICogYSBESUZGRVJFTlQgc3RlcC4gVW5kZXIgYSBiYXJlLWNvcnJlbGF0aW9uSWQga2V5IHRoZSBjb3JyZWN0ZWQgcmVwbGF5J3NcbiAqIGRpc3BhdGNoIHdvdWxkIHNpbGVudGx5IGRlZHVwZSBhZ2FpbnN0IHRoZSByZXZva2VkIGluLWZsaWdodCBtZXNzYWdlIOKAlFxuICogd2hpY2ggdGhlbiByZXNvbHZlcyBgc2tpcHBlZGAgYWdhaW5zdCB0aGUgcmUtY3JlYXRlZCBlbnRpdHkgKHRoZSBzZXJ2ZXInc1xuICogc3RlcE5hbWUgZmVuY2UgcmVqZWN0cyBpdHMgYmFyZSBzdGFydCkg4oCUIGFuZCB0aGUgbGVnaXRpbWF0ZSBzdGVwIHdvdWxkXG4gKiBuZXZlciBiZSBleGVjdXRlZC4gU2NvcGluZyBieSBzdGVwIG5hbWUga2VlcHMgZXZlcnkgZGVkdXAgcHJvcGVydHkgdGhhdFxuICogbWF0dGVycyAoY3Jhc2ggcmVjb3ZlcnkgcmUtZGlzcGF0Y2gsIGNvbmN1cnJlbnQgaGFuZGxlcnMsIHRoZSBkZWxheWVkXG4gKiByZXRyeSBzaGFyaW5nIHRoZSBzdXNwZW5zaW9uIHJlLWRpc3BhdGNoJ3Mga2V5IOKAlCBhbGwgbmFtZSB0aGUgc2FtZSBzdGVwKVxuICogd2hpbGUgbGV0dGluZyB0aGUgY29ycmVjdGVkIHNjaGVkdWxlJ3MgZGlzcGF0Y2ggdGhyb3VnaC5cbiAqXG4gKiBFdmVyeSBwcm9kdWNlciBvZiBhIHN0ZXAtZGlzcGF0Y2ggKG9yIHN0ZXAtcmV0cnkpIG1lc3NhZ2UgbXVzdCB1c2UgdGhpc1xuICoga2V5LiBDcm9zcy12ZXJzaW9uIG1peGluZyBpcyBub3QgYSBjb25jZXJuOiBxdWV1ZSBtZXNzYWdlcyBhcmUgcGlubmVkIHRvXG4gKiB0aGUgZGVwbG95bWVudCB0aGF0IHByb2R1Y2VkIHRoZW0sIHNvIG9uZSBydW4gbmV2ZXIgc2VlcyB0d28ga2V5IHNjaGVtZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nLFxuICBzdGVwTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y29ycmVsYXRpb25JZH06JHtmbnYxYTMySGV4KHN0ZXBOYW1lKX1gO1xufVxuXG4vKipcbiAqIFF1ZXVlcyBhIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZCBxdWV1ZSB3aXRoIHRyYWNpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWV1ZU1lc3NhZ2UoXG4gIHdvcmxkOiBXb3JsZCxcbiAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2Ygd29ybGQucXVldWU+XG4pIHtcbiAgY29uc3QgcXVldWVOYW1lID0gYXJnc1swXTtcbiAgYXdhaXQgdHJhY2UoXG4gICAgJ3F1ZXVlLnB1Ymxpc2gnLFxuICAgIHtcbiAgICAgIC8vIFN0YW5kYXJkIE9URUwgbWVzc2FnaW5nIGNvbnZlbnRpb25zXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKHF1ZXVlTmFtZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwdWJsaXNoJyksXG4gICAgICAgIC8vIFBlZXIgc2VydmljZSBmb3IgRGF0YWRvZyBzZXJ2aWNlIG1hcHNcbiAgICAgICAgLi4uQXR0cmlidXRlLlBlZXJTZXJ2aWNlKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5ScGNTZXJ2aWNlKCd2cXMnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY01ldGhvZCgncHVibGlzaCcpLFxuICAgICAgfSxcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdQUk9EVUNFUicpLFxuICAgIH0sXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZUlkIH0gPSBhd2FpdCB3b3JsZC5xdWV1ZSguLi5hcmdzKTtcbiAgICAgIGlmIChtZXNzYWdlSWQpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1lc3NhZ2VJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBxdWV1ZSBvdmVyaGVhZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgYSBnaXZlbiBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVldWVPdmVyaGVhZChtZXNzYWdlOiB7IHJlcXVlc3RlZEF0PzogRGF0ZSB9KSB7XG4gIGlmICghbWVzc2FnZS5yZXF1ZXN0ZWRBdCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHJldHVybiBBdHRyaWJ1dGUuUXVldWVPdmVyaGVhZE1zKFxuICAgICAgRGF0ZS5ub3coKSAtIG1lc3NhZ2UucmVxdWVzdGVkQXQuZ2V0VGltZSgpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG1lbW9pemVkIGFjY2Vzc29yIGZvciBhIHJ1bidzIGZ1bGwgZW5jcnlwdGlvbiBjYXBhYmlsaXR5LlxuICpcbiAqIFRoZSBmaXJzdCBjYWxsIHJlc29sdmVzIHRoZSBydW4ncyBrZXkgbWF0ZXJpYWwgdmlhXG4gKiBgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgKHdoaWNoIG1heSBkbyBIS0RGIGRlcml2YXRpb24gbG9jYWxseSBvblxuICogVmVyY2VsLCBvciBhIG5ldHdvcmsgZmV0Y2ggZnJvbSBleHRlcm5hbCBjb250ZXh0cykgYW5kIGRlcml2ZXMgYVxuICoge0BsaW5rIFBheWxvYWRLZXl9IGZyb20gaXQ7IHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIHNhbWUgY2FjaGVkIHByb21pc2UuXG4gKiBJZiB0aGUgd29ybGQgZG9lc24ndCBzdXBwb3J0IGVuY3J5cHRpb24gb3IgdGhlIHJ1biBoYXMgbm8ga2V5IGNvbmZpZ3VyZWQsXG4gKiB0aGUgY2FjaGVkIHZhbHVlIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSByZXNvbHZlZCB2YWx1ZSBpcyBkZWxpYmVyYXRlbHkgdGhlICpmdWxsKiBjYXBhYmlsaXR5IOKAlCB0aGUgc3ltbWV0cmljIEFFU1xuICoga2V5IHBsdXMgdGhlIHJ1bidzIFgyNTUxOSBrZXlwYWlyIOKAlCBub3QganVzdCBhIGBDcnlwdG9LZXlgLiBBIHJ1biByZWFkaW5nXG4gKiBpdHMgb3duIGV2ZW50IGxvZyBjYW4gZW5jb3VudGVyIHNlYWxlZCAoYGVuY3BgKSBwYXlsb2FkcyB0aGF0IGFub3RoZXIgcnVuXG4gKiB3cm90ZSB0byBpdCAoYSBjcm9zcy1kZXBsb3ltZW50IGhvb2sgcmVzdW1wdGlvbiwgc2F5KSwgYW5kIG9wZW5pbmcgdGhvc2VcbiAqIG5lZWRzIHRoZSBrZXlwYWlyLiBSZXNvbHZpbmcgb25seSB0aGUgc3ltbWV0cmljIGtleSB3b3VsZCBsZWF2ZSB0aG9zZVxuICogcGF5bG9hZHMgdW5vcGVuYWJsZSBhbmQgd2VkZ2UgdGhlIHJ1bi5cbiAqXG4gKiBVc2VkIGJ5IHN0ZXAgLyB3b3JrZmxvdyBoYW5kbGVycyB0byBkZWZlciB0aGUgKHBvdGVudGlhbGx5IGV4cGVuc2l2ZSlcbiAqIGtleSBmZXRjaCB1bnRpbCB0aGUgZmlyc3QgY29kZSBwYXRoIHRoYXQgYWN0dWFsbHkgbmVlZHMgaXQg4oCUIHR5cGljYWxseVxuICogaW5wdXQgaHlkcmF0aW9uIG9uIHRoZSBzdWNjZXNzIHBhdGgsIG9yIGVycm9yIGRlaHlkcmF0aW9uIG9uIGEgZmFpbHVyZVxuICogcGF0aC4gQm90aCBwYXRocyBjYW4gcmFjZS1jYWxsIHRoZSBhY2Nlc3NvciB3aXRob3V0IHRyaWdnZXJpbmcgZHVwbGljYXRlXG4gKiBmZXRjaGVzLlxuICpcbiAqIEVycm9ycyB0aHJvd24gYnkgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gIHByb3BhZ2F0ZSB0byBldmVyeSBjYWxsZXJcbiAqICh0aGUgY2FjaGVkIHByb21pc2UgcmVqZWN0cykuIFRoaXMgaXMgaW50ZW50aW9uYWw6IHdoZW4gZW5jcnlwdGlvbiBpc1xuICogY29uZmlndXJlZCwgd2UgbmV2ZXIgd2FudCB0byBzaWxlbnRseSBmYWxsIGJhY2sgdG8gcGxhaW50ZXh0XG4gKiBzZXJpYWxpemF0aW9uLiBBIHByb3BhZ2F0ZWQgZXJyb3IgaW4gYW4gZXZlbnQtZW1pc3Npb24gcGF0aCBsZWF2ZXMgdGhlXG4gKiBvdXRlciB0cnkvY2F0Y2ggdG8gbG9nIGFuZCBzdXJmYWNlIHRoZSBpc3N1ZTsgdGhlIHF1ZXVlJ3MgcmVkZWxpdmVyeVxuICogc2VtYW50aWNzIHdpbGwgcmV0cnkgdGhlIGtleSBmZXRjaCBvbiB0aGUgbmV4dCBhdHRlbXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmdcbik6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICBsZXQgY2FjaGVkOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBUaGUgYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gIG92ZXJsb2FkIHNldCB0YWtlcyBlaXRoZXIgYVxuICAgICAgICAvLyBgV29ya2Zsb3dSdW5gIG9yIGEgYHJ1bklkOiBzdHJpbmdgICh3aXRoIG9wdGlvbmFsIGNvbnRleHQpLiBCcmFuY2hcbiAgICAgICAgLy8gaGVyZSBzbyBUeXBlU2NyaXB0IHBpY2tzIHRoZSByaWdodCBvdmVybG9hZCBmb3IgZWFjaCBzaGFwZS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID1cbiAgICAgICAgICB0eXBlb2YgcnVuT3JJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bk9ySWQpXG4gICAgICAgICAgICA6IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkKTtcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgKmZ1bGwqIGNhcGFiaWxpdHksIG5vdCBqdXN0IHRoZSBzeW1tZXRyaWMga2V5OiBhIHJ1blxuICAgICAgICAvLyByZWFkaW5nIGl0cyBvd24gZXZlbnQgbG9nIG1heSBlbmNvdW50ZXIgc2VhbGVkIChgZW5jcGApIHBheWxvYWRzXG4gICAgICAgIC8vIHRoYXQgYW5vdGhlciBydW4gd3JvdGUgdG8gaXQsIGFuZCBvcGVuaW5nIHRob3NlIG5lZWRzIHRoZSBydW4nc1xuICAgICAgICAvLyBYMjU1MTkgc2NhbGFyIGFzIHdlbGwuXG4gICAgICAgIHJldHVybiByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfTtcbn1cbiJdfQ==
910
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFXMUIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxJQUFJLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCx3REFBd0Q7QUFDeEQsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUM7QUFFNUM7Ozs7R0FJRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsc0JBQXNCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsWUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxD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QU0sR0FDVixPQUFPLE9BQU8sS0FBSyxRQUFRO29CQUN6QixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUM7b0JBQy9DLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxtRUFBbUU7Z0JBQ25FLG1FQUFtRTtnQkFDbkUsa0VBQWtFO2dCQUNsRSx5QkFBeUI7Z0JBQ3pCLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3IsXG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3JlYXRlRXZlbnRQYXJhbXMsXG4gIENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgRXZlbnQsXG4gIEV2ZW50UmVzdWx0LFxuICBIZWFsdGhDaGVja1BheWxvYWQsXG4gIFZhbGlkUXVldWVOYW1lLFxuICBXb3JrZmxvd1J1bixcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBGSVJTVF9FVkVOVF9TTE9ULFxuICBnZXRRdWV1ZVRvcGljUHJlZml4LFxuICBIZWFsdGhDaGVja1BheWxvYWRTY2hlbWEsXG4gIEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gIHJlcXVpcmVFdmVudFNsb3QsXG4gIHJlc29sdmVRdWV1ZU5hbWVzcGFjZSxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGJ5dGVzVG9CYXNlNjQsIGRlcml2ZVJ1bktleVBhaXIgfSBmcm9tICcuLi9zZWFsZWQtYm94LmpzJztcbmltcG9ydCB7XG4gIGRlcml2ZVJ1blBheWxvYWRLZXlzLFxuICB0eXBlIFBheWxvYWRLZXksXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbmltcG9ydCB7IGdldFNwYW5LaW5kLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuXG4vKiogRGVmYXVsdCB0aW1lb3V0IGZvciBoZWFsdGggY2hlY2tzIGluIG1pbGxpc2Vjb25kcyAqL1xuY29uc3QgREVGQVVMVF9IRUFMVEhfQ0hFQ0tfVElNRU9VVCA9IDMwXzAwMDtcblxuLyoqXG4gKiBQYXR0ZXJuIGZvciBzYWZlIHdvcmtmbG93IG5hbWVzLiBPbmx5IGFsbG93cyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyxcbiAqIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBkb3RzLCBmb3J3YXJkIHNsYXNoZXMgKGZvciBuYW1lc3BhY2VkIHdvcmtmbG93cyksXG4gKiBhbmQgYXQgc2lnbnMgKGZvciBzY29wZWQgcGFja2FnZXMpLlxuICovXG5jb25zdCBTQUZFX1dPUktGTE9XX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWjAtOV9cXC0uL0BdKyQvO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBhIHdvcmtmbG93IG5hbWUgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcXVldWUgbmFtZS5cbiAqIEVuc3VyZXMgdGhlIHdvcmtmbG93IG5hbWUgb25seSBjb250YWlucyBzYWZlIGNoYXJhY3RlcnMgYmVmb3JlXG4gKiBpbnRlcnBvbGF0aW5nIGl0IGludG8gdGhlIHF1ZXVlIG5hbWUgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dRdWV1ZU5hbWUoXG4gIHdvcmtmbG93TmFtZTogc3RyaW5nLFxuICBuYW1lc3BhY2U/OiBzdHJpbmdcbik6IFZhbGlkUXVldWVOYW1lIHtcbiAgaWYgKCFTQUZFX1dPUktGTE9XX05BTUVfUEFUVEVSTi50ZXN0KHdvcmtmbG93TmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCB3b3JrZmxvdyBuYW1lIFwiJHt3b3JrZmxvd05hbWV9XCI6IG11c3Qgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlcywgaHlwaGVucywgZG90cywgZm9yd2FyZCBzbGFzaGVzLCBvciBhdCBzaWduc2BcbiAgICApO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGdldFF1ZXVlVG9waWNQcmVmaXgoXG4gICAgJ3dvcmtmbG93JyxcbiAgICByZXNvbHZlUXVldWVOYW1lc3BhY2UobmFtZXNwYWNlKVxuICApO1xuICByZXR1cm4gYCR7cHJlZml4fSR7d29ya2Zsb3dOYW1lfWAgYXMgVmFsaWRRdWV1ZU5hbWU7XG59XG5cbmNvbnN0IGdlbmVyYXRlSWQgPSBtb25vdG9uaWNGYWN0b3J5KCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RyZWFtIG5hbWUgZm9yIGEgaGVhbHRoIGNoZWNrIHdpdGggdGhlIGdpdmVuIGNvcnJlbGF0aW9uIElELlxuICovXG5mdW5jdGlvbiBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBfX2hlYWx0aF9jaGVja19fJHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGEgaGVhbHRoIGNoZWNrIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3VsdCB7XG4gIGhlYWx0aHk6IGJvb2xlYW47XG4gIC8qKiBFcnJvciBtZXNzYWdlIGlmIGhlYWx0aCBjaGVjayBmYWlsZWQgKi9cbiAgZXJyb3I/OiBzdHJpbmc7XG4gIC8qKiBMYXRlbmN5IGlmIHRoZSBoZWFsdGggY2hlY2sgd2FzIHN1Y2Nlc3NmdWwgKi9cbiAgbGF0ZW5jeU1zPzogbnVtYmVyO1xuICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gb2YgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCwgdXNlZCBmb3JcbiAgICogY2FwYWJpbGl0eSBkZXRlY3Rpb24gKHNlZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzYCkuIE9taXR0ZWQgd2hlbiB0aGVcbiAgICogcmVzcG9uZGluZyBkZXBsb3ltZW50IGRpZCBub3QgcHJvdmlkZSB0aGUgZmllbGQgYXMgYSBzdHJpbmc6XG4gICAqIGZvciBleGFtcGxlLCBhbiBvbGRlciBgQHdvcmtmbG93L2NvcmVgIHRoYXQgcHJlZGF0ZXMgdGhpcyBmaWVsZCxcbiAgICogb3IgYSBub24tSlNPTiBwbGFpbi10ZXh0IGhlYWx0aCByZXNwb25zZS5cbiAgICovXG4gIHdvcmtmbG93Q29yZVZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IChiYXNlNjQpLCByZXR1cm5lZCBvbmx5IHdoZW4gdGhlIHByb2JlXG4gICAqIGNhcnJpZWQgYSBgcnVuSWRgIGFuZCB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50IGhhcyBlbmNyeXB0aW9uIGVuYWJsZWQuXG4gICAqXG4gICAqIExldHMgYSBjcm9zcy1kZXBsb3ltZW50IGBzdGFydCgpYCBzZWFsIHRoZSB3b3JrZmxvdyBhcmd1bWVudHMgdXNpbmcgYVxuICAgKiByZXNwb25zZSBpdCB3YXMgYWxyZWFkeSB3YWl0aW5nIG9uLCBpbnN0ZWFkIG9mIG1ha2luZyBhIHNlcGFyYXRlXG4gICAqIGtleS1sb29rdXAgcmVxdWVzdC5cbiAgICovXG4gIGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uZGluZyBkZXBsb3ltZW50J3MgYEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT05gOiB0aGUgcHJvdG9jb2xcbiAgICogdmVyc2lvbiBhdCB3aGljaCB0aGUgKmNvbnN1bWVyKiAocXVldWUtbWVzc2FnZSB0YXJnZXQpIHJlLWVuc3VyZXMgdGhlXG4gICAqIGBob29rX3JlY2VpdmVkYCBldmVudCBmcm9tIGBob29rSW5wdXRgIG9uIHJlcGxheS4gQSBjcm9zcy1kZXBsb3ltZW50XG4gICAqIGBzdGFydCgpYCBzdGFtcHMgdGhlICp0YXJnZXQncyogdmFsdWUgKG5vdCB0aGUgY2FsbGVyJ3MpIGludG8gdGhlIG5ld1xuICAgKiBydW4ncyBgZXhlY3V0aW9uQ29udGV4dC5ob29rUmVzdW1lSW5wdXRWZXJzaW9uYCBzbyB0aGF0IGByZXN1bWVIb29rKClgXG4gICAqIG9ubHkgdGFrZXMgdGhlIHBhcmFsbGVsIHBhdGggd2hlbiB0aGUgZGVwbG95bWVudCB0aGF0IHdpbGwgYWN0dWFsbHlcbiAgICogY29uc3VtZSB0aGUgcXVldWUgbWVzc2FnZSBpcyBrbm93biB0byBob25vciBgaG9va0lucHV0YC4gT21pdHRlZCB3aGVuIHRoZVxuICAgKiByZXNwb25kaW5nIGRlcGxveW1lbnQgcHJlZGF0ZXMgdGhpcyBmaWVsZCAoYW4gb2xkZXIgY29uc3VtZXIgdGhhdCBpZ25vcmVzXG4gICAqIGBob29rSW5wdXRgKSwgd2hpY2ggZmFpbHMgdGhlIGdhdGUgY2xvc2VkLlxuICAgKi9cbiAgaG9va1Jlc3VtZUlucHV0VmVyc2lvbj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBoZWFsdGggY2hlY2sgcGF5bG9hZC5cbiAqIElmIHNvLCByZXR1cm5zIHRoZSBwYXJzZWQgcGF5bG9hZC4gT3RoZXJ3aXNlIHJldHVybnMgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQoXG4gIG1lc3NhZ2U6IHVua25vd25cbik6IEhlYWx0aENoZWNrUGF5bG9hZCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJlc3VsdCA9IEhlYWx0aENoZWNrUGF5bG9hZFNjaGVtYS5zYWZlUGFyc2UobWVzc2FnZSk7XG4gIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGRldGVybWluaXN0aWMgZmFrZSBydW5JZCBmb3IgaGVhbHRoIGNoZWNrIHN0cmVhbXMuXG4gKiBCb3RoIHRoZSB3cml0ZXIgKGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSkgYW5kIHJlYWRlciAoaGVhbHRoQ2hlY2spIGRlcml2ZVxuICogdGhlIHNhbWUgcnVuSWQgZnJvbSB0aGUgY29ycmVsYXRpb25JZCBzbyB0aGF0IGltcGxlbWVudGF0aW9ucyB0aGF0IHNjb3BlXG4gKiBzdHJlYW0gcmVhZHMgYnkgcnVuSWQgc3RpbGwgd29yayBjb3JyZWN0bHkuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHdydW5faGNfJHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGhlYWx0aCBjaGVjayBtZXNzYWdlIGJ5IHdyaXRpbmcgdGhlIHJlc3VsdCB0byB0aGUgd29ybGQncyBzdHJlYW0uXG4gKiBUaGUgY2FsbGVyIGNhbiBsaXN0ZW4gdG8gdGhpcyBzdHJlYW0gdG8gZ2V0IHRoZSBoZWFsdGggY2hlY2sgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIGhlYWx0aENoZWNrIC0gVGhlIHBhcnNlZCBoZWFsdGggY2hlY2sgcGF5bG9hZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKFxuICBoZWFsdGhDaGVjazogSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICB3b3JsZFNwZWNWZXJzaW9uPzogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcbiAgY29uc3Qgc3RyZWFtTmFtZSA9IGdldEhlYWx0aENoZWNrU3RyZWFtTmFtZShoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkKTtcblxuICAvLyBXaGVuIHRoZSBwcm9iZSBuYW1lcyBhIHJ1biB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGNyZWF0ZSwgcHVibGlzaCB0aGF0XG4gIC8vIHJ1bidzIHB1YmxpYyBrZXkuIFdlIGFyZSBleGVjdXRpbmcgaW5zaWRlIHRoZSB0YXJnZXQgZGVwbG95bWVudCwgc28gaXRzXG4gIC8vIGtleSBtYXRlcmlhbCBpcyBhdmFpbGFibGUgbG9jYWxseSAobm8gQVBJIGNhbGwpLCBhbmQgdGhlIGNhbGxlciBjYW4gdGhlblxuICAvLyBzZWFsIHRoZSB3b3JrZmxvdyBhcmd1bWVudHMgc3RyYWlnaHQgZnJvbSB0aGlzIHJlc3BvbnNlIHJhdGhlciB0aGFuXG4gIC8vIG1ha2luZyBhIHNlcGFyYXRlIGtleS1sb29rdXAgcmVxdWVzdC5cbiAgLy9cbiAgLy8gT25seSBhICpwdWJsaWMqIGtleSBtYXkgdHJhdmVsIHRoaXMgd2F5OiB0aGUgcHJvYmUgcmVzcG9uc2Ugc3RyZWFtIGlzXG4gIC8vIGRlbGliZXJhdGVseSB1bmF1dGhlbnRpY2F0ZWQsIHNvIGFueXRoaW5nIHNlY3JldCB3b3VsZCBiZSBleHBvc2VkLlxuICAvLyBCZXN0LWVmZm9ydDogYSBmYWlsdXJlIGhlcmUgbXVzdCBub3QgZmFpbCB0aGUgaGVhbHRoIGNoZWNrIGl0c2VsZiwgd2hpY2hcbiAgLy8gY2FsbGVycyBhbHNvIHJlbHkgb24gZm9yIHBsYWluIGNhcGFiaWxpdHkgZGV0ZWN0aW9uLlxuICBsZXQgZW5jcnlwdGlvblB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoaGVhbHRoQ2hlY2sucnVuSWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKGhlYWx0aENoZWNrLnJ1bklkKTtcbiAgICAgIGlmIChyYXdLZXkpIHtcbiAgICAgICAgZW5jcnlwdGlvblB1YmxpY0tleSA9IGJ5dGVzVG9CYXNlNjQoXG4gICAgICAgICAgKGF3YWl0IGRlcml2ZVJ1bktleVBhaXIocmF3S2V5KSkucHVibGljS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdIZWFsdGggY2hlY2sgY291bGQgbm90IGRlcml2ZSBhIHJ1biBwdWJsaWMga2V5OyB0aGUgY2FsbGVyIHdpbGwgZmFsbCBiYWNrIHRvIGEga2V5IGxvb2t1cCcsXG4gICAgICAgIHtcbiAgICAgICAgICBjb3JyZWxhdGlvbklkOiBoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkLFxuICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgaGVhbHRoeTogdHJ1ZSxcbiAgICBjb3JyZWxhdGlvbklkOiBoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkLFxuICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgLy8gV2UgYXJlIGV4ZWN1dGluZyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50LCBzbyB0aGlzIGNvbnN0YW50IHJlZmxlY3RzXG4gICAgLy8gdGhlICpjb25zdW1lcidzKiBob29rLXJlc3VtZSBwcm90b2NvbCB2ZXJzaW9uLCBleGFjdGx5IHdoYXQgYVxuICAgIC8vIGNyb3NzLWRlcGxveW1lbnQgY2FsbGVyIG5lZWRzIHRvIGdhdGUgaXRzIHBhcmFsbGVsIHJlc3VtZSBwYXRoIG9uLlxuICAgIGhvb2tSZXN1bWVJbnB1dFZlcnNpb246IEhPT0tfUkVTVU1FX0lOUFVUX1ZFUlNJT04sXG4gICAgLi4uKGVuY3J5cHRpb25QdWJsaWNLZXkgPyB7IGVuY3J5cHRpb25QdWJsaWNLZXkgfSA6IHt9KSxcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gIH0pO1xuICAvLyBVc2UgYSBkZXRlcm1pbmlzdGljIGZha2UgcnVuSWQgZGVyaXZlZCBmcm9tIHRoZSBjb3JyZWxhdGlvbklkIHNvIHRoYXRcbiAgLy8gdGhlIHJlYWRlciBzaWRlIHByb2R1Y2VzIHRoZSBzYW1lIHZhbHVlLlxuICBjb25zdCBmYWtlUnVuSWQgPSBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoaGVhbHRoQ2hlY2suY29ycmVsYXRpb25JZCk7XG4gIGF3YWl0IHdvcmxkLnN0cmVhbXMud3JpdGUoZmFrZVJ1bklkLCBzdHJlYW1OYW1lLCByZXNwb25zZSk7XG4gIGF3YWl0IHdvcmxkLnN0cmVhbXMuY2xvc2UoZmFrZVJ1bklkLCBzdHJlYW1OYW1lKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja09wdGlvbnMge1xuICAvKiogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlLiBEZWZhdWx0OiAzMDAwMCAoMzBzKSAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogRGVwbG95bWVudCBJRCB0byBzZW5kIHRoZSBoZWFsdGggY2hlY2sgdG8uIEZhbGxzIGJhY2sgdG8gcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQuICovXG4gIGRlcGxveW1lbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gaWQgdGhlIGNhbGxlciBpcyBhYm91dCB0byBjcmVhdGUuIFdoZW4gc2V0LCB0aGUgcmVzcG9uZGluZ1xuICAgKiBkZXBsb3ltZW50IGRlcml2ZXMgdGhhdCBydW4ncyBwdWJsaWMga2V5IGxvY2FsbHkgYW5kIHJldHVybnMgaXQgYXNcbiAgICogYGVuY3J5cHRpb25QdWJsaWNLZXlgLCBsZXR0aW5nIGEgY3Jvc3MtZGVwbG95bWVudCBgc3RhcnQoKWAgc2VhbCB0aGVcbiAgICogd29ya2Zsb3cgYXJndW1lbnRzIHdpdGhvdXQgYSBzZXBhcmF0ZSBrZXkgbG9va3VwLlxuICAgKi9cbiAgcnVuSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRdWV1ZSBuYW1lc3BhY2Ugb2YgdGhlIHRhcmdldCBkZXBsb3ltZW50IChlLmcuIGAnZXZlJ2AgZm9yIHRvcGljcyBsaWtlXG4gICAqIGBfX2V2ZV93a2Zfd29ya2Zsb3dfKmApLiBGYWxscyBiYWNrIHRvIGBXT1JLRkxPV19RVUVVRV9OQU1FU1BBQ0VgIGluIHRoZVxuICAgKiBjYWxsaW5nIHByb2Nlc3MuIENyb3NzLWNvbnRleHQgY2FsbGVycyAoZS5nLiB0aGUgb2JzZXJ2YWJpbGl0eVxuICAgKiBkYXNoYm9hcmQpIG11c3QgcGFzcyB0aGUgdGFyZ2V0IGRlcGxveW1lbnQncyBuYW1lc3BhY2UgZXhwbGljaXRseTpcbiAgICogdGhlIGVudiBmYWxsYmFjayByZXNvbHZlcyBpbiB0aGUgY2FsbGVyJ3MgcHJvY2VzcywgYW5kIGEgbWVzc2FnZVxuICAgKiBwdWJsaXNoZWQgdG8gYSBtaXNtYXRjaGVkIHRvcGljIGhhcyBubyBjb25zdW1lciwgc28gdGhlIGNoZWNrIHdvdWxkXG4gICAqIGFsd2F5cyB0aW1lIG91dC5cbiAgICovXG4gIG5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlYWx0aCBjaGVjayBieSBzZW5kaW5nIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBxdWV1ZSBwaXBlbGluZVxuICogYW5kIHZlcmlmeWluZyBpdCBpcyBwcm9jZXNzZWQgYnkgdGhlIGNvbWJpbmVkIHdvcmtmbG93IGVuZHBvaW50LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gYnlwYXNzZXMgRGVwbG95bWVudCBQcm90ZWN0aW9uIG9uIFZlcmNlbCBiZWNhdXNlIGl0IGdvZXNcbiAqIHRocm91Z2ggdGhlIHF1ZXVlIGluZnJhc3RydWN0dXJlIHJhdGhlciB0aGFuIGRpcmVjdCBIVFRQLlxuICpcbiAqIEBwYXJhbSB3b3JsZCAtIFRoZSBXb3JsZCBpbnN0YW5jZSB0byB1c2UgZm9yIHRoZSBoZWFsdGggY2hlY2tcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdGhlIGhlYWx0aCBjaGVja1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gaGVhbHRoIGNoZWNrIHJlc3VsdFxuICovXG4vLyBQb2xsIGludGVydmFsIGZvciBoZWFsdGggY2hlY2sgcmV0cmllcyAobXMpXG5jb25zdCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTCA9IDEwMDtcbi8vIFBlci1yZWFkIHRpbWVvdXQgdG8gcHJldmVudCBibG9ja2luZyBmb3JldmVyIG9uIGxvY2FsIHdvcmxkJ3MgRXZlbnRFbWl0dGVyXG4vLyAod2hpY2ggZG9lc24ndCB3b3JrIGFjcm9zcyBwcm9jZXNzZXMpXG5jb25zdCBIRUFMVEhfQ0hFQ0tfUkVBRF9USU1FT1VUID0gNTAwO1xuXG4vKipcbiAqIFJlYWQgY2h1bmtzIGZyb20gYSBzdHJlYW0gd2l0aCBhIHRpbWVvdXQgcGVyIHJlYWQgb3BlcmF0aW9uLlxuICogUmV0dXJucyB7IGNodW5rcywgdGltZWRPdXQgfSB3aGVyZSB0aW1lZE91dCBpbmRpY2F0ZXMgaWYgYSByZWFkIHRpbWVkIG91dC5cbiAqL1xuLyoqXG4gKiBSYWNlIGEgcHJvbWlzZSBhZ2FpbnN0IGEgZGVhZGxpbmUuIFJlamVjdHMgd2l0aCBhIHRpbWVvdXQgZXJyb3Igd2hlbiB0aGVcbiAqIGRlYWRsaW5lIGVsYXBzZXMgZmlyc3QuIFVzZWQgdG8gYm91bmQgYHdvcmxkLnN0cmVhbXMuZ2V0KClgIGluc2lkZSB0aGVcbiAqIGhlYWx0aC1jaGVjayBwb2xsIGxvb3A6IHNvbWUgd29ybGRzIGhvbGQgdGhhdCByZXF1ZXN0IG9wZW4gdW50aWwgdGhlXG4gKiBzdHJlYW0gaGFzIGRhdGEgKGUuZy4gd29ya2Zsb3ctc2VydmVyIGhvbGRzIHVud3JpdHRlbiBzdHJlYW1zIG9wZW4gZm9yXG4gKiB+MiBtaW51dGVzKSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJsb3cgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBoZWFsdGhcbiAqIGNoZWNrIHRpbWVvdXQsIHNpbmNlIHRoZSBgd2hpbGVgIGNvbmRpdGlvbiBpcyBvbmx5IHJlLWNoZWNrZWQgYmV0d2VlblxuICogaXRlcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gd2l0aERlYWRsaW5lPFQ+KHByb21pc2U6IFByb21pc2U8VD4sIG1zOiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIFByb21pc2UucmFjZShbXG4gICAgcHJvbWlzZSxcbiAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT4ge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiByZWplY3QobmV3IEVycm9yKGBPcGVyYXRpb24gdGltZWQgb3V0IGFmdGVyICR7bXN9bXNgKSksXG4gICAgICAgIG1zXG4gICAgICApO1xuICAgIH0pLFxuICBdKS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dCh0aW1lcikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtV2l0aFRpbWVvdXQoXG4gIHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyPFVpbnQ4QXJyYXk+LFxuICByZWFkVGltZW91dDogbnVtYmVyXG4pOiBQcm9taXNlPHsgY2h1bmtzOiBVaW50OEFycmF5W107IHRpbWVkT3V0OiBib29sZWFuIH0+IHtcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgbGV0IHRpbWVkT3V0ID0gZmFsc2U7XG5cbiAgd2hpbGUgKCFkb25lICYmICF0aW1lZE91dCkge1xuICAgIGNvbnN0IHJlYWRQcm9taXNlID0gcmVhZGVyLnJlYWQoKTtcbiAgICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHsgZG9uZTogdHJ1ZTsgdmFsdWU6IHVuZGVmaW5lZCB9PihcbiAgICAgIChyZXNvbHZlKSA9PlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aW1lZE91dCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0sIHJlYWRUaW1lb3V0KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3JlYWRQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pO1xuICAgIGRvbmUgPSByZXN1bHQuZG9uZTtcbiAgICBpZiAocmVzdWx0LnZhbHVlKSBjaHVua3MucHVzaChyZXN1bHQudmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHsgY2h1bmtzLCB0aW1lZE91dCB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIGhlYWx0aCBjaGVjayByZXNwb25zZSBmcm9tIHN0cmVhbSBjaHVua3MuXG4gKiBSZXR1cm5zIHRoZSBwYXJzZWQgcmVzcG9uc2Ugb3IgbnVsbCBpZiBpbnZhbGlkLlxuICovXG5mdW5jdGlvbiBwYXJzZUhlYWx0aENoZWNrUmVzcG9uc2UoY2h1bmtzOiBVaW50OEFycmF5W10pOiB7XG4gIGhlYWx0aHk6IGJvb2xlYW47XG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICBlbmNyeXB0aW9uUHVibGljS2V5Pzogc3RyaW5nO1xufSB8IG51bGwge1xuICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdG90YWxMZW5ndGggPSBjaHVua3MucmVkdWNlKChzdW0sIGNodW5rKSA9PiBzdW0gKyBjaHVuay5sZW5ndGgsIDApO1xuICBjb25zdCBjb21iaW5lZCA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgY29tYmluZWQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VUZXh0ID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGNvbWJpbmVkKTtcblxuICBsZXQgcmVzcG9uc2U6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE9sZCBkZXBsb3ltZW50cyAoc3BlY1ZlcnNpb24gPCAzKSByZXR1cm4gcGxhaW4gdGV4dCBsaWtlXG4gICAgLy8gJ1dvcmtmbG93IFNESyBcIi4uLlwiIGVuZHBvaW50IGlzIGhlYWx0aHknLiBUcmVhdCBhbnkgbm9uLWVtcHR5XG4gICAgLy8gdGV4dCByZXNwb25zZSBhcyBhIGhlYWx0aHkgZGVwbG95bWVudCB3aXRoIHVua25vd24gc3BlY1ZlcnNpb24uXG4gICAgaWYgKHJlc3BvbnNlVGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4geyBoZWFsdGh5OiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiByZXNwb25zZSAhPT0gJ29iamVjdCcgfHxcbiAgICByZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICEoJ2hlYWx0aHknIGluIHJlc3BvbnNlKSB8fFxuICAgIHR5cGVvZiAocmVzcG9uc2UgYXMgeyBoZWFsdGh5OiB1bmtub3duIH0pLmhlYWx0aHkgIT09ICdib29sZWFuJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcGFyc2VkOiB7XG4gICAgaGVhbHRoeTogYm9vbGVhbjtcbiAgICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgICB3b3JrZmxvd0NvcmVWZXJzaW9uPzogc3RyaW5nO1xuICAgIGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmc7XG4gICAgaG9va1Jlc3VtZUlucHV0VmVyc2lvbj86IG51bWJlcjtcbiAgfSA9IHtcbiAgICBoZWFsdGh5OiByLmhlYWx0aHkgYXMgYm9vbGVhbixcbiAgfTtcbiAgaWYgKHR5cGVvZiByLnNwZWNWZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHBhcnNlZC5zcGVjVmVyc2lvbiA9IHIuc3BlY1ZlcnNpb247XG4gIH1cbiAgaWYgKHR5cGVvZiByLndvcmtmbG93Q29yZVZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgcGFyc2VkLndvcmtmbG93Q29yZVZlcnNpb24gPSByLndvcmtmbG93Q29yZVZlcnNpb247XG4gIH1cbiAgaWYgKHR5cGVvZiByLmVuY3J5cHRpb25QdWJsaWNLZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgcGFyc2VkLmVuY3J5cHRpb25QdWJsaWNLZXkgPSByLmVuY3J5cHRpb25QdWJsaWNLZXk7XG4gIH1cbiAgaWYgKHR5cGVvZiByLmhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgcGFyc2VkLmhvb2tSZXN1bWVJbnB1dFZlcnNpb24gPSByLmhvb2tSZXN1bWVJbnB1dFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlYWx0aENoZWNrKFxuICB3b3JsZDogV29ybGQsXG4gIG9wdGlvbnM/OiBIZWFsdGhDaGVja09wdGlvbnNcbik6IFByb21pc2U8SGVhbHRoQ2hlY2tSZXN1bHQ+IHtcbiAgY29uc3QgdGltZW91dCA9IG9wdGlvbnM/LnRpbWVvdXQgPz8gREVGQVVMVF9IRUFMVEhfQ0hFQ0tfVElNRU9VVDtcbiAgLy8gVXNlIHRoZSB3b3JsZCdzIElEIGdlbmVyYXRvciB3aGVuIGF2YWlsYWJsZSBzbyB0aGUgY29ycmVsYXRpb25JZCBpcyBhXG4gIC8vIHJlZ2lvbi10YWdnZWQgVUxJRC4gVGhlIGhlYWx0aC1jaGVjayByZXNwb25zZSBpcyBkZWxpdmVyZWQgb3ZlciBhIHN0cmVhbVxuICAvLyB3aG9zZSBuYW1lIGVtYmVkcyB0aGlzIGNvcnJlbGF0aW9uSWQ7IHVuZGVyIHBsYXRmb3JtLWRpcmVjdGVkIHJvdXRpbmcgdGhlXG4gIC8vIHJlYWRlciBhbmQgdGhlIHJlc3BvbmRpbmcgZW5kcG9pbnQgY2FuIGJlIHNlcnZlZCBmcm9tIGRpZmZlcmVudCBwaHlzaWNhbFxuICAvLyByZWdpb25zLCBzbyB0aGUgcmVnaW9uIG11c3QgYmUgZW5jb2RlZCBpbiB0aGUgSUQgaXRzZWxmIGZvciBib3RoIHNpZGVzIHRvXG4gIC8vIHJlc29sdmUgdGhlIHNhbWUgKHJlZ2lvbi1waW5uZWQpIGJhY2tlbmQuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBVTElEIGZvclxuICAvLyB3b3JsZHMgdGhhdCBkb24ndCB0YWcgSURzIChlLmcuIGxvY2FsKSwgd2hpY2ggcmVzb2x2ZSB0byB0aGUgZGVmYXVsdFxuICAvLyByZWdpb24gb24gYm90aCBzaWRlcy5cbiAgY29uc3QgY29ycmVsYXRpb25JZCA9IHdvcmxkLmNyZWF0ZVJ1bklkPy4oKSA/PyBnZW5lcmF0ZUlkKCk7XG4gIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRIZWFsdGhDaGVja1N0cmVhbU5hbWUoY29ycmVsYXRpb25JZCk7XG5cbiAgY29uc3QgcXVldWVOYW1lID1cbiAgICBgJHtnZXRRdWV1ZVRvcGljUHJlZml4KCd3b3JrZmxvdycsIHJlc29sdmVRdWV1ZU5hbWVzcGFjZShvcHRpb25zPy5uYW1lc3BhY2UpKX1oZWFsdGhfY2hlY2tgIGFzIFZhbGlkUXVldWVOYW1lO1xuXG4gIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3b3JsZC5xdWV1ZShcbiAgICAgIHF1ZXVlTmFtZSxcbiAgICAgIHtcbiAgICAgICAgX19oZWFsdGhDaGVjazogdHJ1ZSxcbiAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgLi4uKG9wdGlvbnM/LnJ1bklkID8geyBydW5JZDogb3B0aW9ucy5ydW5JZCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gVXNlIEpTT04gdHJhbnNwb3J0IHNvIHRoZSBoZWFsdGggY2hlY2sgd29ya3MgYWdhaW5zdCBib3RoXG4gICAgICAgIC8vIG9sZCAoSlNPTi1vbmx5KSBhbmQgbmV3IChkdWFsKSBkZXBsb3ltZW50cy5cbiAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gICAgICAgIGRlcGxveW1lbnRJZDogb3B0aW9ucz8uZGVwbG95bWVudElkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ01zID0gdGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgd2l0aERlYWRsaW5lKFxuICAgICAgICAgIHdvcmxkLnN0cmVhbXMuZ2V0KFxuICAgICAgICAgICAgZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGNvcnJlbGF0aW9uSWQpLFxuICAgICAgICAgICAgc3RyZWFtTmFtZVxuICAgICAgICAgICksXG4gICAgICAgICAgcmVtYWluaW5nTXNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgICAgICBjb25zdCB7IGNodW5rcywgdGltZWRPdXQgfSA9IGF3YWl0IHJlYWRTdHJlYW1XaXRoVGltZW91dChcbiAgICAgICAgICByZWFkZXIsXG4gICAgICAgICAgSEVBTFRIX0NIRUNLX1JFQURfVElNRU9VVFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aW1lZE91dCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWFkZXIuY2FuY2VsKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgY2FuY2VsIGVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcGFyc2VIZWFsdGhDaGVja1Jlc3BvbnNlKGNodW5rcyk7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5yZXNwb25zZSxcbiAgICAgICAgICAgIGxhdGVuY3lNczogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoeTogZmFsc2UsXG4gICAgICBlcnJvcjogYEhlYWx0aCBjaGVjayB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zYCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFsdGh5OiBmYWxzZSxcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKFxuICBydW5JZDogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmdcbik6IFdvcmtmbG93V29ybGRFcnJvciB7XG4gIHJldHVybiBuZXcgV29ya2Zsb3dXb3JsZEVycm9yKFxuICAgIGBFdmVudCBwYWdpbmF0aW9uICR7bWVzc2FnZX0gZm9yIHdvcmtmbG93IHJ1biBcIiR7cnVuSWR9XCIuYCxcbiAgICB7IGNvZGU6IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUiB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZFJlcXVlc3RlZEV2ZW50Q3Vyc29yKFxuICBydW5JZDogc3RyaW5nLFxuICBjdXJzb3I6IHN0cmluZyB8IG51bGwsXG4gIHJlcXVlc3RlZEN1cnNvcnM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjdXJzb3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHJlcXVlc3RlZEN1cnNvcnMuaGFzKGN1cnNvcikpIHtcbiAgICB0aHJvdyBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKHJ1bklkLCAnZGlkIG5vdCBhZHZhbmNlJyk7XG4gIH1cbiAgcmVxdWVzdGVkQ3Vyc29ycy5hZGQoY3Vyc29yKTtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGV2ZW50cyB3aG9zZSBJRHMgYXJlIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gYHRhcmdldGAuXG4gKlxuICogUGFzcyB0aGUgSURzIGN1cnJlbnRseSBwcmVzZW50IGluIGB0YXJnZXRgIHdoZW4gYXBwZW5kaW5nIHJlcGVhdGVkbHkgdG8gdGhlXG4gKiBzYW1lIGFycmF5LiBUaGUgc2V0IGlzIHVwZGF0ZWQgYWxvbmdzaWRlIGB0YXJnZXRgLlxuICpcbiAqIEV2ZW50cyBhcmUgYXBwZW5kZWQgaW4gdGhlIG9yZGVyIHRoZSBXb3JsZCByZXR1cm5lZCB0aGVtLCBhbmQgYXJlIG5vdFxuICogcmUtc29ydGVkLiBFdmVyeSBhcHBlbmQgc291cmNlIGlzIGFscmVhZHkgaW4gY2Fub25pY2FsIG9yZGVyIHJlbGF0aXZlIHRvIHRoZVxuICogdGFpbCAoYSBjdXJzb3ItZGVsaW1pdGVkIHBhZ2UsIG9yIGEgd3JpdGUtcmVzcG9uc2UgZGVsdGEpLCBzbyByZWNlaXB0IG9yZGVyIGlzXG4gKiB0aGUgb3JkZXIgdG8ga2VlcCwgYW5kIHJlLXNvcnRpbmcgaGVyZSB3b3VsZCBvbmx5IGNvc3QgYSBwYXNzIG92ZXIgdGhlIGxvZy5cbiAqIE5vdGhpbmcgZG93bnN0cmVhbSBtYXkgYXNzdW1lIHRoZSB0YWlsIGlzIHRoZSBuZXdlc3QgZXZlbnQuIFNlZVxuICoge0BsaW5rIG1heEV2ZW50U2xvdH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRVbmlxdWVFdmVudHMoXG4gIHRhcmdldDogRXZlbnRbXSxcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdLFxuICB0YXJnZXRJZHM/OiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaWRzID0gdGFyZ2V0SWRzID8/IG5ldyBTZXQodGFyZ2V0Lm1hcCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50SWQpKTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBpZiAoaWRzLmhhcyhldmVudC5ldmVudElkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlkcy5hZGQoZXZlbnQuZXZlbnRJZCk7XG4gICAgdGFyZ2V0LnB1c2goZXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogSW5zZXJ0cyBgZXZlbnRgIGludG8gYHRhcmdldGAgYXQgdGhlIHBvc2l0aW9uIHRoYXQga2VlcHMgYHRhcmdldGAgb3JkZXJlZCBieVxuICogYXNjZW5kaW5nIGBldmVudElkYCwgb3Igbm8tb3BzIGlmIGFuIGV2ZW50IHdpdGggdGhlIHNhbWUgYGV2ZW50SWRgIGlzIGFscmVhZHlcbiAqIHByZXNlbnQgKGlkZW1wb3RlbnQpLlxuICpcbiAqIGBwcmVsb2FkZWRFdmVudHNgIGlzIGxvYWRlZCBgc29ydE9yZGVyOiAnYXNjJ2AgYW5kIGlzIG5ldmVyIHJlLXNvcnRlZFxuICogY2xpZW50LXNpZGUsIHNvIGEgYGhvb2tfcmVjZWl2ZWRgIHNwbGljZWQgaW4gYnkgdGhlIGxhenktcmVzdW1lIGNvbnN1bWVyIG11c3RcbiAqIGxhbmQgaW4gYGV2ZW50SWRgIG9yZGVyOiBhIHBsYWluIGBwdXNoYCB3b3VsZCBwbGFjZSBhIGxhdGUtY29tbWl0dGluZ1xuICogZWFybGllciBldmVudCBhZnRlciBldmVudHMgdGhhdCBzb3J0IGJlZm9yZSBpdCwgY29ycnVwdGluZyByZXBsYXkuXG4gKlxuICogTGV4aWNvZ3JhcGhpYyBzdHJpbmcgb3JkZXIgaXMgdGhlIGxvZydzIG9yZGVyOiBhIHNsb3QgaWQgaXMgYSBmaXhlZC13aWR0aFxuICogemVyby1wYWRkZWQgcG9zaXRpb24sIHNvIGNvbXBhcmluZyB0aGUgc3RyaW5ncyBjb21wYXJlcyB0aGUgcG9zaXRpb25zLiBUaGlzXG4gKiBuZWVkcyBubyBwYXJzZSBvZiBpdHMgb3duIGZvciB0aGF0IHJlYXNvbiwgYW5kIHRoZSBjb21wYXJpc29uIGlzIGV4YWN0IHJhdGhlclxuICogdGhhbiBhIHJlY29uc3RydWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0RXZlbnRCeUV2ZW50SWQodGFyZ2V0OiBFdmVudFtdLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgLy8gTGluZWFyIHNjYW4gZnJvbSB0aGUgZW5kOiB0aGUgc3BsaWNlZCBldmVudCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBuZXdlc3RcbiAgLy8gKGl0IHNvcnRzIGF0IG9yIG5lYXIgdGhlIHRhaWwpLCBzbyB0aGlzIGZpbmRzIHRoZSBzbG90IGluIE8oMSnigJNPKGspIGZvciB0aGVcbiAgLy8gY29tbW9uIGNhc2Ugd2hpbGUgc3RpbGwgaGFuZGxpbmcgYW4gb3V0LW9mLW9yZGVyIGxhdGUgYXJyaXZhbCBjb3JyZWN0bHkuXG4gIGxldCBpID0gdGFyZ2V0Lmxlbmd0aDtcbiAgd2hpbGUgKGkgPiAwKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0YXJnZXRbaSAtIDFdO1xuICAgIGlmIChleGlzdGluZy5ldmVudElkID09PSBldmVudC5ldmVudElkKSB7XG4gICAgICAvLyBBbHJlYWR5IHByZXNlbnQ6IGtlZXAgdGhlIHNwbGljZSBpZGVtcG90ZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXhpc3RpbmcuZXZlbnRJZCA8IGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpLS07XG4gIH1cbiAgdGFyZ2V0LnNwbGljZShpLCAwLCBldmVudCk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydEV2ZW50UGFnaW5hdGlvblByb2dyZXNzKFxuICBydW5JZDogc3RyaW5nLFxuICBoYXNNb3JlOiBib29sZWFuLFxuICBjdXJzb3I6IHN0cmluZyB8IG51bGwsXG4gIHJlcXVlc3RlZEN1cnNvcnM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgaWYgKCFoYXNNb3JlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjdXJzb3IgPT09IG51bGwpIHtcbiAgICB0aHJvdyBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKFxuICAgICAgcnVuSWQsXG4gICAgICAncmV0dXJuZWQgbW9yZSBwYWdlcyB3aXRob3V0IGEgY3Vyc29yJ1xuICAgICk7XG4gIH1cbiAgaWYgKHJlcXVlc3RlZEN1cnNvcnMuaGFzKGN1cnNvcikpIHtcbiAgICB0aHJvdyBldmVudFBhZ2luYXRpb25Db250cmFjdEVycm9yKHJ1bklkLCAncmVwZWF0ZWQgYSBjdXJzb3InKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRSZXRyeVdpdGhvdXRFdmVudEN1cnNvcihcbiAgZXJyb3I6IHVua25vd24sXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgYWxyZWFkeVJldHJpZWQ6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGN1cnNvciAhPT0gbnVsbCAmJlxuICAgICFhbHJlYWR5UmV0cmllZCAmJlxuICAgIFdvcmtmbG93V29ybGRFcnJvci5pcyhlcnJvcikgJiZcbiAgICBlcnJvci5zdGF0dXMgPT09IDQwMFxuICApO1xufVxuXG4vKipcbiAqIExvYWRzIHdvcmtmbG93IHJ1biBldmVudHMgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHBhZ2VzIG9mIHBhZ2luYXRlZFxuICogcmVzdWx0cy4gRXZlbnRzIGFyZSByZXR1cm5lZCBpbiBjaHJvbm9sb2dpY2FsIChhc2NlbmRpbmcpIG9yZGVyIGZvclxuICogZGV0ZXJtaW5pc3RpYyB3b3JrZmxvdyByZXBsYXkuXG4gKlxuICogQHBhcmFtIHJ1bklkIC0gVGhlIHdvcmtmbG93IHJ1biBJRC5cbiAqIEBwYXJhbSBhZnRlckN1cnNvciAtIElmIHByb3ZpZGVkLCBvbmx5IGV2ZW50cyBhZnRlciB0aGlzIGN1cnNvciBhcmVcbiAqICAgcmV0dXJuZWQgKGluY3JlbWVudGFsIGxvYWQpLiBJZiBvbWl0dGVkLCBhbGwgZXZlbnRzIGFyZSByZXR1cm5lZC5cbiAqICAgVGhlIHJldHVybmVkIGN1cnNvciBjYW4gYmUgcGFzc2VkIGJhY2sgaW4gb24gYSBzdWJzZXF1ZW50IGNhbGwgZm9yXG4gKiAgIGluY3JlbWVudGFsIGxvYWRpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkV29ya2Zsb3dSdW5FdmVudHMoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGFmdGVyQ3Vyc29yPzogc3RyaW5nXG4pOiBQcm9taXNlPExvYWRlZEV2ZW50TG9nPiB7XG4gIGNvbnN0IGluY3JlbWVudGFsID0gYWZ0ZXJDdXJzb3IgIT09IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRyYWNlKFxuICAgIGluY3JlbWVudGFsID8gJ3dvcmtmbG93LmxvYWROZXdFdmVudHMnIDogJ3dvcmtmbG93LmxvYWRFdmVudHMnLFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQocnVuSWQpLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGxvYWRlZEV2ZW50czogRXZlbnRbXSA9IFtdO1xuICAgICAgY29uc3QgbG9hZGVkRXZlbnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGxldCBjdXJzb3I6IHN0cmluZyB8IG51bGwgPSBhZnRlckN1cnNvciA/PyBudWxsO1xuICAgICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICAgICAgbGV0IHBhZ2VzTG9hZGVkID0gMDtcbiAgICAgIGxldCByZXRyaWVkV2l0aG91dEN1cnNvciA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgICAgY29uc3QgbG9hZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIHdoaWxlIChoYXNNb3JlKSB7XG4gICAgICAgIC8vIFRPRE86IHdlJ3JlIGN1cnJlbnRseSBsb2FkaW5nIGFsbCB0aGUgZGF0YSB3aXRoIHJlc29sdmVSZWYgYmVoYXZpb3IuIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXNcbiAgICAgICAgLy8gdG8gbGF6eWxvYWQgdGhlIGRhdGEgZnJvbSB0aGUgd29ybGQgaW5zdGVhZCBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSBhbmQgbWFrZSB0aGUgZXZlbnQgbG9nIGxvYWRpbmdcbiAgICAgICAgLy8gbXVjaCBmYXN0ZXIgYW5kIG1lbW9yeSBlZmZpY2llbnRcbiAgICAgICAgY29uc3QgcGFnZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkQ3Vyc29yID0gY3Vyc29yO1xuICAgICAgICByZWNvcmRSZXF1ZXN0ZWRFdmVudEN1cnNvcihydW5JZCwgcmVxdWVzdGVkQ3Vyc29yLCByZXF1ZXN0ZWRDdXJzb3JzKTtcblxuICAgICAgICBsZXQgcmVzcG9uc2U6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2Ygd29ybGQuZXZlbnRzLmxpc3Q+PjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHdvcmxkLmV2ZW50cy5saXN0KHtcbiAgICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICAgICAgICBjdXJzb3I6IHJlcXVlc3RlZEN1cnNvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNob3VsZFJldHJ5V2l0aG91dEV2ZW50Q3Vyc29yKFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgcmVxdWVzdGVkQ3Vyc29yLFxuICAgICAgICAgICAgICByZXRyaWVkV2l0aG91dEN1cnNvclxuICAgICAgICAgICAgKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAnRXZlbnQgY3Vyc29yIHdhcyByZWplY3RlZDsgcmV0cnlpbmcgd2l0aCBhIGZ1bGwgZXZlbnQgcmVsb2FkLicsXG4gICAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvYWRlZEV2ZW50cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgbG9hZGVkRXZlbnRJZHMuY2xlYXIoKTtcbiAgICAgICAgICAgIHJlcXVlc3RlZEN1cnNvcnMuY2xlYXIoKTtcbiAgICAgICAgICAgIGN1cnNvciA9IG51bGw7XG4gICAgICAgICAgICByZXRyaWVkV2l0aG91dEN1cnNvciA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBhcHBlbmRVbmlxdWVFdmVudHMobG9hZGVkRXZlbnRzLCByZXNwb25zZS5kYXRhLCBsb2FkZWRFdmVudElkcyk7XG4gICAgICAgIGhhc01vcmUgPSByZXNwb25zZS5oYXNNb3JlO1xuICAgICAgICBhc3NlcnRFdmVudFBhZ2luYXRpb25Qcm9ncmVzcyhcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBoYXNNb3JlLFxuICAgICAgICAgIHJlc3BvbnNlLmN1cnNvcixcbiAgICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzXG4gICAgICAgICk7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBsYXN0IG5vbi1udWxsIGN1cnNvciBhY3Jvc3MgcGFnZXMuIEEgV29ybGQgbWF5XG4gICAgICAgIC8vIGxlZ2l0aW1hdGVseSByZXR1cm4gYHsgZGF0YTogW10sIGN1cnNvcjogbnVsbCwgaGFzTW9yZTogZmFsc2UgfWBcbiAgICAgICAgLy8gb24gYSB0cmFpbGluZyBlbXB0eSBwYWdlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBwcmV2aW91cyBwYWdlJ3NcbiAgICAgICAgLy8gdW5kZXJseWluZyBEQiBxdWVyeSBoaXQgdGhlIGxpbWl0IGV4YWN0bHkgYW5kIHJldHVybmVkIGFcbiAgICAgICAgLy8gcHJlY2F1dGlvbmFyeSBgTGFzdEV2YWx1YXRlZEtleWAuIE92ZXJ3cml0aW5nIHdpdGggdGhhdCBudWxsXG4gICAgICAgIC8vIHdvdWxkIGxvc2UgdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGxhc3QgcmVhbCBldmVudCB3ZSBsb2FkZWQgYW5kXG4gICAgICAgIC8vIGZvcmNlIHRoZSBydW50aW1lIGludG8gdGhlIFwibm8gY3Vyc29yIGFmdGVyIGluaXRpYWwgbG9hZFwiIGZ1bGwtXG4gICAgICAgIC8vIHJlbG9hZCBmYWxsYmFjayBvbiBldmVyeSBzdWJzZXF1ZW50IHJlcGxheSBpdGVyYXRpb24uXG4gICAgICAgIGN1cnNvciA9IHJlc3BvbnNlLmN1cnNvciA/PyBjdXJzb3I7XG4gICAgICAgIHBhZ2VzTG9hZGVkKys7XG5cbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnTG9hZGVkIGV2ZW50IHBhZ2UnLCB7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgICAgICAgaW5jcmVtZW50YWwsXG4gICAgICAgICAgcGFnZTogcGFnZXNMb2FkZWQsXG4gICAgICAgICAgcGFnZUV2ZW50czogcmVzcG9uc2UuZGF0YS5sZW5ndGgsXG4gICAgICAgICAgdG90YWxFdmVudHM6IGxvYWRlZEV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgICBwYWdlTXM6IERhdGUubm93KCkgLSBwYWdlU3RhcnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdFdmVudCBsb2FkIGNvbXBsZXRlJywge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgaW5jcmVtZW50YWwsXG4gICAgICAgIHRvdGFsRXZlbnRzOiBsb2FkZWRFdmVudHMubGVuZ3RoLFxuICAgICAgICBwYWdlc0xvYWRlZCxcbiAgICAgICAgdG90YWxNczogRGF0ZS5ub3coKSAtIGxvYWRTdGFydCxcbiAgICAgIH0pO1xuXG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQobG9hZGVkRXZlbnRzLmxlbmd0aCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkKHBhZ2VzTG9hZGVkKSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBldmVudHM6IGxvYWRlZEV2ZW50cywgY3Vyc29yIH07XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFRoZSBydW50aW1lJ3MgbG9hZGVkIGV2ZW50LWxvZyBzbmFwc2hvdDogdGhlIGV2ZW50cyByZXBsYXllZCBzbyBmYXIgYW5kIHRoZVxuICogY3Vyc29yIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlbS4gSGFuZGVkIHRvIGhlbHBlcnMgdGhhdCBkZXJpdmUgdGhlIHByZWNvbmRpdGlvblxuICogc25hcHNob3QgZnJvbSBpdDsgdGhleSBkbyBub3QgbXV0YXRlIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZEV2ZW50TG9nIHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHJlcGxheSByZWZ1c2VzIHRvIHJ1biBvdmVyIGEgbG9nIHdpdGggYSBob2xlIGluIGl0IChzZWVcbiAqIHtAbGluayBmaW5kRXZlbnRTbG90R2FwfSkuICoqT24gYnkgZGVmYXVsdCoqOyBzZXRcbiAqIGBXT1JLRkxPV19TTE9UX0dBUF9DSEVDSz0wYCB0byByZXBsYXkgYWNyb3NzIGhvbGVzIGluc3RlYWQuXG4gKlxuICogQSBXb3JsZCB0aGF0IGFsbG9jYXRlcyBhIHBvc2l0aW9uIGF0IHRoZSBtb21lbnQgaXQgY29tbWl0cyBsZWF2ZXMgbm8gaG9sZVxuICogYmVoaW5kIHdoZW4gYSB3cml0ZSBmYWlscywgc28gZGVuc2l0eSBpcyBhIHByb3BlcnR5IHRoZSBsb2cgaGFzIGJ5XG4gKiBjb25zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gb25lIHRoaXMgY2hlY2sgbWFpbnRhaW5zLiBXaGF0IHRoZSBjaGVjayBpcyBmb3IgaXNcbiAqIHRoZSByZWFkcyBhbmQgdGhlIFdvcmxkcyB3aGVyZSB0aGF0IGRvZXMgbm90IGhvbGQsIGFuZCBieSB0aGUgdGltZSBpdCBydW5zXG4gKiB0aGUgYmVuaWduIGV4cGxhbmF0aW9ucyBhcmUgc3BlbnQ6IGEgcG9zaXRpb24gbWlzc2luZyBiZWNhdXNlIGEgY29uY3VycmVudFxuICogY29tbWl0IGlzIG5vdCB2aXNpYmxlIHlldCBjbGVhcnMgb24gYSByZS1yZWFkLCB3aGljaCBpcyB3aGF0XG4gKiB7QGxpbmsgc2V0dGxlRXZlbnRTbG90R2FwfSBkb2VzIGZpcnN0LlxuICpcbiAqIFdoYXQgaXMgbGVmdCBpcyBhIGhvbGUgdGhhdCBwZXJzaXN0cywgYW5kIGl0cyB0d28gY2F1c2VzIGFyZVxuICogaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgbG9nLiBFaXRoZXIgYSBXb3JsZCBhbGxvY2F0ZWQgdGhlIHBvc2l0aW9uIG91dHNpZGVcbiAqIHRoZSBjb21taXQgYW5kIGxvc3QgdGhlIHdyaXRlLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaGFwcGVuZWQgdGhlcmUgYW5kXG4gKiByZXBsYXlpbmcgcGFzdCBpdCBpcyBjb3JyZWN0LCBvciBhbiBldmVudCB0aGF0IGRpZCBoYXBwZW4gaXMgbWlzc2luZywgaW5cbiAqIHdoaWNoIGNhc2UgcmVwbGF5aW5nIHBhc3QgaXQgZGVjaWRlcyBhIGJyYW5jaCBvbiBhYnNlbmNlIGFuZCBwcm9kdWNlcyBhIHdyb25nXG4gKiByZXN1bHQgd2l0aCBub3RoaW5nIHRvIHNob3cgZm9yIGl0LiBGYWlsaW5nIGlzIHRoZSByZWNvdmVyYWJsZSBzaWRlIG9mIHRoYXRcbiAqIHRyYWRlLCBhbmQgdGhpcyBpcyB0aGUgd2F5IGJhY2sgb3V0IGlmIGEgZmxlZXQgdHVybnMgb3V0IHRvIGNhcnJ5IGhvbGVzIG9mXG4gKiB0aGUgZmlyc3Qga2luZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xvdEdhcENoZWNrRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX1NMT1RfR0FQX0NIRUNLICE9PSAnMCc7XG59XG5cbi8qXG4gKiBNZXJnaW5nIGludG8gYSBsb2cgYSByZXBsYXkgaXMgbWlkd2F5IHRocm91Z2ggcmVhZGluZy5cbiAqXG4gKiBUaHJlZSBwYXRocyBhZGQgZXZlbnRzIHRvIGEgbG9hZGVkIGxvZyBhZnRlciB0aGUgcmVwbGF5IGhhcyBzdGFydGVkOiBhXG4gKiBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZHMgYmFjayB0aGUgc2xvdHMgaXQgc2tpcHBlZCAoe0BsaW5rXG4gKiBtZXJnZVJlcG9ydGVkRXZlbnRzfSksIGFuIGlubGluZSBkZWx0YSBleHRlbmRzIHRoZSB0YWlsIChgYWJzb3JiQ3JlYXRlRGVsdGFgXG4gKiBpbiBgcnVudGltZS50c2ApLCBhbmQgYSBsaXN0ZWQgcGFnZSBhcHBlbmRzICh7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSkuXG4gKiBUaGV5IGxvb2sgYWxhcm1pbmcgKHRoZSByZXBsYXkgaXMgcmVhZGluZyBhbiBhcnJheSB3aGlsZSBzb21ldGhpbmcgZWxzZVxuICogd3JpdGVzIHRvIGl0KSBhbmQgdGhleSBhcmUgc2FmZSBmb3Igb25lIHJlYXNvbiB3b3J0aCBzdGF0aW5nIHBsYWlubHksIHNpbmNlXG4gKiBldmVyeSBjb3JyZWN0bmVzcyBhcmd1bWVudCBpbiB0aGlzIGZpbGUgbGVhbnMgb24gaXQuXG4gKlxuICogKipBbiBldmVudCBpbiB0aGUgbG9nIGlzIGEgZmFjdCwgYW5kIGEgbG9uZ2VyIGxvZyBjYW5ub3QgcmV0cmFjdCBvbmUuKiogVGhlXG4gKiBsb2cgaXMgYXBwZW5kLW9ubHkgYW5kIHBvc2l0aW9ucyBhcmUgbmV2ZXIgcmV1c2VkLCBzbyBhIHJlcGxheSB0aGF0IHByb2R1Y2VkXG4gKiBldmVudCBFIGZyb20gdGhlIHByZWZpeCBpdCBoYWQgbG9hZGVkIGhhcyBtYWRlIEUgdHJ1ZSBmb3IgZXZlcnkgcmVwbGF5IHRoYXRcbiAqIGZvbGxvd3MuIEEgbGF0ZXIgcmVwbGF5IHJlYWRpbmcgYSBmdWxsZXIgbG9nIGRvZXMgbm90IGdldCB0byBkZWNpZGUgRSBzaG91bGRcbiAqIG5vdCBiZSB0aGVyZTsgaXQgY29uc3VtZXMgRSBhbmQgcmVjb25jaWxlcyB0byBpdCwgd2hpY2ggaXMgd2hhdCB0aGUgZXZlbnRzXG4gKiBjb25zdW1lciBkb2VzIHdoZW4gaXQgd2Fsa3MgYSBsb2cgaG9sZGluZyB3cml0ZXMgZnJvbSBhIHJlcGxheSB0aGF0IHJhY2VkIGl0LlxuICpcbiAqIE1lcmdpbmcgaXMgdGhlcmVmb3JlIG1vbm90b25lOiBpdCBjYW4gb25seSBhZGQgZmFjdHMgdGhpcyByZXBsYXkgaGFzIHlldCB0b1xuICogcmVjb25jaWxlIHRvLCBuZXZlciByZW1vdmUgb25lIGl0IGFscmVhZHkgaGFzLiBUaGF0IGlzIHdoeSBhYnNvcmJpbmcgaXNcbiAqIGFsd2F5cyBvcHRpb25hbCBhbmQgbmV2ZXIgd3JvbmcgdG8gZGVjbGluZSAoYW4gdW5hYnNvcmJlZCBldmVudCBpcyBvbmUgdGhlXG4gKiBuZXh0IHJlYWQgcmV0dXJucyksIGFuZCB3aHkgdGhlIGd1YXJkcyBiZWxvdyBjYW4gYWZmb3JkIHRvIGJlIHN0cmljdC5cbiAqL1xuXG4vKipcbiAqIE1lcmdlIHRoZSBldmVudHMgYSBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZGVkIGJhY2sgaW50byB0aGUgbG9nIGl0IHdhc1xuICogZGVyaXZlZCBmcm9tLCBhbmQgYW5zd2VyIGhvdyBtYW55IG9mIHRoZW0gd2VyZSBuZXcuXG4gKlxuICogVW5saWtlIHtAbGluayBhcHBlbmRVbmlxdWVFdmVudHN9LCB0aGlzIHJlLXNvcnRzLiBUaGUgcmVwb3J0ZWQgZXZlbnRzIG9jY3VweVxuICogc2xvdHMgKmJlbG93KiB0aGUgd3JpdGUgdGhhdCByZXBvcnRlZCB0aGVtLCBzbyBhcHBlbmRpbmcgdGhlbSB3b3VsZCBwdXQgdGhlbVxuICogYWZ0ZXIgZXZlbnRzIHRoZXkgcHJlY2VkZS4gU29ydGluZyBieSBpZCByZXN0b3JlcyB0aGUgV29ybGQncyBjYW5vbmljYWwgb3JkZXJcbiAqIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGF0IGl0OiBhIHNsb3QgaWQgaXMgdGhhdCBvcmRlciwgd3JpdHRlbiBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSZXBvcnRlZEV2ZW50cyhcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IG51bWJlciB7XG4gIGNvbnN0IGJlZm9yZSA9IHRhcmdldC5sZW5ndGg7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyh0YXJnZXQsIGV2ZW50cyk7XG4gIGNvbnN0IGFkZGVkID0gdGFyZ2V0Lmxlbmd0aCAtIGJlZm9yZTtcbiAgaWYgKGFkZGVkID4gMCkge1xuICAgIHRhcmdldC5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5ldmVudElkIDwgYi5ldmVudElkID8gLTEgOiBhLmV2ZW50SWQgPiBiLmV2ZW50SWQgPyAxIDogMFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGFkZGVkO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnR9IGRpZCB3aXRoIGEgd3JpdGUncyByZXBvcnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNraXBwZWRTbG90UmVwb3J0IHtcbiAgLyoqIEhvdyBtYW55IG9mIHRoZSByZXBvcnRlZCBldmVudHMgd2VyZSBuZXcgdG8gdGhlIGxvZy4gWmVybyBpZiBkcm9wcGVkLiAqL1xuICBhZGRlZDogbnVtYmVyO1xuICAvKiogSG93IG1hbnkgZXZlbnRzIHRoZSByZXBvcnQgb2ZmZXJlZCwgd2hldGhlciBvciBub3QgdGhleSB3ZXJlIHRha2VuLiAqL1xuICBvZmZlcmVkOiBudW1iZXI7XG4gIC8qKiBUaGUgcmVwb3J0IHdhcyB0cnVuY2F0ZWQsIHNvIGl0IHdhcyBkcm9wcGVkIHdob2xlIGluc3RlYWQgb2YgbWVyZ2VkLiAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQXBwbHkgYSB3cml0ZSdzIHNraXBwZWQtc2xvdCByZXBvcnQgdG8gdGhlIGxvZyBpdCB3YXMgZGVyaXZlZCBmcm9tLCBkZWNpZGluZ1xuICogd2hldGhlciB0aGUgcmVwb3J0IG1heSBiZSB0YWtlbiBhdCBhbGwuXG4gKlxuICogRXZlcnkgcmVwbGF5LWNvbnRleHQgd3JpdGUgY2FuIGNvbWUgYmFjayBjYXJyeWluZyB0aGUgZXZlbnRzIG9uIHRoZSBzbG90cyBpdFxuICogc2tpcHBlZCBvdmVyLCBhbmQgZXZlcnkgY2FsbGVyIHdhbnRzIHRoZSBzYW1lIHRoaW5nIGZyb20gdGhlbTogZm9sZCB0aGVtIGluXG4gKiBzbyB0aGUgd3JpdGVzIHRoYXQgZm9sbG93IG5hbWUgYSBwb3NpdGlvbiBhYm92ZSB0aGVtLCBhbmQgc28gdGhlIHJlcGxheVxuICogcmVzdW1pbmcgZnJvbSB0aGlzIGxvZyBzZWVzIHRoZW0gd2l0aG91dCBhIHJlbG9hZC5cbiAqXG4gKiBUaGUgb25lIHBvbGljeSBpcyB0aGF0IGEgKip0cnVuY2F0ZWQgcmVwb3J0IGlzIGRyb3BwZWQgd2hvbGUqKi4gSXQgY292ZXJzIGFcbiAqIHNwYW4gb2YgcG9zaXRpb25zIGJ1dCBjYXJyaWVzIG9ubHkgc29tZSBvZiB0aGUgZXZlbnRzIG9uIHRoZW0sIHNvIG1lcmdpbmcgaXRcbiAqIHdvdWxkIHJhaXNlIHRoZSBsb2cncyBoaWdoZXN0IHBvc2l0aW9uIHBhc3QgYSBwb3NpdGlvbiB3aG9zZSBldmVudCBpc1xuICogbWlzc2luZy4gTGF0ZXIgd3JpdGVzIHJlYWQgdGhhdCBtYXhpbXVtIHRvIHNheSB3aGF0IHRoZXkgaGF2ZSBzZWVuLCBzbyBlYWNoXG4gKiB3b3VsZCBjbGFpbSBhIHBvc2l0aW9uIGl0IG5ldmVyIHNhdywgYW5kIHRoZSBXb3JsZCBvbmx5IHJlcG9ydHMgdGhlIHNwYW4gYVxuICogd3JpdGUgc2tpcHM6IGl0IHdvdWxkIG5ldmVyIHNlbmQgdGhlIG1pc3Npbmcgb25lLiBEcm9wcGluZyBjb3N0cyBvbmUgbW9yZVxuICogcm91bmQgb2YgdGhlIHNhbWUgZXZlbnRzIG9uIHRoZSBuZXh0IHdyaXRlIGFuZCBrZWVwcyB0aGUgbG9nIGEgcHJlZml4IG9mIHRoZVxuICogdHJ1dGgsIHdoaWNoIHRoZSBub3RlIGFib3ZlIHtAbGluayBtZXJnZVJlcG9ydGVkRXZlbnRzfSBleHBsYWlucyBpcyBhbHdheXMgYW5cbiAqIGF2YWlsYWJsZSBhbnN3ZXIuXG4gKlxuICogQ2FsbGVycyB0aGF0IGxvZyBkbyBzbyBmcm9tIHRoZSByZXR1cm5lZCBjb3VudHM7IHRoZSBkZWNpc2lvbiBpcyBub3QgdGhlaXJzXG4gKiB0byByZS1kZXJpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICByZXN1bHQ6IHsgZXZlbnRzPzogcmVhZG9ubHkgRXZlbnRbXTsgaGFzTW9yZT86IGJvb2xlYW4gfVxuKTogU2tpcHBlZFNsb3RSZXBvcnQge1xuICBjb25zdCBvZmZlcmVkID0gcmVzdWx0LmV2ZW50cz8ubGVuZ3RoID8/IDA7XG4gIGlmIChvZmZlcmVkID09PSAwKSB7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IDAsIG9mZmVyZWQ6IDAsIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgfVxuICBpZiAocmVzdWx0Lmhhc01vcmUgPT09IHRydWUpIHtcbiAgICByZXR1cm4geyBhZGRlZDogMCwgb2ZmZXJlZCwgdHJ1bmNhdGVkOiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhZGRlZDogbWVyZ2VSZXBvcnRlZEV2ZW50cyh0YXJnZXQsIHJlc3VsdC5ldmVudHMgPz8gW10pLFxuICAgIG9mZmVyZWQsXG4gICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBsb2FkZWQgbG9nIG9jY3VwaWVzLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gZW1wdHkgbG9nLlxuICpcbiAqIFRoZSBtYXhpbXVtLCBub3QgdGhlIGNvdW50LCBhbmQgdGhlIHR3byBhcmUgbm90IGludGVyY2hhbmdlYWJsZSBldmVuIHRob3VnaFxuICogYSBoZWFsdGh5IGxvZyBtYWtlcyB0aGVtIGVxdWFsLiBBIFdvcmxkIGhhbmRzIGEgcG9zaXRpb24gdG8gdGhlIGluc2VydCB0aGF0XG4gKiBvY2N1cGllcyBpdCwgc28gYSB3cml0ZSB0aGF0IG5ldmVyIGxhbmRzIGxlYXZlcyBubyBob2xlIGJlaGluZCBhbmQgdGhlIGxvZ1xuICogc3RheXMgZGVuc2UuIFdoYXQgdGhlIGNvdW50IGNhbm5vdCBzdXJ2aXZlIGlzIGEgKnBhcnRpYWwqIHJlYWQ6IGEgbG9nXG4gKiBhc3NlbWJsZWQgZnJvbSBhIHRydW5jYXRlZCByZXBvcnQsIG9yIHJlYWQgd2hpbGUgYSBjb25jdXJyZW50IHdyaXRlIGlzXG4gKiBjb21taXR0aW5nLCBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbi4gQ291bnRpbmcgdGhvc2VcbiAqIHdvdWxkIG1ha2UgdGhlIG5leHQgd3JpdGUgY2xhaW0gdG8gaGF2ZSBzZWVuIGxlc3MgdGhhbiBpdCBoYXMsIHNvIHRoZSBXb3JsZFxuICogd291bGQgcmVwb3J0IHRoZSBzYW1lIGV2ZW50cyBiYWNrIHRvIGl0IG9uIGV2ZXJ5IGF0dGVtcHQuXG4gKlxuICogQSBob2xlIGJlbG93IHRoZSBtYXhpbXVtIGlzIHRoZXJlZm9yZSBhIHByb3BlcnR5IG9mIHRoZSByZWFkLCBub3Qgb2YgdGhlIGxvZyxcbiAqIHdoaWNoIGlzIHdoYXQgbGV0cyB7QGxpbmsgc2V0dGxlRXZlbnRTbG90R2FwfSByZS1yZWFkIGluc3RlYWQgb2YgZ2l2aW5nIHVwLlxuICpcbiAqIEB0aHJvd3MgaWYgYW55IGV2ZW50IGlkIGNhcnJpZXMgbm8gc2xvdC4gRXZlcnkgV29ybGQgdGhlIHJ1bnRpbWUgcmVwbGF5c1xuICogYWdhaW5zdCBudW1iZXJzIGV2ZW50cyBieSBzbG90LCBzbyBhbiBpZCB0aGF0IGRvZXMgbm90IGlzIGEgYnJva2VuIGxvZyByYXRoZXJcbiAqIHRoYW4gYW4gb2xkZXIgb25lLCBhbmQgYSBtYXhpbXVtIGRlcml2ZWQgYnkgc2tpcHBpbmcgaXQgd291bGQgdW5kZXJzdGF0ZSB0aGVcbiAqIGxvZyB0byBldmVyeSB3cml0ZSB0aGF0IHJlYWRzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4RXZlbnRTbG90KGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCBtYXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBzbG90ID0gcmVxdWlyZUV2ZW50U2xvdChldmVudC5ldmVudElkKTtcbiAgICBpZiAobWF4ID09PSB1bmRlZmluZWQgfHwgc2xvdCA+IG1heCkge1xuICAgICAgbWF4ID0gc2xvdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cblxuLyoqIEEgcG9zaXRpb24gdGhlIGxvZyBza2lwcyBvdmVyLCBkZXNjcmliZWQgd2VsbCBlbm91Z2ggdG8gbmFtZSBpbiBhbiBlcnJvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTbG90R2FwIHtcbiAgLyoqIFRoZSBsb3dlc3Qgc2xvdCBiZWxvdyB0aGUgbG9nJ3MgbWF4aW11bSB0aGF0IG5vIGV2ZW50IG9jY3VwaWVzLiAqL1xuICBmaXJzdE1pc3NpbmdTbG90OiBudW1iZXI7XG4gIC8qKiBIb3cgbWFueSBzbG90cyBiZWxvdyB0aGUgbWF4aW11bSBubyBldmVudCBvY2N1cGllcy4gKi9cbiAgbWlzc2luZ0NvdW50OiBudW1iZXI7XG4gIC8qKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBsb2cgb2NjdXBpZXMuICovXG4gIG1heFNsb3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgaG9sZSBpbiBhIGxvYWRlZCBsb2csIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZSB0byBmaW5kLlxuICpcbiAqIFRoZSBXb3JsZCBhbGxvY2F0ZXMgZXZlcnkgcG9zaXRpb24sIHNvIGEgbG9nIHRoYXQgaG9sZHMgYG5gIGV2ZW50cyBiZWxvdyBzbG90XG4gKiBgbmAgaXMgbWlzc2luZyBvbmUuIFRoYXQgbWF0dGVycyBiZWZvcmUgYSByZXBsYXlcbiAqIGFuZCBub3doZXJlIGVsc2U6IHRoZSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXQgaGFzXG4gKiBoYXBwZW5lZCwgYW5kIGFuIGFic2VudCBwb3NpdGlvbiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGV2ZW50IHRoYXRcbiAqIG5ldmVyIG9jY3VycmVkLiBUaGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyIHdheSxcbiAqIGFuZCB0aGUgcnVuIGRpdmVyZ2VzIHF1aWV0bHkgcmF0aGVyIHRoYW4gZmFpbGluZy5cbiAqXG4gKiBPcmRlci1pbmRlcGVuZGVudCwgdW5saWtlIHRoZSBlcXVpdmFsZW50IGF1ZGl0IHRoZSBXb3JsZCBydW5zIG92ZXIgYSBwYWdlIGl0XG4gKiBqdXN0IHJlYWQuIEEgbG9hZGVkIGxvZyBpcyBhc3NlbWJsZWQgZnJvbSBsaXN0ZWQgcGFnZXMgcGx1cyB3aGF0ZXZlciBhXG4gKiBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZGVkIGJhY2ssIGFuZCB3aGlsZSB7QGxpbmsgbWVyZ2VSZXBvcnRlZEV2ZW50c31cbiAqIHJlc3RvcmVzIGlkIG9yZGVyLCBhIGNoZWNrIHRoYXQgY2FuIGZhaWwgYSBoZWFsdGh5IHJ1biBzaG91bGQgbm90IGRlcGVuZCBvblxuICogdGhhdCBoYXZpbmcgaGFwcGVuZWQuXG4gKlxuICogVGhlIGZpcnN0IHNsb3QgaXMgbmV2ZXIgY291bnRlZC4gSXQgYmVsb25ncyB0byBgcnVuX2NyZWF0ZWRgLCB3aGljaCBgc3RhcnQoKWBcbiAqIHBvc3RzIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBxdWV1ZSBzZW5kLCBzbyBhIGxvZyByZWFkIGluIHRoYXQgd2luZG93XG4gKiBsZWdpdGltYXRlbHkgYmVnaW5zIGF0IHRoZSBzZWNvbmQgc2xvdCBhbmQgZmlsbHMgaW4gb24gaXRzIG93bi4gRXZlcnkgcmVwbGF5XG4gKiB0aGF0IHJhY2VzIGEgcnVuJ3Mgb3duIHN0YXJ0IHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBob2xlLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGFuIGVtcHR5IGxvZywgd2hpY2ggaGFzIG5vIGRlbnNpdHkgdG8gY2hlY2suXG4gKlxuICogQHRocm93cyBpZiBhbnkgZXZlbnQgaWQgY2FycmllcyBubyBzbG90LCBmb3IgdGhlIHJlYXNvbiB7QGxpbmsgbWF4RXZlbnRTbG90fVxuICogZ2l2ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXZlbnRTbG90R2FwKFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IEV2ZW50U2xvdEdhcCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG9jY3VwaWVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCBtYXhTbG90ID0gMDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBzbG90ID0gcmVxdWlyZUV2ZW50U2xvdChldmVudC5ldmVudElkKTtcbiAgICBvY2N1cGllZC5hZGQoc2xvdCk7XG4gICAgaWYgKHNsb3QgPiBtYXhTbG90KSB7XG4gICAgICBtYXhTbG90ID0gc2xvdDtcbiAgICB9XG4gIH1cbiAgaWYgKG1heFNsb3QgPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGZsb29yID0gb2NjdXBpZWQuaGFzKEZJUlNUX0VWRU5UX1NMT1QpXG4gICAgPyBGSVJTVF9FVkVOVF9TTE9UXG4gICAgOiBGSVJTVF9FVkVOVF9TTE9UICsgMTtcbiAgLy8gRXZlcnkgc2xvdCBpcyBhdCBvciBhYm92ZSBgZmxvb3JgIGJ5IGNvbnN0cnVjdGlvbiwgc28gdGhlIGxvZyBpcyBkZW5zZVxuICAvLyBleGFjdGx5IHdoZW4gaXQgaG9sZHMgb25lIGV2ZW50IHBlciBwb3NpdGlvbiBpbiBgW2Zsb29yLCBtYXhTbG90XWAuIFRoZVxuICAvLyBzY2FuIGJlbG93IG9ubHkgcnVucyBvbmNlIHRoYXQgaGFzIGFscmVhZHkgYW5zd2VyZWQgbm8uXG4gIGlmIChvY2N1cGllZC5zaXplID09PSBtYXhTbG90IC0gZmxvb3IgKyAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgZmlyc3RNaXNzaW5nU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgbWlzc2luZ0NvdW50ID0gMDtcbiAgZm9yIChsZXQgc2xvdCA9IGZsb29yOyBzbG90IDw9IG1heFNsb3Q7IHNsb3QrKykge1xuICAgIGlmICghb2NjdXBpZWQuaGFzKHNsb3QpKSB7XG4gICAgICBmaXJzdE1pc3NpbmdTbG90ID8/PSBzbG90O1xuICAgICAgbWlzc2luZ0NvdW50Kys7XG4gICAgfVxuICB9XG4gIGlmIChmaXJzdE1pc3NpbmdTbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IGZpcnN0TWlzc2luZ1Nsb3QsIG1pc3NpbmdDb3VudCwgbWF4U2xvdCB9O1xufVxuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGEgZGV0ZWN0ZWQgaG9sZSBpcyByZS1yZWFkIGJlZm9yZSB0aGUgbG9nIGlzIHRha2VuIGF0IGl0c1xuICogd29yZCwgYW5kIHRoZSBiYWNrb2ZmIGJlZm9yZSBlYWNoIHJlLXJlYWQgKGRvdWJsaW5nIHBlciBhdHRlbXB0KS5cbiAqXG4gKiBBIGhvbGUgY2FuIGJlIHRyYW5zaWVudC4gVGhlIFdvcmxkIGFsbG9jYXRlcyBhIHNsb3QgaW5zaWRlIHRoZSBpbnNlcnQgdGhhdFxuICogb2NjdXBpZXMgaXQsIHNvIHR3byBjb25jdXJyZW50IHdyaXRlcnMgY2FuIGNvbGxpZGUsIG9uZSByZXRyeSBwYXN0IHRoZSBvdGhlcixcbiAqIGFuZCB0aGUgaGlnaGVyIHNsb3QgY29tbWl0IGZpcnN0LCBsZWF2aW5nIGEgd2luZG93IGluIHdoaWNoIHRoZSBsb3dlciBvbmUgaXNcbiAqIGdlbnVpbmVseSBhYnNlbnQgZnJvbSBhIHN0cm9uZ2x5LWNvbnNpc3RlbnQgcmVhZCBhbmQgZmlsbHMgaW4gYSBtb21lbnQgbGF0ZXIuXG4gKiBUaGUgd2luZG93IGlzIG9uZSBjb21taXQgd2lkZSwgc28gYSBzaG9ydCBiYWNrb2ZmIGNsZWFycyBpdDsgYW55dGhpbmcgdGhhdFxuICogc3Vydml2ZXMgYWxsIHRocmVlIHJlLXJlYWRzIGlzIGEgcG9zaXRpb24gbm8gd3JpdGUgd2lsbCBldmVyIG9jY3VweS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFMgPSAzO1xuY29uc3QgU0xPVF9HQVBfUkVDSEVDS19CQVNFX0RFTEFZX01TID0gMjU7XG5cbi8qKlxuICogUmUtcmVhZCBhIGxvZyB0aGF0IGxvb2tzIGhvbGV5IHVudGlsIHRoZSBob2xlIGZpbGxzIGluIG9yIHRoZSByZS1yZWFkcyBydW5cbiAqIG91dCwgYW5kIHJldHVybiB0aGUgc2V0dGxlZCBsb2cgYWxvbmdzaWRlIHRoZSBob2xlIHRoYXQgc3Vydml2ZWQuXG4gKlxuICogUmVhZHMgYXJlIHN0cm9uZ2x5IGNvbnNpc3RlbnQsIHNvIGEgaG9sZSBpcyBub3QgYW4gYXJ0aWZhY3Qgb2YgKndoZW4qIHRoZSBsb2dcbiAqIHdhcyByZWFkLCBidXQgaXQgY2FuIGJlIGFuIGFydGlmYWN0IG9mIGEgd3JpdGUgdGhhdCBoYWQgbm90IGNvbW1pdHRlZCB5ZXRcbiAqIChzZWUge0BsaW5rIFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFN9KS4gRGlzdGluZ3Vpc2hpbmcgdGhlIHR3byBjb3N0cyBhXG4gKiByZS1yZWFkLCB3aGljaCBpcyBvbmx5IGV2ZXIgcGFpZCBieSBhIHJlcGxheSB0aGF0IGFscmVhZHkgZm91bmQgYSBob2xlLlxuICpcbiAqIFRoZSByZWxvYWQgaXMgZnVsbCByYXRoZXIgdGhhbiBpbmNyZW1lbnRhbDogdGhlIG1pc3NpbmcgcG9zaXRpb24gaXMgYmVsb3cgdGhlXG4gKiBsb2cncyBtYXhpbXVtLCBzbyBhIGN1cnNvci1hbmNob3JlZCByZWFkIHN0YXJ0cyBwYXN0IGl0IGFuZCBjYW4gbmV2ZXIgc2VlIGl0XG4gKiBhcnJpdmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR0bGVFdmVudFNsb3RHYXAoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGxvYWRlZDogTG9hZGVkRXZlbnRMb2dcbik6IFByb21pc2U8eyBsb2c6IExvYWRlZEV2ZW50TG9nOyBnYXA6IEV2ZW50U2xvdEdhcCB8IHVuZGVmaW5lZCB9PiB7XG4gIGxldCBsb2cgPSBsb2FkZWQ7XG4gIGxldCBnYXAgPSBmaW5kRXZlbnRTbG90R2FwKGxvZy5ldmVudHMpO1xuICBmb3IgKFxuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICBnYXAgIT09IHVuZGVmaW5lZCAmJiBhdHRlbXB0IDwgU0xPVF9HQVBfUkVDSEVDS19BVFRFTVBUUztcbiAgICBhdHRlbXB0KytcbiAgKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIFNMT1RfR0FQX1JFQ0hFQ0tfQkFTRV9ERUxBWV9NUyAqIDIgKiogYXR0ZW1wdClcbiAgICApO1xuICAgIGxvZyA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgZ2FwID0gZmluZEV2ZW50U2xvdEdhcChsb2cuZXZlbnRzKTtcbiAgfVxuICByZXR1cm4geyBsb2csIGdhcCB9O1xufVxuXG4vKipcbiAqIEhvdyBtdWNoIG9mIGl0cyBydW4ncyBsb2cgYSByZXBsYXktY29udGV4dCBldmVudCBjcmVhdGlvbiBoYWQgbG9hZGVkIHdoZW4gaXRcbiAqIGRlY2lkZWQgdG8gd3JpdGUsIGFzIHRoZSBoaWdoZXN0IHNsb3QgdGhhdCBsb2cgb2NjdXBpZXMuXG4gKlxuICogT25lIGludGVnZXIgc2F5cyBpdCBiZWNhdXNlIHRoZSBXb3JsZCBrZWVwcyBpdHMgcG9zaXRpb25zIGRlbnNlOiBhIHdyaXRlclxuICogdGhhdCBuYW1lcyBzbG90IE4gaXMgY2xhaW1pbmcgdG8gaG9sZCBldmVyeSBldmVudCBmcm9tIDEgdG8gTiBhbmQgbm90aGluZ1xuICogYWJvdmUuIFRoZSBXb3JsZCBhbnN3ZXJzIGJ5IG51bWJlcmluZyB0aGUgd3JpdGUgYWJvdmUgd2hhdGV2ZXIgdGhlIGxvZyBoYXNcbiAqIGFjdHVhbGx5IHJlYWNoZWQgYW5kIGhhbmRpbmcgYmFjayB0aGUgZXZlbnRzIG9uIHRoZSBzbG90cyBpbiBiZXR3ZWVuOiB0aGVcbiAqIG9uZXMgdGhpcyB3cml0ZXIgZGVjaWRlZCB3aXRob3V0LlxuICpcbiAqIERlbnNpdHkgaXMgdGhlIFdvcmxkJ3MgaW52YXJpYW50LCBub3QgYSBjbGFpbSBhYm91dCB0aGlzIHBhcnRpY3VsYXIgcmVhZC4gQVxuICogcmVhZGVyIHRoYXQgaXMgc2hvcnQgb2YgYSBwb3NpdGlvbiBpdCBob2xkcyBubyBldmVudCBmb3IgbmFtZXMgYSBsb3dlciBOLFxuICogd2hpY2ggdW5kZXJzdGF0ZXMgd2hhdCBpdCBoYXMgc2VlbiBhbmQgb25seSBjb3N0cyBpdCBhIHdpZGVyIHJlcG9ydC4gTmFtaW5nXG4gKiBhIHBvc2l0aW9uIGl0IGNhbm5vdCBhY2NvdW50IGZvciBpcyB0aGUgZGlyZWN0aW9uIHRoYXQgaXMgdW5zYWZlLCB3aGljaCBpc1xuICogd2h5IHtAbGluayBzbG90U25hcHNob3RQYXJhbXN9IHRha2VzIHRoZSBtYXhpbXVtIHJhdGhlciB0aGFuIHRoZSBjb3VudC5cbiAqXG4gKiBJdHMgb3duIG9iamVjdCByYXRoZXIgdGhhbiBhIGJhcmUgbnVtYmVyIHNvIGEgY2FsbCBzaXRlIGNhbm5vdCBoYWxmLXNlbmQgaXQsXG4gKiBhbmQgc28gdGhlIGVtcHR5IGNhc2Ugc3ByZWFkcyB0byBub3RoaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsb3RTbmFwc2hvdFBhcmFtcyB7XG4gIGV2ZW50Q291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNsb3Qgc25hcHNob3QgdG8gYXR0YWNoIHRvIGEgcmVwbGF5LWNvbnRleHQgZXZlbnQgY3JlYXRpb24uXG4gKlxuICogRW1wdHkgZm9yIGFuIGVtcHR5IGxvZywgd2hpY2ggaXMgdGhlIHN0YXRlIGEgYHJ1bl9jcmVhdGVkYCB3cml0ZSBpcyBpc3N1ZWRcbiAqIGZyb206IHRoZXJlIGlzIG5vIHBvc2l0aW9uIGhlbGQgeWV0IHRvIG5hbWUuXG4gKlxuICogVGhlIG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIGxlbmd0aCwgZm9yIHRoZSByZWFzb24ge0BsaW5rIG1heEV2ZW50U2xvdH1cbiAqIGdpdmVzOiBhIHBhcnRpYWxseS1yZWFkIGxvZyBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbiwgYW5kXG4gKiBjb3VudGluZyB0aG9zZSB3b3VsZCBtYWtlIHRoZSB3cml0ZSBjbGFpbSB0byBoYXZlIHNlZW4gbGVzcyB0aGFuIGl0IGhhcywgc29cbiAqIHRoZSBXb3JsZCB3b3VsZCByZXBvcnQgdGhlIHNhbWUgZXZlbnRzIGJhY2sgb24gZXZlcnkgYXR0ZW1wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsb3RTbmFwc2hvdFBhcmFtcyhcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBTbG90U25hcHNob3RQYXJhbXMge1xuICBjb25zdCBldmVudENvdW50ID0gbWF4RXZlbnRTbG90KGV2ZW50cyk7XG4gIHJldHVybiBldmVudENvdW50ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZXZlbnRDb3VudCB9O1xufVxuXG4vKipcbiAqIFRoZSBldmVudHMgYSByZWplY3RpbmcgV29ybGQgYXR0YWNoZWQgdG8gYSBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgLCB3aGVuIGl0XG4gKiByZXR1cm5lZCB0aGUgb25lcyB0aGUgY2xpZW50J3Mgc25hcHNob3Qgd2FzIG1pc3NpbmcgaW5saW5lLlxuICpcbiAqIFJldHVybnMgYG51bGxgIGZvciBhbnl0aGluZyBlbHNlOiBubyBkZXRhaWxzLCBhIFdvcmxkIHRoYXQgZGlkIG5vdCBpbXBsZW1lbnRcbiAqIHRoaXMsIG9yIGEgcGF5bG9hZCB0aGF0IGRvZXMgbm90IG5hcnJvdyBjbGVhbmx5LiBDYWxsZXJzIGZhbGwgYmFjayB0b1xuICogcmVsb2FkaW5nIHRoZSBldmVudCBsb2csIHdoaWNoIGlzIGFsd2F5cyBjb3JyZWN0OyB0aGlzIGlzIHVudHJ1c3RlZC1zaGFwZWRcbiAqIGRhdGEgb24gYSBmYWlsdXJlIHBhdGgsIHNvIG5vdGhpbmcgaGVyZSBpcyByZXBhaXJlZC5cbiAqXG4gKiBgcnVuSWRgIGlzIHRoZSBjYWxsZXIncyBydW4uIEV2ZXJ5IGV2ZW50IG11c3QgYmVsb25nIHRvIGl0OiB0aGUgZGVsdGEgaXNcbiAqIG1lcmdlZCBzdHJhaWdodCBpbnRvIHRoZSByZXBsYXkncyBsb2csIGFuZCBvbmUgZm9yZWlnbiBldmVudCB0aGVyZSBpcyBhXG4gKiBjb3JydXB0IGxvZyByYXRoZXIgdGhhbiBhIGNvcnJlY3RlZCBvbmU6IHRoZSByZXBsYXkgd291bGQgY29uc3VtZSBhXG4gKiBjb3JyZWxhdGlvbiBpZCBmb3IgYW4gZXZlbnQgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoXG4gIGVycm9yOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nXG4pOiB7IGV2ZW50czogRXZlbnRbXTsgY3Vyc29yOiBzdHJpbmcgfCBudWxsIH0gfCBudWxsIHtcbiAgaWYgKCFQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnJvcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkZXRhaWxzID0gZXJyb3IuZGV0YWlscztcbiAgaWYgKHR5cGVvZiBkZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBkZXRhaWxzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBldmVudHMsIGN1cnNvciB9ID0gZGV0YWlscyBhcyB7IGV2ZW50cz86IHVua25vd247IGN1cnNvcj86IHVua25vd24gfTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykgfHwgZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgZXZlbnQgPT09IG51bGwgfHxcbiAgICAgIHR5cGVvZiAoZXZlbnQgYXMgeyBldmVudElkPzogdW5rbm93biB9KS5ldmVudElkICE9PSAnc3RyaW5nJyB8fFxuICAgICAgKGV2ZW50IGFzIHsgcnVuSWQ/OiB1bmtub3duIH0pLnJ1bklkICE9PSBydW5JZFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiBldmVudHMgYXMgRXZlbnRbXSxcbiAgICBjdXJzb3I6IHR5cGVvZiBjdXJzb3IgPT09ICdzdHJpbmcnID8gY3Vyc29yIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZXMgb25lIGV2ZW50IG9uIGEgYm91bmQgcnVuLCBjYXJyeWluZyByZXBsYXktcmVjb3ZlcnkgdGVsZW1ldHJ5LiAqL1xuZXhwb3J0IHR5cGUgRXZlbnRDcmVhdG9yID0gKFxuICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4pID0+IFByb21pc2U8RXZlbnRSZXN1bHQ+O1xuXG4vKipcbiAqIENPUlMgaGVhZGVycyBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlcy5cbiAqIEFsbG93cyB0aGUgb2JzZXJ2YWJpbGl0eSBVSSB0byBjaGVjayBlbmRwb2ludCBoZWFsdGggZnJvbSBhIGRpZmZlcmVudCBvcmlnaW4uXG4gKi9cbmNvbnN0IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMgPSB7XG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ1BPU1QsIE9QVElPTlMsIEdFVCwgSEVBRCcsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0NvbnRlbnQtVHlwZScsXG59O1xuXG4vKipcbiAqIFdyYXBzIGEgcmVxdWVzdC9yZXNwb25zZSBoYW5kbGVyIGFuZCBhZGRzIGEgaGVhbHRoIGNoZWNrIFwibW9kZVwiXG4gKiBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBgX19oZWFsdGhgIHF1ZXJ5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhIZWFsdGhDaGVjayhcbiAgaGFuZGxlcjogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpO1xuICAgIGNvbnN0IGlzSGVhbHRoQ2hlY2sgPSB1cmwuc2VhcmNoUGFyYW1zLmhhcygnX19oZWFsdGgnKTtcbiAgICBpZiAoaXNIZWFsdGhDaGVjaykge1xuICAgICAgLy8gSGFuZGxlIENPUlMgcHJlZmxpZ2h0IGZvciBoZWFsdGggY2hlY2tcbiAgICAgIGlmIChyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgICAgaGVhZGVyczogSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGVhbHRoeTogdHJ1ZSxcbiAgICAgICAgICBlbmRwb2ludDogdXJsLnBhdGhuYW1lLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIC4uLkhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgfTtcbn1cblxuLyoqIEZOVi0xYSAzMi1iaXQgaGFzaCBvZiBhIHN0cmluZywgYXMgOCBoZXggY2hhcnMuIFRpbnksIGRldGVybWluaXN0aWMsIGFuZFxuICogIGRlcGVuZGVuY3ktZnJlZS4gVXNlZCBvbmx5IHRvIHNjb3BlIGlkZW1wb3RlbmN5IGtleXMsIG5vdCBmb3Igc2VjdXJpdHkuICovXG5mdW5jdGlvbiBmbnYxYTMySGV4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgaGFzaCA9IDB4ODExYzlkYzU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBoYXNoIF49IHZhbHVlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IE1hdGguaW11bChoYXNoLCAweDAxMDAwMTkzKTtcbiAgfVxuICByZXR1cm4gKGhhc2ggPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAnMCcpO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbmN5IGtleSBmb3IgYSBzdGVwJ3MgYmFja2dyb3VuZC1kaXNwYXRjaCBxdWV1ZSBtZXNzYWdlLCBzY29wZWQgdG9cbiAqIHRoZSBzdGVwJ3MgSURFTlRJVFksIGNvcnJlbGF0aW9uIGlkIHBsdXMgKGhhc2hlZCkgc3RlcCBuYW1lLCByYXRoZXIgdGhhblxuICogdGhlIGJhcmUgY29ycmVsYXRpb24gaWQuXG4gKlxuICogVGhlIHNjb3BpbmcgbWF0dGVycyBmb3IgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggdW5kZXIgdGhlIHByZWNvbmRpdGlvblxuICogZ3VhcmQ6IGEgZ3VhcmQtcmVqZWN0ZWQgYHN0ZXBfY3JlYXRlZGAgbGVhdmVzIGl0cyAocmV2b2tlZCkgc3RlcCBtZXNzYWdlIGluXG4gKiBmbGlnaHQsIGFuZCB0aGUgY29ycmVjdGVkIHJlcGxheSBtYXkgcmUtZGVyaXZlIHRoZSBzYW1lIGNvcnJlbGF0aW9uIGlkIGZvclxuICogYSBESUZGRVJFTlQgc3RlcC4gVW5kZXIgYSBiYXJlLWNvcnJlbGF0aW9uSWQga2V5IHRoZSBjb3JyZWN0ZWQgcmVwbGF5J3NcbiAqIGRpc3BhdGNoIHdvdWxkIHNpbGVudGx5IGRlZHVwZSBhZ2FpbnN0IHRoZSByZXZva2VkIGluLWZsaWdodCBtZXNzYWdlLFxuICogd2hpY2ggdGhlbiByZXNvbHZlcyBgc2tpcHBlZGAgYWdhaW5zdCB0aGUgcmUtY3JlYXRlZCBlbnRpdHkgKHRoZSBzZXJ2ZXInc1xuICogc3RlcE5hbWUgZmVuY2UgcmVqZWN0cyBpdHMgYmFyZSBzdGFydCksIGFuZCB0aGUgbGVnaXRpbWF0ZSBzdGVwIHdvdWxkXG4gKiBuZXZlciBiZSBleGVjdXRlZC4gU2NvcGluZyBieSBzdGVwIG5hbWUga2VlcHMgZXZlcnkgZGVkdXAgcHJvcGVydHkgdGhhdFxuICogbWF0dGVycyAoY3Jhc2ggcmVjb3ZlcnkgcmUtZGlzcGF0Y2gsIGNvbmN1cnJlbnQgaGFuZGxlcnMsIHRoZSBkZWxheWVkXG4gKiByZXRyeSBzaGFyaW5nIHRoZSBzdXNwZW5zaW9uIHJlLWRpc3BhdGNoJ3Mga2V5OiBhbGwgbmFtZSB0aGUgc2FtZSBzdGVwKVxuICogd2hpbGUgbGV0dGluZyB0aGUgY29ycmVjdGVkIHNjaGVkdWxlJ3MgZGlzcGF0Y2ggdGhyb3VnaC5cbiAqXG4gKiBFdmVyeSBwcm9kdWNlciBvZiBhIHN0ZXAtZGlzcGF0Y2ggKG9yIHN0ZXAtcmV0cnkpIG1lc3NhZ2UgbXVzdCB1c2UgdGhpc1xuICoga2V5LiBDcm9zcy12ZXJzaW9uIG1peGluZyBpcyBub3QgYSBjb25jZXJuOiBxdWV1ZSBtZXNzYWdlcyBhcmUgcGlubmVkIHRvXG4gKiB0aGUgZGVwbG95bWVudCB0aGF0IHByb2R1Y2VkIHRoZW0sIHNvIG9uZSBydW4gbmV2ZXIgc2VlcyB0d28ga2V5IHNjaGVtZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nLFxuICBzdGVwTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y29ycmVsYXRpb25JZH06JHtmbnYxYTMySGV4KHN0ZXBOYW1lKX1gO1xufVxuXG4vKipcbiAqIFF1ZXVlcyBhIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZCBxdWV1ZSB3aXRoIHRyYWNpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWV1ZU1lc3NhZ2UoXG4gIHdvcmxkOiBXb3JsZCxcbiAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2Ygd29ybGQucXVldWU+XG4pIHtcbiAgY29uc3QgcXVldWVOYW1lID0gYXJnc1swXTtcbiAgYXdhaXQgdHJhY2UoXG4gICAgJ3F1ZXVlLnB1Ymxpc2gnLFxuICAgIHtcbiAgICAgIC8vIFN0YW5kYXJkIE9URUwgbWVzc2FnaW5nIGNvbnZlbnRpb25zXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKHF1ZXVlTmFtZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwdWJsaXNoJyksXG4gICAgICAgIC8vIFBlZXIgc2VydmljZSBmb3IgRGF0YWRvZyBzZXJ2aWNlIG1hcHNcbiAgICAgICAgLi4uQXR0cmlidXRlLlBlZXJTZXJ2aWNlKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5ScGNTZXJ2aWNlKCd2cXMnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY01ldGhvZCgncHVibGlzaCcpLFxuICAgICAgfSxcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdQUk9EVUNFUicpLFxuICAgIH0sXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZUlkIH0gPSBhd2FpdCB3b3JsZC5xdWV1ZSguLi5hcmdzKTtcbiAgICAgIGlmIChtZXNzYWdlSWQpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1lc3NhZ2VJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBxdWV1ZSBvdmVyaGVhZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgYSBnaXZlbiBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVldWVPdmVyaGVhZChtZXNzYWdlOiB7IHJlcXVlc3RlZEF0PzogRGF0ZSB9KSB7XG4gIGlmICghbWVzc2FnZS5yZXF1ZXN0ZWRBdCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHJldHVybiBBdHRyaWJ1dGUuUXVldWVPdmVyaGVhZE1zKFxuICAgICAgRGF0ZS5ub3coKSAtIG1lc3NhZ2UucmVxdWVzdGVkQXQuZ2V0VGltZSgpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG1lbW9pemVkIGFjY2Vzc29yIGZvciBhIHJ1bidzIGZ1bGwgZW5jcnlwdGlvbiBjYXBhYmlsaXR5LlxuICpcbiAqIFRoZSBmaXJzdCBjYWxsIHJlc29sdmVzIHRoZSBydW4ncyBrZXkgbWF0ZXJpYWwgdmlhXG4gKiBgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bmAgKHdoaWNoIG1heSBkbyBIS0RGIGRlcml2YXRpb24gbG9jYWxseSBvblxuICogVmVyY2VsLCBvciBhIG5ldHdvcmsgZmV0Y2ggZnJvbSBleHRlcm5hbCBjb250ZXh0cykgYW5kIGRlcml2ZXMgYVxuICoge0BsaW5rIFBheWxvYWRLZXl9IGZyb20gaXQ7IHN1YnNlcXVlbnQgY2FsbHMgYXdhaXQgdGhlIHNhbWUgY2FjaGVkIHByb21pc2UuXG4gKiBJZiB0aGUgd29ybGQgZG9lc24ndCBzdXBwb3J0IGVuY3J5cHRpb24gb3IgdGhlIHJ1biBoYXMgbm8ga2V5IGNvbmZpZ3VyZWQsXG4gKiB0aGUgY2FjaGVkIHZhbHVlIGlzIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSByZXNvbHZlZCB2YWx1ZSBpcyBkZWxpYmVyYXRlbHkgdGhlICpmdWxsKiBjYXBhYmlsaXR5ICh0aGUgc3ltbWV0cmljIEFFU1xuICoga2V5IHBsdXMgdGhlIHJ1bidzIFgyNTUxOSBrZXlwYWlyKSwgbm90IGp1c3QgYSBgQ3J5cHRvS2V5YC4gQSBydW4gcmVhZGluZ1xuICogaXRzIG93biBldmVudCBsb2cgY2FuIGVuY291bnRlciBzZWFsZWQgKGBlbmNwYCkgcGF5bG9hZHMgdGhhdCBhbm90aGVyIHJ1blxuICogd3JvdGUgdG8gaXQgKGEgY3Jvc3MtZGVwbG95bWVudCBob29rIHJlc3VtcHRpb24sIHNheSksIGFuZCBvcGVuaW5nIHRob3NlXG4gKiBuZWVkcyB0aGUga2V5cGFpci4gUmVzb2x2aW5nIG9ubHkgdGhlIHN5bW1ldHJpYyBrZXkgd291bGQgbGVhdmUgdGhvc2VcbiAqIHBheWxvYWRzIHVub3BlbmFibGUgYW5kIHdlZGdlIHRoZSBydW4uXG4gKlxuICogVXNlZCBieSBzdGVwIC8gd29ya2Zsb3cgaGFuZGxlcnMgdG8gZGVmZXIgdGhlIChwb3RlbnRpYWxseSBleHBlbnNpdmUpXG4gKiBrZXkgZmV0Y2ggdW50aWwgdGhlIGZpcnN0IGNvZGUgcGF0aCB0aGF0IGFjdHVhbGx5IG5lZWRzIGl0OiB0eXBpY2FsbHlcbiAqIGlucHV0IGh5ZHJhdGlvbiBvbiB0aGUgc3VjY2VzcyBwYXRoLCBvciBlcnJvciBkZWh5ZHJhdGlvbiBvbiBhIGZhaWx1cmVcbiAqIHBhdGguIEJvdGggcGF0aHMgY2FuIHJhY2UtY2FsbCB0aGUgYWNjZXNzb3Igd2l0aG91dCB0cmlnZ2VyaW5nIGR1cGxpY2F0ZVxuICogZmV0Y2hlcy5cbiAqXG4gKiBFcnJvcnMgdGhyb3duIGJ5IGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCBwcm9wYWdhdGUgdG8gZXZlcnkgY2FsbGVyXG4gKiAodGhlIGNhY2hlZCBwcm9taXNlIHJlamVjdHMpLiBUaGlzIGlzIGludGVudGlvbmFsOiB3aGVuIGVuY3J5cHRpb24gaXNcbiAqIGNvbmZpZ3VyZWQsIHdlIG5ldmVyIHdhbnQgdG8gc2lsZW50bHkgZmFsbCBiYWNrIHRvIHBsYWludGV4dFxuICogc2VyaWFsaXphdGlvbi4gQSBwcm9wYWdhdGVkIGVycm9yIGluIGFuIGV2ZW50LWVtaXNzaW9uIHBhdGggbGVhdmVzIHRoZVxuICogb3V0ZXIgdHJ5L2NhdGNoIHRvIGxvZyBhbmQgc3VyZmFjZSB0aGUgaXNzdWU7IHRoZSBxdWV1ZSdzIHJlZGVsaXZlcnlcbiAqIHNlbWFudGljcyB3aWxsIHJldHJ5IHRoZSBrZXkgZmV0Y2ggb24gdGhlIG5leHQgYXR0ZW1wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9pemVFbmNyeXB0aW9uS2V5KFxuICB3b3JsZDogV29ybGQsXG4gIHJ1bk9ySWQ6IFdvcmtmbG93UnVuIHwgc3RyaW5nXG4pOiAoKSA9PiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgbGV0IGNhY2hlZDogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgY2FjaGVkID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gVGhlIGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCBvdmVybG9hZCBzZXQgdGFrZXMgZWl0aGVyIGFcbiAgICAgICAgLy8gYFdvcmtmbG93UnVuYCBvciBhIGBydW5JZDogc3RyaW5nYCAod2l0aCBvcHRpb25hbCBjb250ZXh0KS4gQnJhbmNoXG4gICAgICAgIC8vIGhlcmUgc28gVHlwZVNjcmlwdCBwaWNrcyB0aGUgcmlnaHQgb3ZlcmxvYWQgZm9yIGVhY2ggc2hhcGUuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9XG4gICAgICAgICAgdHlwZW9mIHJ1bk9ySWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkKVxuICAgICAgICAgICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuT3JJZCk7XG4gICAgICAgIC8vIFJlc29sdmUgdGhlICpmdWxsKiBjYXBhYmlsaXR5LCBub3QganVzdCB0aGUgc3ltbWV0cmljIGtleTogYSBydW5cbiAgICAgICAgLy8gcmVhZGluZyBpdHMgb3duIGV2ZW50IGxvZyBtYXkgZW5jb3VudGVyIHNlYWxlZCAoYGVuY3BgKSBwYXlsb2Fkc1xuICAgICAgICAvLyB0aGF0IGFub3RoZXIgcnVuIHdyb3RlIHRvIGl0LCBhbmQgb3BlbmluZyB0aG9zZSBuZWVkcyB0aGUgcnVuJ3NcbiAgICAgICAgLy8gWDI1NTE5IHNjYWxhciBhcyB3ZWxsLlxuICAgICAgICByZXR1cm4gcmF3S2V5ID8gYXdhaXQgZGVyaXZlUnVuUGF5bG9hZEtleXMocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pKCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG4gIH07XG59XG4iXX0=