@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
@@ -1,4 +1,4 @@
1
- import { entityEventClass, envNumber } from '@workflow/world';
1
+ import { entityEventClass, envNumber, isSealedNoopEvent, } from '@workflow/world';
2
2
  import { eventsLogger } from './logger.js';
3
3
  /**
4
4
  * Delay before firing the deferred unconsumed-event check after the promise
@@ -53,7 +53,7 @@ const getDeferredCheckDelayMs = () => envNumber('WORKFLOW_DEFERRED_CHECK_DELAY_M
53
53
  * waits, and tolerating a stray one is the cheaper direction to be wrong in.
54
54
  *
55
55
  * An allowlist rather than the complement of the ordered set, so a type this
56
- * file has not been taught about keeps the strict old behaviour.
56
+ * file has not been taught about keeps the strict old behavior.
57
57
  *
58
58
  * `hook_disposed` is deliberately absent despite being about a hook: it is
59
59
  * written when the workflow's own `using` scope exits, so it is replay-origin.
@@ -171,8 +171,8 @@ export class EventsConsumer {
171
171
  /**
172
172
  * The oldest event the walk stepped over that no consumer has claimed yet,
173
173
  * if any. Parking is a bet that a consumer will be registered later, so at
174
- * any point where no consumer ever will be again the replay finishing is
175
- * the definitive one this answers which event the bet lost on.
174
+ * any point where no consumer ever will be again (the replay finishing is
175
+ * the definitive one), this answers which event the bet lost on.
176
176
  */
177
177
  get strandedEvent() {
178
178
  return this.parked[0]?.event;
@@ -253,7 +253,7 @@ export class EventsConsumer {
253
253
  // delivery `resolve()`; none of the callbacks here call `subscribe()`
254
254
  // synchronously. So within one pass `this.callbacks` is mutated only by
255
255
  // this loop (the `Finished` splice), and the next event's consumer is
256
- // either already present (advance now) or not yet registered in which
256
+ // either already present (advance now) or not yet registered, in which
257
257
  // case no callback consumes the event and we fall through to the
258
258
  // cross-VM-safe deferred unconsumed-event check below, exactly as before.
259
259
  while (true) {
@@ -263,6 +263,10 @@ export class EventsConsumer {
263
263
  // event's by the index it holds.
264
264
  this.drainParked();
265
265
  const currentEvent = this.events[this.eventIndex] ?? null;
266
+ if (currentEvent !== null && isSealedNoopEvent(currentEvent)) {
267
+ this.skipSealedNoop(currentEvent);
268
+ continue;
269
+ }
266
270
  const consumed = this.offer(currentEvent);
267
271
  if (consumed) {
268
272
  this.eventIndex++;
@@ -292,7 +296,7 @@ export class EventsConsumer {
292
296
  this.scheduleUnconsumedCheck(currentEvent, true);
293
297
  return;
294
298
  }
295
- // A real event was consumed advance to the next in the same pass.
299
+ // A real event was consumed, so advance to the next in the same pass.
296
300
  }
297
301
  };
298
302
  /**
@@ -445,7 +449,7 @@ export class EventsConsumer {
445
449
  * ids are minted from a monotonic ULID per body position, so nothing later in
446
450
  * the body registers a second consumer under this id. Waiting would cost
447
451
  * `getDeferredCheckDelayMs()` per straggler per replay for information that
448
- * cannot arrive 0.75% of production runs carry at least one straggler, and
452
+ * cannot arrive: 0.75% of production runs carry at least one straggler, and
449
453
  * the p99 among those carries 155.
450
454
  *
451
455
  * The invariant to preserve if hook identity ever becomes caller-supplied
@@ -459,6 +463,23 @@ export class EventsConsumer {
459
463
  const key = this.eventClassKey(event);
460
464
  return key === undefined ? undefined : this.seenEventClasses.get(key);
461
465
  }
466
+ /**
467
+ * Steps the walk over a sealed-log `noop` (specVersion >= 7): the World's
468
+ * backend wrote it to occupy a slot whose writer allocated the position and
469
+ * died, so the log's density arithmetic holds. It is invisible to the
470
+ * workflow: no consumer is offered it, no event class is recorded, and the
471
+ * deterministic clock does not advance, exactly as with
472
+ * {@link skipDuplicateEvent}, so a log that happens to contain one produces the same
473
+ * timestamps as a log that does not. (Its `createdAt` is the seal time,
474
+ * which can even postdate later slots' events; letting it touch the clock
475
+ * would leak the sealer's wall clock into replay.)
476
+ */
477
+ skipSealedNoop(event) {
478
+ this.eventIndex++;
479
+ eventsLogger.debug('Skipping sealed-log noop event', {
480
+ eventId: event.eventId,
481
+ });
482
+ }
462
483
  /** Steps the walk over a repeat of an already-consumed class. */
463
484
  skipDuplicateEvent(event, firstType) {
464
485
  this.eventIndex++;
@@ -483,7 +504,7 @@ export class EventsConsumer {
483
504
  }
484
505
  handleEndOfLog() {
485
506
  // Everything still parked is waiting for a consumer some later replay will
486
- // register, which is the whole point of parking except once the log
507
+ // register, which is the whole point of parking, except once the log
487
508
  // already holds the run's terminal event, because then there is no later
488
509
  // replay and no consumer will ever come.
489
510
  if (this.parked.length === 0) {
@@ -512,7 +533,7 @@ export class EventsConsumer {
512
533
  // Schedule a deferred check. We chain onto the promiseQueue so that any
513
534
  // pending async work (e.g., deserialization/decryption that triggers
514
535
  // resolve() → user code → subscribe()) completes first. If the event
515
- // is still unconsumed after the queue drains, it's truly orphaned or,
536
+ // is still unconsumed after the queue drains, it's truly orphaned, or,
516
537
  // when its type carries no ordering claim, parked for a later consumer.
517
538
  const checkVersion = ++this.unconsumedCheckVersion;
518
539
  this.pendingUnconsumedCheck = this.getPromiseQueue()
@@ -560,7 +581,7 @@ export class EventsConsumer {
560
581
  * pass that offered it, before this check is ever scheduled, and a class
561
582
  * recorded while the check was in flight can only have been recorded by a
562
583
  * consumption inside {@link consume}, whose next pass re-offers this event
563
- * and steps over it there leaving the identity guard above to drop the
584
+ * and steps over it there, leaving the identity guard above to drop the
564
585
  * in-flight check.
565
586
  */
566
587
  resolveUnconsumedEvent(currentEvent, mayPark) {
@@ -598,7 +619,7 @@ export class EventsConsumer {
598
619
  * loses it, and no measurement of a delivery outrunning 100ms exists either
599
620
  * way. So read this as retiring the bet rather than as repairing an observed
600
621
  * failure of that number: the delay is a user-settable env override, which
601
- * leaves the old behaviour one configuration away from losing on any backend.
622
+ * leaves the old behavior one configuration away from losing on any backend.
602
623
  *
603
624
  * Termination is `hasParkedCommittedDelivery`'s: it counts only deliveries
604
625
  * that resolve on their own, so nothing here can gate its own retirement. A
@@ -647,4 +668,4 @@ export class EventsConsumer {
647
668
  poll();
648
669
  }
649
670
  }
650
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUUzQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsRUFBRSxDQUFDO0FBRTlDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQVcsRUFBRSxDQUMzQyxTQUFTLENBQUMsa0NBQWtDLEVBQUUsdUJBQXVCLEVBQUU7SUFDckUsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsMkJBQTJCO0NBQ2pDLENBQUMsQ0FBQztBQUVMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBb0MsSUFBSSxHQUFHLENBQUM7SUFDcEUsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLGVBQWU7Q0FDaEIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxnQkFBZ0I7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsaUVBQWlFO0FBQ2pFLFNBQVMsYUFBYSxDQUFDLFNBQWlCLEVBQUUsYUFBcUI7SUFDN0QsT0FBTyxHQUFHLFNBQVMsSUFBSSxhQUFhLEVBQUUsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBb0MsSUFBSSxHQUFHLENBQUM7SUFDcEUsZUFBZTtJQUNmLFlBQVk7SUFD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QUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUNHO0lBQ0ssZ0JBQWdCLENBQUMsWUFBb0IsRUFBRSxFQUFjO1FBQzNELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNqRCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLEVBQUUsRUFBRSxDQUFDO2dCQUNMLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQy9CLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFlBQVksRUFBRSxDQUFDO29CQUNqRCxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsdUVBQXVFO2dCQUN2RSx5RUFBeUU7Z0JBQ3pFLHlFQUF5RTtnQkFDekUsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLHlFQUF5RTtnQkFDekUsd0VBQXdFO2dCQUN4RSxVQUFVO2dCQUNWLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEV2ZW50LCBlbnRpdHlFdmVudENsYXNzLCBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZXZlbnRzTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG4vKipcbiAqIERlbGF5IGJlZm9yZSBmaXJpbmcgdGhlIGRlZmVycmVkIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYWZ0ZXIgdGhlIHByb21pc2VcbiAqIHF1ZXVlIGhhcyBkcmFpbmVkLiBNdXN0IGJlIGxvbmcgZW5vdWdoIGZvciBjcm9zcy1WTSBtaWNyb3Rhc2sgY2hhaW5zIHRvXG4gKiBwcm9wYWdhdGUgKHJlc29sdmUgaW4gaG9zdCDihpIgd29ya2Zsb3cgY29kZSBpbiBWTSDihpIgc3Vic2NyaWJlIGNhbGwgYmFja1xuICogaW4gaG9zdCkuIEFueSBzdWJzY3JpYmUoKSBhcnJpdmluZyBkdXJpbmcgdGhpcyB3aW5kb3cgY2FuY2VscyB0aGUgY2hlY2suXG4gKi9cbmV4cG9ydCBjb25zdCBERUZFUlJFRF9DSEVDS19ERUxBWV9NUyA9IDEwMDtcblxuLyoqXG4gKiBGbG9vciBmb3IgdGhlIGRlZmVycmVkLWNoZWNrIGRlbGF5LCBzbyBhIHRvby1sb3cgb3ZlcnJpZGUgY2FuJ3QgbWFudWZhY3R1cmVcbiAqIHNwdXJpb3VzIGRpdmVyZ2VuY2UgKGVhY2ggZmFsc2UgcG9zaXRpdmUgYnVybnMgYSBkaXZlcmdlbmNlLXJlY292ZXJ5IHJldHJ5XG4gKiBhbmQgY2FuIGVzY2FsYXRlIHRvIGEgdGVybWluYWwgYENvcnJ1cHRlZEV2ZW50TG9nRXJyb3JgKS5cbiAqXG4gKiBFeHBvcnRlZCBzbyB0ZXN0cyBuZWVkaW5nIHRoZSBzaG9ydGVzdCBsZWdhbCBkZWxheSBjYW4gYXNrIGZvciBpdCBpbnN0ZWFkIG9mXG4gKiBoYXJkY29kaW5nIGEgbnVtYmVyIHRoaXMgZmxvb3Igd291bGQgc2lsZW50bHkgY2xhbXAgdXAuXG4gKi9cbmV4cG9ydCBjb25zdCBNSU5fREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMgPSAxMDtcblxuLyoqXG4gKiBFZmZlY3RpdmUgZGVmZXJyZWQtY2hlY2sgZGVsYXkuIE92ZXJyaWRlOiBgV09SS0ZMT1dfREVGRVJSRURfQ0hFQ0tfREVMQVlfTVNgLlxuICpcbiAqIFVubGlrZSB0aGUgb3RoZXIgdGltaW5nIGtub2JzIHRoaXMgaXMgbm90IGEgcG9sbGluZyBpbnRlcnZhbCBidXQgYVxuICogZGV0ZXJtaW5pc20gc2FmZXR5IG1hcmdpbjogZmlyaW5nIHRoZSB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGJlZm9yZSB0aGVcbiAqIGNyb3NzLVZNIHN1YnNjcmliZSgpIGNoYWluIGhhcyBsYW5kZWQgcmVqZWN0cyBhIGhlYWx0aHkgcnVuIHdpdGhcbiAqIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICovXG5jb25zdCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19ERUZFUlJFRF9DSEVDS19ERUxBWV9NUycsIERFRkVSUkVEX0NIRUNLX0RFTEFZX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IE1JTl9ERUZFUlJFRF9DSEVDS19ERUxBWV9NUyxcbiAgfSk7XG5cbi8qKlxuICogRXZlbnQgdHlwZXMgdGhlIG9yZGVyZWQgd2FsayBtYXkgc3RlcCBvdmVyIGFuZCBkZWxpdmVyIGxhdGVyLlxuICpcbiAqIE1lbWJlcnNoaXAgaXMgbm90IGFib3V0IHdobyB3cm90ZSB0aGUgZXZlbnQuIEl0IGlzIGFib3V0IHdoZXRoZXIgdGhlIGV2ZW50XG4gKiBjYW4gcmVhY2ggdGhlIGhlYWQgb2YgdGhlIHdhbGsgd2l0aCBub3RoaW5nIHJlZ2lzdGVyZWQgdG8gY29uc3VtZSBpdCwgd2hpY2hcbiAqIGlzIHRoZSBvbmx5IHNpdHVhdGlvbiBwYXJraW5nIGV4aXN0cyBmb3IuXG4gKlxuICogTW9zdCB0eXBlcyBjYW5ub3QuIFRoZXkgYXJlIHJlcGxheS1vcmlnaW46IGEgcmVwbGF5IGVtaXRzIHRoZW0sIGluIHRoZSBvcmRlclxuICogaXRzIGNvZGUgcmVhY2hlcyB0aGVtLCBzbyB0aGVpciBwb3NpdGlvbiBpbiB0aGUgbG9nIGlzIHRoZSByZWNvcmQgb2Ygd2hhdFxuICogdGhhdCByZXBsYXkgZGVjaWRlZC4gUmVhY2hpbmcgb25lIG9mIHRob3NlIG91dCBvZiBvcmRlciBtZWFucyB0aGlzIHJlcGxheVxuICogZGVjaWRlZCBkaWZmZXJlbnRseSB0aGFuIHRoZSBsb2cgaG9sZHMsIHdoaWNoIGlzIGRpdmVyZ2VuY2UgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBTdGVwIGxpZmVjeWNsZSBldmVudHMgYXJlIG5vdCByZXBsYXktb3JpZ2luLCBhbmQgYXJlIHN0aWxsIGFic2VudCwgYmVjYXVzZVxuICogdGhleSBhbHdheXMgaGF2ZSBhIGNsYWltYW50LiBgc3RlcCgpYCBzdWJzY3JpYmVzIGl0cyBjb25zdW1lciBiZWZvcmUgdGhlXG4gKiBzdGVwJ3MgZmlyc3QgZXZlbnQgY2FuIGV4aXN0OyBgc3RlcF9jcmVhdGVkYCBpcyBvcmRlcmVkLCBzbyB0aGUgd2FsayBjYW5ub3RcbiAqIHBhc3MgaXQgdW5sZXNzIGEgY29uc3VtZXIgdGFrZXMgaXQ7IGFuZCB0aGF0IGNvbnN1bWVyIHN0YXlzIHN1YnNjcmliZWQgdW50aWxcbiAqIGBzdGVwX2NvbXBsZXRlZGAgb3IgYHN0ZXBfZmFpbGVkYCwgYWZ0ZXIgd2hpY2ggdGhlIFdvcmxkIHJlZnVzZXMgYW55IGZ1cnRoZXJcbiAqIHdyaXRlIGZvciB0aGF0IHN0ZXAuIFRoZXJlIGlzIG5vIHdpbmRvdyBpbiB3aGljaCBhIHJlcGxheSBrbm93cyBhYm91dCBhIHN0ZXBcbiAqIGFuZCBoYXMgbm90aGluZyByZWdpc3RlcmVkIHRvIGNvbnN1bWUgaXRzIGV2ZW50cywgc28gcGFya2luZyB0aGVtIHdvdWxkIG9ubHlcbiAqIGRlZmVyIHJlcG9ydHMgb2Ygd2hhdCBpcyBkaXZlcmdlbmNlIGVpdGhlciB3YXkuIFRoZSBzYW1lIGhvbGRzIGZvclxuICogYHdhaXRfY3JlYXRlZGAgYW5kIGl0cyBjb25zdW1lci4gYHdhaXRfY29tcGxldGVkYCBpcyBsaXN0ZWQgYW55d2F5OiBhIHNsZWVwXG4gKiBjYW4gYWxzbyBiZSBjb21wbGV0ZWQgb3V0IG9mIGJhbmQsIGJ5IHRoZSBBUEkgdGhhdCBmb3JjZS1jb21wbGV0ZXMgcGVuZGluZ1xuICogd2FpdHMsIGFuZCB0b2xlcmF0aW5nIGEgc3RyYXkgb25lIGlzIHRoZSBjaGVhcGVyIGRpcmVjdGlvbiB0byBiZSB3cm9uZyBpbi5cbiAqXG4gKiBBbiBhbGxvd2xpc3QgcmF0aGVyIHRoYW4gdGhlIGNvbXBsZW1lbnQgb2YgdGhlIG9yZGVyZWQgc2V0LCBzbyBhIHR5cGUgdGhpc1xuICogZmlsZSBoYXMgbm90IGJlZW4gdGF1Z2h0IGFib3V0IGtlZXBzIHRoZSBzdHJpY3Qgb2xkIGJlaGF2aW91ci5cbiAqXG4gKiBgaG9va19kaXNwb3NlZGAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBkZXNwaXRlIGJlaW5nIGFib3V0IGEgaG9vazogaXQgaXNcbiAqIHdyaXR0ZW4gd2hlbiB0aGUgd29ya2Zsb3cncyBvd24gYHVzaW5nYCBzY29wZSBleGl0cywgc28gaXQgaXMgcmVwbGF5LW9yaWdpbi5cbiAqXG4gKiBgYXR0cl9zZXRgIGlzIGxpc3RlZCBieSB0eXBlIGV2ZW4gdGhvdWdoIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgaXQgbWF5IGJlXG4gKiByZXBsYXktb3JpZ2luLCBzaW5jZSBpdCBpcyByZXBsYXktb3JpZ2luIHdoZW4gaXRzIHdyaXRlciBpcyB0aGUgd29ya2Zsb3cuXG4gKiBTcGxpdHRpbmcgdGhhdCBvdXQgcGVyIGV2ZW50IHdhcyBjb25zaWRlcmVkIGFuZCByZWplY3RlZC4gQSByZXBsYXkgdGhhdFxuICogcmVhY2hlcyBvbmUgb2YgaXRzIG93biB3cml0ZXMgb3V0IG9mIHBvc2l0aW9uIGhhcyBkaXZlcmdlZCwgYnV0IGEgcmVwbGF5IHRoYXRcbiAqIHJlYWNoZXMgYW4gZXZlbnQgaXQgZGlkIE5PVCB3cml0ZSwgc2l0dGluZyB3aGVyZSBpdHMgb3duIHdyaXRlIHdvdWxkIGdvLCBoYXNcbiAqIG5vdDogdGhlIHdyaXRlciBmaWVsZCBzYXlzIHdobyB3cm90ZSB0aGUgZXZlbnQsIGFuZCBub3Qgd2hldGhlciB0aGlzIHJlcGxheVxuICogaXMgdGhlIHNhbWUgb25lLiBHdWVzc2luZyB3cm9uZyBpbiB0aGF0IGRpcmVjdGlvbiBmYWlscyBoZWFsdGh5IHJ1bnMsIHdoaWNoXG4gKiBpcyB0aGUgZmFpbHVyZSB0aGlzIGZpbGUgZXhpc3RzIHRvIHN0b3AsIHNvIHRoZSB3aG9sZSB0eXBlIGlzIHRvbGVyYXRlZC4gVGhlXG4gKiBjb3N0IGlzIHRoYXQgYSBkaXZlcmdlbmNlIGludm9sdmluZyBgYXR0cl9zZXRgIHN1cmZhY2VzIGF0IHRoZSBlbmQgb2YgdGhlXG4gKiByZXBsYXksIHRocm91Z2ggYHN0cmFuZGVkRXZlbnRgLCByYXRoZXIgdGhhbiBhdCB0aGUgb2ZmZW5kaW5nIGV2ZW50LlxuICovXG5jb25zdCBQQVJLQUJMRV9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnaG9va19yZWNlaXZlZCcsXG4gICdob29rX2NvbmZsaWN0JyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbiAgJ2F0dHJfc2V0JyxcbiAgJ3J1bl9jYW5jZWxsZWQnLFxuXSk7XG5cbi8qKlxuICogUGFya2FibGUgdHlwZXMgdGhhdCBjYW4gb25seSBldmVyIHJlc29sdmUgdGhlaXIgY29ycmVsYXRpb24gaWQgb25jZS5cbiAqXG4gKiBBIHNlY29uZCBvbmUgZm9yIHRoZSBzYW1lIGlkIGlzIG5vdCBhIGRlbGl2ZXJ5IHRoaXMgcmVwbGF5IGhhcyBub3QgcmVhY2hlZFxuICogeWV0OiBpdCBpcyBhIHJlc29sdXRpb24gZm9yIHNvbWV0aGluZyBhbHJlYWR5IHJlc29sdmVkLCB3aGljaCBubyBjb25zdW1lclxuICogdGhpcyByZXBsYXkgb3IgYW55IGxhdGVyIG9uZSByZWdpc3RlcnMgY2FuIGV2ZXIgY2xhaW0uIGBob29rX3JlY2VpdmVkYCBpc1xuICogYWJzZW50IGJlY2F1c2UgYSBob29rIGxlZ2l0aW1hdGVseSBmaXJlcyBtYW55IHRpbWVzIHVuZGVyIG9uZSBpZC5cbiAqXG4gKiBNdXN0IHN0YXkgYSBzdWJzZXQgb2Yge0BsaW5rIFBBUktBQkxFX0VWRU5UX1RZUEVTfToge0BsaW5rIHBhcmt9IGlzIHRoZSBvbmx5XG4gKiByZWFkZXIgb2Ygd2hhdCB0aGlzIHJlY29yZHMsIGFuZCBpdCByZWplY3RzIGEgbm9uLXBhcmthYmxlIHR5cGUgYmVmb3JlIGl0XG4gKiBsb29rcywgc28gYW4gZW50cnkgb3V0c2lkZSB0aGF0IHNldCBpcyBkZWFkIHdlaWdodCBvbiBhIGhvdCBwYXRoLlxuICovXG5jb25zdCBPTkVfU0hPVF9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAnd2FpdF9jb21wbGV0ZWQnLFxuXSk7XG5cbi8qKiBJZGVudGlmaWVzIHRoZSB0aGluZyBhIG9uZS1zaG90IHJlc29sdXRpb24gZXZlbnQgcmVzb2x2ZXMuICovXG5mdW5jdGlvbiByZXNvbHV0aW9uS2V5KGV2ZW50VHlwZTogc3RyaW5nLCBjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7ZXZlbnRUeXBlfToke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBUeXBlcyB0aGF0IGVuZCBhIHJ1bi4gT25jZSBvbmUgaXMgaW4gdGhlIGxvZywgbm8gY29uc3VtZXIgd2lsbCBldmVyIGJlXG4gKiByZWdpc3RlcmVkIGFnYWluLCBzbyBhIHBhcmtlZCBldmVudCBzdGlsbCBwYXJrZWQgaGVyZSB3aWxsIG5ldmVyIGJlIGNsYWltZWQuXG4gKi9cbmNvbnN0IFRFUk1JTkFMX0VWRU5UX1RZUEVTOiBSZWFkb25seVNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdydW5fY29tcGxldGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAncnVuX2NhbmNlbGxlZCcsXG5dKTtcblxuZXhwb3J0IGVudW0gRXZlbnRDb25zdW1lclJlc3VsdCB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGJ1dCBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICovXG4gIENvbnN1bWVkLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZGlkIG5vdCBjb25zdW1lIHRoZSBldmVudCwgc28gaXQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsYmFja1xuICAgKi9cbiAgTm90Q29uc3VtZWQsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBjb25zdW1lZCB0aGUgZXZlbnQsIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKi9cbiAgRmluaXNoZWQsXG59XG5cbnR5cGUgRXZlbnRDb25zdW1lckNhbGxiYWNrID0gKGV2ZW50OiBFdmVudCB8IG51bGwpID0+IEV2ZW50Q29uc3VtZXJSZXN1bHQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRzQ29uc3VtZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgYWZ0ZXIgYW4gZXZlbnQgaGFzIGJlZW4gY29uc3VtZWQuIENvbnN1bWVycyBzdWNoIGFzIHRoZVxuICAgKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IGNsb2NrIG11c3Qgbm90IG9ic2VydmUgZXZlbnRzIHRoYXQgYXJlIG1lcmVseVxuICAgKiBpbnNwZWN0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdXNlciBjb2RlIHRvIHN1YnNjcmliZSB0byB0aGUgbmV4dCBvcGVyYXRpb24uXG4gICAqL1xuICBvbkNvbnN1bWVkRXZlbnQ/OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgbm9uLW51bGwgZXZlbnQgY2Fubm90IGJlIGNvbnN1bWVkIGJ5IGFueSByZWdpc3RlcmVkXG4gICAqIGNhbGxiYWNrLCBpbmRpY2F0aW5nIGFuIG9ycGhhbmVkIG9yIGludmFsaWQgZXZlbnQgaW4gdGhlIGV2ZW50IGxvZy4gVGhlXG4gICAqIGNoZWNrIGlzIGRlZmVycmVkIHVudGlsIGFmdGVyIHRoZSBwcm9taXNlIHF1ZXVlIGhhcyBkcmFpbmVkLCBlbnN1cmluZyB0aGF0XG4gICAqIGFueSBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sIGRlc2VyaWFsaXphdGlvbi9kZWNyeXB0aW9uKSBjb21wbGV0ZXMgYW5kXG4gICAqIGRvd25zdHJlYW0gc3Vic2NyaWJlKCkgY2FsbHMgaGF2ZSBhIGNoYW5jZSB0byBjYW5jZWwgdGhlIGNoZWNrIGZpcnN0LlxuICAgKi9cbiAgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudDogRXZlbnQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gZXZlbnQgaXMgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcGVhdHMgYW4gZXZlbnRcbiAgICogY2xhc3MgdGhlIHdhbGsgYWxyZWFkeSBjb25zdW1lZCBmb3IgdGhlIHNhbWUgZW50aXR5LiBgZmlyc3RFdmVudFR5cGVgIGlzXG4gICAqIHRoZSB0eXBlIHRoYXQgcmVjb3JkZWQgdGhlIGNsYXNzLCB3aGljaCBpcyB0aGUgb25lIHRoZSB3b3JrZmxvdyBvYnNlcnZlZC5cbiAgICogRGlhZ25vc3RpY3Mgb25seTogc2tpcHBpbmcgaXMgYSBub3JtYWwgb3V0Y29tZSwgbm90IGFuIGVycm9yIOKAlCB0aG91Z2ggYVxuICAgKiBgZmlyc3RFdmVudFR5cGVgIGRpZmZlcmluZyBmcm9tIGBldmVudC5ldmVudFR5cGVgIHNheXMgdGhlIHR3byB3cml0ZXJzXG4gICAqIGRlY2lkZWQgdGhlIGVudGl0eSdzIG91dGNvbWUgZGlmZmVyZW50bHksIHdoaWNoIGlzIHdvcnRoIG1vcmUgdGhhbiBhblxuICAgKiBpbmZvIGxvZy5cbiAgICovXG4gIG9uRHVwbGljYXRlRXZlbnQ/OiAoZXZlbnQ6IEV2ZW50LCBmaXJzdEV2ZW50VHlwZTogRXZlbnRbJ2V2ZW50VHlwZSddKSA9PiB2b2lkO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9taXNlIHF1ZXVlLiBUaGUgdW5jb25zdW1lZCBldmVudCBjaGVjayBpcyBjaGFpbmVkXG4gICAqIG9udG8gdGhpcyBxdWV1ZSBzbyBpdCBvbmx5IGZpcmVzIGFmdGVyIGFsbCBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sXG4gICAqIGRlc2VyaWFsaXphdGlvbikgaGFzIGNvbXBsZXRlZC4gVGhpcyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgd2hlbiBhc3luY1xuICAgKiBkZXNlcmlhbGl6YXRpb24gZGVsYXlzIHRoZSByZXNvbHZlKCkgdGhhdCB0cmlnZ2VycyB0aGUgbmV4dCBzdWJzY3JpYmUoKS5cbiAgICovXG4gIGdldFByb21pc2VRdWV1ZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgbm8gZGF0YSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQgKGBpc0RlbGl2ZXJ5SWRsZWAgaW4gcHJpdmF0ZS50cykuXG4gICAqIFRoZSB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIHdhaXRzIGZvciB0aGlzIGJlZm9yZSBpdCBmaXJlczogYSBkZWxpdmVyeSBpblxuICAgKiBmbGlnaHQgbWVhbnMgdGhlIHdvcmtmbG93IFZNIGlzIG1pZC1yZWFjdGlvbiwgYW5kIGFuIGV2ZW50IGl0IGhhcyBub3RcbiAgICogY2xhaW1lZCB5ZXQgaXMgYW4gZXZlbnQgaXQgaGFzIG5vdCByZWFjaGVkIHlldC5cbiAgICpcbiAgICogUmVxdWlyZWQgcmF0aGVyIHRoYW4gZGVmYXVsdGluZyB0byBhbHdheXMtaWRsZTogYWx3YXlzLWlkbGUgaXMgZXhhY3RseSB0aGVcbiAgICogcHJlLWdhdGUgYmVoYXZpb3VyLCBzbyBhIGRlZmF1bHRlZCBvcHRpb24gd291bGQgbGV0IGEgY29uc3RydWN0aW9uIHNpdGUgb3B0XG4gICAqIGEgd2hvbGUgcmVwbGF5IHBhdGggYmFjayBvdXQgd2l0aG91dCBzYXlpbmcgc28uIFRlc3RzIHRoYXQgZHJpdmUgYSBjb25zdW1lclxuICAgKiB3aXRoIG5vIG9yY2hlc3RyYXRvciBjb250ZXh0IHBhc3MgYCgpID0+IHRydWVgIHRvIGtlZXAgdGhlIHByZS1leGlzdGluZ1xuICAgKiB0aW1pbmcsIGFuZCBzYXkgc28gYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICovXG4gIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29uc3VtZXIge1xuICBldmVudEluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgY2FsbGJhY2tzOiBFdmVudENvbnN1bWVyQ2FsbGJhY2tbXSA9IFtdO1xuICAvKipcbiAgICogRXZlbnRzIHRoZSBvcmRlcmVkIHdhbGsgc3RlcHBlZCBvdmVyIGJlY2F1c2Ugbm9ib2R5IGNsYWltZWQgdGhlbSBhbmQgdGhlaXJcbiAgICogdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLiBFYWNoIGtlZXBzIHRoZSBpbmRleCBpdCBoZWxkIGluIHRoZSBsb2c6XG4gICAqIGNvbnN1bWVycyByZWFkIHtAbGluayBldmVudEluZGV4fSBhdCBjb25zdW1wdGlvbiB0aW1lIHRvIG9yZGVyIHRoZWlyXG4gICAqIGRlbGl2ZXJ5IGFnYWluc3QgdGhlIHJlc3Qgb2YgdGhlIGxvZywgYW5kIGEgbGF0ZSBkZWxpdmVyeSBtdXN0IHN0aWxsIG1ha2VcbiAgICogdGhlIGNsYWltIGl0cyBwb3NpdGlvbiBnYXZlIGl0LlxuICAgKlxuICAgKiBIZWxkIGluIGxvZyBvcmRlciwgZHJhaW5lZCBpbiBsb2cgb3JkZXIsIGFuZCBkcmFpbmVkIGJlZm9yZSBldmVyeSBvZmZlciBzb1xuICAgKiBhIGNvbnN1bWVyIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIHdhbGsgcGFzc2VkIHRoZSBldmVudCBzdGlsbCByZWNlaXZlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFya2VkOiB7IGV2ZW50OiBFdmVudDsgaW5kZXg6IG51bWJlciB9W10gPSBbXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUge0BsaW5rIE9ORV9TSE9UX0VWRU5UX1RZUEVTfSBldmVudHMgY29uc3VtZWQgc29cbiAgICogZmFyLCBzbyBhIHNlY29uZCByZXNvbHV0aW9uIGZvciBvbmUgb2YgdGhlbSBpcyByZWNvZ25pemVkIGFzIHVuY2xhaW1hYmxlXG4gICAqIHJhdGhlciB0aGFuIHBhcmtlZCBmb3IgYSBjb25zdW1lciB0aGF0IGNhbm5vdCBleGlzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGA8Y2xhc3M+Ojxjb3JyZWxhdGlvbklkPmAgZm9yIGV2ZXJ5IGV2ZW50IGNsYXNzIHRoZSB3YWxrIGhhcyBhbHJlYWR5XG4gICAqIGNvbnN1bWVkLCBtYXBwZWQgdG8gdGhlIGV2ZW50IHR5cGUgdGhhdCByZWNvcmRlZCBpdC4gVGhlIHR5cGUgaXMga2VwdCBzbyBhXG4gICAqIHJlcGVhdCB0aGF0IGRlY2lkZWQgdGhlIHNhbWUgY2xhc3MgKmRpZmZlcmVudGx5KiAoYSBgc3RlcF9mYWlsZWRgIGJlaGluZCBhXG4gICAqIGBzdGVwX2NvbXBsZXRlZGApIGNhbiBiZSByZXBvcnRlZCBhcyBtb3JlIHRoYW4gYSByZS1jb21taXQuIFNlZVxuICAgKiB7QGxpbmsgRXZlbnRzQ29uc3VtZXIuZmlyc3RFdmVudFR5cGVPZkNsYXNzfS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VlbkV2ZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFsnZXZlbnRUeXBlJ10+KCk7XG4gIHByaXZhdGUgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvbkR1cGxpY2F0ZUV2ZW50PzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHBlbmRpbmdVbmNvbnN1bWVkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdW5jb25zdW1lZENoZWNrVmVyc2lvbiA9IDA7XG5cbiAgY29uc3RydWN0b3IoZXZlbnRzOiBFdmVudFtdLCBvcHRpb25zOiBFdmVudHNDb25zdW1lck9wdGlvbnMpIHtcbiAgICAvLyBPd24gY29weTogdGhlIHJ1bnRpbWUgbXV0YXRlcyBpdHMgZXZlbnQgYXJyYXkgaW4gcGxhY2UsIGFuZCBhIHJldGFpbmVkXG4gICAgLy8gc2Vzc2lvbiBtdXN0IG9ubHkgb2JzZXJ2ZSBuZXcgZXZlbnRzIHRocm91Z2ggYXBwZW5kKCkgc28gcmVzdW1lKCknc1xuICAgIC8vIHN0cmljdC1leHRlbnNpb24gY2hlY2sgc3RheXMgbWVhbmluZ2Z1bC5cbiAgICB0aGlzLmV2ZW50cyA9IFsuLi5ldmVudHNdO1xuICAgIHRoaXMuZXZlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQgPSBvcHRpb25zLm9uQ29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vblVuY29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uRHVwbGljYXRlRXZlbnQgPSBvcHRpb25zLm9uRHVwbGljYXRlRXZlbnQ7XG4gICAgdGhpcy5nZXRQcm9taXNlUXVldWUgPSBvcHRpb25zLmdldFByb21pc2VRdWV1ZTtcbiAgICB0aGlzLmlzRGVsaXZlcnlJZGxlID0gb3B0aW9ucy5pc0RlbGl2ZXJ5SWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IGV2ZW50IHRoZSB3YWxrIHN0ZXBwZWQgb3ZlciB0aGF0IG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldCxcbiAgICogaWYgYW55LiBQYXJraW5nIGlzIGEgYmV0IHRoYXQgYSBjb25zdW1lciB3aWxsIGJlIHJlZ2lzdGVyZWQgbGF0ZXIsIHNvIGF0XG4gICAqIGFueSBwb2ludCB3aGVyZSBubyBjb25zdW1lciBldmVyIHdpbGwgYmUgYWdhaW4g4oCUIHRoZSByZXBsYXkgZmluaXNoaW5nIGlzXG4gICAqIHRoZSBkZWZpbml0aXZlIG9uZSDigJQgdGhpcyBhbnN3ZXJzIHdoaWNoIGV2ZW50IHRoZSBiZXQgbG9zdCBvbi5cbiAgICovXG4gIGdldCBzdHJhbmRlZEV2ZW50KCk6IEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJrZWRbMF0/LmV2ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHdhbGsgaXMgc3RpbGwgaG9sZGluZywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBob2xkcyBub3RoaW5nLlxuICAgKlxuICAgKiBSZWFkIGF0IGV2ZXJ5IHBvaW50IGEgcmVwbGF5IHN0b3BzLCBpbmNsdWRpbmcgdGhlIHN1c3BlbnNpb25zIHRoYXQgYXJlIG5vdFxuICAgKiBzZXR0bGluZyBwb2ludHMsIHNvIHRoZSBoZWxkIHN0YXRlIHJlYWNoZXMgdGVsZW1ldHJ5LiBBIHJlcGxheSBjYW5ub3QgdGVsbFxuICAgKiBhIGRlbGl2ZXJ5IGF3YWl0aW5nIGEgbGF0ZXIgY29uc3VtZXIgZnJvbSBvbmUgbm8gY29uc3VtZXIgd2lsbCBldmVyXG4gICAqIHJlZ2lzdGVyLCBzbyBpdCByZXBvcnRzIHJhdGhlciB0aGFuIGRlY2lkZXM6IHRoZSBzYW1lIGBldmVudElkYCByZXBvcnRlZCBvblxuICAgKiBzdXNwZW5zaW9uIGFmdGVyIHN1c3BlbnNpb24gb2Ygb25lIHJ1biBpcyB0aGUgc2hhcGUgdGhhdCBzYXlzIHRoZSBiZXRcbiAgICogcGFya2luZyBtYWRlIGlzIG5vdCBnb2luZyB0byBwYXkgb2ZmLCBhbmQgdGhhdCBzaGFwZSBpcyBvbmx5IHZpc2libGUgYWNyb3NzXG4gICAqIHJlcGxheXMuXG4gICAqL1xuICBnZXQgcGFya2VkU3VtbWFyeSgpOlxuICAgIHwgeyBjb3VudDogbnVtYmVyOyBldmVudElkOiBzdHJpbmc7IGV2ZW50VHlwZTogRXZlbnRbJ2V2ZW50VHlwZSddIH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5wYXJrZWRbMF0/LmV2ZW50O1xuICAgIGlmICghb2xkZXN0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY291bnQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICAgIGV2ZW50SWQ6IG9sZGVzdC5ldmVudElkLFxuICAgICAgZXZlbnRUeXBlOiBvbGRlc3QuZXZlbnRUeXBlLFxuICAgIH07XG4gIH1cblxuICBhcHBlbmQoZXZlbnRzOiBFdmVudFtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHRoaXMuZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgIHByb2Nlc3MubmV4dFRpY2sodGhpcy5jb25zdW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYWZ0ZXIgYW4gZXZlbnQgaGFzIGJlZW4gY29uc3VtZWRcbiAgICogYnkgYSBkaWZmZXJlbnQgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBjYW4gcmV0dXJuOlxuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZGAgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY29uc3VtZWQgYW5kIHdpbGwgbm90IGJlIHBhc3NlZCB0byBhbnkgb3RoZXIgY2FsbGJhY2ssIGJ1dCB0aGUgY2FsbGJhY2sgd2lsbCByZW1haW4gaW4gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkYCB0aGUgZXZlbnQgaXMgcGFzc2VkIHRvIHRoZSBuZXh0IGNhbGxiYWNrXG4gICAqICAtIGBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkYCB0aGUgZXZlbnQgaXMgY29uc2lkZXJlZCBjb25zdW1lZCBhbmQgdGhlIGNhbGxiYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIGZuIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgc3Vic2NyaWJlKGZuOiBFdmVudENvbnN1bWVyQ2FsbGJhY2spIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZuKTtcbiAgICAvLyBDYW5jZWwgYW55IHBlbmRpbmcgdW5jb25zdW1lZCBjaGVjayBzaW5jZSBhIG5ldyBjYWxsYmFjayBtYXkgY29uc3VtZSB0aGUgZXZlbnQuXG4gICAgLy8gSW5jcmVtZW50aW5nIHRoZSB2ZXJzaW9uIGNhdXNlcyBhbnkgaW4tZmxpZ2h0IHByb21pc2UgY2hhaW4gY2hlY2sgdG8gbm8tb3AuXG4gICAgLy8gQWxzbyBjbGVhciB0aGUgcGVuZGluZyBzZXRUaW1lb3V0IGlmIGl0IGhhc24ndCBmaXJlZCB5ZXQuXG4gICAgaWYgKHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51bmNvbnN1bWVkQ2hlY2tWZXJzaW9uKys7XG4gICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSBudWxsO1xuICAgICAgaWYgKHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCk7XG4gICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzcy5uZXh0VGljayh0aGlzLmNvbnN1bWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlDb25zdW1lZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5vbkNvbnN1bWVkRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25zdW1lZEV2ZW50KGV2ZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXZlbnRzTG9nZ2VyLmVycm9yKCdvbkNvbnN1bWVkRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lID0gKCkgPT4ge1xuICAgIC8vIERyYWluIGNvbnNlY3V0aXZlbHkgY29uc3VtYWJsZSBldmVudHMgc3luY2hyb25vdXNseSB3aXRoaW4gYSBzaW5nbGVcbiAgICAvLyBwYXNzIGluc3RlYWQgb2YgcGF5aW5nIG9uZSBgcHJvY2Vzcy5uZXh0VGlja2AgcGVyIGNvbnN1bWVkIGV2ZW50LlxuICAgIC8vXG4gICAgLy8gV2h5IHRoaXMgaXMgc2FmZTogYSBjYWxsYmFjayBvbmx5IGNvbnN1bWVzIGFuIGV2ZW50IHVzaW5nIGEgY29uc3VtZXJcbiAgICAvLyB0aGF0IGlzIEFMUkVBRFkgcmVnaXN0ZXJlZCAoZS5nLiBhIGxvbmctbGl2ZWQgc3RlcCBjb25zdW1lciB3YWxraW5nXG4gICAgLy8gYHN0ZXBfY3JlYXRlZGAg4oaSIGBzdGVwX3N0YXJ0ZWRgIOKGkiBgc3RlcF9jb21wbGV0ZWRgLCBvciB0aGUgc3RydWN0dXJhbFxuICAgIC8vIGxpZmVjeWNsZSBjb25zdW1lcikuIE5ldyBjb25zdW1lcnMgYXJlIG9ubHkgZXZlciByZWdpc3RlcmVkIGJ5IHdvcmtmbG93XG4gICAgLy8gVk0gYm9keSBjb2RlIHRoYXQgcnVucyBhc3luY2hyb25vdXNseSBvZmYgYGN0eC5wcm9taXNlUXVldWVgIGFmdGVyIGFcbiAgICAvLyBkZWxpdmVyeSBgcmVzb2x2ZSgpYDsgbm9uZSBvZiB0aGUgY2FsbGJhY2tzIGhlcmUgY2FsbCBgc3Vic2NyaWJlKClgXG4gICAgLy8gc3luY2hyb25vdXNseS4gU28gd2l0aGluIG9uZSBwYXNzIGB0aGlzLmNhbGxiYWNrc2AgaXMgbXV0YXRlZCBvbmx5IGJ5XG4gICAgLy8gdGhpcyBsb29wICh0aGUgYEZpbmlzaGVkYCBzcGxpY2UpLCBhbmQgdGhlIG5leHQgZXZlbnQncyBjb25zdW1lciBpc1xuICAgIC8vIGVpdGhlciBhbHJlYWR5IHByZXNlbnQgKGFkdmFuY2Ugbm93KSBvciBub3QgeWV0IHJlZ2lzdGVyZWQg4oCUIGluIHdoaWNoXG4gICAgLy8gY2FzZSBubyBjYWxsYmFjayBjb25zdW1lcyB0aGUgZXZlbnQgYW5kIHdlIGZhbGwgdGhyb3VnaCB0byB0aGVcbiAgICAvLyBjcm9zcy1WTS1zYWZlIGRlZmVycmVkIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYmVsb3csIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBCZWZvcmUgZXZlcnkgb2ZmZXIsIG5vdCBqdXN0IG9uIHN1YnNjcmliZTogYSBjYWxsYmFjayByZWdpc3RlcmVkIGJ5XG4gICAgICAvLyB0aGUgd29yayB0aGlzIHNhbWUgcGFzcyBraWNrZWQgb2ZmIG1heSBiZSB0aGUgb3duZXIgb2Ygc29tZXRoaW5nXG4gICAgICAvLyBwYXJrZWQsIGFuZCB0aGUgcGFya2VkIGV2ZW50J3MgZGVsaXZlcnkgaXMgb3JkZXJlZCBhaGVhZCBvZiB0aGUgaGVhZFxuICAgICAgLy8gZXZlbnQncyBieSB0aGUgaW5kZXggaXQgaG9sZHMuXG4gICAgICB0aGlzLmRyYWluUGFya2VkKCk7XG4gICAgICBjb25zdCBjdXJyZW50RXZlbnQgPSB0aGlzLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhdID8/IG51bGw7XG4gICAgICBjb25zdCBjb25zdW1lZCA9IHRoaXMub2ZmZXIoY3VycmVudEV2ZW50KTtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRW5kIG9mIGxvZy4gQ29uc3VtZXJzIHJldHVybiBOb3RDb25zdW1lZCBmb3IgdGhlIGBudWxsYCBzZW50aW5lbFxuICAgICAgICAvLyAodGhlIG9uZSB0aGF0IHJlY29nbml6ZXMgaXQgYXMgaXRzIG93biBib3VuZGFyeSBzY2hlZHVsZXMgdGhlXG4gICAgICAgIC8vIHN1c3BlbnNpb24gYXMgYSBzaWRlIGVmZmVjdCBhbmQgc3RpbGwgZGVjbGluZXMgaXQpLCBzbyB0aGUgZHJhaW5cbiAgICAgICAgLy8gc3RvcHMgaGVyZSByYXRoZXIgdGhhbiBzcGlubmluZyBwYXN0IHRoZSBlbmQuIGBjb25zdW1lZGAgaXMgb25seVxuICAgICAgICAvLyB0cnVlIGZvciBhIGNhbGxiYWNrIHRoYXQgY2xhaW1zIHRoZSBzZW50aW5lbCBvdXRyaWdodCwgd2hpY2ggbm9cbiAgICAgICAgLy8gcHJvZHVjdGlvbiBjb25zdW1lciBkb2VzLlxuICAgICAgICBpZiAoIWNvbnN1bWVkKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmRPZkxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY29uc3VtZWQpIHtcbiAgICAgICAgLy8gTm9ib2R5IHdhbnRlZCBpdC4gSWYgaXQgcmVwZWF0cyBhIGNsYXNzIHRoaXMgd2FsayBhbHJlYWR5IGNvbnN1bWVkXG4gICAgICAgIC8vIGZvciB0aGUgc2FtZSBlbnRpdHkgaXQgaXMgYSBzdHJhZ2dsZXIgZnJvbSBhIGNvbmN1cnJlbnQgcmVwbGF5OlxuICAgICAgICAvLyBzdGVwIG92ZXIgaXQgaW4gdGhpcyBwYXNzIHJhdGhlciB0aGFuIHBheWluZyB0aGUgZGVmZXJyZWQgd2luZG93IGZvclxuICAgICAgICAvLyBhIGNvbnN1bWVyIHRoYXQgY2Fubm90IGNvbWUgKHNlZSBgZmlyc3RFdmVudFR5cGVPZkNsYXNzYCkuXG4gICAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHRoaXMuZmlyc3RFdmVudFR5cGVPZkNsYXNzKGN1cnJlbnRFdmVudCk7XG4gICAgICAgIGlmIChmaXJzdFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuc2tpcER1cGxpY2F0ZUV2ZW50KGN1cnJlbnRFdmVudCwgZmlyc3RUeXBlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVhbCBldmVudCB3YXMgY29uc3VtZWQg4oCUIGFkdmFuY2UgdG8gdGhlIG5leHQgaW4gdGhlIHNhbWUgcGFzcy5cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE9mZmVyIGBjdXJyZW50RXZlbnRgIHRvIGVhY2ggcmVnaXN0ZXJlZCBjYWxsYmFjayBpbiB0dXJuLiBSZXR1cm5zIHRydWVcbiAgICogd2hlbiBhIGNhbGxiYWNrIGNvbnN1bWVkIGl0LiBEb2VzIG5vdCBtb3ZlIHtAbGluayBldmVudEluZGV4fTogdGhlIG9yZGVyZWRcbiAgICogd2FsayBhbmQgdGhlIHBhcmtlZCBkcmFpbiBhZHZhbmNlIGRpZmZlcmVudGx5LCBzbyBlYWNoIGRvZXMgaXRzIG93bi5cbiAgICovXG4gIHByaXZhdGUgb2ZmZXIoY3VycmVudEV2ZW50OiBFdmVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2ldO1xuICAgICAgbGV0IGhhbmRsZWQgPSBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlZCA9IGNhbGxiYWNrKGN1cnJlbnRFdmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ0V2ZW50Q29uc3VtZXIgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBoYW5kbGVkICE9PSBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkICYmXG4gICAgICAgIGhhbmRsZWQgIT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRFdmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgT05FX1NIT1RfRVZFTlRfVFlQRVMuaGFzKGN1cnJlbnRFdmVudC5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWQuYWRkKFxuICAgICAgICAgICAgcmVzb2x1dGlvbktleShjdXJyZW50RXZlbnQuZXZlbnRUeXBlLCBjdXJyZW50RXZlbnQuY29ycmVsYXRpb25JZClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVjb3JkRXZlbnRDbGFzcyhjdXJyZW50RXZlbnQpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGUgY2FsbGJhY2sgaWYgaXQgaGFzIGZpbmlzaGVkXG4gICAgICBpZiAoaGFuZGxlZCA9PT0gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZmVyIGV2ZXJ5dGhpbmcgcGFya2VkLCBvbGRlc3QgZmlyc3QsIHVudGlsIGEgcGFzcyBjbGFpbXMgbm90aGluZy5cbiAgICpcbiAgICogRWFjaCBvZmZlciBydW5zIHdpdGgge0BsaW5rIGV2ZW50SW5kZXh9IG1vdmVkIGJhY2sgdG8gdGhlIHBvc2l0aW9uIHRoZVxuICAgKiBwYXJrZWQgZXZlbnQgaGVsZCBpbiB0aGUgbG9nLCBiZWNhdXNlIHRoYXQgaXMgdGhlIHBvc2l0aW9uIGl0cyBjb25zdW1lclxuICAgKiB3aWxsIHJlZ2lzdGVyIGEgZGVsaXZlcnkgYmFycmllciB1bmRlci4gUmVzdG9yaW5nIHRoZSB3YWxrIHBvaW50ZXJcbiAgICogYWZ0ZXJ3YXJkcyBpcyB3aGF0IGtlZXBzIHRoZSB0d28gcG9pbnRlcnMgZnJvbSBpbnRlcmZlcmluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhaW5QYXJrZWQoKTogdm9pZCB7XG4gICAgbGV0IHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgIHdoaWxlIChwcm9ncmVzc2VkKSB7XG4gICAgICBwcm9ncmVzc2VkID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFya2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5wYXJrZWRbaV07XG4gICAgICAgIGNvbnN0IHdhbGtJbmRleCA9IHRoaXMuZXZlbnRJbmRleDtcbiAgICAgICAgdGhpcy5ldmVudEluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgIGxldCBjb25zdW1lZDogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdW1lZCA9IHRoaXMub2ZmZXIoZW50cnkuZXZlbnQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuZXZlbnRJbmRleCA9IHdhbGtJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgLy8gQSBgRmluaXNoZWRgIGNhbGxiYWNrIHdhcyBzcGxpY2VkIG91dCBvZiB0aGUgbGlzdCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgLy8gcmVzdGFydCByYXRoZXIgdGhhbiBrZWVwIHdhbGtpbmcgYSBtdXRhdGVkIGFycmF5LlxuICAgICAgICAgIHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdGhlIG9yZGVyZWQgd2FsayBvdmVyIGFuIGV2ZW50IG5vYm9keSBjbGFpbWVkLCBob2xkaW5nIG9uIHRvIGl0IGZvciBhXG4gICAqIGxhdGVyIGNvbnN1bWVyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIGV2ZW50J3MgdHlwZSBtYWtlcyBpdHMgcG9zaXRpb24gYVxuICAgKiBkZWNpc2lvbiByZWNvcmQsIHdoaWNoIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSBub2JvZHkgY2xhaW1pbmcgaXQgbWVhbnMgdGhlXG4gICAqIHJlcGxheSBkaXZlcmdlZC5cbiAgICovXG4gIHByaXZhdGUgcGFyayhldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIVBBUktBQkxFX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgIHRoaXMucmVzb2x2ZWQuaGFzKHJlc29sdXRpb25LZXkoZXZlbnQuZXZlbnRUeXBlLCBldmVudC5jb3JyZWxhdGlvbklkKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXJrZWQucHVzaCh7IGV2ZW50LCBpbmRleDogdGhpcy5ldmVudEluZGV4IH0pO1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUGFya2VkIGFuIHVuY2xhaW1lZCBldmVudCBmb3IgbGF0ZXIgZGVsaXZlcnknLCB7XG4gICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleSBgZXZlbnRgJ3MgY2xhc3MgaXMgdHJhY2tlZCB1bmRlciwgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZSBldmVudFxuICAgKiB0eXBlcyB0aGF0IGJlbG9uZyB0byBubyBjbGFzcyAoYGhvb2tfcmVjZWl2ZWRgLCBgaG9va19jb25mbGljdGAsXG4gICAqIGBhdHRyX3NldGAsIGBydW5fY3JlYXRlZGApIGFuZCBhcmUgdGhlcmVmb3JlIG5ldmVyIHNraXBwZWQuXG4gICAqXG4gICAqIFJ1biBldmVudHMgY2Fycnkgbm8gY29ycmVsYXRpb24gaWQuIFRoZXkgYXJlIGNsYXNzZXMgb2YgdGhlIHJ1biBpdHNlbGYsIHNvXG4gICAqIHRoZXkgYWxsIGtleSBvZmYgdGhlIHNhbWUgYnVja2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBldmVudENsYXNzS2V5KGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBgJHtldmVudENsYXNzfToke2V2ZW50LmNvcnJlbGF0aW9uSWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlcnMgdGhhdCBgZXZlbnRgJ3MgY2xhc3MgaXMgbm93IGRlY2lkZWQgZm9yIGl0cyBlbnRpdHksIGlmIHRoZSB0eXBlXG4gICAqIGJlbG9uZ3MgdG8gYSBjbGFzcy4gRmlyc3Qgd3JpdGVyIHdpbnM6IHRoZSByZWNvcmRlZCB0eXBlIGlzIHRoZSBvbmUgdGhlXG4gICAqIHdvcmtmbG93IG9ic2VydmVkLCBhbmQgYSBsYXRlciByZXBlYXQgaXMgbWVhc3VyZWQgYWdhaW5zdCBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRXZlbnRDbGFzcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmV2ZW50Q2xhc3NLZXkoZXZlbnQpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnNlZW5FdmVudENsYXNzZXMuc2V0KGtleSwgZXZlbnQuZXZlbnRUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgdGhhdCBhbHJlYWR5IGRlY2lkZWQgYGV2ZW50YCdzIGNsYXNzIGZvciB0aGUgc2FtZSBlbnRpdHksIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gbm90aGluZyBoYXM6IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIGZvciBvbmUgc3RlcCwgYVxuICAgKiBzZWNvbmQgdGVybWluYWwgb3V0Y29tZSwgYSBzZWNvbmQgYHN0ZXBfc3RhcnRlZGAgYWZ0ZXIgdGhlIHN0ZXAncyByZXN1bHQgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgbG9nLlxuICAgKlxuICAgKiBTdWNoIGFuIGV2ZW50IGlzIGNvbW1pdHRlZCBidXQgaW5lcnQuIENvbmN1cnJlbnQgcmVwbGF5cyB3cml0ZSBpbnRvIG9uZVxuICAgKiBsb2cgd2l0aG91dCBhIGN1cnJlbmN5IGd1YXJkLCBzbyBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBwcmVmaXggdGhhdFxuICAgKiBwcmVkYXRlcyBhbm90aGVyIHJlcGxheSdzIHdyaXRlIGNhbiBjb21taXQgaXRzIG93biBjb3B5IG9mIHdvcmsgdGhlIGxvZ1xuICAgKiBhbHJlYWR5IHJlY29yZHMuIFRoYXQgY29weSBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVkOiB0aGVcbiAgICogb3V0Y29tZSB3YXMgZGVjaWRlZCBieSB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIGNsYXNzIGFuZCBldmVyeSBsYXRlciByZXBsYXlcbiAgICogcmVhZHMgdGhhdCBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIGxvZyBwb3NpdGlvbiwgc28gaWdub3JpbmcgdGhlIHN0cmFnZ2xlclxuICAgKiBpcyBkZXRlcm1pbmlzdGljIGFjcm9zcyByZXBsYXlzLlxuICAgKlxuICAgKiBDbGFzc2VzIGFyZSB0cmFja2VkIHNlcGFyYXRlbHksIHNvIHBhc3Npbmcgb25lIGRvZXMgbm90IHN1cHByZXNzIGFub3RoZXIuXG4gICAqIEEgc3RlcCB3aG9zZSByZXN1bHQgaXMgaW4gdGhlIGxvZyBzdGlsbCByZWFjaGVzIGl0cyBgc3RlcF9jcmVhdGVkYCBhbmRcbiAgICogYHN0ZXBfc3RhcnRlZGAgY29uc3VtZXJzIGlmIGl0IGhhcyB5ZXQgdG8gc2VlIHRob3NlIGNsYXNzZXMuXG4gICAqXG4gICAqIENvbnN1bHRlZCBvbmx5IGFmdGVyIGV2ZXJ5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIHRoZSBldmVudCwgc29cbiAgICogaXQgY2FuIG5ldmVyIHRha2UgYW4gZXZlbnQgYSBjb25zdW1lciB3YW50ZWQuIEEgcmV0cnkncyBgc3RlcF9zdGFydGVkYCBpc1xuICAgKiBjbGFpbWVkIGJ5IHRoZSBzdGVwJ3MgbGl2ZSBjb25zdW1lciBhbmQgY291bnRzIGFzIGFuIGF0dGVtcHQgZXhhY3RseSBhc1xuICAgKiBiZWZvcmUsIGFuZCBhIHNlY29uZCBgc3RlcF9jcmVhdGVkYCByZWFjaGluZyBhIHN0ZXAgdGhhdCBoYXMgbm90IGZpbmlzaGVkXG4gICAqIGlzIGxpa2V3aXNlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHNraXBwZWQ7IG9ubHkgdGhlIGNvcGllcyBub2JvZHkgY2xhaW1zIGFyZVxuICAgKiBza2lwcGVkLlxuICAgKlxuICAgKiBVbmxpa2UgdGhlIGRpdmVyZ2VuY2UgcmVwb3J0LCB0aGlzIGRvZXMgKm5vdCogd2FpdCBvdXQgdGhlIGRlZmVycmVkIHdpbmRvd1xuICAgKiBmaXJzdCwgYW5kIGl0IGRvZXMgbm90IG5lZWQgdG8uIFRoZSB3aW5kb3cgYnV5cyB0aW1lIGZvciBhIGNvbnN1bWVyIHRoYXRcbiAgICogaGFzIHlldCB0byByZWdpc3RlciwgYW5kIG5vIHN1Y2ggY29uc3VtZXIgY2FuIHdhbnQgdGhpcyBldmVudDogdGhlIGNsYXNzXG4gICAqIHdhcyByZWNvcmRlZCBieSBhIGNvbnN1bXB0aW9uIGluIHRoaXMgc2FtZSByZXBsYXksIHdoaWNoIG1lYW5zIHRoZSBlbnRpdHknc1xuICAgKiBjb25zdW1lciB3YXMgcmVnaXN0ZXJlZCBhbmQgdG9vayBhbiBldmVudCBvZiB0aGlzIGNsYXNzLCBhbmQgY29ycmVsYXRpb25cbiAgICogaWRzIGFyZSBtaW50ZWQgZnJvbSBhIG1vbm90b25pYyBVTElEIHBlciBib2R5IHBvc2l0aW9uLCBzbyBub3RoaW5nIGxhdGVyIGluXG4gICAqIHRoZSBib2R5IHJlZ2lzdGVycyBhIHNlY29uZCBjb25zdW1lciB1bmRlciB0aGlzIGlkLiBXYWl0aW5nIHdvdWxkIGNvc3RcbiAgICogYGdldERlZmVycmVkQ2hlY2tEZWxheU1zKClgIHBlciBzdHJhZ2dsZXIgcGVyIHJlcGxheSBmb3IgaW5mb3JtYXRpb24gdGhhdFxuICAgKiBjYW5ub3QgYXJyaXZlIOKAlCAwLjc1JSBvZiBwcm9kdWN0aW9uIHJ1bnMgY2FycnkgYXQgbGVhc3Qgb25lIHN0cmFnZ2xlciwgYW5kXG4gICAqIHRoZSBwOTkgYW1vbmcgdGhvc2UgY2FycmllcyAxNTUuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdG8gcHJlc2VydmUgaWYgaG9vayBpZGVudGl0eSBldmVyIGJlY29tZXMgY2FsbGVyLXN1cHBsaWVkXG4gICAqIChhbiBpZGVtcG90ZW5jeSBrZXkgcmF0aGVyIHRoYW4gYSBtaW50ZWQgaWQpOiB0d28gYGNyZWF0ZUhvb2tgIGNhbGxzIGluIG9uZVxuICAgKiBib2R5IGNvdWxkIHRoZW4gc2hhcmUgYSBjb3JyZWxhdGlvbiBpZCwgYW5kIHRoZSBzZWNvbmQgY29uc3VtZXInc1xuICAgKiBgaG9va19jcmVhdGVkYCB3b3VsZCBiZSBhIHJlcGVhdCBvZiBhIGNsYXNzIHRoaXMgcmVwbGF5IGFscmVhZHkgcmVjb3JkZWQuXG4gICAqIFRoYXQgd291bGQgbWFrZSBza2lwcGluZyB3cm9uZyBmb3IgYGhvb2tfY3JlYXRlZGAsIGFuZCBpcyB0aGUgcmVhc29uIHRoZVxuICAgKiBjbGFzcyBtYXAgbGl2ZXMgbmV4dCB0byB0aGUgZXZlbnQgdHlwZXMgcmF0aGVyIHRoYW4gYmVpbmcgaW5mZXJyZWQuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhldmVudDogRXZlbnQpOiBFdmVudFsnZXZlbnRUeXBlJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZlbnRDbGFzc0tleShldmVudCk7XG4gICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmdldChrZXkpO1xuICB9XG5cbiAgLyoqIFN0ZXBzIHRoZSB3YWxrIG92ZXIgYSByZXBlYXQgb2YgYW4gYWxyZWFkeS1jb25zdW1lZCBjbGFzcy4gKi9cbiAgcHJpdmF0ZSBza2lwRHVwbGljYXRlRXZlbnQoZXZlbnQ6IEV2ZW50LCBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSkge1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIC8vIERlbGliZXJhdGVseSBub3Qgcm91dGVkIHRocm91Z2ggYG5vdGlmeUNvbnN1bWVkRXZlbnRgOiB0aGUgZGV0ZXJtaW5pc3RpY1xuICAgIC8vIGNsb2NrIGFkdmFuY2VzIG9ubHkgb24gZXZlbnRzIHRoZSB3b3JrZmxvdyBhY3R1YWxseSBvYnNlcnZlZC4gQSBza2lwcGVkXG4gICAgLy8gZXZlbnQgaXMgaW52aXNpYmxlIHRvIHRoZSB3b3JrZmxvdyBib2R5LCBhbmQgYSBsb2cgdGhhdCBoYXBwZW5zIHRvXG4gICAgLy8gY29udGFpbiBvbmUgbXVzdCBwcm9kdWNlIHRoZSBzYW1lIHRpbWVzdGFtcHMgYXMgYSBsb2cgdGhhdCBkb2VzIG5vdC5cbiAgICBldmVudHNMb2dnZXIuZGVidWcoXG4gICAgICAnU2tpcHBpbmcgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgbG9nJyxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICAgIGZpcnN0RXZlbnRUeXBlOiBmaXJzdFR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9XG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkR1cGxpY2F0ZUV2ZW50Py4oZXZlbnQsIGZpcnN0VHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGV2ZW50c0xvZ2dlci5lcnJvcignb25EdXBsaWNhdGVFdmVudCBjYWxsYmFjayB0aHJldyBhbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUVuZE9mTG9nKCkge1xuICAgIC8vIEV2ZXJ5dGhpbmcgc3RpbGwgcGFya2VkIGlzIHdhaXRpbmcgZm9yIGEgY29uc3VtZXIgc29tZSBsYXRlciByZXBsYXkgd2lsbFxuICAgIC8vIHJlZ2lzdGVyLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgcGFya2luZyDigJQgZXhjZXB0IG9uY2UgdGhlIGxvZ1xuICAgIC8vIGFscmVhZHkgaG9sZHMgdGhlIHJ1bidzIHRlcm1pbmFsIGV2ZW50LCBiZWNhdXNlIHRoZW4gdGhlcmUgaXMgbm8gbGF0ZXJcbiAgICAvLyByZXBsYXkgYW5kIG5vIGNvbnN1bWVyIHdpbGwgZXZlciBjb21lLlxuICAgIGlmICh0aGlzLnBhcmtlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuZXZlbnRzLmF0KC0xKTtcbiAgICBpZiAoIWxhc3QgfHwgIVRFUk1JTkFMX0VWRU5UX1RZUEVTLmhhcyhsYXN0LmV2ZW50VHlwZSkpIHtcbiAgICAgIC8vIEEgbGF0ZXIgcmVwbGF5IGlzIHN0aWxsIGV4cGVjdGVkLCBzbyBub3RoaW5nIGhlcmUgaXMgZGVjaWRhYmxlIGFuZFxuICAgICAgLy8gZXNjYWxhdGluZyB3b3VsZCBmYWlsIHRoZSBoZWFsdGh5IHJ1bnMgcGFya2luZyBleGlzdHMgdG8ga2VlcCBhbGl2ZS5cbiAgICAgIC8vIFJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGxvZyBob2xkaW5nIHNvbWV0aGluZyBpcyBub3QgYnkgaXRzZWxmIGEgZmF1bHQsXG4gICAgICAvLyBzbyB0aGlzIHN0YXlzIGF0IGBkZWJ1Z2A7IHtAbGluayBwYXJrZWRTdW1tYXJ5fSBpcyB3aGF0IGNhcnJpZXMgdGhlXG4gICAgICAvLyBzdGF0ZSB0byB0aGUgc3Bhbiwgd2hlcmUgYSBydW4gdGhhdCBrZWVwcyBzdG9wcGluZyBvbiB0aGUgc2FtZSBoZWxkXG4gICAgICAvLyBldmVudCBpcyB2aXNpYmxlIGFuZCBhIHNpbmdsZSByZXBsYXkncyB2aWV3IGlzIG5vdC5cbiAgICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsb2cgc3RpbGwgaG9sZGluZyBldmVudHMnLCB7XG4gICAgICAgIGV2ZW50SWQ6IHRoaXMucGFya2VkWzBdLmV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogdGhpcy5wYXJrZWRbMF0uZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiB0aGlzLnBhcmtlZFswXS5ldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICBwYXJrZWQ6IHRoaXMucGFya2VkLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKHRoaXMucGFya2VkWzBdLmV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudDogRXZlbnQsIG1heVBhcms6IGJvb2xlYW4pIHtcbiAgICAvLyBBbGwgY2FsbGJhY2tzIHJldHVybmVkIE5vdENvbnN1bWVkIGZvciB0aGUgY3VycmVudCBldmVudC5cbiAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIGNoZWNrLiBXZSBjaGFpbiBvbnRvIHRoZSBwcm9taXNlUXVldWUgc28gdGhhdCBhbnlcbiAgICAvLyBwZW5kaW5nIGFzeW5jIHdvcmsgKGUuZy4sIGRlc2VyaWFsaXphdGlvbi9kZWNyeXB0aW9uIHRoYXQgdHJpZ2dlcnNcbiAgICAvLyByZXNvbHZlKCkg4oaSIHVzZXIgY29kZSDihpIgc3Vic2NyaWJlKCkpIGNvbXBsZXRlcyBmaXJzdC4gSWYgdGhlIGV2ZW50XG4gICAgLy8gaXMgc3RpbGwgdW5jb25zdW1lZCBhZnRlciB0aGUgcXVldWUgZHJhaW5zLCBpdCdzIHRydWx5IG9ycGhhbmVkIOKAlCBvcixcbiAgICAvLyB3aGVuIGl0cyB0eXBlIGNhcnJpZXMgbm8gb3JkZXJpbmcgY2xhaW0sIHBhcmtlZCBmb3IgYSBsYXRlciBjb25zdW1lci5cbiAgICBjb25zdCBjaGVja1ZlcnNpb24gPSArK3RoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbjtcbiAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSB0aGlzLmdldFByb21pc2VRdWV1ZSgpXG4gICAgICAudGhlbihcbiAgICAgICAgLy8gWWllbGQgb25jZSBhZnRlciB0aGUgZmlyc3QgcXVldWUgZHJhaW4gc28gcHJvbWlzZSBjaGFpbnMgcmVzdW1lZCBieVxuICAgICAgICAvLyB0aGF0IGRyYWluIGNhbiBydW4gYWNyb3NzIHRoZSBWTSBib3VuZGFyeSBhbmQgYXBwZW5kIGFueSBmb2xsb3ctdXBcbiAgICAgICAgLy8gYXN5bmMgd29yayAoZm9yIGV4YW1wbGU6IHN0ZXBfY29tcGxldGVkIHJlc29sdmVzIC0+IGZvci1hd2FpdCBsb29wXG4gICAgICAgIC8vIHJlc3VtZXMgLT4gdGhlIG5leHQgaG9vayBwYXlsb2FkIHN0YXJ0cyBoeWRyYXRpbmcpLlxuICAgICAgICAoKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSlcbiAgICAgIClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgb3V0IGFueSBkZWxpdmVyeSBzdGlsbCBpbiBmbGlnaHQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aW1lci5cbiAgICAgICAgLy8gVGhlIHF1ZXVlIGRyYWluaW5nIHNheXMgdGhlIGhvc3QgaGFzIG5vIGh5ZHJhdGlvbiB3b3JrIGxlZnQ7IGl0XG4gICAgICAgIC8vIGRvZXMgbm90IHNheSB0aGUgVk0gaGFzIGZpbmlzaGVkIHJlYWN0aW5nIHRvIHdoYXQgd2FzIGh5ZHJhdGVkLlxuICAgICAgICB0aGlzLndoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uLCAoKSA9PiB7XG4gICAgICAgICAgLy8gVXNlIGEgZGVsYXllZCBzZXRUaW1lb3V0IG9uY2UgZGVsaXZlcmllcyBhcmUgaWRsZS4gVGhlIGRlbGF5IG11c3RcbiAgICAgICAgICAvLyBiZSBsb25nIGVub3VnaCBmb3IgcHJvbWlzZSBjaGFpbnMgdG8gcHJvcGFnYXRlIGFjcm9zcyB0aGUgVk1cbiAgICAgICAgICAvLyBib3VuZGFyeSAoZnJvbSByZXNvbHZlKCkgaW4gdGhlIGhvc3QgY29udGV4dCB0aHJvdWdoIHRvIHRoZVxuICAgICAgICAgIC8vIHdvcmtmbG93IGNvZGUgY2FsbGluZyBzdWJzY3JpYmUoKSBpbiB0aGUgVk0gY29udGV4dCkuIE5vZGUuanMgZG9lc1xuICAgICAgICAgIC8vIG5vdCBndWFyYW50ZWUgdGhhdCBzZXRUaW1lb3V0KDApIGZpcmVzIGFmdGVyIGFsbCBjcm9zcy1jb250ZXh0XG4gICAgICAgICAgLy8gbWljcm90YXNrcyBzZXR0bGUsIHNvIHdlIHVzZSBhIHNtYWxsIGJ1dCBub24temVybyBkZWxheS4gQW55XG4gICAgICAgICAgLy8gc3Vic2NyaWJlKCkgY2FsbCB0aGF0IGFycml2ZXMgZHVyaW5nIHRoaXMgd2luZG93IHdpbGwgY2FuY2VsIHRoZVxuICAgICAgICAgIC8vIGNoZWNrIHZpYSB2ZXJzaW9uIGludmFsaWRhdGlvbiArIGNsZWFyVGltZW91dC5cbiAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbiAhPT0gY2hlY2tWZXJzaW9uKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRDaGVjayA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVVbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50LCBtYXlQYXJrKTtcbiAgICAgICAgICB9LCBnZXREZWZlcnJlZENoZWNrRGVsYXlNcygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGUgd2hhdCBhIHN0aWxsLXVuY29uc3VtZWQgZXZlbnQgaXMsIG5vdyB0aGF0IHRoZSBwcm9taXNlIHF1ZXVlIGhhc1xuICAgKiBkcmFpbmVkIGFuZCB0aGUgZGVsaXZlcnkgZ2F0ZSBzYXlzIHRoZSBWTSBpcyBub3QgbWlkLXJlYWN0aW9uLlxuICAgKlxuICAgKiBgbWF5UGFya2AgaXMgZmFsc2Ugb25seSBmb3IgdGhlIGVuZC1vZi1sb2cgcmVjaGVjayBvZiBhbiBldmVudCB7QGxpbmsgcGFya31cbiAgICogYWxyZWFkeSBob2xkcy4gTm90aGluZyBpbiB0aGUgZmlyc3QgYnJhbmNoIGFwcGxpZXMgdG8gb25lIG9mIHRob3NlOiBpdCBpc1xuICAgKiBub3QgdGhlIGV2ZW50IGF0IHRoZSBjdXJzb3IsIHNvIHRoZSBpZGVudGl0eSBndWFyZCBpcyBub3QgbWVhbmluZ2Z1bCwgYW5kXG4gICAqIGl0IGlzIHBhcmtlZCBhbHJlYWR5LlxuICAgKlxuICAgKiBBIGR1cGxpY2F0ZSBjbGFzcyBuZXZlciBhcnJpdmVzIGhlcmUuIHtAbGluayBjb25zdW1lfSBzdGVwcyBvdmVyIG9uZSBpbiB0aGVcbiAgICogcGFzcyB0aGF0IG9mZmVyZWQgaXQsIGJlZm9yZSB0aGlzIGNoZWNrIGlzIGV2ZXIgc2NoZWR1bGVkLCBhbmQgYSBjbGFzc1xuICAgKiByZWNvcmRlZCB3aGlsZSB0aGUgY2hlY2sgd2FzIGluIGZsaWdodCBjYW4gb25seSBoYXZlIGJlZW4gcmVjb3JkZWQgYnkgYVxuICAgKiBjb25zdW1wdGlvbiBpbnNpZGUge0BsaW5rIGNvbnN1bWV9LCB3aG9zZSBuZXh0IHBhc3MgcmUtb2ZmZXJzIHRoaXMgZXZlbnRcbiAgICogYW5kIHN0ZXBzIG92ZXIgaXQgdGhlcmUg4oCUIGxlYXZpbmcgdGhlIGlkZW50aXR5IGd1YXJkIGFib3ZlIHRvIGRyb3AgdGhlXG4gICAqIGluLWZsaWdodCBjaGVjay5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVVuY29uc3VtZWRFdmVudChjdXJyZW50RXZlbnQ6IEV2ZW50LCBtYXlQYXJrOiBib29sZWFuKSB7XG4gICAgaWYgKG1heVBhcmspIHtcbiAgICAgIGlmICh0aGlzLmV2ZW50c1t0aGlzLmV2ZW50SW5kZXhdICE9PSBjdXJyZW50RXZlbnQpIHtcbiAgICAgICAgLy8gQW4gYXBwZW5kKCkgZHJhaW4gY2xhaW1lZCBpdCB3aGlsZSB0aGUgY2hlY2sgd2FzIGluIGZsaWdodC5cbiAgICAgICAgLy8gT25seSBzdWJzY3JpYmUoKSBjYW5jZWxzIHRoZSBjaGVjaywgc28gdGhpcyBpcyByZWFjaGFibGUuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBhcmsoY3VycmVudEV2ZW50KSkge1xuICAgICAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGBmbmAgb25jZSBubyBkYXRhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodCwgcG9sbGluZyB0aGUgd2F5XG4gICAqIGBzY2hlZHVsZVdoZW5JZGxlYCBkb2VzOiBsZXQgdGhlIHByb21pc2UgcXVldWUgZHJhaW4sIHJlLWNoZWNrIGEgdGltZXJcbiAgICogdGljayBsYXRlciwgcmVwZWF0LlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgdGhlIGNoZWNrIGlzIGEgYmV0IHRoYXQgZXZlcnkgZGVsaXZlcnkgdGhlIHdhbGsgaXMgcnVubmluZ1xuICAgKiBhaGVhZCBvZiBsYW5kcyBpbnNpZGUgYSBmaXhlZCB3aW5kb3cuIENvbnN1bXB0aW9uIGlzIHN5bmNocm9ub3VzIHdoaWxlIHRoZVxuICAgKiByZXNvbHV0aW9uIGl0IHRyaWdnZXJzIGlzIG5vdDogYSBzdGVwIHJlc3VsdCBoeWRyYXRlcyBpbiB0aGUgaG9zdCwgcmVzb2x2ZXNcbiAgICogZnJvbSBhIGRldGFjaGVkIGNvbnRpbnVhdGlvbiBiZWhpbmQgYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgLCBhbmQgb25seSB0aGVuXG4gICAqIGRvZXMgVk0gY29kZSBydW4gZmFyIGVub3VnaCB0byBzdWJzY3JpYmUgdGhlIG5leHQgY29uc3VtZXIuIFJlcGxheWluZyBhXG4gICAqIGJhdGNoIG9mIE4gcGFyYWxsZWwgc3RlcCByZXN1bHRzIGxlYXZlcyBOLTEgb2YgdGhlbSBvbiB0aGF0IGRldGFjaGVkIHBhdGhcbiAgICogd2l0aCB0aGUgcXVldWUgYWxyZWFkeSBkcmFpbmVkLCBzbyB0aGUgd2FsayBzaXRzIG9uIHRoZSBvcmRlcmVkIGV2ZW50IHRoZVxuICAgKiBWTSBpcyBhYm91dCB0byBkcmF3IGFuZCB0aGUgd2luZG93IGlzIHRoZSBvbmx5IHRoaW5nIHN0YW5kaW5nIGJldHdlZW4gYVxuICAgKiBoZWFsdGh5IHJ1biBhbmQgYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuXG4gICAqXG4gICAqIFNob3J0ZW5pbmcgdGhlIHdpbmRvdyBzaG93cyB0aGF0IG1lY2hhbmlzbSBkaXJlY3RseTogb24gaWRlbnRpY2FsIGV2ZW50IGxvZ3NcbiAgICogdGhlIGxvY2FsIHJhY2UgcmVwcm8gY29ycnVwdHMgMzQgb2YgNDIgcnVucyBhdCBhIDEwbXMgd2luZG93IGFuZCAwIG9mIDExNCBhdFxuICAgKiB0aGUgMTAwbXMgZGVmYXVsdC4gVGhhdCBtZWFzdXJlcyBob3cgdGhlIGJldCBsb3Nlcywgbm90IHRoYXQgdGhlIGRlZmF1bHRcbiAgICogbG9zZXMgaXQsIGFuZCBubyBtZWFzdXJlbWVudCBvZiBhIGRlbGl2ZXJ5IG91dHJ1bm5pbmcgMTAwbXMgZXhpc3RzIGVpdGhlclxuICAgKiB3YXkuIFNvIHJlYWQgdGhpcyBhcyByZXRpcmluZyB0aGUgYmV0IHJhdGhlciB0aGFuIGFzIHJlcGFpcmluZyBhbiBvYnNlcnZlZFxuICAgKiBmYWlsdXJlIG9mIHRoYXQgbnVtYmVyOiB0aGUgZGVsYXkgaXMgYSB1c2VyLXNldHRhYmxlIGVudiBvdmVycmlkZSwgd2hpY2hcbiAgICogbGVhdmVzIHRoZSBvbGQgYmVoYXZpb3VyIG9uZSBjb25maWd1cmF0aW9uIGF3YXkgZnJvbSBsb3Npbmcgb24gYW55IGJhY2tlbmQuXG4gICAqXG4gICAqIFRlcm1pbmF0aW9uIGlzIGBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeWAnczogaXQgY291bnRzIG9ubHkgZGVsaXZlcmllc1xuICAgKiB0aGF0IHJlc29sdmUgb24gdGhlaXIgb3duLCBzbyBub3RoaW5nIGhlcmUgY2FuIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBBXG4gICAqIGdlbnVpbmVseSBvcnBoYW5lZCBldmVudCBoYXMgbm8gZGVsaXZlcnkgdG8gd2FpdCBvbiBhbmQgcmVhY2hlcyBgZm5gIG9uIHRoZVxuICAgKiBmaXJzdCBwb2xsLlxuICAgKlxuICAgKiBXaGF0IHRoZSBnYXRlIGdpdmVzIHVwOiBmb3IgdGhlIG9yZGVyZWQgZXZlbnRzIHRoYXQgc3RpbGwgcmVhY2hcbiAgICogYG9uVW5jb25zdW1lZEV2ZW50YCByYXRoZXIgdGhhbiB7QGxpbmsgcGFya30sIHRoaXMgc3RvcHMgYmVpbmcgdGhlIHRoaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhIGRpdmVyZ2VkIGxvZyB3aGlsZSBhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodC4gVGhlIHN1c3BlbnNpb25cbiAgICogYW5kIHRoaXMgY2hlY2sgbm93IHdha2UgZnJvbSB0aGUgc2FtZSBgaXNEZWxpdmVyeUlkbGVgIGVkZ2UsIGFuZFxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZmlyZXMgb24gdGhlIGZpcnN0IHRpbWVyIHRpY2sgYWZ0ZXIgaWRsZSB3aGlsZSB0aGlzIHdhaXRzXG4gICAqIGEgZnVydGhlciBgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKWAuIFNvIGEgcnVuIHdpdGggYSBwZW5kaW5nIGBzbGVlcCgpYFxuICAgKiBzdXNwZW5kcyBmaXJzdCwgYW5kIGBvbldvcmtmbG93RXJyb3JgIGRyb3BzIHRoZSBkaXZlcmdlbmNlIGFycml2aW5nIHNlY29uZFxuICAgKiAoaXRzIGAnc3VzcGVuZGVkJ2AgYnJhbmNoIGRlbW90ZXMgdG8gYCdyZXBsYXknYCBhbmQgc3VyZmFjZXMgbm90aGluZyksXG4gICAqIGxlYXZpbmcgYSBsYXRlciBgcmVzdW1lKClgIHRvIGRlY2xpbmUgaW50byBhIGNvbGQgcmVwbGF5LiBQcmUtZ2F0ZSB0aGVcbiAgICogc3VzcGVuc2lvbiBhbHJlYWR5IHdvbiB0aGF0IHJhY2Ugd2hlbmV2ZXIgdGhlIGRlbGl2ZXJ5IGxhbmRlZCBpbnNpZGUgdGhlXG4gICAqIGZpeGVkIHdpbmRvdywgc28gd2hhdCBjaGFuZ2VkIGlzIHRoYXQgdGhlIG91dGNvbWUgc3RvcHBlZCBkZXBlbmRpbmcgb25cbiAgICogdGltaW5nLiBOb3RoaW5nIHNob3VsZCB0cmVhdCB0aGlzIGNoZWNrIGFzIHRoZSBtZWNoYW5pc20gdGhhdCByZXBvcnRzXG4gICAqIGRpdmVyZ2VuY2Ugb24gYSBsb2cgdGhlIHJ1biBpcyBzdGlsbCBkZWxpdmVyaW5nIGludG8uXG4gICAqL1xuICBwcml2YXRlIHdoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uOiBudW1iZXIsIGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcG9sbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlbGl2ZXJ5SWRsZSgpKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIZWxkIGluIHRoZSBzYW1lIGZpZWxkIHRoZSBmaXJlZCBjaGVjayB1c2VzIHNvIHN1YnNjcmliZSgpIGNhbmNlbHMgYVxuICAgICAgICAvLyBwb2xsIGluIHByb2dyZXNzIHRvby4gVGhlIHR3byBjYW5jZWxsYXRpb25zIGFyZSBub3QgaWRlbnRpY2FsOiBmb3IgdGhlXG4gICAgICAgIC8vIHBvbGwgaXQgaXMgdGhlIHZlcnNpb24gYnVtcCB0aGF0IGRvZXMgdGhlIHdvcmsgYW5kIHRoZSBjbGVhclRpbWVvdXQgaXNcbiAgICAgICAgLy8gYmVsdC1hbmQtYnJhY2VzLiBUd28gc3RhdGUgbWFjaGluZXMgd3JpdGUgdGhpcyBvbmUgZmllbGQsIHNvIGEgcG9sbFxuICAgICAgICAvLyBpbnZhbGlkYXRlZCBiZXR3ZWVuIHNjaGVkdWxpbmcgYW5kIGZpcmluZyBjYW4gbnVsbCBvdXQgYSBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGxpdmUgY2hhaW4gaGFzIHNpbmNlIHN0b3JlZCwgd2hpY2ggaXMgd2h5IGV2ZXJ5IHBhdGggb3V0IG9mIGBwb2xsYCBhbmRcbiAgICAgICAgLy8gb3V0IG9mIHRoZSBmaXJlZCBjaGVjayByZS1jaGVja3MgdGhlIHZlcnNpb24gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlXG4gICAgICAgIC8vIGhhbmRsZS5cbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHBvbGwsIDApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBwb2xsKCk7XG4gIH1cbn1cbiJdfQ==
671
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbnN1bWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2V2ZW50cy1jb25zdW1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTNDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRTNDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBVyxFQUFFLENBQzNDLFNBQVMsQ0FBQyxrQ0FBa0MsRUFBRSx1QkFBdUIsRUFBRTtJQUNyRSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSwyQkFBMkI7Q0FDakMsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsZUFBZTtDQUNoQixDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQW9DLElBQUksR0FBRyxDQUFDO0lBQ3BFLGdCQUFnQjtDQUNqQixDQUFDLENBQUM7QUFFSCxpRUFBaUU7QUFDakUsU0FBUyxhQUFhLENBQUMsU0FBaUIsRUFBRSxhQUFxQjtJQUM3RCxPQUFPLEdBQUcsU0FBUyxJQUFJLGFBQWEsRUFBRSxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLG9CQUFvQixHQUFvQyxJQUFJLEdBQUcsQ0FBQztJQUNwRSxlQUFl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Z0JBQ3ZFLHlFQUF5RTtnQkFDekUseUVBQXlFO2dCQUN6RSxzRUFBc0U7Z0JBQ3RFLHNFQUFzRTtnQkFDdEUseUVBQXlFO2dCQUN6RSx3RUFBd0U7Z0JBQ3hFLFVBQVU7Z0JBQ1YsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgRXZlbnQsXG4gIGVudGl0eUV2ZW50Q2xhc3MsXG4gIGVudk51bWJlcixcbiAgaXNTZWFsZWROb29wRXZlbnQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBldmVudHNMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbi8qKlxuICogRGVsYXkgYmVmb3JlIGZpcmluZyB0aGUgZGVmZXJyZWQgdW5jb25zdW1lZC1ldmVudCBjaGVjayBhZnRlciB0aGUgcHJvbWlzZVxuICogcXVldWUgaGFzIGRyYWluZWQuIE11c3QgYmUgbG9uZyBlbm91Z2ggZm9yIGNyb3NzLVZNIG1pY3JvdGFzayBjaGFpbnMgdG9cbiAqIHByb3BhZ2F0ZSAocmVzb2x2ZSBpbiBob3N0IOKGkiB3b3JrZmxvdyBjb2RlIGluIFZNIOKGkiBzdWJzY3JpYmUgY2FsbCBiYWNrXG4gKiBpbiBob3N0KS4gQW55IHN1YnNjcmliZSgpIGFycml2aW5nIGR1cmluZyB0aGlzIHdpbmRvdyBjYW5jZWxzIHRoZSBjaGVjay5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkVSUkVEX0NIRUNLX0RFTEFZX01TID0gMTAwO1xuXG4vKipcbiAqIEZsb29yIGZvciB0aGUgZGVmZXJyZWQtY2hlY2sgZGVsYXksIHNvIGEgdG9vLWxvdyBvdmVycmlkZSBjYW4ndCBtYW51ZmFjdHVyZVxuICogc3B1cmlvdXMgZGl2ZXJnZW5jZSAoZWFjaCBmYWxzZSBwb3NpdGl2ZSBidXJucyBhIGRpdmVyZ2VuY2UtcmVjb3ZlcnkgcmV0cnlcbiAqIGFuZCBjYW4gZXNjYWxhdGUgdG8gYSB0ZXJtaW5hbCBgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcmApLlxuICpcbiAqIEV4cG9ydGVkIHNvIHRlc3RzIG5lZWRpbmcgdGhlIHNob3J0ZXN0IGxlZ2FsIGRlbGF5IGNhbiBhc2sgZm9yIGl0IGluc3RlYWQgb2ZcbiAqIGhhcmRjb2RpbmcgYSBudW1iZXIgdGhpcyBmbG9vciB3b3VsZCBzaWxlbnRseSBjbGFtcCB1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1JTl9ERUZFUlJFRF9DSEVDS19ERUxBWV9NUyA9IDEwO1xuXG4vKipcbiAqIEVmZmVjdGl2ZSBkZWZlcnJlZC1jaGVjayBkZWxheS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19ERUZFUlJFRF9DSEVDS19ERUxBWV9NU2AuXG4gKlxuICogVW5saWtlIHRoZSBvdGhlciB0aW1pbmcga25vYnMgdGhpcyBpcyBub3QgYSBwb2xsaW5nIGludGVydmFsIGJ1dCBhXG4gKiBkZXRlcm1pbmlzbSBzYWZldHkgbWFyZ2luOiBmaXJpbmcgdGhlIHVuY29uc3VtZWQtZXZlbnQgY2hlY2sgYmVmb3JlIHRoZVxuICogY3Jvc3MtVk0gc3Vic2NyaWJlKCkgY2hhaW4gaGFzIGxhbmRlZCByZWplY3RzIGEgaGVhbHRoeSBydW4gd2l0aFxuICogYFJlcGxheURpdmVyZ2VuY2VFcnJvcmAuXG4gKi9cbmNvbnN0IGdldERlZmVycmVkQ2hlY2tEZWxheU1zID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TJywgREVGRVJSRURfQ0hFQ0tfREVMQVlfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogTUlOX0RFRkVSUkVEX0NIRUNLX0RFTEFZX01TLFxuICB9KTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGUgb3JkZXJlZCB3YWxrIG1heSBzdGVwIG92ZXIgYW5kIGRlbGl2ZXIgbGF0ZXIuXG4gKlxuICogTWVtYmVyc2hpcCBpcyBub3QgYWJvdXQgd2hvIHdyb3RlIHRoZSBldmVudC4gSXQgaXMgYWJvdXQgd2hldGhlciB0aGUgZXZlbnRcbiAqIGNhbiByZWFjaCB0aGUgaGVhZCBvZiB0aGUgd2FsayB3aXRoIG5vdGhpbmcgcmVnaXN0ZXJlZCB0byBjb25zdW1lIGl0LCB3aGljaFxuICogaXMgdGhlIG9ubHkgc2l0dWF0aW9uIHBhcmtpbmcgZXhpc3RzIGZvci5cbiAqXG4gKiBNb3N0IHR5cGVzIGNhbm5vdC4gVGhleSBhcmUgcmVwbGF5LW9yaWdpbjogYSByZXBsYXkgZW1pdHMgdGhlbSwgaW4gdGhlIG9yZGVyXG4gKiBpdHMgY29kZSByZWFjaGVzIHRoZW0sIHNvIHRoZWlyIHBvc2l0aW9uIGluIHRoZSBsb2cgaXMgdGhlIHJlY29yZCBvZiB3aGF0XG4gKiB0aGF0IHJlcGxheSBkZWNpZGVkLiBSZWFjaGluZyBvbmUgb2YgdGhvc2Ugb3V0IG9mIG9yZGVyIG1lYW5zIHRoaXMgcmVwbGF5XG4gKiBkZWNpZGVkIGRpZmZlcmVudGx5IHRoYW4gdGhlIGxvZyBob2xkcywgd2hpY2ggaXMgZGl2ZXJnZW5jZSBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIFN0ZXAgbGlmZWN5Y2xlIGV2ZW50cyBhcmUgbm90IHJlcGxheS1vcmlnaW4sIGFuZCBhcmUgc3RpbGwgYWJzZW50LCBiZWNhdXNlXG4gKiB0aGV5IGFsd2F5cyBoYXZlIGEgY2xhaW1hbnQuIGBzdGVwKClgIHN1YnNjcmliZXMgaXRzIGNvbnN1bWVyIGJlZm9yZSB0aGVcbiAqIHN0ZXAncyBmaXJzdCBldmVudCBjYW4gZXhpc3Q7IGBzdGVwX2NyZWF0ZWRgIGlzIG9yZGVyZWQsIHNvIHRoZSB3YWxrIGNhbm5vdFxuICogcGFzcyBpdCB1bmxlc3MgYSBjb25zdW1lciB0YWtlcyBpdDsgYW5kIHRoYXQgY29uc3VtZXIgc3RheXMgc3Vic2NyaWJlZCB1bnRpbFxuICogYHN0ZXBfY29tcGxldGVkYCBvciBgc3RlcF9mYWlsZWRgLCBhZnRlciB3aGljaCB0aGUgV29ybGQgcmVmdXNlcyBhbnkgZnVydGhlclxuICogd3JpdGUgZm9yIHRoYXQgc3RlcC4gVGhlcmUgaXMgbm8gd2luZG93IGluIHdoaWNoIGEgcmVwbGF5IGtub3dzIGFib3V0IGEgc3RlcFxuICogYW5kIGhhcyBub3RoaW5nIHJlZ2lzdGVyZWQgdG8gY29uc3VtZSBpdHMgZXZlbnRzLCBzbyBwYXJraW5nIHRoZW0gd291bGQgb25seVxuICogZGVmZXIgcmVwb3J0cyBvZiB3aGF0IGlzIGRpdmVyZ2VuY2UgZWl0aGVyIHdheS4gVGhlIHNhbWUgaG9sZHMgZm9yXG4gKiBgd2FpdF9jcmVhdGVkYCBhbmQgaXRzIGNvbnN1bWVyLiBgd2FpdF9jb21wbGV0ZWRgIGlzIGxpc3RlZCBhbnl3YXk6IGEgc2xlZXBcbiAqIGNhbiBhbHNvIGJlIGNvbXBsZXRlZCBvdXQgb2YgYmFuZCwgYnkgdGhlIEFQSSB0aGF0IGZvcmNlLWNvbXBsZXRlcyBwZW5kaW5nXG4gKiB3YWl0cywgYW5kIHRvbGVyYXRpbmcgYSBzdHJheSBvbmUgaXMgdGhlIGNoZWFwZXIgZGlyZWN0aW9uIHRvIGJlIHdyb25nIGluLlxuICpcbiAqIEFuIGFsbG93bGlzdCByYXRoZXIgdGhhbiB0aGUgY29tcGxlbWVudCBvZiB0aGUgb3JkZXJlZCBzZXQsIHNvIGEgdHlwZSB0aGlzXG4gKiBmaWxlIGhhcyBub3QgYmVlbiB0YXVnaHQgYWJvdXQga2VlcHMgdGhlIHN0cmljdCBvbGQgYmVoYXZpb3IuXG4gKlxuICogYGhvb2tfZGlzcG9zZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgZGVzcGl0ZSBiZWluZyBhYm91dCBhIGhvb2s6IGl0IGlzXG4gKiB3cml0dGVuIHdoZW4gdGhlIHdvcmtmbG93J3Mgb3duIGB1c2luZ2Agc2NvcGUgZXhpdHMsIHNvIGl0IGlzIHJlcGxheS1vcmlnaW4uXG4gKlxuICogYGF0dHJfc2V0YCBpcyBsaXN0ZWQgYnkgdHlwZSBldmVuIHRob3VnaCBhIGdpdmVuIGluc3RhbmNlIG9mIGl0IG1heSBiZVxuICogcmVwbGF5LW9yaWdpbiwgc2luY2UgaXQgaXMgcmVwbGF5LW9yaWdpbiB3aGVuIGl0cyB3cml0ZXIgaXMgdGhlIHdvcmtmbG93LlxuICogU3BsaXR0aW5nIHRoYXQgb3V0IHBlciBldmVudCB3YXMgY29uc2lkZXJlZCBhbmQgcmVqZWN0ZWQuIEEgcmVwbGF5IHRoYXRcbiAqIHJlYWNoZXMgb25lIG9mIGl0cyBvd24gd3JpdGVzIG91dCBvZiBwb3NpdGlvbiBoYXMgZGl2ZXJnZWQsIGJ1dCBhIHJlcGxheSB0aGF0XG4gKiByZWFjaGVzIGFuIGV2ZW50IGl0IGRpZCBOT1Qgd3JpdGUsIHNpdHRpbmcgd2hlcmUgaXRzIG93biB3cml0ZSB3b3VsZCBnbywgaGFzXG4gKiBub3Q6IHRoZSB3cml0ZXIgZmllbGQgc2F5cyB3aG8gd3JvdGUgdGhlIGV2ZW50LCBhbmQgbm90IHdoZXRoZXIgdGhpcyByZXBsYXlcbiAqIGlzIHRoZSBzYW1lIG9uZS4gR3Vlc3Npbmcgd3JvbmcgaW4gdGhhdCBkaXJlY3Rpb24gZmFpbHMgaGVhbHRoeSBydW5zLCB3aGljaFxuICogaXMgdGhlIGZhaWx1cmUgdGhpcyBmaWxlIGV4aXN0cyB0byBzdG9wLCBzbyB0aGUgd2hvbGUgdHlwZSBpcyB0b2xlcmF0ZWQuIFRoZVxuICogY29zdCBpcyB0aGF0IGEgZGl2ZXJnZW5jZSBpbnZvbHZpbmcgYGF0dHJfc2V0YCBzdXJmYWNlcyBhdCB0aGUgZW5kIG9mIHRoZVxuICogcmVwbGF5LCB0aHJvdWdoIGBzdHJhbmRlZEV2ZW50YCwgcmF0aGVyIHRoYW4gYXQgdGhlIG9mZmVuZGluZyBldmVudC5cbiAqL1xuY29uc3QgUEFSS0FCTEVfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAnaG9va19jb25mbGljdCcsXG4gICd3YWl0X2NvbXBsZXRlZCcsXG4gICdhdHRyX3NldCcsXG4gICdydW5fY2FuY2VsbGVkJyxcbl0pO1xuXG4vKipcbiAqIFBhcmthYmxlIHR5cGVzIHRoYXQgY2FuIG9ubHkgZXZlciByZXNvbHZlIHRoZWlyIGNvcnJlbGF0aW9uIGlkIG9uY2UuXG4gKlxuICogQSBzZWNvbmQgb25lIGZvciB0aGUgc2FtZSBpZCBpcyBub3QgYSBkZWxpdmVyeSB0aGlzIHJlcGxheSBoYXMgbm90IHJlYWNoZWRcbiAqIHlldDogaXQgaXMgYSByZXNvbHV0aW9uIGZvciBzb21ldGhpbmcgYWxyZWFkeSByZXNvbHZlZCwgd2hpY2ggbm8gY29uc3VtZXJcbiAqIHRoaXMgcmVwbGF5IG9yIGFueSBsYXRlciBvbmUgcmVnaXN0ZXJzIGNhbiBldmVyIGNsYWltLiBgaG9va19yZWNlaXZlZGAgaXNcbiAqIGFic2VudCBiZWNhdXNlIGEgaG9vayBsZWdpdGltYXRlbHkgZmlyZXMgbWFueSB0aW1lcyB1bmRlciBvbmUgaWQuXG4gKlxuICogTXVzdCBzdGF5IGEgc3Vic2V0IG9mIHtAbGluayBQQVJLQUJMRV9FVkVOVF9UWVBFU306IHtAbGluayBwYXJrfSBpcyB0aGUgb25seVxuICogcmVhZGVyIG9mIHdoYXQgdGhpcyByZWNvcmRzLCBhbmQgaXQgcmVqZWN0cyBhIG5vbi1wYXJrYWJsZSB0eXBlIGJlZm9yZSBpdFxuICogbG9va3MsIHNvIGFuIGVudHJ5IG91dHNpZGUgdGhhdCBzZXQgaXMgZGVhZCB3ZWlnaHQgb24gYSBob3QgcGF0aC5cbiAqL1xuY29uc3QgT05FX1NIT1RfRVZFTlRfVFlQRVM6IFJlYWRvbmx5U2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ3dhaXRfY29tcGxldGVkJyxcbl0pO1xuXG4vKiogSWRlbnRpZmllcyB0aGUgdGhpbmcgYSBvbmUtc2hvdCByZXNvbHV0aW9uIGV2ZW50IHJlc29sdmVzLiAqL1xuZnVuY3Rpb24gcmVzb2x1dGlvbktleShldmVudFR5cGU6IHN0cmluZywgY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2V2ZW50VHlwZX06JHtjb3JyZWxhdGlvbklkfWA7XG59XG5cbi8qKlxuICogVHlwZXMgdGhhdCBlbmQgYSBydW4uIE9uY2Ugb25lIGlzIGluIHRoZSBsb2csIG5vIGNvbnN1bWVyIHdpbGwgZXZlciBiZVxuICogcmVnaXN0ZXJlZCBhZ2Fpbiwgc28gYSBwYXJrZWQgZXZlbnQgc3RpbGwgcGFya2VkIGhlcmUgd2lsbCBuZXZlciBiZSBjbGFpbWVkLlxuICovXG5jb25zdCBURVJNSU5BTF9FVkVOVF9UWVBFUzogUmVhZG9ubHlTZXQ8RXZlbnRbJ2V2ZW50VHlwZSddPiA9IG5ldyBTZXQoW1xuICAncnVuX2NvbXBsZXRlZCcsXG4gICdydW5fZmFpbGVkJyxcbiAgJ3J1bl9jYW5jZWxsZWQnLFxuXSk7XG5cbmV4cG9ydCBlbnVtIEV2ZW50Q29uc3VtZXJSZXN1bHQge1xuICAvKipcbiAgICogQ2FsbGJhY2sgY29uc3VtZWQgdGhlIGV2ZW50LCBidXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqL1xuICBDb25zdW1lZCxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGRpZCBub3QgY29uc3VtZSB0aGUgZXZlbnQsIHNvIGl0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIG5leHQgY2FsbGJhY2tcbiAgICovXG4gIE5vdENvbnN1bWVkLFxuICAvKipcbiAgICogQ2FsbGJhY2sgY29uc3VtZWQgdGhlIGV2ZW50LCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2tzIGxpc3RcbiAgICovXG4gIEZpbmlzaGVkLFxufVxuXG50eXBlIEV2ZW50Q29uc3VtZXJDYWxsYmFjayA9IChldmVudDogRXZlbnQgfCBudWxsKSA9PiBFdmVudENvbnN1bWVyUmVzdWx0O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50c0NvbnN1bWVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBpbnZva2VkIGFmdGVyIGFuIGV2ZW50IGhhcyBiZWVuIGNvbnN1bWVkLiBDb25zdW1lcnMgc3VjaCBhcyB0aGVcbiAgICogZGV0ZXJtaW5pc3RpYyB3b3JrZmxvdyBjbG9jayBtdXN0IG5vdCBvYnNlcnZlIGV2ZW50cyB0aGF0IGFyZSBtZXJlbHlcbiAgICogaW5zcGVjdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHVzZXIgY29kZSB0byBzdWJzY3JpYmUgdG8gdGhlIG5leHQgb3BlcmF0aW9uLlxuICAgKi9cbiAgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGludm9rZWQgd2hlbiBhIG5vbi1udWxsIGV2ZW50IGNhbm5vdCBiZSBjb25zdW1lZCBieSBhbnkgcmVnaXN0ZXJlZFxuICAgKiBjYWxsYmFjaywgaW5kaWNhdGluZyBhbiBvcnBoYW5lZCBvciBpbnZhbGlkIGV2ZW50IGluIHRoZSBldmVudCBsb2cuIFRoZVxuICAgKiBjaGVjayBpcyBkZWZlcnJlZCB1bnRpbCBhZnRlciB0aGUgcHJvbWlzZSBxdWV1ZSBoYXMgZHJhaW5lZCwgZW5zdXJpbmcgdGhhdFxuICAgKiBhbnkgcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLCBkZXNlcmlhbGl6YXRpb24vZGVjcnlwdGlvbikgY29tcGxldGVzIGFuZFxuICAgKiBkb3duc3RyZWFtIHN1YnNjcmliZSgpIGNhbGxzIGhhdmUgYSBjaGFuY2UgdG8gY2FuY2VsIHRoZSBjaGVjayBmaXJzdC5cbiAgICovXG4gIG9uVW5jb25zdW1lZEV2ZW50OiAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkO1xuICAvKipcbiAgICogQ2FsbGJhY2sgaW52b2tlZCB3aGVuIGFuIGV2ZW50IGlzIHNraXBwZWQgYmVjYXVzZSBpdCByZXBlYXRzIGFuIGV2ZW50XG4gICAqIGNsYXNzIHRoZSB3YWxrIGFscmVhZHkgY29uc3VtZWQgZm9yIHRoZSBzYW1lIGVudGl0eS4gYGZpcnN0RXZlbnRUeXBlYCBpc1xuICAgKiB0aGUgdHlwZSB0aGF0IHJlY29yZGVkIHRoZSBjbGFzcywgd2hpY2ggaXMgdGhlIG9uZSB0aGUgd29ya2Zsb3cgb2JzZXJ2ZWQuXG4gICAqIERpYWdub3N0aWNzIG9ubHk6IHNraXBwaW5nIGlzIGEgbm9ybWFsIG91dGNvbWUsIG5vdCBhbiBlcnJvciwgdGhvdWdoIGFcbiAgICogYGZpcnN0RXZlbnRUeXBlYCBkaWZmZXJpbmcgZnJvbSBgZXZlbnQuZXZlbnRUeXBlYCBzYXlzIHRoZSB0d28gd3JpdGVyc1xuICAgKiBkZWNpZGVkIHRoZSBlbnRpdHkncyBvdXRjb21lIGRpZmZlcmVudGx5LCB3aGljaCBpcyB3b3J0aCBtb3JlIHRoYW4gYW5cbiAgICogaW5mbyBsb2cuXG4gICAqL1xuICBvbkR1cGxpY2F0ZUV2ZW50PzogKGV2ZW50OiBFdmVudCwgZmlyc3RFdmVudFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcHJvbWlzZSBxdWV1ZS4gVGhlIHVuY29uc3VtZWQgZXZlbnQgY2hlY2sgaXMgY2hhaW5lZFxuICAgKiBvbnRvIHRoaXMgcXVldWUgc28gaXQgb25seSBmaXJlcyBhZnRlciBhbGwgcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLFxuICAgKiBkZXNlcmlhbGl6YXRpb24pIGhhcyBjb21wbGV0ZWQuIFRoaXMgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIHdoZW4gYXN5bmNcbiAgICogZGVzZXJpYWxpemF0aW9uIGRlbGF5cyB0aGUgcmVzb2x2ZSgpIHRoYXQgdHJpZ2dlcnMgdGhlIG5leHQgc3Vic2NyaWJlKCkuXG4gICAqL1xuICBnZXRQcm9taXNlUXVldWU6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG5vIGRhdGEgZGVsaXZlcnkgaXMgaW4gZmxpZ2h0IChgaXNEZWxpdmVyeUlkbGVgIGluIHByaXZhdGUudHMpLlxuICAgKiBUaGUgdW5jb25zdW1lZC1ldmVudCBjaGVjayB3YWl0cyBmb3IgdGhpcyBiZWZvcmUgaXQgZmlyZXM6IGEgZGVsaXZlcnkgaW5cbiAgICogZmxpZ2h0IG1lYW5zIHRoZSB3b3JrZmxvdyBWTSBpcyBtaWQtcmVhY3Rpb24sIGFuZCBhbiBldmVudCBpdCBoYXMgbm90XG4gICAqIGNsYWltZWQgeWV0IGlzIGFuIGV2ZW50IGl0IGhhcyBub3QgcmVhY2hlZCB5ZXQuXG4gICAqXG4gICAqIFJlcXVpcmVkIHJhdGhlciB0aGFuIGRlZmF1bHRpbmcgdG8gYWx3YXlzLWlkbGU6IGFsd2F5cy1pZGxlIGlzIGV4YWN0bHkgdGhlXG4gICAqIHByZS1nYXRlIGJlaGF2aW9yLCBzbyBhIGRlZmF1bHRlZCBvcHRpb24gd291bGQgbGV0IGEgY29uc3RydWN0aW9uIHNpdGUgb3B0XG4gICAqIGEgd2hvbGUgcmVwbGF5IHBhdGggYmFjayBvdXQgd2l0aG91dCBzYXlpbmcgc28uIFRlc3RzIHRoYXQgZHJpdmUgYSBjb25zdW1lclxuICAgKiB3aXRoIG5vIG9yY2hlc3RyYXRvciBjb250ZXh0IHBhc3MgYCgpID0+IHRydWVgIHRvIGtlZXAgdGhlIHByZS1leGlzdGluZ1xuICAgKiB0aW1pbmcsIGFuZCBzYXkgc28gYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICovXG4gIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29uc3VtZXIge1xuICBldmVudEluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IGV2ZW50czogRXZlbnRbXTtcbiAgcmVhZG9ubHkgY2FsbGJhY2tzOiBFdmVudENvbnN1bWVyQ2FsbGJhY2tbXSA9IFtdO1xuICAvKipcbiAgICogRXZlbnRzIHRoZSBvcmRlcmVkIHdhbGsgc3RlcHBlZCBvdmVyIGJlY2F1c2Ugbm9ib2R5IGNsYWltZWQgdGhlbSBhbmQgdGhlaXJcbiAgICogdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLiBFYWNoIGtlZXBzIHRoZSBpbmRleCBpdCBoZWxkIGluIHRoZSBsb2c6XG4gICAqIGNvbnN1bWVycyByZWFkIHtAbGluayBldmVudEluZGV4fSBhdCBjb25zdW1wdGlvbiB0aW1lIHRvIG9yZGVyIHRoZWlyXG4gICAqIGRlbGl2ZXJ5IGFnYWluc3QgdGhlIHJlc3Qgb2YgdGhlIGxvZywgYW5kIGEgbGF0ZSBkZWxpdmVyeSBtdXN0IHN0aWxsIG1ha2VcbiAgICogdGhlIGNsYWltIGl0cyBwb3NpdGlvbiBnYXZlIGl0LlxuICAgKlxuICAgKiBIZWxkIGluIGxvZyBvcmRlciwgZHJhaW5lZCBpbiBsb2cgb3JkZXIsIGFuZCBkcmFpbmVkIGJlZm9yZSBldmVyeSBvZmZlciBzb1xuICAgKiBhIGNvbnN1bWVyIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIHdhbGsgcGFzc2VkIHRoZSBldmVudCBzdGlsbCByZWNlaXZlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFya2VkOiB7IGV2ZW50OiBFdmVudDsgaW5kZXg6IG51bWJlciB9W10gPSBbXTtcbiAgLyoqXG4gICAqIENvcnJlbGF0aW9uIGlkcyBvZiB0aGUge0BsaW5rIE9ORV9TSE9UX0VWRU5UX1RZUEVTfSBldmVudHMgY29uc3VtZWQgc29cbiAgICogZmFyLCBzbyBhIHNlY29uZCByZXNvbHV0aW9uIGZvciBvbmUgb2YgdGhlbSBpcyByZWNvZ25pemVkIGFzIHVuY2xhaW1hYmxlXG4gICAqIHJhdGhlciB0aGFuIHBhcmtlZCBmb3IgYSBjb25zdW1lciB0aGF0IGNhbm5vdCBleGlzdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIGA8Y2xhc3M+Ojxjb3JyZWxhdGlvbklkPmAgZm9yIGV2ZXJ5IGV2ZW50IGNsYXNzIHRoZSB3YWxrIGhhcyBhbHJlYWR5XG4gICAqIGNvbnN1bWVkLCBtYXBwZWQgdG8gdGhlIGV2ZW50IHR5cGUgdGhhdCByZWNvcmRlZCBpdC4gVGhlIHR5cGUgaXMga2VwdCBzbyBhXG4gICAqIHJlcGVhdCB0aGF0IGRlY2lkZWQgdGhlIHNhbWUgY2xhc3MgKmRpZmZlcmVudGx5KiAoYSBgc3RlcF9mYWlsZWRgIGJlaGluZCBhXG4gICAqIGBzdGVwX2NvbXBsZXRlZGApIGNhbiBiZSByZXBvcnRlZCBhcyBtb3JlIHRoYW4gYSByZS1jb21taXQuIFNlZVxuICAgKiB7QGxpbmsgRXZlbnRzQ29uc3VtZXIuZmlyc3RFdmVudFR5cGVPZkNsYXNzfS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VlbkV2ZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFsnZXZlbnRUeXBlJ10+KCk7XG4gIHByaXZhdGUgb25Db25zdW1lZEV2ZW50PzogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50OiBFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvbkR1cGxpY2F0ZUV2ZW50PzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBmaXJzdFR5cGU6IEV2ZW50WydldmVudFR5cGUnXVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgZ2V0UHJvbWlzZVF1ZXVlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHBlbmRpbmdVbmNvbnN1bWVkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdW5jb25zdW1lZENoZWNrVmVyc2lvbiA9IDA7XG5cbiAgY29uc3RydWN0b3IoZXZlbnRzOiBFdmVudFtdLCBvcHRpb25zOiBFdmVudHNDb25zdW1lck9wdGlvbnMpIHtcbiAgICAvLyBPd24gY29weTogdGhlIHJ1bnRpbWUgbXV0YXRlcyBpdHMgZXZlbnQgYXJyYXkgaW4gcGxhY2UsIGFuZCBhIHJldGFpbmVkXG4gICAgLy8gc2Vzc2lvbiBtdXN0IG9ubHkgb2JzZXJ2ZSBuZXcgZXZlbnRzIHRocm91Z2ggYXBwZW5kKCkgc28gcmVzdW1lKCknc1xuICAgIC8vIHN0cmljdC1leHRlbnNpb24gY2hlY2sgc3RheXMgbWVhbmluZ2Z1bC5cbiAgICB0aGlzLmV2ZW50cyA9IFsuLi5ldmVudHNdO1xuICAgIHRoaXMuZXZlbnRJbmRleCA9IDA7XG4gICAgdGhpcy5vbkNvbnN1bWVkRXZlbnQgPSBvcHRpb25zLm9uQ29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uVW5jb25zdW1lZEV2ZW50ID0gb3B0aW9ucy5vblVuY29uc3VtZWRFdmVudDtcbiAgICB0aGlzLm9uRHVwbGljYXRlRXZlbnQgPSBvcHRpb25zLm9uRHVwbGljYXRlRXZlbnQ7XG4gICAgdGhpcy5nZXRQcm9taXNlUXVldWUgPSBvcHRpb25zLmdldFByb21pc2VRdWV1ZTtcbiAgICB0aGlzLmlzRGVsaXZlcnlJZGxlID0gb3B0aW9ucy5pc0RlbGl2ZXJ5SWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IGV2ZW50IHRoZSB3YWxrIHN0ZXBwZWQgb3ZlciB0aGF0IG5vIGNvbnN1bWVyIGhhcyBjbGFpbWVkIHlldCxcbiAgICogaWYgYW55LiBQYXJraW5nIGlzIGEgYmV0IHRoYXQgYSBjb25zdW1lciB3aWxsIGJlIHJlZ2lzdGVyZWQgbGF0ZXIsIHNvIGF0XG4gICAqIGFueSBwb2ludCB3aGVyZSBubyBjb25zdW1lciBldmVyIHdpbGwgYmUgYWdhaW4gKHRoZSByZXBsYXkgZmluaXNoaW5nIGlzXG4gICAqIHRoZSBkZWZpbml0aXZlIG9uZSksIHRoaXMgYW5zd2VycyB3aGljaCBldmVudCB0aGUgYmV0IGxvc3Qgb24uXG4gICAqL1xuICBnZXQgc3RyYW5kZWRFdmVudCgpOiBFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSB3YWxrIGlzIHN0aWxsIGhvbGRpbmcsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaG9sZHMgbm90aGluZy5cbiAgICpcbiAgICogUmVhZCBhdCBldmVyeSBwb2ludCBhIHJlcGxheSBzdG9wcywgaW5jbHVkaW5nIHRoZSBzdXNwZW5zaW9ucyB0aGF0IGFyZSBub3RcbiAgICogc2V0dGxpbmcgcG9pbnRzLCBzbyB0aGUgaGVsZCBzdGF0ZSByZWFjaGVzIHRlbGVtZXRyeS4gQSByZXBsYXkgY2Fubm90IHRlbGxcbiAgICogYSBkZWxpdmVyeSBhd2FpdGluZyBhIGxhdGVyIGNvbnN1bWVyIGZyb20gb25lIG5vIGNvbnN1bWVyIHdpbGwgZXZlclxuICAgKiByZWdpc3Rlciwgc28gaXQgcmVwb3J0cyByYXRoZXIgdGhhbiBkZWNpZGVzOiB0aGUgc2FtZSBgZXZlbnRJZGAgcmVwb3J0ZWQgb25cbiAgICogc3VzcGVuc2lvbiBhZnRlciBzdXNwZW5zaW9uIG9mIG9uZSBydW4gaXMgdGhlIHNoYXBlIHRoYXQgc2F5cyB0aGUgYmV0XG4gICAqIHBhcmtpbmcgbWFkZSBpcyBub3QgZ29pbmcgdG8gcGF5IG9mZiwgYW5kIHRoYXQgc2hhcGUgaXMgb25seSB2aXNpYmxlIGFjcm9zc1xuICAgKiByZXBsYXlzLlxuICAgKi9cbiAgZ2V0IHBhcmtlZFN1bW1hcnkoKTpcbiAgICB8IHsgY291bnQ6IG51bWJlcjsgZXZlbnRJZDogc3RyaW5nOyBldmVudFR5cGU6IEV2ZW50WydldmVudFR5cGUnXSB9XG4gICAgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMucGFya2VkWzBdPy5ldmVudDtcbiAgICBpZiAoIW9sZGVzdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvdW50OiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICBldmVudElkOiBvbGRlc3QuZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZTogb2xkZXN0LmV2ZW50VHlwZSxcbiAgICB9O1xuICB9XG5cbiAgYXBwZW5kKGV2ZW50czogRXZlbnRbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB0aGlzLmV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKHRoaXMuY29uc3VtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGFuIGV2ZW50IGhhcyBiZWVuIGNvbnN1bWVkXG4gICAqIGJ5IGEgZGlmZmVyZW50IGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgY2FuIHJldHVybjpcbiAgICogIC0gYEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWRgIHRoZSBldmVudCBpcyBjb25zaWRlcmVkIGNvbnN1bWVkIGFuZCB3aWxsIG5vdCBiZSBwYXNzZWQgdG8gYW55IG90aGVyIGNhbGxiYWNrLCBidXQgdGhlIGNhbGxiYWNrIHdpbGwgcmVtYWluIGluIHRoZSBjYWxsYmFja3MgbGlzdFxuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZGAgdGhlIGV2ZW50IGlzIHBhc3NlZCB0byB0aGUgbmV4dCBjYWxsYmFja1xuICAgKiAgLSBgRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZGAgdGhlIGV2ZW50IGlzIGNvbnNpZGVyZWQgY29uc3VtZWQgYW5kIHRoZSBjYWxsYmFjayBpcyByZW1vdmVkIGZyb20gdGhlIGNhbGxiYWNrcyBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSBmbiAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWdpc3Rlci5cbiAgICovXG4gIHN1YnNjcmliZShmbjogRXZlbnRDb25zdW1lckNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChmbik7XG4gICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHVuY29uc3VtZWQgY2hlY2sgc2luY2UgYSBuZXcgY2FsbGJhY2sgbWF5IGNvbnN1bWUgdGhlIGV2ZW50LlxuICAgIC8vIEluY3JlbWVudGluZyB0aGUgdmVyc2lvbiBjYXVzZXMgYW55IGluLWZsaWdodCBwcm9taXNlIGNoYWluIGNoZWNrIHRvIG5vLW9wLlxuICAgIC8vIEFsc28gY2xlYXIgdGhlIHBlbmRpbmcgc2V0VGltZW91dCBpZiBpdCBoYXNuJ3QgZmlyZWQgeWV0LlxuICAgIGlmICh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudW5jb25zdW1lZENoZWNrVmVyc2lvbisrO1xuICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQpO1xuICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkVGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHByb2Nlc3MubmV4dFRpY2sodGhpcy5jb25zdW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5Q29uc3VtZWRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMub25Db25zdW1lZEV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uQ29uc3VtZWRFdmVudChldmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGV2ZW50c0xvZ2dlci5lcnJvcignb25Db25zdW1lZEV2ZW50IGNhbGxiYWNrIHRocmV3IGFuIGVycm9yJywge1xuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSA9ICgpID0+IHtcbiAgICAvLyBEcmFpbiBjb25zZWN1dGl2ZWx5IGNvbnN1bWFibGUgZXZlbnRzIHN5bmNocm9ub3VzbHkgd2l0aGluIGEgc2luZ2xlXG4gICAgLy8gcGFzcyBpbnN0ZWFkIG9mIHBheWluZyBvbmUgYHByb2Nlc3MubmV4dFRpY2tgIHBlciBjb25zdW1lZCBldmVudC5cbiAgICAvL1xuICAgIC8vIFdoeSB0aGlzIGlzIHNhZmU6IGEgY2FsbGJhY2sgb25seSBjb25zdW1lcyBhbiBldmVudCB1c2luZyBhIGNvbnN1bWVyXG4gICAgLy8gdGhhdCBpcyBBTFJFQURZIHJlZ2lzdGVyZWQgKGUuZy4gYSBsb25nLWxpdmVkIHN0ZXAgY29uc3VtZXIgd2Fsa2luZ1xuICAgIC8vIGBzdGVwX2NyZWF0ZWRgIOKGkiBgc3RlcF9zdGFydGVkYCDihpIgYHN0ZXBfY29tcGxldGVkYCwgb3IgdGhlIHN0cnVjdHVyYWxcbiAgICAvLyBsaWZlY3ljbGUgY29uc3VtZXIpLiBOZXcgY29uc3VtZXJzIGFyZSBvbmx5IGV2ZXIgcmVnaXN0ZXJlZCBieSB3b3JrZmxvd1xuICAgIC8vIFZNIGJvZHkgY29kZSB0aGF0IHJ1bnMgYXN5bmNocm9ub3VzbHkgb2ZmIGBjdHgucHJvbWlzZVF1ZXVlYCBhZnRlciBhXG4gICAgLy8gZGVsaXZlcnkgYHJlc29sdmUoKWA7IG5vbmUgb2YgdGhlIGNhbGxiYWNrcyBoZXJlIGNhbGwgYHN1YnNjcmliZSgpYFxuICAgIC8vIHN5bmNocm9ub3VzbHkuIFNvIHdpdGhpbiBvbmUgcGFzcyBgdGhpcy5jYWxsYmFja3NgIGlzIG11dGF0ZWQgb25seSBieVxuICAgIC8vIHRoaXMgbG9vcCAodGhlIGBGaW5pc2hlZGAgc3BsaWNlKSwgYW5kIHRoZSBuZXh0IGV2ZW50J3MgY29uc3VtZXIgaXNcbiAgICAvLyBlaXRoZXIgYWxyZWFkeSBwcmVzZW50IChhZHZhbmNlIG5vdykgb3Igbm90IHlldCByZWdpc3RlcmVkLCBpbiB3aGljaFxuICAgIC8vIGNhc2Ugbm8gY2FsbGJhY2sgY29uc3VtZXMgdGhlIGV2ZW50IGFuZCB3ZSBmYWxsIHRocm91Z2ggdG8gdGhlXG4gICAgLy8gY3Jvc3MtVk0tc2FmZSBkZWZlcnJlZCB1bmNvbnN1bWVkLWV2ZW50IGNoZWNrIGJlbG93LCBleGFjdGx5IGFzIGJlZm9yZS5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQmVmb3JlIGV2ZXJ5IG9mZmVyLCBub3QganVzdCBvbiBzdWJzY3JpYmU6IGEgY2FsbGJhY2sgcmVnaXN0ZXJlZCBieVxuICAgICAgLy8gdGhlIHdvcmsgdGhpcyBzYW1lIHBhc3Mga2lja2VkIG9mZiBtYXkgYmUgdGhlIG93bmVyIG9mIHNvbWV0aGluZ1xuICAgICAgLy8gcGFya2VkLCBhbmQgdGhlIHBhcmtlZCBldmVudCdzIGRlbGl2ZXJ5IGlzIG9yZGVyZWQgYWhlYWQgb2YgdGhlIGhlYWRcbiAgICAgIC8vIGV2ZW50J3MgYnkgdGhlIGluZGV4IGl0IGhvbGRzLlxuICAgICAgdGhpcy5kcmFpblBhcmtlZCgpO1xuICAgICAgY29uc3QgY3VycmVudEV2ZW50ID0gdGhpcy5ldmVudHNbdGhpcy5ldmVudEluZGV4XSA/PyBudWxsO1xuICAgICAgaWYgKGN1cnJlbnRFdmVudCAhPT0gbnVsbCAmJiBpc1NlYWxlZE5vb3BFdmVudChjdXJyZW50RXZlbnQpKSB7XG4gICAgICAgIHRoaXMuc2tpcFNlYWxlZE5vb3AoY3VycmVudEV2ZW50KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdW1lZCA9IHRoaXMub2ZmZXIoY3VycmVudEV2ZW50KTtcbiAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRW5kIG9mIGxvZy4gQ29uc3VtZXJzIHJldHVybiBOb3RDb25zdW1lZCBmb3IgdGhlIGBudWxsYCBzZW50aW5lbFxuICAgICAgICAvLyAodGhlIG9uZSB0aGF0IHJlY29nbml6ZXMgaXQgYXMgaXRzIG93biBib3VuZGFyeSBzY2hlZHVsZXMgdGhlXG4gICAgICAgIC8vIHN1c3BlbnNpb24gYXMgYSBzaWRlIGVmZmVjdCBhbmQgc3RpbGwgZGVjbGluZXMgaXQpLCBzbyB0aGUgZHJhaW5cbiAgICAgICAgLy8gc3RvcHMgaGVyZSByYXRoZXIgdGhhbiBzcGlubmluZyBwYXN0IHRoZSBlbmQuIGBjb25zdW1lZGAgaXMgb25seVxuICAgICAgICAvLyB0cnVlIGZvciBhIGNhbGxiYWNrIHRoYXQgY2xhaW1zIHRoZSBzZW50aW5lbCBvdXRyaWdodCwgd2hpY2ggbm9cbiAgICAgICAgLy8gcHJvZHVjdGlvbiBjb25zdW1lciBkb2VzLlxuICAgICAgICBpZiAoIWNvbnN1bWVkKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVFbmRPZkxvZygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY29uc3VtZWQpIHtcbiAgICAgICAgLy8gTm9ib2R5IHdhbnRlZCBpdC4gSWYgaXQgcmVwZWF0cyBhIGNsYXNzIHRoaXMgd2FsayBhbHJlYWR5IGNvbnN1bWVkXG4gICAgICAgIC8vIGZvciB0aGUgc2FtZSBlbnRpdHkgaXQgaXMgYSBzdHJhZ2dsZXIgZnJvbSBhIGNvbmN1cnJlbnQgcmVwbGF5OlxuICAgICAgICAvLyBzdGVwIG92ZXIgaXQgaW4gdGhpcyBwYXNzIHJhdGhlciB0aGFuIHBheWluZyB0aGUgZGVmZXJyZWQgd2luZG93IGZvclxuICAgICAgICAvLyBhIGNvbnN1bWVyIHRoYXQgY2Fubm90IGNvbWUgKHNlZSBgZmlyc3RFdmVudFR5cGVPZkNsYXNzYCkuXG4gICAgICAgIGNvbnN0IGZpcnN0VHlwZSA9IHRoaXMuZmlyc3RFdmVudFR5cGVPZkNsYXNzKGN1cnJlbnRFdmVudCk7XG4gICAgICAgIGlmIChmaXJzdFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuc2tpcER1cGxpY2F0ZUV2ZW50KGN1cnJlbnRFdmVudCwgZmlyc3RUeXBlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjaGVkdWxlVW5jb25zdW1lZENoZWNrKGN1cnJlbnRFdmVudCwgdHJ1ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgcmVhbCBldmVudCB3YXMgY29uc3VtZWQsIHNvIGFkdmFuY2UgdG8gdGhlIG5leHQgaW4gdGhlIHNhbWUgcGFzcy5cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIE9mZmVyIGBjdXJyZW50RXZlbnRgIHRvIGVhY2ggcmVnaXN0ZXJlZCBjYWxsYmFjayBpbiB0dXJuLiBSZXR1cm5zIHRydWVcbiAgICogd2hlbiBhIGNhbGxiYWNrIGNvbnN1bWVkIGl0LiBEb2VzIG5vdCBtb3ZlIHtAbGluayBldmVudEluZGV4fTogdGhlIG9yZGVyZWRcbiAgICogd2FsayBhbmQgdGhlIHBhcmtlZCBkcmFpbiBhZHZhbmNlIGRpZmZlcmVudGx5LCBzbyBlYWNoIGRvZXMgaXRzIG93bi5cbiAgICovXG4gIHByaXZhdGUgb2ZmZXIoY3VycmVudEV2ZW50OiBFdmVudCB8IG51bGwpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2ldO1xuICAgICAgbGV0IGhhbmRsZWQgPSBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlZCA9IGNhbGxiYWNrKGN1cnJlbnRFdmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ0V2ZW50Q29uc3VtZXIgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBoYW5kbGVkICE9PSBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkICYmXG4gICAgICAgIGhhbmRsZWQgIT09IEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWRcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50RXZlbnQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRFdmVudC5jb3JyZWxhdGlvbklkICYmXG4gICAgICAgICAgT05FX1NIT1RfRVZFTlRfVFlQRVMuaGFzKGN1cnJlbnRFdmVudC5ldmVudFR5cGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucmVzb2x2ZWQuYWRkKFxuICAgICAgICAgICAgcmVzb2x1dGlvbktleShjdXJyZW50RXZlbnQuZXZlbnRUeXBlLCBjdXJyZW50RXZlbnQuY29ycmVsYXRpb25JZClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVjb3JkRXZlbnRDbGFzcyhjdXJyZW50RXZlbnQpO1xuICAgICAgICB0aGlzLm5vdGlmeUNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0aGUgY2FsbGJhY2sgaWYgaXQgaGFzIGZpbmlzaGVkXG4gICAgICBpZiAoaGFuZGxlZCA9PT0gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZCkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZmVyIGV2ZXJ5dGhpbmcgcGFya2VkLCBvbGRlc3QgZmlyc3QsIHVudGlsIGEgcGFzcyBjbGFpbXMgbm90aGluZy5cbiAgICpcbiAgICogRWFjaCBvZmZlciBydW5zIHdpdGgge0BsaW5rIGV2ZW50SW5kZXh9IG1vdmVkIGJhY2sgdG8gdGhlIHBvc2l0aW9uIHRoZVxuICAgKiBwYXJrZWQgZXZlbnQgaGVsZCBpbiB0aGUgbG9nLCBiZWNhdXNlIHRoYXQgaXMgdGhlIHBvc2l0aW9uIGl0cyBjb25zdW1lclxuICAgKiB3aWxsIHJlZ2lzdGVyIGEgZGVsaXZlcnkgYmFycmllciB1bmRlci4gUmVzdG9yaW5nIHRoZSB3YWxrIHBvaW50ZXJcbiAgICogYWZ0ZXJ3YXJkcyBpcyB3aGF0IGtlZXBzIHRoZSB0d28gcG9pbnRlcnMgZnJvbSBpbnRlcmZlcmluZy5cbiAgICovXG4gIHByaXZhdGUgZHJhaW5QYXJrZWQoKTogdm9pZCB7XG4gICAgbGV0IHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgIHdoaWxlIChwcm9ncmVzc2VkKSB7XG4gICAgICBwcm9ncmVzc2VkID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGFya2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5wYXJrZWRbaV07XG4gICAgICAgIGNvbnN0IHdhbGtJbmRleCA9IHRoaXMuZXZlbnRJbmRleDtcbiAgICAgICAgdGhpcy5ldmVudEluZGV4ID0gZW50cnkuaW5kZXg7XG4gICAgICAgIGxldCBjb25zdW1lZDogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdW1lZCA9IHRoaXMub2ZmZXIoZW50cnkuZXZlbnQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuZXZlbnRJbmRleCA9IHdhbGtJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uc3VtZWQpIHtcbiAgICAgICAgICB0aGlzLnBhcmtlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgLy8gQSBgRmluaXNoZWRgIGNhbGxiYWNrIHdhcyBzcGxpY2VkIG91dCBvZiB0aGUgbGlzdCB0aGlzIHBhc3MsIHNvXG4gICAgICAgICAgLy8gcmVzdGFydCByYXRoZXIgdGhhbiBrZWVwIHdhbGtpbmcgYSBtdXRhdGVkIGFycmF5LlxuICAgICAgICAgIHByb2dyZXNzZWQgPSB0aGlzLnBhcmtlZC5sZW5ndGggPiAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXAgdGhlIG9yZGVyZWQgd2FsayBvdmVyIGFuIGV2ZW50IG5vYm9keSBjbGFpbWVkLCBob2xkaW5nIG9uIHRvIGl0IGZvciBhXG4gICAqIGxhdGVyIGNvbnN1bWVyLiBSZXR1cm5zIGZhbHNlIHdoZW4gdGhlIGV2ZW50J3MgdHlwZSBtYWtlcyBpdHMgcG9zaXRpb24gYVxuICAgKiBkZWNpc2lvbiByZWNvcmQsIHdoaWNoIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSBub2JvZHkgY2xhaW1pbmcgaXQgbWVhbnMgdGhlXG4gICAqIHJlcGxheSBkaXZlcmdlZC5cbiAgICovXG4gIHByaXZhdGUgcGFyayhldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIVBBUktBQkxFX0VWRU5UX1RZUEVTLmhhcyhldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGV2ZW50LmNvcnJlbGF0aW9uSWQgJiZcbiAgICAgIHRoaXMucmVzb2x2ZWQuaGFzKHJlc29sdXRpb25LZXkoZXZlbnQuZXZlbnRUeXBlLCBldmVudC5jb3JyZWxhdGlvbklkKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXJrZWQucHVzaCh7IGV2ZW50LCBpbmRleDogdGhpcy5ldmVudEluZGV4IH0pO1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnUGFya2VkIGFuIHVuY2xhaW1lZCBldmVudCBmb3IgbGF0ZXIgZGVsaXZlcnknLCB7XG4gICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGtleSBgZXZlbnRgJ3MgY2xhc3MgaXMgdHJhY2tlZCB1bmRlciwgb3IgYHVuZGVmaW5lZGAgZm9yIHRoZSBldmVudFxuICAgKiB0eXBlcyB0aGF0IGJlbG9uZyB0byBubyBjbGFzcyAoYGhvb2tfcmVjZWl2ZWRgLCBgaG9va19jb25mbGljdGAsXG4gICAqIGBhdHRyX3NldGAsIGBydW5fY3JlYXRlZGApIGFuZCBhcmUgdGhlcmVmb3JlIG5ldmVyIHNraXBwZWQuXG4gICAqXG4gICAqIFJ1biBldmVudHMgY2Fycnkgbm8gY29ycmVsYXRpb24gaWQuIFRoZXkgYXJlIGNsYXNzZXMgb2YgdGhlIHJ1biBpdHNlbGYsIHNvXG4gICAqIHRoZXkgYWxsIGtleSBvZmYgdGhlIHNhbWUgYnVja2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBldmVudENsYXNzS2V5KGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXZlbnRDbGFzcyA9IGVudGl0eUV2ZW50Q2xhc3MoZXZlbnQuZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gZXZlbnRDbGFzcyA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBgJHtldmVudENsYXNzfToke2V2ZW50LmNvcnJlbGF0aW9uSWR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1lbWJlcnMgdGhhdCBgZXZlbnRgJ3MgY2xhc3MgaXMgbm93IGRlY2lkZWQgZm9yIGl0cyBlbnRpdHksIGlmIHRoZSB0eXBlXG4gICAqIGJlbG9uZ3MgdG8gYSBjbGFzcy4gRmlyc3Qgd3JpdGVyIHdpbnM6IHRoZSByZWNvcmRlZCB0eXBlIGlzIHRoZSBvbmUgdGhlXG4gICAqIHdvcmtmbG93IG9ic2VydmVkLCBhbmQgYSBsYXRlciByZXBlYXQgaXMgbWVhc3VyZWQgYWdhaW5zdCBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRXZlbnRDbGFzcyhldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLmV2ZW50Q2xhc3NLZXkoZXZlbnQpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnNlZW5FdmVudENsYXNzZXMuc2V0KGtleSwgZXZlbnQuZXZlbnRUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgdGhhdCBhbHJlYWR5IGRlY2lkZWQgYGV2ZW50YCdzIGNsYXNzIGZvciB0aGUgc2FtZSBlbnRpdHksIG9yXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gbm90aGluZyBoYXM6IGEgc2Vjb25kIGBzdGVwX2NyZWF0ZWRgIGZvciBvbmUgc3RlcCwgYVxuICAgKiBzZWNvbmQgdGVybWluYWwgb3V0Y29tZSwgYSBzZWNvbmQgYHN0ZXBfc3RhcnRlZGAgYWZ0ZXIgdGhlIHN0ZXAncyByZXN1bHQgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgbG9nLlxuICAgKlxuICAgKiBTdWNoIGFuIGV2ZW50IGlzIGNvbW1pdHRlZCBidXQgaW5lcnQuIENvbmN1cnJlbnQgcmVwbGF5cyB3cml0ZSBpbnRvIG9uZVxuICAgKiBsb2cgd2l0aG91dCBhIGN1cnJlbmN5IGd1YXJkLCBzbyBhIHJlcGxheSB3b3JraW5nIGZyb20gYSBwcmVmaXggdGhhdFxuICAgKiBwcmVkYXRlcyBhbm90aGVyIHJlcGxheSdzIHdyaXRlIGNhbiBjb21taXQgaXRzIG93biBjb3B5IG9mIHdvcmsgdGhlIGxvZ1xuICAgKiBhbHJlYWR5IHJlY29yZHMuIFRoYXQgY29weSBjYW5ub3QgY2hhbmdlIHdoYXQgdGhlIHdvcmtmbG93IG9ic2VydmVkOiB0aGVcbiAgICogb3V0Y29tZSB3YXMgZGVjaWRlZCBieSB0aGUgZmlyc3QgZXZlbnQgb2YgdGhlIGNsYXNzIGFuZCBldmVyeSBsYXRlciByZXBsYXlcbiAgICogcmVhZHMgdGhhdCBzYW1lIGV2ZW50IGF0IHRoZSBzYW1lIGxvZyBwb3NpdGlvbiwgc28gaWdub3JpbmcgdGhlIHN0cmFnZ2xlclxuICAgKiBpcyBkZXRlcm1pbmlzdGljIGFjcm9zcyByZXBsYXlzLlxuICAgKlxuICAgKiBDbGFzc2VzIGFyZSB0cmFja2VkIHNlcGFyYXRlbHksIHNvIHBhc3Npbmcgb25lIGRvZXMgbm90IHN1cHByZXNzIGFub3RoZXIuXG4gICAqIEEgc3RlcCB3aG9zZSByZXN1bHQgaXMgaW4gdGhlIGxvZyBzdGlsbCByZWFjaGVzIGl0cyBgc3RlcF9jcmVhdGVkYCBhbmRcbiAgICogYHN0ZXBfc3RhcnRlZGAgY29uc3VtZXJzIGlmIGl0IGhhcyB5ZXQgdG8gc2VlIHRob3NlIGNsYXNzZXMuXG4gICAqXG4gICAqIENvbnN1bHRlZCBvbmx5IGFmdGVyIGV2ZXJ5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgaGFzIGRlY2xpbmVkIHRoZSBldmVudCwgc29cbiAgICogaXQgY2FuIG5ldmVyIHRha2UgYW4gZXZlbnQgYSBjb25zdW1lciB3YW50ZWQuIEEgcmV0cnkncyBgc3RlcF9zdGFydGVkYCBpc1xuICAgKiBjbGFpbWVkIGJ5IHRoZSBzdGVwJ3MgbGl2ZSBjb25zdW1lciBhbmQgY291bnRzIGFzIGFuIGF0dGVtcHQgZXhhY3RseSBhc1xuICAgKiBiZWZvcmUsIGFuZCBhIHNlY29uZCBgc3RlcF9jcmVhdGVkYCByZWFjaGluZyBhIHN0ZXAgdGhhdCBoYXMgbm90IGZpbmlzaGVkXG4gICAqIGlzIGxpa2V3aXNlIGNvbnN1bWVkIHJhdGhlciB0aGFuIHNraXBwZWQ7IG9ubHkgdGhlIGNvcGllcyBub2JvZHkgY2xhaW1zIGFyZVxuICAgKiBza2lwcGVkLlxuICAgKlxuICAgKiBVbmxpa2UgdGhlIGRpdmVyZ2VuY2UgcmVwb3J0LCB0aGlzIGRvZXMgKm5vdCogd2FpdCBvdXQgdGhlIGRlZmVycmVkIHdpbmRvd1xuICAgKiBmaXJzdCwgYW5kIGl0IGRvZXMgbm90IG5lZWQgdG8uIFRoZSB3aW5kb3cgYnV5cyB0aW1lIGZvciBhIGNvbnN1bWVyIHRoYXRcbiAgICogaGFzIHlldCB0byByZWdpc3RlciwgYW5kIG5vIHN1Y2ggY29uc3VtZXIgY2FuIHdhbnQgdGhpcyBldmVudDogdGhlIGNsYXNzXG4gICAqIHdhcyByZWNvcmRlZCBieSBhIGNvbnN1bXB0aW9uIGluIHRoaXMgc2FtZSByZXBsYXksIHdoaWNoIG1lYW5zIHRoZSBlbnRpdHknc1xuICAgKiBjb25zdW1lciB3YXMgcmVnaXN0ZXJlZCBhbmQgdG9vayBhbiBldmVudCBvZiB0aGlzIGNsYXNzLCBhbmQgY29ycmVsYXRpb25cbiAgICogaWRzIGFyZSBtaW50ZWQgZnJvbSBhIG1vbm90b25pYyBVTElEIHBlciBib2R5IHBvc2l0aW9uLCBzbyBub3RoaW5nIGxhdGVyIGluXG4gICAqIHRoZSBib2R5IHJlZ2lzdGVycyBhIHNlY29uZCBjb25zdW1lciB1bmRlciB0aGlzIGlkLiBXYWl0aW5nIHdvdWxkIGNvc3RcbiAgICogYGdldERlZmVycmVkQ2hlY2tEZWxheU1zKClgIHBlciBzdHJhZ2dsZXIgcGVyIHJlcGxheSBmb3IgaW5mb3JtYXRpb24gdGhhdFxuICAgKiBjYW5ub3QgYXJyaXZlOiAwLjc1JSBvZiBwcm9kdWN0aW9uIHJ1bnMgY2FycnkgYXQgbGVhc3Qgb25lIHN0cmFnZ2xlciwgYW5kXG4gICAqIHRoZSBwOTkgYW1vbmcgdGhvc2UgY2FycmllcyAxNTUuXG4gICAqXG4gICAqIFRoZSBpbnZhcmlhbnQgdG8gcHJlc2VydmUgaWYgaG9vayBpZGVudGl0eSBldmVyIGJlY29tZXMgY2FsbGVyLXN1cHBsaWVkXG4gICAqIChhbiBpZGVtcG90ZW5jeSBrZXkgcmF0aGVyIHRoYW4gYSBtaW50ZWQgaWQpOiB0d28gYGNyZWF0ZUhvb2tgIGNhbGxzIGluIG9uZVxuICAgKiBib2R5IGNvdWxkIHRoZW4gc2hhcmUgYSBjb3JyZWxhdGlvbiBpZCwgYW5kIHRoZSBzZWNvbmQgY29uc3VtZXInc1xuICAgKiBgaG9va19jcmVhdGVkYCB3b3VsZCBiZSBhIHJlcGVhdCBvZiBhIGNsYXNzIHRoaXMgcmVwbGF5IGFscmVhZHkgcmVjb3JkZWQuXG4gICAqIFRoYXQgd291bGQgbWFrZSBza2lwcGluZyB3cm9uZyBmb3IgYGhvb2tfY3JlYXRlZGAsIGFuZCBpcyB0aGUgcmVhc29uIHRoZVxuICAgKiBjbGFzcyBtYXAgbGl2ZXMgbmV4dCB0byB0aGUgZXZlbnQgdHlwZXMgcmF0aGVyIHRoYW4gYmVpbmcgaW5mZXJyZWQuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0RXZlbnRUeXBlT2ZDbGFzcyhldmVudDogRXZlbnQpOiBFdmVudFsnZXZlbnRUeXBlJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuZXZlbnRDbGFzc0tleShldmVudCk7XG4gICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5zZWVuRXZlbnRDbGFzc2VzLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0ZXBzIHRoZSB3YWxrIG92ZXIgYSBzZWFsZWQtbG9nIGBub29wYCAoc3BlY1ZlcnNpb24gPj0gNyk6IHRoZSBXb3JsZCdzXG4gICAqIGJhY2tlbmQgd3JvdGUgaXQgdG8gb2NjdXB5IGEgc2xvdCB3aG9zZSB3cml0ZXIgYWxsb2NhdGVkIHRoZSBwb3NpdGlvbiBhbmRcbiAgICogZGllZCwgc28gdGhlIGxvZydzIGRlbnNpdHkgYXJpdGhtZXRpYyBob2xkcy4gSXQgaXMgaW52aXNpYmxlIHRvIHRoZVxuICAgKiB3b3JrZmxvdzogbm8gY29uc3VtZXIgaXMgb2ZmZXJlZCBpdCwgbm8gZXZlbnQgY2xhc3MgaXMgcmVjb3JkZWQsIGFuZCB0aGVcbiAgICogZGV0ZXJtaW5pc3RpYyBjbG9jayBkb2VzIG5vdCBhZHZhbmNlLCBleGFjdGx5IGFzIHdpdGhcbiAgICoge0BsaW5rIHNraXBEdXBsaWNhdGVFdmVudH0sIHNvIGEgbG9nIHRoYXQgaGFwcGVucyB0byBjb250YWluIG9uZSBwcm9kdWNlcyB0aGUgc2FtZVxuICAgKiB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuIChJdHMgYGNyZWF0ZWRBdGAgaXMgdGhlIHNlYWwgdGltZSxcbiAgICogd2hpY2ggY2FuIGV2ZW4gcG9zdGRhdGUgbGF0ZXIgc2xvdHMnIGV2ZW50czsgbGV0dGluZyBpdCB0b3VjaCB0aGUgY2xvY2tcbiAgICogd291bGQgbGVhayB0aGUgc2VhbGVyJ3Mgd2FsbCBjbG9jayBpbnRvIHJlcGxheS4pXG4gICAqL1xuICBwcml2YXRlIHNraXBTZWFsZWROb29wKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuZXZlbnRJbmRleCsrO1xuICAgIGV2ZW50c0xvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgc2VhbGVkLWxvZyBub29wIGV2ZW50Jywge1xuICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTdGVwcyB0aGUgd2FsayBvdmVyIGEgcmVwZWF0IG9mIGFuIGFscmVhZHktY29uc3VtZWQgY2xhc3MuICovXG4gIHByaXZhdGUgc2tpcER1cGxpY2F0ZUV2ZW50KGV2ZW50OiBFdmVudCwgZmlyc3RUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10pIHtcbiAgICB0aGlzLmV2ZW50SW5kZXgrKztcbiAgICAvLyBEZWxpYmVyYXRlbHkgbm90IHJvdXRlZCB0aHJvdWdoIGBub3RpZnlDb25zdW1lZEV2ZW50YDogdGhlIGRldGVybWluaXN0aWNcbiAgICAvLyBjbG9jayBhZHZhbmNlcyBvbmx5IG9uIGV2ZW50cyB0aGUgd29ya2Zsb3cgYWN0dWFsbHkgb2JzZXJ2ZWQuIEEgc2tpcHBlZFxuICAgIC8vIGV2ZW50IGlzIGludmlzaWJsZSB0byB0aGUgd29ya2Zsb3cgYm9keSwgYW5kIGEgbG9nIHRoYXQgaGFwcGVucyB0b1xuICAgIC8vIGNvbnRhaW4gb25lIG11c3QgcHJvZHVjZSB0aGUgc2FtZSB0aW1lc3RhbXBzIGFzIGEgbG9nIHRoYXQgZG9lcyBub3QuXG4gICAgZXZlbnRzTG9nZ2VyLmRlYnVnKFxuICAgICAgJ1NraXBwaW5nIGV2ZW50IHRoYXQgcmVwZWF0cyBhIGNsYXNzIGFscmVhZHkgaW4gdGhlIGxvZycsXG4gICAgICB7XG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBmaXJzdEV2ZW50VHlwZTogZmlyc3RUeXBlLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgfVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25EdXBsaWNhdGVFdmVudD8uKGV2ZW50LCBmaXJzdFR5cGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBldmVudHNMb2dnZXIuZXJyb3IoJ29uRHVwbGljYXRlRXZlbnQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3InLCB7XG4gICAgICAgIGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFbmRPZkxvZygpIHtcbiAgICAvLyBFdmVyeXRoaW5nIHN0aWxsIHBhcmtlZCBpcyB3YWl0aW5nIGZvciBhIGNvbnN1bWVyIHNvbWUgbGF0ZXIgcmVwbGF5IHdpbGxcbiAgICAvLyByZWdpc3Rlciwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIHBhcmtpbmcsIGV4Y2VwdCBvbmNlIHRoZSBsb2dcbiAgICAvLyBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyB0ZXJtaW5hbCBldmVudCwgYmVjYXVzZSB0aGVuIHRoZXJlIGlzIG5vIGxhdGVyXG4gICAgLy8gcmVwbGF5IGFuZCBubyBjb25zdW1lciB3aWxsIGV2ZXIgY29tZS5cbiAgICBpZiAodGhpcy5wYXJrZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmV2ZW50cy5hdCgtMSk7XG4gICAgaWYgKCFsYXN0IHx8ICFURVJNSU5BTF9FVkVOVF9UWVBFUy5oYXMobGFzdC5ldmVudFR5cGUpKSB7XG4gICAgICAvLyBBIGxhdGVyIHJlcGxheSBpcyBzdGlsbCBleHBlY3RlZCwgc28gbm90aGluZyBoZXJlIGlzIGRlY2lkYWJsZSBhbmRcbiAgICAgIC8vIGVzY2FsYXRpbmcgd291bGQgZmFpbCB0aGUgaGVhbHRoeSBydW5zIHBhcmtpbmcgZXhpc3RzIHRvIGtlZXAgYWxpdmUuXG4gICAgICAvLyBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBsb2cgaG9sZGluZyBzb21ldGhpbmcgaXMgbm90IGJ5IGl0c2VsZiBhIGZhdWx0LFxuICAgICAgLy8gc28gdGhpcyBzdGF5cyBhdCBgZGVidWdgOyB7QGxpbmsgcGFya2VkU3VtbWFyeX0gaXMgd2hhdCBjYXJyaWVzIHRoZVxuICAgICAgLy8gc3RhdGUgdG8gdGhlIHNwYW4sIHdoZXJlIGEgcnVuIHRoYXQga2VlcHMgc3RvcHBpbmcgb24gdGhlIHNhbWUgaGVsZFxuICAgICAgLy8gZXZlbnQgaXMgdmlzaWJsZSBhbmQgYSBzaW5nbGUgcmVwbGF5J3MgdmlldyBpcyBub3QuXG4gICAgICBldmVudHNMb2dnZXIuZGVidWcoJ1JlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9nIHN0aWxsIGhvbGRpbmcgZXZlbnRzJywge1xuICAgICAgICBldmVudElkOiB0aGlzLnBhcmtlZFswXS5ldmVudC5ldmVudElkLFxuICAgICAgICBldmVudFR5cGU6IHRoaXMucGFya2VkWzBdLmV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogdGhpcy5wYXJrZWRbMF0uZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgcGFya2VkOiB0aGlzLnBhcmtlZC5sZW5ndGgsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlZHVsZVVuY29uc3VtZWRDaGVjayh0aGlzLnBhcmtlZFswXS5ldmVudCwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVVuY29uc3VtZWRDaGVjayhjdXJyZW50RXZlbnQ6IEV2ZW50LCBtYXlQYXJrOiBib29sZWFuKSB7XG4gICAgLy8gQWxsIGNhbGxiYWNrcyByZXR1cm5lZCBOb3RDb25zdW1lZCBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuXG4gICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCBjaGVjay4gV2UgY2hhaW4gb250byB0aGUgcHJvbWlzZVF1ZXVlIHNvIHRoYXQgYW55XG4gICAgLy8gcGVuZGluZyBhc3luYyB3b3JrIChlLmcuLCBkZXNlcmlhbGl6YXRpb24vZGVjcnlwdGlvbiB0aGF0IHRyaWdnZXJzXG4gICAgLy8gcmVzb2x2ZSgpIOKGkiB1c2VyIGNvZGUg4oaSIHN1YnNjcmliZSgpKSBjb21wbGV0ZXMgZmlyc3QuIElmIHRoZSBldmVudFxuICAgIC8vIGlzIHN0aWxsIHVuY29uc3VtZWQgYWZ0ZXIgdGhlIHF1ZXVlIGRyYWlucywgaXQncyB0cnVseSBvcnBoYW5lZCwgb3IsXG4gICAgLy8gd2hlbiBpdHMgdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltLCBwYXJrZWQgZm9yIGEgbGF0ZXIgY29uc3VtZXIuXG4gICAgY29uc3QgY2hlY2tWZXJzaW9uID0gKyt0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb247XG4gICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZENoZWNrID0gdGhpcy5nZXRQcm9taXNlUXVldWUoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIC8vIFlpZWxkIG9uY2UgYWZ0ZXIgdGhlIGZpcnN0IHF1ZXVlIGRyYWluIHNvIHByb21pc2UgY2hhaW5zIHJlc3VtZWQgYnlcbiAgICAgICAgLy8gdGhhdCBkcmFpbiBjYW4gcnVuIGFjcm9zcyB0aGUgVk0gYm91bmRhcnkgYW5kIGFwcGVuZCBhbnkgZm9sbG93LXVwXG4gICAgICAgIC8vIGFzeW5jIHdvcmsgKGZvciBleGFtcGxlOiBzdGVwX2NvbXBsZXRlZCByZXNvbHZlcyAtPiBmb3ItYXdhaXQgbG9vcFxuICAgICAgICAvLyByZXN1bWVzIC0+IHRoZSBuZXh0IGhvb2sgcGF5bG9hZCBzdGFydHMgaHlkcmF0aW5nKS5cbiAgICAgICAgKCkgPT4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpXG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmdldFByb21pc2VRdWV1ZSgpKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG91dCBhbnkgZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0IGJlZm9yZSBzdGFydGluZyB0aGUgdGltZXIuXG4gICAgICAgIC8vIFRoZSBxdWV1ZSBkcmFpbmluZyBzYXlzIHRoZSBob3N0IGhhcyBubyBoeWRyYXRpb24gd29yayBsZWZ0OyBpdFxuICAgICAgICAvLyBkb2VzIG5vdCBzYXkgdGhlIFZNIGhhcyBmaW5pc2hlZCByZWFjdGluZyB0byB3aGF0IHdhcyBoeWRyYXRlZC5cbiAgICAgICAgdGhpcy53aGVuRGVsaXZlcnlJZGxlKGNoZWNrVmVyc2lvbiwgKCkgPT4ge1xuICAgICAgICAgIC8vIFVzZSBhIGRlbGF5ZWQgc2V0VGltZW91dCBvbmNlIGRlbGl2ZXJpZXMgYXJlIGlkbGUuIFRoZSBkZWxheSBtdXN0XG4gICAgICAgICAgLy8gYmUgbG9uZyBlbm91Z2ggZm9yIHByb21pc2UgY2hhaW5zIHRvIHByb3BhZ2F0ZSBhY3Jvc3MgdGhlIFZNXG4gICAgICAgICAgLy8gYm91bmRhcnkgKGZyb20gcmVzb2x2ZSgpIGluIHRoZSBob3N0IGNvbnRleHQgdGhyb3VnaCB0byB0aGVcbiAgICAgICAgICAvLyB3b3JrZmxvdyBjb2RlIGNhbGxpbmcgc3Vic2NyaWJlKCkgaW4gdGhlIFZNIGNvbnRleHQpLiBOb2RlLmpzIGRvZXNcbiAgICAgICAgICAvLyBub3QgZ3VhcmFudGVlIHRoYXQgc2V0VGltZW91dCgwKSBmaXJlcyBhZnRlciBhbGwgY3Jvc3MtY29udGV4dFxuICAgICAgICAgIC8vIG1pY3JvdGFza3Mgc2V0dGxlLCBzbyB3ZSB1c2UgYSBzbWFsbCBidXQgbm9uLXplcm8gZGVsYXkuIEFueVxuICAgICAgICAgIC8vIHN1YnNjcmliZSgpIGNhbGwgdGhhdCBhcnJpdmVzIGR1cmluZyB0aGlzIHdpbmRvdyB3aWxsIGNhbmNlbCB0aGVcbiAgICAgICAgICAvLyBjaGVjayB2aWEgdmVyc2lvbiBpbnZhbGlkYXRpb24gKyBjbGVhclRpbWVvdXQuXG4gICAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdVbmNvbnN1bWVkQ2hlY2sgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVW5jb25zdW1lZEV2ZW50KGN1cnJlbnRFdmVudCwgbWF5UGFyayk7XG4gICAgICAgICAgfSwgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlIHdoYXQgYSBzdGlsbC11bmNvbnN1bWVkIGV2ZW50IGlzLCBub3cgdGhhdCB0aGUgcHJvbWlzZSBxdWV1ZSBoYXNcbiAgICogZHJhaW5lZCBhbmQgdGhlIGRlbGl2ZXJ5IGdhdGUgc2F5cyB0aGUgVk0gaXMgbm90IG1pZC1yZWFjdGlvbi5cbiAgICpcbiAgICogYG1heVBhcmtgIGlzIGZhbHNlIG9ubHkgZm9yIHRoZSBlbmQtb2YtbG9nIHJlY2hlY2sgb2YgYW4gZXZlbnQge0BsaW5rIHBhcmt9XG4gICAqIGFscmVhZHkgaG9sZHMuIE5vdGhpbmcgaW4gdGhlIGZpcnN0IGJyYW5jaCBhcHBsaWVzIHRvIG9uZSBvZiB0aG9zZTogaXQgaXNcbiAgICogbm90IHRoZSBldmVudCBhdCB0aGUgY3Vyc29yLCBzbyB0aGUgaWRlbnRpdHkgZ3VhcmQgaXMgbm90IG1lYW5pbmdmdWwsIGFuZFxuICAgKiBpdCBpcyBwYXJrZWQgYWxyZWFkeS5cbiAgICpcbiAgICogQSBkdXBsaWNhdGUgY2xhc3MgbmV2ZXIgYXJyaXZlcyBoZXJlLiB7QGxpbmsgY29uc3VtZX0gc3RlcHMgb3ZlciBvbmUgaW4gdGhlXG4gICAqIHBhc3MgdGhhdCBvZmZlcmVkIGl0LCBiZWZvcmUgdGhpcyBjaGVjayBpcyBldmVyIHNjaGVkdWxlZCwgYW5kIGEgY2xhc3NcbiAgICogcmVjb3JkZWQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQgY2FuIG9ubHkgaGF2ZSBiZWVuIHJlY29yZGVkIGJ5IGFcbiAgICogY29uc3VtcHRpb24gaW5zaWRlIHtAbGluayBjb25zdW1lfSwgd2hvc2UgbmV4dCBwYXNzIHJlLW9mZmVycyB0aGlzIGV2ZW50XG4gICAqIGFuZCBzdGVwcyBvdmVyIGl0IHRoZXJlLCBsZWF2aW5nIHRoZSBpZGVudGl0eSBndWFyZCBhYm92ZSB0byBkcm9wIHRoZVxuICAgKiBpbi1mbGlnaHQgY2hlY2suXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVVbmNvbnN1bWVkRXZlbnQoY3VycmVudEV2ZW50OiBFdmVudCwgbWF5UGFyazogYm9vbGVhbikge1xuICAgIGlmIChtYXlQYXJrKSB7XG4gICAgICBpZiAodGhpcy5ldmVudHNbdGhpcy5ldmVudEluZGV4XSAhPT0gY3VycmVudEV2ZW50KSB7XG4gICAgICAgIC8vIEFuIGFwcGVuZCgpIGRyYWluIGNsYWltZWQgaXQgd2hpbGUgdGhlIGNoZWNrIHdhcyBpbiBmbGlnaHQuXG4gICAgICAgIC8vIE9ubHkgc3Vic2NyaWJlKCkgY2FuY2VscyB0aGUgY2hlY2ssIHNvIHRoaXMgaXMgcmVhY2hhYmxlLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wYXJrKGN1cnJlbnRFdmVudCkpIHtcbiAgICAgICAgdGhpcy5jb25zdW1lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblVuY29uc3VtZWRFdmVudChjdXJyZW50RXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBgZm5gIG9uY2Ugbm8gZGF0YSBkZWxpdmVyeSBpcyBpbiBmbGlnaHQsIHBvbGxpbmcgdGhlIHdheVxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZG9lczogbGV0IHRoZSBwcm9taXNlIHF1ZXVlIGRyYWluLCByZS1jaGVjayBhIHRpbWVyXG4gICAqIHRpY2sgbGF0ZXIsIHJlcGVhdC5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIHRoZSBjaGVjayBpcyBhIGJldCB0aGF0IGV2ZXJ5IGRlbGl2ZXJ5IHRoZSB3YWxrIGlzIHJ1bm5pbmdcbiAgICogYWhlYWQgb2YgbGFuZHMgaW5zaWRlIGEgZml4ZWQgd2luZG93LiBDb25zdW1wdGlvbiBpcyBzeW5jaHJvbm91cyB3aGlsZSB0aGVcbiAgICogcmVzb2x1dGlvbiBpdCB0cmlnZ2VycyBpcyBub3Q6IGEgc3RlcCByZXN1bHQgaHlkcmF0ZXMgaW4gdGhlIGhvc3QsIHJlc29sdmVzXG4gICAqIGZyb20gYSBkZXRhY2hlZCBjb250aW51YXRpb24gYmVoaW5kIGBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzYCwgYW5kIG9ubHkgdGhlblxuICAgKiBkb2VzIFZNIGNvZGUgcnVuIGZhciBlbm91Z2ggdG8gc3Vic2NyaWJlIHRoZSBuZXh0IGNvbnN1bWVyLiBSZXBsYXlpbmcgYVxuICAgKiBiYXRjaCBvZiBOIHBhcmFsbGVsIHN0ZXAgcmVzdWx0cyBsZWF2ZXMgTi0xIG9mIHRoZW0gb24gdGhhdCBkZXRhY2hlZCBwYXRoXG4gICAqIHdpdGggdGhlIHF1ZXVlIGFscmVhZHkgZHJhaW5lZCwgc28gdGhlIHdhbGsgc2l0cyBvbiB0aGUgb3JkZXJlZCBldmVudCB0aGVcbiAgICogVk0gaXMgYWJvdXQgdG8gZHJhdyBhbmQgdGhlIHdpbmRvdyBpcyB0aGUgb25seSB0aGluZyBzdGFuZGluZyBiZXR3ZWVuIGFcbiAgICogaGVhbHRoeSBydW4gYW5kIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgLlxuICAgKlxuICAgKiBTaG9ydGVuaW5nIHRoZSB3aW5kb3cgc2hvd3MgdGhhdCBtZWNoYW5pc20gZGlyZWN0bHk6IG9uIGlkZW50aWNhbCBldmVudCBsb2dzXG4gICAqIHRoZSBsb2NhbCByYWNlIHJlcHJvIGNvcnJ1cHRzIDM0IG9mIDQyIHJ1bnMgYXQgYSAxMG1zIHdpbmRvdyBhbmQgMCBvZiAxMTQgYXRcbiAgICogdGhlIDEwMG1zIGRlZmF1bHQuIFRoYXQgbWVhc3VyZXMgaG93IHRoZSBiZXQgbG9zZXMsIG5vdCB0aGF0IHRoZSBkZWZhdWx0XG4gICAqIGxvc2VzIGl0LCBhbmQgbm8gbWVhc3VyZW1lbnQgb2YgYSBkZWxpdmVyeSBvdXRydW5uaW5nIDEwMG1zIGV4aXN0cyBlaXRoZXJcbiAgICogd2F5LiBTbyByZWFkIHRoaXMgYXMgcmV0aXJpbmcgdGhlIGJldCByYXRoZXIgdGhhbiBhcyByZXBhaXJpbmcgYW4gb2JzZXJ2ZWRcbiAgICogZmFpbHVyZSBvZiB0aGF0IG51bWJlcjogdGhlIGRlbGF5IGlzIGEgdXNlci1zZXR0YWJsZSBlbnYgb3ZlcnJpZGUsIHdoaWNoXG4gICAqIGxlYXZlcyB0aGUgb2xkIGJlaGF2aW9yIG9uZSBjb25maWd1cmF0aW9uIGF3YXkgZnJvbSBsb3Npbmcgb24gYW55IGJhY2tlbmQuXG4gICAqXG4gICAqIFRlcm1pbmF0aW9uIGlzIGBoYXNQYXJrZWRDb21taXR0ZWREZWxpdmVyeWAnczogaXQgY291bnRzIG9ubHkgZGVsaXZlcmllc1xuICAgKiB0aGF0IHJlc29sdmUgb24gdGhlaXIgb3duLCBzbyBub3RoaW5nIGhlcmUgY2FuIGdhdGUgaXRzIG93biByZXRpcmVtZW50LiBBXG4gICAqIGdlbnVpbmVseSBvcnBoYW5lZCBldmVudCBoYXMgbm8gZGVsaXZlcnkgdG8gd2FpdCBvbiBhbmQgcmVhY2hlcyBgZm5gIG9uIHRoZVxuICAgKiBmaXJzdCBwb2xsLlxuICAgKlxuICAgKiBXaGF0IHRoZSBnYXRlIGdpdmVzIHVwOiBmb3IgdGhlIG9yZGVyZWQgZXZlbnRzIHRoYXQgc3RpbGwgcmVhY2hcbiAgICogYG9uVW5jb25zdW1lZEV2ZW50YCByYXRoZXIgdGhhbiB7QGxpbmsgcGFya30sIHRoaXMgc3RvcHMgYmVpbmcgdGhlIHRoaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhIGRpdmVyZ2VkIGxvZyB3aGlsZSBhIGRlbGl2ZXJ5IGlzIGluIGZsaWdodC4gVGhlIHN1c3BlbnNpb25cbiAgICogYW5kIHRoaXMgY2hlY2sgbm93IHdha2UgZnJvbSB0aGUgc2FtZSBgaXNEZWxpdmVyeUlkbGVgIGVkZ2UsIGFuZFxuICAgKiBgc2NoZWR1bGVXaGVuSWRsZWAgZmlyZXMgb24gdGhlIGZpcnN0IHRpbWVyIHRpY2sgYWZ0ZXIgaWRsZSB3aGlsZSB0aGlzIHdhaXRzXG4gICAqIGEgZnVydGhlciBgZ2V0RGVmZXJyZWRDaGVja0RlbGF5TXMoKWAuIFNvIGEgcnVuIHdpdGggYSBwZW5kaW5nIGBzbGVlcCgpYFxuICAgKiBzdXNwZW5kcyBmaXJzdCwgYW5kIGBvbldvcmtmbG93RXJyb3JgIGRyb3BzIHRoZSBkaXZlcmdlbmNlIGFycml2aW5nIHNlY29uZFxuICAgKiAoaXRzIGAnc3VzcGVuZGVkJ2AgYnJhbmNoIGRlbW90ZXMgdG8gYCdyZXBsYXknYCBhbmQgc3VyZmFjZXMgbm90aGluZyksXG4gICAqIGxlYXZpbmcgYSBsYXRlciBgcmVzdW1lKClgIHRvIGRlY2xpbmUgaW50byBhIGNvbGQgcmVwbGF5LiBQcmUtZ2F0ZSB0aGVcbiAgICogc3VzcGVuc2lvbiBhbHJlYWR5IHdvbiB0aGF0IHJhY2Ugd2hlbmV2ZXIgdGhlIGRlbGl2ZXJ5IGxhbmRlZCBpbnNpZGUgdGhlXG4gICAqIGZpeGVkIHdpbmRvdywgc28gd2hhdCBjaGFuZ2VkIGlzIHRoYXQgdGhlIG91dGNvbWUgc3RvcHBlZCBkZXBlbmRpbmcgb25cbiAgICogdGltaW5nLiBOb3RoaW5nIHNob3VsZCB0cmVhdCB0aGlzIGNoZWNrIGFzIHRoZSBtZWNoYW5pc20gdGhhdCByZXBvcnRzXG4gICAqIGRpdmVyZ2VuY2Ugb24gYSBsb2cgdGhlIHJ1biBpcyBzdGlsbCBkZWxpdmVyaW5nIGludG8uXG4gICAqL1xuICBwcml2YXRlIHdoZW5EZWxpdmVyeUlkbGUoY2hlY2tWZXJzaW9uOiBudW1iZXIsIGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgcG9sbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1VuY29uc3VtZWRUaW1lb3V0ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0RlbGl2ZXJ5SWRsZSgpKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2V0UHJvbWlzZVF1ZXVlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVuY29uc3VtZWRDaGVja1ZlcnNpb24gIT09IGNoZWNrVmVyc2lvbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBIZWxkIGluIHRoZSBzYW1lIGZpZWxkIHRoZSBmaXJlZCBjaGVjayB1c2VzIHNvIHN1YnNjcmliZSgpIGNhbmNlbHMgYVxuICAgICAgICAvLyBwb2xsIGluIHByb2dyZXNzIHRvby4gVGhlIHR3byBjYW5jZWxsYXRpb25zIGFyZSBub3QgaWRlbnRpY2FsOiBmb3IgdGhlXG4gICAgICAgIC8vIHBvbGwgaXQgaXMgdGhlIHZlcnNpb24gYnVtcCB0aGF0IGRvZXMgdGhlIHdvcmsgYW5kIHRoZSBjbGVhclRpbWVvdXQgaXNcbiAgICAgICAgLy8gYmVsdC1hbmQtYnJhY2VzLiBUd28gc3RhdGUgbWFjaGluZXMgd3JpdGUgdGhpcyBvbmUgZmllbGQsIHNvIGEgcG9sbFxuICAgICAgICAvLyBpbnZhbGlkYXRlZCBiZXR3ZWVuIHNjaGVkdWxpbmcgYW5kIGZpcmluZyBjYW4gbnVsbCBvdXQgYSBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGxpdmUgY2hhaW4gaGFzIHNpbmNlIHN0b3JlZCwgd2hpY2ggaXMgd2h5IGV2ZXJ5IHBhdGggb3V0IG9mIGBwb2xsYCBhbmRcbiAgICAgICAgLy8gb3V0IG9mIHRoZSBmaXJlZCBjaGVjayByZS1jaGVja3MgdGhlIHZlcnNpb24gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlXG4gICAgICAgIC8vIGhhbmRsZS5cbiAgICAgICAgdGhpcy5wZW5kaW5nVW5jb25zdW1lZFRpbWVvdXQgPSBzZXRUaW1lb3V0KHBvbGwsIDApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBwb2xsKCk7XG4gIH1cbn1cbiJdfQ==
@@ -15,7 +15,7 @@ type DrainBarrier = () => Promise<void>;
15
15
  * This is deliberately distinct from the per-request batch caps below: this
16
16
  * bounds how much is *buffered*, those bound how much goes out in one
17
17
  * `writeMulti`. Raising this must never let a single request exceed a wire
18
- * limit batch sizing enforces that independently.
18
+ * limit, since batch sizing enforces that independently.
19
19
  */
20
20
  export declare const MAX_INFLIGHT_CHUNKS = 1000;
21
21
  export declare const getMaxInflightChunks: () => number;
@@ -29,7 +29,7 @@ export declare const MAX_CHUNKS_PER_BATCH = 1000;
29
29
  export declare const getMaxChunksPerBatch: () => number;
30
30
  /**
31
31
  * Wire limit: maximum cumulative bytes in a single coalesced `writeMulti`.
32
- * Chunk *count* alone is not enough 1,000 small chunks are ~100KB but 1,000
32
+ * Chunk *count* alone is not enough: 1,000 small chunks are ~100KB but 1,000
33
33
  * file-sized chunks can be hundreds of MB, which platform request-body limits
34
34
  * reject long before the count cap matters. A batch is split once adding the
35
35
  * next chunk would exceed this (a single chunk larger than the cap still goes
@@ -38,7 +38,7 @@ export declare const getMaxChunksPerBatch: () => number;
38
38
  export declare const MAX_BYTES_PER_BATCH: number;
39
39
  export declare const getMaxBytesPerBatch: () => number;
40
40
  /**
41
- * Buffer bound (bytes) for the server writable's group-commit buffer the
41
+ * Buffer bound (bytes) for the server writable's group-commit buffer, the
42
42
  * byte-denominated counterpart of {@link MAX_INFLIGHT_CHUNKS}. `write()`
43
43
  * blocks once this much data is buffered-but-not-durable, so a fast producer
44
44
  * of large chunks can't grow client memory without bound. Default 8 MiB
@@ -59,7 +59,7 @@ export declare const getMaxBufferedBytes: () => number;
59
59
  * after each step body returns, so a coarser interval (the previous 100ms)
60
60
  * adds visible per-step latency to streaming workflows. With a uniformly
61
61
  * distributed offset between step return and the next tick, the expected
62
- * wait is half the interval so 10ms means ~5ms average wait per step
62
+ * wait is half the interval, so 10ms means ~5ms average wait per step
63
63
  * instead of ~50ms. The per-tick work is `writable.locked` plus a
64
64
  * `getWriter()`/`releaseLock()` probe, both microsecond-scale; 10× more
65
65
  * ticks during a stream's lifetime is not measurable in practice.