@workflow/core 5.0.0-beta.42 → 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 (220) 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 +10 -6
  12. package/dist/create-hook.d.ts.map +1 -1
  13. package/dist/create-hook.js +1 -1
  14. package/dist/define-hook.js +2 -2
  15. package/dist/describe-error.d.ts +7 -7
  16. package/dist/describe-error.js +8 -8
  17. package/dist/encryption.d.ts +5 -5
  18. package/dist/encryption.js +7 -7
  19. package/dist/events-consumer.d.ts +19 -7
  20. package/dist/events-consumer.d.ts.map +1 -1
  21. package/dist/events-consumer.js +33 -12
  22. package/dist/flushable-stream.d.ts +4 -4
  23. package/dist/flushable-stream.js +12 -12
  24. package/dist/global.d.ts +1 -1
  25. package/dist/global.js +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.js +2 -2
  28. package/dist/log-format.d.ts +2 -2
  29. package/dist/log-format.js +5 -5
  30. package/dist/logger.js +4 -4
  31. package/dist/private.d.ts +39 -64
  32. package/dist/private.d.ts.map +1 -1
  33. package/dist/private.js +294 -48
  34. package/dist/replay-payload-cache.d.ts +1 -1
  35. package/dist/replay-payload-cache.js +4 -4
  36. package/dist/runtime/compute-instance.d.ts +4 -3
  37. package/dist/runtime/compute-instance.d.ts.map +1 -1
  38. package/dist/runtime/compute-instance.js +5 -4
  39. package/dist/runtime/constants.d.ts +46 -19
  40. package/dist/runtime/constants.d.ts.map +1 -1
  41. package/dist/runtime/constants.js +76 -38
  42. package/dist/runtime/count-step-started-events.d.ts +7 -7
  43. package/dist/runtime/count-step-started-events.js +4 -4
  44. package/dist/runtime/deployment-guard.d.ts +7 -7
  45. package/dist/runtime/deployment-guard.js +8 -8
  46. package/dist/runtime/get-port-lazy.d.ts +2 -2
  47. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  48. package/dist/runtime/get-port-lazy.js +37 -30
  49. package/dist/runtime/get-world-lazy.d.ts +2 -2
  50. package/dist/runtime/get-world-lazy.js +3 -3
  51. package/dist/runtime/helpers.d.ts +18 -18
  52. package/dist/runtime/helpers.js +27 -27
  53. package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
  54. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  55. package/dist/runtime/quickjs-entrypoint.js +200 -81
  56. package/dist/runtime/quickjs-runtime.d.ts +31 -15
  57. package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
  58. package/dist/runtime/quickjs-runtime.js +126 -77
  59. package/dist/runtime/quickjs-serde.d.ts +10 -10
  60. package/dist/runtime/quickjs-serde.js +20 -20
  61. package/dist/runtime/replay-budget.d.ts +4 -4
  62. package/dist/runtime/replay-budget.js +5 -5
  63. package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
  64. package/dist/runtime/replay-recovery-reporter.js +2 -2
  65. package/dist/runtime/resume-hook.d.ts +2 -2
  66. package/dist/runtime/resume-hook.js +27 -27
  67. package/dist/runtime/resume-latency.d.ts +25 -25
  68. package/dist/runtime/resume-latency.d.ts.map +1 -1
  69. package/dist/runtime/resume-latency.js +4 -4
  70. package/dist/runtime/run-id-time.d.ts +2 -2
  71. package/dist/runtime/run-id-time.js +5 -5
  72. package/dist/runtime/run.d.ts +21 -4
  73. package/dist/runtime/run.d.ts.map +1 -1
  74. package/dist/runtime/run.js +154 -35
  75. package/dist/runtime/runs.d.ts +4 -4
  76. package/dist/runtime/runs.js +2 -2
  77. package/dist/runtime/start.d.ts +3 -3
  78. package/dist/runtime/start.d.ts.map +1 -1
  79. package/dist/runtime/start.js +27 -23
  80. package/dist/runtime/step-executor.d.ts +59 -11
  81. package/dist/runtime/step-executor.d.ts.map +1 -1
  82. package/dist/runtime/step-executor.js +116 -42
  83. package/dist/runtime/step-latency.d.ts +20 -14
  84. package/dist/runtime/step-latency.d.ts.map +1 -1
  85. package/dist/runtime/step-latency.js +13 -11
  86. package/dist/runtime/step-ownership.d.ts +6 -6
  87. package/dist/runtime/step-ownership.js +8 -8
  88. package/dist/runtime/step-single-flight.d.ts +1 -1
  89. package/dist/runtime/step-single-flight.d.ts.map +1 -1
  90. package/dist/runtime/step-single-flight.js +17 -11
  91. package/dist/runtime/suspension-handler.d.ts +99 -7
  92. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  93. package/dist/runtime/suspension-handler.js +678 -57
  94. package/dist/runtime/unserializable-step.d.ts +34 -0
  95. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  96. package/dist/runtime/unserializable-step.js +52 -0
  97. package/dist/runtime/vm-mode.d.ts +1 -1
  98. package/dist/runtime/vm-mode.js +2 -2
  99. package/dist/runtime/wait-continuation.d.ts +31 -9
  100. package/dist/runtime/wait-continuation.d.ts.map +1 -1
  101. package/dist/runtime/wait-continuation.js +44 -13
  102. package/dist/runtime/wait-until.d.ts +1 -1
  103. package/dist/runtime/wait-until.js +2 -2
  104. package/dist/runtime/world-compatibility.d.ts +20 -9
  105. package/dist/runtime/world-compatibility.d.ts.map +1 -1
  106. package/dist/runtime/world-compatibility.js +24 -13
  107. package/dist/runtime/world-init.d.ts +5 -5
  108. package/dist/runtime/world-init.js +6 -6
  109. package/dist/runtime/world.d.ts.map +1 -1
  110. package/dist/runtime/world.js +13 -3
  111. package/dist/runtime.d.ts.map +1 -1
  112. package/dist/runtime.js +417 -213
  113. package/dist/sealed-box.d.ts +7 -7
  114. package/dist/sealed-box.js +15 -15
  115. package/dist/serialization/client.js +2 -2
  116. package/dist/serialization/codec-devalue-vm.d.ts +1 -1
  117. package/dist/serialization/codec-devalue-vm.js +4 -4
  118. package/dist/serialization/codec-devalue.d.ts +1 -1
  119. package/dist/serialization/codec-devalue.js +2 -2
  120. package/dist/serialization/codec.d.ts +4 -4
  121. package/dist/serialization/codec.js +2 -2
  122. package/dist/serialization/compression.d.ts +12 -11
  123. package/dist/serialization/compression.d.ts.map +1 -1
  124. package/dist/serialization/compression.js +16 -15
  125. package/dist/serialization/encryption.d.ts +7 -7
  126. package/dist/serialization/encryption.d.ts.map +1 -1
  127. package/dist/serialization/encryption.js +8 -8
  128. package/dist/serialization/errors.js +2 -2
  129. package/dist/serialization/format.d.ts +6 -6
  130. package/dist/serialization/format.js +7 -7
  131. package/dist/serialization/hardened.d.ts +18 -18
  132. package/dist/serialization/hardened.d.ts.map +1 -1
  133. package/dist/serialization/hardened.js +41 -32
  134. package/dist/serialization/index.d.ts +1 -1
  135. package/dist/serialization/index.js +2 -2
  136. package/dist/serialization/reducers/class-vm.d.ts +1 -1
  137. package/dist/serialization/reducers/class-vm.js +2 -2
  138. package/dist/serialization/reducers/class.js +2 -2
  139. package/dist/serialization/reducers/common-vm.js +12 -12
  140. package/dist/serialization/reducers/common.js +12 -12
  141. package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
  142. package/dist/serialization/reducers/step-function-vm.js +2 -2
  143. package/dist/serialization/reducers/step-function.js +2 -2
  144. package/dist/serialization/step.js +2 -2
  145. package/dist/serialization/types.d.ts +5 -5
  146. package/dist/serialization/types.js +2 -2
  147. package/dist/serialization/workflow-vm.d.ts +1 -1
  148. package/dist/serialization/workflow-vm.d.ts.map +1 -1
  149. package/dist/serialization/workflow-vm.js +13 -10
  150. package/dist/serialization-format.d.ts +11 -11
  151. package/dist/serialization-format.d.ts.map +1 -1
  152. package/dist/serialization-format.js +29 -23
  153. package/dist/serialization.d.ts +20 -12
  154. package/dist/serialization.d.ts.map +1 -1
  155. package/dist/serialization.js +141 -99
  156. package/dist/set-attributes.js +2 -2
  157. package/dist/source-map.d.ts +1 -1
  158. package/dist/source-map.d.ts.map +1 -1
  159. package/dist/source-map.js +18 -12
  160. package/dist/step/context-storage.d.ts +5 -5
  161. package/dist/step/context-storage.js +1 -1
  162. package/dist/step/writable-stream.d.ts +3 -3
  163. package/dist/step/writable-stream.js +7 -7
  164. package/dist/step.js +12 -12
  165. package/dist/symbols.d.ts +2 -2
  166. package/dist/symbols.js +3 -3
  167. package/dist/telemetry/semantic-conventions.d.ts +21 -13
  168. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  169. package/dist/telemetry/semantic-conventions.js +21 -15
  170. package/dist/telemetry.d.ts +9 -3
  171. package/dist/telemetry.d.ts.map +1 -1
  172. package/dist/telemetry.js +40 -10
  173. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  174. package/dist/test-support/orchestrator-context.js +12 -2
  175. package/dist/version.d.ts +1 -1
  176. package/dist/version.js +2 -2
  177. package/dist/vm/index.js +4 -4
  178. package/dist/vm/script-cache.d.ts.map +1 -1
  179. package/dist/vm/script-cache.js +23 -17
  180. package/dist/vm/uint8array-base64.js +1 -1
  181. package/dist/workflow/abort-controller.d.ts +1 -1
  182. package/dist/workflow/abort-controller.js +12 -12
  183. package/dist/workflow/create-hook.js +3 -3
  184. package/dist/workflow/get-workflow-metadata.js +2 -2
  185. package/dist/workflow/hook.js +18 -18
  186. package/dist/workflow/set-attributes.d.ts +1 -1
  187. package/dist/workflow/set-attributes.js +2 -2
  188. package/dist/workflow/sleep.js +2 -2
  189. package/dist/workflow/world-init-stub.d.ts +1 -1
  190. package/dist/workflow/world-init-stub.js +2 -2
  191. package/dist/workflow.d.ts +2 -2
  192. package/dist/workflow.js +36 -14
  193. package/docs/api-reference/create-hook.mdx +15 -15
  194. package/docs/api-reference/create-webhook.mdx +15 -15
  195. package/docs/api-reference/define-hook.mdx +10 -10
  196. package/docs/api-reference/fatal-error.mdx +2 -2
  197. package/docs/api-reference/fetch.mdx +7 -7
  198. package/docs/api-reference/get-step-metadata.mdx +2 -2
  199. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  200. package/docs/api-reference/get-writable.mdx +7 -7
  201. package/docs/api-reference/index.mdx +1 -1
  202. package/docs/api-reference/retryable-error.mdx +1 -1
  203. package/docs/api-reference/set-attributes.mdx +2 -2
  204. package/docs/api-reference/sleep.mdx +3 -3
  205. package/docs/foundations/cancellation.mdx +31 -31
  206. package/docs/foundations/errors-and-retries.mdx +42 -11
  207. package/docs/foundations/hooks.mdx +37 -37
  208. package/docs/foundations/idempotency.mdx +9 -9
  209. package/docs/foundations/serialization.mdx +21 -22
  210. package/docs/foundations/starting-workflows.mdx +36 -37
  211. package/docs/foundations/streaming.mdx +68 -39
  212. package/docs/foundations/versioning.mdx +3 -3
  213. package/docs/foundations/workflows-and-steps.mdx +9 -9
  214. package/docs/how-it-works/cancellation.mdx +62 -62
  215. package/docs/how-it-works/code-transform.mdx +66 -54
  216. package/docs/how-it-works/encryption.mdx +25 -21
  217. package/docs/how-it-works/event-sourcing.mdx +84 -28
  218. package/docs/how-it-works/framework-integrations.mdx +12 -12
  219. package/docs/how-it-works/understanding-directives.mdx +21 -21
  220. package/package.json +7 -7
@@ -1,11 +1,11 @@
1
1
  /**
2
- * QuickJS WASM workflow VM.
2
+ * QuickJS WebAssembly (WASM) workflow VM.
3
3
  *
4
4
  * An alternative engine for the event-replay execution model: the workflow
5
5
  * code runs inside a QuickJS WASM VM (via quickjs-wasi) instead of a
6
6
  * `node:vm` context. Every invocation creates a fresh VM, re-executes the
7
7
  * workflow function from the top, and replays the recorded event log to
8
- * resolve awaited primitives the same replay semantics as the `node:vm`
8
+ * resolve awaited primitives: the same replay semantics as the `node:vm`
9
9
  * engine.
10
10
  *
11
11
  * The workflow primitives (useStep, sleep, createHook) are implemented as
@@ -14,11 +14,11 @@
14
14
  * resolve/reject promises.
15
15
  *
16
16
  * The VM bootstrap is deliberately split into two phases:
17
- * 1. Static initialization (`initWorkflowVM`) run-independent setup:
17
+ * 1. Static initialization (`initWorkflowVM`): run-independent setup:
18
18
  * VM creation and the workflow primitives. (Serialization lives on
19
- * the host see quickjs-serde.ts so no serde code is evaluated
19
+ * the host (see quickjs-serde.ts) so no serde code is evaluated
20
20
  * in the VM.)
21
- * 2. Per-run initialization (inline in `runQuickJSWorkflow`) seeded
21
+ * 2. Per-run initialization (inline in `runQuickJSWorkflow`): seeded
22
22
  * PRNG/ULID host functions, workflow bundle evaluation, run metadata,
23
23
  * workflow input, and start.
24
24
  * Keeping the phases separate is groundwork for VM-memory snapshotting:
@@ -80,6 +80,9 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
80
80
  var e = new Error(message);
81
81
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
82
82
  });
83
+ import { SerializationError } from '@workflow/errors';
84
+ import { globalSingleton } from '@workflow/utils';
85
+ import { isSealedNoopEvent, } from '@workflow/world';
83
86
  import * as nanoid from 'nanoid';
84
87
  import { JSException, QuickJS, } from 'quickjs-wasi';
85
88
  import seedrandom from 'seedrandom';
@@ -87,6 +90,7 @@ import { monotonicFactory } from 'ulid';
87
90
  import { runtimeLogger } from '../logger.js';
88
91
  import { decompress } from '../serialization/compression.js';
89
92
  import { decrypt } from '../serialization/encryption.js';
93
+ import { formatSerializationError } from '../serialization/errors.js';
90
94
  import { getReplayTimeoutMs, isQuickJSBaselineSnapshotEnabled, } from './constants.js';
91
95
  import { quickjsExtensions, quickjsWasm } from './quickjs-assets.generated.js';
92
96
  import { adoptSerdeRoot, captureSerdeRoot, createQuickJSSerde, exportSerdeRoot, } from './quickjs-serde.js';
@@ -96,7 +100,7 @@ import { runIdCreatedAt } from './run-id-time.js';
96
100
  * Prepare persisted payload bytes for consumption inside the VM: decrypt
97
101
  * (when an encryption key is configured) and decompress (specVersion >= 5
98
102
  * payloads may be gzip/zstd-compressed). The VM only understands plain
99
- * format-prefixed 'devl' bytes it has neither the key material nor zlib.
103
+ * format-prefixed 'devl' bytes: it has neither the key material nor zlib.
100
104
  * The key is the run's full DecryptionKey capability (symmetric AES key +
101
105
  * X25519 keypair) so sealed `encp` hook payloads from cross-deployment
102
106
  * resumeHook() calls open here too, not just symmetric `encr` ones.
@@ -860,7 +864,7 @@ globalThis[Symbol.for("WORKFLOW_GET_STREAM_ID")] = function(namespace) {
860
864
  `;
861
865
  // ---- Runtime ----
862
866
  /**
863
- * Phase 1 static (run-independent) VM initialization.
867
+ * Phase 1: static (run-independent) VM initialization.
864
868
  *
865
869
  * Creates a QuickJS VM and loads everything that does not depend on a
866
870
  * specific workflow run: the workflow-primitive bootstrap (useStep /
@@ -869,7 +873,7 @@ globalThis[Symbol.for("WORKFLOW_GET_STREAM_ID")] = function(namespace) {
869
873
  * right after this returns.
870
874
  *
871
875
  * `getNowMs` backs the VM's WASI clock (`Date.now()` / `new Date()`
872
- * inside the VM). The callback itself is static the per-run state it
876
+ * inside the VM). The callback itself is static: the per-run state it
873
877
  * reads lives on the host and is advanced as events are consumed,
874
878
  * matching the node:vm engine's deterministic replay clock.
875
879
  *
@@ -889,14 +893,19 @@ const WebAssemblyGlobal = globalThis.WebAssembly;
889
893
  * Process-wide cache of the compiled `WebAssembly.Module`s for the main
890
894
  * QuickJS runtime and its native extensions. `WebAssembly.compile` of the
891
895
  * ~600 KB runtime binary is the most expensive part of VM creation and is
892
- * pure (no per-VM state instantiation binds the per-VM memory), so it
896
+ * pure (no per-VM state: instantiation binds the per-VM memory), so it
893
897
  * only needs to happen once per process. The promise is cached (not the
894
898
  * result) so concurrent first invocations share a single compilation.
895
899
  */
896
- let compiledAssetsPromise;
900
+ // On `globalThis` (see `globalSingleton`): the comment above says once per
901
+ // process, and module scope would make it once per bundler layer, recompiling
902
+ // the ~600 KB runtime binary for each.
903
+ const quickjsAssets = globalSingleton('@workflow/core//quickjsCompiledAssets', 1, () => ({
904
+ promise: undefined,
905
+ }));
897
906
  function getCompiledAssets() {
898
- if (!compiledAssetsPromise) {
899
- compiledAssetsPromise = (async () => {
907
+ if (!quickjsAssets.promise) {
908
+ quickjsAssets.promise = (async () => {
900
909
  const [wasm, ...extensionModules] = await Promise.all([
901
910
  WebAssemblyGlobal.compile(quickjsWasm),
902
911
  ...quickjsExtensions.map((ext) => WebAssemblyGlobal.compile(ext.wasm)),
@@ -911,14 +920,14 @@ function getCompiledAssets() {
911
920
  })();
912
921
  // On failure, clear the cache so a later invocation can retry rather
913
922
  // than being stuck with a rejected promise forever.
914
- compiledAssetsPromise.catch(() => {
915
- compiledAssetsPromise = undefined;
923
+ quickjsAssets.promise.catch(() => {
924
+ quickjsAssets.promise = undefined;
916
925
  });
917
926
  }
918
- return compiledAssetsPromise;
927
+ return quickjsAssets.promise;
919
928
  }
920
929
  /**
921
- * WASI clock override reading the given accessor shared between fresh
930
+ * WASI clock override reading the given accessor, shared between fresh
922
931
  * boots (initWorkflowVM) and baseline-snapshot restores, so the two
923
932
  * paths cannot drift on rounding/encoding.
924
933
  *
@@ -963,14 +972,14 @@ async function initWorkflowVM(getNowMs, interruptBudget) {
963
972
  // run-seeded PRNG and the run's deterministic clock. A restored heap
964
973
  // carries whatever module scope computed at HYDRATE time, so the
965
974
  // optimization is only sound when module scope consumed neither
966
- // randomness nor time. Both are detected during hydrate the placeholder
967
- // host fns count draws, the hydrate clock counts reads and a bundle
975
+ // randomness nor time. Both are detected during hydrate (the placeholder
976
+ // host fns count draws, the hydrate clock counts reads) and a bundle
968
977
  // that used either is marked ineligible: every invocation falls back to
969
978
  // fresh evaluation, preserving exact node:vm-parity semantics. When the
970
979
  // gate passes, restore is byte-equivalent to fresh eval (verified by the
971
980
  // parity tests): the per-run host fns are re-registered by name on the
972
981
  // restored VM (quickjs-wasi restore semantics) before the workflow body
973
- // runs, so the seeded draw sequence and every correlationId is
982
+ // runs, so the seeded draw sequence (and every correlationId) is
974
983
  // identical.
975
984
  //
976
985
  // The cache is per function instance and keyed on the bundle string
@@ -981,27 +990,32 @@ async function initWorkflowVM(getNowMs, interruptBudget) {
981
990
  * Eval filename used when hydrating the baseline VM. The baseline is
982
991
  * shared by EVERY workflow in the bundle, so the filename baked into
983
992
  * its compiled code (and therefore into snapshot-path stack frames)
984
- * must be workflow-independent hydrating under the first caller's
993
+ * must be workflow-independent: hydrating under the first caller's
985
994
  * workflowId would break `remapErrorStack`'s filename matching for
986
995
  * every other workflow in the bundle. Remap call sites match this
987
996
  * constant IN ADDITION to the run's module specifier (which covers
988
997
  * fresh-path frames).
989
998
  */
990
999
  export const BASELINE_BUNDLE_FILENAME = 'workflow-bundle.js';
991
- const baselineCache = new Map();
1000
+ // On `globalThis` (see `globalSingleton`): a snapshot is expensive to build and
1001
+ // is keyed by bundle, so per-copy caches would build the same baseline once per
1002
+ // bundler layer while each enforcing its own bound.
1003
+ const baselines = globalSingleton('@workflow/core//quickjsBaselines', 1, () => ({
1004
+ byKey: new Map(),
1005
+ }));
992
1006
  const BASELINE_CACHE_MAX_ENTRIES = 4;
993
1007
  /** Test-only: reset the baseline cache between test cases. */
994
1008
  export function __clearBaselineSnapshotCacheForTests() {
995
- baselineCache.clear();
1009
+ baselines.byKey.clear();
996
1010
  }
997
1011
  /** Test-only: observe how a bundle was classified. */
998
1012
  export async function __peekBaselineEntryForTests(workflowCode) {
999
- return baselineCache.get(workflowCode);
1013
+ return baselines.byKey.get(workflowCode);
1000
1014
  }
1001
1015
  /**
1002
1016
  * Hydrate a VM with the workflow bundle and snapshot it, gating on
1003
1017
  * module-scope nondeterminism (see the section comment above). Returns an
1004
- * `ineligible` entry instead of throwing on eval failure the fresh path
1018
+ * `ineligible` entry instead of throwing on eval failure: the fresh path
1005
1019
  * re-evaluates and produces the real, source-mapped error.
1006
1020
  */
1007
1021
  async function prepareBaselineSnapshot(workflowCode, workflowId) {
@@ -1060,7 +1074,7 @@ async function prepareBaselineSnapshot(workflowCode, workflowId) {
1060
1074
  __disposeResources(env_1);
1061
1075
  }
1062
1076
  }
1063
- // Serde capture root created BEFORE the bundle evaluates, exactly
1077
+ // Serde capture root: created BEFORE the bundle evaluates, exactly
1064
1078
  // like the fresh path's capture. Its box pointer rides the
1065
1079
  // BaselineEntry and each restored VM re-adopts it, so serde
1066
1080
  // initialization never executes guest code after user code has run.
@@ -1070,13 +1084,13 @@ async function prepareBaselineSnapshot(workflowCode, workflowId) {
1070
1084
  // serde uses the pristine pre-eval captures on both paths, and no
1071
1085
  // post-eval probe exists whose side effects could bake into the
1072
1086
  // snapshot. The handle is deliberately NOT disposed before the
1073
- // snapshot the box must stay live in the memory image (the
1087
+ // snapshot: the box must stay live in the memory image (the
1074
1088
  // baseline VM's dispose below tears down the whole instance without
1075
1089
  // freeing individual boxes).
1076
1090
  const serdeRoot = captureSerdeRoot(vm);
1077
1091
  clockReads = 0; // only count reads made by the bundle itself
1078
1092
  try {
1079
- // Workflow-independent filename see BASELINE_BUNDLE_FILENAME.
1093
+ // Workflow-independent filename. See BASELINE_BUNDLE_FILENAME.
1080
1094
  vm.evalCode(workflowCode, BASELINE_BUNDLE_FILENAME).dispose();
1081
1095
  }
1082
1096
  catch {
@@ -1112,20 +1126,20 @@ async function prepareBaselineSnapshot(workflowCode, workflowId) {
1112
1126
  /**
1113
1127
  * Cached baseline entry for a bundle, preparing it on first access.
1114
1128
  * Concurrent first invocations share one hydrate via the cached promise;
1115
- * a hydrate that REJECTS (infrastructure failure, not bundle eval — that
1129
+ * a hydrate that REJECTS (infrastructure failure, not bundle eval, which
1116
1130
  * returns `ineligible`) is evicted so a later invocation can retry.
1117
1131
  */
1118
1132
  function getBaselineEntry(workflowCode, workflowId) {
1119
- let entry = baselineCache.get(workflowCode);
1133
+ let entry = baselines.byKey.get(workflowCode);
1120
1134
  if (!entry) {
1121
- if (baselineCache.size >= BASELINE_CACHE_MAX_ENTRIES) {
1122
- const oldest = baselineCache.keys().next().value;
1135
+ if (baselines.byKey.size >= BASELINE_CACHE_MAX_ENTRIES) {
1136
+ const oldest = baselines.byKey.keys().next().value;
1123
1137
  if (oldest !== undefined)
1124
- baselineCache.delete(oldest);
1138
+ baselines.byKey.delete(oldest);
1125
1139
  }
1126
1140
  entry = prepareBaselineSnapshot(workflowCode, workflowId);
1127
- baselineCache.set(workflowCode, entry);
1128
- entry.catch(() => baselineCache.delete(workflowCode));
1141
+ baselines.byKey.set(workflowCode, entry);
1142
+ entry.catch(() => baselines.byKey.delete(workflowCode));
1129
1143
  }
1130
1144
  return entry;
1131
1145
  }
@@ -1142,7 +1156,7 @@ export async function runQuickJSWorkflow(options) {
1142
1156
  export async function startQuickJSWorkflow(options) {
1143
1157
  const { workflowCode, workflowId, workflowRun, events } = options;
1144
1158
  const startedAt = workflowRun.startedAt ? +workflowRun.startedAt : Date.now();
1145
- // Deterministic PRNG seed identical for EVERY invocation of the same
1159
+ // Deterministic PRNG seed, identical for EVERY invocation of the same
1146
1160
  // run. Full event replay requires this: each invocation re-executes the
1147
1161
  // workflow from the top and must regenerate the exact same correlationId
1148
1162
  // sequence so that pending operations re-created by replay match the
@@ -1165,7 +1179,7 @@ export async function startQuickJSWorkflow(options) {
1165
1179
  workflowRun.deploymentId,
1166
1180
  ].join(':');
1167
1181
  const rng = seedrandom(seed);
1168
- // Seeded nanoid generator uses the same nanoid package and seeded PRNG
1182
+ // Seeded nanoid generator: uses the same nanoid package and seeded PRNG
1169
1183
  // as the node:vm engine for consistent token generation.
1170
1184
  const generateNanoid = nanoid.customRandom(nanoid.urlAlphabet, 21, (size) => new Uint8Array(size).map(() => 256 * rng()));
1171
1185
  // Deterministic replay clock, mirroring the node:vm engine (see
@@ -1200,7 +1214,7 @@ export async function startQuickJSWorkflow(options) {
1200
1214
  catch (err) {
1201
1215
  // A rejection here is an infrastructure failure during hydrate
1202
1216
  // (e.g. vm.snapshot() under memory pressure, QuickJS.create or
1203
- // getCompiledAssets() failing) NOT bundle eval, which returns
1217
+ // getCompiledAssets() failing), NOT bundle eval, which returns
1204
1218
  // an ineligible entry. getBaselineEntry has already evicted the
1205
1219
  // cached promise so a later invocation can retry. This invocation
1206
1220
  // must fall back to fresh evaluation (which would have succeeded)
@@ -1224,10 +1238,10 @@ export async function startQuickJSWorkflow(options) {
1224
1238
  }
1225
1239
  // Host-side serde: captures the VM's intrinsics (bootstrap included)
1226
1240
  // before any user code runs. All serialization now happens on the host
1227
- // through handles no serializer code is evaluated inside the VM.
1228
- // Fresh path: capture now (no user code has run the bundle evaluates
1241
+ // through handles: no serializer code is evaluated inside the VM.
1242
+ // Fresh path: capture now (no user code has run, as the bundle evaluates
1229
1243
  // later in the per-run phase). Snapshot path: re-adopt the capture root
1230
- // the baseline hydrate created BEFORE the bundle evaluated the box
1244
+ // the baseline hydrate created BEFORE the bundle evaluated, since the box
1231
1245
  // lives in the restored memory image at the recorded offset. Both give
1232
1246
  // the serde pristine capture-before-user-code intrinsics; neither
1233
1247
  // executes guest code here.
@@ -1237,7 +1251,7 @@ export async function startQuickJSWorkflow(options) {
1237
1251
  // Any throw between here and the terminal paths (which dispose the VM
1238
1252
  // inside checkWorkflowState / extractError before RETURNING) would leak
1239
1253
  // a live QuickJS instance and its WASM linear memory for the lifetime
1240
- // of the compute instance which is reused. Dispose on the way out of
1254
+ // of the compute instance, which is reused. Dispose on the way out of
1241
1255
  // an exceptional exit and rethrow.
1242
1256
  try {
1243
1257
  return await runWorkflowInVM();
@@ -1247,7 +1261,7 @@ export async function startQuickJSWorkflow(options) {
1247
1261
  vm.dispose();
1248
1262
  }
1249
1263
  catch {
1250
- // Already disposed by a terminal path ignore.
1264
+ // Already disposed by a terminal path, so ignore.
1251
1265
  }
1252
1266
  throw err;
1253
1267
  }
@@ -1287,11 +1301,11 @@ export async function startQuickJSWorkflow(options) {
1287
1301
  }
1288
1302
  // Host-side deterministic ULID generator for correlationIds. Uses the
1289
1303
  // same `ulid` package and monotonic factory as before, drawing from
1290
- // the SAME seeded PRNG instance as the VM's Math.random so the
1304
+ // the SAME seeded PRNG instance as the VM's Math.random, so the
1291
1305
  // interleaved draw sequence (and therefore every correlationId) is
1292
1306
  // byte-identical to what the previous in-VM ULID factory produced for
1293
1307
  // the same run. The time prefix is derived from the runId's embedded
1294
- // ULID (stable across invocations by construction unlike
1308
+ // ULID (stable across invocations by construction, unlike
1295
1309
  // `startedAt`, which differs between turbo's synthesized run object
1296
1310
  // and the durably stored run), so two concurrent invocations of the
1297
1311
  // same run produce IDENTICAL correlationIds and the world's
@@ -1313,16 +1327,16 @@ export async function startQuickJSWorkflow(options) {
1313
1327
  __disposeResources(env_4);
1314
1328
  }
1315
1329
  }
1316
- // `process.env` parity with the node:vm engine, which exposes a frozen
1330
+ // `process.env`: parity with the node:vm engine, which exposes a frozen
1317
1331
  // copy of the host env (vm/index.ts). Injected per run so the snapshot of
1318
1332
  // the env is taken at invocation time, same as node. Handle-based (no
1319
1333
  // guest source evaluated): on the baseline-snapshot path this runs
1320
1334
  // after user code, and a guest-source injection would execute through
1321
- // potentially patched globals (JSON.parse, Object.freeze) visible
1335
+ // potentially patched globals (JSON.parse, Object.freeze), visible
1322
1336
  // to module-scope wrappers only on the restore path, diverging
1323
1337
  // replays.
1324
1338
  serde.installProcessEnv(process.env);
1325
- // Execute the workflow bundle use the workflowId as the eval filename
1339
+ // Execute the workflow bundle: use the workflowId as the eval filename
1326
1340
  // so QuickJS stack traces reference the workflow name, enabling source map
1327
1341
  // remapping by remapErrorStack (which matches frames by filename).
1328
1342
  // Evaluated in the per-run phase (after Math.random seeding) so that
@@ -1330,7 +1344,7 @@ export async function startQuickJSWorkflow(options) {
1330
1344
  // node:vm engine's replay determinism. Skipped on the
1331
1345
  // baseline-snapshot path: the restored heap already carries the
1332
1346
  // evaluated bundle, and the baseline gate guarantees module scope
1333
- // consumed no PRNG draws or clock reads so skipping the eval is
1347
+ // consumed no PRNG draws or clock reads, so skipping the eval is
1334
1348
  // observationally identical to re-running it (the run-seeded host
1335
1349
  // fns registered above rebind the SAME names the restored heap's
1336
1350
  // function objects dispatch through).
@@ -1345,7 +1359,7 @@ export async function startQuickJSWorkflow(options) {
1345
1359
  // Extract workflow arguments. Prefer the run_created event; fall back
1346
1360
  // to the queue message's runInput if the event log is incomplete
1347
1361
  // (eventually-consistent read after start()). Failing to find input
1348
- // for a first invocation is fatal running the workflow function
1362
+ // for a first invocation is fatal: running the workflow function
1349
1363
  // with no args would silently turn typed arguments into `undefined`
1350
1364
  // and, for recursive workflows, produce exponential fan-out.
1351
1365
  const runCreatedEvent = events.find((e) => e.eventType === 'run_created');
@@ -1370,13 +1384,13 @@ export async function startQuickJSWorkflow(options) {
1370
1384
  // The event log is non-empty (we got run_started or similar) but
1371
1385
  // no run_created event was found and no queue-provided runInput is
1372
1386
  // available. This is the race condition observed during the fib
1373
- // incident silently dropping arguments would turn `n` into
1387
+ // incident: silently dropping arguments would turn `n` into
1374
1388
  // `undefined` and, for recursive workflows, cause exponential
1375
1389
  // fan-out. Fail loud: the throw escapes the entrypoint into the
1376
1390
  // replay loop's catch in runtime.ts (the QuickJS dispatch runs
1377
1391
  // inside that loop's try), which records run_failed. A visible
1378
1392
  // terminal failure is
1379
- // preferred over silently executing with undefined arguments — the
1393
+ // preferred over silently executing with undefined arguments. The
1380
1394
  // queue-provided runInput fallback above makes this path rare.
1381
1395
  // Empty `events` is allowed because tests that bootstrap a workflow
1382
1396
  // with no arguments rely on the old permissive behavior.
@@ -1465,7 +1479,7 @@ export async function startQuickJSWorkflow(options) {
1465
1479
  } while (batch > 0);
1466
1480
  } while (madeProgress && --maxIterations > 0);
1467
1481
  if (madeProgress && maxIterations === 0) {
1468
- // The drain loop hit its bound while still making progress
1482
+ // The drain loop hit its bound while still making progress:
1469
1483
  // proceeding as if it converged would present as a mysterious
1470
1484
  // suspension or replay divergence. Make the giving-up visible so
1471
1485
  // a wedge is attributable to this bound rather than a mystery.
@@ -1503,7 +1517,7 @@ function makeLiveSession(vm, serde, interruptBudget, advanceClock, encryptionKey
1503
1517
  if (!alive) {
1504
1518
  throw new Error('QuickJS workflow session is not alive — continueWithEvents is only valid while suspended');
1505
1519
  }
1506
- // Fresh execution burst the interrupt budget bounds VM compute,
1520
+ // Fresh execution burst: the interrupt budget bounds VM compute,
1507
1521
  // not wall time spent waiting on inline steps between bursts.
1508
1522
  interruptBudget.start = Date.now();
1509
1523
  let maxIterations = 100;
@@ -1532,7 +1546,7 @@ function makeLiveSession(vm, serde, interruptBudget, advanceClock, encryptionKey
1532
1546
  vm.dispose();
1533
1547
  }
1534
1548
  catch {
1535
- // Already disposed ignore.
1549
+ // Already disposed, so ignore.
1536
1550
  }
1537
1551
  }
1538
1552
  },
@@ -1543,9 +1557,21 @@ function makeLiveSession(vm, serde, interruptBudget, advanceClock, encryptionKey
1543
1557
  async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1544
1558
  let resolved = false;
1545
1559
  for (const event of events) {
1560
+ // A sealed-log noop occupies a slot whose writer died; the run never
1561
+ // observed it. Step over it BEFORE the clock line below, not at the
1562
+ // switch: its `createdAt` is the sealer's wall clock and can postdate
1563
+ // every real event around it, so advancing to it would leak the sealer's
1564
+ // schedule into replay. Because the clock is monotonic, every later
1565
+ // Date.now() in the run with it. That would make a log whose hole was
1566
+ // sealed replay differently from the same log whose hole its own writer
1567
+ // filled, and differently from this log on the node:vm engine, which
1568
+ // skips noops in `EventsConsumer` before `onConsumedEvent` feeds the
1569
+ // clock. Same rule, both engines, one predicate.
1570
+ if (isSealedNoopEvent(event))
1571
+ continue;
1546
1572
  // Advance the VM's deterministic clock to this event's creation time
1547
1573
  // BEFORE resolving anything, so workflow code unblocked by this event
1548
- // observes Date.now() at (or after the clock is monotonic) the time
1574
+ // observes Date.now() at (or after, since the clock is monotonic) the time
1549
1575
  // the event was recorded. Mirrors the node:vm engine's
1550
1576
  // `onConsumedEvent → updateTimestamp(+event.createdAt)`.
1551
1577
  advanceClock(+event.createdAt);
@@ -1566,7 +1592,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1566
1592
  const rawOutput = eventData?.result ?? eventData?.output;
1567
1593
  if (hasResolver) {
1568
1594
  if (rawOutput instanceof Uint8Array) {
1569
- // Decrypt if encrypted the VM only understands 'devl' format
1595
+ // Decrypt if encrypted: the VM only understands 'devl' format
1570
1596
  runtimeLogger.debug('QuickJS runtime: step result raw', {
1571
1597
  correlationId: cid,
1572
1598
  rawPrefix: new TextDecoder().decode(rawOutput.subarray(0, 4)),
@@ -1608,7 +1634,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1608
1634
  }
1609
1635
  }
1610
1636
  else {
1611
- // No resolver yet buffer the prepared outcome so the promise
1637
+ // No resolver yet, so buffer the prepared outcome so the promise
1612
1638
  // settles the moment the VM constructs it (see __terminalBuffer
1613
1639
  // in the bootstrap). Without this, the live-continuation path
1614
1640
  // (which scans each delta exactly once) drops the terminal and
@@ -1683,7 +1709,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1683
1709
  }
1684
1710
  }
1685
1711
  else {
1686
- // No resolver yet buffer the prepared rejection (see the
1712
+ // No resolver yet, so buffer the prepared rejection (see the
1687
1713
  // step_completed branch above for the rationale).
1688
1714
  const errorData = eventData?.error;
1689
1715
  if (errorData instanceof Uint8Array) {
@@ -1727,7 +1753,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1727
1753
  }
1728
1754
  }
1729
1755
  else {
1730
- // No resolver yet buffer (see step_completed above).
1756
+ // No resolver yet, so buffer (see step_completed above).
1731
1757
  vm.evalCode(`globalThis.__terminalBuffer[${cidJs}] = { kind: "resolve_undefined" };`).dispose();
1732
1758
  }
1733
1759
  markCreated(vm, cidJs);
@@ -1743,7 +1769,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1743
1769
  break;
1744
1770
  const hasResolver = vm.dump(vm.evalCode(`!!globalThis.__resolvers[${cidJs}]`));
1745
1771
  if (!hasResolver) {
1746
- // No resolver yet buffer (see step_completed above).
1772
+ // No resolver yet, so buffer (see step_completed above).
1747
1773
  vm.evalCode(`globalThis.__terminalBuffer[${cidJs}] = { kind: "resolve_undefined" };`).dispose();
1748
1774
  }
1749
1775
  if (hasResolver) {
@@ -1779,7 +1805,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1779
1805
  // EventsConsumer in workflow/hook.ts): two hook_received rows for
1780
1806
  // ONE resume attempt share a client-minted `resumeId` (a duplicate
1781
1807
  // can be committed when the materialization fallback races a
1782
- // delayed direct write hook_received has no storage uniqueness
1808
+ // delayed direct write, since hook_received has no storage uniqueness
1783
1809
  // constraint). Deliver only the first-in-log occurrence. The seen
1784
1810
  // set lives in the VM heap so it is deterministic per replay and
1785
1811
  // survives event re-scans within the invocation. Events without a
@@ -1787,8 +1813,8 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1787
1813
  {
1788
1814
  // Top-level event.resumeId is the canonical location (the backend
1789
1815
  // hoists it to a first-class column); the nested
1790
- // eventData.resumeId form is a deprecated legacy fallback
1791
- // mirrors the node engine's dedup in workflow/hook.ts.
1816
+ // eventData.resumeId form is a deprecated legacy fallback.
1817
+ // Mirrors the node engine's dedup in workflow/hook.ts.
1792
1818
  const resumeId = event.resumeId ??
1793
1819
  eventData?.resumeId;
1794
1820
  if (typeof resumeId === 'string') {
@@ -1825,7 +1851,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1825
1851
  else {
1826
1852
  vm.evalCode(`globalThis.__abortSignals[${cidJs}]._setAborted(undefined);`).dispose();
1827
1853
  }
1828
- // The abort is durably recorded clear the pending op's
1854
+ // The abort is durably recorded, so clear the pending op's
1829
1855
  // abortRequested marker so the host doesn't re-record it (the
1830
1856
  // workflow's own abort() call can set the flag before this
1831
1857
  // event is processed when it happens later in replay order,
@@ -1861,7 +1887,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1861
1887
  });
1862
1888
  if (hasResolver) {
1863
1889
  if (rawPayload instanceof Uint8Array) {
1864
- // Decrypt if encrypted the VM only understands 'devl' format
1890
+ // Decrypt if encrypted: the VM only understands 'devl' format
1865
1891
  const decryptedPayload = await prepareBytesForVM(rawPayload, encryptionKey);
1866
1892
  const payloadHandle = serde.deserialize(decryptedPayload);
1867
1893
  vm.setProp(vm.global, '__tmp_result', payloadHandle);
@@ -1891,7 +1917,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1891
1917
  }
1892
1918
  }
1893
1919
  else {
1894
- // No resolver yet buffer the payload in the VM heap. When
1920
+ // No resolver yet, so buffer the payload in the VM heap. When
1895
1921
  // createHookPromise() is called later, it will drain this buffer
1896
1922
  // first (matching the node:vm engine's payloadsQueue behavior).
1897
1923
  const eventIdJs = event.eventId
@@ -1903,7 +1929,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1903
1929
  ? `(globalThis.__hookPayloadBuffer.__processedEventIds = globalThis.__hookPayloadBuffer.__processedEventIds || {})[${eventIdJs}] = true;`
1904
1930
  : '');
1905
1931
  if (rawPayload instanceof Uint8Array) {
1906
- // Decrypt if encrypted the VM only understands 'devl' format
1932
+ // Decrypt if encrypted: the VM only understands 'devl' format
1907
1933
  const decryptedPayload = await prepareBytesForVM(rawPayload, encryptionKey);
1908
1934
  const payloadHandle = serde.deserialize(decryptedPayload);
1909
1935
  vm.setProp(vm.global, '__tmp_result', payloadHandle);
@@ -1931,7 +1957,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
1931
1957
  // with HookConflictError; getConflict() awaiters resolve with a
1932
1958
  // Run handle for the conflicting run (revived through the VM's
1933
1959
  // class registry so its methods are durable step proxies) or
1934
- // reject with the error when no handle can be constructed
1960
+ // reject with the error when no handle can be constructed,
1935
1961
  // mirroring the node:vm engine's hook.ts hook_conflict handling.
1936
1962
  const conflictToken = eventData?.token ?? 'unknown';
1937
1963
  const conflictingRunId = eventData?.conflictingRunId;
@@ -2017,7 +2043,7 @@ async function processEvents(vm, serde, events, advanceClock, encryptionKey) {
2017
2043
  }
2018
2044
  case 'hook_disposed': {
2019
2045
  // Disambiguate from the `hook` pending op with the same
2020
- // correlationId we want to mark the `hook_dispose` entry.
2046
+ // correlationId: we want to mark the `hook_dispose` entry.
2021
2047
  markCreated(vm, cidJs, 'hook_dispose');
2022
2048
  break;
2023
2049
  }
@@ -2029,7 +2055,7 @@ function markCreated(vm, cidJs, opType) {
2029
2055
  // `cidJs` is the JSON.stringify-quoted correlation id (see processEvents).
2030
2056
  // `hook` and `hook_dispose` pending ops share the same correlationId,
2031
2057
  // so when processing `hook_disposed` events we must disambiguate by
2032
- // type otherwise `.find()` returns the original `hook` op and the
2058
+ // type: otherwise `.find()` returns the original `hook` op and the
2033
2059
  // `hook_dispose` op is never marked, causing the entrypoint to keep
2034
2060
  // retrying a hook_disposed for an already-deleted entity.
2035
2061
  const predicate = opType
@@ -2054,6 +2080,9 @@ function markCreated(vm, cidJs, opType) {
2054
2080
  * its bytes are computed once even though the op is re-collected on every
2055
2081
  * suspension it stays pending through.
2056
2082
  */
2083
+ // per-copy-ok: keyed on the VM instance, and a VM is created and driven by one
2084
+ // copy. Another copy holds no reference to the key, so a shared map could never
2085
+ // be read from it.
2057
2086
  const pendingByteCache = new WeakMap();
2058
2087
  function ensurePendingByteCache(vm) {
2059
2088
  let cache = pendingByteCache.get(vm);
@@ -2112,7 +2141,7 @@ function dumpPendingOps(vm, serde, filterExpr, byteCache) {
2112
2141
  // Byte-cache eviction: entries for settled ops can never be read again
2113
2142
  // (neither collection filter matches a settled op), so dropping them
2114
2143
  // bounds the cache by the LIVE pending set instead of growing
2115
- // monotonically for the VM's lifetime which matters for the inline
2144
+ // monotonically for the VM's lifetime, which matters for the inline
2116
2145
  // loop's long-lived sessions and snapshot-restored VMs.
2117
2146
  if (byteCache && dumped.settled.length > 0) {
2118
2147
  for (const cid of dumped.settled) {
@@ -2135,7 +2164,27 @@ function dumpPendingOps(vm, serde, filterExpr, byteCache) {
2135
2164
  const env_6 = { stack: [], error: void 0, hasError: false };
2136
2165
  try {
2137
2166
  const valueHandle = __addDisposableResource(env_6, rawFields.getProp(String(index)), false);
2138
- bytes = serde.serialize(valueHandle);
2167
+ try {
2168
+ bytes = serde.serialize(valueHandle);
2169
+ }
2170
+ catch (err) {
2171
+ // A step input that refuses to serialize is a deterministic user
2172
+ // error: failing the whole collection here would fail the run
2173
+ // from the outside, where no workflow code can observe it (and
2174
+ // with a bare DevalueError instead of the framed message the
2175
+ // node:vm engine produces). Reframe it exactly like
2176
+ // `dehydrateStepArguments` does and surface it on the op: the
2177
+ // entrypoint finalizes the step as step_created + step_failed so
2178
+ // the failure rejects into the workflow, catchable. Other raw
2179
+ // fields (hook metadata, abort payloads) keep the throwing
2180
+ // behavior, matching the node:vm engine's scope.
2181
+ if (op.type === 'step' && field === 'input') {
2182
+ const { message, hint } = formatSerializationError('step arguments', err);
2183
+ op.serializationError = new SerializationError(message, { hint, cause: err });
2184
+ continue;
2185
+ }
2186
+ throw err;
2187
+ }
2139
2188
  byteCache?.set(cacheKey, bytes);
2140
2189
  }
2141
2190
  catch (e_5) {
@@ -2163,7 +2212,7 @@ function dumpPendingOps(vm, serde, filterExpr, byteCache) {
2163
2212
  function collectDrainOperations(vm, serde) {
2164
2213
  // Share the per-VM byte cache with the suspension path: an op that was
2165
2214
  // serialized during a suspension pass must reuse those exact bytes at
2166
- // terminal drain re-serializing can invoke getters again and produce
2215
+ // terminal drain, since re-serializing can invoke getters again and produce
2167
2216
  // a DIFFERENT byte sequence for what the event log treats as one value.
2168
2217
  return dumpPendingOps(vm, serde, `(function(){
2169
2218
  var toDispose = [];
@@ -2192,7 +2241,7 @@ function collectDrainOperations(vm, serde) {
2192
2241
  })()`, ensurePendingByteCache(vm));
2193
2242
  }
2194
2243
  function checkWorkflowState(vm, serde, opts = {}) {
2195
- // Check completed __workflowResult holds the RAW return value (with a
2244
+ // Check completed: __workflowResult holds the RAW return value (with a
2196
2245
  // separate done flag so `undefined` results are distinguishable); the
2197
2246
  // host serializes it through a handle.
2198
2247
  {
@@ -2264,7 +2313,7 @@ function checkWorkflowState(vm, serde, opts = {}) {
2264
2313
  }
2265
2314
  catch (serializeErr) {
2266
2315
  // A thrown value the codec cannot serialize must not mask the
2267
- // workflow failure itself fall back to the display fields.
2316
+ // workflow failure itself, so fall back to the display fields.
2268
2317
  runtimeLogger.warn('QuickJS runtime: failed to serialize thrown workflow error', {
2269
2318
  message: serializeErr instanceof Error
2270
2319
  ? serializeErr.message
@@ -2311,7 +2360,7 @@ function checkWorkflowState(vm, serde, opts = {}) {
2311
2360
  __disposeResources(env_9);
2312
2361
  }
2313
2362
  }
2314
- // Check suspended the workflow is suspended if there are active resolvers
2363
+ // Check suspended: the workflow is suspended if there are active resolvers
2315
2364
  // OR pending operations that haven't been created yet (e.g. hooks created
2316
2365
  // upfront but not yet awaited)
2317
2366
  {
@@ -2369,4 +2418,4 @@ function createInterruptHandler(budget) {
2369
2418
  const timeout = getReplayTimeoutMs();
2370
2419
  return () => Date.now() - budget.start > timeout;
2371
2420
  }
2372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRSCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBRUwsV0FBVyxFQUNYLE9BQU8sR0FHUixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGdDQUFnQyxHQUNqQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsZUFBZSxHQUVoQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVsRCwyQ0FBMkM7QUFFM0M7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQzlCLElBQWdCLEVBQ2hCLEdBQW1CO0lBRW5CLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FB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QUFDO0lBQzdDLENBQUM7U0FBTSxJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxlQUFlLENBQUM7UUFDekMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDbEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDbEIsQ0FBQztJQUVELEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNiLE9BQU87UUFDTCxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQXFCRCxTQUFTLHNCQUFzQixDQUFDLE1BQXVCO0lBQ3JELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDckMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUM7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVpY2tKUyBXQVNNIHdvcmtmbG93IFZNLlxuICpcbiAqIEFuIGFsdGVybmF0aXZlIGVuZ2luZSBmb3IgdGhlIGV2ZW50LXJlcGxheSBleGVjdXRpb24gbW9kZWw6IHRoZSB3b3JrZmxvd1xuICogY29kZSBydW5zIGluc2lkZSBhIFF1aWNrSlMgV0FTTSBWTSAodmlhIHF1aWNranMtd2FzaSkgaW5zdGVhZCBvZiBhXG4gKiBgbm9kZTp2bWAgY29udGV4dC4gRXZlcnkgaW52b2NhdGlvbiBjcmVhdGVzIGEgZnJlc2ggVk0sIHJlLWV4ZWN1dGVzIHRoZVxuICogd29ya2Zsb3cgZnVuY3Rpb24gZnJvbSB0aGUgdG9wLCBhbmQgcmVwbGF5cyB0aGUgcmVjb3JkZWQgZXZlbnQgbG9nIHRvXG4gKiByZXNvbHZlIGF3YWl0ZWQgcHJpbWl0aXZlcyDigJQgdGhlIHNhbWUgcmVwbGF5IHNlbWFudGljcyBhcyB0aGUgYG5vZGU6dm1gXG4gKiBlbmdpbmUuXG4gKlxuICogVGhlIHdvcmtmbG93IHByaW1pdGl2ZXMgKHVzZVN0ZXAsIHNsZWVwLCBjcmVhdGVIb29rKSBhcmUgaW1wbGVtZW50ZWQgYXNcbiAqIEphdmFTY3JpcHQgY29kZSBydW5uaW5nIGluc2lkZSB0aGUgUXVpY2tKUyBWTS4gVGhlIGhvc3QgY29tbXVuaWNhdGVzIHdpdGhcbiAqIHRoZSBWTSBieSBldmFsdWF0aW5nIHNtYWxsIEpTIHNuaXBwZXRzIHRvIHJlYWQgcGVuZGluZyBvcGVyYXRpb25zIGFuZFxuICogcmVzb2x2ZS9yZWplY3QgcHJvbWlzZXMuXG4gKlxuICogVGhlIFZNIGJvb3RzdHJhcCBpcyBkZWxpYmVyYXRlbHkgc3BsaXQgaW50byB0d28gcGhhc2VzOlxuICogICAxLiBTdGF0aWMgaW5pdGlhbGl6YXRpb24gKGBpbml0V29ya2Zsb3dWTWApIOKAlCBydW4taW5kZXBlbmRlbnQgc2V0dXA6XG4gKiAgICAgIFZNIGNyZWF0aW9uIGFuZCB0aGUgd29ya2Zsb3cgcHJpbWl0aXZlcy4gKFNlcmlhbGl6YXRpb24gbGl2ZXMgb25cbiAqICAgICAgdGhlIGhvc3Qg4oCUIHNlZSBxdWlja2pzLXNlcmRlLnRzIOKAlCBzbyBubyBzZXJkZSBjb2RlIGlzIGV2YWx1YXRlZFxuICogICAgICBpbiB0aGUgVk0uKVxuICogICAyLiBQZXItcnVuIGluaXRpYWxpemF0aW9uIChpbmxpbmUgaW4gYHJ1blF1aWNrSlNXb3JrZmxvd2ApIOKAlCBzZWVkZWRcbiAqICAgICAgUFJORy9VTElEIGhvc3QgZnVuY3Rpb25zLCB3b3JrZmxvdyBidW5kbGUgZXZhbHVhdGlvbiwgcnVuIG1ldGFkYXRhLFxuICogICAgICB3b3JrZmxvdyBpbnB1dCwgYW5kIHN0YXJ0LlxuICogS2VlcGluZyB0aGUgcGhhc2VzIHNlcGFyYXRlIGlzIGdyb3VuZHdvcmsgZm9yIFZNLW1lbW9yeSBzbmFwc2hvdHRpbmc6XG4gKiBhIGZvbGxvdy11cCBjYW4gcGVyc2lzdC9yZXN0b3JlIHRoZSBWTSBhdCB0aGUgcGhhc2UgYm91bmRhcnkgKGUuZy4gYVxuICogYnVpbGQtdGltZSBpbml0aWFsIHNuYXBzaG90KSB3aXRob3V0IHJlc3RydWN0dXJpbmcgdGhpcyBtb2R1bGUuIE5vdGVcbiAqIHRoYXQgYnVuZGxlIGV2YWx1YXRpb24gY3VycmVudGx5IHNpdHMgaW4gdGhlIHBlci1ydW4gcGhhc2Ugc28gdGhhdFxuICogbW9kdWxlLXNjb3BlIHVzZXIgY29kZSBvYnNlcnZlcyB0aGUgc2VlZGVkIGBNYXRoLnJhbmRvbWAsIG1hdGNoaW5nIHRoZVxuICogYG5vZGU6dm1gIGVuZ2luZSdzIHJlcGxheSBkZXRlcm1pbmlzbS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEV2ZW50LFxuICBSdW5JbnB1dCxcbiAgV29ya2Zsb3dSdW4sXG4gIFdvcmxkQ2FwYWJpbGl0aWVzLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0ICogYXMgbmFub2lkIGZyb20gJ25hbm9pZCc7XG5pbXBvcnQge1xuICB0eXBlIEV4dGVuc2lvbkRlc2NyaXB0b3IsXG4gIEpTRXhjZXB0aW9uLFxuICBRdWlja0pTLFxuICB0eXBlIFNuYXBzaG90LFxuICB0eXBlIFdhc2lPcHRpb25zLFxufSBmcm9tICdxdWlja2pzLXdhc2knO1xuaW1wb3J0IHNlZWRyYW5kb20gZnJvbSAnc2VlZHJhbmRvbSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGRlY29tcHJlc3MgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgRGVjcnlwdGlvbktleSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBkZWNyeXB0IH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFJlcGxheVRpbWVvdXRNcyxcbiAgaXNRdWlja0pTQmFzZWxpbmVTbmFwc2hvdEVuYWJsZWQsXG59IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHF1aWNranNFeHRlbnNpb25zLCBxdWlja2pzV2FzbSB9IGZyb20gJy4vcXVpY2tqcy1hc3NldHMuZ2VuZXJhdGVkLmpzJztcbmltcG9ydCB7XG4gIGFkb3B0U2VyZGVSb290LFxuICBjYXB0dXJlU2VyZGVSb290LFxuICBjcmVhdGVRdWlja0pTU2VyZGUsXG4gIGV4cG9ydFNlcmRlUm9vdCxcbiAgdHlwZSBRdWlja0pTU2VyZGUsXG59IGZyb20gJy4vcXVpY2tqcy1zZXJkZS5qcyc7XG5pbXBvcnQgeyBydW5JZENyZWF0ZWRBdCB9IGZyb20gJy4vcnVuLWlkLXRpbWUuanMnO1xuXG4vLyAtLS0tIEhvc3QgLT4gVk0gcGF5bG9hZCBwcmVwYXJhdGlvbiAtLS0tXG5cbi8qKlxuICogUHJlcGFyZSBwZXJzaXN0ZWQgcGF5bG9hZCBieXRlcyBmb3IgY29uc3VtcHRpb24gaW5zaWRlIHRoZSBWTTogZGVjcnlwdFxuICogKHdoZW4gYW4gZW5jcnlwdGlvbiBrZXkgaXMgY29uZmlndXJlZCkgYW5kIGRlY29tcHJlc3MgKHNwZWNWZXJzaW9uID49IDVcbiAqIHBheWxvYWRzIG1heSBiZSBnemlwL3pzdGQtY29tcHJlc3NlZCkuIFRoZSBWTSBvbmx5IHVuZGVyc3RhbmRzIHBsYWluXG4gKiBmb3JtYXQtcHJlZml4ZWQgJ2RldmwnIGJ5dGVzIOKAlCBpdCBoYXMgbmVpdGhlciB0aGUga2V5IG1hdGVyaWFsIG5vciB6bGliLlxuICogVGhlIGtleSBpcyB0aGUgcnVuJ3MgZnVsbCBEZWNyeXB0aW9uS2V5IGNhcGFiaWxpdHkgKHN5bW1ldHJpYyBBRVMga2V5ICtcbiAqIFgyNTUxOSBrZXlwYWlyKSBzbyBzZWFsZWQgYGVuY3BgIGhvb2sgcGF5bG9hZHMgZnJvbSBjcm9zcy1kZXBsb3ltZW50XG4gKiByZXN1bWVIb29rKCkgY2FsbHMgb3BlbiBoZXJlIHRvbywgbm90IGp1c3Qgc3ltbWV0cmljIGBlbmNyYCBvbmVzLlxuICogQm90aCBzdGFnZXMgYXJlIGZvcm1hdC1wcmVmaXggZGlzcGF0Y2hlZCwgc28gcGxhaW50ZXh0L3VuY29tcHJlc3NlZFxuICogZGF0YSBwYXNzZXMgdGhyb3VnaCB1bmNoYW5nZWQuIE1pcnJvcnMgYHByZXBhcmVSZXBsYXlQYXlsb2FkYCBpblxuICogc2VyaWFsaXphdGlvbi50cyAodGhlIG5vZGU6dm0gZW5naW5lJ3MgZXF1aXZhbGVudCBob3N0LXNpZGUgc3RhZ2UpLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgZGF0YTogVWludDhBcnJheSxcbiAga2V5PzogRGVjcnlwdGlvbktleVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIHJldHVybiAoYXdhaXQgZGVjb21wcmVzcyhhd2FpdCBkZWNyeXB0KGRhdGEsIGtleSkpKSBhcyBVaW50OEFycmF5O1xufVxuXG4vLyAtLS0tIFR5cGVzIC0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nU3RlcCB7XG4gIHR5cGU6ICdzdGVwJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICBzdGVwSWQ6IHN0cmluZztcbiAgLyoqIEZvcm1hdC1wcmVmaXhlZCBkZXZhbHVlLXNlcmlhbGl6ZWQgc3RlcCBpbnB1dCAoYXJncyArIGNsb3N1cmVWYXJzKSAqL1xuICBpbnB1dDogVWludDhBcnJheTtcbiAgLyoqIFdoZXRoZXIgYSBzdGVwX2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgc3RlcCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1dhaXQge1xuICB0eXBlOiAnd2FpdCc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgLyoqIElTTyBzdHJpbmcgb2Ygd2hlbiB0byByZXN1bWUgKi9cbiAgcmVzdW1lQXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgYSB3YWl0X2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgd2FpdCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0hvb2sge1xuICB0eXBlOiAnaG9vayc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIEVhcmxpZXN0IHRva2VuIHJldXNlIHRpbWUsIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaC4gKi9cbiAgdG9rZW5SZXRlbnRpb25VbnRpbD86IG51bWJlcjtcbiAgaXNXZWJob29rOiBib29sZWFuO1xuICBtZXRhZGF0YT86IHVua25vd247XG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGludGVybmFsIHN5c3RlbSBob29rcyAoZS5nLiBBYm9ydENvbnRyb2xsZXIncyBob29rKSwgd2hpY2hcbiAgICogYXJlIGV4ZW1wdCBmcm9tIHVzZXItaG9vayB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgKi9cbiAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IHdoZW4gdGhlIHdvcmtmbG93IGNhbGxlZCBBYm9ydENvbnRyb2xsZXIuYWJvcnQoKSBkdXJpbmcgdGhpc1xuICAgKiBpbnZvY2F0aW9uLiBUaGUgaG9zdCBtdXN0IHJlY29yZCB0aGUgYWJvcnQ6IGNyZWF0ZSBhIGhvb2tfcmVjZWl2ZWRcbiAgICogZXZlbnQgY2FycnlpbmcgYGFib3J0UGF5bG9hZGAgYW5kIHdyaXRlL2Nsb3NlIHRoZSBhYm9ydCBzdHJlYW0uXG4gICAqL1xuICBhYm9ydFJlcXVlc3RlZD86IGJvb2xlYW47XG4gIC8qKiBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkIGZvciB0aGUgYWJvcnQuICovXG4gIGFib3J0UGF5bG9hZD86IFVpbnQ4QXJyYXk7XG4gIC8qKiBTZXQgYnkgdGhlIGNvbXBsZXRpb24gZHJhaW4gd2hlbiBhIHN5c3RlbSBob29rIGlzIGltcGxpY2l0bHkgZGlzcG9zZWQuICovXG4gIGRpc3Bvc2VkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGUgd29ya2Zsb3cgaXMgYXdhaXRpbmcgaG9vay5nZXRDb25mbGljdCgpIGZvciB0aGlzIGhvb2suXG4gICAqIFRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0IGFmdGVyIHdyaXRpbmdcbiAgICogaG9va19jcmVhdGVkIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgICovXG4gIGhhc0dldENvbmZsaWN0QXdhaXRlcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0F0dHJpYnV0ZSB7XG4gIHR5cGU6ICdhdHRyaWJ1dGUnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIC8qKiBOb3JtYWxpemVkIGF0dHJpYnV0ZSBjaGFuZ2VzIChwbGFpbiBKU09OLWFibGUgb2JqZWN0cykgKi9cbiAgY2hhbmdlczogdW5rbm93bltdO1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGFuIGF0dHJfc2V0IGV2ZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHdyaXRlICovXG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nSG9va0Rpc3Bvc2Uge1xuICB0eXBlOiAnaG9va19kaXNwb3NlJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAvKipcbiAgICogVG9rZW4gb2YgdGhlIGhvb2sgYmVpbmcgZGlzcG9zZWQuIFVzZWQgYnkgdGhlIGVudHJ5cG9pbnQgdG8gb3JkZXJcbiAgICogc2FtZS10b2tlbiBob29rIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IGluIGNvZGUgb3JkZXIuXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcbiAgaGFzQ3JlYXRlZEV2ZW50OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBQZW5kaW5nT3BlcmF0aW9uID1cbiAgfCBQZW5kaW5nU3RlcFxuICB8IFBlbmRpbmdXYWl0XG4gIHwgUGVuZGluZ0hvb2tcbiAgfCBQZW5kaW5nQXR0cmlidXRlXG4gIHwgUGVuZGluZ0hvb2tEaXNwb3NlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNSdW50aW1lUmVzdWx0IHtcbiAgLyoqIFRoZSB3b3JrZmxvdyBjb21wbGV0ZWQg4oCUIHJlc3VsdCBpcyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlcyAqL1xuICBjb21wbGV0ZWQ/OiB7XG4gICAgcmVzdWx0OiBVaW50OEFycmF5O1xuICAgIC8qKlxuICAgICAqIExlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IHN0aWxsIG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgYXRcbiAgICAgKiBjb21wbGV0aW9uOiBhYm9ydCByZWNvcmRpbmdzLCBzeXN0ZW0taG9vayBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldFxuICAgICAqIGF0dHJpYnV0ZS9ob29rL3N0ZXAgZXZlbnRzLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcy4gVGhlIGVudHJ5cG9pbnQgZGlzcGF0Y2hlcyB0aGVzZSBXSVRIT1VUXG4gICAgICogcXVldWVpbmcgc3RlcHMgb3IgcmVxdWV1aW5nIHRoZSBydW4uXG4gICAgICovXG4gICAgZHJhaW5PcGVyYXRpb25zPzogUGVuZGluZ09wZXJhdGlvbltdO1xuICB9O1xuICAvKiogVGhlIHdvcmtmbG93IHN1c3BlbmRlZCB3aXRoIHBlbmRpbmcgb3BlcmF0aW9ucyAqL1xuICBzdXNwZW5kZWQ/OiB7XG4gICAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgfTtcbiAgLyoqIFRoZSB3b3JrZmxvdyBmYWlsZWQgKi9cbiAgZmFpbGVkPzoge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBTZWUgY29tcGxldGVkLmRyYWluT3BlcmF0aW9ucyDigJQgc2FtZSBzZW1hbnRpY3Mgb24gZmFpbHVyZS4gKi9cbiAgICBkcmFpbk9wZXJhdGlvbnM/OiBQZW5kaW5nT3BlcmF0aW9uW107XG4gICAgLyoqXG4gICAgICogRm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZVxuICAgICAqIChFcnJvciBzdWJjbGFzcyB3aXRoIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikuXG4gICAgICogU2V0IHdoZW4gdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXIgc3VjY2Vzc2Z1bGx5IHNlcmlhbGl6ZXNcbiAgICAgKiB0aGUgdGhyb3duIHZhbHVlLiBUaGUgaG9zdCB1c2VzIHRoZXNlIGJ5dGVzIHRvIHJlY29uc3RydWN0IHRoZVxuICAgICAqIG9yaWdpbmFsIHZhbHVlIHRocm91Z2ggdGhlIHN0YW5kYXJkIGVycm9yIGh5ZHJhdGlvbiBwaXBlbGluZSxcbiAgICAgKiBwcmVzZXJ2aW5nIHR5cGUgaWRlbnRpdHkgKFR5cGVFcnJvciwgRmF0YWxFcnJvcikgYW5kIG5vbi1FcnJvclxuICAgICAqIHRocm93cyB2ZXJiYXRpbS4gRmFsbHMgYmFjayB0byB0aGUgbWVzc2FnZS9zdGFjay9uYW1lIGZpZWxkc1xuICAgICAqIHdoZW4gdGhpcyBpcyB1bmRlZmluZWQgKGUuZy4gZXh0cmFjdEVycm9yIHBzZXVkby1mYWlsdXJlcykuXG4gICAgICovXG4gICAgdmFsdWVCeXRlcz86IFVpbnQ4QXJyYXk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVpY2tKU1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqIFRoZSBjb21waWxlZCB3b3JrZmxvdyBidW5kbGUgY29kZSAod29ya2Zsb3cgbW9kZSBvdXRwdXQgZnJvbSBTV0MpICovXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IElEIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIikgKi9cbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IHJ1biBlbnRpdHkgKi9cbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICAvKiogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gKi9cbiAgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllcztcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gRXZlcnkgaW52b2NhdGlvbiByZXBsYXlzIHRoZSBjb21wbGV0ZVxuICAgKiBsb2cgZnJvbSB0aGUgc3RhcnQgKHNhbWUgcmVwbGF5IHNlbWFudGljcyBhcyB0aGUgYG5vZGU6dm1gIGVuZ2luZSkuXG4gICAqL1xuICBldmVudHM6IEV2ZW50W107XG4gIC8qKiBFbmNyeXB0aW9uIGtleSBmb3IgZGVjcnlwdGluZyBldmVudCBwYXlsb2FkcyAodW5kZWZpbmVkIGlmIHVuZW5jcnlwdGVkKSAqL1xuICBlbmNyeXB0aW9uS2V5PzogRGVjcnlwdGlvbktleTtcbiAgLyoqXG4gICAqIFRoZSBsb2NhbCBwb3J0IHRoZSB3b3JrZmxvdyBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLCB1c2VkIHRvIHBvcHVsYXRlXG4gICAqIGB3b3JrZmxvd01ldGFkYXRhLnVybGAuIFJlc29sdmVkIGF0IGNhbGwgdGltZSBvbiB0aGUgaG9zdCBzaWRlIHNvIHRoZVxuICAgKiBWTSBkb2Vzbid0IGhhdmUgdG8gcHJvYmUgdGhlIGZpbGVzeXN0ZW0uIElnbm9yZWQgb24gVmVyY2VsIOKAlCBWRVJDRUxfVVJMXG4gICAqIHRha2VzIHByZWNlZGVuY2UgdGhlcmUuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKipcbiAgICogRmFsbGJhY2sgd29ya2Zsb3cgaW5wdXQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSdzIHJlc2lsaWVudC1zdGFydFxuICAgKiBwYXlsb2FkLiBVc2VkIHdoZW4gdGhlIGZldGNoZWQgZXZlbnQgbG9nIGxhY2tzIGEgYHJ1bl9jcmVhdGVkYCBldmVudFxuICAgKiAoZXZlbnR1YWxseS1jb25zaXN0ZW50IHJlYWQgYWZ0ZXIgdGhlIHBhcmVudCdzIHN0YXJ0KCkgd3JvdGUgaXQpLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbn1cblxuLy8gLS0tLSBWTSBCb290c3RyYXAgQ29kZSAtLS0tXG5cbi8qKlxuICogSmF2YVNjcmlwdCBjb2RlIHRoYXQgcnVucyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0gdG8gc2V0IHVwIHRoZSB3b3JrZmxvd1xuICogcHJpbWl0aXZlcy4gVGhpcyBzZXRzIHVwOlxuICogLSBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MgKE1hcCkgLSB3b3JrZmxvdyByZWdpc3RyeVxuICogLSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzIChPYmplY3QpIC0gcGVuZGluZyBwcm9taXNlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9uc1xuICogLSBnbG9iYWxUaGlzLl9fcGVuZGluZyAoQXJyYXkpIC0gbWV0YWRhdGEgYWJvdXQgcGVuZGluZyBvcGVyYXRpb25zXG4gKiAtIGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXSAtIHN0ZXAgcHJveHkgZmFjdG9yeVxuICogLSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TTEVFUFwiKV0gLSBzbGVlcCBmdW5jdGlvblxuICovXG5jb25zdCBWTV9CT09UU1RSQVAgPSBgXG4vLyBTeW1ib2wuZGlzcG9zZSAvIFN5bWJvbC5hc3luY0Rpc3Bvc2UgcG9seWZpbGxzIGZvciBRdWlja0pTXG5pZiAodHlwZW9mIFN5bWJvbC5kaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5kaXNwb3NlID0gU3ltYm9sLmZvcihcIlN5bWJvbC5kaXNwb3NlXCIpO1xufVxuaWYgKHR5cGVvZiBTeW1ib2wuYXN5bmNEaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5hc3luY0Rpc3Bvc2UgPSBTeW1ib2wuZm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZVwiKTtcbn1cblxuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzID0gbmV3IE1hcCgpO1xuZ2xvYmFsVGhpcy5fX3Jlc29sdmVycyA9IHt9O1xuZ2xvYmFsVGhpcy5fX3BlbmRpbmcgPSBbXTtcbmdsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCA9IHVuZGVmaW5lZDtcbmdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yID0gdW5kZWZpbmVkO1xuLy8gQnVmZmVyIGZvciBob29rX3JlY2VpdmVkIHBheWxvYWRzIHRoYXQgYXJyaXZlIGJlZm9yZSB0aGUgaG9vayBpcyBhd2FpdGVkLlxuLy8gS2V5ZWQgYnkgY29ycmVsYXRpb25JZCDihpIgYXJyYXkgb2YgcGF5bG9hZHMgKHByZXNlcnZlcyBkZWxpdmVyeSBvcmRlcikuXG4vLyBUaGlzIG1pcnJvcnMgdGhlIGV2ZW50LXJlcGxheSBydW50aW1lJ3MgcGF5bG9hZHNRdWV1ZSBpbiBob29rLnRzLlxuZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyID0ge307XG5cbi8vIEJ1ZmZlciBmb3Igc3RlcC93YWl0L2F0dHIgdGVybWluYWwgb3V0Y29tZXMgdGhhdCBhcnJpdmUgYmVmb3JlIHRoaXMgVk1cbi8vIGhhcyBjb25zdHJ1Y3RlZCB0aGUgY29ycmVzcG9uZGluZyBhd2FpdGluZyBwcm9taXNlLiBJbiBmcmVzaC1WTSByZXBsYXlcbi8vIHRoZSBtdWx0aS1wYXNzIGV2ZW50IHNjYW4gbWFrZXMgdGhpcyB1bnJlYWNoYWJsZSAoYXdhaXRzIGFyZVxuLy8gcmVjb25zdHJ1Y3RlZCBiZWZvcmUgdGhlaXIgdGVybWluYWxzIGFyZSByZS1zY2FubmVkKSwgYnV0IHRoZSBsaXZlXG4vLyBjb250aW51YXRpb24gcGF0aCAoY29udGludWVXaXRoRXZlbnRzKSBzY2FucyBlYWNoIGRlbHRhIGV4YWN0bHkgb25jZSDigJRcbi8vIGEgY29uY3VycmVudCBpbnZvY2F0aW9uJ3MgdGVybWluYWwgYXJyaXZpbmcgYmVmb3JlIHRoaXMgVk0gcmVhY2hlcyB0aGVcbi8vIGF3YWl0IHdvdWxkIG90aGVyd2lzZSBiZSBkcm9wcGVkIG9uIHRoZSBmbG9vciBhbmQgdGhlIGF3YWl0IHdvdWxkXG4vLyBuZXZlciBzZXR0bGUgKHRoZSBmZWVkJ3Mgc2Vlbi1zZXQgbWVhbnMgaXQgaXMgbmV2ZXIgcmUtZGVsaXZlcmVkKS5cbi8vIE1pcnJvcnMgX19ob29rUGF5bG9hZEJ1ZmZlciwgd2hpY2ggZXhpc3RzIGZvciBleGFjdGx5IHRoaXMgcmVhc29uIG9uXG4vLyB0aGUgaG9vayBwYXRoLiBLZXllZCBieSBjb3JyZWxhdGlvbklkIOKGkiBzaW5nbGUgdGVybWluYWwgKHN0ZXBzLCB3YWl0c1xuLy8gYW5kIGF0dHJzIHNldHRsZSBleGFjdGx5IG9uY2UpLlxuZ2xvYmFsVGhpcy5fX3Rlcm1pbmFsQnVmZmVyID0ge307XG5cbi8vIFJlZ2lzdGVycyBhIHJlc29sdmVyIGZvciBhbiBhd2FpdGVkIHByaW1pdGl2ZSwgZmlyc3QgZHJhaW5pbmcgYW55XG4vLyBidWZmZXJlZCB0ZXJtaW5hbCByZWNvcmRlZCBmb3IgdGhlIGNvcnJlbGF0aW9uSWQuIEVudHJpZXMgYXJlIHByZXBhcmVkXG4vLyBob3N0LXNpZGU6IGJ5dGVzIGFyZSBkZWNyeXB0ZWQgQU5EIGRlc2VyaWFsaXplZCBpbnRvIFZNIHZhbHVlcyBieSB0aGVcbi8vIGhvc3Qgc2VyZGUgYmVmb3JlIGJ1ZmZlcmluZyAodGhlIFZNIGhhcyBubyBpbi1ndWVzdCBkZXNlcmlhbGl6ZXIgb25cbi8vIHRoZSBob3N0LXNlcmRlIGVuZ2luZSksIHNvIGRyYWluaW5nIG9ubHkgZm9yd2FyZHMgdGhlIHN0b3JlZCB2YWx1ZS5cbmdsb2JhbFRoaXMuX19yZWdpc3RlclJlc29sdmVyID0gZnVuY3Rpb24oY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHZhciBidWZmZXJlZCA9IGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgaWYgKGJ1ZmZlcmVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZXNvbHZlX3ZhbHVlXCIpIHtcbiAgICAgIHJlc29sdmUoYnVmZmVyZWQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZWplY3RfdmFsdWVcIikge1xuICAgICAgcmVqZWN0KGJ1ZmZlcmVkLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGJ1ZmZlcmVkLmtpbmQgPT09IFwicmVqZWN0X2Vycm9yXCIpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKGJ1ZmZlcmVkLm1lc3NhZ2UpO1xuICAgICAgZS5uYW1lID0gXCJGYXRhbEVycm9yXCI7XG4gICAgICBlLmZhdGFsID0gdHJ1ZTtcbiAgICAgIGlmIChidWZmZXJlZC5zdGFjaykgZS5zdGFjayA9IGJ1ZmZlcmVkLnN0YWNrO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NvcnJlbGF0aW9uSWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xufTtcblxuLy8gU3R1YnMgZm9yIFdlYiBBUElzIHRoYXQgdGhlIHdvcmtmbG93IGJ1bmRsZSBtYXkgcmVmZXJlbmNlIGJ1dCBhcmUgbm90XG4vLyBhdmFpbGFibGUgaW4gUXVpY2tKUy4gTmF0aXZlIEMgZXh0ZW5zaW9ucyAoZW5jb2RpbmcsIGhlYWRlcnMsIHVybCxcbi8vIHN0cnVjdHVyZWQtY2xvbmUpIHByb3ZpZGUgdGhlIHJlYWwgaW1wbGVtZW50YXRpb25zOyB0aGVzZSBhcmUgbWluaW1hbFxuLy8gc3R1YnMgZm9yIEFQSXMgdGhhdCBkb24ndCBoYXZlIG5hdGl2ZSBleHRlbnNpb25zIHlldC4gKGJ0b2EvYXRvYiBhbmRcbi8vIHRoZSBVaW50OEFycmF5IGJhc2U2NC9oZXggbWV0aG9kcyBhcmUgYnVpbHQgaW50byBxdWlja2pzLXdhc2kgPj0gMy4pXG5cbmlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gTWluaW1hbCBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyBib2R5IGRhdGEgZm9yIFJlc3BvbnNlLmpzb24oKS90ZXh0KClcbiAgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG4gIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLl9fYm9keURhdGEgPSBudWxsO1xufVxuXG5pZiAodHlwZW9mIFdyaXRhYmxlU3RyZWFtID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBmdW5jdGlvbigpIHt9O1xufVxuXG5pZiAodHlwZW9mIFRyYW5zZm9ybVN0cmVhbSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG59XG5cbmlmICh0eXBlb2YgY29uc29sZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLmNvbnNvbGUgPSB7IGxvZzogZnVuY3Rpb24oKXt9LCBlcnJvcjogZnVuY3Rpb24oKXt9LCB3YXJuOiBmdW5jdGlvbigpe30sIGluZm86IGZ1bmN0aW9uKCl7fSB9O1xufVxuLy8gU3R1YiBleHBvcnRzL21vZHVsZSBmb3IgQ0pTIGJ1bmRsZSBmb3JtYXRcbmdsb2JhbFRoaXMuZXhwb3J0cyA9IHt9O1xuZ2xvYmFsVGhpcy5tb2R1bGUgPSB7IGV4cG9ydHM6IGdsb2JhbFRoaXMuZXhwb3J0cyB9O1xuLy8gTk9URTogVGV4dEVuY29kZXIvVGV4dERlY29kZXIgYXJlIHByb3ZpZGVkIGJ5IHRoZSBuYXRpdmUgZW5jb2RpbmcgZXh0ZW5zaW9uLlxuXG4vLyAtLS0tIERldGVybWluaXN0aWMgXFxgY3J5cHRvXFxgIChwYXJpdHkgd2l0aCB0aGUgbm9kZTp2bSBlbmdpbmUpIC0tLS1cbi8vIGdldFJhbmRvbVZhbHVlcyAvIHJhbmRvbVVVSUQgZHJhdyBmcm9tIE1hdGgucmFuZG9tLCB3aGljaCB0aGUgaG9zdFxuLy8gcmVwbGFjZXMgd2l0aCB0aGUgcnVuJ3Mgc2VlZGVkIFBSTkcgYmVmb3JlIGFueSB1c2VyIGNvZGUgcnVucyDigJQgc28gdGhlXG4vLyB2YWx1ZXMgcmVwbGF5IGRldGVybWluaXN0aWNhbGx5IGFuZCBtYXRjaCB0aGUgbm9kZSBlbmdpbmUsIHdob3NlXG4vLyBpbXBsZW1lbnRhdGlvbnMgZHJhdyBmcm9tIHRoZSBzYW1lIHNlZWRlZCBzZXF1ZW5jZSAoc2VlIHZtL2luZGV4LnRzKS5cbi8vIEV2ZXJ5IGNyeXB0by5zdWJ0bGUgbWV0aG9kIHRocm93cyB3aXRoIHRoZSBzYW1lIGd1aWRhbmNlIGFzIHRoZSBub2RlXG4vLyBlbmdpbmUncyBub24tcmVwbGF5YWJsZSBtZXRob2RzOyB1bmxpa2Ugbm9kZSwgXFxgZGlnZXN0XFxgIGlzIGFsc29cbi8vIHVuYXZhaWxhYmxlIGhlcmUgKG5vIG5hdGl2ZSBoYXNoIGluIHRoZSBWTSB5ZXQpLlxuKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBnZXRSYW5kb21WYWx1ZXMoYXJyYXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICAvLyBNaXJyb3JzIHZtL3V1aWQudHMgY3JlYXRlUmFuZG9tVVVJRDogaWRlbnRpY2FsIGRyYXcgcGF0dGVybiBmcm9tIHRoZVxuICAvLyBzZWVkZWQgUFJORywgc28gYm90aCBlbmdpbmVzIHByb2R1Y2UgdGhlIHNhbWUgVVVJRCBhdCB0aGUgc2FtZSBwb2ludFxuICAvLyBpbiBhIHJlcGxheS5cbiAgZnVuY3Rpb24gcmFuZG9tVVVJRCgpIHtcbiAgICB2YXIgY2hhcnMgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgICB2YXIgdXVpZCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzNjsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gOCB8fCBpID09PSAxMyB8fCBpID09PSAxOCB8fCBpID09PSAyMykge1xuICAgICAgICB1dWlkICs9IFwiLVwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxNCkge1xuICAgICAgICB1dWlkICs9IFwiNFwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxOSkge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpICsgOF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1dWlkO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnRsZVRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgY3J5cHRvLnN1YnRsZS5cIiArIG5hbWUgKyBcIigpXFxgIGlzIG5vdCBhdmFpbGFibGUgaW5zaWRlIGEgd29ya2Zsb3cgZnVuY3Rpb24uIE1vdmUgaXQgdG8gYSBzdGVwIGZ1bmN0aW9uIHdoZXJlIGZ1bGwgTm9kZS5qcyBjcnlwdG8gaXMgYXZhaWxhYmxlLlwiKTtcbiAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH07XG4gIH1cbiAgdmFyIHN1YnRsZSA9IHt9O1xuICBbXCJlbmNyeXB0XCIsXCJkZWNyeXB0XCIsXCJzaWduXCIsXCJ2ZXJpZnlcIixcImRpZ2VzdFwiLFwiZ2VuZXJhdGVLZXlcIixcImRlcml2ZUtleVwiLFwiZGVyaXZlQml0c1wiLFwiaW1wb3J0S2V5XCIsXCJleHBvcnRLZXlcIixcIndyYXBLZXlcIixcInVud3JhcEtleVwiXS5mb3JFYWNoKGZ1bmN0aW9uKG0pIHtcbiAgICBzdWJ0bGVbbV0gPSBzdWJ0bGVUaHJvdyhtKTtcbiAgfSk7XG4gIGdsb2JhbFRoaXMuY3J5cHRvID0ge1xuICAgIGdldFJhbmRvbVZhbHVlczogZ2V0UmFuZG9tVmFsdWVzLFxuICAgIHJhbmRvbVVVSUQ6IHJhbmRvbVVVSUQsXG4gICAgc3VidGxlOiBzdWJ0bGUsXG4gIH07XG59KSgpO1xuXG4vLyAtLS0tIExvdWQgSW50bCAvIGxvY2FsZSBndWFyZHMgLS0tLVxuLy8gUXVpY2tKUyBoYXMgbm8gSUNVOiBcXGBJbnRsXFxgIGlzIGFic2VudCBhbmQgdG9Mb2NhbGVTdHJpbmctZmFtaWx5IG1ldGhvZHNcbi8vIHNpbGVudGx5IGlnbm9yZSB0aGVpciBsb2NhbGUgYXJndW1lbnQuIFNpbGVudCBkaXZlcmdlbmNlIGZyb20gdGhlIG5vZGVcbi8vIGVuZ2luZSB3b3VsZCB3cml0ZSBkaWZmZXJlbnQgdmFsdWVzIGludG8gYSBkdXJhYmxlIGV2ZW50IGxvZyB3aXRoIG5vXG4vLyBlcnJvciBhbnl3aGVyZSDigJQgc28gbWFrZSB0aGUgZ2FwIGxvdWQgaW5zdGVhZDogSW50bCBjb25zdHJ1Y3RvcnMgdGhyb3csXG4vLyBhbmQgdG9Mb2NhbGUqIG1ldGhvZHMgdGhyb3cgT05MWSB3aGVuIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZVxuLy8gKHRoZSBuby1hcmd1bWVudCBmb3JtcyBrZWVwIFF1aWNrSlMncyBkZWZhdWx0IGJlaGF2aW9yKS5cbihmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gaW50bFRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgSW50bC5cIiArIG5hbWUgKyBcIlxcYCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKS4gUGVyZm9ybSBsb2NhbGUtc2Vuc2l0aXZlIGZvcm1hdHRpbmcgaW4gYSBzdGVwIGZ1bmN0aW9uLCBvciB1c2UgV09SS0ZMT1dfVk09bm9kZS5cIik7XG4gICAgICBlcnIubmFtZSA9IFwiV29ya2Zsb3dSdW50aW1lRXJyb3JcIjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgSW50bCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBpbnRsID0ge307XG4gICAgW1wiQ29sbGF0b3JcIixcIkRhdGVUaW1lRm9ybWF0XCIsXCJEaXNwbGF5TmFtZXNcIixcIkR1cmF0aW9uRm9ybWF0XCIsXCJMaXN0Rm9ybWF0XCIsXCJMb2NhbGVcIixcIk51bWJlckZvcm1hdFwiLFwiUGx1cmFsUnVsZXNcIixcIlJlbGF0aXZlVGltZUZvcm1hdFwiLFwiU2VnbWVudGVyXCJdLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgaW50bFtuXSA9IGludGxUaHJvdyhuKTtcbiAgICB9KTtcbiAgICBpbnRsLmdldENhbm9uaWNhbExvY2FsZXMgPSBpbnRsVGhyb3coXCJnZXRDYW5vbmljYWxMb2NhbGVzXCIpO1xuICAgIGdsb2JhbFRoaXMuSW50bCA9IGludGw7XG4gIH1cbiAgZnVuY3Rpb24gZ3VhcmRMb2NhbGUocHJvdG8sIG1ldGhvZCkge1xuICAgIHZhciBvcmlnaW5hbCA9IHByb3RvW21ldGhvZF07XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgcHJvdG9bbWV0aG9kXSA9IGZ1bmN0aW9uKGxvY2FsZXMpIHtcbiAgICAgIGlmIChsb2NhbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlxcYFwiICsgbWV0aG9kICsgXCIobG9jYWxlcywgLi4uKVxcYCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKSDigJQgaXQgd291bGQgc2lsZW50bHkgaWdub3JlIHRoZSBsb2NhbGUuIEZvcm1hdCBpbiBhIHN0ZXAgZnVuY3Rpb24sIG9yIGNhbGwgd2l0aG91dCBhcmd1bWVudHMgZm9yIHRoZSBlbmdpbmUgZGVmYXVsdC5cIik7XG4gICAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9XG4gIGd1YXJkTG9jYWxlKE51bWJlci5wcm90b3R5cGUsIFwidG9Mb2NhbGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlU3RyaW5nXCIpO1xuICBndWFyZExvY2FsZShEYXRlLnByb3RvdHlwZSwgXCJ0b0xvY2FsZURhdGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlVGltZVN0cmluZ1wiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZUxvd2VyQ2FzZVwiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZVVwcGVyQ2FzZVwiKTtcbiAgLy8gbG9jYWxlQ29tcGFyZSdzIGxvY2FsZXMgYXJndW1lbnQgaXMgdGhlIFNFQ09ORCBwYXJhbWV0ZXIuXG4gIChmdW5jdGlvbigpIHtcbiAgICB2YXIgb3JpZ2luYWwgPSBTdHJpbmcucHJvdG90eXBlLmxvY2FsZUNvbXBhcmU7XG4gICAgU3RyaW5nLnByb3RvdHlwZS5sb2NhbGVDb21wYXJlID0gZnVuY3Rpb24odGhhdCwgbG9jYWxlcykge1xuICAgICAgaWYgKGxvY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgbG9jYWxlQ29tcGFyZSh0aGF0LCBsb2NhbGVzLCAuLi4pXFxgIHdpdGggYW4gZXhwbGljaXQgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFF1aWNrSlMgd29ya2Zsb3cgZW5naW5lIChubyBJQ1UpLiBDb21wYXJlIGluIGEgc3RlcCBmdW5jdGlvbiwgb3IgY2FsbCB3aXRob3V0IGEgbG9jYWxlLlwiKTtcbiAgICAgICAgZXJyLm5hbWUgPSBcIldvcmtmbG93UnVudGltZUVycm9yXCI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIHRoYXQpO1xuICAgIH07XG4gIH0pKCk7XG59KSgpO1xuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0gPSBmdW5jdGlvbihzdGVwSWQsIGNsb3N1cmVWYXJzRm4pIHtcbiAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHZhciBjb3JyZWxhdGlvbklkID0gXCJzdGVwX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAgIC8vIENhcHR1cmUgJ3RoaXMnIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4sIE15Q2xhc3MubWV0aG9kKCkpXG4gICAgdmFyIHRoaXNWYWwgPSAodGhpcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMgIT09IG51bGwgJiYgdGhpcyAhPT0gZ2xvYmFsVGhpcykgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBSQVcgaW5wdXQgdmFsdWUuIFNlcmlhbGl6YXRpb24gaGFwcGVucyBvbiB0aGUgaG9zdCwgd2hpY2ggcmVhZHNcbiAgICAvLyB0aGlzIHRocm91Z2ggYSBoYW5kbGUgd2hlbiBpdCBjb2xsZWN0cyB0aGUgcGVuZGluZyBvcCDigJQgbm9cbiAgICAvLyBzZXJpYWxpemVyIGNvZGUgcnVucyBpbnNpZGUgdGhlIFZNLlxuICAgIHZhciBpbnB1dCA9IHtcbiAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICBjbG9zdXJlVmFyczogY2xvc3VyZVZhcnNGbiA/IGNsb3N1cmVWYXJzRm4oKSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXNWYWw6IHRoaXNWYWwsXG4gICAgfTtcbiAgICBnbG9iYWxUaGlzLl9fcGVuZGluZy5wdXNoKHtcbiAgICAgIHR5cGU6IFwic3RlcFwiLFxuICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICAgIHN0ZXBJZDogc3RlcElkLFxuICAgICAgaW5wdXQ6IGlucHV0LFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJSZXNvbHZlcihjb3JyZWxhdGlvbklkLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pO1xuICB9O1xuICAvLyBTZXQgc3RlcElkIG9uIHRoZSBwcm94eSBzbyB0aGUgU3RlcEZ1bmN0aW9uIHJlZHVjZXIgY2FuIGRldGVjdCBhbmRcbiAgLy8gc2VyaWFsaXplIHN0ZXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAoZS5nLiB3aGVuIHBhc3NlZCBhcyBhcmd1bWVudHMpLlxuICBmbi5zdGVwSWQgPSBzdGVwSWQ7XG4gIGlmIChjbG9zdXJlVmFyc0ZuKSBmbi5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAvLyBPdmVycmlkZSAuYmluZCBzbyBhIGJvdW5kIHN0ZXAgcHJveHkgKGUuZy4gdGhlIFNXQyBwbHVnaW4nc1xuICAvLyB1c2VTdGVwKC4uLikuYmluZCh0aGlzKSBmb3IgbGV4aWNhbC10aGlzIGFycm93IHN0ZXBzKSBrZWVwcyBpdHNcbiAgLy8gc3RlcElkIGFuZCByZWNvcmRzIHRoZSBib3VuZCByZWNlaXZlciAvIHByZWZpbGxlZCBhcmdzIOKAlCB0aGUgbmF0aXZlXG4gIC8vIGJpbmQgZHJvcHMgb3duIHByb3BlcnRpZXMsIHdoaWNoIHdvdWxkIG1ha2UgdGhlIFN0ZXBGdW5jdGlvblxuICAvLyByZWR1Y2VyIGZhaWwgdG8gcmVjb2duaXplIHRoZSBwcm94eSB3aGVuIGl0IGNyb3NzZXMgYSBzZXJpYWxpemF0aW9uXG4gIC8vIGJvdW5kYXJ5LiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIG92ZXJyaWRlIGluIHN0ZXAudHMuXG4gIGZuLmJpbmQgPSBmdW5jdGlvbih0aGlzQXJnKSB7XG4gICAgdmFyIHBhcnRpYWxBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgYm91bmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBbdGhpc0FyZ10uY29uY2F0KHBhcnRpYWxBcmdzKSk7XG4gICAgYm91bmQuc3RlcElkID0gc3RlcElkO1xuICAgIGlmIChjbG9zdXJlVmFyc0ZuKSBib3VuZC5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAgIGJvdW5kLl9fYm91bmRUaGlzID0gdGhpc0FyZztcbiAgICBpZiAocGFydGlhbEFyZ3MubGVuZ3RoID4gMCkgYm91bmQuX19ib3VuZEFyZ3MgPSBwYXJ0aWFsQXJncztcbiAgICByZXR1cm4gYm91bmQ7XG4gIH07XG4gIHJldHVybiBmbjtcbn07XG5cbi8vIFBhcnNlcyBhbiBcIm1zXCIgbGlicmFyeSBzdHlsZSBkdXJhdGlvbiBzdHJpbmcgaW50byBtaWxsaXNlY29uZHMuXG4vLyBTdXBwb3J0cyB0aGUgc2FtZSB1bml0cyBhcyB0aGUgcmVwbGF5IHJ1bnRpbWUgKHdoaWNoIHVzZXMgdGhlIFwibXNcIlxuLy8gcGFja2FnZSk6IG1zIC8gcyAvIG0gLyBoIC8gZCAvIHcgLyB5LCB3aXRoIHZlcmJvc2UgYWxpYXNlc1xuLy8gKHNlY29uZHMsIG1pbnV0ZXMsIC4uLikuXG5nbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zID0gZnVuY3Rpb24oc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKFxuICAgIC9eKC0/KD86XFxcXGQrKT9cXFxcLj9cXFxcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2lcbiAgKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgXCJtc1wiKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgcyA9IDEwMDAsIG0gPSA2MCAqIHMsIGggPSA2MCAqIG0sIGQgPSAyNCAqIGgsIHcgPSA3ICogZCwgeSA9IDM2NS4yNSAqIGQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJ5ZWFyc1wiOiBjYXNlIFwieWVhclwiOiBjYXNlIFwieXJzXCI6IGNhc2UgXCJ5clwiOiBjYXNlIFwieVwiOiByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSBcIndlZWtzXCI6IGNhc2UgXCJ3ZWVrXCI6IGNhc2UgXCJ3XCI6IHJldHVybiBuICogdztcbiAgICBjYXNlIFwiZGF5c1wiOiBjYXNlIFwiZGF5XCI6IGNhc2UgXCJkXCI6IHJldHVybiBuICogZDtcbiAgICBjYXNlIFwiaG91cnNcIjogY2FzZSBcImhvdXJcIjogY2FzZSBcImhyc1wiOiBjYXNlIFwiaHJcIjogY2FzZSBcImhcIjogcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgXCJtaW51dGVzXCI6IGNhc2UgXCJtaW51dGVcIjogY2FzZSBcIm1pbnNcIjogY2FzZSBcIm1pblwiOiBjYXNlIFwibVwiOiByZXR1cm4gbiAqIG07XG4gICAgY2FzZSBcInNlY29uZHNcIjogY2FzZSBcInNlY29uZFwiOiBjYXNlIFwic2Vjc1wiOiBjYXNlIFwic2VjXCI6IGNhc2UgXCJzXCI6IHJldHVybiBuICogcztcbiAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6IGNhc2UgXCJtaWxsaXNlY29uZFwiOiBjYXNlIFwibXNlY3NcIjogY2FzZSBcIm1zZWNcIjogY2FzZSBcIm1zXCI6IHJldHVybiBuO1xuICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NMRUVQXCIpXSA9IGZ1bmN0aW9uKHBhcmFtKSB7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJ3YWl0X1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICB2YXIgcmVzdW1lQXQ7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXN1bWVBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBwYXJhbSkudG9JU09TdHJpbmcoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YXIgbXMgPSBnbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zKHBhcmFtKTtcbiAgICBpZiAodHlwZW9mIG1zID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKG1zKSkge1xuICAgICAgcmVzdW1lQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgbXMpLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vdCBhIGR1cmF0aW9uIHN0cmluZyDigJQgdHJ5IGFzIGFuIGFic29sdXRlIGRhdGUgc3RyaW5nLlxuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJhbSk7XG4gICAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2xlZXAgcGFyYW1ldGVyOiBcIiArIHBhcmFtKTtcbiAgICAgIH1cbiAgICAgIHJlc3VtZUF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4ocGFyYW0uZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICAgIH1cbiAgICByZXN1bWVBdCA9IHBhcmFtLnRvSVNPU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICB9XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwid2FpdFwiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgcmVzdW1lQXQ6IHJlc3VtZUF0LFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyBSZXNwb25zZS9SZXF1ZXN0IHBvbHlmaWxscyDigJQgLmpzb24oKS8udGV4dCgpLy5hcnJheUJ1ZmZlcigpIGFyZSB1c2VTdGVwXG4vLyBwcm94aWVzIHRoYXQgZXhlY3V0ZSBvbiB0aGUgaG9zdCBzaWRlLiBUaGUgcHJveGllcyBhcmUgYXNzaWduZWQgZGlyZWN0bHlcbi8vIHRvIHRoZSBwcm90b3R5cGVzIHNvIHRoYXQgJ3RoaXMnICh0aGUgUmVzcG9uc2UvUmVxdWVzdCBpbnN0YW5jZSkgaXNcbi8vIHNlcmlhbGl6ZWQgYXMgdGhpc1ZhbCBieSBXT1JLRkxPV19VU0VfU1RFUCwgbWF0Y2hpbmcgdGhlIGV2ZW50LXJlcGxheVxuLy8gcnVudGltZSdzIGFwcHJvYWNoIChjb21taXQgZGNiMDc2MSkuXG5pZiAodHlwZW9mIFJlc3BvbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIHZhciBfX0JPRFlfSU5JVCA9IFN5bWJvbC5mb3IoXCJCT0RZX0lOSVRcIik7XG5cbiAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IGZ1bmN0aW9uKGJvZHksIGluaXQpIHtcbiAgICBpbml0ID0gaW5pdCB8fCB7fTtcbiAgICB0aGlzLnN0YXR1cyA9IGluaXQuc3RhdHVzIHx8IDIwMDtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0LnN0YXR1c1RleHQgfHwgXCJcIjtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyB8fCBbXSk7XG4gICAgdGhpcy50eXBlID0gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucmVkaXJlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgICB0aGlzLmJvZHlbX19CT0RZX0lOSVRdID0gYm9keTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwgXCJva1wiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVzcG9uc2UucHJvdG90eXBlLCBcImJvZHlVc2VkXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfSk7XG4gIC8vIEFzc2lnbiB1c2VTdGVwIHByb3hpZXMgZGlyZWN0bHkg4oCUICd0aGlzJyBiaW5kaW5nIHByb3ZpZGVzIHRoZVxuICAvLyBSZXNwb25zZSBpbnN0YW5jZSwgd2hpY2ggZ2V0cyBzZXJpYWxpemVkIGFzIHRoaXNWYWwgYnkgdGhlIHByb3h5LlxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuYnl0ZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24oYnVmKSB7IHJldHVybiBuZXcgVWludDhBcnJheShidWYpOyB9KTtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9IE9iamVjdC5jcmVhdGUoZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUpO1xuICAgIHIuc3RhdHVzID0gdGhpcy5zdGF0dXM7IHIuc3RhdHVzVGV4dCA9IHRoaXMuc3RhdHVzVGV4dDtcbiAgICByLmhlYWRlcnMgPSB0aGlzLmhlYWRlcnM7IHIudHlwZSA9IHRoaXMudHlwZTtcbiAgICByLnVybCA9IHRoaXMudXJsOyByLnJlZGlyZWN0ZWQgPSB0aGlzLnJlZGlyZWN0ZWQ7IHIuYm9keSA9IHRoaXMuYm9keTtcbiAgICByZXR1cm4gcjtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5qc29uID0gZnVuY3Rpb24oZGF0YSwgaW5pdCkge1xuICAgIHZhciBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgdmFyIGhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQgPyBpbml0LmhlYWRlcnMgOiBbXSk7XG4gICAgaWYgKCFoZWFkZXJzLmhhcyhcImNvbnRlbnQtdHlwZVwiKSkgeyBoZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7IH1cbiAgICByZXR1cm4gbmV3IGdsb2JhbFRoaXMuUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IChpbml0ICYmIGluaXQuc3RhdHVzKSB8fCAyMDAsIHN0YXR1c1RleHQ6IChpbml0ICYmIGluaXQuc3RhdHVzVGV4dCkgfHwgXCJcIiwgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgfTtcbn1cbmlmICh0eXBlb2YgUmVxdWVzdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlJlcXVlc3QgPSBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICAgIGluaXQgPSBpbml0IHx8IHt9O1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHsgdGhpcy51cmwgPSBpbnB1dDsgfVxuICAgIGVsc2UgaWYgKGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmwgfHwgXCJcIjsgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBpbnB1dC5oZWFkZXJzOyB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgIH1cbiAgICBpZiAoaW5pdC5tZXRob2QpIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMubWV0aG9kKSB0aGlzLm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgaWYgKGluaXQuaGVhZGVycykgdGhpcy5oZWFkZXJzID0gbmV3IGdsb2JhbFRoaXMuSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzKSB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKCk7XG4gICAgaWYgKGluaXQuYm9keSAhPT0gdW5kZWZpbmVkKSB0aGlzLmJvZHkgPSBpbml0LmJvZHk7XG4gICAgaWYgKCF0aGlzLmJvZHkpIHRoaXMuYm9keSA9IG51bGw7XG4gICAgdGhpcy5kdXBsZXggPSBpbml0LmR1cGxleCB8fCBcImhhbGZcIjtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVxdWVzdC5wcm90b3R5cGUsIFwiYm9keVVzZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZ2xvYmFsVGhpcy5SZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbn1cblxuLy8gY3JlYXRlSG9vayDigJQgcmV0dXJucyBhIEhvb2sgb2JqZWN0IHRoYXQgaXMgYm90aCBhIFRoZW5hYmxlIGFuZCBBc3luY0l0ZXJhYmxlLlxuLy8gRWFjaCBhd2FpdC95aWVsZCBjcmVhdGVzIGEgbmV3IHByb21pc2Uga2V5ZWQgYnkgdGhlIHNhbWUgY29ycmVsYXRpb25JZC5cbi8vIFRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gYSBob29rX3JlY2VpdmVkIGV2ZW50IGFycml2ZXMuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DUkVBVEVfSE9PS1wiKV0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAob3B0aW9ucy5pc1dlYmhvb2sgPT09IHRydWUgJiYgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgXFxgZXhwZXJpbWVudGFsX21pblJldGVudGlvblxcYC4gVXNlIGEgbm9uLXdlYmhvb2sgXFxgY3JlYXRlSG9vaygpXFxgIHdpdGggXFxgcmVzdW1lSG9vaygpXFxgLicpO1xuICB9XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWxUaGlzLl9fd29ybGRDYXBhYmlsaXRpZXM/Lmhvb2tSZXRlbnRpb24/LmFjdGl2ZSAhPT0gdHJ1ZSkge1xuICAgIHZhciB1bnN1cHBvcnRlZFJldGVudGlvbkVycm9yID0gbmV3IEVycm9yKCdUaGUgY29uZmlndXJlZCBXb3JsZCBkb2VzIG5vdCBzdXBwb3J0IFxcYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25cXGAgZm9yIEhvb2tzLicpO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IubmFtZSA9IFwiRmF0YWxFcnJvclwiO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IuZmF0YWwgPSB0cnVlO1xuICAgIHRocm93IHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3I7XG4gIH1cbiAgdmFyIHRva2VuID0gb3B0aW9ucy50b2tlbiB8fCBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVOYW5vaWQoKTtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImhvb2tfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIHZhciBoYXNDcmVhdGVkRXZlbnQgPSBmYWxzZTtcbiAgdmFyIHRva2VuUmV0ZW50aW9uVW50aWw7XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBtaW5SZXRlbnRpb24gPSBvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb247XG4gICAgaWYgKHR5cGVvZiBtaW5SZXRlbnRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChtaW5SZXRlbnRpb24gPCAwIHx8ICFpc0Zpbml0ZShtaW5SZXRlbnRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb246IFwiICsgbWluUmV0ZW50aW9uICsgXCIuIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlwiKTtcbiAgICAgIH1cbiAgICAgIHRva2VuUmV0ZW50aW9uVW50aWwgPSBEYXRlLm5vdygpICsgbWluUmV0ZW50aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pblJldGVudGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFyIHJldGVudGlvbk1zID0gZ2xvYmFsVGhpcy5fX3BhcnNlRHVyYXRpb25NcyhtaW5SZXRlbnRpb24pO1xuICAgICAgaWYgKHR5cGVvZiByZXRlbnRpb25NcyAhPT0gXCJudW1iZXJcIiB8fCByZXRlbnRpb25NcyA8IDAgfHwgIWlzRmluaXRlKHJldGVudGlvbk1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZHVyYXRpb246IFwiJyArIG1pblJldGVudGlvbiArICdcIi4gRXhwZWN0ZWQgYSB2YWxpZCBkdXJhdGlvbiBzdHJpbmcgbGlrZSBcIjFzXCIsIFwiMW1cIiwgXCIxaFwiLCBldGMuJyk7XG4gICAgICB9XG4gICAgICB0b2tlblJldGVudGlvblVudGlsID0gRGF0ZS5ub3coKSArIHJldGVudGlvbk1zO1xuICAgIH0gZWxzZSBpZiAobWluUmV0ZW50aW9uIGluc3RhbmNlb2YgRGF0ZSB8fCAobWluUmV0ZW50aW9uICYmIHR5cGVvZiBtaW5SZXRlbnRpb24uZ2V0VGltZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgLy8gQWNjZXB0IERhdGUtbGlrZSBvYmplY3RzIChhbnl0aGluZyB3aXRoIGdldFRpbWUpLCBtYXRjaGluZ1xuICAgICAgLy8gcGFyc2VEdXJhdGlvblRvRGF0ZTogdmFsdWVzIHRoYXQgY3Jvc3NlZCB0aGUgc2VyZGUgYm91bmRhcnkgbWF5XG4gICAgICAvLyBub3QgYmUgcmVhbG0tbmF0aXZlIERhdGUgaW5zdGFuY2VzLlxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCA9IG1pblJldGVudGlvbi5nZXRUaW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb24gcGFyYW1ldGVyLiBFeHBlY3RlZCBhIGR1cmF0aW9uIHN0cmluZywgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBvciBEYXRlIG9iamVjdC5cIik7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgaW4gcGVuZGluZyBvcGVyYXRpb25zLiBNZXRhZGF0YSBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3RcbiAgLy8gc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdoZW4gaXQgY29sbGVjdHMgdGhlIHBlbmRpbmcgb3AuXG4gIHZhciBwZW5kaW5nT3AgPSB7XG4gICAgdHlwZTogXCJob29rXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgdG9rZW5SZXRlbnRpb25VbnRpbDogdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICBpc1dlYmhvb2s6ICEhb3B0aW9ucy5pc1dlYmhvb2ssXG4gICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgfTtcbiAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcucHVzaChwZW5kaW5nT3ApO1xuXG4gIC8vIFBlci1ob29rIGxpZmVjeWNsZSBzdGF0ZSBiYWNraW5nIGhvb2suZ2V0Q29uZmxpY3QoKTogcmVzb2x2ZXMgbnVsbFxuICAvLyBvbmNlIGNyZWF0aW9uIGlzIGNvbmZpcm1lZCAoaG9va19jcmVhdGVkKSwgb3IgcmVzb2x2ZXMgd2l0aCB0aGVcbiAgLy8gY29uZmxpY3RpbmcgUnVuIGhhbmRsZSAvIHJlamVjdHMgd2l0aCBIb29rQ29uZmxpY3RFcnJvciBvblxuICAvLyBob29rX2NvbmZsaWN0LiBTdGF0ZSB0cmFuc2l0aW9ucyBhcmUgZHJpdmVuIGJ5IHRoZSBob3N0IGR1cmluZyBldmVudFxuICAvLyBwcm9jZXNzaW5nIChzZWUgcHJvY2Vzc0V2ZW50cykuXG4gIGdsb2JhbFRoaXMuX19ob29rcyA9IGdsb2JhbFRoaXMuX19ob29rcyB8fCB7fTtcbiAgZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdID0ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjcmVhdGVkOiBmYWxzZSxcbiAgICBjb25mbGljdDogbnVsbCxcbiAgICBnZXRDb25mbGljdFJlc29sdmVyczogW10sXG4gIH07XG5cbiAgLy8gRWFjaCBhd2FpdCBjcmVhdGVzIGEgbmV3IHByb21pc2UgZm9yIHRoZSBuZXh0IHBheWxvYWQuXG4gIC8vIFRoZSBjb3JyZWxhdGlvbklkIHN0YXlzIHRoZSBzYW1lIOKAlCB0aGUgcmVzb2x2ZXIgaXMgcmVwbGFjZWQgZWFjaCB0aW1lLlxuICBmdW5jdGlvbiBjcmVhdGVIb29rUHJvbWlzZSgpIHtcbiAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCBidWZmZXIgZmlyc3Qg4oCUIGlmIGEgaG9va19yZWNlaXZlZCBldmVudCBhcnJpdmVkXG4gICAgLy8gYmVmb3JlIHRoaXMgaG9vayB3YXMgYXdhaXRlZCwgdGhlIHBheWxvYWQgd2FzIGJ1ZmZlcmVkIGluIHRoZSBWTVxuICAgIC8vIGhlYXAuIERyYWluIGl0IGltbWVkaWF0ZWx5IChtYXRjaGluZyBldmVudC1yZXBsYXkgcGF5bG9hZHNRdWV1ZSkuXG4gICAgdmFyIGJ1ZiA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmICYmIGJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1Zi5zaGlmdCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjb3JyZWxhdGlvbklkXSA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCkge1xuICAgIGlmIChpc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgLy8gQSBjb25mbGljdGVkIGhvb2sgd2FzIG5ldmVyIGNyZWF0ZWQgKHRoZSB3b3JsZCByZWplY3RlZCBpdHMgY2xhaW1cbiAgICAvLyDigJQgdGhlIHRva2VuIGJlbG9uZ3MgdG8gYW5vdGhlciBydW4pLCBzbyB0aGVyZSBpcyBubyBlbnRpdHkgdG9cbiAgICAvLyBkaXNwb3NlLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hlcmUgaG9va19jb25mbGljdCByZW1vdmVzXG4gICAgLy8gdGhlIGludm9jYXRpb24tcXVldWUgaXRlbSBiZWZvcmUgZGlzcG9zZSBjYW4gbWFyayBpdC4gRW1pdHRpbmcgYVxuICAgIC8vIGhvb2tfZGlzcG9zZWQgaGVyZSB3b3VsZCBiZSByZWplY3RlZCBieSB0aGUgd29ybGQnc1xuICAgIC8vIGhvb2stZXhpc3RlbmNlIHZhbGlkYXRpb24uXG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAvLyBTaWduYWwgdG8gdGhlIGVudHJ5cG9pbnQgdG8gY3JlYXRlIGEgaG9va19kaXNwb3NlZCBldmVudC4gVGhlXG4gICAgICAvLyB0b2tlbiBpcyBjYXJyaWVkIHNvIHRoZSBlbnRyeXBvaW50IGNhbiBvcmRlciBzYW1lLXRva2VuIGhvb2tcbiAgICAgIC8vIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IChhIGRpc3Bvc2UgbXVzdCByZWxlYXNlIHRoZSB0b2tlbiBiZWZvcmVcbiAgICAgIC8vIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXMgdmFsaWRhdGVkKS5cbiAgICAgIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgICAgICB0eXBlOiBcImhvb2tfZGlzcG9zZVwiLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUncyBhIHBlbmRpbmcgcmVzb2x2ZXIsIHJlc29sdmUgaXQgd2l0aCB1bmRlZmluZWQgdG8gYnJlYWsgdGhlIGl0ZXJhdG9yXG4gICAgaWYgKGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0pIHtcbiAgICAgIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q29uZmxpY3QoKSB7XG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmIChzdGF0ZS5jb25mbGljdCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmNvbmZsaWN0LnJ1blxuICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzdGF0ZS5jb25mbGljdC5ydW4pXG4gICAgICAgIDogUHJvbWlzZS5yZWplY3Qoc3RhdGUuY29uZmxpY3QuZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY3JlYXRlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgLy8gQ3JlYXRpb24gbm90IHlldCBjb25maXJtZWQgYnkgdGhlIGV2ZW50IGxvZyDigJQgcGFyayB0aGUgYXdhaXRlciBhbmRcbiAgICAvLyBmbGFnIHRoZSBwZW5kaW5nIG9wIHNvIHRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0XG4gICAgLy8gYWZ0ZXIgd3JpdGluZyBob29rX2NyZWF0ZWQgKG5vdGhpbmcgZXh0ZXJuYWwgcmVzdW1lcyBhIGdldENvbmZsaWN0XG4gICAgLy8gYXdhaXRlcjsgY29uZmlybWF0aW9uIG9ubHkgY29tZXMgZnJvbSByZXBsYXlpbmcgdGhlIG5ldyBldmVudCkuXG4gICAgcGVuZGluZ09wLmhhc0dldENvbmZsaWN0QXdhaXRlciA9IHRydWU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMucHVzaCh7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGhvb2sgPSB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9LFxuICAgIGdldENvbmZsaWN0OiBnZXRDb25mbGljdCxcbiAgICBkaXNwb3NlOiBkaXNwb3NlSG9vayxcbiAgfTtcblxuICAvLyBTeW1ib2wuZGlzcG9zZSBmb3IgZXhwbGljaXQgcmVzb3VyY2UgbWFuYWdlbWVudFxuICBob29rW1N5bWJvbC5kaXNwb3NlXSA9IGRpc3Bvc2VIb29rO1xuXG4gIC8vIEFzeW5jSXRlcmFibGUg4oCUIHlpZWxkcyBwYXlsb2FkcyB1bnRpbCBkaXNwb3NlZFxuICBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgLy8gSWYgZGlzcG9zZWQgd2hpbGUgd2FpdGluZywgc2lnbmFsIGRvbmVcbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmV0dXJuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZGlzcG9zZUhvb2soKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vLyBzZXRBdHRyaWJ1dGVzIOKAlCBhdHRhY2hlcyBwbGFpbnRleHQgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgcnVuLlxuLy8gVmFsaWRhdGlvbiBoYXBwZW5zIGluIGxpYnJhcnkgY29kZSAobm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcykgYmVmb3JlXG4vLyB0aGlzIGRpc3BhdGNoZXIgaXMgaW52b2tlZCwgc28gXCJjaGFuZ2VzXCIgaXMgYWxyZWFkeSBub3JtYWxpemVkLiBUaGVcbi8vIHJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgd2hlbiB0aGUgbWF0Y2hpbmcgYXR0cl9zZXQgZXZlbnQgaXNcbi8vIG9ic2VydmVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIOKAlCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3Ncbi8vIGNyZWF0ZVNldEF0dHJpYnV0ZXMgKGF0dHJpYnV0ZS1kaXNwYXRjaGVyLnRzKS5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NFVF9BVFRSSUJVVEVTXCIpXSA9IGZ1bmN0aW9uKGNoYW5nZXMsIG9wdGlvbnMpIHtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImF0dHJfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiYXR0cmlidXRlXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICBjaGFuZ2VzOiBjaGFuZ2VzLFxuICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiAhIShvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMpLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyAtLS0tIEFib3J0Q29udHJvbGxlciAvIEFib3J0U2lnbmFsIChob29rLWJhY2tlZCkgLS0tLVxuLy8gUG9ydCBvZiB3b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIHRvIHRoZSBWTSBwZW5kaW5nLW9wIG1vZGVsOlxuLy8gdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGEgc3lzdGVtIGhvb2s7IGFib3J0KCkgZmxpcHMgdGhlIHNpZ25hbFxuLy8gc3luY2hyb25vdXNseSBhbmQgbWFya3MgdGhlIHBlbmRpbmcgb3Agc28gdGhlIGhvc3QgcmVjb3JkcyB0aGUgYWJvcnRcbi8vIChob29rX3JlY2VpdmVkIGV2ZW50ICsgc3RyZWFtIHBhY2tldCkuIE9uIHJlcGxheSwgdGhlIHJlY29yZGVkXG4vLyBob29rX3JlY2VpdmVkIGV2ZW50IGNhbGxzIF9zZXRBYm9ydGVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIGFuZCB0aGVcbi8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBiZWNvbWVzIGEgbm8tb3AuXG52YXIgX19BQk9SVF9TVFJFQU1fTkFNRSA9IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19BQk9SVF9TVFJFQU1fTkFNRVwiKTtcbnZhciBfX0FCT1JUX0hPT0tfVE9LRU4gPSBTeW1ib2wuZm9yKFwiV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTlwiKTtcblxuZnVuY3Rpb24gX19tYWtlQWJvcnRFcnJvcigpIHtcbiAgaWYgKHR5cGVvZiBET01FeGNlcHRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIsIFwiQWJvcnRFcnJvclwiKTtcbiAgfVxuICB2YXIgZSA9IG5ldyBFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuICBlLm5hbWUgPSBcIkFib3J0RXJyb3JcIjtcbiAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIFdvcmtmbG93QWJvcnRTaWduYWwoc3RyZWFtTmFtZSwgaG9va1Rva2VuKSB7XG4gIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgdGhpc1tfX0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gIHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgdGhpcy5fX2xpc3RlbmVycyA9IFtdO1xuICB0aGlzLl9fb25hYm9ydCA9IG51bGw7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV29ya2Zsb3dBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwib25hYm9ydFwiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9fb25hYm9ydDsgfSxcbiAgc2V0OiBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgdGhpcy5fX29uYWJvcnQgPSBoYW5kbGVyO1xuICAgIGlmIChoYW5kbGVyICYmIHRoaXMuYWJvcnRlZCkgaGFuZGxlci5jYWxsKHRoaXMpO1xuICB9LFxufSk7XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5fc2V0QWJvcnRlZCA9IGZ1bmN0aW9uKHJlYXNvbikge1xuICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG4gIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICBpZiAodGhpcy5fX29uYWJvcnQpIHRoaXMuX19vbmFib3J0LmNhbGwodGhpcyk7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9fbGlzdGVuZXJzO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSBsaXN0ZW5lcnNbaV0oKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgLy8gRmlyZSBzeW5jaHJvbm91c2x5IChub3Qgb24gYSBtaWNyb3Rhc2spIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheSDigJRcbiAgICAvLyBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzIFdvcmtmbG93QWJvcnRTaWduYWwuXG4gICAgbGlzdGVuZXIoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gdGhpcy5fX2xpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24obCkgeyByZXR1cm4gbCAhPT0gbGlzdGVuZXI7IH0pO1xufTtcbldvcmtmbG93QWJvcnRTaWduYWwucHJvdG90eXBlLnRocm93SWZBYm9ydGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICB0aHJvdyB0aGlzLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmVhc29uICE9PSBudWxsXG4gICAgICA/IHRoaXMucmVhc29uXG4gICAgICA6IF9fbWFrZUFib3J0RXJyb3IoKTtcbiAgfVxufTtcbi8vIEV4cG9zZSBmb3IgdGhlIGhvc3Qgc2VyZGUncyByZXZpdmVycyAodGhleSBsb29rIHRoZSBjbGFzcyB1cCBsYXppbHksXG4vLyB0aHJvdWdoIGEgaGFuZGxlLCBhdCByZXZpdmUgdGltZSkuXG5nbG9iYWxUaGlzLl9fV29ya2Zsb3dBYm9ydFNpZ25hbCA9IFdvcmtmbG93QWJvcnRTaWduYWw7XG5cbi8vIFJlZ2lzdHJ5IG9mIGxpdmUgYWJvcnQgc2lnbmFscyBrZXllZCBieSB0aGVpciBob29rIGNvcnJlbGF0aW9uSWQuIFRoZVxuLy8gaG9zdCBkZWxpdmVycyBob29rX3JlY2VpdmVkIGV2ZW50cyBmb3IgdGhlc2UgaWRzIGFzIF9zZXRBYm9ydGVkIGNhbGxzLlxuZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyA9IHt9O1xuXG5nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciA9IGZ1bmN0aW9uIFdvcmtmbG93QWJvcnRDb250cm9sbGVyKCkge1xuICB2YXIgaWQgPSBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBzdHJlYW1OYW1lID0gXCJzdHJtX1wiICsgaWQgKyBcIl9zeXN0ZW1fYWJvcnRcIjtcbiAgdmFyIGhvb2tUb2tlbiA9IFwiYWJydF9cIiArIGlkO1xuICB0aGlzW19fQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgdGhpc1tfX0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICB0aGlzLnNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJob29rX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAvLyBSZWdpc3RlciBhbiBpbnRlcm5hbCBzeXN0ZW0gaG9vay4gaXNTeXN0ZW0gcHJldmVudHMgdG9rZW4gbmFtZXNwYWNlXG4gIC8vIGNvbmZsaWN0cyB3aXRoIHVzZXIgaG9va3MuXG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiaG9va1wiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgdG9rZW46IGhvb2tUb2tlbixcbiAgICBpc1dlYmhvb2s6IGZhbHNlLFxuICAgIGlzU3lzdGVtOiB0cnVlLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzW2NvcnJlbGF0aW9uSWRdID0gdGhpcy5zaWduYWw7XG59O1xuZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24ocmVhc29uKSB7XG4gIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47IC8vIGFscmVhZHkgYWJvcnRlZCAoZS5nLiBmcm9tIHJlcGxheSlcbiAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcbiAgLy8gTWFyayB0aGUgcGVuZGluZyBob29rIG9wIHNvIHRoZSBob3N0IHJlY29yZHMgdGhlIGFib3J0LiBUaGUgcGF5bG9hZFxuICAvLyBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3Qgc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdpdGggZnVsbFxuICAvLyB0eXBlIGZpZGVsaXR5IChFcnJvcnMsIERPTUV4Y2VwdGlvbiwgY3VzdG9tIHZhbHVlcykuXG4gIHZhciB0b2tlbiA9IHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWxUaGlzLl9fcGVuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gZ2xvYmFsVGhpcy5fX3BlbmRpbmdbaV07XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJob29rXCIgJiYgaXRlbS50b2tlbiA9PT0gdG9rZW4pIHtcbiAgICAgIGl0ZW0uYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgaXRlbS5hYm9ydFBheWxvYWQgPSB7XG4gICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbCA9IHtcbiAgYWJvcnQ6IGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIHZhciBzID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoXCJcIiwgXCJcIik7XG4gICAgcy5fc2V0QWJvcnRlZChyZWFzb24gIT09IHVuZGVmaW5lZCA/IHJlYXNvbiA6IF9fbWFrZUFib3J0RXJyb3IoKSk7XG4gICAgcmV0dXJuIHM7XG4gIH0sXG4gIGFueTogZnVuY3Rpb24oc2lnbmFscykge1xuICAgIHZhciBjb21wb3NpdGUgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbChcIlwiLCBcIlwiKTtcbiAgICB2YXIgYXJyID0gQXJyYXkuZnJvbShzaWduYWxzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXS5hYm9ydGVkKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5fc2V0QWJvcnRlZChhcnJbaV0ucmVhc29uKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpc3RlbmVycy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAobGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgbGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXJzW2pdLmxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfTtcbiAgICBhcnIuZm9yRWFjaChmdW5jdGlvbihzaWduYWwpIHtcbiAgICAgIGlmICghc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIpIHJldHVybjtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWNvbXBvc2l0ZS5hYm9ydGVkKSB7XG4gICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxpc3RlbmVycy5wdXNoKHsgc2lnbmFsOiBzaWduYWwsIGxpc3RlbmVyOiBsaXN0ZW5lciB9KTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb21wb3NpdGU7XG4gIH0sXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQWJvcnRTaWduYWwudGltZW91dCgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiBcIiArXG4gICAgICAgIFwiVXNlIHNsZWVwKCkgd2l0aCBhbiBBYm9ydENvbnRyb2xsZXIgaW5zdGVhZC4gXCIgK1xuICAgICAgICBcIlNlZTogL2RvY3MvZXJyb3JzL2Fib3J0LXNpZ25hbC10aW1lb3V0LWluLXdvcmtmbG93XCJcbiAgICApO1xuICB9LFxufTtcblxuLy8gV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCDigJQgZ2VuZXJhdGVzIGEgc3RyZWFtIElEIGZvciBhIHdvcmtmbG93IHJ1bi5cbi8vIFJlcGxpY2F0ZXMgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCgpIGZyb20gdXRpbC50cyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0uXG4vLyBVc2VzIHRoZSBidWlsdC1pbiBidG9hKCkgZm9yIGJhc2U2NHVybCBlbmNvZGluZy5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0dFVF9TVFJFQU1fSURcIildID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gIHZhciBydW5JZCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0NPTlRFWFRcIildXG4gICAgPyBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXS53b3JrZmxvd1J1bklkXG4gICAgOiBcIlwiO1xuICB2YXIgc3RyZWFtSWQgPSBydW5JZC5yZXBsYWNlKFwid3J1bl9cIiwgXCJzdHJtX1wiKSArIFwiX3VzZXJcIjtcbiAgaWYgKCFuYW1lc3BhY2UpIHJldHVybiBzdHJlYW1JZDtcbiAgLy8gYmFzZTY0dXJsOiBidG9hIHRoZW4gcmVwbGFjZSArIHdpdGggLSwgLyB3aXRoIF8sIHN0cmlwID1cbiAgdmFyIGI2NCA9IGJ0b2EobmFtZXNwYWNlKS5yZXBsYWNlKC9cXFxcKy9nLCBcIi1cIikucmVwbGFjZSgvXFxcXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0rJC8sIFwiXCIpO1xuICByZXR1cm4gc3RyZWFtSWQgKyBcIl9cIiArIGI2NDtcbn07XG5gO1xuXG4vLyAtLS0tIFJ1bnRpbWUgLS0tLVxuXG4vKipcbiAqIFBoYXNlIDEg4oCUIHN0YXRpYyAocnVuLWluZGVwZW5kZW50KSBWTSBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBDcmVhdGVzIGEgUXVpY2tKUyBWTSBhbmQgbG9hZHMgZXZlcnl0aGluZyB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBhXG4gKiBzcGVjaWZpYyB3b3JrZmxvdyBydW46IHRoZSB3b3JrZmxvdy1wcmltaXRpdmUgYm9vdHN0cmFwICh1c2VTdGVwIC9cbiAqIHNsZWVwIC8gY3JlYXRlSG9vayAvIFJlc3BvbnNlLVJlcXVlc3QgcG9seWZpbGxzKS4gU2VyaWFsaXphdGlvbiBpc1xuICogaG9zdC1zaWRlIChxdWlja2pzLXNlcmRlLnRzKSBhbmQgY2FwdHVyZXMgaXRzIGludHJpbnNpY3MgZnJvbSB0aGUgVk1cbiAqIHJpZ2h0IGFmdGVyIHRoaXMgcmV0dXJucy5cbiAqXG4gKiBgZ2V0Tm93TXNgIGJhY2tzIHRoZSBWTSdzIFdBU0kgY2xvY2sgKGBEYXRlLm5vdygpYCAvIGBuZXcgRGF0ZSgpYFxuICogaW5zaWRlIHRoZSBWTSkuIFRoZSBjYWxsYmFjayBpdHNlbGYgaXMgc3RhdGljIOKAlCB0aGUgcGVyLXJ1biBzdGF0ZSBpdFxuICogcmVhZHMgbGl2ZXMgb24gdGhlIGhvc3QgYW5kIGlzIGFkdmFuY2VkIGFzIGV2ZW50cyBhcmUgY29uc3VtZWQsXG4gKiBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkZXRlcm1pbmlzdGljIHJlcGxheSBjbG9jay5cbiAqXG4gKiBUaGlzIHBoYXNlIGlzIHRoZSBmdXR1cmUgYm91bmRhcnkgZm9yIFZNLW1lbW9yeSBzbmFwc2hvdHRpbmc6IGFcbiAqIGJ1aWxkLXRpbWUgc25hcHNob3QgY2FuIGNhcHR1cmUgdGhlIFZNIHJpZ2h0IGFmdGVyIHRoaXMgZnVuY3Rpb24gYW5kXG4gKiBuZXcgcnVucyBjYW4gcmVzdG9yZSBmcm9tIGl0IGluc3RlYWQgb2YgcGF5aW5nIFZNIGNyZWF0aW9uICsgZXZhbCBjb3N0XG4gKiAoYFF1aWNrSlMucmVzdG9yZWAgYWNjZXB0cyB0aGUgc2FtZSB3YXNpIG92ZXJyaWRlKS5cbiAqL1xuLyoqXG4gKiBMb29zZWx5LXR5cGVkIGFjY2Vzc29yIGZvciB0aGUgYFdlYkFzc2VtYmx5YCBnbG9iYWwuIFRoZSBwYWNrYWdlXG4gKiB0c2NvbmZpZydzIGBsaWI6IFtcImVzMjAyMlwiXWAgZG9lcyBub3QgaW5jbHVkZSB0aGUgRE9NIGxpYiB3aGVyZSB0aGVcbiAqIGBXZWJBc3NlbWJseWAgbmFtZXNwYWNlIHR5cGVzIGxpdmU7IHRoZSBydW50aW1lIGdsb2JhbCBpcyBhdmFpbGFibGUgb25cbiAqIGV2ZXJ5IFdBU00tY2FwYWJsZSBwbGF0Zm9ybSB0aGlzIGVuZ2luZSB0YXJnZXRzLlxuICovXG5jb25zdCBXZWJBc3NlbWJseUdsb2JhbCA9IChnbG9iYWxUaGlzIGFzIGFueSkuV2ViQXNzZW1ibHkgYXMge1xuICBjb21waWxlKGJ5dGVzOiBVaW50OEFycmF5KTogUHJvbWlzZTxvYmplY3Q+O1xufTtcblxudHlwZSBDb21waWxlZEV4dGVuc2lvbiA9IE9taXQ8RXh0ZW5zaW9uRGVzY3JpcHRvciwgJ3dhc20nPiAmIHtcbiAgd2FzbTogRXh0ZW5zaW9uRGVzY3JpcHRvclsnd2FzbSddO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUgY2FjaGUgb2YgdGhlIGNvbXBpbGVkIGBXZWJBc3NlbWJseS5Nb2R1bGVgcyBmb3IgdGhlIG1haW5cbiAqIFF1aWNrSlMgcnVudGltZSBhbmQgaXRzIG5hdGl2ZSBleHRlbnNpb25zLiBgV2ViQXNzZW1ibHkuY29tcGlsZWAgb2YgdGhlXG4gKiB+NjAwIEtCIHJ1bnRpbWUgYmluYXJ5IGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSBwYXJ0IG9mIFZNIGNyZWF0aW9uIGFuZCBpc1xuICogcHVyZSAobm8gcGVyLVZNIHN0YXRlIOKAlCBpbnN0YW50aWF0aW9uIGJpbmRzIHRoZSBwZXItVk0gbWVtb3J5KSwgc28gaXRcbiAqIG9ubHkgbmVlZHMgdG8gaGFwcGVuIG9uY2UgcGVyIHByb2Nlc3MuIFRoZSBwcm9taXNlIGlzIGNhY2hlZCAobm90IHRoZVxuICogcmVzdWx0KSBzbyBjb25jdXJyZW50IGZpcnN0IGludm9jYXRpb25zIHNoYXJlIGEgc2luZ2xlIGNvbXBpbGF0aW9uLlxuICovXG5sZXQgY29tcGlsZWRBc3NldHNQcm9taXNlOlxuICB8IFByb21pc2U8e1xuICAgICAgd2FzbTogb2JqZWN0O1xuICAgICAgZXh0ZW5zaW9uczogQ29tcGlsZWRFeHRlbnNpb25bXTtcbiAgICB9PlxuICB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0Q29tcGlsZWRBc3NldHMoKSB7XG4gIGlmICghY29tcGlsZWRBc3NldHNQcm9taXNlKSB7XG4gICAgY29tcGlsZWRBc3NldHNQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFt3YXNtLCAuLi5leHRlbnNpb25Nb2R1bGVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgV2ViQXNzZW1ibHlHbG9iYWwuY29tcGlsZShxdWlja2pzV2FzbSksXG4gICAgICAgIC4uLnF1aWNranNFeHRlbnNpb25zLm1hcCgoZXh0KSA9PlxuICAgICAgICAgIFdlYkFzc2VtYmx5R2xvYmFsLmNvbXBpbGUoZXh0Lndhc20gYXMgVWludDhBcnJheSlcbiAgICAgICAgKSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgd2FzbSxcbiAgICAgICAgZXh0ZW5zaW9uczogcXVpY2tqc0V4dGVuc2lvbnMubWFwKChleHQsIGkpID0+ICh7XG4gICAgICAgICAgLi4uZXh0LFxuICAgICAgICAgIHdhc206IGV4dGVuc2lvbk1vZHVsZXNbaV0gYXMgRXh0ZW5zaW9uRGVzY3JpcHRvclsnd2FzbSddLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgIH0pKCk7XG4gICAgLy8gT24gZmFpbHVyZSwgY2xlYXIgdGhlIGNhY2hlIHNvIGEgbGF0ZXIgaW52b2NhdGlvbiBjYW4gcmV0cnkgcmF0aGVyXG4gICAgLy8gdGhhbiBiZWluZyBzdHVjayB3aXRoIGEgcmVqZWN0ZWQgcHJvbWlzZSBmb3JldmVyLlxuICAgIGNvbXBpbGVkQXNzZXRzUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgICBjb21waWxlZEFzc2V0c1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGNvbXBpbGVkQXNzZXRzUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBXQVNJIGNsb2NrIG92ZXJyaWRlIHJlYWRpbmcgdGhlIGdpdmVuIGFjY2Vzc29yIOKAlCBzaGFyZWQgYmV0d2VlbiBmcmVzaFxuICogYm9vdHMgKGluaXRXb3JrZmxvd1ZNKSBhbmQgYmFzZWxpbmUtc25hcHNob3QgcmVzdG9yZXMsIHNvIHRoZSB0d29cbiAqIHBhdGhzIGNhbm5vdCBkcmlmdCBvbiByb3VuZGluZy9lbmNvZGluZy5cbiAqXG4gKiBEZXRlcm1pbmlzdGljIHJlcGxheSBjbG9jazogRGF0ZS5ub3coKSAvIG5ldyBEYXRlKCkgaW5zaWRlIHRoZSBWTVxuICogcmVhZCB0aGUgaG9zdC1jb250cm9sbGVkIGNsb2NrIGluc3RlYWQgb2Ygd2FsbCB0aW1lLiBSZXBsYXlcbiAqIHJlLWV4ZWN1dGVzIHRoZSB3b3JrZmxvdyBmcm9tIHRoZSB0b3Agb24gZXZlcnkgaW52b2NhdGlvbiwgc28gdGhlXG4gKiBjbG9jayBtdXN0IGJlIGRlcml2ZWQgZnJvbSB0aGUgZXZlbnQgbG9nIChub3QgcmVhbCB0aW1lKSBmb3IgdGhlXG4gKiB3b3JrZmxvdyB0byBvYnNlcnZlIHN0YWJsZSB0aW1lc3RhbXBzIGFjcm9zcyBpbnZvY2F0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbWFrZURldGVybWluaXN0aWNDbG9ja1dhc2koZ2V0Tm93TXM6ICgpID0+IG51bWJlcik6IFdhc2lPcHRpb25zIHtcbiAgcmV0dXJuIChtZW1vcnkpID0+ICh7XG4gICAgY2xvY2tfdGltZV9nZXQoX2Nsb2NrSWQ6IG51bWJlciwgX3ByZWNpc2lvbjogYmlnaW50LCByZXN1bHRQdHI6IG51bWJlcikge1xuICAgICAgY29uc3QgdGltZU5zID0gQmlnSW50KE1hdGgucm91bmQoZ2V0Tm93TXMoKSkpICogMV8wMDBfMDAwbjtcbiAgICAgIG5ldyBEYXRhVmlldyhtZW1vcnkuYnVmZmVyKS5zZXRCaWdVaW50NjQocmVzdWx0UHRyLCB0aW1lTnMsIHRydWUpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXRXb3JrZmxvd1ZNKFxuICBnZXROb3dNczogKCkgPT4gbnVtYmVyLFxuICBpbnRlcnJ1cHRCdWRnZXQ6IEludGVycnVwdEJ1ZGdldFxuKTogUHJvbWlzZTxRdWlja0pTPiB7XG4gIGNvbnN0IGFzc2V0cyA9IGF3YWl0IGdldENvbXBpbGVkQXNzZXRzKCk7XG4gIGNvbnN0IHZtID0gYXdhaXQgUXVpY2tKUy5jcmVhdGUoe1xuICAgIHdhc206IGFzc2V0cy53YXNtIGFzIG5ldmVyLFxuICAgIG1lbW9yeUxpbWl0OiAyNTYgKiAxMDI0ICogMTAyNCxcbiAgICBpbnRlcnJ1cHRIYW5kbGVyOiBjcmVhdGVJbnRlcnJ1cHRIYW5kbGVyKGludGVycnVwdEJ1ZGdldCksXG4gICAgZXh0ZW5zaW9uczogYXNzZXRzLmV4dGVuc2lvbnMsXG4gICAgd2FzaTogbWFrZURldGVybWluaXN0aWNDbG9ja1dhc2koZ2V0Tm93TXMpLFxuICB9KTtcblxuICAvLyBCb290c3RyYXAgd29ya2Zsb3cgcHJpbWl0aXZlc1xuICB2bS5ldmFsQ29kZShWTV9CT09UU1RSQVAsICdib290c3RyYXAuanMnKS5kaXNwb3NlKCk7XG5cbiAgcmV0dXJuIHZtO1xufVxuXG4vLyAtLS0tIEJhc2VsaW5lIHNuYXBzaG90IChzdGFydHVwIG9wdGltaXphdGlvbikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG4vLyBFdmFsdWF0aW5nIHRoZSB3b3JrZmxvdyBidW5kbGUgZG9taW5hdGVzIFZNIHN0YXJ0dXAgKH43NG1zIG9mIGEgfjc3bXNcbi8vIGJvb3QgZm9yIGEgMS4zTUIgYnVuZGxlKSwgYW5kIGZ1bGwgZXZlbnQgcmVwbGF5IHBheXMgaXQgb24gRVZFUllcbi8vIGludm9jYXRpb24uIFRoZSBidW5kbGUgaXMgaWRlbnRpY2FsIGFjcm9zcyBhbGwgcnVucyBvZiBhIGRlcGxveW1lbnQsIHNvXG4vLyB0aGUgZW5naW5lIGh5ZHJhdGVzIG9uZSBWTSBwZXIgZnVuY3Rpb24gaW5zdGFuY2UgKGJvb3RzdHJhcCArIGJ1bmRsZVxuLy8gZXZhbCksIHNuYXBzaG90cyBpdHMgbWVtb3J5LCBhbmQgc3RhcnRzIGV2ZXJ5IGludm9jYXRpb24gYnkgcmVzdG9yaW5nXG4vLyB0aGUgc25hcHNob3QgKH4zbXMpIGluc3RlYWQgb2YgcmUtZXZhbHVhdGluZy5cbi8vXG4vLyBEZXRlcm1pbmlzbTogcmVwbGF5IHJlcXVpcmVzIG1vZHVsZS1zY29wZSB1c2VyIGNvZGUgdG8gb2JzZXJ2ZSB0aGVcbi8vIHJ1bi1zZWVkZWQgUFJORyBhbmQgdGhlIHJ1bidzIGRldGVybWluaXN0aWMgY2xvY2suIEEgcmVzdG9yZWQgaGVhcFxuLy8gY2FycmllcyB3aGF0ZXZlciBtb2R1bGUgc2NvcGUgY29tcHV0ZWQgYXQgSFlEUkFURSB0aW1lLCBzbyB0aGVcbi8vIG9wdGltaXphdGlvbiBpcyBvbmx5IHNvdW5kIHdoZW4gbW9kdWxlIHNjb3BlIGNvbnN1bWVkIG5laXRoZXJcbi8vIHJhbmRvbW5lc3Mgbm9yIHRpbWUuIEJvdGggYXJlIGRldGVjdGVkIGR1cmluZyBoeWRyYXRlIOKAlCB0aGUgcGxhY2Vob2xkZXJcbi8vIGhvc3QgZm5zIGNvdW50IGRyYXdzLCB0aGUgaHlkcmF0ZSBjbG9jayBjb3VudHMgcmVhZHMg4oCUIGFuZCBhIGJ1bmRsZVxuLy8gdGhhdCB1c2VkIGVpdGhlciBpcyBtYXJrZWQgaW5lbGlnaWJsZTogZXZlcnkgaW52b2NhdGlvbiBmYWxscyBiYWNrIHRvXG4vLyBmcmVzaCBldmFsdWF0aW9uLCBwcmVzZXJ2aW5nIGV4YWN0IG5vZGU6dm0tcGFyaXR5IHNlbWFudGljcy4gV2hlbiB0aGVcbi8vIGdhdGUgcGFzc2VzLCByZXN0b3JlIGlzIGJ5dGUtZXF1aXZhbGVudCB0byBmcmVzaCBldmFsICh2ZXJpZmllZCBieSB0aGVcbi8vIHBhcml0eSB0ZXN0cyk6IHRoZSBwZXItcnVuIGhvc3QgZm5zIGFyZSByZS1yZWdpc3RlcmVkIGJ5IG5hbWUgb24gdGhlXG4vLyByZXN0b3JlZCBWTSAocXVpY2tqcy13YXNpIHJlc3RvcmUgc2VtYW50aWNzKSBiZWZvcmUgdGhlIHdvcmtmbG93IGJvZHlcbi8vIHJ1bnMsIHNvIHRoZSBzZWVkZWQgZHJhdyBzZXF1ZW5jZSDigJQgYW5kIGV2ZXJ5IGNvcnJlbGF0aW9uSWQg4oCUIGlzXG4vLyBpZGVudGljYWwuXG4vL1xuLy8gVGhlIGNhY2hlIGlzIHBlciBmdW5jdGlvbiBpbnN0YW5jZSBhbmQga2V5ZWQgb24gdGhlIGJ1bmRsZSBzdHJpbmdcbi8vIChyZWZlcmVuY2Utc3RhYmxlOiB0aGUgZ2VuZXJhdGVkIGZsb3cgcm91dGUgaG9sZHMgaXQgaW4gYSBtb2R1bGUtbGV2ZWxcbi8vIGNvbnN0KS4gQ2FwcGVkIGF0IGEgZmV3IGVudHJpZXMgc28gdGVzdHMgd2l0aCBtYW55IGRpc3RpbmN0IGJ1bmRsZXNcbi8vIGRvbid0IGFjY3VtdWxhdGUgMTZNQiBzbmFwc2hvdHMuXG5cbi8qKlxuICogRXZhbCBmaWxlbmFtZSB1c2VkIHdoZW4gaHlkcmF0aW5nIHRoZSBiYXNlbGluZSBWTS4gVGhlIGJhc2VsaW5lIGlzXG4gKiBzaGFyZWQgYnkgRVZFUlkgd29ya2Zsb3cgaW4gdGhlIGJ1bmRsZSwgc28gdGhlIGZpbGVuYW1lIGJha2VkIGludG9cbiAqIGl0cyBjb21waWxlZCBjb2RlIChhbmQgdGhlcmVmb3JlIGludG8gc25hcHNob3QtcGF0aCBzdGFjayBmcmFtZXMpXG4gKiBtdXN0IGJlIHdvcmtmbG93LWluZGVwZW5kZW50IOKAlCBoeWRyYXRpbmcgdW5kZXIgdGhlIGZpcnN0IGNhbGxlcidzXG4gKiB3b3JrZmxvd0lkIHdvdWxkIGJyZWFrIGByZW1hcEVycm9yU3RhY2tgJ3MgZmlsZW5hbWUgbWF0Y2hpbmcgZm9yXG4gKiBldmVyeSBvdGhlciB3b3JrZmxvdyBpbiB0aGUgYnVuZGxlLiBSZW1hcCBjYWxsIHNpdGVzIG1hdGNoIHRoaXNcbiAqIGNvbnN0YW50IElOIEFERElUSU9OIHRvIHRoZSBydW4ncyBtb2R1bGUgc3BlY2lmaWVyICh3aGljaCBjb3ZlcnNcbiAqIGZyZXNoLXBhdGggZnJhbWVzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRSA9ICd3b3JrZmxvdy1idW5kbGUuanMnO1xuXG50eXBlIEJhc2VsaW5lRW50cnkgPVxuICB8IHtcbiAgICAgIHN0YXRlOiAncmVhZHknO1xuICAgICAgc25hcHNob3Q6IFNuYXBzaG90O1xuICAgICAgLyoqXG4gICAgICAgKiBSYXcgYm94IHBvaW50ZXIgb2YgdGhlIHNlcmRlIGNhcHR1cmUgcm9vdCBjcmVhdGVkIEJFRk9SRSB0aGVcbiAgICAgICAqIGJ1bmRsZSBldmFsdWF0ZWQgKHNlZSBjYXB0dXJlU2VyZGVSb290KS4gVGhlIGJveCBsaXZlcyBpbiB0aGVcbiAgICAgICAqIHNuYXBzaG90J3MgbWVtb3J5IGltYWdlIGF0IHRoaXMgb2Zmc2V0OyBldmVyeSByZXN0b3JlZCBWTVxuICAgICAgICogcmUtYWRvcHRzIGl0IHNvIHNlcmRlIGluaXRpYWxpemF0aW9uIGV4ZWN1dGVzIG5vIGd1ZXN0IGNvZGVcbiAgICAgICAqIGFmdGVyIHVzZXIgY29kZSBoYXMgcnVuIOKAlCBjYXB0dXJlLWJlZm9yZS11c2VyLWNvZGUgc2VtYW50aWNzLFxuICAgICAgICogaWRlbnRpY2FsIHRvIHRoZSBmcmVzaCBwYXRoLlxuICAgICAgICovXG4gICAgICBzZXJkZVJvb3RQdHI6IG51bWJlcjtcbiAgICB9XG4gIHwgeyBzdGF0ZTogJ2luZWxpZ2libGUnOyByZWFzb246IHN0cmluZyB9O1xuXG5jb25zdCBiYXNlbGluZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8QmFzZWxpbmVFbnRyeT4+KCk7XG5jb25zdCBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUyA9IDQ7XG5cbi8qKiBUZXN0LW9ubHk6IHJlc2V0IHRoZSBiYXNlbGluZSBjYWNoZSBiZXR3ZWVuIHRlc3QgY2FzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX19jbGVhckJhc2VsaW5lU25hcHNob3RDYWNoZUZvclRlc3RzKCk6IHZvaWQge1xuICBiYXNlbGluZUNhY2hlLmNsZWFyKCk7XG59XG5cbi8qKiBUZXN0LW9ubHk6IG9ic2VydmUgaG93IGEgYnVuZGxlIHdhcyBjbGFzc2lmaWVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9fcGVla0Jhc2VsaW5lRW50cnlGb3JUZXN0cyhcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmdcbik6IFByb21pc2U8QmFzZWxpbmVFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gYmFzZWxpbmVDYWNoZS5nZXQod29ya2Zsb3dDb2RlKTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIGEgVk0gd2l0aCB0aGUgd29ya2Zsb3cgYnVuZGxlIGFuZCBzbmFwc2hvdCBpdCwgZ2F0aW5nIG9uXG4gKiBtb2R1bGUtc2NvcGUgbm9uZGV0ZXJtaW5pc20gKHNlZSB0aGUgc2VjdGlvbiBjb21tZW50IGFib3ZlKS4gUmV0dXJucyBhblxuICogYGluZWxpZ2libGVgIGVudHJ5IGluc3RlYWQgb2YgdGhyb3dpbmcgb24gZXZhbCBmYWlsdXJlIOKAlCB0aGUgZnJlc2ggcGF0aFxuICogcmUtZXZhbHVhdGVzIGFuZCBwcm9kdWNlcyB0aGUgcmVhbCwgc291cmNlLW1hcHBlZCBlcnJvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUJhc2VsaW5lU25hcHNob3QoXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICB3b3JrZmxvd0lkOiBzdHJpbmdcbik6IFByb21pc2U8QmFzZWxpbmVFbnRyeT4ge1xuICBjb25zdCBoeWRyYXRlU3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgY2xvY2tSZWFkcyA9IDA7XG4gIGNvbnN0IGJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0ID0geyBzdGFydDogRGF0ZS5ub3coKSB9O1xuICBjb25zdCBhc3NldHMgPSBhd2FpdCBnZXRDb21waWxlZEFzc2V0cygpO1xuICBjb25zdCB2bSA9IGF3YWl0IFF1aWNrSlMuY3JlYXRlKHtcbiAgICB3YXNtOiBhc3NldHMud2FzbSBhcyBuZXZlcixcbiAgICBtZW1vcnlMaW1pdDogMjU2ICogMTAyNCAqIDEwMjQsXG4gICAgaW50ZXJydXB0SGFuZGxlcjogY3JlYXRlSW50ZXJydXB0SGFuZGxlcihidWRnZXQpLFxuICAgIGV4dGVuc2lvbnM6IGFzc2V0cy5leHRlbnNpb25zLFxuICAgIHdhc2k6ICgobWVtb3J5KSA9PiAoe1xuICAgICAgY2xvY2tfdGltZV9nZXQoX2Nsb2NrSWQ6IG51bWJlciwgX3ByZWNpc2lvbjogYmlnaW50LCByZXN1bHRQdHI6IG51bWJlcikge1xuICAgICAgICBjbG9ja1JlYWRzKys7XG4gICAgICAgIGNvbnN0IHRpbWVOcyA9IEJpZ0ludChoeWRyYXRlU3RhcnQpICogMV8wMDBfMDAwbjtcbiAgICAgICAgbmV3IERhdGFWaWV3KG1lbW9yeS5idWZmZXIpLnNldEJpZ1VpbnQ2NChyZXN1bHRQdHIsIHRpbWVOcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSxcbiAgICB9KSkgc2F0aXNmaWVzIFdhc2lPcHRpb25zLFxuICB9KTtcbiAgdHJ5IHtcbiAgICB2bS5ldmFsQ29kZShWTV9CT09UU1RSQVAsICdib290c3RyYXAuanMnKS5kaXNwb3NlKCk7XG5cbiAgICAvLyBQbGFjZWhvbGRlciBob3N0IGZucyB1bmRlciB0aGUgU0FNRSBOQU1FUyB0aGUgcGVyLXJ1biBwaGFzZSB1c2VzLlxuICAgIC8vIFRoZXkgZXhpc3Qgc28gbW9kdWxlLXNjb3BlIGNvZGUgY2FuIGV4ZWN1dGUgYXQgaHlkcmF0ZSB0aW1lLCBhbmQgdG9cbiAgICAvLyBkZXRlY3QgdGhhdCBpdCBkaWQ6IGFueSBkcmF3IG1lYW5zIHRoZSBoZWFwIHdvdWxkIGJha2VcbiAgICAvLyBoeWRyYXRlLXNlZWRlZCB2YWx1ZXMgdGhhdCBwZXItcnVuIGZyZXNoIGV2YWwgd291bGQgY29tcHV0ZVxuICAgIC8vIGRpZmZlcmVudGx5LiBydW5Xb3JrZmxvd0luVk0gcmUtcmVnaXN0ZXJzIGFsbCB0aHJlZSBuYW1lcyB3aXRoIHRoZVxuICAgIC8vIHJ1bi1zZWVkZWQgY2xvc3VyZXMgYWZ0ZXIgcmVzdG9yZS5cbiAgICBsZXQgZHJhd3MgPSAwO1xuICAgIHtcbiAgICAgIHVzaW5nIHJhbmRvbUZuID0gdm0ubmV3RnVuY3Rpb24oJ3JhbmRvbScsICgpID0+IHtcbiAgICAgICAgZHJhd3MrKztcbiAgICAgICAgcmV0dXJuIHZtLm5ld051bWJlcihNYXRoLnJhbmRvbSgpKTtcbiAgICAgIH0pO1xuICAgICAgdXNpbmcgbWF0aCA9IHZtLmdsb2JhbC5nZXRQcm9wKCdNYXRoJyk7XG4gICAgICBtYXRoLnNldFByb3AoJ3JhbmRvbScsIHJhbmRvbUZuKTtcbiAgICAgIHVzaW5nIG5hbm9pZEZuID0gdm0ubmV3RnVuY3Rpb24oJ19fZ2VuZXJhdGVOYW5vaWQnLCAoKSA9PiB7XG4gICAgICAgIGRyYXdzKys7XG4gICAgICAgIHJldHVybiB2bS5uZXdTdHJpbmcoJ2Jhc2VsaW5lLXBsYWNlaG9sZGVyJyk7XG4gICAgICB9KTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX19nZW5lcmF0ZU5hbm9pZCcsIG5hbm9pZEZuKTtcbiAgICAgIHVzaW5nIHVsaWRGbiA9IHZtLm5ld0Z1bmN0aW9uKCdfX2dlbmVyYXRlVWxpZCcsICgpID0+IHtcbiAgICAgICAgZHJhd3MrKztcbiAgICAgICAgcmV0dXJuIHZtLm5ld1N0cmluZygnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKTtcbiAgICAgIH0pO1xuICAgICAgdm0uc2V0UHJvcCh2bS5nbG9iYWwsICdfX2dlbmVyYXRlVWxpZCcsIHVsaWRGbik7XG4gICAgfVxuXG4gICAgLy8gU2VyZGUgY2FwdHVyZSByb290IOKAlCBjcmVhdGVkIEJFRk9SRSB0aGUgYnVuZGxlIGV2YWx1YXRlcywgZXhhY3RseVxuICAgIC8vIGxpa2UgdGhlIGZyZXNoIHBhdGgncyBjYXB0dXJlLiBJdHMgYm94IHBvaW50ZXIgcmlkZXMgdGhlXG4gICAgLy8gQmFzZWxpbmVFbnRyeSBhbmQgZWFjaCByZXN0b3JlZCBWTSByZS1hZG9wdHMgaXQsIHNvIHNlcmRlXG4gICAgLy8gaW5pdGlhbGl6YXRpb24gbmV2ZXIgZXhlY3V0ZXMgZ3Vlc3QgY29kZSBhZnRlciB1c2VyIGNvZGUgaGFzIHJ1bi5cbiAgICAvLyBUaGlzIGlzIHdoYXQgbWFrZXMgbW9kdWxlLXNjb3BlIGludHJpbnNpYyBwYXRjaGluZyAocG9seWZpbGxzLFxuICAgIC8vIHN0YXRlZnVsIHdyYXBwZXJzIGFyb3VuZCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLCDigKYpXG4gICAgLy8gSEFSTUxFU1Mgb24gdGhlIHNuYXBzaG90IHBhdGggcmF0aGVyIHRoYW4gbWVyZWx5IGRldGVjdGFibGU6IHRoZVxuICAgIC8vIHNlcmRlIHVzZXMgdGhlIHByaXN0aW5lIHByZS1ldmFsIGNhcHR1cmVzIG9uIGJvdGggcGF0aHMsIGFuZCBub1xuICAgIC8vIHBvc3QtZXZhbCBwcm9iZSBleGlzdHMgd2hvc2Ugc2lkZSBlZmZlY3RzIGNvdWxkIGJha2UgaW50byB0aGVcbiAgICAvLyBzbmFwc2hvdC4gVGhlIGhhbmRsZSBpcyBkZWxpYmVyYXRlbHkgTk9UIGRpc3Bvc2VkIGJlZm9yZSB0aGVcbiAgICAvLyBzbmFwc2hvdCDigJQgdGhlIGJveCBtdXN0IHN0YXkgbGl2ZSBpbiB0aGUgbWVtb3J5IGltYWdlICh0aGVcbiAgICAvLyBiYXNlbGluZSBWTSdzIGRpc3Bvc2UgYmVsb3cgdGVhcnMgZG93biB0aGUgd2hvbGUgaW5zdGFuY2Ugd2l0aG91dFxuICAgIC8vIGZyZWVpbmcgaW5kaXZpZHVhbCBib3hlcykuXG4gICAgY29uc3Qgc2VyZGVSb290ID0gY2FwdHVyZVNlcmRlUm9vdCh2bSk7XG5cbiAgICBjbG9ja1JlYWRzID0gMDsgLy8gb25seSBjb3VudCByZWFkcyBtYWRlIGJ5IHRoZSBidW5kbGUgaXRzZWxmXG4gICAgdHJ5IHtcbiAgICAgIC8vIFdvcmtmbG93LWluZGVwZW5kZW50IGZpbGVuYW1lIOKAlCBzZWUgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FLlxuICAgICAgdm0uZXZhbENvZGUod29ya2Zsb3dDb2RlLCBCQVNFTElORV9CVU5ETEVfRklMRU5BTUUpLmRpc3Bvc2UoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExldCB0aGUgZnJlc2ggcGF0aCByZS1ldmFsdWF0ZSBhbmQgc3VyZmFjZSB0aGUgcmVhbCBlcnJvciB3aXRoXG4gICAgICAvLyBwcm9wZXIgZmlsZW5hbWUgLyBzb3VyY2UtbWFwIGhhbmRsaW5nLlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdGU6ICdpbmVsaWdpYmxlJyxcbiAgICAgICAgcmVhc29uOiAnbW9kdWxlIHNjb3BlIHRocmV3IGR1cmluZyBoeWRyYXRlJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGRyYXdzID4gMCB8fCBjbG9ja1JlYWRzID4gMCkge1xuICAgICAgcnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAnUXVpY2tKUyBiYXNlbGluZSBzbmFwc2hvdCBkaXNhYmxlZCBmb3IgdGhpcyBidW5kbGU6IG1vZHVsZSBzY29wZSBjb25zdW1lZCBub25kZXRlcm1pbmlzdGljIGlucHV0czsgZXZlcnkgaW52b2NhdGlvbiB3aWxsIGV2YWx1YXRlIHRoZSBidW5kbGUgZnJlc2gnLFxuICAgICAgICB7IHdvcmtmbG93SWQsIGRyYXdzLCBjbG9ja1JlYWRzIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0ZTogJ2luZWxpZ2libGUnLFxuICAgICAgICByZWFzb246IGBtb2R1bGUgc2NvcGUgY29uc3VtZWQgJHtkcmF3c30gUFJORyBkcmF3KHMpIGFuZCAke2Nsb2NrUmVhZHN9IGNsb2NrIHJlYWQocylgLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IHZtLnNuYXBzaG90KCk7XG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBiYXNlbGluZSBzbmFwc2hvdCBwcmVwYXJlZCcsIHtcbiAgICAgIHdvcmtmbG93SWQsXG4gICAgICBoeWRyYXRlTXM6IERhdGUubm93KCkgLSBoeWRyYXRlU3RhcnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiAncmVhZHknLFxuICAgICAgc25hcHNob3QsXG4gICAgICBzZXJkZVJvb3RQdHI6IGV4cG9ydFNlcmRlUm9vdCh2bSwgc2VyZGVSb290KSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIHZtLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIENhY2hlZCBiYXNlbGluZSBlbnRyeSBmb3IgYSBidW5kbGUsIHByZXBhcmluZyBpdCBvbiBmaXJzdCBhY2Nlc3MuXG4gKiBDb25jdXJyZW50IGZpcnN0IGludm9jYXRpb25zIHNoYXJlIG9uZSBoeWRyYXRlIHZpYSB0aGUgY2FjaGVkIHByb21pc2U7XG4gKiBhIGh5ZHJhdGUgdGhhdCBSRUpFQ1RTIChpbmZyYXN0cnVjdHVyZSBmYWlsdXJlLCBub3QgYnVuZGxlIGV2YWwg4oCUIHRoYXRcbiAqIHJldHVybnMgYGluZWxpZ2libGVgKSBpcyBldmljdGVkIHNvIGEgbGF0ZXIgaW52b2NhdGlvbiBjYW4gcmV0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldEJhc2VsaW5lRW50cnkoXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nLFxuICB3b3JrZmxvd0lkOiBzdHJpbmdcbik6IFByb21pc2U8QmFzZWxpbmVFbnRyeT4ge1xuICBsZXQgZW50cnkgPSBiYXNlbGluZUNhY2hlLmdldCh3b3JrZmxvd0NvZGUpO1xuICBpZiAoIWVudHJ5KSB7XG4gICAgaWYgKGJhc2VsaW5lQ2FjaGUuc2l6ZSA+PSBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gYmFzZWxpbmVDYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSBiYXNlbGluZUNhY2hlLmRlbGV0ZShvbGRlc3QpO1xuICAgIH1cbiAgICBlbnRyeSA9IHByZXBhcmVCYXNlbGluZVNuYXBzaG90KHdvcmtmbG93Q29kZSwgd29ya2Zsb3dJZCk7XG4gICAgYmFzZWxpbmVDYWNoZS5zZXQod29ya2Zsb3dDb2RlLCBlbnRyeSk7XG4gICAgZW50cnkuY2F0Y2goKCkgPT4gYmFzZWxpbmVDYWNoZS5kZWxldGUod29ya2Zsb3dDb2RlKSk7XG4gIH1cbiAgcmV0dXJuIGVudHJ5O1xufVxuXG4vKipcbiAqIEEgbGl2ZSBRdWlja0pTIHdvcmtmbG93IGludm9jYXRpb24uIFdoZW4gdGhlIGluaXRpYWwgYHJlc3VsdGAgaXNcbiAqIGBzdXNwZW5kZWRgLCB0aGUgVk0gaXMga2VwdCBhbGl2ZSBzbyB0aGUgY2FsbGVyIGNhbiBmZWVkIG5ld2x5IHJlY29yZGVkXG4gKiBldmVudHMgKGUuZy4gdGVybWluYWwgZXZlbnRzIG9mIGlubGluZS1leGVjdXRlZCBzdGVwcykgaW50byB0aGUgU0FNRSBWTVxuICogdmlhIGBjb250aW51ZVdpdGhFdmVudHNgIOKAlCByZXN1bWluZyBleGVjdXRpb24gZXhhY3RseSB3aGVyZSBpdCBsZWZ0IG9mZlxuICogd2l0aG91dCBhIGZyZXNoLVZNIHJlLXJlcGxheS4gVGVybWluYWwgcmVzdWx0cyBkaXNwb3NlIHRoZSBWTVxuICogYXV0b21hdGljYWxseTsgYGRpc3Bvc2UoKWAgbXVzdCBiZSBjYWxsZWQgd2hlbiBhYmFuZG9uaW5nIGEgc3VzcGVuZGVkXG4gKiBzZXNzaW9uIChpZGVtcG90ZW50KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWlja0pTV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmVzdWx0OiBRdWlja0pTUnVudGltZVJlc3VsdDtcbiAgLyoqXG4gICAqIFByb2Nlc3MgbmV3bHkgcmVjb3JkZWQgZXZlbnRzIGluIHRoZSBsaXZlIFZNIGFuZCByZS1ldmFsdWF0ZSB0aGVcbiAgICogd29ya2Zsb3cgc3RhdGUuIE9ubHkgdmFsaWQgd2hpbGUgdGhlIGxhc3QgcmVzdWx0IHdhcyBgc3VzcGVuZGVkYC5cbiAgICogUmVzZXRzIHRoZSBWTSdzIGludGVycnVwdCBidWRnZXQgZm9yIHRoZSBuZXcgZXhlY3V0aW9uIGJ1cnN0LlxuICAgKi9cbiAgY29udGludWVXaXRoRXZlbnRzKG5ld0V2ZW50czogRXZlbnRbXSk6IFByb21pc2U8UXVpY2tKU1J1bnRpbWVSZXN1bHQ+O1xuICAvKiogRGlzcG9zZSB0aGUgVk0gaWYgaXQgaXMgc3RpbGwgYWxpdmUuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJ1biBhIHdvcmtmbG93IGludm9jYXRpb24gdG8gaXRzIGZpcnN0IHNldHRsZWQgc3RhdGUgYW5kIGRpc3Bvc2UgdGhlXG4gKiBWTS4gQ29udmVuaWVuY2Ugd3JhcHBlciBvdmVyIHtAbGluayBzdGFydFF1aWNrSlNXb3JrZmxvd30gZm9yIGNhbGxlcnNcbiAqIChhbmQgdGVzdHMpIHRoYXQgZG9uJ3QgdXNlIGxpdmUtVk0gY29udGludWF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuUXVpY2tKU1dvcmtmbG93KFxuICBvcHRpb25zOiBRdWlja0pTUnVudGltZU9wdGlvbnNcbik6IFByb21pc2U8UXVpY2tKU1J1bnRpbWVSZXN1bHQ+IHtcbiAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHN0YXJ0UXVpY2tKU1dvcmtmbG93KG9wdGlvbnMpO1xuICBzZXNzaW9uLmRpc3Bvc2UoKTtcbiAgcmV0dXJuIHNlc3Npb24ucmVzdWx0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRRdWlja0pTV29ya2Zsb3coXG4gIG9wdGlvbnM6IFF1aWNrSlNSdW50aW1lT3B0aW9uc1xuKTogUHJvbWlzZTxRdWlja0pTV29ya2Zsb3dTZXNzaW9uPiB7XG4gIGNvbnN0IHsgd29ya2Zsb3dDb2RlLCB3b3JrZmxvd0lkLCB3b3JrZmxvd1J1biwgZXZlbnRzIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdCA/ICt3b3JrZmxvd1J1bi5zdGFydGVkQXQgOiBEYXRlLm5vdygpO1xuXG4gIC8vIERldGVybWluaXN0aWMgUFJORyBzZWVkIOKAlCBpZGVudGljYWwgZm9yIEVWRVJZIGludm9jYXRpb24gb2YgdGhlIHNhbWVcbiAgLy8gcnVuLiBGdWxsIGV2ZW50IHJlcGxheSByZXF1aXJlcyB0aGlzOiBlYWNoIGludm9jYXRpb24gcmUtZXhlY3V0ZXMgdGhlXG4gIC8vIHdvcmtmbG93IGZyb20gdGhlIHRvcCBhbmQgbXVzdCByZWdlbmVyYXRlIHRoZSBleGFjdCBzYW1lIGNvcnJlbGF0aW9uSWRcbiAgLy8gc2VxdWVuY2Ugc28gdGhhdCBwZW5kaW5nIG9wZXJhdGlvbnMgcmUtY3JlYXRlZCBieSByZXBsYXkgbWF0Y2ggdGhlXG4gIC8vIGV2ZW50cyByZWNvcmRlZCBieSBlYXJsaWVyIGludm9jYXRpb25zLiBTZXF1ZW50aWFsIG9wZXJhdGlvbnMgd2l0aGluXG4gIC8vIG9uZSBleGVjdXRpb24gc3RpbGwgZ2V0IGRpc3RpbmN0IGlkcyBiZWNhdXNlIHRoZSBQUk5HIGFkdmFuY2VzIGFzIHRoZVxuICAvLyB3b3JrZmxvdyBkcmF3cyBmcm9tIGl0LiBJZGVudGljYWwgc2VlZGluZyBhY3Jvc3MgQ09OQ1VSUkVOVCBpbnZvY2F0aW9uc1xuICAvLyBvZiB0aGUgc2FtZSBydW4gaXMgYWxzbyBsb2FkLWJlYXJpbmc6IGJvdGggcHJvZHVjZSB0aGUgc2FtZSBpZHMsIGFuZFxuICAvLyB0aGUgd29ybGQncyBwZXItKHJ1bklkLCBjb3JyZWxhdGlvbklkKSB1bmlxdWVuZXNzIHR1cm5zIHRoZSBkdXBsaWNhdGVcbiAgLy8gYGV2ZW50cy5jcmVhdGVgIGludG8gYW4gRW50aXR5Q29uZmxpY3RFcnJvciB0aGF0IHRoZSBlbnRyeXBvaW50XG4gIC8vIHN3YWxsb3dzLlxuICAvL1xuICAvLyBUaGUgc2VlZCBpbnB1dHMgTVVTVCBiZSBzdGFibGUgYWNyb3NzIGludm9jYXRpb25zLiBOb3RhYmx5XG4gIC8vIGBzdGFydGVkQXRgIGlzIE5PVDogdW5kZXIgdHVyYm8gdGhlIGZpcnN0IGludm9jYXRpb24gcnVucyBhZ2FpbnN0IGFcbiAgLy8gc3ludGhlc2l6ZWQgcnVuIG9iamVjdCB3aG9zZSB0aW1lc3RhbXBzIGRpZmZlciBmcm9tIHRoZSBkdXJhYmx5XG4gIC8vIHN0b3JlZCBvbmVzIHRoYXQgbGF0ZXIgaW52b2NhdGlvbnMgbG9hZC4gTWF0Y2hlcyB0aGUgbm9kZTp2bVxuICAvLyBlbmdpbmUncyBzZWVkICh3b3JrZmxvdy50cykuXG4gIGNvbnN0IHNlZWQgPSBbXG4gICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLFxuICAgIHdvcmtmbG93UnVuLmRlcGxveW1lbnRJZCxcbiAgXS5qb2luKCc6Jyk7XG4gIGNvbnN0IHJuZyA9IHNlZWRyYW5kb20oc2VlZCk7XG5cbiAgLy8gU2VlZGVkIG5hbm9pZCBnZW5lcmF0b3Ig4oCUIHVzZXMgdGhlIHNhbWUgbmFub2lkIHBhY2thZ2UgYW5kIHNlZWRlZCBQUk5HXG4gIC8vIGFzIHRoZSBub2RlOnZtIGVuZ2luZSBmb3IgY29uc2lzdGVudCB0b2tlbiBnZW5lcmF0aW9uLlxuICBjb25zdCBnZW5lcmF0ZU5hbm9pZCA9IG5hbm9pZC5jdXN0b21SYW5kb20obmFub2lkLnVybEFscGhhYmV0LCAyMSwgKHNpemUpID0+XG4gICAgbmV3IFVpbnQ4QXJyYXkoc2l6ZSkubWFwKCgpID0+IDI1NiAqIHJuZygpKVxuICApO1xuXG4gIC8vIERldGVybWluaXN0aWMgcmVwbGF5IGNsb2NrLCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lIChzZWVcbiAgLy8gd29ya2Zsb3cudHMpOiB0aGUgaW5pdGlhbCB2YWx1ZSBpcyB0aGUgcnVuJ3MgY3JlYXRpb24gdGltZSByZWNvdmVyZWRcbiAgLy8gZnJvbSB0aGUgVUxJRCBlbWJlZGRlZCBpbiBgcnVuSWRgIChmYWxsaW5nIGJhY2sgdG8gYGNyZWF0ZWRBdGApLCBhbmRcbiAgLy8gaXQgYWR2YW5jZXMgdG8gZWFjaCBwcm9jZXNzZWQgZXZlbnQncyBgY3JlYXRlZEF0YCBhcyB0aGUgZXZlbnQgbG9nIGlzXG4gIC8vIHJlcGxheWVkLiBNb25vdG9uaWMgKE1hdGgubWF4KSBzbyB0aGUgb3V0ZXIgcHJvY2Vzc0V2ZW50cyByZS1zY2FuXG4gIC8vIGxvb3AgY2FuJ3QgbW92ZSB0aGUgY2xvY2sgYmFja3dhcmRzIG1pZC1leGVjdXRpb24uXG4gIGxldCB2bU5vd01zID1cbiAgICBydW5JZENyZWF0ZWRBdCh3b3JrZmxvd1J1bi5ydW5JZCkgPz8gKCt3b3JrZmxvd1J1bi5jcmVhdGVkQXQgfHwgc3RhcnRlZEF0KTtcbiAgY29uc3QgYWR2YW5jZUNsb2NrID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG1zKSkgdm1Ob3dNcyA9IE1hdGgubWF4KHZtTm93TXMsIG1zKTtcbiAgfTtcblxuICAvLyAtLS0tIFBoYXNlIDE6IHN0YXRpYyBpbml0aWFsaXphdGlvbiAtLS0tXG4gIC8vXG4gIC8vIEJhc2VsaW5lLXNuYXBzaG90IGZhc3QgcGF0aCAoZGVmYXVsdCBPTjsgc2VlIHRoZSBzZWN0aW9uIGNvbW1lbnQgYXRcbiAgLy8gcHJlcGFyZUJhc2VsaW5lU25hcHNob3QpOiByZXN0b3JlIGEgYnVuZGxlLWh5ZHJhdGVkIFZNIGluc3RlYWQgb2ZcbiAgLy8gYm9vdGluZyBmcmVzaCBhbmQgcmUtZXZhbHVhdGluZyB0aGUgYnVuZGxlLiBgaW5lbGlnaWJsZWAgYnVuZGxlc1xuICAvLyAobW9kdWxlLXNjb3BlIG5vbmRldGVybWluaXNtLCBldmFsIGZhaWx1cmUpIHRha2UgdGhlIGZyZXNoIHBhdGggd2l0aFxuICAvLyBpZGVudGljYWwgc2VtYW50aWNzLlxuICBjb25zdCBpbnRlcnJ1cHRCdWRnZXQ6IEludGVycnVwdEJ1ZGdldCA9IHsgc3RhcnQ6IERhdGUubm93KCkgfTtcbiAgbGV0IGJhc2VsaW5lU25hcHNob3Q6IFNuYXBzaG90IHwgdW5kZWZpbmVkO1xuICBsZXQgYmFzZWxpbmVTZXJkZVJvb3RQdHI6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWYgKGlzUXVpY2tKU0Jhc2VsaW5lU25hcHNob3RFbmFibGVkKCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCBnZXRCYXNlbGluZUVudHJ5KHdvcmtmbG93Q29kZSwgd29ya2Zsb3dJZCk7XG4gICAgICBpZiAoZW50cnkuc3RhdGUgPT09ICdyZWFkeScpIHtcbiAgICAgICAgYmFzZWxpbmVTbmFwc2hvdCA9IGVudHJ5LnNuYXBzaG90O1xuICAgICAgICBiYXNlbGluZVNlcmRlUm9vdFB0ciA9IGVudHJ5LnNlcmRlUm9vdFB0cjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEEgcmVqZWN0aW9uIGhlcmUgaXMgYW4gaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZSBkdXJpbmcgaHlkcmF0ZVxuICAgICAgLy8gKGUuZy4gdm0uc25hcHNob3QoKSB1bmRlciBtZW1vcnkgcHJlc3N1cmUsIFF1aWNrSlMuY3JlYXRlIG9yXG4gICAgICAvLyBnZXRDb21waWxlZEFzc2V0cygpIGZhaWxpbmcpIOKAlCBOT1QgYnVuZGxlIGV2YWwsIHdoaWNoIHJldHVybnNcbiAgICAgIC8vIGFuIGluZWxpZ2libGUgZW50cnkuIGdldEJhc2VsaW5lRW50cnkgaGFzIGFscmVhZHkgZXZpY3RlZCB0aGVcbiAgICAgIC8vIGNhY2hlZCBwcm9taXNlIHNvIGEgbGF0ZXIgaW52b2NhdGlvbiBjYW4gcmV0cnkuIFRoaXMgaW52b2NhdGlvblxuICAgICAgLy8gbXVzdCBmYWxsIGJhY2sgdG8gZnJlc2ggZXZhbHVhdGlvbiAod2hpY2ggd291bGQgaGF2ZSBzdWNjZWVkZWQpXG4gICAgICAvLyByYXRoZXIgdGhhbiBmYWlsIHRoZSB3aG9sZSBydW4gZm9yIGEgc25hcHNob3Qtb25seSBmYWlsdXJlIG1vZGUuXG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdRdWlja0pTIGJhc2VsaW5lIHNuYXBzaG90IGh5ZHJhdGUgZmFpbGVkOyBmYWxsaW5nIGJhY2sgdG8gZnJlc2ggZXZhbHVhdGlvbiBmb3IgdGhpcyBpbnZvY2F0aW9uJyxcbiAgICAgICAgeyB3b3JrZmxvd0lkLCBlcnJvcjogZXJyIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGxldCB2bTogUXVpY2tKUztcbiAgaWYgKGJhc2VsaW5lU25hcHNob3QpIHtcbiAgICBjb25zdCBhc3NldHMgPSBhd2FpdCBnZXRDb21waWxlZEFzc2V0cygpO1xuICAgIHZtID0gYXdhaXQgUXVpY2tKUy5yZXN0b3JlKGJhc2VsaW5lU25hcHNob3QsIHtcbiAgICAgIHdhc206IGFzc2V0cy53YXNtIGFzIG5ldmVyLFxuICAgICAgbWVtb3J5TGltaXQ6IDI1NiAqIDEwMjQgKiAxMDI0LFxuICAgICAgaW50ZXJydXB0SGFuZGxlcjogY3JlYXRlSW50ZXJydXB0SGFuZGxlcihpbnRlcnJ1cHRCdWRnZXQpLFxuICAgICAgZXh0ZW5zaW9uczogYXNzZXRzLmV4dGVuc2lvbnMsXG4gICAgICB3YXNpOiBtYWtlRGV0ZXJtaW5pc3RpY0Nsb2NrV2FzaSgoKSA9PiB2bU5vd01zKSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB2bSA9IGF3YWl0IGluaXRXb3JrZmxvd1ZNKCgpID0+IHZtTm93TXMsIGludGVycnVwdEJ1ZGdldCk7XG4gIH1cblxuICAvLyBIb3N0LXNpZGUgc2VyZGU6IGNhcHR1cmVzIHRoZSBWTSdzIGludHJpbnNpY3MgKGJvb3RzdHJhcCBpbmNsdWRlZClcbiAgLy8gYmVmb3JlIGFueSB1c2VyIGNvZGUgcnVucy4gQWxsIHNlcmlhbGl6YXRpb24gbm93IGhhcHBlbnMgb24gdGhlIGhvc3RcbiAgLy8gdGhyb3VnaCBoYW5kbGVzIOKAlCBubyBzZXJpYWxpemVyIGNvZGUgaXMgZXZhbHVhdGVkIGluc2lkZSB0aGUgVk0uXG4gIC8vIEZyZXNoIHBhdGg6IGNhcHR1cmUgbm93IChubyB1c2VyIGNvZGUgaGFzIHJ1biDigJQgdGhlIGJ1bmRsZSBldmFsdWF0ZXNcbiAgLy8gbGF0ZXIgaW4gdGhlIHBlci1ydW4gcGhhc2UpLiBTbmFwc2hvdCBwYXRoOiByZS1hZG9wdCB0aGUgY2FwdHVyZSByb290XG4gIC8vIHRoZSBiYXNlbGluZSBoeWRyYXRlIGNyZWF0ZWQgQkVGT1JFIHRoZSBidW5kbGUgZXZhbHVhdGVkIOKAlCB0aGUgYm94XG4gIC8vIGxpdmVzIGluIHRoZSByZXN0b3JlZCBtZW1vcnkgaW1hZ2UgYXQgdGhlIHJlY29yZGVkIG9mZnNldC4gQm90aCBnaXZlXG4gIC8vIHRoZSBzZXJkZSBwcmlzdGluZSBjYXB0dXJlLWJlZm9yZS11c2VyLWNvZGUgaW50cmluc2ljczsgbmVpdGhlclxuICAvLyBleGVjdXRlcyBndWVzdCBjb2RlIGhlcmUuXG4gIGNvbnN0IHNlcmRlID1cbiAgICBiYXNlbGluZVNuYXBzaG90ICYmIGJhc2VsaW5lU2VyZGVSb290UHRyICE9PSB1bmRlZmluZWRcbiAgICAgID8gY3JlYXRlUXVpY2tKU1NlcmRlKHZtLCBhZG9wdFNlcmRlUm9vdCh2bSwgYmFzZWxpbmVTZXJkZVJvb3RQdHIpKVxuICAgICAgOiBjcmVhdGVRdWlja0pTU2VyZGUodm0pO1xuXG4gIC8vIEFueSB0aHJvdyBiZXR3ZWVuIGhlcmUgYW5kIHRoZSB0ZXJtaW5hbCBwYXRocyAod2hpY2ggZGlzcG9zZSB0aGUgVk1cbiAgLy8gaW5zaWRlIGNoZWNrV29ya2Zsb3dTdGF0ZSAvIGV4dHJhY3RFcnJvciBiZWZvcmUgUkVUVVJOSU5HKSB3b3VsZCBsZWFrXG4gIC8vIGEgbGl2ZSBRdWlja0pTIGluc3RhbmNlIGFuZCBpdHMgV0FTTSBsaW5lYXIgbWVtb3J5IGZvciB0aGUgbGlmZXRpbWVcbiAgLy8gb2YgdGhlIGNvbXB1dGUgaW5zdGFuY2Ug4oCUIHdoaWNoIGlzIHJldXNlZC4gRGlzcG9zZSBvbiB0aGUgd2F5IG91dCBvZlxuICAvLyBhbiBleGNlcHRpb25hbCBleGl0IGFuZCByZXRocm93LlxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBydW5Xb3JrZmxvd0luVk0oKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZtLmRpc3Bvc2UoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFscmVhZHkgZGlzcG9zZWQgYnkgYSB0ZXJtaW5hbCBwYXRoIOKAlCBpZ25vcmUuXG4gICAgfVxuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIC8vIC0tLS0gUGhhc2UgMjogcGVyLXJ1biBpbml0aWFsaXphdGlvbiAtLS0tXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bldvcmtmbG93SW5WTSgpOiBQcm9taXNlPFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24+IHtcbiAgICB2bS5ldmFsQ29kZShcbiAgICAgIGBnbG9iYWxUaGlzLl9fd29ybGRDYXBhYmlsaXRpZXMgPSAke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMud29ybGRDYXBhYmlsaXRpZXMpfTtgXG4gICAgKS5kaXNwb3NlKCk7XG5cbiAgICAvLyBTZWVkZWQgTWF0aC5yYW5kb21cbiAgICB7XG4gICAgICB1c2luZyByYW5kb21GbiA9IHZtLm5ld0Z1bmN0aW9uKCdyYW5kb20nLCAoKSA9PiB2bS5uZXdOdW1iZXIocm5nKCkpKTtcbiAgICAgIHVzaW5nIG1hdGggPSB2bS5nbG9iYWwuZ2V0UHJvcCgnTWF0aCcpO1xuICAgICAgbWF0aC5zZXRQcm9wKCdyYW5kb20nLCByYW5kb21Gbik7XG4gICAgfVxuXG4gICAgLy8gU2VlZGVkIG5hbm9pZCBnZW5lcmF0b3JcbiAgICB7XG4gICAgICB1c2luZyBuYW5vaWRGbiA9IHZtLm5ld0Z1bmN0aW9uKCdfX2dlbmVyYXRlTmFub2lkJywgKCkgPT5cbiAgICAgICAgdm0ubmV3U3RyaW5nKGdlbmVyYXRlTmFub2lkKCkpXG4gICAgICApO1xuICAgICAgdm0uc2V0UHJvcCh2bS5nbG9iYWwsICdfX2dlbmVyYXRlTmFub2lkJywgbmFub2lkRm4pO1xuICAgIH1cblxuICAgIC8vIEhvc3Qtc2lkZSBkZXRlcm1pbmlzdGljIFVMSUQgZ2VuZXJhdG9yIGZvciBjb3JyZWxhdGlvbklkcy4gVXNlcyB0aGVcbiAgICAvLyBzYW1lIGB1bGlkYCBwYWNrYWdlIGFuZCBtb25vdG9uaWMgZmFjdG9yeSBhcyBiZWZvcmUsIGRyYXdpbmcgZnJvbVxuICAgIC8vIHRoZSBTQU1FIHNlZWRlZCBQUk5HIGluc3RhbmNlIGFzIHRoZSBWTSdzIE1hdGgucmFuZG9tIOKAlCBzbyB0aGVcbiAgICAvLyBpbnRlcmxlYXZlZCBkcmF3IHNlcXVlbmNlIChhbmQgdGhlcmVmb3JlIGV2ZXJ5IGNvcnJlbGF0aW9uSWQpIGlzXG4gICAgLy8gYnl0ZS1pZGVudGljYWwgdG8gd2hhdCB0aGUgcHJldmlvdXMgaW4tVk0gVUxJRCBmYWN0b3J5IHByb2R1Y2VkIGZvclxuICAgIC8vIHRoZSBzYW1lIHJ1bi4gVGhlIHRpbWUgcHJlZml4IGlzIGRlcml2ZWQgZnJvbSB0aGUgcnVuSWQncyBlbWJlZGRlZFxuICAgIC8vIFVMSUQgKHN0YWJsZSBhY3Jvc3MgaW52b2NhdGlvbnMgYnkgY29uc3RydWN0aW9uIOKAlCB1bmxpa2VcbiAgICAvLyBgc3RhcnRlZEF0YCwgd2hpY2ggZGlmZmVycyBiZXR3ZWVuIHR1cmJvJ3Mgc3ludGhlc2l6ZWQgcnVuIG9iamVjdFxuICAgIC8vIGFuZCB0aGUgZHVyYWJseSBzdG9yZWQgcnVuKSwgc28gdHdvIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgb2YgdGhlXG4gICAgLy8gc2FtZSBydW4gcHJvZHVjZSBJREVOVElDQUwgY29ycmVsYXRpb25JZHMgYW5kIHRoZSB3b3JsZCdzXG4gICAgLy8gRW50aXR5Q29uZmxpY3RFcnJvciBvbiBgZXZlbnRzLmNyZWF0ZWAgZGVkdXBzIG9uZSBvZiBlYWNoIHBhaXIuXG4gICAge1xuICAgICAgY29uc3QgdWxpZEZhY3RvcnkgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IHJuZygpKTtcbiAgICAgIGNvbnN0IHVsaWRUaW1lc3RhbXAgPVxuICAgICAgICBydW5JZENyZWF0ZWRBdCh3b3JrZmxvd1J1bi5ydW5JZCkgPz9cbiAgICAgICAgKCt3b3JrZmxvd1J1bi5jcmVhdGVkQXQgfHwgc3RhcnRlZEF0KTtcbiAgICAgIHVzaW5nIHVsaWRGbiA9IHZtLm5ld0Z1bmN0aW9uKCdfX2dlbmVyYXRlVWxpZCcsICgpID0+XG4gICAgICAgIHZtLm5ld1N0cmluZyh1bGlkRmFjdG9yeSh1bGlkVGltZXN0YW1wKSlcbiAgICAgICk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fZ2VuZXJhdGVVbGlkJywgdWxpZEZuKTtcbiAgICB9XG5cbiAgICAvLyBgcHJvY2Vzcy5lbnZgIOKAlCBwYXJpdHkgd2l0aCB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoaWNoIGV4cG9zZXMgYSBmcm96ZW5cbiAgICAvLyBjb3B5IG9mIHRoZSBob3N0IGVudiAodm0vaW5kZXgudHMpLiBJbmplY3RlZCBwZXIgcnVuIHNvIHRoZSBzbmFwc2hvdCBvZlxuICAgIC8vIHRoZSBlbnYgaXMgdGFrZW4gYXQgaW52b2NhdGlvbiB0aW1lLCBzYW1lIGFzIG5vZGUuIEhhbmRsZS1iYXNlZCAobm9cbiAgICAvLyBndWVzdCBzb3VyY2UgZXZhbHVhdGVkKTogb24gdGhlIGJhc2VsaW5lLXNuYXBzaG90IHBhdGggdGhpcyBydW5zXG4gICAgLy8gYWZ0ZXIgdXNlciBjb2RlLCBhbmQgYSBndWVzdC1zb3VyY2UgaW5qZWN0aW9uIHdvdWxkIGV4ZWN1dGUgdGhyb3VnaFxuICAgIC8vIHBvdGVudGlhbGx5IHBhdGNoZWQgZ2xvYmFscyAoSlNPTi5wYXJzZSwgT2JqZWN0LmZyZWV6ZSkg4oCUIHZpc2libGVcbiAgICAvLyB0byBtb2R1bGUtc2NvcGUgd3JhcHBlcnMgb25seSBvbiB0aGUgcmVzdG9yZSBwYXRoLCBkaXZlcmdpbmdcbiAgICAvLyByZXBsYXlzLlxuICAgIHNlcmRlLmluc3RhbGxQcm9jZXNzRW52KHByb2Nlc3MuZW52KTtcblxuICAgIC8vIEV4ZWN1dGUgdGhlIHdvcmtmbG93IGJ1bmRsZSDigJQgdXNlIHRoZSB3b3JrZmxvd0lkIGFzIHRoZSBldmFsIGZpbGVuYW1lXG4gICAgLy8gc28gUXVpY2tKUyBzdGFjayB0cmFjZXMgcmVmZXJlbmNlIHRoZSB3b3JrZmxvdyBuYW1lLCBlbmFibGluZyBzb3VyY2UgbWFwXG4gICAgLy8gcmVtYXBwaW5nIGJ5IHJlbWFwRXJyb3JTdGFjayAod2hpY2ggbWF0Y2hlcyBmcmFtZXMgYnkgZmlsZW5hbWUpLlxuICAgIC8vIEV2YWx1YXRlZCBpbiB0aGUgcGVyLXJ1biBwaGFzZSAoYWZ0ZXIgTWF0aC5yYW5kb20gc2VlZGluZykgc28gdGhhdFxuICAgIC8vIG1vZHVsZS1zY29wZSB1c2VyIGNvZGUgZHJhd3MgZnJvbSB0aGUgc2VlZGVkIFBSTkcsIG1hdGNoaW5nIHRoZVxuICAgIC8vIG5vZGU6dm0gZW5naW5lJ3MgcmVwbGF5IGRldGVybWluaXNtLiBTa2lwcGVkIG9uIHRoZVxuICAgIC8vIGJhc2VsaW5lLXNuYXBzaG90IHBhdGg6IHRoZSByZXN0b3JlZCBoZWFwIGFscmVhZHkgY2FycmllcyB0aGVcbiAgICAvLyBldmFsdWF0ZWQgYnVuZGxlLCBhbmQgdGhlIGJhc2VsaW5lIGdhdGUgZ3VhcmFudGVlcyBtb2R1bGUgc2NvcGVcbiAgICAvLyBjb25zdW1lZCBubyBQUk5HIGRyYXdzIG9yIGNsb2NrIHJlYWRzIOKAlCBzbyBza2lwcGluZyB0aGUgZXZhbCBpc1xuICAgIC8vIG9ic2VydmF0aW9uYWxseSBpZGVudGljYWwgdG8gcmUtcnVubmluZyBpdCAodGhlIHJ1bi1zZWVkZWQgaG9zdFxuICAgIC8vIGZucyByZWdpc3RlcmVkIGFib3ZlIHJlYmluZCB0aGUgU0FNRSBuYW1lcyB0aGUgcmVzdG9yZWQgaGVhcCdzXG4gICAgLy8gZnVuY3Rpb24gb2JqZWN0cyBkaXNwYXRjaCB0aHJvdWdoKS5cbiAgICBpZiAoIWJhc2VsaW5lU25hcHNob3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZtLmV2YWxDb2RlKHdvcmtmbG93Q29kZSwgd29ya2Zsb3dJZCB8fCAnd29ya2Zsb3cuanMnKS5kaXNwb3NlKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VTZXR0bGVkU2Vzc2lvbihcbiAgICAgICAgICBleHRyYWN0RXJyb3Iodm0sIGVyciwgJ1dvcmtmbG93IGV2YWx1YXRpb24gZmFpbGVkJylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHdvcmtmbG93IGFyZ3VtZW50cy4gUHJlZmVyIHRoZSBydW5fY3JlYXRlZCBldmVudDsgZmFsbCBiYWNrXG4gICAgLy8gdG8gdGhlIHF1ZXVlIG1lc3NhZ2UncyBydW5JbnB1dCBpZiB0aGUgZXZlbnQgbG9nIGlzIGluY29tcGxldGVcbiAgICAvLyAoZXZlbnR1YWxseS1jb25zaXN0ZW50IHJlYWQgYWZ0ZXIgc3RhcnQoKSkuIEZhaWxpbmcgdG8gZmluZCBpbnB1dFxuICAgIC8vIGZvciBhIGZpcnN0IGludm9jYXRpb24gaXMgZmF0YWwg4oCUIHJ1bm5pbmcgdGhlIHdvcmtmbG93IGZ1bmN0aW9uXG4gICAgLy8gd2l0aCBubyBhcmdzIHdvdWxkIHNpbGVudGx5IHR1cm4gdHlwZWQgYXJndW1lbnRzIGludG8gYHVuZGVmaW5lZGBcbiAgICAvLyBhbmQsIGZvciByZWN1cnNpdmUgd29ya2Zsb3dzLCBwcm9kdWNlIGV4cG9uZW50aWFsIGZhbi1vdXQuXG4gICAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50ID0gZXZlbnRzLmZpbmQoKGUpID0+IGUuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnKTtcbiAgICBjb25zdCBydW5DcmVhdGVkSW5wdXQgPVxuICAgICAgcnVuQ3JlYXRlZEV2ZW50ICYmICdldmVudERhdGEnIGluIHJ1bkNyZWF0ZWRFdmVudFxuICAgICAgICA/IChydW5DcmVhdGVkRXZlbnQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uaW5wdXRcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcnVuSW5wdXQ6IHVua25vd24gPVxuICAgICAgcnVuQ3JlYXRlZElucHV0ID8/IChvcHRpb25zLnJ1bklucHV0Py5pbnB1dCBhcyB1bmtub3duKTtcblxuICAgIGlmIChydW5JbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZElucHV0ID0gYXdhaXQgcHJlcGFyZUJ5dGVzRm9yVk0oXG4gICAgICAgIHJ1bklucHV0LFxuICAgICAgICBvcHRpb25zLmVuY3J5cHRpb25LZXlcbiAgICAgICk7XG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHJ1biBpbnB1dCBmb3JtYXQnLCB7XG4gICAgICAgIHByZWZpeDogbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRlY3J5cHRlZElucHV0LnN1YmFycmF5KDAsIDQpKSxcbiAgICAgICAgYnl0ZUxlbmd0aDogZGVjcnlwdGVkSW5wdXQuYnl0ZUxlbmd0aCxcbiAgICAgICAgc291cmNlOiBydW5DcmVhdGVkSW5wdXQgPyAncnVuX2NyZWF0ZWQnIDogJ3F1ZXVlTWVzc2FnZS5ydW5JbnB1dCcsXG4gICAgICB9KTtcbiAgICAgIC8vIEJ1aWxkIHRoZSBhcmd1bWVudCB2YWx1ZSBkaXJlY3RseSBpbiB0aGUgVk0gdmlhIHRoZSBob3N0LXNpZGVcbiAgICAgIC8vIHNlcmRlIChndWVzdCBjb2RlIG5ldmVyIHNlZXMgdGhlIHdpcmUgYnl0ZXMpLlxuICAgICAgY29uc3QgaW5wdXRIYW5kbGUgPSBzZXJkZS5kZXNlcmlhbGl6ZShkZWNyeXB0ZWRJbnB1dCk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fd2RrX2lucHV0JywgaW5wdXRIYW5kbGUpO1xuICAgICAgaW5wdXRIYW5kbGUuZGlzcG9zZSgpO1xuICAgIH0gZWxzZSBpZiAocnVuSW5wdXQgPT09IHVuZGVmaW5lZCAmJiBldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGV2ZW50IGxvZyBpcyBub24tZW1wdHkgKHdlIGdvdCBydW5fc3RhcnRlZCBvciBzaW1pbGFyKSBidXRcbiAgICAgIC8vIG5vIHJ1bl9jcmVhdGVkIGV2ZW50IHdhcyBmb3VuZCBhbmQgbm8gcXVldWUtcHJvdmlkZWQgcnVuSW5wdXQgaXNcbiAgICAgIC8vIGF2YWlsYWJsZS4gVGhpcyBpcyB0aGUgcmFjZSBjb25kaXRpb24gb2JzZXJ2ZWQgZHVyaW5nIHRoZSBmaWJcbiAgICAgIC8vIGluY2lkZW50IOKAlCBzaWxlbnRseSBkcm9wcGluZyBhcmd1bWVudHMgd291bGQgdHVybiBgbmAgaW50b1xuICAgICAgLy8gYHVuZGVmaW5lZGAgYW5kLCBmb3IgcmVjdXJzaXZlIHdvcmtmbG93cywgY2F1c2UgZXhwb25lbnRpYWxcbiAgICAgIC8vIGZhbi1vdXQuIEZhaWwgbG91ZDogdGhlIHRocm93IGVzY2FwZXMgdGhlIGVudHJ5cG9pbnQgaW50byB0aGVcbiAgICAgIC8vIHJlcGxheSBsb29wJ3MgY2F0Y2ggaW4gcnVudGltZS50cyAodGhlIFF1aWNrSlMgZGlzcGF0Y2ggcnVuc1xuICAgICAgLy8gaW5zaWRlIHRoYXQgbG9vcCdzIHRyeSksIHdoaWNoIHJlY29yZHMgcnVuX2ZhaWxlZC4gQSB2aXNpYmxlXG4gICAgICAvLyB0ZXJtaW5hbCBmYWlsdXJlIGlzXG4gICAgICAvLyBwcmVmZXJyZWQgb3ZlciBzaWxlbnRseSBleGVjdXRpbmcgd2l0aCB1bmRlZmluZWQgYXJndW1lbnRzIOKAlCB0aGVcbiAgICAgIC8vIHF1ZXVlLXByb3ZpZGVkIHJ1bklucHV0IGZhbGxiYWNrIGFib3ZlIG1ha2VzIHRoaXMgcGF0aCByYXJlLlxuICAgICAgLy8gRW1wdHkgYGV2ZW50c2AgaXMgYWxsb3dlZCBiZWNhdXNlIHRlc3RzIHRoYXQgYm9vdHN0cmFwIGEgd29ya2Zsb3dcbiAgICAgIC8vIHdpdGggbm8gYXJndW1lbnRzIHJlbHkgb24gdGhlIG9sZCBwZXJtaXNzaXZlIGJlaGF2aW9yLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHN0YXJ0IHdvcmtmbG93IHJ1biBcIiR7d29ya2Zsb3dSdW4ucnVuSWR9XCI6IG5vIHJ1bl9jcmVhdGVkIGV2ZW50IGZvdW5kIGFuZCBubyBydW5JbnB1dCBpbiB0aGUgcXVldWUgcGF5bG9hZCwgYnV0IG90aGVyIGV2ZW50cyBhcmUgcHJlc2VudCAobGlrZWx5IGEgcmVhZC1hZnRlci13cml0ZSByYWNlIGR1cmluZyBzdGFydCgpKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNldCB3b3JrZmxvdyBjb250ZXh0IG1ldGFkYXRhIChmb3IgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpKS5cbiAgICAvLyBNdXN0IG1hdGNoIHRoZSBzaGFwZSB0aGF0IHRoZSBub2RlOnZtIGVuZ2luZSBwcm9kdWNlcyAoc2VlXG4gICAgLy8gcGFja2FnZXMvY29yZS9zcmMvd29ya2Zsb3cudHM6IHJ1bldvcmtmbG93IOKGkiBjdHgpIHNvIHVzZXIgY29kZVxuICAgIC8vIHRoYXQgY29tcGFyZXMgYGdldFdvcmtmbG93TWV0YWRhdGEoKWAgdmFsdWVzIGJldHdlZW4gYSBzdGVwXG4gICAgLy8gKHNlcnZlci1zaWRlKSBhbmQgdGhlIHdvcmtmbG93IChWTS1zaWRlKSBzZWVzIGlkZW50aWNhbCBvYmplY3RzLlxuICAgIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIHdvcmtmbG93U3RhcnRlZEF0OiB3b3JrZmxvd1J1bi5zdGFydGVkQXRcbiAgICAgICAgICA/IG5ldyBEYXRlKCt3b3JrZmxvd1J1bi5zdGFydGVkQXQpXG4gICAgICAgICAgOiBuZXcgRGF0ZSgpLFxuICAgICAgICB1cmw6IHByb2Nlc3MuZW52LlZFUkNFTF9VUkxcbiAgICAgICAgICA/IGBodHRwczovLyR7cHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTH1gXG4gICAgICAgICAgOiBgaHR0cDovL2xvY2FsaG9zdDoke29wdGlvbnMucG9ydCA/PyAzMDAwfWAsXG4gICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhb3B0aW9ucy5lbmNyeXB0aW9uS2V5IH0sXG4gICAgICB9O1xuICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgIGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXSA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YWRhdGEpfTtgICtcbiAgICAgICAgICBgZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfQ09OVEVYVFwiKV0ud29ya2Zsb3dTdGFydGVkQXQgPSBuZXcgRGF0ZSgke0pTT04uc3RyaW5naWZ5KG1ldGFkYXRhLndvcmtmbG93U3RhcnRlZEF0LnRvSVNPU3RyaW5nKCkpfSk7YFxuICAgICAgKS5kaXNwb3NlKCk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIHdvcmtmbG93IGZ1bmN0aW9uLiBJZiB0aGUgd29ya2Zsb3cgaXNuJ3QgcmVnaXN0ZXJlZCxcbiAgICAvLyB0aHJvdyBhbiBlcnJvciB0YWdnZWQgd2l0aCBgbmFtZSA9IFwiV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3JcImBcbiAgICAvLyBzbyB0aGUgaG9zdC1zaWRlIGVudHJ5cG9pbnQgY2FuIHJlY29uc3RydWN0IGEgcmVhbFxuICAgIC8vIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yIChhIFdvcmtmbG93UnVudGltZUVycm9yIHN1YmNsYXNzIHRoYXRcbiAgICAvLyBjbGFzc2lmaWVzIGFzIFJVTlRJTUVfRVJST1IpIHJhdGhlciB0aGFuIGEgZ2VuZXJpYyB1c2VyIGVycm9yLlxuICAgIC8vIFNlZSBxdWlja2pzLWVudHJ5cG9pbnQudHMncyBydW5fZmFpbGVkIGJyYW5jaC5cbiAgICB0cnkge1xuICAgICAgdm0uZXZhbENvZGUoYFxuICAgICAgdmFyIF9fd2ZuID0gZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLmdldCgke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93SWQpfSk7XG4gICAgICBpZiAoIV9fd2ZuKSB7XG4gICAgICAgIHZhciBfX3dmbkVyciA9IG5ldyBFcnJvcihcIldvcmtmbG93IFxcXFxcIlwiICsgJHtKU09OLnN0cmluZ2lmeSh3b3JrZmxvd0lkKX0gKyBcIlxcXFxcIiBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgY3VycmVudCBkZXBsb3ltZW50LlwiKTtcbiAgICAgICAgX193Zm5FcnIubmFtZSA9IFwiV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3JcIjtcbiAgICAgICAgdGhyb3cgX193Zm5FcnI7XG4gICAgICB9XG4gICAgICB2YXIgX19hcmdzID0gZ2xvYmFsVGhpcy5fX3dka19pbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gZ2xvYmFsVGhpcy5fX3dka19pbnB1dFxuICAgICAgICA6IFtdO1xuICAgICAgZGVsZXRlIGdsb2JhbFRoaXMuX193ZGtfaW5wdXQ7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoX19hcmdzKSkgX19hcmdzID0gW19fYXJnc107XG4gICAgICBfX3dmbi5hcHBseShudWxsLCBfX2FyZ3MpLnRoZW4oXG4gICAgICAgIGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIC8vIFN0b3JlIHRoZSBSQVcgcmVzdWx0OyB0aGUgaG9zdCBzZXJpYWxpemVzIGl0IHRocm91Z2ggYSBoYW5kbGUuXG4gICAgICAgICAgLy8gQSBzZXBhcmF0ZSBkb25lIGZsYWcgZGlzdGluZ3Vpc2hlcyBcImNvbXBsZXRlZCB3aXRoIHVuZGVmaW5lZFwiXG4gICAgICAgICAgLy8gZnJvbSBcIm5vdCBjb21wbGV0ZWRcIi5cbiAgICAgICAgICBnbG9iYWxUaGlzLl9fd29ya2Zsb3dEb25lID0gdHJ1ZTtcbiAgICAgICAgICBnbG9iYWxUaGlzLl9fd29ya2Zsb3dSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gUHJlc2VydmUgZGlzcGxheSBpbmZvIG9uIHRoZSBob3N0LXNpZGUgZmFpbGVkIG9iamVjdFxuICAgICAgICAgIC8vIChtYXRjaGVzIHRoZSBsZWdhY3kgaG9zdC12aXNpYmxlIHNoYXBlKSBBTkQga2VlcCB0aGUgUkFXXG4gICAgICAgICAgLy8gdGhyb3duIHZhbHVlIHNvIHRoZSBob3N0IGNhbiBzZXJpYWxpemUgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgLy8gdHlwZS1pZGVudGl0eSwgY2F1c2UgY2hhaW4sIG9yIG5vbi1FcnJvciB0aHJvd3MgdmVyYmF0aW1cbiAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBzdGFuZGFyZCBlcnJvciBwaXBlbGluZS5cbiAgICAgICAgICBnbG9iYWxUaGlzLl9fd29ya2Zsb3dFcnJvciA9IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yICYmIGVycm9yLm1lc3NhZ2UgIT0gbnVsbCA/IFN0cmluZyhlcnJvci5tZXNzYWdlKSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICBzdGFjazogZXJyb3IgJiYgZXJyb3Iuc3RhY2sgPyBlcnJvci5zdGFjayA6IFwiXCIsXG4gICAgICAgICAgICBuYW1lOiBlcnJvciAmJiBlcnJvci5uYW1lID8gZXJyb3IubmFtZSA6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gXCJFcnJvclwiIDogdHlwZW9mIGVycm9yKSxcbiAgICAgICAgICAgIHZhbHVlOiBlcnJvcixcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuICAgIGApLmRpc3Bvc2UoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiBtYWtlU2V0dGxlZFNlc3Npb24oXG4gICAgICAgIGV4dHJhY3RFcnJvcih2bSwgZXJyLCAnRmFpbGVkIHRvIHN0YXJ0IHdvcmtmbG93JylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBldmVudHMgYW5kIGRyYWluIGpvYnMgaW4gYSBsb29wLiBFdmVudHMgbWF5IHJlc29sdmUgcHJvbWlzZXNcbiAgICAvLyB0aGF0IHVuYmxvY2sgd29ya2Zsb3cgY29kZSwgd2hpY2ggdGhlbiBjcmVhdGVzIE5FVyByZXNvbHZlcnMgZm9yXG4gICAgLy8gc3Vic2VxdWVudCBldmVudHMuIFJlLXByb2Nlc3NpbmcgZXZlbnRzIG1hdGNoZXMgdGhlc2UgbmV3IHJlc29sdmVyc1xuICAgIC8vIGFnYWluc3QgZXZlbnRzIHRoYXQgd2VyZSBhbHJlYWR5IGRlbGl2ZXJlZC5cbiAgICB7XG4gICAgICBsZXQgbWF4SXRlcmF0aW9ucyA9IDEwMDtcbiAgICAgIGxldCBtYWRlUHJvZ3Jlc3M6IGJvb2xlYW47XG4gICAgICBkbyB7XG4gICAgICAgIG1hZGVQcm9ncmVzcyA9IGF3YWl0IHByb2Nlc3NFdmVudHMoXG4gICAgICAgICAgdm0sXG4gICAgICAgICAgc2VyZGUsXG4gICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgIGFkdmFuY2VDbG9jayxcbiAgICAgICAgICBvcHRpb25zLmVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGJhdGNoOiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBiYXRjaCA9IHZtLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgIGlmIChiYXRjaCA+IDApIG1hZGVQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0gd2hpbGUgKGJhdGNoID4gMCk7XG4gICAgICB9IHdoaWxlIChtYWRlUHJvZ3Jlc3MgJiYgLS1tYXhJdGVyYXRpb25zID4gMCk7XG4gICAgICBpZiAobWFkZVByb2dyZXNzICYmIG1heEl0ZXJhdGlvbnMgPT09IDApIHtcbiAgICAgICAgLy8gVGhlIGRyYWluIGxvb3AgaGl0IGl0cyBib3VuZCB3aGlsZSBzdGlsbCBtYWtpbmcgcHJvZ3Jlc3Mg4oCUXG4gICAgICAgIC8vIHByb2NlZWRpbmcgYXMgaWYgaXQgY29udmVyZ2VkIHdvdWxkIHByZXNlbnQgYXMgYSBteXN0ZXJpb3VzXG4gICAgICAgIC8vIHN1c3BlbnNpb24gb3IgcmVwbGF5IGRpdmVyZ2VuY2UuIE1ha2UgdGhlIGdpdmluZy11cCB2aXNpYmxlIHNvXG4gICAgICAgIC8vIGEgd2VkZ2UgaXMgYXR0cmlidXRhYmxlIHRvIHRoaXMgYm91bmQgcmF0aGVyIHRoYW4gYSBteXN0ZXJ5LlxuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZXZlbnQgZHJhaW4gbG9vcCBoaXQgaXRzIGl0ZXJhdGlvbiBib3VuZCBiZWZvcmUgcmVhY2hpbmcgYSBmaXhlZCBwb2ludCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgICAgICBldmVudENvdW50OiBldmVudHMubGVuZ3RoLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0tIENoZWNrIHJlc3VsdCAtLS0tXG4gICAgcmV0dXJuIG1ha2VMaXZlU2Vzc2lvbihcbiAgICAgIHZtLFxuICAgICAgc2VyZGUsXG4gICAgICBpbnRlcnJ1cHRCdWRnZXQsXG4gICAgICBhZHZhbmNlQ2xvY2ssXG4gICAgICBvcHRpb25zLmVuY3J5cHRpb25LZXlcbiAgICApO1xuICB9XG59XG5cbi8qKiBTZXNzaW9uIHdyYXBwZXIgZm9yIGEgcmVzdWx0IHdob3NlIFZNIGlzIGFscmVhZHkgc2V0dGxlZC9kaXNwb3NlZC4gKi9cbmZ1bmN0aW9uIG1ha2VTZXR0bGVkU2Vzc2lvbihcbiAgcmVzdWx0OiBRdWlja0pTUnVudGltZVJlc3VsdFxuKTogUXVpY2tKU1dvcmtmbG93U2Vzc2lvbiB7XG4gIHJldHVybiB7XG4gICAgcmVzdWx0LFxuICAgIGNvbnRpbnVlV2l0aEV2ZW50czogKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUXVpY2tKUyB3b3JrZmxvdyBzZXNzaW9uIGlzIHNldHRsZWQg4oCUIGNvbnRpbnVlV2l0aEV2ZW50cyBpcyBvbmx5IHZhbGlkIHdoaWxlIHN1c3BlbmRlZCdcbiAgICAgICk7XG4gICAgfSxcbiAgICBkaXNwb3NlOiAoKSA9PiB7fSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgVk0ncyBzdGF0ZSBhbmQgd3JhcCBpdCBpbiBhIGxpdmUgc2Vzc2lvbi4gV2hpbGUgc3VzcGVuZGVkLFxuICogdGhlIFZNIHN0YXlzIGFsaXZlIHNvIGBjb250aW51ZVdpdGhFdmVudHNgIGNhbiByZXN1bWUgaXQgaW4gcGxhY2U7XG4gKiB0ZXJtaW5hbCBzdGF0ZXMgZGlzcG9zZSB0aGUgVk0gaW1tZWRpYXRlbHkgKGluc2lkZSBjaGVja1dvcmtmbG93U3RhdGUpLlxuICovXG5mdW5jdGlvbiBtYWtlTGl2ZVNlc3Npb24oXG4gIHZtOiBRdWlja0pTLFxuICBzZXJkZTogUXVpY2tKU1NlcmRlLFxuICBpbnRlcnJ1cHRCdWRnZXQ6IEludGVycnVwdEJ1ZGdldCxcbiAgYWR2YW5jZUNsb2NrOiAobXM6IG51bWJlcikgPT4gdm9pZCxcbiAgZW5jcnlwdGlvbktleT86IERlY3J5cHRpb25LZXlcbik6IFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24ge1xuICBjb25zdCByZXN1bHQgPSBjaGVja1dvcmtmbG93U3RhdGUodm0sIHNlcmRlLCB7IGtlZXBBbGl2ZU9uU3VzcGVuZDogdHJ1ZSB9KTtcbiAgbGV0IGFsaXZlID0gISFyZXN1bHQuc3VzcGVuZGVkO1xuXG4gIGNvbnN0IHNlc3Npb246IFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24gPSB7XG4gICAgcmVzdWx0LFxuICAgIGFzeW5jIGNvbnRpbnVlV2l0aEV2ZW50cyhcbiAgICAgIG5ld0V2ZW50czogRXZlbnRbXVxuICAgICk6IFByb21pc2U8UXVpY2tKU1J1bnRpbWVSZXN1bHQ+IHtcbiAgICAgIGlmICghYWxpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdRdWlja0pTIHdvcmtmbG93IHNlc3Npb24gaXMgbm90IGFsaXZlIOKAlCBjb250aW51ZVdpdGhFdmVudHMgaXMgb25seSB2YWxpZCB3aGlsZSBzdXNwZW5kZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBGcmVzaCBleGVjdXRpb24gYnVyc3Qg4oCUIHRoZSBpbnRlcnJ1cHQgYnVkZ2V0IGJvdW5kcyBWTSBjb21wdXRlLFxuICAgICAgLy8gbm90IHdhbGwgdGltZSBzcGVudCB3YWl0aW5nIG9uIGlubGluZSBzdGVwcyBiZXR3ZWVuIGJ1cnN0cy5cbiAgICAgIGludGVycnVwdEJ1ZGdldC5zdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAgIGxldCBtYXhJdGVyYXRpb25zID0gMTAwO1xuICAgICAgbGV0IG1hZGVQcm9ncmVzczogYm9vbGVhbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbWFkZVByb2dyZXNzID0gYXdhaXQgcHJvY2Vzc0V2ZW50cyhcbiAgICAgICAgICB2bSxcbiAgICAgICAgICBzZXJkZSxcbiAgICAgICAgICBuZXdFdmVudHMsXG4gICAgICAgICAgYWR2YW5jZUNsb2NrLFxuICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGJhdGNoOiBudW1iZXI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBiYXRjaCA9IHZtLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgIGlmIChiYXRjaCA+IDApIG1hZGVQcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIH0gd2hpbGUgKGJhdGNoID4gMCk7XG4gICAgICB9IHdoaWxlIChtYWRlUHJvZ3Jlc3MgJiYgLS1tYXhJdGVyYXRpb25zID4gMCk7XG5cbiAgICAgIGNvbnN0IG5leHQgPSBjaGVja1dvcmtmbG93U3RhdGUodm0sIHNlcmRlLCB7XG4gICAgICAgIGtlZXBBbGl2ZU9uU3VzcGVuZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuZXh0LnN1c3BlbmRlZCkgYWxpdmUgPSBmYWxzZTtcbiAgICAgIHNlc3Npb24ucmVzdWx0ID0gbmV4dDtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0sXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgIGlmIChhbGl2ZSkge1xuICAgICAgICBhbGl2ZSA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZtLmRpc3Bvc2UoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQWxyZWFkeSBkaXNwb3NlZCDigJQgaWdub3JlLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHNlc3Npb247XG59XG5cbi8vIC0tLS0gRXZlbnQgUHJvY2Vzc2luZyAtLS0tXG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFdmVudHMoXG4gIHZtOiBRdWlja0pTLFxuICBzZXJkZTogUXVpY2tKU1NlcmRlLFxuICBldmVudHM6IEV2ZW50W10sXG4gIGFkdmFuY2VDbG9jazogKG1zOiBudW1iZXIpID0+IHZvaWQsXG4gIGVuY3J5cHRpb25LZXk/OiBEZWNyeXB0aW9uS2V5XG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IHJlc29sdmVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgLy8gQWR2YW5jZSB0aGUgVk0ncyBkZXRlcm1pbmlzdGljIGNsb2NrIHRvIHRoaXMgZXZlbnQncyBjcmVhdGlvbiB0aW1lXG4gICAgLy8gQkVGT1JFIHJlc29sdmluZyBhbnl0aGluZywgc28gd29ya2Zsb3cgY29kZSB1bmJsb2NrZWQgYnkgdGhpcyBldmVudFxuICAgIC8vIG9ic2VydmVzIERhdGUubm93KCkgYXQgKG9yIGFmdGVyIOKAlCB0aGUgY2xvY2sgaXMgbW9ub3RvbmljKSB0aGUgdGltZVxuICAgIC8vIHRoZSBldmVudCB3YXMgcmVjb3JkZWQuIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAvLyBgb25Db25zdW1lZEV2ZW50IOKGkiB1cGRhdGVUaW1lc3RhbXAoK2V2ZW50LmNyZWF0ZWRBdClgLlxuICAgIGFkdmFuY2VDbG9jaygrZXZlbnQuY3JlYXRlZEF0KTtcblxuICAgIGNvbnN0IGNpZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjaWQpIGNvbnRpbnVlO1xuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgaGFuZGxlcyBxdW90ZXMsIGJhY2tzbGFzaGVzIGFuZCBjb250cm9sIGNoYXJhY3RlcnM7XG4gICAgLy8gY29ycmVsYXRpb24gaWRzIGFyZSBob3N0LWdlbmVyYXRlZCBVTElEcyB0b2RheSwgYnV0IHRoZSBldmFsLXN0cmluZ1xuICAgIC8vIHNhZmV0eSBzaG91bGRuJ3QgZGVwZW5kIG9uIHRoYXQgaW52YXJpYW50IGJlaW5nIGFzc2VydGVkIG5vd2hlcmUuXG4gICAgY29uc3QgY2lkSnMgPSBKU09OLnN0cmluZ2lmeShjaWQpO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9XG4gICAgICAnZXZlbnREYXRhJyBpbiBldmVudFxuICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gTG9nIHRoZSBldmVudCBhbmQgd2hldGhlciB0aGUgcmVzb2x2ZXIgZXhpc3RzXG4gICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzoge1xuICAgICAgICBjb25zdCBoYXNSZXNvbHZlciA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoYCEhZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV1gKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByYXdPdXRwdXQgPSBldmVudERhdGE/LnJlc3VsdCA/PyBldmVudERhdGE/Lm91dHB1dDtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIC8vIERlY3J5cHQgaWYgZW5jcnlwdGVkIOKAlCB0aGUgVk0gb25seSB1bmRlcnN0YW5kcyAnZGV2bCcgZm9ybWF0XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHN0ZXAgcmVzdWx0IHJhdycsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICByYXdQcmVmaXg6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShyYXdPdXRwdXQuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgICAgICAgICByYXdCeXRlTGVuZ3RoOiByYXdPdXRwdXQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgaXNCdWZmZXI6IEJ1ZmZlci5pc0J1ZmZlcihyYXdPdXRwdXQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWRPdXRwdXQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBzdGVwIHJlc3VsdCBkZWNyeXB0ZWQnLCB7XG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNpZCxcbiAgICAgICAgICAgICAgcHJlZml4OiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkT3V0cHV0LnN1YmFycmF5KDAsIDQpKSxcbiAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogZGVjcnlwdGVkT3V0cHV0LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKGdsb2JhbFRoaXMuX190bXBfcmVzdWx0KTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3RtcF9yZXN1bHQ7YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogc3RlcCByZXN1bHQgbm9uLWJpbmFyeScsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICB0eXBlOiB0eXBlb2YgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBpc051bGw6IHJhd091dHB1dCA9PT0gbnVsbCxcbiAgICAgICAgICAgICAgaXNVbmRlZmluZWQ6IHJhd091dHB1dCA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogcmF3T3V0cHV0Py5jb25zdHJ1Y3Rvcj8ubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKCR7c2VyaWFsaXplZH0pO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIERyYWluIEFMTCBtaWNyb3Rhc2tzIGFmdGVyIHJlc29sdmVcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCDigJQgYnVmZmVyIHRoZSBwcmVwYXJlZCBvdXRjb21lIHNvIHRoZSBwcm9taXNlXG4gICAgICAgICAgLy8gc2V0dGxlcyB0aGUgbW9tZW50IHRoZSBWTSBjb25zdHJ1Y3RzIGl0IChzZWUgX190ZXJtaW5hbEJ1ZmZlclxuICAgICAgICAgIC8vIGluIHRoZSBib290c3RyYXApLiBXaXRob3V0IHRoaXMsIHRoZSBsaXZlLWNvbnRpbnVhdGlvbiBwYXRoXG4gICAgICAgICAgLy8gKHdoaWNoIHNjYW5zIGVhY2ggZGVsdGEgZXhhY3RseSBvbmNlKSBkcm9wcyB0aGUgdGVybWluYWwgYW5kXG4gICAgICAgICAgLy8gdGhlIGF3YWl0IG5ldmVyIHNldHRsZXMuXG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZE91dHB1dCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdPdXRwdXQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIGEgVk0gdmFsdWUgTk9XIChzYW1lIHBhdGggYXNcbiAgICAgICAgICAgIC8vIHRoZSByZXNvbHZlciBicmFuY2ggYWJvdmUpIGFuZCBidWZmZXIgdGhlIHZhbHVlIGl0c2VsZi5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6IGdsb2JhbFRoaXMuX190bXBfYnVmIH07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2J1ZjtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6ICR7c2VyaWFsaXplZH0gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gZXZlbnREYXRhPy5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3JEYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHBhdGggKHBvc3QtIzE4NTEpOiB0aGUgc3RlcCBoYW5kbGVyIGRlaHlkcmF0ZWQgdGhlXG4gICAgICAgICAgICAvLyB0aHJvd24gdmFsdWUgdGhyb3VnaCB0aGUgZmlyc3QtY2xhc3MgZXJyb3IgcGlwZWxpbmUuIERlY3J5cHRcbiAgICAgICAgICAgIC8vIChpZiBlbmNyeXB0ZWQpIGFuZCBwYXNzIHRoZSBieXRlcyB0byB0aGUgVk0tc2lkZSBkZXNlcmlhbGl6ZXJcbiAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JrZmxvdyBjYXRjaCBzZWVzIGEgcHJvcGVybHkgdHlwZWQgRXJyb3Igc3ViY2xhc3NcbiAgICAgICAgICAgIC8vIChUeXBlRXJyb3IsIEZhdGFsRXJyb3Igd2l0aCBvcmlnaW5hbCBjYXVzZSBjaGFpbiwgZXRjLikgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYW5kIHN0YWNrIHByZXNlcnZlZC5cbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICBjb25zdCBlcnJvckhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZCk7XG4gICAgICAgICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fdG1wX2Vycm9yJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGdsb2JhbFRoaXMuX190bXBfZXJyb3IpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2Vycm9yO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExlZ2FjeSBwYXRoOiBwcmUtcGlwZWxpbmUgZXZlbnRzIHN0b3JlZCBlcnJvciBhc1xuICAgICAgICAgICAgLy8gYHsgbWVzc2FnZSwgc3RhY2ssIGNvZGUgfWAuIFJlY29uc3RydWN0IGEgRmF0YWxFcnJvciBzb1xuICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2F0Y2ggY2FuIGRldGVjdCBpdCB2aWEgRmF0YWxFcnJvci5pcygpLCBtYXRjaGluZ1xuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFYxIHN0ZXAgaGFuZGxlciBiZWhhdmlvci5cbiAgICAgICAgICAgIGNvbnN0IGlzRXJyb3JPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgZXJyb3JEYXRhID09PSAnb2JqZWN0JyAmJiBlcnJvckRhdGEgIT09IG51bGw7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgID8gKCgoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tZXNzYWdlIGFzIHN0cmluZykgPz9cbiAgICAgICAgICAgICAgICAnU3RlcCBmYWlsZWQnKVxuICAgICAgICAgICAgICA6IHR5cGVvZiBlcnJvckRhdGEgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBlcnJvckRhdGFcbiAgICAgICAgICAgICAgICA6ICdTdGVwIGZhaWxlZCc7XG4gICAgICAgICAgICBjb25zdCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgKGlzRXJyb3JPYmplY3RcbiAgICAgICAgICAgICAgICA/IChlcnJvckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnN0YWNrXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpID8/IChldmVudERhdGE/LnN0YWNrIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb25zdCBzdGFja0Fzc2lnbm1lbnQgPSBlcnJvclN0YWNrXG4gICAgICAgICAgICAgID8gYGUuc3RhY2s9JHtKU09OLnN0cmluZ2lmeShlcnJvclN0YWNrKX07YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoJHtKU09OLnN0cmluZ2lmeShtc2cpfSk7ZS5uYW1lPVwiRmF0YWxFcnJvclwiO2UuZmF0YWw9dHJ1ZTske3N0YWNrQXNzaWdubWVudH1gICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGUpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07fSkoKWBcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCDigJQgYnVmZmVyIHRoZSBwcmVwYXJlZCByZWplY3Rpb24gKHNlZSB0aGVcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZCBicmFuY2ggYWJvdmUgZm9yIHRoZSByYXRpb25hbGUpLlxuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGV2ZW50RGF0YT8uZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIHRoZSBWTSBlcnJvciB2YWx1ZSBOT1cgKHNhbWVcbiAgICAgICAgICAgIC8vIHBhdGggYXMgdGhlIHJlc29sdmVyIGJyYW5jaCBhYm92ZSkgYW5kIGJ1ZmZlciBpdC5cbiAgICAgICAgICAgIGNvbnN0IGVycm9ySGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF92YWx1ZVwiLCB2YWx1ZTogZ2xvYmFsVGhpcy5fX3RtcF9idWYgfTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYnVmO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpc0Vycm9yT2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIGVycm9yRGF0YSA9PT0gJ29iamVjdCcgJiYgZXJyb3JEYXRhICE9PSBudWxsO1xuICAgICAgICAgICAgY29uc3QgbXNnID0gaXNFcnJvck9iamVjdFxuICAgICAgICAgICAgICA/ICgoKGVycm9yRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikubWVzc2FnZSBhcyBzdHJpbmcpID8/XG4gICAgICAgICAgICAgICAgJ1N0ZXAgZmFpbGVkJylcbiAgICAgICAgICAgICAgOiB0eXBlb2YgZXJyb3JEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gZXJyb3JEYXRhXG4gICAgICAgICAgICAgICAgOiAnU3RlcCBmYWlsZWQnO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgIChpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgICAgPyAoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zdGFja1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSA/PyAoZXZlbnREYXRhPy5zdGFjayBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF9lcnJvclwiLCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9LCBzdGFjazogJHtlcnJvclN0YWNrID8gSlNPTi5zdHJpbmdpZnkoZXJyb3JTdGFjaykgOiAndW5kZWZpbmVkJ30gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3YWl0X2NvbXBsZXRlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCDigJQgYnVmZmVyIChzZWUgc3RlcF9jb21wbGV0ZWQgYWJvdmUpLlxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlclske2NpZEpzfV0gPSB7IGtpbmQ6IFwicmVzb2x2ZV91bmRlZmluZWRcIiB9O2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2F0dHJfc2V0Jzoge1xuICAgICAgICAvLyBPbmx5IHdvcmtmbG93LXdyaXR0ZW4gYXR0cmlidXRlIGV2ZW50cyByZXNvbHZlIGEgcGVuZGluZ1xuICAgICAgICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZTsgc3RlcC9zeXN0ZW0gd3JpdGVycyBzaGFyZSBub1xuICAgICAgICAvLyBjb3JyZWxhdGlvbklkcyB3aXRoIFZNIHJlc29sdmVycywgc28gdGhlIGd1YXJkIGlzIGRlZmVuc2l2ZS5cbiAgICAgICAgY29uc3Qgd3JpdGVyID0gKGV2ZW50RGF0YT8ud3JpdGVyIGFzIHsgdHlwZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKVxuICAgICAgICAgID8udHlwZTtcbiAgICAgICAgaWYgKHdyaXRlciAhPT0gJ3dvcmtmbG93JykgYnJlYWs7XG4gICAgICAgIGNvbnN0IGhhc1Jlc29sdmVyID0gdm0uZHVtcChcbiAgICAgICAgICB2bS5ldmFsQ29kZShgISFnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XWApXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaGFzUmVzb2x2ZXIpIHtcbiAgICAgICAgICAvLyBObyByZXNvbHZlciB5ZXQg4oCUIGJ1ZmZlciAoc2VlIHN0ZXBfY29tcGxldGVkIGFib3ZlKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdW5kZWZpbmVkXCIgfTtgXG4gICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaG9va19yZWNlaXZlZCc6IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBldmVudCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgKGRlbGl2ZXJlZCBvclxuICAgICAgICAvLyBidWZmZXJlZCkgd2l0aGluIHRoaXMgaW52b2NhdGlvbi4gUHJldmVudHMgZG91YmxlLWRlbGl2ZXJ5IHdoZW5cbiAgICAgICAgLy8gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICBjb25zdCBhbHJlYWR5UHJvY2Vzc2VkID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgID8gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYCEhKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzICYmIGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSlgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoYWxyZWFkeVByb2Nlc3NlZCkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBob29rX3JlY2VpdmVkIGFscmVhZHkgcHJvY2Vzc2VkJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2lsaWVudC1yZXN1bWUgZGVkdXAgKHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIEV2ZW50c0NvbnN1bWVyIGluIHdvcmtmbG93L2hvb2sudHMpOiB0d28gaG9va19yZWNlaXZlZCByb3dzIGZvclxuICAgICAgICAvLyBPTkUgcmVzdW1lIGF0dGVtcHQgc2hhcmUgYSBjbGllbnQtbWludGVkIGByZXN1bWVJZGAgKGEgZHVwbGljYXRlXG4gICAgICAgIC8vIGNhbiBiZSBjb21taXR0ZWQgd2hlbiB0aGUgbWF0ZXJpYWxpemF0aW9uIGZhbGxiYWNrIHJhY2VzIGFcbiAgICAgICAgLy8gZGVsYXllZCBkaXJlY3Qgd3JpdGUg4oCUIGhvb2tfcmVjZWl2ZWQgaGFzIG5vIHN0b3JhZ2UgdW5pcXVlbmVzc1xuICAgICAgICAvLyBjb25zdHJhaW50KS4gRGVsaXZlciBvbmx5IHRoZSBmaXJzdC1pbi1sb2cgb2NjdXJyZW5jZS4gVGhlIHNlZW5cbiAgICAgICAgLy8gc2V0IGxpdmVzIGluIHRoZSBWTSBoZWFwIHNvIGl0IGlzIGRldGVybWluaXN0aWMgcGVyIHJlcGxheSBhbmRcbiAgICAgICAgLy8gc3Vydml2ZXMgZXZlbnQgcmUtc2NhbnMgd2l0aGluIHRoZSBpbnZvY2F0aW9uLiBFdmVudHMgd2l0aG91dCBhXG4gICAgICAgIC8vIHJlc3VtZUlkIChvbGRlciBTREtzKSBhcmUgbmV2ZXIgZGVkdXBlZC5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRvcC1sZXZlbCBldmVudC5yZXN1bWVJZCBpcyB0aGUgY2Fub25pY2FsIGxvY2F0aW9uICh0aGUgYmFja2VuZFxuICAgICAgICAgIC8vIGhvaXN0cyBpdCB0byBhIGZpcnN0LWNsYXNzIGNvbHVtbik7IHRoZSBuZXN0ZWRcbiAgICAgICAgICAvLyBldmVudERhdGEucmVzdW1lSWQgZm9ybSBpcyBhIGRlcHJlY2F0ZWQgbGVnYWN5IGZhbGxiYWNrIOKAlFxuICAgICAgICAgIC8vIG1pcnJvcnMgdGhlIG5vZGUgZW5naW5lJ3MgZGVkdXAgaW4gd29ya2Zsb3cvaG9vay50cy5cbiAgICAgICAgICBjb25zdCByZXN1bWVJZCA9XG4gICAgICAgICAgICAoZXZlbnQgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSkucmVzdW1lSWQgPz9cbiAgICAgICAgICAgIChldmVudERhdGEgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnJlc3VtZUlkO1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdW1lSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bWVJZEpzID0gSlNPTi5zdHJpbmdpZnkocmVzdW1lSWQpO1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlID0gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgPSBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgfHwge30pWyR7cmVzdW1lSWRKc31dID09PSB0cnVlYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGR1cGxpY2F0ZSBob29rX3JlY2VpdmVkIGZvciB0aGUgc2FtZSByZXN1bWUgYXR0ZW1wdCwgZHJvcHBpbmcnLFxuICAgICAgICAgICAgICAgIHsgY29ycmVsYXRpb25JZDogY2lkLCBldmVudElkOiBldmVudC5ldmVudElkLCByZXN1bWVJZCB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgICBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSA9IHRydWU7YFxuICAgICAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHNbJHtyZXN1bWVJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFib3J0IGRlbGl2ZXJ5OiBob29rX3JlY2VpdmVkIGZvciBhbiBBYm9ydENvbnRyb2xsZXIncyBzeXN0ZW1cbiAgICAgICAgLy8gaG9vayBmbGlwcyB0aGUgcmVnaXN0ZXJlZCBzaWduYWwgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSBwcm9taXNlLlxuICAgICAgICAvLyBUaGUgcGF5bG9hZCBpcyB0aGUgZGVoeWRyYXRlZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgb2JqZWN0LlxuICAgICAgICBjb25zdCBpc0Fib3J0SG9vayA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgISEoZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyAmJiBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzWyR7Y2lkSnN9XSlgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNBYm9ydEhvb2spIHtcbiAgICAgICAgICBjb25zdCByYXdBYm9ydFBheWxvYWQgPSBldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgICAgaWYgKHJhd0Fib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdBYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYWJvcnQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgdmFyIHA9Z2xvYmFsVGhpcy5fX3RtcF9hYm9ydDtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYWJvcnQ7YCArXG4gICAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19hYm9ydFNpZ25hbHNbJHtjaWRKc31dLl9zZXRBYm9ydGVkKHAmJnR5cGVvZiBwPT09XCJvYmplY3RcIj9wLnJlYXNvbjp1bmRlZmluZWQpO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFsc1ske2NpZEpzfV0uX3NldEFib3J0ZWQodW5kZWZpbmVkKTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGFib3J0IGlzIGR1cmFibHkgcmVjb3JkZWQg4oCUIGNsZWFyIHRoZSBwZW5kaW5nIG9wJ3NcbiAgICAgICAgICAvLyBhYm9ydFJlcXVlc3RlZCBtYXJrZXIgc28gdGhlIGhvc3QgZG9lc24ndCByZS1yZWNvcmQgaXQgKHRoZVxuICAgICAgICAgIC8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBjYW4gc2V0IHRoZSBmbGFnIGJlZm9yZSB0aGlzXG4gICAgICAgICAgLy8gZXZlbnQgaXMgcHJvY2Vzc2VkIHdoZW4gaXQgaGFwcGVucyBsYXRlciBpbiByZXBsYXkgb3JkZXIsXG4gICAgICAgICAgLy8gYW5kIGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBub3QgdW5pcXVlIHBlciBjb3JyZWxhdGlvbklkKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgYHZhciBwPWdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbmQoZnVuY3Rpb24ocSl7cmV0dXJuIHEuY29ycmVsYXRpb25JZD09PSR7SlNPTi5zdHJpbmdpZnkoY2lkKX0mJnEudHlwZT09PVwiaG9va1wiO30pO2AgK1xuICAgICAgICAgICAgICBgaWYocClwLmFib3J0UmVxdWVzdGVkPWZhbHNlO2AgK1xuICAgICAgICAgICAgICBgfSkoKWBcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICBpZiAoZXZlbnQuZXZlbnRJZCkge1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgPSBnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyB8fCB7fSlbJHtKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKX1dID0gdHJ1ZTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGI6IG51bWJlcjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgYiA9IHZtLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgICAgfSB3aGlsZSAoYiA+IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmF3UGF5bG9hZCA9IGV2ZW50RGF0YT8ucGF5bG9hZCA/PyBldmVudERhdGE/LnJlc3VsdDtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2tfcmVjZWl2ZWQnLCB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgaGFzUmVzb2x2ZXIsXG4gICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiByYXdQYXlsb2FkLFxuICAgICAgICAgIHBheWxvYWRJc1VpbnQ4QXJyYXk6IHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgICAgICAgIHBheWxvYWRLZXlzOlxuICAgICAgICAgICAgcmF3UGF5bG9hZCAmJiB0eXBlb2YgcmF3UGF5bG9hZCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyhyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYXNSZXNvbHZlcikge1xuICAgICAgICAgIGlmIChyYXdQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gRGVjcnlwdCBpZiBlbmNyeXB0ZWQg4oCUIHRoZSBWTSBvbmx5IHVuZGVyc3RhbmRzICdkZXZsJyBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZFBheWxvYWQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWRIYW5kbGUgPSBzZXJkZS5kZXNlcmlhbGl6ZShkZWNyeXB0ZWRQYXlsb2FkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgcGF5bG9hZEhhbmRsZSk7XG4gICAgICAgICAgICBwYXlsb2FkSGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZShnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdCk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfcmVzdWx0O2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID1cbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dLnJlc29sdmUoJHtzZXJpYWxpemVkfSk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTWFyayB0aGlzIGV2ZW50IGFzIHByb2Nlc3NlZCBpbiB0aGUgVk0gaGVhcCB0byBwcmV2ZW50XG4gICAgICAgICAgLy8gZG91YmxlLWRlbGl2ZXJ5IHdoZW4gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzIHx8IHt9KVske0pTT04uc3RyaW5naWZ5KGV2ZW50LmV2ZW50SWQpfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCDigJQgYnVmZmVyIHRoZSBwYXlsb2FkIGluIHRoZSBWTSBoZWFwLiBXaGVuXG4gICAgICAgICAgLy8gY3JlYXRlSG9va1Byb21pc2UoKSBpcyBjYWxsZWQgbGF0ZXIsIGl0IHdpbGwgZHJhaW4gdGhpcyBidWZmZXJcbiAgICAgICAgICAvLyBmaXJzdCAobWF0Y2hpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgcGF5bG9hZHNRdWV1ZSBiZWhhdmlvcikuXG4gICAgICAgICAgY29uc3QgZXZlbnRJZEpzID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKVxuICAgICAgICAgICAgOiAnbnVsbCc7XG4gICAgICAgICAgY29uc3QgYnVmZmVyQW5kVHJhY2sgPVxuICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXJbJHtjaWRKc31dID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyWyR7Y2lkSnN9XSB8fCBbXSlgICtcbiAgICAgICAgICAgIGAucHVzaCglUEFZTE9BRCUpO2AgK1xuICAgICAgICAgICAgKGV2ZW50LmV2ZW50SWRcbiAgICAgICAgICAgICAgPyBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7ZXZlbnRJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICAgOiAnJyk7XG4gICAgICAgICAgaWYgKHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAvLyBEZWNyeXB0IGlmIGVuY3J5cHRlZCDigJQgdGhlIFZNIG9ubHkgdW5kZXJzdGFuZHMgJ2RldmwnIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkUGF5bG9hZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdQYXlsb2FkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZEhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZFBheWxvYWQpO1xuICAgICAgICAgICAgdm0uc2V0UHJvcCh2bS5nbG9iYWwsICdfX3RtcF9yZXN1bHQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgLy8gTk9URTogcmVwbGFjZW1lbnQgaXMgYSBmdW5jdGlvbiBzbyBgJGAtc2VxdWVuY2VzIGluIHRoZVxuICAgICAgICAgICAgLy8gc3Vic3RpdHV0ZWQgSlMgbmV2ZXIgZ2V0IGludGVycHJldGVkIGFzIFN0cmluZy5yZXBsYWNlXG4gICAgICAgICAgICAvLyBzcGVjaWFsIHJlcGxhY2VtZW50IHBhdHRlcm5zLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgJyVQQVlMT0FEJScsXG4gICAgICAgICAgICAgICAgKCkgPT4gJ2dsb2JhbFRoaXMuX190bXBfcmVzdWx0J1xuICAgICAgICAgICAgICApICsgJ2RlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdDsnXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd1BheWxvYWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmF3UGF5bG9hZClcbiAgICAgICAgICAgICAgICA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVwbGFjZW1lbnQ6IGEgSlNPTi1zZXJpYWxpemVkIHBheWxvYWQgY2FuIGNvbnRhaW5cbiAgICAgICAgICAgIC8vIGAkJmAsIGAkJ2AsIGAkXFxgYCwgLi4uIHdoaWNoIFN0cmluZy5yZXBsYWNlIHdvdWxkIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gZXhwYW5kLCBzaWxlbnRseSBjb3JydXB0aW5nIHRoZSBpbmplY3RlZCBjb2RlLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoJyVQQVlMT0FEJScsICgpID0+IHNlcmlhbGl6ZWQpXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2NvbmZsaWN0Jzoge1xuICAgICAgICAvLyBBbm90aGVyIHdvcmtmbG93IG93bnMgdGhpcyBob29rIHRva2VuLiBQYXlsb2FkIGF3YWl0ZXJzIHJlamVjdFxuICAgICAgICAvLyB3aXRoIEhvb2tDb25mbGljdEVycm9yOyBnZXRDb25mbGljdCgpIGF3YWl0ZXJzIHJlc29sdmUgd2l0aCBhXG4gICAgICAgIC8vIFJ1biBoYW5kbGUgZm9yIHRoZSBjb25mbGljdGluZyBydW4gKHJldml2ZWQgdGhyb3VnaCB0aGUgVk0nc1xuICAgICAgICAvLyBjbGFzcyByZWdpc3RyeSBzbyBpdHMgbWV0aG9kcyBhcmUgZHVyYWJsZSBzdGVwIHByb3hpZXMpIG9yXG4gICAgICAgIC8vIHJlamVjdCB3aXRoIHRoZSBlcnJvciB3aGVuIG5vIGhhbmRsZSBjYW4gYmUgY29uc3RydWN0ZWQg4oCUXG4gICAgICAgIC8vIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBob29rLnRzIGhvb2tfY29uZmxpY3QgaGFuZGxpbmcuXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0VG9rZW4gPSAoZXZlbnREYXRhPy50b2tlbiBhcyBzdHJpbmcpID8/ICd1bmtub3duJztcbiAgICAgICAgY29uc3QgY29uZmxpY3RpbmdSdW5JZCA9IGV2ZW50RGF0YT8uY29uZmxpY3RpbmdSdW5JZCBhc1xuICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGRpZFNldHRsZSA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgIHZhciBjaWQgPSAke0pTT04uc3RyaW5naWZ5KGNpZCl9O1xuICAgICAgICAgICAgICB2YXIgdG9rZW4gPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0VG9rZW4pfTtcbiAgICAgICAgICAgICAgdmFyIGNvbmZsaWN0aW5nUnVuSWQgPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0aW5nUnVuSWQgPz8gbnVsbCl9O1xuICAgICAgICAgICAgICB2YXIgRXJyQ2xzID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXTtcbiAgICAgICAgICAgICAgdmFyIGVycjtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSBuZXcgRXJyQ2xzKHRva2VuLCBjb25mbGljdGluZ1J1bklkIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdIb29rIHRva2VuIFwiJyArIHRva2VuICsgJ1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgd29ya2Zsb3cnKTtcbiAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICdIb29rQ29uZmxpY3RFcnJvcic7XG4gICAgICAgICAgICAgICAgZXJyLnRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIGVyci5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgcnVuID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpXTtcbiAgICAgICAgICAgICAgICB2YXIgUnVuQ2xzID0gcmVnICYmIHJlZy5nZXQoJ2NsYXNzLy93b3JrZmxvdy8vUnVuJyk7XG4gICAgICAgICAgICAgICAgdmFyIGRlcyA9IFJ1bkNscyAmJiBSdW5DbHNbU3ltYm9sLmZvcignd29ya2Zsb3ctZGVzZXJpYWxpemUnKV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIHJ1biA9IGRlcy5jYWxsKFJ1bkNscywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzICYmIGdsb2JhbFRoaXMuX19ob29rc1tjaWRdO1xuICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY29uZmxpY3QgPSB7IGVycm9yOiBlcnIsIHJ1bjogcnVuIH07XG4gICAgICAgICAgICAgICAgdmFyIGdjID0gc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnM7XG4gICAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocnVuKSB7IGdjW2ldLnJlc29sdmUocnVuKTsgfSBlbHNlIHsgZ2NbaV0ucmVqZWN0KGVycik7IH1cbiAgICAgICAgICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NpZF07XG4gICAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHNldHRsZWQ7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRpZFNldHRsZSkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2NyZWF0ZWQnOlxuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgY2FzZSAnd2FpdF9jcmVhdGVkJzoge1xuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hvb2tfY3JlYXRlZCc6IHtcbiAgICAgICAgLy8gQ29uZmlybSBjcmVhdGlvbiBmb3IgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyczogcmVzb2x2ZSB0aGVtIHdpdGhcbiAgICAgICAgLy8gbnVsbCAobm8gY29uZmxpY3QpIG9uY2UgdGhlIGV2ZW50IGxvZyBwcm92ZXMgdGhlIGhvb2sgZXhpc3RzLlxuICAgICAgICBjb25zdCBzZXR0bGVkR2V0Q29uZmxpY3QgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBnbG9iYWxUaGlzLl9faG9va3MgJiYgZ2xvYmFsVGhpcy5fX2hvb2tzWyR7SlNPTi5zdHJpbmdpZnkoY2lkKX1dO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHN0YXRlLmNyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB2YXIgZ2MgPSBzdGF0ZS5nZXRDb25mbGljdFJlc29sdmVycztcbiAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYy5sZW5ndGg7IGkrKykgZ2NbaV0ucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdjLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNldHRsZWRHZXRDb25mbGljdCkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2Rpc3Bvc2VkJzoge1xuICAgICAgICAvLyBEaXNhbWJpZ3VhdGUgZnJvbSB0aGUgYGhvb2tgIHBlbmRpbmcgb3Agd2l0aCB0aGUgc2FtZVxuICAgICAgICAvLyBjb3JyZWxhdGlvbklkIOKAlCB3ZSB3YW50IHRvIG1hcmsgdGhlIGBob29rX2Rpc3Bvc2VgIGVudHJ5LlxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMsICdob29rX2Rpc3Bvc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gbWFya0NyZWF0ZWQodm06IFF1aWNrSlMsIGNpZEpzOiBzdHJpbmcsIG9wVHlwZT86IHN0cmluZyk6IHZvaWQge1xuICAvLyBgY2lkSnNgIGlzIHRoZSBKU09OLnN0cmluZ2lmeS1xdW90ZWQgY29ycmVsYXRpb24gaWQgKHNlZSBwcm9jZXNzRXZlbnRzKS5cbiAgLy8gYGhvb2tgIGFuZCBgaG9va19kaXNwb3NlYCBwZW5kaW5nIG9wcyBzaGFyZSB0aGUgc2FtZSBjb3JyZWxhdGlvbklkLFxuICAvLyBzbyB3aGVuIHByb2Nlc3NpbmcgYGhvb2tfZGlzcG9zZWRgIGV2ZW50cyB3ZSBtdXN0IGRpc2FtYmlndWF0ZSBieVxuICAvLyB0eXBlIOKAlCBvdGhlcndpc2UgYC5maW5kKClgIHJldHVybnMgdGhlIG9yaWdpbmFsIGBob29rYCBvcCBhbmQgdGhlXG4gIC8vIGBob29rX2Rpc3Bvc2VgIG9wIGlzIG5ldmVyIG1hcmtlZCwgY2F1c2luZyB0aGUgZW50cnlwb2ludCB0byBrZWVwXG4gIC8vIHJldHJ5aW5nIGEgaG9va19kaXNwb3NlZCBmb3IgYW4gYWxyZWFkeS1kZWxldGVkIGVudGl0eS5cbiAgY29uc3QgcHJlZGljYXRlID0gb3BUeXBlXG4gICAgPyBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9JiZwLnR5cGU9PT0ke0pTT04uc3RyaW5naWZ5KG9wVHlwZSl9O31gXG4gICAgOiBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9O31gO1xuICB2bS5ldmFsQ29kZShcbiAgICBgdmFyIF9fcD1nbG9iYWxUaGlzLl9fcGVuZGluZy5maW5kKCR7cHJlZGljYXRlfSk7YCArXG4gICAgICBgaWYoX19wKV9fcC5oYXNDcmVhdGVkRXZlbnQ9dHJ1ZTtgXG4gICkuZGlzcG9zZSgpO1xufVxuXG4vLyAtLS0tIFN0YXRlIENoZWNraW5nIC0tLS1cblxuLyoqXG4gKiBDb2xsZWN0IGxlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgd2hlblxuICogdGhlIHdvcmtmbG93IHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUnc1xuICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcyAod29ya2Zsb3cudHMpOiBzdGlsbC1hbGl2ZSBzeXN0ZW0gaG9va3NcbiAqIChBYm9ydENvbnRyb2xsZXIpIHdpdGhvdXQgYW4gYWJvcnQgaW4gZmxpZ2h0IGFyZSBpbXBsaWNpdGx5IGRpc3Bvc2VkIHNvXG4gKiB0aGV5IGRvbid0IGxlYWsgaG9vayByb3dzOyBvcHMgd2l0aG91dCBjcmVhdGVkIGV2ZW50cyAoZmlyZS1hbmQtZm9yZ2V0XG4gKiBhdHRyaWJ1dGVzL2hvb2tzL3N0ZXBzL3dhaXRzKSBhbmQgcGVuZGluZyBhYm9ydCByZWNvcmRpbmdzIGFyZSBzdXJmYWNlZFxuICogZm9yIHRoZSBlbnRyeXBvaW50IHRvIGZsdXNoLlxuICovXG4vKipcbiAqIFBlci1WTSBjYWNoZSBvZiBzZXJpYWxpemVkIHBlbmRpbmctb3AgZmllbGQgYnl0ZXMsIGtleWVkXG4gKiBgY29ycmVsYXRpb25JZDpmaWVsZGAuIEEgc3RlcCdzIHJhdyBpbnB1dCBpcyBpbW11dGFibGUgb25jZSBwdXNoZWQsIHNvXG4gKiBpdHMgYnl0ZXMgYXJlIGNvbXB1dGVkIG9uY2UgZXZlbiB0aG91Z2ggdGhlIG9wIGlzIHJlLWNvbGxlY3RlZCBvbiBldmVyeVxuICogc3VzcGVuc2lvbiBpdCBzdGF5cyBwZW5kaW5nIHRocm91Z2guXG4gKi9cbmNvbnN0IHBlbmRpbmdCeXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxRdWlja0pTLCBNYXA8c3RyaW5nLCBVaW50OEFycmF5Pj4oKTtcblxuZnVuY3Rpb24gZW5zdXJlUGVuZGluZ0J5dGVDYWNoZSh2bTogUXVpY2tKUyk6IE1hcDxzdHJpbmcsIFVpbnQ4QXJyYXk+IHtcbiAgbGV0IGNhY2hlID0gcGVuZGluZ0J5dGVDYWNoZS5nZXQodm0pO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgcGVuZGluZ0J5dGVDYWNoZS5zZXQodm0sIGNhY2hlKTtcbiAgfVxuICByZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogVGhlIHBlbmRpbmctb3AgZmllbGRzIHRoYXQgaG9sZCBSQVcgZ3Vlc3QgdmFsdWVzICh0aGUgYm9vdHN0cmFwIG5vIGxvbmdlclxuICogc2VyaWFsaXplcyB0aGVtIGluIHRoZSBWTSkuIENvbGxlY3Rpb24gcHJvamVjdHMgdGhlbSBvdXQgb2YgdGhlIGR1bXBlZFxuICogcGxhaW4gbWV0YWRhdGEgYW5kIHNlcmlhbGl6ZXMgZWFjaCB0aHJvdWdoIGEgaGFuZGxlIHdpdGggdGhlIGhvc3Qgc2VyZGUuXG4gKi9cbmNvbnN0IFJBV19QRU5ESU5HX0ZJRUxEUyA9IFsnaW5wdXQnLCAnbWV0YWRhdGEnLCAnYWJvcnRQYXlsb2FkJ10gYXMgY29uc3Q7XG5cbi8qKlxuICogRHVtcCBhIGZpbHRlcmVkIHZpZXcgb2YgYGdsb2JhbFRoaXMuX19wZW5kaW5nYCB0byBob3N0IFBlbmRpbmdPcGVyYXRpb25cbiAqIG9iamVjdHMsIHNlcmlhbGl6aW5nIHRoZSByYXctdmFsdWUgZmllbGRzIGhvc3Qtc2lkZS4gYGZpbHRlckV4cHJgIGlzIGFcbiAqIGd1ZXN0IGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8gdGhlIGFycmF5IG9mIG9wcyB0byBjb2xsZWN0LlxuICovXG5mdW5jdGlvbiBkdW1wUGVuZGluZ09wcyhcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIGZpbHRlckV4cHI6IHN0cmluZyxcbiAgYnl0ZUNhY2hlPzogTWFwPHN0cmluZywgVWludDhBcnJheT5cbik6IFBlbmRpbmdPcGVyYXRpb25bXSB7XG4gIHVzaW5nIHByb2plY3RlZCA9IHZtLmV2YWxDb2RlKGAoZnVuY3Rpb24oKXtcbiAgICB2YXIgb3BzID0gJHtmaWx0ZXJFeHByfTtcbiAgICBnbG9iYWxUaGlzLl9fcmF3RmllbGRzID0gW107XG4gICAgLy8gU2V0dGxlZCBvcHMg4oCUIGNyZWF0ZWQsIHJlc29sdmVyLWxlc3MsIG5vIGFib3J0IGluIGZsaWdodCDigJQgYXJlXG4gICAgLy8gbmV2ZXIgY29sbGVjdGVkIGFnYWluIGJ5IGVpdGhlciB0aGUgc3VzcGVuc2lvbiBvciB0aGUgZHJhaW5cbiAgICAvLyBmaWx0ZXIsIHNvIHRoZWlyIGNhY2hlZCBieXRlcyBhcmUgZGVhZCB3ZWlnaHQ7IHN1cmZhY2UgdGhlaXIgY2lkc1xuICAgIC8vIHNvIHRoZSBob3N0IGNhbiBldmljdCB0aGVtIChzZWUgdGhlIGJ5dGUtY2FjaGUgZXZpY3Rpb24gYmVsb3cpLlxuICAgIHZhciBzZXR0bGVkID0gW107XG4gICAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihwKXtcbiAgICAgIGlmIChwLmhhc0NyZWF0ZWRFdmVudCAmJiAhZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1twLmNvcnJlbGF0aW9uSWRdICYmICFwLmFib3J0UmVxdWVzdGVkKSB7XG4gICAgICAgIHNldHRsZWQucHVzaChwLmNvcnJlbGF0aW9uSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IHNldHRsZWQ6IHNldHRsZWQsIG9wczogb3BzLm1hcChmdW5jdGlvbihwKXtcbiAgICAgIHZhciBxID0ge307XG4gICAgICBmb3IgKHZhciBrIGluIHApIHtcbiAgICAgICAgaWYgKGsgPT09ICdpbnB1dCcgfHwgayA9PT0gJ21ldGFkYXRhJyB8fCBrID09PSAnYWJvcnRQYXlsb2FkJykgY29udGludWU7XG4gICAgICAgIHFba10gPSBwW2tdO1xuICAgICAgfVxuICAgICAgdmFyIHJhdyA9IHt9O1xuICAgICAgWydpbnB1dCcsICdtZXRhZGF0YScsICdhYm9ydFBheWxvYWQnXS5mb3JFYWNoKGZ1bmN0aW9uKGYpe1xuICAgICAgICBpZiAocFtmXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmF3W2ZdID0gZ2xvYmFsVGhpcy5fX3Jhd0ZpZWxkcy5sZW5ndGg7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5fX3Jhd0ZpZWxkcy5wdXNoKHBbZl0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHEuX19yYXdJbmRpY2VzID0gcmF3O1xuICAgICAgcmV0dXJuIHE7XG4gICAgfSkgfTtcbiAgfSkoKWApO1xuICBjb25zdCBkdW1wZWQgPSB2bS5kdW1wKHByb2plY3RlZCkgYXMge1xuICAgIHNldHRsZWQ6IHN0cmluZ1tdO1xuICAgIG9wczogKFBlbmRpbmdPcGVyYXRpb24gJiB7XG4gICAgICBfX3Jhd0luZGljZXM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIH0pW107XG4gIH07XG4gIGNvbnN0IHBsYWluT3BzID0gZHVtcGVkLm9wcztcbiAgLy8gQnl0ZS1jYWNoZSBldmljdGlvbjogZW50cmllcyBmb3Igc2V0dGxlZCBvcHMgY2FuIG5ldmVyIGJlIHJlYWQgYWdhaW5cbiAgLy8gKG5laXRoZXIgY29sbGVjdGlvbiBmaWx0ZXIgbWF0Y2hlcyBhIHNldHRsZWQgb3ApLCBzbyBkcm9wcGluZyB0aGVtXG4gIC8vIGJvdW5kcyB0aGUgY2FjaGUgYnkgdGhlIExJVkUgcGVuZGluZyBzZXQgaW5zdGVhZCBvZiBncm93aW5nXG4gIC8vIG1vbm90b25pY2FsbHkgZm9yIHRoZSBWTSdzIGxpZmV0aW1lIOKAlCB3aGljaCBtYXR0ZXJzIGZvciB0aGUgaW5saW5lXG4gIC8vIGxvb3AncyBsb25nLWxpdmVkIHNlc3Npb25zIGFuZCBzbmFwc2hvdC1yZXN0b3JlZCBWTXMuXG4gIGlmIChieXRlQ2FjaGUgJiYgZHVtcGVkLnNldHRsZWQubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgY2lkIG9mIGR1bXBlZC5zZXR0bGVkKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIFJBV19QRU5ESU5HX0ZJRUxEUykge1xuICAgICAgICBieXRlQ2FjaGUuZGVsZXRlKGAke2NpZH06JHtmaWVsZH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXNpbmcgcmF3RmllbGRzID0gdm0uZXZhbENvZGUoJ2dsb2JhbFRoaXMuX19yYXdGaWVsZHMnKTtcbiAgZm9yIChjb25zdCBvcCBvZiBwbGFpbk9wcykge1xuICAgIGNvbnN0IHJhd0luZGljZXMgPSBvcC5fX3Jhd0luZGljZXMgPz8ge307XG4gICAgZGVsZXRlIG9wLl9fcmF3SW5kaWNlcztcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIFJBV19QRU5ESU5HX0ZJRUxEUykge1xuICAgICAgY29uc3QgaW5kZXggPSByYXdJbmRpY2VzW2ZpZWxkXTtcbiAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7b3AuY29ycmVsYXRpb25JZH06JHtmaWVsZH1gO1xuICAgICAgbGV0IGJ5dGVzID0gYnl0ZUNhY2hlPy5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKCFieXRlcykge1xuICAgICAgICB1c2luZyB2YWx1ZUhhbmRsZSA9IHJhd0ZpZWxkcy5nZXRQcm9wKFN0cmluZyhpbmRleCkpO1xuICAgICAgICBieXRlcyA9IHNlcmRlLnNlcmlhbGl6ZSh2YWx1ZUhhbmRsZSk7XG4gICAgICAgIGJ5dGVDYWNoZT8uc2V0KGNhY2hlS2V5LCBieXRlcyk7XG4gICAgICB9XG4gICAgICAob3AgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbZmllbGRdID0gYnl0ZXM7XG4gICAgfVxuICB9XG4gIHZtLmV2YWxDb2RlKCdkZWxldGUgZ2xvYmFsVGhpcy5fX3Jhd0ZpZWxkcycpLmRpc3Bvc2UoKTtcbiAgcmV0dXJuIHBsYWluT3BzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RHJhaW5PcGVyYXRpb25zKFxuICB2bTogUXVpY2tKUyxcbiAgc2VyZGU6IFF1aWNrSlNTZXJkZVxuKTogUGVuZGluZ09wZXJhdGlvbltdIHtcbiAgLy8gU2hhcmUgdGhlIHBlci1WTSBieXRlIGNhY2hlIHdpdGggdGhlIHN1c3BlbnNpb24gcGF0aDogYW4gb3AgdGhhdCB3YXNcbiAgLy8gc2VyaWFsaXplZCBkdXJpbmcgYSBzdXNwZW5zaW9uIHBhc3MgbXVzdCByZXVzZSB0aG9zZSBleGFjdCBieXRlcyBhdFxuICAvLyB0ZXJtaW5hbCBkcmFpbiDigJQgcmUtc2VyaWFsaXppbmcgY2FuIGludm9rZSBnZXR0ZXJzIGFnYWluIGFuZCBwcm9kdWNlXG4gIC8vIGEgRElGRkVSRU5UIGJ5dGUgc2VxdWVuY2UgZm9yIHdoYXQgdGhlIGV2ZW50IGxvZyB0cmVhdHMgYXMgb25lIHZhbHVlLlxuICByZXR1cm4gZHVtcFBlbmRpbmdPcHMoXG4gICAgdm0sXG4gICAgc2VyZGUsXG4gICAgYChmdW5jdGlvbigpe1xuICAgIHZhciB0b0Rpc3Bvc2UgPSBbXTtcbiAgICBnbG9iYWxUaGlzLl9fcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKHApe1xuICAgICAgaWYgKHAudHlwZSA9PT0gXCJob29rXCIgJiYgcC5pc1N5c3RlbSAmJiAhcC5hYm9ydFJlcXVlc3RlZCAmJiAhcC5kaXNwb3NlZCkge1xuICAgICAgICBwLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgLy8gT25seSBkaXNwb3NlIGhvb2tzIHRoYXQgd2VyZSBkdXJhYmx5IGNyZWF0ZWQ7IGEgaG9vayB0aGF0IG5ldmVyXG4gICAgICAgIC8vIHJlYWNoZWQgc3RvcmFnZSBoYXMgbm90aGluZyB0byBjbGVhbiB1cC5cbiAgICAgICAgaWYgKHAuaGFzQ3JlYXRlZEV2ZW50KSB7XG4gICAgICAgICAgdG9EaXNwb3NlLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogXCJob29rX2Rpc3Bvc2VcIixcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHAuY29ycmVsYXRpb25JZCxcbiAgICAgICAgICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaChmdW5jdGlvbihkKXsgZ2xvYmFsVGhpcy5fX3BlbmRpbmcucHVzaChkKTsgfSk7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbHRlcihmdW5jdGlvbihwKXtcbiAgICAgIGlmIChwLmFib3J0UmVxdWVzdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChwLmhhc0NyZWF0ZWRFdmVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gU2tpcCBzeXN0ZW0gaG9va3MgdGhhdCB3ZXJlIGRpc3Bvc2VkIGJlZm9yZSBldmVyIGJlaW5nIGNyZWF0ZWQuXG4gICAgICBpZiAocC50eXBlID09PSBcImhvb2tcIiAmJiBwLmRpc3Bvc2VkKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSkoKWAsXG4gICAgZW5zdXJlUGVuZGluZ0J5dGVDYWNoZSh2bSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tXb3JrZmxvd1N0YXRlKFxuICB2bTogUXVpY2tKUyxcbiAgc2VyZGU6IFF1aWNrSlNTZXJkZSxcbiAgb3B0czogeyBrZWVwQWxpdmVPblN1c3BlbmQ/OiBib29sZWFuIH0gPSB7fVxuKTogUXVpY2tKU1J1bnRpbWVSZXN1bHQge1xuICAvLyBDaGVjayBjb21wbGV0ZWQg4oCUIF9fd29ya2Zsb3dSZXN1bHQgaG9sZHMgdGhlIFJBVyByZXR1cm4gdmFsdWUgKHdpdGggYVxuICAvLyBzZXBhcmF0ZSBkb25lIGZsYWcgc28gYHVuZGVmaW5lZGAgcmVzdWx0cyBhcmUgZGlzdGluZ3Vpc2hhYmxlKTsgdGhlXG4gIC8vIGhvc3Qgc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlLlxuICB7XG4gICAgdXNpbmcgZG9uZSA9IHZtLmV2YWxDb2RlKCdnbG9iYWxUaGlzLl9fd29ya2Zsb3dEb25lID09PSB0cnVlJyk7XG4gICAgaWYgKGRvbmUudG9Cb29sZWFuKCkpIHtcbiAgICAgIHVzaW5nIGggPSB2bS5ldmFsQ29kZSgnZ2xvYmFsVGhpcy5fX3dvcmtmbG93UmVzdWx0Jyk7XG4gICAgICBjb25zdCByZXN1bHRCeXRlcyA9IHNlcmRlLnNlcmlhbGl6ZShoKTtcbiAgICAgIGNvbnN0IGRyYWluT3BlcmF0aW9ucyA9IGNvbGxlY3REcmFpbk9wZXJhdGlvbnModm0sIHNlcmRlKTtcbiAgICAgIHZtLmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBsZXRlZDoge1xuICAgICAgICAgIHJlc3VsdDogcmVzdWx0Qnl0ZXMsXG4gICAgICAgICAgLi4uKGRyYWluT3BlcmF0aW9ucy5sZW5ndGggPiAwID8geyBkcmFpbk9wZXJhdGlvbnMgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZmFpbGVkXG4gIHtcbiAgICB1c2luZyBoID0gdm0uZXZhbENvZGUoJ2dsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yJyk7XG4gICAgaWYgKCFoLmlzVW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGUgZGlzcGxheSBmaWVsZHMgYXJlIHBsYWluIHN0cmluZ3M7IHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmIGlzXG4gICAgICAvLyBSQVcgYW5kIHNlcmlhbGl6ZWQgaG9zdC1zaWRlIHRocm91Z2ggYSBoYW5kbGUuXG4gICAgICBjb25zdCBlcnJvck9iaiA9IGguaXNTdHJpbmdcbiAgICAgICAgPyAoaC50b1N0cmluZygpIGFzIHN0cmluZylcbiAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgdXNpbmcgcGxhaW4gPSB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgJyhmdW5jdGlvbihlKXtyZXR1cm4ge21lc3NhZ2U6IGUubWVzc2FnZSwgc3RhY2s6IGUuc3RhY2ssIG5hbWU6IGUubmFtZX07fSkoZ2xvYmFsVGhpcy5fX3dvcmtmbG93RXJyb3IpJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB2bS5kdW1wKHBsYWluKSBhcyB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICAgICAgc3RhY2s/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKCk7XG4gICAgICBsZXQgdmFsdWVCeXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaC5pc1N0cmluZykge1xuICAgICAgICB1c2luZyByYXdWYWx1ZSA9IGguZ2V0UHJvcCgndmFsdWUnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZUJ5dGVzID0gc2VyZGUuc2VyaWFsaXplKHJhd1ZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoc2VyaWFsaXplRXJyKSB7XG4gICAgICAgICAgLy8gQSB0aHJvd24gdmFsdWUgdGhlIGNvZGVjIGNhbm5vdCBzZXJpYWxpemUgbXVzdCBub3QgbWFzayB0aGVcbiAgICAgICAgICAvLyB3b3JrZmxvdyBmYWlsdXJlIGl0c2VsZiDigJQgZmFsbCBiYWNrIHRvIHRoZSBkaXNwbGF5IGZpZWxkcy5cbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gc2VyaWFsaXplIHRocm93biB3b3JrZmxvdyBlcnJvcicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgID8gc2VyaWFsaXplRXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIDogU3RyaW5nKHNlcmlhbGl6ZUVyciksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZmFpbGVkID1cbiAgICAgICAgdHlwZW9mIGVycm9yT2JqID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8geyBtZXNzYWdlOiBlcnJvck9iaiB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yT2JqLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHN0YWNrOiBlcnJvck9iai5zdGFjayB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIG5hbWU6IGVycm9yT2JqLm5hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB2YWx1ZUJ5dGVzLFxuICAgICAgICAgICAgfTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgZmFpbGVkIGluIFZNJywge1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGZhaWxlZC5tZXNzYWdlLFxuICAgICAgICBlcnJvck5hbWU6IGZhaWxlZC5uYW1lLFxuICAgICAgICBlcnJvclN0YWNrOiBmYWlsZWQuc3RhY2ssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRyYWluT3BlcmF0aW9ucyA9IGNvbGxlY3REcmFpbk9wZXJhdGlvbnModm0sIHNlcmRlKTtcbiAgICAgIHZtLmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZhaWxlZDoge1xuICAgICAgICAgIC4uLmZhaWxlZCxcbiAgICAgICAgICAuLi4oZHJhaW5PcGVyYXRpb25zLmxlbmd0aCA+IDAgPyB7IGRyYWluT3BlcmF0aW9ucyB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBzdXNwZW5kZWQg4oCUIHRoZSB3b3JrZmxvdyBpcyBzdXNwZW5kZWQgaWYgdGhlcmUgYXJlIGFjdGl2ZSByZXNvbHZlcnNcbiAgLy8gT1IgcGVuZGluZyBvcGVyYXRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIGNyZWF0ZWQgeWV0IChlLmcuIGhvb2tzIGNyZWF0ZWRcbiAgLy8gdXBmcm9udCBidXQgbm90IHlldCBhd2FpdGVkKVxuICB7XG4gICAgdXNpbmcgaCA9IHZtLmV2YWxDb2RlKFxuICAgICAgJ09iamVjdC5rZXlzKGdsb2JhbFRoaXMuX19yZXNvbHZlcnMpLmxlbmd0aCA+IDAgfHwgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuc29tZShmdW5jdGlvbihwKXtyZXR1cm4hcC5oYXNDcmVhdGVkRXZlbnQ7fSknXG4gICAgKTtcbiAgICBpZiAodm0uZHVtcChoKSkge1xuICAgICAgLy8gT3BzIHdpdGggYW4gYWN0aXZlIHJlc29sdmVyIG9yIHdpdGhvdXQgYSBjcmVhdGVkIGV2ZW50IGFyZVxuICAgICAgLy8gcGVuZGluZzsgYWJvcnQtcmVxdWVzdGVkIGhvb2tzIGFyZSBhbHNvIHN1cmZhY2VkIChldmVuIHdoZW5cbiAgICAgIC8vIGFscmVhZHkgY3JlYXRlZCBhbmQgdW5hd2FpdGVkKSBzbyB0aGUgaG9zdCByZWNvcmRzIHRoZSBhYm9ydC5cbiAgICAgIGNvbnN0IHBlbmRpbmdPcHMgPSBkdW1wUGVuZGluZ09wcyhcbiAgICAgICAgdm0sXG4gICAgICAgIHNlcmRlLFxuICAgICAgICBgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiEhZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1twLmNvcnJlbGF0aW9uSWRdIHx8ICFwLmhhc0NyZWF0ZWRFdmVudCB8fCBwLmFib3J0UmVxdWVzdGVkO30pYCxcbiAgICAgICAgZW5zdXJlUGVuZGluZ0J5dGVDYWNoZSh2bSlcbiAgICAgICk7XG4gICAgICBpZiAoIW9wdHMua2VlcEFsaXZlT25TdXNwZW5kKSB2bS5kaXNwb3NlKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1c3BlbmRlZDoge1xuICAgICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiBwZW5kaW5nT3BzLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB2bS5kaXNwb3NlKCk7XG4gIHJldHVybiB7IGZhaWxlZDogeyBtZXNzYWdlOiAnV29ya2Zsb3cgZW5kZWQgaW4gdW5rbm93biBzdGF0ZScgfSB9O1xufVxuXG4vLyAtLS0tIEhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBleHRyYWN0RXJyb3IoXG4gIHZtOiBRdWlja0pTLFxuICBlcnI6IHVua25vd24sXG4gIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nXG4pOiBRdWlja0pTUnVudGltZVJlc3VsdCB7XG4gIGxldCBtZXNzYWdlID0gZmFsbGJhY2tNZXNzYWdlO1xuICBsZXQgc3RhY2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoZXJyIGluc3RhbmNlb2YgSlNFeGNlcHRpb24pIHtcbiAgICBjb25zdCBlcnJvciA9IHZtLmR1bXAoZXJyLmhhbmRsZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xuICAgIGVyci5oYW5kbGUuZGlzcG9zZSgpO1xuICAgIG1lc3NhZ2UgPSAoZXJyb3I/Lm1lc3NhZ2UgYXMgc3RyaW5nKSA/PyBlcnIubWVzc2FnZSA/PyBmYWxsYmFja01lc3NhZ2U7XG4gICAgc3RhY2sgPSAoZXJyb3I/LnN0YWNrIGFzIHN0cmluZykgPz8gZXJyLnN0YWNrO1xuICAgIG5hbWUgPSAoZXJyb3I/Lm5hbWUgYXMgc3RyaW5nKSA/PyBlcnIubmFtZTtcbiAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnIubWVzc2FnZSA/PyBmYWxsYmFja01lc3NhZ2U7XG4gICAgc3RhY2sgPSBlcnIuc3RhY2s7XG4gICAgbmFtZSA9IGVyci5uYW1lO1xuICB9XG5cbiAgdm0uZGlzcG9zZSgpO1xuICByZXR1cm4ge1xuICAgIGZhaWxlZDogeyBtZXNzYWdlLCBzdGFjaywgbmFtZSB9LFxuICB9O1xufVxuXG4vKipcbiAqIE11dGFibGUgaW50ZXJydXB0IGJ1ZGdldCBmb3IgYSBWTS4gUXVpY2tKUyBwb2xscyB0aGUgaW50ZXJydXB0IGhhbmRsZXJcbiAqIGR1cmluZyBKUyBleGVjdXRpb247IHdoZW4gaXQgcmV0dXJucyB0cnVlLCBleGVjdXRpb24gYWJvcnRzLiBUaGUgYnVkZ2V0XG4gKiBib3VuZHMgYSBzaW5nbGUgaG9zdC0+Vk0gZXhlY3V0aW9uIGJ1cnN0IChidW5kbGUgZXZhbCArIGV2ZW50XG4gKiBwcm9jZXNzaW5nKSwgbm90IHRvdGFsIFZNIGxpZmV0aW1lIOKAlCB0aGUgaW5saW5lLXN0ZXAgbG9vcCBrZWVwcyBhIFZNXG4gKiBhbGl2ZSBhY3Jvc3Mgc3RlcCBleGVjdXRpb25zIHRoYXQgY2FuIGxlZ2l0aW1hdGVseSB0YWtlIG1pbnV0ZXMsIHNvIHRoZVxuICogaG9zdCByZXNldHMgdGhlIGJ1ZGdldCBiZWZvcmUgZWFjaCByZS1lbnRyeSAoc2VlIHJlc2V0QnVkZ2V0IGNhbGxzKS5cbiAqXG4gKiBUaGUgcGVyLWJ1cnN0IGNlaWxpbmcgaXMgdGhlIHNhbWUgY29uZmlndXJhYmxlIGJ1ZGdldCBhcyB0aGUgbm9kZVxuICogZW5naW5lJ3MgUmVwbGF5QnVkZ2V0IChSRVBMQVlfVElNRU9VVF9NUywgZGVmYXVsdCAyNDBzKTogYSB3b3JrZmxvd1xuICogd2hvc2UgcmVwbGF5IHRoZSBub2RlIGVuZ2luZSBoYW5kbGVzIGZpbmUgbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgaGVyZVxuICogYnkgYSBsb3dlciBoYXJkY29kZWQgY2VpbGluZy4gVGhlIGludGVycnVwdCBlcnJvciBlc2NhcGVzXG4gKiBydW5RdWlja0pTV29ya2Zsb3cgYW5kIHJlYWNoZXMgdGhlIHJlcGxheSBsb29wJ3MgY2F0Y2ggaW4gcnVudGltZS50cyxcbiAqIHdoaWNoIHJlY29yZHMgcnVuX2ZhaWxlZC5cbiAqL1xuaW50ZXJmYWNlIEludGVycnVwdEJ1ZGdldCB7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUludGVycnVwdEhhbmRsZXIoYnVkZ2V0OiBJbnRlcnJ1cHRCdWRnZXQpOiAoKSA9PiBib29sZWFuIHtcbiAgY29uc3QgdGltZW91dCA9IGdldFJlcGxheVRpbWVvdXRNcygpO1xuICByZXR1cm4gKCkgPT4gRGF0ZS5ub3coKSAtIGJ1ZGdldC5zdGFydCA+IHRpbWVvdXQ7XG59XG4iXX0=
2421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUVMLGlCQUFpQixHQUlsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFFTCxXQUFXLEVBQ1gsT0FBTyxHQUdSLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZ0NBQWdDLEdBQ2pDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEdBRWhCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNB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O0lBQzlCLElBQUksS0FBeUIsQ0FBQztJQUM5QixJQUFJLElBQXdCLENBQUM7SUFFN0IsSUFBSSxHQUFHLFlBQVksV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFtQyxDQUFDO1FBQ3BFLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxHQUFJLEtBQUssRUFBRSxPQUFrQixJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO1FBQ3ZFLEtBQUssR0FBSSxLQUFLLEVBQUUsS0FBZ0IsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlDLElBQUksR0FBSSxLQUFLLEVBQUUsSUFBZSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQztRQUN6QyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRUQsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2IsT0FBTztRQUNMLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQ2pDLENBQUM7QUFDSixDQUFDO0FBcUJELFNBQVMsc0JBQXNCLENBQUMsTUFBdUI7SUFDckQsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQyxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBRdWlja0pTIFdlYkFzc2VtYmx5IChXQVNNKSB3b3JrZmxvdyBWTS5cbiAqXG4gKiBBbiBhbHRlcm5hdGl2ZSBlbmdpbmUgZm9yIHRoZSBldmVudC1yZXBsYXkgZXhlY3V0aW9uIG1vZGVsOiB0aGUgd29ya2Zsb3dcbiAqIGNvZGUgcnVucyBpbnNpZGUgYSBRdWlja0pTIFdBU00gVk0gKHZpYSBxdWlja2pzLXdhc2kpIGluc3RlYWQgb2YgYVxuICogYG5vZGU6dm1gIGNvbnRleHQuIEV2ZXJ5IGludm9jYXRpb24gY3JlYXRlcyBhIGZyZXNoIFZNLCByZS1leGVjdXRlcyB0aGVcbiAqIHdvcmtmbG93IGZ1bmN0aW9uIGZyb20gdGhlIHRvcCwgYW5kIHJlcGxheXMgdGhlIHJlY29yZGVkIGV2ZW50IGxvZyB0b1xuICogcmVzb2x2ZSBhd2FpdGVkIHByaW1pdGl2ZXM6IHRoZSBzYW1lIHJlcGxheSBzZW1hbnRpY3MgYXMgdGhlIGBub2RlOnZtYFxuICogZW5naW5lLlxuICpcbiAqIFRoZSB3b3JrZmxvdyBwcmltaXRpdmVzICh1c2VTdGVwLCBzbGVlcCwgY3JlYXRlSG9vaykgYXJlIGltcGxlbWVudGVkIGFzXG4gKiBKYXZhU2NyaXB0IGNvZGUgcnVubmluZyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0uIFRoZSBob3N0IGNvbW11bmljYXRlcyB3aXRoXG4gKiB0aGUgVk0gYnkgZXZhbHVhdGluZyBzbWFsbCBKUyBzbmlwcGV0cyB0byByZWFkIHBlbmRpbmcgb3BlcmF0aW9ucyBhbmRcbiAqIHJlc29sdmUvcmVqZWN0IHByb21pc2VzLlxuICpcbiAqIFRoZSBWTSBib290c3RyYXAgaXMgZGVsaWJlcmF0ZWx5IHNwbGl0IGludG8gdHdvIHBoYXNlczpcbiAqICAgMS4gU3RhdGljIGluaXRpYWxpemF0aW9uIChgaW5pdFdvcmtmbG93Vk1gKTogcnVuLWluZGVwZW5kZW50IHNldHVwOlxuICogICAgICBWTSBjcmVhdGlvbiBhbmQgdGhlIHdvcmtmbG93IHByaW1pdGl2ZXMuIChTZXJpYWxpemF0aW9uIGxpdmVzIG9uXG4gKiAgICAgIHRoZSBob3N0IChzZWUgcXVpY2tqcy1zZXJkZS50cykgc28gbm8gc2VyZGUgY29kZSBpcyBldmFsdWF0ZWRcbiAqICAgICAgaW4gdGhlIFZNLilcbiAqICAgMi4gUGVyLXJ1biBpbml0aWFsaXphdGlvbiAoaW5saW5lIGluIGBydW5RdWlja0pTV29ya2Zsb3dgKTogc2VlZGVkXG4gKiAgICAgIFBSTkcvVUxJRCBob3N0IGZ1bmN0aW9ucywgd29ya2Zsb3cgYnVuZGxlIGV2YWx1YXRpb24sIHJ1biBtZXRhZGF0YSxcbiAqICAgICAgd29ya2Zsb3cgaW5wdXQsIGFuZCBzdGFydC5cbiAqIEtlZXBpbmcgdGhlIHBoYXNlcyBzZXBhcmF0ZSBpcyBncm91bmR3b3JrIGZvciBWTS1tZW1vcnkgc25hcHNob3R0aW5nOlxuICogYSBmb2xsb3ctdXAgY2FuIHBlcnNpc3QvcmVzdG9yZSB0aGUgVk0gYXQgdGhlIHBoYXNlIGJvdW5kYXJ5IChlLmcuIGFcbiAqIGJ1aWxkLXRpbWUgaW5pdGlhbCBzbmFwc2hvdCkgd2l0aG91dCByZXN0cnVjdHVyaW5nIHRoaXMgbW9kdWxlLiBOb3RlXG4gKiB0aGF0IGJ1bmRsZSBldmFsdWF0aW9uIGN1cnJlbnRseSBzaXRzIGluIHRoZSBwZXItcnVuIHBoYXNlIHNvIHRoYXRcbiAqIG1vZHVsZS1zY29wZSB1c2VyIGNvZGUgb2JzZXJ2ZXMgdGhlIHNlZWRlZCBgTWF0aC5yYW5kb21gLCBtYXRjaGluZyB0aGVcbiAqIGBub2RlOnZtYCBlbmdpbmUncyByZXBsYXkgZGV0ZXJtaW5pc20uXG4gKi9cblxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24gfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgaXNTZWFsZWROb29wRXZlbnQsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGRDYXBhYmlsaXRpZXMsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgKiBhcyBuYW5vaWQgZnJvbSAnbmFub2lkJztcbmltcG9ydCB7XG4gIHR5cGUgRXh0ZW5zaW9uRGVzY3JpcHRvcixcbiAgSlNFeGNlcHRpb24sXG4gIFF1aWNrSlMsXG4gIHR5cGUgU25hcHNob3QsXG4gIHR5cGUgV2FzaU9wdGlvbnMsXG59IGZyb20gJ3F1aWNranMtd2FzaSc7XG5pbXBvcnQgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZGVjb21wcmVzcyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vY29tcHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgeyBEZWNyeXB0aW9uS2V5IH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IGRlY3J5cHQgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lcnJvcnMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0UmVwbGF5VGltZW91dE1zLFxuICBpc1F1aWNrSlNCYXNlbGluZVNuYXBzaG90RW5hYmxlZCxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgcXVpY2tqc0V4dGVuc2lvbnMsIHF1aWNranNXYXNtIH0gZnJvbSAnLi9xdWlja2pzLWFzc2V0cy5nZW5lcmF0ZWQuanMnO1xuaW1wb3J0IHtcbiAgYWRvcHRTZXJkZVJvb3QsXG4gIGNhcHR1cmVTZXJkZVJvb3QsXG4gIGNyZWF0ZVF1aWNrSlNTZXJkZSxcbiAgZXhwb3J0U2VyZGVSb290LFxuICB0eXBlIFF1aWNrSlNTZXJkZSxcbn0gZnJvbSAnLi9xdWlja2pzLXNlcmRlLmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW4taWQtdGltZS5qcyc7XG5cbi8vIC0tLS0gSG9zdCAtPiBWTSBwYXlsb2FkIHByZXBhcmF0aW9uIC0tLS1cblxuLyoqXG4gKiBQcmVwYXJlIHBlcnNpc3RlZCBwYXlsb2FkIGJ5dGVzIGZvciBjb25zdW1wdGlvbiBpbnNpZGUgdGhlIFZNOiBkZWNyeXB0XG4gKiAod2hlbiBhbiBlbmNyeXB0aW9uIGtleSBpcyBjb25maWd1cmVkKSBhbmQgZGVjb21wcmVzcyAoc3BlY1ZlcnNpb24gPj0gNVxuICogcGF5bG9hZHMgbWF5IGJlIGd6aXAvenN0ZC1jb21wcmVzc2VkKS4gVGhlIFZNIG9ubHkgdW5kZXJzdGFuZHMgcGxhaW5cbiAqIGZvcm1hdC1wcmVmaXhlZCAnZGV2bCcgYnl0ZXM6IGl0IGhhcyBuZWl0aGVyIHRoZSBrZXkgbWF0ZXJpYWwgbm9yIHpsaWIuXG4gKiBUaGUga2V5IGlzIHRoZSBydW4ncyBmdWxsIERlY3J5cHRpb25LZXkgY2FwYWJpbGl0eSAoc3ltbWV0cmljIEFFUyBrZXkgK1xuICogWDI1NTE5IGtleXBhaXIpIHNvIHNlYWxlZCBgZW5jcGAgaG9vayBwYXlsb2FkcyBmcm9tIGNyb3NzLWRlcGxveW1lbnRcbiAqIHJlc3VtZUhvb2soKSBjYWxscyBvcGVuIGhlcmUgdG9vLCBub3QganVzdCBzeW1tZXRyaWMgYGVuY3JgIG9uZXMuXG4gKiBCb3RoIHN0YWdlcyBhcmUgZm9ybWF0LXByZWZpeCBkaXNwYXRjaGVkLCBzbyBwbGFpbnRleHQvdW5jb21wcmVzc2VkXG4gKiBkYXRhIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZC4gTWlycm9ycyBgcHJlcGFyZVJlcGxheVBheWxvYWRgIGluXG4gKiBzZXJpYWxpemF0aW9uLnRzICh0aGUgbm9kZTp2bSBlbmdpbmUncyBlcXVpdmFsZW50IGhvc3Qtc2lkZSBzdGFnZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVCeXRlc0ZvclZNKFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBrZXk/OiBEZWNyeXB0aW9uS2V5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBkZWNvbXByZXNzKGF3YWl0IGRlY3J5cHQoZGF0YSwga2V5KSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8vIC0tLS0gVHlwZXMgLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRpbmdTdGVwIHtcbiAgdHlwZTogJ3N0ZXAnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHN0ZXBJZDogc3RyaW5nO1xuICAvKipcbiAgICogRm9ybWF0LXByZWZpeGVkIGRldmFsdWUtc2VyaWFsaXplZCBzdGVwIGlucHV0IChhcmdzICsgY2xvc3VyZVZhcnMpLlxuICAgKiBBYnNlbnQgd2hlbiB7QGxpbmsgc2VyaWFsaXphdGlvbkVycm9yfSBpcyBzZXQ6IHRoZSBpbnB1dCBpcyBwcmVjaXNlbHlcbiAgICogd2hhdCByZWZ1c2VkIHRvIHNlcmlhbGl6ZS5cbiAgICovXG4gIGlucHV0PzogVWludDhBcnJheTtcbiAgLyoqIFdoZXRoZXIgYSBzdGVwX2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgc3RlcCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXQgd2hlbiBob3N0LXNpZGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgc3RlcCdzIHJhdyBpbnB1dCBmYWlsZWQgd2hpbGVcbiAgICogZHVtcGluZyB0aGUgVk0ncyBwZW5kaW5nIG9wcyAoc2VlIGBkdW1wUGVuZGluZ09wc2ApLiBUaGUgZmFpbHVyZSBpc1xuICAgKiBkZXRlcm1pbmlzdGljIChyZXBsYXlpbmcgcmUtZGVyaXZlcyB0aGUgc2FtZSB1bnNlcmlhbGl6YWJsZSB2YWx1ZSksIHNvXG4gICAqIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgd2hvbGUgY29sbGVjdGlvbiB0aGUgb3AgaXMgc3VyZmFjZWQgd2l0aCB0aGVcbiAgICogcmVmcmFtZWQgZXJyb3IgYW5kIG5vIGBpbnB1dGA7IHRoZSBlbnRyeXBvaW50IGZpbmFsaXplcyB0aGUgc3RlcCBhc1xuICAgKiBgc3RlcF9jcmVhdGVkYCAocGxhY2Vob2xkZXIgaW5wdXQpICsgYHN0ZXBfZmFpbGVkYCwgbWlycm9yaW5nIHRoZVxuICAgKiBub2RlOnZtIGVuZ2luZSdzIGBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcGAsIHNvIGEgdHJ5L2NhdGNoIGFyb3VuZFxuICAgKiB0aGUgc3RlcCBjYWxsIG9ic2VydmVzIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IuXG4gICAqL1xuICBzZXJpYWxpemF0aW9uRXJyb3I/OiBTZXJpYWxpemF0aW9uRXJyb3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1dhaXQge1xuICB0eXBlOiAnd2FpdCc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgLyoqIElTTyBzdHJpbmcgb2Ygd2hlbiB0byByZXN1bWUgKi9cbiAgcmVzdW1lQXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgYSB3YWl0X2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgd2FpdCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0hvb2sge1xuICB0eXBlOiAnaG9vayc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIEVhcmxpZXN0IHRva2VuIHJldXNlIHRpbWUsIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaC4gKi9cbiAgdG9rZW5SZXRlbnRpb25VbnRpbD86IG51bWJlcjtcbiAgaXNXZWJob29rOiBib29sZWFuO1xuICBtZXRhZGF0YT86IHVua25vd247XG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGludGVybmFsIHN5c3RlbSBob29rcyAoZS5nLiBBYm9ydENvbnRyb2xsZXIncyBob29rKSwgd2hpY2hcbiAgICogYXJlIGV4ZW1wdCBmcm9tIHVzZXItaG9vayB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgKi9cbiAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IHdoZW4gdGhlIHdvcmtmbG93IGNhbGxlZCBBYm9ydENvbnRyb2xsZXIuYWJvcnQoKSBkdXJpbmcgdGhpc1xuICAgKiBpbnZvY2F0aW9uLiBUaGUgaG9zdCBtdXN0IHJlY29yZCB0aGUgYWJvcnQ6IGNyZWF0ZSBhIGhvb2tfcmVjZWl2ZWRcbiAgICogZXZlbnQgY2FycnlpbmcgYGFib3J0UGF5bG9hZGAgYW5kIHdyaXRlL2Nsb3NlIHRoZSBhYm9ydCBzdHJlYW0uXG4gICAqL1xuICBhYm9ydFJlcXVlc3RlZD86IGJvb2xlYW47XG4gIC8qKiBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkIGZvciB0aGUgYWJvcnQuICovXG4gIGFib3J0UGF5bG9hZD86IFVpbnQ4QXJyYXk7XG4gIC8qKiBTZXQgYnkgdGhlIGNvbXBsZXRpb24gZHJhaW4gd2hlbiBhIHN5c3RlbSBob29rIGlzIGltcGxpY2l0bHkgZGlzcG9zZWQuICovXG4gIGRpc3Bvc2VkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGUgd29ya2Zsb3cgaXMgYXdhaXRpbmcgaG9vay5nZXRDb25mbGljdCgpIGZvciB0aGlzIGhvb2suXG4gICAqIFRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0IGFmdGVyIHdyaXRpbmdcbiAgICogaG9va19jcmVhdGVkIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgICovXG4gIGhhc0dldENvbmZsaWN0QXdhaXRlcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0F0dHJpYnV0ZSB7XG4gIHR5cGU6ICdhdHRyaWJ1dGUnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIC8qKiBOb3JtYWxpemVkIGF0dHJpYnV0ZSBjaGFuZ2VzIChwbGFpbiBKU09OLWFibGUgb2JqZWN0cykgKi9cbiAgY2hhbmdlczogdW5rbm93bltdO1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGFuIGF0dHJfc2V0IGV2ZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHdyaXRlICovXG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nSG9va0Rpc3Bvc2Uge1xuICB0eXBlOiAnaG9va19kaXNwb3NlJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAvKipcbiAgICogVG9rZW4gb2YgdGhlIGhvb2sgYmVpbmcgZGlzcG9zZWQuIFVzZWQgYnkgdGhlIGVudHJ5cG9pbnQgdG8gb3JkZXJcbiAgICogc2FtZS10b2tlbiBob29rIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IGluIGNvZGUgb3JkZXIuXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcbiAgaGFzQ3JlYXRlZEV2ZW50OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBQZW5kaW5nT3BlcmF0aW9uID1cbiAgfCBQZW5kaW5nU3RlcFxuICB8IFBlbmRpbmdXYWl0XG4gIHwgUGVuZGluZ0hvb2tcbiAgfCBQZW5kaW5nQXR0cmlidXRlXG4gIHwgUGVuZGluZ0hvb2tEaXNwb3NlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNSdW50aW1lUmVzdWx0IHtcbiAgLyoqIFRoZSB3b3JrZmxvdyBjb21wbGV0ZWQ6IHJlc3VsdCBpcyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlcyAqL1xuICBjb21wbGV0ZWQ/OiB7XG4gICAgcmVzdWx0OiBVaW50OEFycmF5O1xuICAgIC8qKlxuICAgICAqIExlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IHN0aWxsIG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgYXRcbiAgICAgKiBjb21wbGV0aW9uOiBhYm9ydCByZWNvcmRpbmdzLCBzeXN0ZW0taG9vayBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldFxuICAgICAqIGF0dHJpYnV0ZS9ob29rL3N0ZXAgZXZlbnRzLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcy4gVGhlIGVudHJ5cG9pbnQgZGlzcGF0Y2hlcyB0aGVzZSBXSVRIT1VUXG4gICAgICogcXVldWVpbmcgc3RlcHMgb3IgcmVxdWV1aW5nIHRoZSBydW4uXG4gICAgICovXG4gICAgZHJhaW5PcGVyYXRpb25zPzogUGVuZGluZ09wZXJhdGlvbltdO1xuICB9O1xuICAvKiogVGhlIHdvcmtmbG93IHN1c3BlbmRlZCB3aXRoIHBlbmRpbmcgb3BlcmF0aW9ucyAqL1xuICBzdXNwZW5kZWQ/OiB7XG4gICAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgfTtcbiAgLyoqIFRoZSB3b3JrZmxvdyBmYWlsZWQgKi9cbiAgZmFpbGVkPzoge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBTZWUgY29tcGxldGVkLmRyYWluT3BlcmF0aW9uczogc2FtZSBzZW1hbnRpY3Mgb24gZmFpbHVyZS4gKi9cbiAgICBkcmFpbk9wZXJhdGlvbnM/OiBQZW5kaW5nT3BlcmF0aW9uW107XG4gICAgLyoqXG4gICAgICogRm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZVxuICAgICAqIChFcnJvciBzdWJjbGFzcyB3aXRoIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikuXG4gICAgICogU2V0IHdoZW4gdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXIgc3VjY2Vzc2Z1bGx5IHNlcmlhbGl6ZXNcbiAgICAgKiB0aGUgdGhyb3duIHZhbHVlLiBUaGUgaG9zdCB1c2VzIHRoZXNlIGJ5dGVzIHRvIHJlY29uc3RydWN0IHRoZVxuICAgICAqIG9yaWdpbmFsIHZhbHVlIHRocm91Z2ggdGhlIHN0YW5kYXJkIGVycm9yIGh5ZHJhdGlvbiBwaXBlbGluZSxcbiAgICAgKiBwcmVzZXJ2aW5nIHR5cGUgaWRlbnRpdHkgKFR5cGVFcnJvciwgRmF0YWxFcnJvcikgYW5kIG5vbi1FcnJvclxuICAgICAqIHRocm93cyB2ZXJiYXRpbS4gRmFsbHMgYmFjayB0byB0aGUgbWVzc2FnZS9zdGFjay9uYW1lIGZpZWxkc1xuICAgICAqIHdoZW4gdGhpcyBpcyB1bmRlZmluZWQgKGUuZy4gZXh0cmFjdEVycm9yIHBzZXVkby1mYWlsdXJlcykuXG4gICAgICovXG4gICAgdmFsdWVCeXRlcz86IFVpbnQ4QXJyYXk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVpY2tKU1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqIFRoZSBjb21waWxlZCB3b3JrZmxvdyBidW5kbGUgY29kZSAod29ya2Zsb3cgbW9kZSBvdXRwdXQgZnJvbSBTV0MpICovXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IElEIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIikgKi9cbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IHJ1biBlbnRpdHkgKi9cbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICAvKiogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gKi9cbiAgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllcztcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gRXZlcnkgaW52b2NhdGlvbiByZXBsYXlzIHRoZSBjb21wbGV0ZVxuICAgKiBsb2cgZnJvbSB0aGUgc3RhcnQgKHNhbWUgcmVwbGF5IHNlbWFudGljcyBhcyB0aGUgYG5vZGU6dm1gIGVuZ2luZSkuXG4gICAqL1xuICBldmVudHM6IEV2ZW50W107XG4gIC8qKiBFbmNyeXB0aW9uIGtleSBmb3IgZGVjcnlwdGluZyBldmVudCBwYXlsb2FkcyAodW5kZWZpbmVkIGlmIHVuZW5jcnlwdGVkKSAqL1xuICBlbmNyeXB0aW9uS2V5PzogRGVjcnlwdGlvbktleTtcbiAgLyoqXG4gICAqIFRoZSBsb2NhbCBwb3J0IHRoZSB3b3JrZmxvdyBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLCB1c2VkIHRvIHBvcHVsYXRlXG4gICAqIGB3b3JrZmxvd01ldGFkYXRhLnVybGAuIFJlc29sdmVkIGF0IGNhbGwgdGltZSBvbiB0aGUgaG9zdCBzaWRlIHNvIHRoZVxuICAgKiBWTSBkb2Vzbid0IGhhdmUgdG8gcHJvYmUgdGhlIGZpbGVzeXN0ZW0uIElnbm9yZWQgb24gVmVyY2VsLCB3aGVyZVxuICAgKiBWRVJDRUxfVVJMIHRha2VzIHByZWNlZGVuY2UuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKipcbiAgICogRmFsbGJhY2sgd29ya2Zsb3cgaW5wdXQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSdzIHJlc2lsaWVudC1zdGFydFxuICAgKiBwYXlsb2FkLiBVc2VkIHdoZW4gdGhlIGZldGNoZWQgZXZlbnQgbG9nIGxhY2tzIGEgYHJ1bl9jcmVhdGVkYCBldmVudFxuICAgKiAoZXZlbnR1YWxseS1jb25zaXN0ZW50IHJlYWQgYWZ0ZXIgdGhlIHBhcmVudCdzIHN0YXJ0KCkgd3JvdGUgaXQpLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbn1cblxuLy8gLS0tLSBWTSBCb290c3RyYXAgQ29kZSAtLS0tXG5cbi8qKlxuICogSmF2YVNjcmlwdCBjb2RlIHRoYXQgcnVucyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0gdG8gc2V0IHVwIHRoZSB3b3JrZmxvd1xuICogcHJpbWl0aXZlcy4gVGhpcyBzZXRzIHVwOlxuICogLSBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MgKE1hcCkgLSB3b3JrZmxvdyByZWdpc3RyeVxuICogLSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzIChPYmplY3QpIC0gcGVuZGluZyBwcm9taXNlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9uc1xuICogLSBnbG9iYWxUaGlzLl9fcGVuZGluZyAoQXJyYXkpIC0gbWV0YWRhdGEgYWJvdXQgcGVuZGluZyBvcGVyYXRpb25zXG4gKiAtIGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXSAtIHN0ZXAgcHJveHkgZmFjdG9yeVxuICogLSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TTEVFUFwiKV0gLSBzbGVlcCBmdW5jdGlvblxuICovXG5jb25zdCBWTV9CT09UU1RSQVAgPSBgXG4vLyBTeW1ib2wuZGlzcG9zZSAvIFN5bWJvbC5hc3luY0Rpc3Bvc2UgcG9seWZpbGxzIGZvciBRdWlja0pTXG5pZiAodHlwZW9mIFN5bWJvbC5kaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5kaXNwb3NlID0gU3ltYm9sLmZvcihcIlN5bWJvbC5kaXNwb3NlXCIpO1xufVxuaWYgKHR5cGVvZiBTeW1ib2wuYXN5bmNEaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5hc3luY0Rpc3Bvc2UgPSBTeW1ib2wuZm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZVwiKTtcbn1cblxuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzID0gbmV3IE1hcCgpO1xuZ2xvYmFsVGhpcy5fX3Jlc29sdmVycyA9IHt9O1xuZ2xvYmFsVGhpcy5fX3BlbmRpbmcgPSBbXTtcbmdsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCA9IHVuZGVmaW5lZDtcbmdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yID0gdW5kZWZpbmVkO1xuLy8gQnVmZmVyIGZvciBob29rX3JlY2VpdmVkIHBheWxvYWRzIHRoYXQgYXJyaXZlIGJlZm9yZSB0aGUgaG9vayBpcyBhd2FpdGVkLlxuLy8gS2V5ZWQgYnkgY29ycmVsYXRpb25JZCDihpIgYXJyYXkgb2YgcGF5bG9hZHMgKHByZXNlcnZlcyBkZWxpdmVyeSBvcmRlcikuXG4vLyBUaGlzIG1pcnJvcnMgdGhlIGV2ZW50LXJlcGxheSBydW50aW1lJ3MgcGF5bG9hZHNRdWV1ZSBpbiBob29rLnRzLlxuZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyID0ge307XG5cbi8vIEJ1ZmZlciBmb3Igc3RlcC93YWl0L2F0dHIgdGVybWluYWwgb3V0Y29tZXMgdGhhdCBhcnJpdmUgYmVmb3JlIHRoaXMgVk1cbi8vIGhhcyBjb25zdHJ1Y3RlZCB0aGUgY29ycmVzcG9uZGluZyBhd2FpdGluZyBwcm9taXNlLiBJbiBmcmVzaC1WTSByZXBsYXlcbi8vIHRoZSBtdWx0aS1wYXNzIGV2ZW50IHNjYW4gbWFrZXMgdGhpcyB1bnJlYWNoYWJsZSAoYXdhaXRzIGFyZVxuLy8gcmVjb25zdHJ1Y3RlZCBiZWZvcmUgdGhlaXIgdGVybWluYWxzIGFyZSByZS1zY2FubmVkKSwgYnV0IHRoZSBsaXZlXG4vLyBjb250aW51YXRpb24gcGF0aCAoY29udGludWVXaXRoRXZlbnRzKSBzY2FucyBlYWNoIGRlbHRhIGV4YWN0bHkgb25jZSDigJRcbi8vIGEgY29uY3VycmVudCBpbnZvY2F0aW9uJ3MgdGVybWluYWwgYXJyaXZpbmcgYmVmb3JlIHRoaXMgVk0gcmVhY2hlcyB0aGVcbi8vIGF3YWl0IHdvdWxkIG90aGVyd2lzZSBiZSBkcm9wcGVkIG9uIHRoZSBmbG9vciBhbmQgdGhlIGF3YWl0IHdvdWxkXG4vLyBuZXZlciBzZXR0bGUgKHRoZSBmZWVkJ3Mgc2Vlbi1zZXQgbWVhbnMgaXQgaXMgbmV2ZXIgcmUtZGVsaXZlcmVkKS5cbi8vIE1pcnJvcnMgX19ob29rUGF5bG9hZEJ1ZmZlciwgd2hpY2ggZXhpc3RzIGZvciBleGFjdGx5IHRoaXMgcmVhc29uIG9uXG4vLyB0aGUgaG9vayBwYXRoLiBLZXllZCBieSBjb3JyZWxhdGlvbklkIOKGkiBzaW5nbGUgdGVybWluYWwgKHN0ZXBzLCB3YWl0c1xuLy8gYW5kIGF0dHJzIHNldHRsZSBleGFjdGx5IG9uY2UpLlxuZ2xvYmFsVGhpcy5fX3Rlcm1pbmFsQnVmZmVyID0ge307XG5cbi8vIFJlZ2lzdGVycyBhIHJlc29sdmVyIGZvciBhbiBhd2FpdGVkIHByaW1pdGl2ZSwgZmlyc3QgZHJhaW5pbmcgYW55XG4vLyBidWZmZXJlZCB0ZXJtaW5hbCByZWNvcmRlZCBmb3IgdGhlIGNvcnJlbGF0aW9uSWQuIEVudHJpZXMgYXJlIHByZXBhcmVkXG4vLyBob3N0LXNpZGU6IGJ5dGVzIGFyZSBkZWNyeXB0ZWQgQU5EIGRlc2VyaWFsaXplZCBpbnRvIFZNIHZhbHVlcyBieSB0aGVcbi8vIGhvc3Qgc2VyZGUgYmVmb3JlIGJ1ZmZlcmluZyAodGhlIFZNIGhhcyBubyBpbi1ndWVzdCBkZXNlcmlhbGl6ZXIgb25cbi8vIHRoZSBob3N0LXNlcmRlIGVuZ2luZSksIHNvIGRyYWluaW5nIG9ubHkgZm9yd2FyZHMgdGhlIHN0b3JlZCB2YWx1ZS5cbmdsb2JhbFRoaXMuX19yZWdpc3RlclJlc29sdmVyID0gZnVuY3Rpb24oY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHZhciBidWZmZXJlZCA9IGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgaWYgKGJ1ZmZlcmVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZXNvbHZlX3ZhbHVlXCIpIHtcbiAgICAgIHJlc29sdmUoYnVmZmVyZWQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZWplY3RfdmFsdWVcIikge1xuICAgICAgcmVqZWN0KGJ1ZmZlcmVkLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGJ1ZmZlcmVkLmtpbmQgPT09IFwicmVqZWN0X2Vycm9yXCIpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKGJ1ZmZlcmVkLm1lc3NhZ2UpO1xuICAgICAgZS5uYW1lID0gXCJGYXRhbEVycm9yXCI7XG4gICAgICBlLmZhdGFsID0gdHJ1ZTtcbiAgICAgIGlmIChidWZmZXJlZC5zdGFjaykgZS5zdGFjayA9IGJ1ZmZlcmVkLnN0YWNrO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NvcnJlbGF0aW9uSWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xufTtcblxuLy8gU3R1YnMgZm9yIFdlYiBBUElzIHRoYXQgdGhlIHdvcmtmbG93IGJ1bmRsZSBtYXkgcmVmZXJlbmNlIGJ1dCBhcmUgbm90XG4vLyBhdmFpbGFibGUgaW4gUXVpY2tKUy4gTmF0aXZlIEMgZXh0ZW5zaW9ucyAoZW5jb2RpbmcsIGhlYWRlcnMsIHVybCxcbi8vIHN0cnVjdHVyZWQtY2xvbmUpIHByb3ZpZGUgdGhlIHJlYWwgaW1wbGVtZW50YXRpb25zOyB0aGVzZSBhcmUgbWluaW1hbFxuLy8gc3R1YnMgZm9yIEFQSXMgdGhhdCBkb24ndCBoYXZlIG5hdGl2ZSBleHRlbnNpb25zIHlldC4gKGJ0b2EvYXRvYiBhbmRcbi8vIHRoZSBVaW50OEFycmF5IGJhc2U2NC9oZXggbWV0aG9kcyBhcmUgYnVpbHQgaW50byBxdWlja2pzLXdhc2kgPj0gMy4pXG5cbmlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gTWluaW1hbCBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyBib2R5IGRhdGEgZm9yIFJlc3BvbnNlLmpzb24oKS90ZXh0KClcbiAgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG4gIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLl9fYm9keURhdGEgPSBudWxsO1xufVxuXG5pZiAodHlwZW9mIFdyaXRhYmxlU3RyZWFtID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBmdW5jdGlvbigpIHt9O1xufVxuXG5pZiAodHlwZW9mIFRyYW5zZm9ybVN0cmVhbSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG59XG5cbmlmICh0eXBlb2YgY29uc29sZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLmNvbnNvbGUgPSB7IGxvZzogZnVuY3Rpb24oKXt9LCBlcnJvcjogZnVuY3Rpb24oKXt9LCB3YXJuOiBmdW5jdGlvbigpe30sIGluZm86IGZ1bmN0aW9uKCl7fSB9O1xufVxuLy8gU3R1YiBleHBvcnRzL21vZHVsZSBmb3IgQ0pTIGJ1bmRsZSBmb3JtYXRcbmdsb2JhbFRoaXMuZXhwb3J0cyA9IHt9O1xuZ2xvYmFsVGhpcy5tb2R1bGUgPSB7IGV4cG9ydHM6IGdsb2JhbFRoaXMuZXhwb3J0cyB9O1xuLy8gTk9URTogVGV4dEVuY29kZXIvVGV4dERlY29kZXIgYXJlIHByb3ZpZGVkIGJ5IHRoZSBuYXRpdmUgZW5jb2RpbmcgZXh0ZW5zaW9uLlxuXG4vLyAtLS0tIERldGVybWluaXN0aWMgXFxgY3J5cHRvXFxgIChwYXJpdHkgd2l0aCB0aGUgbm9kZTp2bSBlbmdpbmUpIC0tLS1cbi8vIGdldFJhbmRvbVZhbHVlcyAvIHJhbmRvbVVVSUQgZHJhdyBmcm9tIE1hdGgucmFuZG9tLCB3aGljaCB0aGUgaG9zdFxuLy8gcmVwbGFjZXMgd2l0aCB0aGUgcnVuJ3Mgc2VlZGVkIFBSTkcgYmVmb3JlIGFueSB1c2VyIGNvZGUgcnVucyDigJQgc28gdGhlXG4vLyB2YWx1ZXMgcmVwbGF5IGRldGVybWluaXN0aWNhbGx5IGFuZCBtYXRjaCB0aGUgbm9kZSBlbmdpbmUsIHdob3NlXG4vLyBpbXBsZW1lbnRhdGlvbnMgZHJhdyBmcm9tIHRoZSBzYW1lIHNlZWRlZCBzZXF1ZW5jZSAoc2VlIHZtL2luZGV4LnRzKS5cbi8vIEV2ZXJ5IGNyeXB0by5zdWJ0bGUgbWV0aG9kIHRocm93cyB3aXRoIHRoZSBzYW1lIGd1aWRhbmNlIGFzIHRoZSBub2RlXG4vLyBlbmdpbmUncyBub24tcmVwbGF5YWJsZSBtZXRob2RzOyB1bmxpa2Ugbm9kZSwgXFxgZGlnZXN0XFxgIGlzIGFsc29cbi8vIHVuYXZhaWxhYmxlIGhlcmUgKG5vIG5hdGl2ZSBoYXNoIGluIHRoZSBWTSB5ZXQpLlxuKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBnZXRSYW5kb21WYWx1ZXMoYXJyYXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICAvLyBNaXJyb3JzIHZtL3V1aWQudHMgY3JlYXRlUmFuZG9tVVVJRDogaWRlbnRpY2FsIGRyYXcgcGF0dGVybiBmcm9tIHRoZVxuICAvLyBzZWVkZWQgUFJORywgc28gYm90aCBlbmdpbmVzIHByb2R1Y2UgdGhlIHNhbWUgVVVJRCBhdCB0aGUgc2FtZSBwb2ludFxuICAvLyBpbiBhIHJlcGxheS5cbiAgZnVuY3Rpb24gcmFuZG9tVVVJRCgpIHtcbiAgICB2YXIgY2hhcnMgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgICB2YXIgdXVpZCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzNjsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gOCB8fCBpID09PSAxMyB8fCBpID09PSAxOCB8fCBpID09PSAyMykge1xuICAgICAgICB1dWlkICs9IFwiLVwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxNCkge1xuICAgICAgICB1dWlkICs9IFwiNFwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxOSkge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpICsgOF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1dWlkO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnRsZVRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgY3J5cHRvLnN1YnRsZS5cIiArIG5hbWUgKyBcIigpXFxgIGlzIG5vdCBhdmFpbGFibGUgaW5zaWRlIGEgd29ya2Zsb3cgZnVuY3Rpb24uIE1vdmUgaXQgdG8gYSBzdGVwIGZ1bmN0aW9uIHdoZXJlIGZ1bGwgTm9kZS5qcyBjcnlwdG8gaXMgYXZhaWxhYmxlLlwiKTtcbiAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH07XG4gIH1cbiAgdmFyIHN1YnRsZSA9IHt9O1xuICBbXCJlbmNyeXB0XCIsXCJkZWNyeXB0XCIsXCJzaWduXCIsXCJ2ZXJpZnlcIixcImRpZ2VzdFwiLFwiZ2VuZXJhdGVLZXlcIixcImRlcml2ZUtleVwiLFwiZGVyaXZlQml0c1wiLFwiaW1wb3J0S2V5XCIsXCJleHBvcnRLZXlcIixcIndyYXBLZXlcIixcInVud3JhcEtleVwiXS5mb3JFYWNoKGZ1bmN0aW9uKG0pIHtcbiAgICBzdWJ0bGVbbV0gPSBzdWJ0bGVUaHJvdyhtKTtcbiAgfSk7XG4gIGdsb2JhbFRoaXMuY3J5cHRvID0ge1xuICAgIGdldFJhbmRvbVZhbHVlczogZ2V0UmFuZG9tVmFsdWVzLFxuICAgIHJhbmRvbVVVSUQ6IHJhbmRvbVVVSUQsXG4gICAgc3VidGxlOiBzdWJ0bGUsXG4gIH07XG59KSgpO1xuXG4vLyAtLS0tIExvdWQgSW50bCAvIGxvY2FsZSBndWFyZHMgLS0tLVxuLy8gUXVpY2tKUyBoYXMgbm8gSUNVOiBcXGBJbnRsXFxgIGlzIGFic2VudCBhbmQgdG9Mb2NhbGVTdHJpbmctZmFtaWx5IG1ldGhvZHNcbi8vIHNpbGVudGx5IGlnbm9yZSB0aGVpciBsb2NhbGUgYXJndW1lbnQuIFNpbGVudCBkaXZlcmdlbmNlIGZyb20gdGhlIG5vZGVcbi8vIGVuZ2luZSB3b3VsZCB3cml0ZSBkaWZmZXJlbnQgdmFsdWVzIGludG8gYSBkdXJhYmxlIGV2ZW50IGxvZyB3aXRoIG5vXG4vLyBlcnJvciBhbnl3aGVyZSDigJQgc28gbWFrZSB0aGUgZ2FwIGxvdWQgaW5zdGVhZDogSW50bCBjb25zdHJ1Y3RvcnMgdGhyb3csXG4vLyBhbmQgdG9Mb2NhbGUqIG1ldGhvZHMgdGhyb3cgT05MWSB3aGVuIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZVxuLy8gKHRoZSBuby1hcmd1bWVudCBmb3JtcyBrZWVwIFF1aWNrSlMncyBkZWZhdWx0IGJlaGF2aW9yKS5cbihmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gaW50bFRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgSW50bC5cIiArIG5hbWUgKyBcIlxcYCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKS4gUGVyZm9ybSBsb2NhbGUtc2Vuc2l0aXZlIGZvcm1hdHRpbmcgaW4gYSBzdGVwIGZ1bmN0aW9uLCBvciB1c2UgV09SS0ZMT1dfVk09bm9kZS5cIik7XG4gICAgICBlcnIubmFtZSA9IFwiV29ya2Zsb3dSdW50aW1lRXJyb3JcIjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgSW50bCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBpbnRsID0ge307XG4gICAgW1wiQ29sbGF0b3JcIixcIkRhdGVUaW1lRm9ybWF0XCIsXCJEaXNwbGF5TmFtZXNcIixcIkR1cmF0aW9uRm9ybWF0XCIsXCJMaXN0Rm9ybWF0XCIsXCJMb2NhbGVcIixcIk51bWJlckZvcm1hdFwiLFwiUGx1cmFsUnVsZXNcIixcIlJlbGF0aXZlVGltZUZvcm1hdFwiLFwiU2VnbWVudGVyXCJdLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgaW50bFtuXSA9IGludGxUaHJvdyhuKTtcbiAgICB9KTtcbiAgICBpbnRsLmdldENhbm9uaWNhbExvY2FsZXMgPSBpbnRsVGhyb3coXCJnZXRDYW5vbmljYWxMb2NhbGVzXCIpO1xuICAgIGdsb2JhbFRoaXMuSW50bCA9IGludGw7XG4gIH1cbiAgZnVuY3Rpb24gZ3VhcmRMb2NhbGUocHJvdG8sIG1ldGhvZCkge1xuICAgIHZhciBvcmlnaW5hbCA9IHByb3RvW21ldGhvZF07XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgcHJvdG9bbWV0aG9kXSA9IGZ1bmN0aW9uKGxvY2FsZXMpIHtcbiAgICAgIGlmIChsb2NhbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlxcYFwiICsgbWV0aG9kICsgXCIobG9jYWxlcywgLi4uKVxcYCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKSDigJQgaXQgd291bGQgc2lsZW50bHkgaWdub3JlIHRoZSBsb2NhbGUuIEZvcm1hdCBpbiBhIHN0ZXAgZnVuY3Rpb24sIG9yIGNhbGwgd2l0aG91dCBhcmd1bWVudHMgZm9yIHRoZSBlbmdpbmUgZGVmYXVsdC5cIik7XG4gICAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9XG4gIGd1YXJkTG9jYWxlKE51bWJlci5wcm90b3R5cGUsIFwidG9Mb2NhbGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlU3RyaW5nXCIpO1xuICBndWFyZExvY2FsZShEYXRlLnByb3RvdHlwZSwgXCJ0b0xvY2FsZURhdGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlVGltZVN0cmluZ1wiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZUxvd2VyQ2FzZVwiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZVVwcGVyQ2FzZVwiKTtcbiAgLy8gbG9jYWxlQ29tcGFyZSdzIGxvY2FsZXMgYXJndW1lbnQgaXMgdGhlIFNFQ09ORCBwYXJhbWV0ZXIuXG4gIChmdW5jdGlvbigpIHtcbiAgICB2YXIgb3JpZ2luYWwgPSBTdHJpbmcucHJvdG90eXBlLmxvY2FsZUNvbXBhcmU7XG4gICAgU3RyaW5nLnByb3RvdHlwZS5sb2NhbGVDb21wYXJlID0gZnVuY3Rpb24odGhhdCwgbG9jYWxlcykge1xuICAgICAgaWYgKGxvY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgbG9jYWxlQ29tcGFyZSh0aGF0LCBsb2NhbGVzLCAuLi4pXFxgIHdpdGggYW4gZXhwbGljaXQgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFF1aWNrSlMgd29ya2Zsb3cgZW5naW5lIChubyBJQ1UpLiBDb21wYXJlIGluIGEgc3RlcCBmdW5jdGlvbiwgb3IgY2FsbCB3aXRob3V0IGEgbG9jYWxlLlwiKTtcbiAgICAgICAgZXJyLm5hbWUgPSBcIldvcmtmbG93UnVudGltZUVycm9yXCI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIHRoYXQpO1xuICAgIH07XG4gIH0pKCk7XG59KSgpO1xuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0gPSBmdW5jdGlvbihzdGVwSWQsIGNsb3N1cmVWYXJzRm4pIHtcbiAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHZhciBjb3JyZWxhdGlvbklkID0gXCJzdGVwX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAgIC8vIENhcHR1cmUgJ3RoaXMnIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4sIE15Q2xhc3MubWV0aG9kKCkpXG4gICAgdmFyIHRoaXNWYWwgPSAodGhpcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMgIT09IG51bGwgJiYgdGhpcyAhPT0gZ2xvYmFsVGhpcykgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBSQVcgaW5wdXQgdmFsdWUuIFNlcmlhbGl6YXRpb24gaGFwcGVucyBvbiB0aGUgaG9zdCwgd2hpY2ggcmVhZHNcbiAgICAvLyB0aGlzIHRocm91Z2ggYSBoYW5kbGUgd2hlbiBpdCBjb2xsZWN0cyB0aGUgcGVuZGluZyBvcCDigJQgbm9cbiAgICAvLyBzZXJpYWxpemVyIGNvZGUgcnVucyBpbnNpZGUgdGhlIFZNLlxuICAgIHZhciBpbnB1dCA9IHtcbiAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICBjbG9zdXJlVmFyczogY2xvc3VyZVZhcnNGbiA/IGNsb3N1cmVWYXJzRm4oKSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXNWYWw6IHRoaXNWYWwsXG4gICAgfTtcbiAgICBnbG9iYWxUaGlzLl9fcGVuZGluZy5wdXNoKHtcbiAgICAgIHR5cGU6IFwic3RlcFwiLFxuICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICAgIHN0ZXBJZDogc3RlcElkLFxuICAgICAgaW5wdXQ6IGlucHV0LFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJSZXNvbHZlcihjb3JyZWxhdGlvbklkLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pO1xuICB9O1xuICAvLyBTZXQgc3RlcElkIG9uIHRoZSBwcm94eSBzbyB0aGUgU3RlcEZ1bmN0aW9uIHJlZHVjZXIgY2FuIGRldGVjdCBhbmRcbiAgLy8gc2VyaWFsaXplIHN0ZXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAoZS5nLiB3aGVuIHBhc3NlZCBhcyBhcmd1bWVudHMpLlxuICBmbi5zdGVwSWQgPSBzdGVwSWQ7XG4gIGlmIChjbG9zdXJlVmFyc0ZuKSBmbi5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAvLyBPdmVycmlkZSAuYmluZCBzbyBhIGJvdW5kIHN0ZXAgcHJveHkgKGUuZy4gdGhlIFNXQyBwbHVnaW4nc1xuICAvLyB1c2VTdGVwKC4uLikuYmluZCh0aGlzKSBmb3IgbGV4aWNhbC10aGlzIGFycm93IHN0ZXBzKSBrZWVwcyBpdHNcbiAgLy8gc3RlcElkIGFuZCByZWNvcmRzIHRoZSBib3VuZCByZWNlaXZlciAvIHByZWZpbGxlZCBhcmdzIOKAlCB0aGUgbmF0aXZlXG4gIC8vIGJpbmQgZHJvcHMgb3duIHByb3BlcnRpZXMsIHdoaWNoIHdvdWxkIG1ha2UgdGhlIFN0ZXBGdW5jdGlvblxuICAvLyByZWR1Y2VyIGZhaWwgdG8gcmVjb2duaXplIHRoZSBwcm94eSB3aGVuIGl0IGNyb3NzZXMgYSBzZXJpYWxpemF0aW9uXG4gIC8vIGJvdW5kYXJ5LiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIG92ZXJyaWRlIGluIHN0ZXAudHMuXG4gIGZuLmJpbmQgPSBmdW5jdGlvbih0aGlzQXJnKSB7XG4gICAgdmFyIHBhcnRpYWxBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgYm91bmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBbdGhpc0FyZ10uY29uY2F0KHBhcnRpYWxBcmdzKSk7XG4gICAgYm91bmQuc3RlcElkID0gc3RlcElkO1xuICAgIGlmIChjbG9zdXJlVmFyc0ZuKSBib3VuZC5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAgIGJvdW5kLl9fYm91bmRUaGlzID0gdGhpc0FyZztcbiAgICBpZiAocGFydGlhbEFyZ3MubGVuZ3RoID4gMCkgYm91bmQuX19ib3VuZEFyZ3MgPSBwYXJ0aWFsQXJncztcbiAgICByZXR1cm4gYm91bmQ7XG4gIH07XG4gIHJldHVybiBmbjtcbn07XG5cbi8vIFBhcnNlcyBhbiBcIm1zXCIgbGlicmFyeSBzdHlsZSBkdXJhdGlvbiBzdHJpbmcgaW50byBtaWxsaXNlY29uZHMuXG4vLyBTdXBwb3J0cyB0aGUgc2FtZSB1bml0cyBhcyB0aGUgcmVwbGF5IHJ1bnRpbWUgKHdoaWNoIHVzZXMgdGhlIFwibXNcIlxuLy8gcGFja2FnZSk6IG1zIC8gcyAvIG0gLyBoIC8gZCAvIHcgLyB5LCB3aXRoIHZlcmJvc2UgYWxpYXNlc1xuLy8gKHNlY29uZHMsIG1pbnV0ZXMsIC4uLikuXG5nbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zID0gZnVuY3Rpb24oc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKFxuICAgIC9eKC0/KD86XFxcXGQrKT9cXFxcLj9cXFxcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2lcbiAgKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgXCJtc1wiKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgcyA9IDEwMDAsIG0gPSA2MCAqIHMsIGggPSA2MCAqIG0sIGQgPSAyNCAqIGgsIHcgPSA3ICogZCwgeSA9IDM2NS4yNSAqIGQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJ5ZWFyc1wiOiBjYXNlIFwieWVhclwiOiBjYXNlIFwieXJzXCI6IGNhc2UgXCJ5clwiOiBjYXNlIFwieVwiOiByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSBcIndlZWtzXCI6IGNhc2UgXCJ3ZWVrXCI6IGNhc2UgXCJ3XCI6IHJldHVybiBuICogdztcbiAgICBjYXNlIFwiZGF5c1wiOiBjYXNlIFwiZGF5XCI6IGNhc2UgXCJkXCI6IHJldHVybiBuICogZDtcbiAgICBjYXNlIFwiaG91cnNcIjogY2FzZSBcImhvdXJcIjogY2FzZSBcImhyc1wiOiBjYXNlIFwiaHJcIjogY2FzZSBcImhcIjogcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgXCJtaW51dGVzXCI6IGNhc2UgXCJtaW51dGVcIjogY2FzZSBcIm1pbnNcIjogY2FzZSBcIm1pblwiOiBjYXNlIFwibVwiOiByZXR1cm4gbiAqIG07XG4gICAgY2FzZSBcInNlY29uZHNcIjogY2FzZSBcInNlY29uZFwiOiBjYXNlIFwic2Vjc1wiOiBjYXNlIFwic2VjXCI6IGNhc2UgXCJzXCI6IHJldHVybiBuICogcztcbiAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6IGNhc2UgXCJtaWxsaXNlY29uZFwiOiBjYXNlIFwibXNlY3NcIjogY2FzZSBcIm1zZWNcIjogY2FzZSBcIm1zXCI6IHJldHVybiBuO1xuICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NMRUVQXCIpXSA9IGZ1bmN0aW9uKHBhcmFtKSB7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJ3YWl0X1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICB2YXIgcmVzdW1lQXQ7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXN1bWVBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBwYXJhbSkudG9JU09TdHJpbmcoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YXIgbXMgPSBnbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zKHBhcmFtKTtcbiAgICBpZiAodHlwZW9mIG1zID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKG1zKSkge1xuICAgICAgcmVzdW1lQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgbXMpLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vdCBhIGR1cmF0aW9uIHN0cmluZyDigJQgdHJ5IGFzIGFuIGFic29sdXRlIGRhdGUgc3RyaW5nLlxuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJhbSk7XG4gICAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2xlZXAgcGFyYW1ldGVyOiBcIiArIHBhcmFtKTtcbiAgICAgIH1cbiAgICAgIHJlc3VtZUF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4ocGFyYW0uZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICAgIH1cbiAgICByZXN1bWVBdCA9IHBhcmFtLnRvSVNPU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICB9XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwid2FpdFwiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgcmVzdW1lQXQ6IHJlc3VtZUF0LFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyBSZXNwb25zZS9SZXF1ZXN0IHBvbHlmaWxscyDigJQgLmpzb24oKS8udGV4dCgpLy5hcnJheUJ1ZmZlcigpIGFyZSB1c2VTdGVwXG4vLyBwcm94aWVzIHRoYXQgZXhlY3V0ZSBvbiB0aGUgaG9zdCBzaWRlLiBUaGUgcHJveGllcyBhcmUgYXNzaWduZWQgZGlyZWN0bHlcbi8vIHRvIHRoZSBwcm90b3R5cGVzIHNvIHRoYXQgJ3RoaXMnICh0aGUgUmVzcG9uc2UvUmVxdWVzdCBpbnN0YW5jZSkgaXNcbi8vIHNlcmlhbGl6ZWQgYXMgdGhpc1ZhbCBieSBXT1JLRkxPV19VU0VfU1RFUCwgbWF0Y2hpbmcgdGhlIGV2ZW50LXJlcGxheVxuLy8gcnVudGltZSdzIGFwcHJvYWNoIChjb21taXQgZGNiMDc2MSkuXG5pZiAodHlwZW9mIFJlc3BvbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIHZhciBfX0JPRFlfSU5JVCA9IFN5bWJvbC5mb3IoXCJCT0RZX0lOSVRcIik7XG5cbiAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IGZ1bmN0aW9uKGJvZHksIGluaXQpIHtcbiAgICBpbml0ID0gaW5pdCB8fCB7fTtcbiAgICB0aGlzLnN0YXR1cyA9IGluaXQuc3RhdHVzIHx8IDIwMDtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0LnN0YXR1c1RleHQgfHwgXCJcIjtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyB8fCBbXSk7XG4gICAgdGhpcy50eXBlID0gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucmVkaXJlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgICB0aGlzLmJvZHlbX19CT0RZX0lOSVRdID0gYm9keTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwgXCJva1wiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVzcG9uc2UucHJvdG90eXBlLCBcImJvZHlVc2VkXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfSk7XG4gIC8vIEFzc2lnbiB1c2VTdGVwIHByb3hpZXMgZGlyZWN0bHkg4oCUICd0aGlzJyBiaW5kaW5nIHByb3ZpZGVzIHRoZVxuICAvLyBSZXNwb25zZSBpbnN0YW5jZSwgd2hpY2ggZ2V0cyBzZXJpYWxpemVkIGFzIHRoaXNWYWwgYnkgdGhlIHByb3h5LlxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuYnl0ZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24oYnVmKSB7IHJldHVybiBuZXcgVWludDhBcnJheShidWYpOyB9KTtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9IE9iamVjdC5jcmVhdGUoZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUpO1xuICAgIHIuc3RhdHVzID0gdGhpcy5zdGF0dXM7IHIuc3RhdHVzVGV4dCA9IHRoaXMuc3RhdHVzVGV4dDtcbiAgICByLmhlYWRlcnMgPSB0aGlzLmhlYWRlcnM7IHIudHlwZSA9IHRoaXMudHlwZTtcbiAgICByLnVybCA9IHRoaXMudXJsOyByLnJlZGlyZWN0ZWQgPSB0aGlzLnJlZGlyZWN0ZWQ7IHIuYm9keSA9IHRoaXMuYm9keTtcbiAgICByZXR1cm4gcjtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5qc29uID0gZnVuY3Rpb24oZGF0YSwgaW5pdCkge1xuICAgIHZhciBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgdmFyIGhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQgPyBpbml0LmhlYWRlcnMgOiBbXSk7XG4gICAgaWYgKCFoZWFkZXJzLmhhcyhcImNvbnRlbnQtdHlwZVwiKSkgeyBoZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7IH1cbiAgICByZXR1cm4gbmV3IGdsb2JhbFRoaXMuUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IChpbml0ICYmIGluaXQuc3RhdHVzKSB8fCAyMDAsIHN0YXR1c1RleHQ6IChpbml0ICYmIGluaXQuc3RhdHVzVGV4dCkgfHwgXCJcIiwgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgfTtcbn1cbmlmICh0eXBlb2YgUmVxdWVzdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlJlcXVlc3QgPSBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICAgIGluaXQgPSBpbml0IHx8IHt9O1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHsgdGhpcy51cmwgPSBpbnB1dDsgfVxuICAgIGVsc2UgaWYgKGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmwgfHwgXCJcIjsgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBpbnB1dC5oZWFkZXJzOyB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgIH1cbiAgICBpZiAoaW5pdC5tZXRob2QpIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMubWV0aG9kKSB0aGlzLm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgaWYgKGluaXQuaGVhZGVycykgdGhpcy5oZWFkZXJzID0gbmV3IGdsb2JhbFRoaXMuSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzKSB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKCk7XG4gICAgaWYgKGluaXQuYm9keSAhPT0gdW5kZWZpbmVkKSB0aGlzLmJvZHkgPSBpbml0LmJvZHk7XG4gICAgaWYgKCF0aGlzLmJvZHkpIHRoaXMuYm9keSA9IG51bGw7XG4gICAgdGhpcy5kdXBsZXggPSBpbml0LmR1cGxleCB8fCBcImhhbGZcIjtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVxdWVzdC5wcm90b3R5cGUsIFwiYm9keVVzZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZ2xvYmFsVGhpcy5SZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbn1cblxuLy8gY3JlYXRlSG9vayDigJQgcmV0dXJucyBhIEhvb2sgb2JqZWN0IHRoYXQgaXMgYm90aCBhIFRoZW5hYmxlIGFuZCBBc3luY0l0ZXJhYmxlLlxuLy8gRWFjaCBhd2FpdC95aWVsZCBjcmVhdGVzIGEgbmV3IHByb21pc2Uga2V5ZWQgYnkgdGhlIHNhbWUgY29ycmVsYXRpb25JZC5cbi8vIFRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gYSBob29rX3JlY2VpdmVkIGV2ZW50IGFycml2ZXMuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DUkVBVEVfSE9PS1wiKV0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAob3B0aW9ucy5pc1dlYmhvb2sgPT09IHRydWUgJiYgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgXFxgZXhwZXJpbWVudGFsX21pblJldGVudGlvblxcYC4gVXNlIGEgbm9uLXdlYmhvb2sgXFxgY3JlYXRlSG9vaygpXFxgIHdpdGggXFxgcmVzdW1lSG9vaygpXFxgLicpO1xuICB9XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWxUaGlzLl9fd29ybGRDYXBhYmlsaXRpZXM/Lmhvb2tSZXRlbnRpb24/LmFjdGl2ZSAhPT0gdHJ1ZSkge1xuICAgIHZhciB1bnN1cHBvcnRlZFJldGVudGlvbkVycm9yID0gbmV3IEVycm9yKCdUaGUgY29uZmlndXJlZCBXb3JsZCBkb2VzIG5vdCBzdXBwb3J0IFxcYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25cXGAgZm9yIEhvb2tzLicpO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IubmFtZSA9IFwiRmF0YWxFcnJvclwiO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IuZmF0YWwgPSB0cnVlO1xuICAgIHRocm93IHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3I7XG4gIH1cbiAgdmFyIHRva2VuID0gb3B0aW9ucy50b2tlbiB8fCBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVOYW5vaWQoKTtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImhvb2tfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIHZhciBoYXNDcmVhdGVkRXZlbnQgPSBmYWxzZTtcbiAgdmFyIHRva2VuUmV0ZW50aW9uVW50aWw7XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBtaW5SZXRlbnRpb24gPSBvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb247XG4gICAgaWYgKHR5cGVvZiBtaW5SZXRlbnRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChtaW5SZXRlbnRpb24gPCAwIHx8ICFpc0Zpbml0ZShtaW5SZXRlbnRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb246IFwiICsgbWluUmV0ZW50aW9uICsgXCIuIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlwiKTtcbiAgICAgIH1cbiAgICAgIHRva2VuUmV0ZW50aW9uVW50aWwgPSBEYXRlLm5vdygpICsgbWluUmV0ZW50aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pblJldGVudGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFyIHJldGVudGlvbk1zID0gZ2xvYmFsVGhpcy5fX3BhcnNlRHVyYXRpb25NcyhtaW5SZXRlbnRpb24pO1xuICAgICAgaWYgKHR5cGVvZiByZXRlbnRpb25NcyAhPT0gXCJudW1iZXJcIiB8fCByZXRlbnRpb25NcyA8IDAgfHwgIWlzRmluaXRlKHJldGVudGlvbk1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZHVyYXRpb246IFwiJyArIG1pblJldGVudGlvbiArICdcIi4gRXhwZWN0ZWQgYSB2YWxpZCBkdXJhdGlvbiBzdHJpbmcgbGlrZSBcIjFzXCIsIFwiMW1cIiwgXCIxaFwiLCBldGMuJyk7XG4gICAgICB9XG4gICAgICB0b2tlblJldGVudGlvblVudGlsID0gRGF0ZS5ub3coKSArIHJldGVudGlvbk1zO1xuICAgIH0gZWxzZSBpZiAobWluUmV0ZW50aW9uIGluc3RhbmNlb2YgRGF0ZSB8fCAobWluUmV0ZW50aW9uICYmIHR5cGVvZiBtaW5SZXRlbnRpb24uZ2V0VGltZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgLy8gQWNjZXB0IERhdGUtbGlrZSBvYmplY3RzIChhbnl0aGluZyB3aXRoIGdldFRpbWUpLCBtYXRjaGluZ1xuICAgICAgLy8gcGFyc2VEdXJhdGlvblRvRGF0ZTogdmFsdWVzIHRoYXQgY3Jvc3NlZCB0aGUgc2VyZGUgYm91bmRhcnkgbWF5XG4gICAgICAvLyBub3QgYmUgcmVhbG0tbmF0aXZlIERhdGUgaW5zdGFuY2VzLlxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCA9IG1pblJldGVudGlvbi5nZXRUaW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb24gcGFyYW1ldGVyLiBFeHBlY3RlZCBhIGR1cmF0aW9uIHN0cmluZywgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBvciBEYXRlIG9iamVjdC5cIik7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgaW4gcGVuZGluZyBvcGVyYXRpb25zLiBNZXRhZGF0YSBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3RcbiAgLy8gc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdoZW4gaXQgY29sbGVjdHMgdGhlIHBlbmRpbmcgb3AuXG4gIHZhciBwZW5kaW5nT3AgPSB7XG4gICAgdHlwZTogXCJob29rXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgdG9rZW5SZXRlbnRpb25VbnRpbDogdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICBpc1dlYmhvb2s6ICEhb3B0aW9ucy5pc1dlYmhvb2ssXG4gICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgfTtcbiAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcucHVzaChwZW5kaW5nT3ApO1xuXG4gIC8vIFBlci1ob29rIGxpZmVjeWNsZSBzdGF0ZSBiYWNraW5nIGhvb2suZ2V0Q29uZmxpY3QoKTogcmVzb2x2ZXMgbnVsbFxuICAvLyBvbmNlIGNyZWF0aW9uIGlzIGNvbmZpcm1lZCAoaG9va19jcmVhdGVkKSwgb3IgcmVzb2x2ZXMgd2l0aCB0aGVcbiAgLy8gY29uZmxpY3RpbmcgUnVuIGhhbmRsZSAvIHJlamVjdHMgd2l0aCBIb29rQ29uZmxpY3RFcnJvciBvblxuICAvLyBob29rX2NvbmZsaWN0LiBTdGF0ZSB0cmFuc2l0aW9ucyBhcmUgZHJpdmVuIGJ5IHRoZSBob3N0IGR1cmluZyBldmVudFxuICAvLyBwcm9jZXNzaW5nIChzZWUgcHJvY2Vzc0V2ZW50cykuXG4gIGdsb2JhbFRoaXMuX19ob29rcyA9IGdsb2JhbFRoaXMuX19ob29rcyB8fCB7fTtcbiAgZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdID0ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjcmVhdGVkOiBmYWxzZSxcbiAgICBjb25mbGljdDogbnVsbCxcbiAgICBnZXRDb25mbGljdFJlc29sdmVyczogW10sXG4gIH07XG5cbiAgLy8gRWFjaCBhd2FpdCBjcmVhdGVzIGEgbmV3IHByb21pc2UgZm9yIHRoZSBuZXh0IHBheWxvYWQuXG4gIC8vIFRoZSBjb3JyZWxhdGlvbklkIHN0YXlzIHRoZSBzYW1lIOKAlCB0aGUgcmVzb2x2ZXIgaXMgcmVwbGFjZWQgZWFjaCB0aW1lLlxuICBmdW5jdGlvbiBjcmVhdGVIb29rUHJvbWlzZSgpIHtcbiAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCBidWZmZXIgZmlyc3Qg4oCUIGlmIGEgaG9va19yZWNlaXZlZCBldmVudCBhcnJpdmVkXG4gICAgLy8gYmVmb3JlIHRoaXMgaG9vayB3YXMgYXdhaXRlZCwgdGhlIHBheWxvYWQgd2FzIGJ1ZmZlcmVkIGluIHRoZSBWTVxuICAgIC8vIGhlYXAuIERyYWluIGl0IGltbWVkaWF0ZWx5IChtYXRjaGluZyBldmVudC1yZXBsYXkgcGF5bG9hZHNRdWV1ZSkuXG4gICAgdmFyIGJ1ZiA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmICYmIGJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1Zi5zaGlmdCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjb3JyZWxhdGlvbklkXSA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCkge1xuICAgIGlmIChpc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgLy8gQSBjb25mbGljdGVkIGhvb2sgd2FzIG5ldmVyIGNyZWF0ZWQgKHRoZSB3b3JsZCByZWplY3RlZCBpdHMgY2xhaW1cbiAgICAvLyDigJQgdGhlIHRva2VuIGJlbG9uZ3MgdG8gYW5vdGhlciBydW4pLCBzbyB0aGVyZSBpcyBubyBlbnRpdHkgdG9cbiAgICAvLyBkaXNwb3NlLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hlcmUgaG9va19jb25mbGljdCByZW1vdmVzXG4gICAgLy8gdGhlIGludm9jYXRpb24tcXVldWUgaXRlbSBiZWZvcmUgZGlzcG9zZSBjYW4gbWFyayBpdC4gRW1pdHRpbmcgYVxuICAgIC8vIGhvb2tfZGlzcG9zZWQgaGVyZSB3b3VsZCBiZSByZWplY3RlZCBieSB0aGUgd29ybGQnc1xuICAgIC8vIGhvb2stZXhpc3RlbmNlIHZhbGlkYXRpb24uXG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAvLyBTaWduYWwgdG8gdGhlIGVudHJ5cG9pbnQgdG8gY3JlYXRlIGEgaG9va19kaXNwb3NlZCBldmVudC4gVGhlXG4gICAgICAvLyB0b2tlbiBpcyBjYXJyaWVkIHNvIHRoZSBlbnRyeXBvaW50IGNhbiBvcmRlciBzYW1lLXRva2VuIGhvb2tcbiAgICAgIC8vIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IChhIGRpc3Bvc2UgbXVzdCByZWxlYXNlIHRoZSB0b2tlbiBiZWZvcmVcbiAgICAgIC8vIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXMgdmFsaWRhdGVkKS5cbiAgICAgIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgICAgICB0eXBlOiBcImhvb2tfZGlzcG9zZVwiLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUncyBhIHBlbmRpbmcgcmVzb2x2ZXIsIHJlc29sdmUgaXQgd2l0aCB1bmRlZmluZWQgdG8gYnJlYWsgdGhlIGl0ZXJhdG9yXG4gICAgaWYgKGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0pIHtcbiAgICAgIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q29uZmxpY3QoKSB7XG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmIChzdGF0ZS5jb25mbGljdCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmNvbmZsaWN0LnJ1blxuICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzdGF0ZS5jb25mbGljdC5ydW4pXG4gICAgICAgIDogUHJvbWlzZS5yZWplY3Qoc3RhdGUuY29uZmxpY3QuZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY3JlYXRlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgLy8gQ3JlYXRpb24gbm90IHlldCBjb25maXJtZWQgYnkgdGhlIGV2ZW50IGxvZyDigJQgcGFyayB0aGUgYXdhaXRlciBhbmRcbiAgICAvLyBmbGFnIHRoZSBwZW5kaW5nIG9wIHNvIHRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0XG4gICAgLy8gYWZ0ZXIgd3JpdGluZyBob29rX2NyZWF0ZWQgKG5vdGhpbmcgZXh0ZXJuYWwgcmVzdW1lcyBhIGdldENvbmZsaWN0XG4gICAgLy8gYXdhaXRlcjsgY29uZmlybWF0aW9uIG9ubHkgY29tZXMgZnJvbSByZXBsYXlpbmcgdGhlIG5ldyBldmVudCkuXG4gICAgcGVuZGluZ09wLmhhc0dldENvbmZsaWN0QXdhaXRlciA9IHRydWU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMucHVzaCh7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGhvb2sgPSB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9LFxuICAgIGdldENvbmZsaWN0OiBnZXRDb25mbGljdCxcbiAgICBkaXNwb3NlOiBkaXNwb3NlSG9vayxcbiAgfTtcblxuICAvLyBTeW1ib2wuZGlzcG9zZSBmb3IgZXhwbGljaXQgcmVzb3VyY2UgbWFuYWdlbWVudFxuICBob29rW1N5bWJvbC5kaXNwb3NlXSA9IGRpc3Bvc2VIb29rO1xuXG4gIC8vIEFzeW5jSXRlcmFibGUg4oCUIHlpZWxkcyBwYXlsb2FkcyB1bnRpbCBkaXNwb3NlZFxuICBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgLy8gSWYgZGlzcG9zZWQgd2hpbGUgd2FpdGluZywgc2lnbmFsIGRvbmVcbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmV0dXJuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZGlzcG9zZUhvb2soKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vLyBzZXRBdHRyaWJ1dGVzIOKAlCBhdHRhY2hlcyBwbGFpbnRleHQgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgcnVuLlxuLy8gVmFsaWRhdGlvbiBoYXBwZW5zIGluIGxpYnJhcnkgY29kZSAobm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcykgYmVmb3JlXG4vLyB0aGlzIGRpc3BhdGNoZXIgaXMgaW52b2tlZCwgc28gXCJjaGFuZ2VzXCIgaXMgYWxyZWFkeSBub3JtYWxpemVkLiBUaGVcbi8vIHJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgd2hlbiB0aGUgbWF0Y2hpbmcgYXR0cl9zZXQgZXZlbnQgaXNcbi8vIG9ic2VydmVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIOKAlCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3Ncbi8vIGNyZWF0ZVNldEF0dHJpYnV0ZXMgKGF0dHJpYnV0ZS1kaXNwYXRjaGVyLnRzKS5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NFVF9BVFRSSUJVVEVTXCIpXSA9IGZ1bmN0aW9uKGNoYW5nZXMsIG9wdGlvbnMpIHtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImF0dHJfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiYXR0cmlidXRlXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICBjaGFuZ2VzOiBjaGFuZ2VzLFxuICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiAhIShvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMpLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyAtLS0tIEFib3J0Q29udHJvbGxlciAvIEFib3J0U2lnbmFsIChob29rLWJhY2tlZCkgLS0tLVxuLy8gUG9ydCBvZiB3b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIHRvIHRoZSBWTSBwZW5kaW5nLW9wIG1vZGVsOlxuLy8gdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGEgc3lzdGVtIGhvb2s7IGFib3J0KCkgZmxpcHMgdGhlIHNpZ25hbFxuLy8gc3luY2hyb25vdXNseSBhbmQgbWFya3MgdGhlIHBlbmRpbmcgb3Agc28gdGhlIGhvc3QgcmVjb3JkcyB0aGUgYWJvcnRcbi8vIChob29rX3JlY2VpdmVkIGV2ZW50ICsgc3RyZWFtIHBhY2tldCkuIE9uIHJlcGxheSwgdGhlIHJlY29yZGVkXG4vLyBob29rX3JlY2VpdmVkIGV2ZW50IGNhbGxzIF9zZXRBYm9ydGVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIGFuZCB0aGVcbi8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBiZWNvbWVzIGEgbm8tb3AuXG52YXIgX19BQk9SVF9TVFJFQU1fTkFNRSA9IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19BQk9SVF9TVFJFQU1fTkFNRVwiKTtcbnZhciBfX0FCT1JUX0hPT0tfVE9LRU4gPSBTeW1ib2wuZm9yKFwiV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTlwiKTtcblxuZnVuY3Rpb24gX19tYWtlQWJvcnRFcnJvcigpIHtcbiAgaWYgKHR5cGVvZiBET01FeGNlcHRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIsIFwiQWJvcnRFcnJvclwiKTtcbiAgfVxuICB2YXIgZSA9IG5ldyBFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuICBlLm5hbWUgPSBcIkFib3J0RXJyb3JcIjtcbiAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIFdvcmtmbG93QWJvcnRTaWduYWwoc3RyZWFtTmFtZSwgaG9va1Rva2VuKSB7XG4gIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgdGhpc1tfX0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gIHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgdGhpcy5fX2xpc3RlbmVycyA9IFtdO1xuICB0aGlzLl9fb25hYm9ydCA9IG51bGw7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV29ya2Zsb3dBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwib25hYm9ydFwiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9fb25hYm9ydDsgfSxcbiAgc2V0OiBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgdGhpcy5fX29uYWJvcnQgPSBoYW5kbGVyO1xuICAgIGlmIChoYW5kbGVyICYmIHRoaXMuYWJvcnRlZCkgaGFuZGxlci5jYWxsKHRoaXMpO1xuICB9LFxufSk7XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5fc2V0QWJvcnRlZCA9IGZ1bmN0aW9uKHJlYXNvbikge1xuICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG4gIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICBpZiAodGhpcy5fX29uYWJvcnQpIHRoaXMuX19vbmFib3J0LmNhbGwodGhpcyk7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9fbGlzdGVuZXJzO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSBsaXN0ZW5lcnNbaV0oKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgLy8gRmlyZSBzeW5jaHJvbm91c2x5IChub3Qgb24gYSBtaWNyb3Rhc2spIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheSDigJRcbiAgICAvLyBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzIFdvcmtmbG93QWJvcnRTaWduYWwuXG4gICAgbGlzdGVuZXIoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gdGhpcy5fX2xpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24obCkgeyByZXR1cm4gbCAhPT0gbGlzdGVuZXI7IH0pO1xufTtcbldvcmtmbG93QWJvcnRTaWduYWwucHJvdG90eXBlLnRocm93SWZBYm9ydGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICB0aHJvdyB0aGlzLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmVhc29uICE9PSBudWxsXG4gICAgICA/IHRoaXMucmVhc29uXG4gICAgICA6IF9fbWFrZUFib3J0RXJyb3IoKTtcbiAgfVxufTtcbi8vIEV4cG9zZSBmb3IgdGhlIGhvc3Qgc2VyZGUncyByZXZpdmVycyAodGhleSBsb29rIHRoZSBjbGFzcyB1cCBsYXppbHksXG4vLyB0aHJvdWdoIGEgaGFuZGxlLCBhdCByZXZpdmUgdGltZSkuXG5nbG9iYWxUaGlzLl9fV29ya2Zsb3dBYm9ydFNpZ25hbCA9IFdvcmtmbG93QWJvcnRTaWduYWw7XG5cbi8vIFJlZ2lzdHJ5IG9mIGxpdmUgYWJvcnQgc2lnbmFscyBrZXllZCBieSB0aGVpciBob29rIGNvcnJlbGF0aW9uSWQuIFRoZVxuLy8gaG9zdCBkZWxpdmVycyBob29rX3JlY2VpdmVkIGV2ZW50cyBmb3IgdGhlc2UgaWRzIGFzIF9zZXRBYm9ydGVkIGNhbGxzLlxuZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyA9IHt9O1xuXG5nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciA9IGZ1bmN0aW9uIFdvcmtmbG93QWJvcnRDb250cm9sbGVyKCkge1xuICB2YXIgaWQgPSBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBzdHJlYW1OYW1lID0gXCJzdHJtX1wiICsgaWQgKyBcIl9zeXN0ZW1fYWJvcnRcIjtcbiAgdmFyIGhvb2tUb2tlbiA9IFwiYWJydF9cIiArIGlkO1xuICB0aGlzW19fQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgdGhpc1tfX0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICB0aGlzLnNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJob29rX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAvLyBSZWdpc3RlciBhbiBpbnRlcm5hbCBzeXN0ZW0gaG9vay4gaXNTeXN0ZW0gcHJldmVudHMgdG9rZW4gbmFtZXNwYWNlXG4gIC8vIGNvbmZsaWN0cyB3aXRoIHVzZXIgaG9va3MuXG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiaG9va1wiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgdG9rZW46IGhvb2tUb2tlbixcbiAgICBpc1dlYmhvb2s6IGZhbHNlLFxuICAgIGlzU3lzdGVtOiB0cnVlLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzW2NvcnJlbGF0aW9uSWRdID0gdGhpcy5zaWduYWw7XG59O1xuZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24ocmVhc29uKSB7XG4gIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47IC8vIGFscmVhZHkgYWJvcnRlZCAoZS5nLiBmcm9tIHJlcGxheSlcbiAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcbiAgLy8gTWFyayB0aGUgcGVuZGluZyBob29rIG9wIHNvIHRoZSBob3N0IHJlY29yZHMgdGhlIGFib3J0LiBUaGUgcGF5bG9hZFxuICAvLyBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3Qgc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdpdGggZnVsbFxuICAvLyB0eXBlIGZpZGVsaXR5IChFcnJvcnMsIERPTUV4Y2VwdGlvbiwgY3VzdG9tIHZhbHVlcykuXG4gIHZhciB0b2tlbiA9IHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWxUaGlzLl9fcGVuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gZ2xvYmFsVGhpcy5fX3BlbmRpbmdbaV07XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJob29rXCIgJiYgaXRlbS50b2tlbiA9PT0gdG9rZW4pIHtcbiAgICAgIGl0ZW0uYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgaXRlbS5hYm9ydFBheWxvYWQgPSB7XG4gICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbCA9IHtcbiAgYWJvcnQ6IGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIHZhciBzID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoXCJcIiwgXCJcIik7XG4gICAgcy5fc2V0QWJvcnRlZChyZWFzb24gIT09IHVuZGVmaW5lZCA/IHJlYXNvbiA6IF9fbWFrZUFib3J0RXJyb3IoKSk7XG4gICAgcmV0dXJuIHM7XG4gIH0sXG4gIGFueTogZnVuY3Rpb24oc2lnbmFscykge1xuICAgIHZhciBjb21wb3NpdGUgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbChcIlwiLCBcIlwiKTtcbiAgICB2YXIgYXJyID0gQXJyYXkuZnJvbShzaWduYWxzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXS5hYm9ydGVkKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5fc2V0QWJvcnRlZChhcnJbaV0ucmVhc29uKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpc3RlbmVycy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAobGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgbGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXJzW2pdLmxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfTtcbiAgICBhcnIuZm9yRWFjaChmdW5jdGlvbihzaWduYWwpIHtcbiAgICAgIGlmICghc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIpIHJldHVybjtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWNvbXBvc2l0ZS5hYm9ydGVkKSB7XG4gICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxpc3RlbmVycy5wdXNoKHsgc2lnbmFsOiBzaWduYWwsIGxpc3RlbmVyOiBsaXN0ZW5lciB9KTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb21wb3NpdGU7XG4gIH0sXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQWJvcnRTaWduYWwudGltZW91dCgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiBcIiArXG4gICAgICAgIFwiVXNlIHNsZWVwKCkgd2l0aCBhbiBBYm9ydENvbnRyb2xsZXIgaW5zdGVhZC4gXCIgK1xuICAgICAgICBcIlNlZTogL2RvY3MvZXJyb3JzL2Fib3J0LXNpZ25hbC10aW1lb3V0LWluLXdvcmtmbG93XCJcbiAgICApO1xuICB9LFxufTtcblxuLy8gV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCDigJQgZ2VuZXJhdGVzIGEgc3RyZWFtIElEIGZvciBhIHdvcmtmbG93IHJ1bi5cbi8vIFJlcGxpY2F0ZXMgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCgpIGZyb20gdXRpbC50cyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0uXG4vLyBVc2VzIHRoZSBidWlsdC1pbiBidG9hKCkgZm9yIGJhc2U2NHVybCBlbmNvZGluZy5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0dFVF9TVFJFQU1fSURcIildID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gIHZhciBydW5JZCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0NPTlRFWFRcIildXG4gICAgPyBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXS53b3JrZmxvd1J1bklkXG4gICAgOiBcIlwiO1xuICB2YXIgc3RyZWFtSWQgPSBydW5JZC5yZXBsYWNlKFwid3J1bl9cIiwgXCJzdHJtX1wiKSArIFwiX3VzZXJcIjtcbiAgaWYgKCFuYW1lc3BhY2UpIHJldHVybiBzdHJlYW1JZDtcbiAgLy8gYmFzZTY0dXJsOiBidG9hIHRoZW4gcmVwbGFjZSArIHdpdGggLSwgLyB3aXRoIF8sIHN0cmlwID1cbiAgdmFyIGI2NCA9IGJ0b2EobmFtZXNwYWNlKS5yZXBsYWNlKC9cXFxcKy9nLCBcIi1cIikucmVwbGFjZSgvXFxcXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0rJC8sIFwiXCIpO1xuICByZXR1cm4gc3RyZWFtSWQgKyBcIl9cIiArIGI2NDtcbn07XG5gO1xuXG4vLyAtLS0tIFJ1bnRpbWUgLS0tLVxuXG4vKipcbiAqIFBoYXNlIDE6IHN0YXRpYyAocnVuLWluZGVwZW5kZW50KSBWTSBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBDcmVhdGVzIGEgUXVpY2tKUyBWTSBhbmQgbG9hZHMgZXZlcnl0aGluZyB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBhXG4gKiBzcGVjaWZpYyB3b3JrZmxvdyBydW46IHRoZSB3b3JrZmxvdy1wcmltaXRpdmUgYm9vdHN0cmFwICh1c2VTdGVwIC9cbiAqIHNsZWVwIC8gY3JlYXRlSG9vayAvIFJlc3BvbnNlLVJlcXVlc3QgcG9seWZpbGxzKS4gU2VyaWFsaXphdGlvbiBpc1xuICogaG9zdC1zaWRlIChxdWlja2pzLXNlcmRlLnRzKSBhbmQgY2FwdHVyZXMgaXRzIGludHJpbnNpY3MgZnJvbSB0aGUgVk1cbiAqIHJpZ2h0IGFmdGVyIHRoaXMgcmV0dXJucy5cbiAqXG4gKiBgZ2V0Tm93TXNgIGJhY2tzIHRoZSBWTSdzIFdBU0kgY2xvY2sgKGBEYXRlLm5vdygpYCAvIGBuZXcgRGF0ZSgpYFxuICogaW5zaWRlIHRoZSBWTSkuIFRoZSBjYWxsYmFjayBpdHNlbGYgaXMgc3RhdGljOiB0aGUgcGVyLXJ1biBzdGF0ZSBpdFxuICogcmVhZHMgbGl2ZXMgb24gdGhlIGhvc3QgYW5kIGlzIGFkdmFuY2VkIGFzIGV2ZW50cyBhcmUgY29uc3VtZWQsXG4gKiBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkZXRlcm1pbmlzdGljIHJlcGxheSBjbG9jay5cbiAqXG4gKiBUaGlzIHBoYXNlIGlzIHRoZSBmdXR1cmUgYm91bmRhcnkgZm9yIFZNLW1lbW9yeSBzbmFwc2hvdHRpbmc6IGFcbiAqIGJ1aWxkLXRpbWUgc25hcHNob3QgY2FuIGNhcHR1cmUgdGhlIFZNIHJpZ2h0IGFmdGVyIHRoaXMgZnVuY3Rpb24gYW5kXG4gKiBuZXcgcnVucyBjYW4gcmVzdG9yZSBmcm9tIGl0IGluc3RlYWQgb2YgcGF5aW5nIFZNIGNyZWF0aW9uICsgZXZhbCBjb3N0XG4gKiAoYFF1aWNrSlMucmVzdG9yZWAgYWNjZXB0cyB0aGUgc2FtZSB3YXNpIG92ZXJyaWRlKS5cbiAqL1xuLyoqXG4gKiBMb29zZWx5LXR5cGVkIGFjY2Vzc29yIGZvciB0aGUgYFdlYkFzc2VtYmx5YCBnbG9iYWwuIFRoZSBwYWNrYWdlXG4gKiB0c2NvbmZpZydzIGBsaWI6IFtcImVzMjAyMlwiXWAgZG9lcyBub3QgaW5jbHVkZSB0aGUgRE9NIGxpYiB3aGVyZSB0aGVcbiAqIGBXZWJBc3NlbWJseWAgbmFtZXNwYWNlIHR5cGVzIGxpdmU7IHRoZSBydW50aW1lIGdsb2JhbCBpcyBhdmFpbGFibGUgb25cbiAqIGV2ZXJ5IFdBU00tY2FwYWJsZSBwbGF0Zm9ybSB0aGlzIGVuZ2luZSB0YXJnZXRzLlxuICovXG5jb25zdCBXZWJBc3NlbWJseUdsb2JhbCA9IChnbG9iYWxUaGlzIGFzIGFueSkuV2ViQXNzZW1ibHkgYXMge1xuICBjb21waWxlKGJ5dGVzOiBVaW50OEFycmF5KTogUHJvbWlzZTxvYmplY3Q+O1xufTtcblxudHlwZSBDb21waWxlZEV4dGVuc2lvbiA9IE9taXQ8RXh0ZW5zaW9uRGVzY3JpcHRvciwgJ3dhc20nPiAmIHtcbiAgd2FzbTogRXh0ZW5zaW9uRGVzY3JpcHRvclsnd2FzbSddO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUgY2FjaGUgb2YgdGhlIGNvbXBpbGVkIGBXZWJBc3NlbWJseS5Nb2R1bGVgcyBmb3IgdGhlIG1haW5cbiAqIFF1aWNrSlMgcnVudGltZSBhbmQgaXRzIG5hdGl2ZSBleHRlbnNpb25zLiBgV2ViQXNzZW1ibHkuY29tcGlsZWAgb2YgdGhlXG4gKiB+NjAwIEtCIHJ1bnRpbWUgYmluYXJ5IGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSBwYXJ0IG9mIFZNIGNyZWF0aW9uIGFuZCBpc1xuICogcHVyZSAobm8gcGVyLVZNIHN0YXRlOiBpbnN0YW50aWF0aW9uIGJpbmRzIHRoZSBwZXItVk0gbWVtb3J5KSwgc28gaXRcbiAqIG9ubHkgbmVlZHMgdG8gaGFwcGVuIG9uY2UgcGVyIHByb2Nlc3MuIFRoZSBwcm9taXNlIGlzIGNhY2hlZCAobm90IHRoZVxuICogcmVzdWx0KSBzbyBjb25jdXJyZW50IGZpcnN0IGludm9jYXRpb25zIHNoYXJlIGEgc2luZ2xlIGNvbXBpbGF0aW9uLlxuICovXG4vLyBPbiBgZ2xvYmFsVGhpc2AgKHNlZSBgZ2xvYmFsU2luZ2xldG9uYCk6IHRoZSBjb21tZW50IGFib3ZlIHNheXMgb25jZSBwZXJcbi8vIHByb2Nlc3MsIGFuZCBtb2R1bGUgc2NvcGUgd291bGQgbWFrZSBpdCBvbmNlIHBlciBidW5kbGVyIGxheWVyLCByZWNvbXBpbGluZ1xuLy8gdGhlIH42MDAgS0IgcnVudGltZSBiaW5hcnkgZm9yIGVhY2guXG5jb25zdCBxdWlja2pzQXNzZXRzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3F1aWNranNDb21waWxlZEFzc2V0cycsXG4gIDEsXG4gICgpID0+ICh7XG4gICAgcHJvbWlzZTogdW5kZWZpbmVkIGFzXG4gICAgICB8IFByb21pc2U8e1xuICAgICAgICAgIHdhc206IG9iamVjdDtcbiAgICAgICAgICBleHRlbnNpb25zOiBDb21waWxlZEV4dGVuc2lvbltdO1xuICAgICAgICB9PlxuICAgICAgfCB1bmRlZmluZWQsXG4gIH0pXG4pO1xuXG5mdW5jdGlvbiBnZXRDb21waWxlZEFzc2V0cygpIHtcbiAgaWYgKCFxdWlja2pzQXNzZXRzLnByb21pc2UpIHtcbiAgICBxdWlja2pzQXNzZXRzLnByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3dhc20sIC4uLmV4dGVuc2lvbk1vZHVsZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBXZWJBc3NlbWJseUdsb2JhbC5jb21waWxlKHF1aWNranNXYXNtKSxcbiAgICAgICAgLi4ucXVpY2tqc0V4dGVuc2lvbnMubWFwKChleHQpID0+XG4gICAgICAgICAgV2ViQXNzZW1ibHlHbG9iYWwuY29tcGlsZShleHQud2FzbSBhcyBVaW50OEFycmF5KVxuICAgICAgICApLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3YXNtLFxuICAgICAgICBleHRlbnNpb25zOiBxdWlja2pzRXh0ZW5zaW9ucy5tYXAoKGV4dCwgaSkgPT4gKHtcbiAgICAgICAgICAuLi5leHQsXG4gICAgICAgICAgd2FzbTogZXh0ZW5zaW9uTW9kdWxlc1tpXSBhcyBFeHRlbnNpb25EZXNjcmlwdG9yWyd3YXNtJ10sXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSkoKTtcbiAgICAvLyBPbiBmYWlsdXJlLCBjbGVhciB0aGUgY2FjaGUgc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeSByYXRoZXJcbiAgICAvLyB0aGFuIGJlaW5nIHN0dWNrIHdpdGggYSByZWplY3RlZCBwcm9taXNlIGZvcmV2ZXIuXG4gICAgcXVpY2tqc0Fzc2V0cy5wcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgIHF1aWNranNBc3NldHMucHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcXVpY2tqc0Fzc2V0cy5wcm9taXNlO1xufVxuXG4vKipcbiAqIFdBU0kgY2xvY2sgb3ZlcnJpZGUgcmVhZGluZyB0aGUgZ2l2ZW4gYWNjZXNzb3IsIHNoYXJlZCBiZXR3ZWVuIGZyZXNoXG4gKiBib290cyAoaW5pdFdvcmtmbG93Vk0pIGFuZCBiYXNlbGluZS1zbmFwc2hvdCByZXN0b3Jlcywgc28gdGhlIHR3b1xuICogcGF0aHMgY2Fubm90IGRyaWZ0IG9uIHJvdW5kaW5nL2VuY29kaW5nLlxuICpcbiAqIERldGVybWluaXN0aWMgcmVwbGF5IGNsb2NrOiBEYXRlLm5vdygpIC8gbmV3IERhdGUoKSBpbnNpZGUgdGhlIFZNXG4gKiByZWFkIHRoZSBob3N0LWNvbnRyb2xsZWQgY2xvY2sgaW5zdGVhZCBvZiB3YWxsIHRpbWUuIFJlcGxheVxuICogcmUtZXhlY3V0ZXMgdGhlIHdvcmtmbG93IGZyb20gdGhlIHRvcCBvbiBldmVyeSBpbnZvY2F0aW9uLCBzbyB0aGVcbiAqIGNsb2NrIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRoZSBldmVudCBsb2cgKG5vdCByZWFsIHRpbWUpIGZvciB0aGVcbiAqIHdvcmtmbG93IHRvIG9ic2VydmUgc3RhYmxlIHRpbWVzdGFtcHMgYWNyb3NzIGludm9jYXRpb25zLlxuICovXG5mdW5jdGlvbiBtYWtlRGV0ZXJtaW5pc3RpY0Nsb2NrV2FzaShnZXROb3dNczogKCkgPT4gbnVtYmVyKTogV2FzaU9wdGlvbnMge1xuICByZXR1cm4gKG1lbW9yeSkgPT4gKHtcbiAgICBjbG9ja190aW1lX2dldChfY2xvY2tJZDogbnVtYmVyLCBfcHJlY2lzaW9uOiBiaWdpbnQsIHJlc3VsdFB0cjogbnVtYmVyKSB7XG4gICAgICBjb25zdCB0aW1lTnMgPSBCaWdJbnQoTWF0aC5yb3VuZChnZXROb3dNcygpKSkgKiAxXzAwMF8wMDBuO1xuICAgICAgbmV3IERhdGFWaWV3KG1lbW9yeS5idWZmZXIpLnNldEJpZ1VpbnQ2NChyZXN1bHRQdHIsIHRpbWVOcywgdHJ1ZSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdFdvcmtmbG93Vk0oXG4gIGdldE5vd01zOiAoKSA9PiBudW1iZXIsXG4gIGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0XG4pOiBQcm9taXNlPFF1aWNrSlM+IHtcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgZ2V0Q29tcGlsZWRBc3NldHMoKTtcbiAgY29uc3Qgdm0gPSBhd2FpdCBRdWlja0pTLmNyZWF0ZSh7XG4gICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgbWVtb3J5TGltaXQ6IDI1NiAqIDEwMjQgKiAxMDI0LFxuICAgIGludGVycnVwdEhhbmRsZXI6IGNyZWF0ZUludGVycnVwdEhhbmRsZXIoaW50ZXJydXB0QnVkZ2V0KSxcbiAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICB3YXNpOiBtYWtlRGV0ZXJtaW5pc3RpY0Nsb2NrV2FzaShnZXROb3dNcyksXG4gIH0pO1xuXG4gIC8vIEJvb3RzdHJhcCB3b3JrZmxvdyBwcmltaXRpdmVzXG4gIHZtLmV2YWxDb2RlKFZNX0JPT1RTVFJBUCwgJ2Jvb3RzdHJhcC5qcycpLmRpc3Bvc2UoKTtcblxuICByZXR1cm4gdm07XG59XG5cbi8vIC0tLS0gQmFzZWxpbmUgc25hcHNob3QgKHN0YXJ0dXAgb3B0aW1pemF0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIEV2YWx1YXRpbmcgdGhlIHdvcmtmbG93IGJ1bmRsZSBkb21pbmF0ZXMgVk0gc3RhcnR1cCAofjc0bXMgb2YgYSB+Nzdtc1xuLy8gYm9vdCBmb3IgYSAxLjNNQiBidW5kbGUpLCBhbmQgZnVsbCBldmVudCByZXBsYXkgcGF5cyBpdCBvbiBFVkVSWVxuLy8gaW52b2NhdGlvbi4gVGhlIGJ1bmRsZSBpcyBpZGVudGljYWwgYWNyb3NzIGFsbCBydW5zIG9mIGEgZGVwbG95bWVudCwgc29cbi8vIHRoZSBlbmdpbmUgaHlkcmF0ZXMgb25lIFZNIHBlciBmdW5jdGlvbiBpbnN0YW5jZSAoYm9vdHN0cmFwICsgYnVuZGxlXG4vLyBldmFsKSwgc25hcHNob3RzIGl0cyBtZW1vcnksIGFuZCBzdGFydHMgZXZlcnkgaW52b2NhdGlvbiBieSByZXN0b3Jpbmdcbi8vIHRoZSBzbmFwc2hvdCAofjNtcykgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nLlxuLy9cbi8vIERldGVybWluaXNtOiByZXBsYXkgcmVxdWlyZXMgbW9kdWxlLXNjb3BlIHVzZXIgY29kZSB0byBvYnNlcnZlIHRoZVxuLy8gcnVuLXNlZWRlZCBQUk5HIGFuZCB0aGUgcnVuJ3MgZGV0ZXJtaW5pc3RpYyBjbG9jay4gQSByZXN0b3JlZCBoZWFwXG4vLyBjYXJyaWVzIHdoYXRldmVyIG1vZHVsZSBzY29wZSBjb21wdXRlZCBhdCBIWURSQVRFIHRpbWUsIHNvIHRoZVxuLy8gb3B0aW1pemF0aW9uIGlzIG9ubHkgc291bmQgd2hlbiBtb2R1bGUgc2NvcGUgY29uc3VtZWQgbmVpdGhlclxuLy8gcmFuZG9tbmVzcyBub3IgdGltZS4gQm90aCBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGh5ZHJhdGUgKHRoZSBwbGFjZWhvbGRlclxuLy8gaG9zdCBmbnMgY291bnQgZHJhd3MsIHRoZSBoeWRyYXRlIGNsb2NrIGNvdW50cyByZWFkcykgYW5kIGEgYnVuZGxlXG4vLyB0aGF0IHVzZWQgZWl0aGVyIGlzIG1hcmtlZCBpbmVsaWdpYmxlOiBldmVyeSBpbnZvY2F0aW9uIGZhbGxzIGJhY2sgdG9cbi8vIGZyZXNoIGV2YWx1YXRpb24sIHByZXNlcnZpbmcgZXhhY3Qgbm9kZTp2bS1wYXJpdHkgc2VtYW50aWNzLiBXaGVuIHRoZVxuLy8gZ2F0ZSBwYXNzZXMsIHJlc3RvcmUgaXMgYnl0ZS1lcXVpdmFsZW50IHRvIGZyZXNoIGV2YWwgKHZlcmlmaWVkIGJ5IHRoZVxuLy8gcGFyaXR5IHRlc3RzKTogdGhlIHBlci1ydW4gaG9zdCBmbnMgYXJlIHJlLXJlZ2lzdGVyZWQgYnkgbmFtZSBvbiB0aGVcbi8vIHJlc3RvcmVkIFZNIChxdWlja2pzLXdhc2kgcmVzdG9yZSBzZW1hbnRpY3MpIGJlZm9yZSB0aGUgd29ya2Zsb3cgYm9keVxuLy8gcnVucywgc28gdGhlIHNlZWRlZCBkcmF3IHNlcXVlbmNlIChhbmQgZXZlcnkgY29ycmVsYXRpb25JZCkgaXNcbi8vIGlkZW50aWNhbC5cbi8vXG4vLyBUaGUgY2FjaGUgaXMgcGVyIGZ1bmN0aW9uIGluc3RhbmNlIGFuZCBrZXllZCBvbiB0aGUgYnVuZGxlIHN0cmluZ1xuLy8gKHJlZmVyZW5jZS1zdGFibGU6IHRoZSBnZW5lcmF0ZWQgZmxvdyByb3V0ZSBob2xkcyBpdCBpbiBhIG1vZHVsZS1sZXZlbFxuLy8gY29uc3QpLiBDYXBwZWQgYXQgYSBmZXcgZW50cmllcyBzbyB0ZXN0cyB3aXRoIG1hbnkgZGlzdGluY3QgYnVuZGxlc1xuLy8gZG9uJ3QgYWNjdW11bGF0ZSAxNk1CIHNuYXBzaG90cy5cblxuLyoqXG4gKiBFdmFsIGZpbGVuYW1lIHVzZWQgd2hlbiBoeWRyYXRpbmcgdGhlIGJhc2VsaW5lIFZNLiBUaGUgYmFzZWxpbmUgaXNcbiAqIHNoYXJlZCBieSBFVkVSWSB3b3JrZmxvdyBpbiB0aGUgYnVuZGxlLCBzbyB0aGUgZmlsZW5hbWUgYmFrZWQgaW50b1xuICogaXRzIGNvbXBpbGVkIGNvZGUgKGFuZCB0aGVyZWZvcmUgaW50byBzbmFwc2hvdC1wYXRoIHN0YWNrIGZyYW1lcylcbiAqIG11c3QgYmUgd29ya2Zsb3ctaW5kZXBlbmRlbnQ6IGh5ZHJhdGluZyB1bmRlciB0aGUgZmlyc3QgY2FsbGVyJ3NcbiAqIHdvcmtmbG93SWQgd291bGQgYnJlYWsgYHJlbWFwRXJyb3JTdGFja2AncyBmaWxlbmFtZSBtYXRjaGluZyBmb3JcbiAqIGV2ZXJ5IG90aGVyIHdvcmtmbG93IGluIHRoZSBidW5kbGUuIFJlbWFwIGNhbGwgc2l0ZXMgbWF0Y2ggdGhpc1xuICogY29uc3RhbnQgSU4gQURESVRJT04gdG8gdGhlIHJ1bidzIG1vZHVsZSBzcGVjaWZpZXIgKHdoaWNoIGNvdmVyc1xuICogZnJlc2gtcGF0aCBmcmFtZXMpLlxuICovXG5leHBvcnQgY29uc3QgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FID0gJ3dvcmtmbG93LWJ1bmRsZS5qcyc7XG5cbnR5cGUgQmFzZWxpbmVFbnRyeSA9XG4gIHwge1xuICAgICAgc3RhdGU6ICdyZWFkeSc7XG4gICAgICBzbmFwc2hvdDogU25hcHNob3Q7XG4gICAgICAvKipcbiAgICAgICAqIFJhdyBib3ggcG9pbnRlciBvZiB0aGUgc2VyZGUgY2FwdHVyZSByb290IGNyZWF0ZWQgQkVGT1JFIHRoZVxuICAgICAgICogYnVuZGxlIGV2YWx1YXRlZCAoc2VlIGNhcHR1cmVTZXJkZVJvb3QpLiBUaGUgYm94IGxpdmVzIGluIHRoZVxuICAgICAgICogc25hcHNob3QncyBtZW1vcnkgaW1hZ2UgYXQgdGhpcyBvZmZzZXQ7IGV2ZXJ5IHJlc3RvcmVkIFZNXG4gICAgICAgKiByZS1hZG9wdHMgaXQgc28gc2VyZGUgaW5pdGlhbGl6YXRpb24gZXhlY3V0ZXMgbm8gZ3Vlc3QgY29kZVxuICAgICAgICogYWZ0ZXIgdXNlciBjb2RlIGhhcyBydW46IGNhcHR1cmUtYmVmb3JlLXVzZXItY29kZSBzZW1hbnRpY3MsXG4gICAgICAgKiBpZGVudGljYWwgdG8gdGhlIGZyZXNoIHBhdGguXG4gICAgICAgKi9cbiAgICAgIHNlcmRlUm9vdFB0cjogbnVtYmVyO1xuICAgIH1cbiAgfCB7IHN0YXRlOiAnaW5lbGlnaWJsZSc7IHJlYXNvbjogc3RyaW5nIH07XG5cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKTogYSBzbmFwc2hvdCBpcyBleHBlbnNpdmUgdG8gYnVpbGQgYW5kXG4vLyBpcyBrZXllZCBieSBidW5kbGUsIHNvIHBlci1jb3B5IGNhY2hlcyB3b3VsZCBidWlsZCB0aGUgc2FtZSBiYXNlbGluZSBvbmNlIHBlclxuLy8gYnVuZGxlciBsYXllciB3aGlsZSBlYWNoIGVuZm9yY2luZyBpdHMgb3duIGJvdW5kLlxuY29uc3QgYmFzZWxpbmVzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3F1aWNranNCYXNlbGluZXMnLFxuICAxLFxuICAoKSA9PiAoe1xuICAgIGJ5S2V5OiBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxCYXNlbGluZUVudHJ5Pj4oKSxcbiAgfSlcbik7XG5jb25zdCBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUyA9IDQ7XG5cbi8qKiBUZXN0LW9ubHk6IHJlc2V0IHRoZSBiYXNlbGluZSBjYWNoZSBiZXR3ZWVuIHRlc3QgY2FzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX19jbGVhckJhc2VsaW5lU25hcHNob3RDYWNoZUZvclRlc3RzKCk6IHZvaWQge1xuICBiYXNlbGluZXMuYnlLZXkuY2xlYXIoKTtcbn1cblxuLyoqIFRlc3Qtb25seTogb2JzZXJ2ZSBob3cgYSBidW5kbGUgd2FzIGNsYXNzaWZpZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX19wZWVrQmFzZWxpbmVFbnRyeUZvclRlc3RzKFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZ1xuKTogUHJvbWlzZTxCYXNlbGluZUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBiYXNlbGluZXMuYnlLZXkuZ2V0KHdvcmtmbG93Q29kZSk7XG59XG5cbi8qKlxuICogSHlkcmF0ZSBhIFZNIHdpdGggdGhlIHdvcmtmbG93IGJ1bmRsZSBhbmQgc25hcHNob3QgaXQsIGdhdGluZyBvblxuICogbW9kdWxlLXNjb3BlIG5vbmRldGVybWluaXNtIChzZWUgdGhlIHNlY3Rpb24gY29tbWVudCBhYm92ZSkuIFJldHVybnMgYW5cbiAqIGBpbmVsaWdpYmxlYCBlbnRyeSBpbnN0ZWFkIG9mIHRocm93aW5nIG9uIGV2YWwgZmFpbHVyZTogdGhlIGZyZXNoIHBhdGhcbiAqIHJlLWV2YWx1YXRlcyBhbmQgcHJvZHVjZXMgdGhlIHJlYWwsIHNvdXJjZS1tYXBwZWQgZXJyb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVCYXNlbGluZVNuYXBzaG90KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgd29ya2Zsb3dJZDogc3RyaW5nXG4pOiBQcm9taXNlPEJhc2VsaW5lRW50cnk+IHtcbiAgY29uc3QgaHlkcmF0ZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IGNsb2NrUmVhZHMgPSAwO1xuICBjb25zdCBidWRnZXQ6IEludGVycnVwdEJ1ZGdldCA9IHsgc3RhcnQ6IERhdGUubm93KCkgfTtcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgZ2V0Q29tcGlsZWRBc3NldHMoKTtcbiAgY29uc3Qgdm0gPSBhd2FpdCBRdWlja0pTLmNyZWF0ZSh7XG4gICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgbWVtb3J5TGltaXQ6IDI1NiAqIDEwMjQgKiAxMDI0LFxuICAgIGludGVycnVwdEhhbmRsZXI6IGNyZWF0ZUludGVycnVwdEhhbmRsZXIoYnVkZ2V0KSxcbiAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICB3YXNpOiAoKG1lbW9yeSkgPT4gKHtcbiAgICAgIGNsb2NrX3RpbWVfZ2V0KF9jbG9ja0lkOiBudW1iZXIsIF9wcmVjaXNpb246IGJpZ2ludCwgcmVzdWx0UHRyOiBudW1iZXIpIHtcbiAgICAgICAgY2xvY2tSZWFkcysrO1xuICAgICAgICBjb25zdCB0aW1lTnMgPSBCaWdJbnQoaHlkcmF0ZVN0YXJ0KSAqIDFfMDAwXzAwMG47XG4gICAgICAgIG5ldyBEYXRhVmlldyhtZW1vcnkuYnVmZmVyKS5zZXRCaWdVaW50NjQocmVzdWx0UHRyLCB0aW1lTnMsIHRydWUpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0sXG4gICAgfSkpIHNhdGlzZmllcyBXYXNpT3B0aW9ucyxcbiAgfSk7XG4gIHRyeSB7XG4gICAgdm0uZXZhbENvZGUoVk1fQk9PVFNUUkFQLCAnYm9vdHN0cmFwLmpzJykuZGlzcG9zZSgpO1xuXG4gICAgLy8gUGxhY2Vob2xkZXIgaG9zdCBmbnMgdW5kZXIgdGhlIFNBTUUgTkFNRVMgdGhlIHBlci1ydW4gcGhhc2UgdXNlcy5cbiAgICAvLyBUaGV5IGV4aXN0IHNvIG1vZHVsZS1zY29wZSBjb2RlIGNhbiBleGVjdXRlIGF0IGh5ZHJhdGUgdGltZSwgYW5kIHRvXG4gICAgLy8gZGV0ZWN0IHRoYXQgaXQgZGlkOiBhbnkgZHJhdyBtZWFucyB0aGUgaGVhcCB3b3VsZCBiYWtlXG4gICAgLy8gaHlkcmF0ZS1zZWVkZWQgdmFsdWVzIHRoYXQgcGVyLXJ1biBmcmVzaCBldmFsIHdvdWxkIGNvbXB1dGVcbiAgICAvLyBkaWZmZXJlbnRseS4gcnVuV29ya2Zsb3dJblZNIHJlLXJlZ2lzdGVycyBhbGwgdGhyZWUgbmFtZXMgd2l0aCB0aGVcbiAgICAvLyBydW4tc2VlZGVkIGNsb3N1cmVzIGFmdGVyIHJlc3RvcmUuXG4gICAgbGV0IGRyYXdzID0gMDtcbiAgICB7XG4gICAgICB1c2luZyByYW5kb21GbiA9IHZtLm5ld0Z1bmN0aW9uKCdyYW5kb20nLCAoKSA9PiB7XG4gICAgICAgIGRyYXdzKys7XG4gICAgICAgIHJldHVybiB2bS5uZXdOdW1iZXIoTWF0aC5yYW5kb20oKSk7XG4gICAgICB9KTtcbiAgICAgIHVzaW5nIG1hdGggPSB2bS5nbG9iYWwuZ2V0UHJvcCgnTWF0aCcpO1xuICAgICAgbWF0aC5zZXRQcm9wKCdyYW5kb20nLCByYW5kb21Gbik7XG4gICAgICB1c2luZyBuYW5vaWRGbiA9IHZtLm5ld0Z1bmN0aW9uKCdfX2dlbmVyYXRlTmFub2lkJywgKCkgPT4ge1xuICAgICAgICBkcmF3cysrO1xuICAgICAgICByZXR1cm4gdm0ubmV3U3RyaW5nKCdiYXNlbGluZS1wbGFjZWhvbGRlcicpO1xuICAgICAgfSk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fZ2VuZXJhdGVOYW5vaWQnLCBuYW5vaWRGbik7XG4gICAgICB1c2luZyB1bGlkRm4gPSB2bS5uZXdGdW5jdGlvbignX19nZW5lcmF0ZVVsaWQnLCAoKSA9PiB7XG4gICAgICAgIGRyYXdzKys7XG4gICAgICAgIHJldHVybiB2bS5uZXdTdHJpbmcoJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB9KTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX19nZW5lcmF0ZVVsaWQnLCB1bGlkRm4pO1xuICAgIH1cblxuICAgIC8vIFNlcmRlIGNhcHR1cmUgcm9vdDogY3JlYXRlZCBCRUZPUkUgdGhlIGJ1bmRsZSBldmFsdWF0ZXMsIGV4YWN0bHlcbiAgICAvLyBsaWtlIHRoZSBmcmVzaCBwYXRoJ3MgY2FwdHVyZS4gSXRzIGJveCBwb2ludGVyIHJpZGVzIHRoZVxuICAgIC8vIEJhc2VsaW5lRW50cnkgYW5kIGVhY2ggcmVzdG9yZWQgVk0gcmUtYWRvcHRzIGl0LCBzbyBzZXJkZVxuICAgIC8vIGluaXRpYWxpemF0aW9uIG5ldmVyIGV4ZWN1dGVzIGd1ZXN0IGNvZGUgYWZ0ZXIgdXNlciBjb2RlIGhhcyBydW4uXG4gICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIG1vZHVsZS1zY29wZSBpbnRyaW5zaWMgcGF0Y2hpbmcgKHBvbHlmaWxscyxcbiAgICAvLyBzdGF0ZWZ1bCB3cmFwcGVycyBhcm91bmQgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciwg4oCmKVxuICAgIC8vIEhBUk1MRVNTIG9uIHRoZSBzbmFwc2hvdCBwYXRoIHJhdGhlciB0aGFuIG1lcmVseSBkZXRlY3RhYmxlOiB0aGVcbiAgICAvLyBzZXJkZSB1c2VzIHRoZSBwcmlzdGluZSBwcmUtZXZhbCBjYXB0dXJlcyBvbiBib3RoIHBhdGhzLCBhbmQgbm9cbiAgICAvLyBwb3N0LWV2YWwgcHJvYmUgZXhpc3RzIHdob3NlIHNpZGUgZWZmZWN0cyBjb3VsZCBiYWtlIGludG8gdGhlXG4gICAgLy8gc25hcHNob3QuIFRoZSBoYW5kbGUgaXMgZGVsaWJlcmF0ZWx5IE5PVCBkaXNwb3NlZCBiZWZvcmUgdGhlXG4gICAgLy8gc25hcHNob3Q6IHRoZSBib3ggbXVzdCBzdGF5IGxpdmUgaW4gdGhlIG1lbW9yeSBpbWFnZSAodGhlXG4gICAgLy8gYmFzZWxpbmUgVk0ncyBkaXNwb3NlIGJlbG93IHRlYXJzIGRvd24gdGhlIHdob2xlIGluc3RhbmNlIHdpdGhvdXRcbiAgICAvLyBmcmVlaW5nIGluZGl2aWR1YWwgYm94ZXMpLlxuICAgIGNvbnN0IHNlcmRlUm9vdCA9IGNhcHR1cmVTZXJkZVJvb3Qodm0pO1xuXG4gICAgY2xvY2tSZWFkcyA9IDA7IC8vIG9ubHkgY291bnQgcmVhZHMgbWFkZSBieSB0aGUgYnVuZGxlIGl0c2VsZlxuICAgIHRyeSB7XG4gICAgICAvLyBXb3JrZmxvdy1pbmRlcGVuZGVudCBmaWxlbmFtZS4gU2VlIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRS5cbiAgICAgIHZtLmV2YWxDb2RlKHdvcmtmbG93Q29kZSwgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FKS5kaXNwb3NlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZXQgdGhlIGZyZXNoIHBhdGggcmUtZXZhbHVhdGUgYW5kIHN1cmZhY2UgdGhlIHJlYWwgZXJyb3Igd2l0aFxuICAgICAgLy8gcHJvcGVyIGZpbGVuYW1lIC8gc291cmNlLW1hcCBoYW5kbGluZy5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXRlOiAnaW5lbGlnaWJsZScsXG4gICAgICAgIHJlYXNvbjogJ21vZHVsZSBzY29wZSB0aHJldyBkdXJpbmcgaHlkcmF0ZScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkcmF3cyA+IDAgfHwgY2xvY2tSZWFkcyA+IDApIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgZGlzYWJsZWQgZm9yIHRoaXMgYnVuZGxlOiBtb2R1bGUgc2NvcGUgY29uc3VtZWQgbm9uZGV0ZXJtaW5pc3RpYyBpbnB1dHM7IGV2ZXJ5IGludm9jYXRpb24gd2lsbCBldmFsdWF0ZSB0aGUgYnVuZGxlIGZyZXNoJyxcbiAgICAgICAgeyB3b3JrZmxvd0lkLCBkcmF3cywgY2xvY2tSZWFkcyB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdGU6ICdpbmVsaWdpYmxlJyxcbiAgICAgICAgcmVhc29uOiBgbW9kdWxlIHNjb3BlIGNvbnN1bWVkICR7ZHJhd3N9IFBSTkcgZHJhdyhzKSBhbmQgJHtjbG9ja1JlYWRzfSBjbG9jayByZWFkKHMpYCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3QgPSB2bS5zbmFwc2hvdCgpO1xuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgcHJlcGFyZWQnLCB7XG4gICAgICB3b3JrZmxvd0lkLFxuICAgICAgaHlkcmF0ZU1zOiBEYXRlLm5vdygpIC0gaHlkcmF0ZVN0YXJ0LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogJ3JlYWR5JyxcbiAgICAgIHNuYXBzaG90LFxuICAgICAgc2VyZGVSb290UHRyOiBleHBvcnRTZXJkZVJvb3Qodm0sIHNlcmRlUm9vdCksXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB2bS5kaXNwb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWNoZWQgYmFzZWxpbmUgZW50cnkgZm9yIGEgYnVuZGxlLCBwcmVwYXJpbmcgaXQgb24gZmlyc3QgYWNjZXNzLlxuICogQ29uY3VycmVudCBmaXJzdCBpbnZvY2F0aW9ucyBzaGFyZSBvbmUgaHlkcmF0ZSB2aWEgdGhlIGNhY2hlZCBwcm9taXNlO1xuICogYSBoeWRyYXRlIHRoYXQgUkVKRUNUUyAoaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZSwgbm90IGJ1bmRsZSBldmFsLCB3aGljaFxuICogcmV0dXJucyBgaW5lbGlnaWJsZWApIGlzIGV2aWN0ZWQgc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeS5cbiAqL1xuZnVuY3Rpb24gZ2V0QmFzZWxpbmVFbnRyeShcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxCYXNlbGluZUVudHJ5PiB7XG4gIGxldCBlbnRyeSA9IGJhc2VsaW5lcy5ieUtleS5nZXQod29ya2Zsb3dDb2RlKTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmIChiYXNlbGluZXMuYnlLZXkuc2l6ZSA+PSBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gYmFzZWxpbmVzLmJ5S2V5LmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIGJhc2VsaW5lcy5ieUtleS5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gICAgZW50cnkgPSBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCh3b3JrZmxvd0NvZGUsIHdvcmtmbG93SWQpO1xuICAgIGJhc2VsaW5lcy5ieUtleS5zZXQod29ya2Zsb3dDb2RlLCBlbnRyeSk7XG4gICAgZW50cnkuY2F0Y2goKCkgPT4gYmFzZWxpbmVzLmJ5S2V5LmRlbGV0ZSh3b3JrZmxvd0NvZGUpKTtcbiAgfVxuICByZXR1cm4gZW50cnk7XG59XG5cbi8qKlxuICogQSBsaXZlIFF1aWNrSlMgd29ya2Zsb3cgaW52b2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBgcmVzdWx0YCBpc1xuICogYHN1c3BlbmRlZGAsIHRoZSBWTSBpcyBrZXB0IGFsaXZlIHNvIHRoZSBjYWxsZXIgY2FuIGZlZWQgbmV3bHkgcmVjb3JkZWRcbiAqIGV2ZW50cyAoZS5nLiB0ZXJtaW5hbCBldmVudHMgb2YgaW5saW5lLWV4ZWN1dGVkIHN0ZXBzKSBpbnRvIHRoZSBTQU1FIFZNXG4gKiB2aWEgYGNvbnRpbnVlV2l0aEV2ZW50c2AsIHJlc3VtaW5nIGV4ZWN1dGlvbiBleGFjdGx5IHdoZXJlIGl0IGxlZnQgb2ZmXG4gKiB3aXRob3V0IGEgZnJlc2gtVk0gcmUtcmVwbGF5LiBUZXJtaW5hbCByZXN1bHRzIGRpc3Bvc2UgdGhlIFZNXG4gKiBhdXRvbWF0aWNhbGx5OyBgZGlzcG9zZSgpYCBtdXN0IGJlIGNhbGxlZCB3aGVuIGFiYW5kb25pbmcgYSBzdXNwZW5kZWRcbiAqIHNlc3Npb24gKGlkZW1wb3RlbnQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24ge1xuICByZXN1bHQ6IFF1aWNrSlNSdW50aW1lUmVzdWx0O1xuICAvKipcbiAgICogUHJvY2VzcyBuZXdseSByZWNvcmRlZCBldmVudHMgaW4gdGhlIGxpdmUgVk0gYW5kIHJlLWV2YWx1YXRlIHRoZVxuICAgKiB3b3JrZmxvdyBzdGF0ZS4gT25seSB2YWxpZCB3aGlsZSB0aGUgbGFzdCByZXN1bHQgd2FzIGBzdXNwZW5kZWRgLlxuICAgKiBSZXNldHMgdGhlIFZNJ3MgaW50ZXJydXB0IGJ1ZGdldCBmb3IgdGhlIG5ldyBleGVjdXRpb24gYnVyc3QuXG4gICAqL1xuICBjb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzOiBFdmVudFtdKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD47XG4gIC8qKiBEaXNwb3NlIHRoZSBWTSBpZiBpdCBpcyBzdGlsbCBhbGl2ZS4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogUnVuIGEgd29ya2Zsb3cgaW52b2NhdGlvbiB0byBpdHMgZmlyc3Qgc2V0dGxlZCBzdGF0ZSBhbmQgZGlzcG9zZSB0aGVcbiAqIFZNLiBDb252ZW5pZW5jZSB3cmFwcGVyIG92ZXIge0BsaW5rIHN0YXJ0UXVpY2tKU1dvcmtmbG93fSBmb3IgY2FsbGVyc1xuICogKGFuZCB0ZXN0cykgdGhhdCBkb24ndCB1c2UgbGl2ZS1WTSBjb250aW51YXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5RdWlja0pTV29ya2Zsb3coXG4gIG9wdGlvbnM6IFF1aWNrSlNSdW50aW1lT3B0aW9uc1xuKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD4ge1xuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRRdWlja0pTV29ya2Zsb3cob3B0aW9ucyk7XG4gIHNlc3Npb24uZGlzcG9zZSgpO1xuICByZXR1cm4gc2Vzc2lvbi5yZXN1bHQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFF1aWNrSlNXb3JrZmxvdyhcbiAgb3B0aW9uczogUXVpY2tKU1J1bnRpbWVPcHRpb25zXG4pOiBQcm9taXNlPFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24+IHtcbiAgY29uc3QgeyB3b3JrZmxvd0NvZGUsIHdvcmtmbG93SWQsIHdvcmtmbG93UnVuLCBldmVudHMgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0ID8gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdCA6IERhdGUubm93KCk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyBQUk5HIHNlZWQsIGlkZW50aWNhbCBmb3IgRVZFUlkgaW52b2NhdGlvbiBvZiB0aGUgc2FtZVxuICAvLyBydW4uIEZ1bGwgZXZlbnQgcmVwbGF5IHJlcXVpcmVzIHRoaXM6IGVhY2ggaW52b2NhdGlvbiByZS1leGVjdXRlcyB0aGVcbiAgLy8gd29ya2Zsb3cgZnJvbSB0aGUgdG9wIGFuZCBtdXN0IHJlZ2VuZXJhdGUgdGhlIGV4YWN0IHNhbWUgY29ycmVsYXRpb25JZFxuICAvLyBzZXF1ZW5jZSBzbyB0aGF0IHBlbmRpbmcgb3BlcmF0aW9ucyByZS1jcmVhdGVkIGJ5IHJlcGxheSBtYXRjaCB0aGVcbiAgLy8gZXZlbnRzIHJlY29yZGVkIGJ5IGVhcmxpZXIgaW52b2NhdGlvbnMuIFNlcXVlbnRpYWwgb3BlcmF0aW9ucyB3aXRoaW5cbiAgLy8gb25lIGV4ZWN1dGlvbiBzdGlsbCBnZXQgZGlzdGluY3QgaWRzIGJlY2F1c2UgdGhlIFBSTkcgYWR2YW5jZXMgYXMgdGhlXG4gIC8vIHdvcmtmbG93IGRyYXdzIGZyb20gaXQuIElkZW50aWNhbCBzZWVkaW5nIGFjcm9zcyBDT05DVVJSRU5UIGludm9jYXRpb25zXG4gIC8vIG9mIHRoZSBzYW1lIHJ1biBpcyBhbHNvIGxvYWQtYmVhcmluZzogYm90aCBwcm9kdWNlIHRoZSBzYW1lIGlkcywgYW5kXG4gIC8vIHRoZSB3b3JsZCdzIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpIHVuaXF1ZW5lc3MgdHVybnMgdGhlIGR1cGxpY2F0ZVxuICAvLyBgZXZlbnRzLmNyZWF0ZWAgaW50byBhbiBFbnRpdHlDb25mbGljdEVycm9yIHRoYXQgdGhlIGVudHJ5cG9pbnRcbiAgLy8gc3dhbGxvd3MuXG4gIC8vXG4gIC8vIFRoZSBzZWVkIGlucHV0cyBNVVNUIGJlIHN0YWJsZSBhY3Jvc3MgaW52b2NhdGlvbnMuIE5vdGFibHlcbiAgLy8gYHN0YXJ0ZWRBdGAgaXMgTk9UOiB1bmRlciB0dXJibyB0aGUgZmlyc3QgaW52b2NhdGlvbiBydW5zIGFnYWluc3QgYVxuICAvLyBzeW50aGVzaXplZCBydW4gb2JqZWN0IHdob3NlIHRpbWVzdGFtcHMgZGlmZmVyIGZyb20gdGhlIGR1cmFibHlcbiAgLy8gc3RvcmVkIG9uZXMgdGhhdCBsYXRlciBpbnZvY2F0aW9ucyBsb2FkLiBNYXRjaGVzIHRoZSBub2RlOnZtXG4gIC8vIGVuZ2luZSdzIHNlZWQgKHdvcmtmbG93LnRzKS5cbiAgY29uc3Qgc2VlZCA9IFtcbiAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICBdLmpvaW4oJzonKTtcbiAgY29uc3Qgcm5nID0gc2VlZHJhbmRvbShzZWVkKTtcblxuICAvLyBTZWVkZWQgbmFub2lkIGdlbmVyYXRvcjogdXNlcyB0aGUgc2FtZSBuYW5vaWQgcGFja2FnZSBhbmQgc2VlZGVkIFBSTkdcbiAgLy8gYXMgdGhlIG5vZGU6dm0gZW5naW5lIGZvciBjb25zaXN0ZW50IHRva2VuIGdlbmVyYXRpb24uXG4gIGNvbnN0IGdlbmVyYXRlTmFub2lkID0gbmFub2lkLmN1c3RvbVJhbmRvbShuYW5vaWQudXJsQWxwaGFiZXQsIDIxLCAoc2l6ZSkgPT5cbiAgICBuZXcgVWludDhBcnJheShzaXplKS5tYXAoKCkgPT4gMjU2ICogcm5nKCkpXG4gICk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyByZXBsYXkgY2xvY2ssIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUgKHNlZVxuICAvLyB3b3JrZmxvdy50cyk6IHRoZSBpbml0aWFsIHZhbHVlIGlzIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lIHJlY292ZXJlZFxuICAvLyBmcm9tIHRoZSBVTElEIGVtYmVkZGVkIGluIGBydW5JZGAgKGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCksIGFuZFxuICAvLyBpdCBhZHZhbmNlcyB0byBlYWNoIHByb2Nlc3NlZCBldmVudCdzIGBjcmVhdGVkQXRgIGFzIHRoZSBldmVudCBsb2cgaXNcbiAgLy8gcmVwbGF5ZWQuIE1vbm90b25pYyAoTWF0aC5tYXgpIHNvIHRoZSBvdXRlciBwcm9jZXNzRXZlbnRzIHJlLXNjYW5cbiAgLy8gbG9vcCBjYW4ndCBtb3ZlIHRoZSBjbG9jayBiYWNrd2FyZHMgbWlkLWV4ZWN1dGlvbi5cbiAgbGV0IHZtTm93TXMgPVxuICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/PyAoK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCB8fCBzdGFydGVkQXQpO1xuICBjb25zdCBhZHZhbmNlQ2xvY2sgPSAobXM6IG51bWJlcikgPT4ge1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobXMpKSB2bU5vd01zID0gTWF0aC5tYXgodm1Ob3dNcywgbXMpO1xuICB9O1xuXG4gIC8vIC0tLS0gUGhhc2UgMTogc3RhdGljIGluaXRpYWxpemF0aW9uIC0tLS1cbiAgLy9cbiAgLy8gQmFzZWxpbmUtc25hcHNob3QgZmFzdCBwYXRoIChkZWZhdWx0IE9OOyBzZWUgdGhlIHNlY3Rpb24gY29tbWVudCBhdFxuICAvLyBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCk6IHJlc3RvcmUgYSBidW5kbGUtaHlkcmF0ZWQgVk0gaW5zdGVhZCBvZlxuICAvLyBib290aW5nIGZyZXNoIGFuZCByZS1ldmFsdWF0aW5nIHRoZSBidW5kbGUuIGBpbmVsaWdpYmxlYCBidW5kbGVzXG4gIC8vIChtb2R1bGUtc2NvcGUgbm9uZGV0ZXJtaW5pc20sIGV2YWwgZmFpbHVyZSkgdGFrZSB0aGUgZnJlc2ggcGF0aCB3aXRoXG4gIC8vIGlkZW50aWNhbCBzZW1hbnRpY3MuXG4gIGNvbnN0IGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0ID0geyBzdGFydDogRGF0ZS5ub3coKSB9O1xuICBsZXQgYmFzZWxpbmVTbmFwc2hvdDogU25hcHNob3QgfCB1bmRlZmluZWQ7XG4gIGxldCBiYXNlbGluZVNlcmRlUm9vdFB0cjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoaXNRdWlja0pTQmFzZWxpbmVTbmFwc2hvdEVuYWJsZWQoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGdldEJhc2VsaW5lRW50cnkod29ya2Zsb3dDb2RlLCB3b3JrZmxvd0lkKTtcbiAgICAgIGlmIChlbnRyeS5zdGF0ZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICBiYXNlbGluZVNuYXBzaG90ID0gZW50cnkuc25hcHNob3Q7XG4gICAgICAgIGJhc2VsaW5lU2VyZGVSb290UHRyID0gZW50cnkuc2VyZGVSb290UHRyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQSByZWplY3Rpb24gaGVyZSBpcyBhbiBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlIGR1cmluZyBoeWRyYXRlXG4gICAgICAvLyAoZS5nLiB2bS5zbmFwc2hvdCgpIHVuZGVyIG1lbW9yeSBwcmVzc3VyZSwgUXVpY2tKUy5jcmVhdGUgb3JcbiAgICAgIC8vIGdldENvbXBpbGVkQXNzZXRzKCkgZmFpbGluZyksIE5PVCBidW5kbGUgZXZhbCwgd2hpY2ggcmV0dXJuc1xuICAgICAgLy8gYW4gaW5lbGlnaWJsZSBlbnRyeS4gZ2V0QmFzZWxpbmVFbnRyeSBoYXMgYWxyZWFkeSBldmljdGVkIHRoZVxuICAgICAgLy8gY2FjaGVkIHByb21pc2Ugc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeS4gVGhpcyBpbnZvY2F0aW9uXG4gICAgICAvLyBtdXN0IGZhbGwgYmFjayB0byBmcmVzaCBldmFsdWF0aW9uICh3aGljaCB3b3VsZCBoYXZlIHN1Y2NlZWRlZClcbiAgICAgIC8vIHJhdGhlciB0aGFuIGZhaWwgdGhlIHdob2xlIHJ1biBmb3IgYSBzbmFwc2hvdC1vbmx5IGZhaWx1cmUgbW9kZS5cbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgaHlkcmF0ZSBmYWlsZWQ7IGZhbGxpbmcgYmFjayB0byBmcmVzaCBldmFsdWF0aW9uIGZvciB0aGlzIGludm9jYXRpb24nLFxuICAgICAgICB7IHdvcmtmbG93SWQsIGVycm9yOiBlcnIgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IHZtOiBRdWlja0pTO1xuICBpZiAoYmFzZWxpbmVTbmFwc2hvdCkge1xuICAgIGNvbnN0IGFzc2V0cyA9IGF3YWl0IGdldENvbXBpbGVkQXNzZXRzKCk7XG4gICAgdm0gPSBhd2FpdCBRdWlja0pTLnJlc3RvcmUoYmFzZWxpbmVTbmFwc2hvdCwge1xuICAgICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgICBtZW1vcnlMaW1pdDogMjU2ICogMTAyNCAqIDEwMjQsXG4gICAgICBpbnRlcnJ1cHRIYW5kbGVyOiBjcmVhdGVJbnRlcnJ1cHRIYW5kbGVyKGludGVycnVwdEJ1ZGdldCksXG4gICAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICAgIHdhc2k6IG1ha2VEZXRlcm1pbmlzdGljQ2xvY2tXYXNpKCgpID0+IHZtTm93TXMpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZtID0gYXdhaXQgaW5pdFdvcmtmbG93Vk0oKCkgPT4gdm1Ob3dNcywgaW50ZXJydXB0QnVkZ2V0KTtcbiAgfVxuXG4gIC8vIEhvc3Qtc2lkZSBzZXJkZTogY2FwdHVyZXMgdGhlIFZNJ3MgaW50cmluc2ljcyAoYm9vdHN0cmFwIGluY2x1ZGVkKVxuICAvLyBiZWZvcmUgYW55IHVzZXIgY29kZSBydW5zLiBBbGwgc2VyaWFsaXphdGlvbiBub3cgaGFwcGVucyBvbiB0aGUgaG9zdFxuICAvLyB0aHJvdWdoIGhhbmRsZXM6IG5vIHNlcmlhbGl6ZXIgY29kZSBpcyBldmFsdWF0ZWQgaW5zaWRlIHRoZSBWTS5cbiAgLy8gRnJlc2ggcGF0aDogY2FwdHVyZSBub3cgKG5vIHVzZXIgY29kZSBoYXMgcnVuLCBhcyB0aGUgYnVuZGxlIGV2YWx1YXRlc1xuICAvLyBsYXRlciBpbiB0aGUgcGVyLXJ1biBwaGFzZSkuIFNuYXBzaG90IHBhdGg6IHJlLWFkb3B0IHRoZSBjYXB0dXJlIHJvb3RcbiAgLy8gdGhlIGJhc2VsaW5lIGh5ZHJhdGUgY3JlYXRlZCBCRUZPUkUgdGhlIGJ1bmRsZSBldmFsdWF0ZWQsIHNpbmNlIHRoZSBib3hcbiAgLy8gbGl2ZXMgaW4gdGhlIHJlc3RvcmVkIG1lbW9yeSBpbWFnZSBhdCB0aGUgcmVjb3JkZWQgb2Zmc2V0LiBCb3RoIGdpdmVcbiAgLy8gdGhlIHNlcmRlIHByaXN0aW5lIGNhcHR1cmUtYmVmb3JlLXVzZXItY29kZSBpbnRyaW5zaWNzOyBuZWl0aGVyXG4gIC8vIGV4ZWN1dGVzIGd1ZXN0IGNvZGUgaGVyZS5cbiAgY29uc3Qgc2VyZGUgPVxuICAgIGJhc2VsaW5lU25hcHNob3QgJiYgYmFzZWxpbmVTZXJkZVJvb3RQdHIgIT09IHVuZGVmaW5lZFxuICAgICAgPyBjcmVhdGVRdWlja0pTU2VyZGUodm0sIGFkb3B0U2VyZGVSb290KHZtLCBiYXNlbGluZVNlcmRlUm9vdFB0cikpXG4gICAgICA6IGNyZWF0ZVF1aWNrSlNTZXJkZSh2bSk7XG5cbiAgLy8gQW55IHRocm93IGJldHdlZW4gaGVyZSBhbmQgdGhlIHRlcm1pbmFsIHBhdGhzICh3aGljaCBkaXNwb3NlIHRoZSBWTVxuICAvLyBpbnNpZGUgY2hlY2tXb3JrZmxvd1N0YXRlIC8gZXh0cmFjdEVycm9yIGJlZm9yZSBSRVRVUk5JTkcpIHdvdWxkIGxlYWtcbiAgLy8gYSBsaXZlIFF1aWNrSlMgaW5zdGFuY2UgYW5kIGl0cyBXQVNNIGxpbmVhciBtZW1vcnkgZm9yIHRoZSBsaWZldGltZVxuICAvLyBvZiB0aGUgY29tcHV0ZSBpbnN0YW5jZSwgd2hpY2ggaXMgcmV1c2VkLiBEaXNwb3NlIG9uIHRoZSB3YXkgb3V0IG9mXG4gIC8vIGFuIGV4Y2VwdGlvbmFsIGV4aXQgYW5kIHJldGhyb3cuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJ1bldvcmtmbG93SW5WTSgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgdm0uZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWxyZWFkeSBkaXNwb3NlZCBieSBhIHRlcm1pbmFsIHBhdGgsIHNvIGlnbm9yZS5cbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgLy8gLS0tLSBQaGFzZSAyOiBwZXItcnVuIGluaXRpYWxpemF0aW9uIC0tLS1cbiAgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dJblZNKCk6IFByb21pc2U8UXVpY2tKU1dvcmtmbG93U2Vzc2lvbj4ge1xuICAgIHZtLmV2YWxDb2RlKFxuICAgICAgYGdsb2JhbFRoaXMuX193b3JsZENhcGFiaWxpdGllcyA9ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucy53b3JsZENhcGFiaWxpdGllcyl9O2BcbiAgICApLmRpc3Bvc2UoKTtcblxuICAgIC8vIFNlZWRlZCBNYXRoLnJhbmRvbVxuICAgIHtcbiAgICAgIHVzaW5nIHJhbmRvbUZuID0gdm0ubmV3RnVuY3Rpb24oJ3JhbmRvbScsICgpID0+IHZtLm5ld051bWJlcihybmcoKSkpO1xuICAgICAgdXNpbmcgbWF0aCA9IHZtLmdsb2JhbC5nZXRQcm9wKCdNYXRoJyk7XG4gICAgICBtYXRoLnNldFByb3AoJ3JhbmRvbScsIHJhbmRvbUZuKTtcbiAgICB9XG5cbiAgICAvLyBTZWVkZWQgbmFub2lkIGdlbmVyYXRvclxuICAgIHtcbiAgICAgIHVzaW5nIG5hbm9pZEZuID0gdm0ubmV3RnVuY3Rpb24oJ19fZ2VuZXJhdGVOYW5vaWQnLCAoKSA9PlxuICAgICAgICB2bS5uZXdTdHJpbmcoZ2VuZXJhdGVOYW5vaWQoKSlcbiAgICAgICk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fZ2VuZXJhdGVOYW5vaWQnLCBuYW5vaWRGbik7XG4gICAgfVxuXG4gICAgLy8gSG9zdC1zaWRlIGRldGVybWluaXN0aWMgVUxJRCBnZW5lcmF0b3IgZm9yIGNvcnJlbGF0aW9uSWRzLiBVc2VzIHRoZVxuICAgIC8vIHNhbWUgYHVsaWRgIHBhY2thZ2UgYW5kIG1vbm90b25pYyBmYWN0b3J5IGFzIGJlZm9yZSwgZHJhd2luZyBmcm9tXG4gICAgLy8gdGhlIFNBTUUgc2VlZGVkIFBSTkcgaW5zdGFuY2UgYXMgdGhlIFZNJ3MgTWF0aC5yYW5kb20sIHNvIHRoZVxuICAgIC8vIGludGVybGVhdmVkIGRyYXcgc2VxdWVuY2UgKGFuZCB0aGVyZWZvcmUgZXZlcnkgY29ycmVsYXRpb25JZCkgaXNcbiAgICAvLyBieXRlLWlkZW50aWNhbCB0byB3aGF0IHRoZSBwcmV2aW91cyBpbi1WTSBVTElEIGZhY3RvcnkgcHJvZHVjZWQgZm9yXG4gICAgLy8gdGhlIHNhbWUgcnVuLiBUaGUgdGltZSBwcmVmaXggaXMgZGVyaXZlZCBmcm9tIHRoZSBydW5JZCdzIGVtYmVkZGVkXG4gICAgLy8gVUxJRCAoc3RhYmxlIGFjcm9zcyBpbnZvY2F0aW9ucyBieSBjb25zdHJ1Y3Rpb24sIHVubGlrZVxuICAgIC8vIGBzdGFydGVkQXRgLCB3aGljaCBkaWZmZXJzIGJldHdlZW4gdHVyYm8ncyBzeW50aGVzaXplZCBydW4gb2JqZWN0XG4gICAgLy8gYW5kIHRoZSBkdXJhYmx5IHN0b3JlZCBydW4pLCBzbyB0d28gY29uY3VycmVudCBpbnZvY2F0aW9ucyBvZiB0aGVcbiAgICAvLyBzYW1lIHJ1biBwcm9kdWNlIElERU5USUNBTCBjb3JyZWxhdGlvbklkcyBhbmQgdGhlIHdvcmxkJ3NcbiAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIG9uIGBldmVudHMuY3JlYXRlYCBkZWR1cHMgb25lIG9mIGVhY2ggcGFpci5cbiAgICB7XG4gICAgICBjb25zdCB1bGlkRmFjdG9yeSA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gcm5nKCkpO1xuICAgICAgY29uc3QgdWxpZFRpbWVzdGFtcCA9XG4gICAgICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/P1xuICAgICAgICAoK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCB8fCBzdGFydGVkQXQpO1xuICAgICAgdXNpbmcgdWxpZEZuID0gdm0ubmV3RnVuY3Rpb24oJ19fZ2VuZXJhdGVVbGlkJywgKCkgPT5cbiAgICAgICAgdm0ubmV3U3RyaW5nKHVsaWRGYWN0b3J5KHVsaWRUaW1lc3RhbXApKVxuICAgICAgKTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX19nZW5lcmF0ZVVsaWQnLCB1bGlkRm4pO1xuICAgIH1cblxuICAgIC8vIGBwcm9jZXNzLmVudmA6IHBhcml0eSB3aXRoIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hpY2ggZXhwb3NlcyBhIGZyb3plblxuICAgIC8vIGNvcHkgb2YgdGhlIGhvc3QgZW52ICh2bS9pbmRleC50cykuIEluamVjdGVkIHBlciBydW4gc28gdGhlIHNuYXBzaG90IG9mXG4gICAgLy8gdGhlIGVudiBpcyB0YWtlbiBhdCBpbnZvY2F0aW9uIHRpbWUsIHNhbWUgYXMgbm9kZS4gSGFuZGxlLWJhc2VkIChub1xuICAgIC8vIGd1ZXN0IHNvdXJjZSBldmFsdWF0ZWQpOiBvbiB0aGUgYmFzZWxpbmUtc25hcHNob3QgcGF0aCB0aGlzIHJ1bnNcbiAgICAvLyBhZnRlciB1c2VyIGNvZGUsIGFuZCBhIGd1ZXN0LXNvdXJjZSBpbmplY3Rpb24gd291bGQgZXhlY3V0ZSB0aHJvdWdoXG4gICAgLy8gcG90ZW50aWFsbHkgcGF0Y2hlZCBnbG9iYWxzIChKU09OLnBhcnNlLCBPYmplY3QuZnJlZXplKSwgdmlzaWJsZVxuICAgIC8vIHRvIG1vZHVsZS1zY29wZSB3cmFwcGVycyBvbmx5IG9uIHRoZSByZXN0b3JlIHBhdGgsIGRpdmVyZ2luZ1xuICAgIC8vIHJlcGxheXMuXG4gICAgc2VyZGUuaW5zdGFsbFByb2Nlc3NFbnYocHJvY2Vzcy5lbnYpO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgd29ya2Zsb3cgYnVuZGxlOiB1c2UgdGhlIHdvcmtmbG93SWQgYXMgdGhlIGV2YWwgZmlsZW5hbWVcbiAgICAvLyBzbyBRdWlja0pTIHN0YWNrIHRyYWNlcyByZWZlcmVuY2UgdGhlIHdvcmtmbG93IG5hbWUsIGVuYWJsaW5nIHNvdXJjZSBtYXBcbiAgICAvLyByZW1hcHBpbmcgYnkgcmVtYXBFcnJvclN0YWNrICh3aGljaCBtYXRjaGVzIGZyYW1lcyBieSBmaWxlbmFtZSkuXG4gICAgLy8gRXZhbHVhdGVkIGluIHRoZSBwZXItcnVuIHBoYXNlIChhZnRlciBNYXRoLnJhbmRvbSBzZWVkaW5nKSBzbyB0aGF0XG4gICAgLy8gbW9kdWxlLXNjb3BlIHVzZXIgY29kZSBkcmF3cyBmcm9tIHRoZSBzZWVkZWQgUFJORywgbWF0Y2hpbmcgdGhlXG4gICAgLy8gbm9kZTp2bSBlbmdpbmUncyByZXBsYXkgZGV0ZXJtaW5pc20uIFNraXBwZWQgb24gdGhlXG4gICAgLy8gYmFzZWxpbmUtc25hcHNob3QgcGF0aDogdGhlIHJlc3RvcmVkIGhlYXAgYWxyZWFkeSBjYXJyaWVzIHRoZVxuICAgIC8vIGV2YWx1YXRlZCBidW5kbGUsIGFuZCB0aGUgYmFzZWxpbmUgZ2F0ZSBndWFyYW50ZWVzIG1vZHVsZSBzY29wZVxuICAgIC8vIGNvbnN1bWVkIG5vIFBSTkcgZHJhd3Mgb3IgY2xvY2sgcmVhZHMsIHNvIHNraXBwaW5nIHRoZSBldmFsIGlzXG4gICAgLy8gb2JzZXJ2YXRpb25hbGx5IGlkZW50aWNhbCB0byByZS1ydW5uaW5nIGl0ICh0aGUgcnVuLXNlZWRlZCBob3N0XG4gICAgLy8gZm5zIHJlZ2lzdGVyZWQgYWJvdmUgcmViaW5kIHRoZSBTQU1FIG5hbWVzIHRoZSByZXN0b3JlZCBoZWFwJ3NcbiAgICAvLyBmdW5jdGlvbiBvYmplY3RzIGRpc3BhdGNoIHRocm91Z2gpLlxuICAgIGlmICghYmFzZWxpbmVTbmFwc2hvdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdm0uZXZhbENvZGUod29ya2Zsb3dDb2RlLCB3b3JrZmxvd0lkIHx8ICd3b3JrZmxvdy5qcycpLmRpc3Bvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gbWFrZVNldHRsZWRTZXNzaW9uKFxuICAgICAgICAgIGV4dHJhY3RFcnJvcih2bSwgZXJyLCAnV29ya2Zsb3cgZXZhbHVhdGlvbiBmYWlsZWQnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4dHJhY3Qgd29ya2Zsb3cgYXJndW1lbnRzLiBQcmVmZXIgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50OyBmYWxsIGJhY2tcbiAgICAvLyB0byB0aGUgcXVldWUgbWVzc2FnZSdzIHJ1bklucHV0IGlmIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZVxuICAgIC8vIChldmVudHVhbGx5LWNvbnNpc3RlbnQgcmVhZCBhZnRlciBzdGFydCgpKS4gRmFpbGluZyB0byBmaW5kIGlucHV0XG4gICAgLy8gZm9yIGEgZmlyc3QgaW52b2NhdGlvbiBpcyBmYXRhbDogcnVubmluZyB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAvLyB3aXRoIG5vIGFyZ3Mgd291bGQgc2lsZW50bHkgdHVybiB0eXBlZCBhcmd1bWVudHMgaW50byBgdW5kZWZpbmVkYFxuICAgIC8vIGFuZCwgZm9yIHJlY3Vyc2l2ZSB3b3JrZmxvd3MsIHByb2R1Y2UgZXhwb25lbnRpYWwgZmFuLW91dC5cbiAgICBjb25zdCBydW5DcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcpO1xuICAgIGNvbnN0IHJ1bkNyZWF0ZWRJbnB1dCA9XG4gICAgICBydW5DcmVhdGVkRXZlbnQgJiYgJ2V2ZW50RGF0YScgaW4gcnVuQ3JlYXRlZEV2ZW50XG4gICAgICAgID8gKHJ1bkNyZWF0ZWRFdmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5pbnB1dFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBydW5JbnB1dDogdW5rbm93biA9XG4gICAgICBydW5DcmVhdGVkSW5wdXQgPz8gKG9wdGlvbnMucnVuSW5wdXQ/LmlucHV0IGFzIHVua25vd24pO1xuXG4gICAgaWYgKHJ1bklucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgY29uc3QgZGVjcnlwdGVkSW5wdXQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICAgKTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogcnVuIGlucHV0IGZvcm1hdCcsIHtcbiAgICAgICAgcHJlZml4OiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkSW5wdXQuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgICBieXRlTGVuZ3RoOiBkZWNyeXB0ZWRJbnB1dC5ieXRlTGVuZ3RoLFxuICAgICAgICBzb3VyY2U6IHJ1bkNyZWF0ZWRJbnB1dCA/ICdydW5fY3JlYXRlZCcgOiAncXVldWVNZXNzYWdlLnJ1bklucHV0JyxcbiAgICAgIH0pO1xuICAgICAgLy8gQnVpbGQgdGhlIGFyZ3VtZW50IHZhbHVlIGRpcmVjdGx5IGluIHRoZSBWTSB2aWEgdGhlIGhvc3Qtc2lkZVxuICAgICAgLy8gc2VyZGUgKGd1ZXN0IGNvZGUgbmV2ZXIgc2VlcyB0aGUgd2lyZSBieXRlcykuXG4gICAgICBjb25zdCBpbnB1dEhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZElucHV0KTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX193ZGtfaW5wdXQnLCBpbnB1dEhhbmRsZSk7XG4gICAgICBpbnB1dEhhbmRsZS5kaXNwb3NlKCk7XG4gICAgfSBlbHNlIGlmIChydW5JbnB1dCA9PT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZXZlbnQgbG9nIGlzIG5vbi1lbXB0eSAod2UgZ290IHJ1bl9zdGFydGVkIG9yIHNpbWlsYXIpIGJ1dFxuICAgICAgLy8gbm8gcnVuX2NyZWF0ZWQgZXZlbnQgd2FzIGZvdW5kIGFuZCBubyBxdWV1ZS1wcm92aWRlZCBydW5JbnB1dCBpc1xuICAgICAgLy8gYXZhaWxhYmxlLiBUaGlzIGlzIHRoZSByYWNlIGNvbmRpdGlvbiBvYnNlcnZlZCBkdXJpbmcgdGhlIGZpYlxuICAgICAgLy8gaW5jaWRlbnQ6IHNpbGVudGx5IGRyb3BwaW5nIGFyZ3VtZW50cyB3b3VsZCB0dXJuIGBuYCBpbnRvXG4gICAgICAvLyBgdW5kZWZpbmVkYCBhbmQsIGZvciByZWN1cnNpdmUgd29ya2Zsb3dzLCBjYXVzZSBleHBvbmVudGlhbFxuICAgICAgLy8gZmFuLW91dC4gRmFpbCBsb3VkOiB0aGUgdGhyb3cgZXNjYXBlcyB0aGUgZW50cnlwb2ludCBpbnRvIHRoZVxuICAgICAgLy8gcmVwbGF5IGxvb3AncyBjYXRjaCBpbiBydW50aW1lLnRzICh0aGUgUXVpY2tKUyBkaXNwYXRjaCBydW5zXG4gICAgICAvLyBpbnNpZGUgdGhhdCBsb29wJ3MgdHJ5KSwgd2hpY2ggcmVjb3JkcyBydW5fZmFpbGVkLiBBIHZpc2libGVcbiAgICAgIC8vIHRlcm1pbmFsIGZhaWx1cmUgaXNcbiAgICAgIC8vIHByZWZlcnJlZCBvdmVyIHNpbGVudGx5IGV4ZWN1dGluZyB3aXRoIHVuZGVmaW5lZCBhcmd1bWVudHMuIFRoZVxuICAgICAgLy8gcXVldWUtcHJvdmlkZWQgcnVuSW5wdXQgZmFsbGJhY2sgYWJvdmUgbWFrZXMgdGhpcyBwYXRoIHJhcmUuXG4gICAgICAvLyBFbXB0eSBgZXZlbnRzYCBpcyBhbGxvd2VkIGJlY2F1c2UgdGVzdHMgdGhhdCBib290c3RyYXAgYSB3b3JrZmxvd1xuICAgICAgLy8gd2l0aCBubyBhcmd1bWVudHMgcmVseSBvbiB0aGUgb2xkIHBlcm1pc3NpdmUgYmVoYXZpb3IuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc3RhcnQgd29ya2Zsb3cgcnVuIFwiJHt3b3JrZmxvd1J1bi5ydW5JZH1cIjogbm8gcnVuX2NyZWF0ZWQgZXZlbnQgZm91bmQgYW5kIG5vIHJ1bklucHV0IGluIHRoZSBxdWV1ZSBwYXlsb2FkLCBidXQgb3RoZXIgZXZlbnRzIGFyZSBwcmVzZW50IChsaWtlbHkgYSByZWFkLWFmdGVyLXdyaXRlIHJhY2UgZHVyaW5nIHN0YXJ0KCkpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHdvcmtmbG93IGNvbnRleHQgbWV0YWRhdGEgKGZvciBnZXRXb3JrZmxvd01ldGFkYXRhKCkpLlxuICAgIC8vIE11c3QgbWF0Y2ggdGhlIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm0gZW5naW5lIHByb2R1Y2VzIChzZWVcbiAgICAvLyBwYWNrYWdlcy9jb3JlL3NyYy93b3JrZmxvdy50czogcnVuV29ya2Zsb3cg4oaSIGN0eCkgc28gdXNlciBjb2RlXG4gICAgLy8gdGhhdCBjb21wYXJlcyBgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpYCB2YWx1ZXMgYmV0d2VlbiBhIHN0ZXBcbiAgICAvLyAoc2VydmVyLXNpZGUpIGFuZCB0aGUgd29ya2Zsb3cgKFZNLXNpZGUpIHNlZXMgaWRlbnRpY2FsIG9iamVjdHMuXG4gICAge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgID8gbmV3IERhdGUoK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdClcbiAgICAgICAgICA6IG5ldyBEYXRlKCksXG4gICAgICAgIHVybDogcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTFxuICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7b3B0aW9ucy5wb3J0ID8/IDMwMDB9YCxcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFvcHRpb25zLmVuY3J5cHRpb25LZXkgfSxcbiAgICAgIH07XG4gICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0NPTlRFWFRcIildID0gJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YSl9O2AgK1xuICAgICAgICAgIGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXS53b3JrZmxvd1N0YXJ0ZWRBdCA9IG5ldyBEYXRlKCR7SlNPTi5zdHJpbmdpZnkobWV0YWRhdGEud29ya2Zsb3dTdGFydGVkQXQudG9JU09TdHJpbmcoKSl9KTtgXG4gICAgICApLmRpc3Bvc2UoKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb24uIElmIHRoZSB3b3JrZmxvdyBpc24ndCByZWdpc3RlcmVkLFxuICAgIC8vIHRocm93IGFuIGVycm9yIHRhZ2dlZCB3aXRoIGBuYW1lID0gXCJXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvclwiYFxuICAgIC8vIHNvIHRoZSBob3N0LXNpZGUgZW50cnlwb2ludCBjYW4gcmVjb25zdHJ1Y3QgYSByZWFsXG4gICAgLy8gV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IgKGEgV29ya2Zsb3dSdW50aW1lRXJyb3Igc3ViY2xhc3MgdGhhdFxuICAgIC8vIGNsYXNzaWZpZXMgYXMgUlVOVElNRV9FUlJPUikgcmF0aGVyIHRoYW4gYSBnZW5lcmljIHVzZXIgZXJyb3IuXG4gICAgLy8gU2VlIHF1aWNranMtZW50cnlwb2ludC50cydzIHJ1bl9mYWlsZWQgYnJhbmNoLlxuICAgIHRyeSB7XG4gICAgICB2bS5ldmFsQ29kZShgXG4gICAgICB2YXIgX193Zm4gPSBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MuZ2V0KCR7SlNPTi5zdHJpbmdpZnkod29ya2Zsb3dJZCl9KTtcbiAgICAgIGlmICghX193Zm4pIHtcbiAgICAgICAgdmFyIF9fd2ZuRXJyID0gbmV3IEVycm9yKFwiV29ya2Zsb3cgXFxcXFwiXCIgKyAke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93SWQpfSArIFwiXFxcXFwiIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXCIpO1xuICAgICAgICBfX3dmbkVyci5uYW1lID0gXCJXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvclwiO1xuICAgICAgICB0aHJvdyBfX3dmbkVycjtcbiAgICAgIH1cbiAgICAgIHZhciBfX2FyZ3MgPSBnbG9iYWxUaGlzLl9fd2RrX2lucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBnbG9iYWxUaGlzLl9fd2RrX2lucHV0XG4gICAgICAgIDogW107XG4gICAgICBkZWxldGUgZ2xvYmFsVGhpcy5fX3dka19pbnB1dDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShfX2FyZ3MpKSBfX2FyZ3MgPSBbX19hcmdzXTtcbiAgICAgIF9fd2ZuLmFwcGx5KG51bGwsIF9fYXJncykudGhlbihcbiAgICAgICAgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIFJBVyByZXN1bHQ7IHRoZSBob3N0IHNlcmlhbGl6ZXMgaXQgdGhyb3VnaCBhIGhhbmRsZS5cbiAgICAgICAgICAvLyBBIHNlcGFyYXRlIGRvbmUgZmxhZyBkaXN0aW5ndWlzaGVzIFwiY29tcGxldGVkIHdpdGggdW5kZWZpbmVkXCJcbiAgICAgICAgICAvLyBmcm9tIFwibm90IGNvbXBsZXRlZFwiLlxuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd0RvbmUgPSB0cnVlO1xuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBQcmVzZXJ2ZSBkaXNwbGF5IGluZm8gb24gdGhlIGhvc3Qtc2lkZSBmYWlsZWQgb2JqZWN0XG4gICAgICAgICAgLy8gKG1hdGNoZXMgdGhlIGxlZ2FjeSBob3N0LXZpc2libGUgc2hhcGUpIEFORCBrZWVwIHRoZSBSQVdcbiAgICAgICAgICAvLyB0aHJvd24gdmFsdWUgc28gdGhlIGhvc3QgY2FuIHNlcmlhbGl6ZSB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAvLyB0eXBlLWlkZW50aXR5LCBjYXVzZSBjaGFpbiwgb3Igbm9uLUVycm9yIHRocm93cyB2ZXJiYXRpbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHN0YW5kYXJkIGVycm9yIHBpcGVsaW5lLlxuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IgJiYgZXJyb3IubWVzc2FnZSAhPSBudWxsID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIHN0YWNrOiBlcnJvciAmJiBlcnJvci5zdGFjayA/IGVycm9yLnN0YWNrIDogXCJcIixcbiAgICAgICAgICAgIG5hbWU6IGVycm9yICYmIGVycm9yLm5hbWUgPyBlcnJvci5uYW1lIDogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBcIkVycm9yXCIgOiB0eXBlb2YgZXJyb3IpLFxuICAgICAgICAgICAgdmFsdWU6IGVycm9yLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgYCkuZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIG1ha2VTZXR0bGVkU2Vzc2lvbihcbiAgICAgICAgZXh0cmFjdEVycm9yKHZtLCBlcnIsICdGYWlsZWQgdG8gc3RhcnQgd29ya2Zsb3cnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGV2ZW50cyBhbmQgZHJhaW4gam9icyBpbiBhIGxvb3AuIEV2ZW50cyBtYXkgcmVzb2x2ZSBwcm9taXNlc1xuICAgIC8vIHRoYXQgdW5ibG9jayB3b3JrZmxvdyBjb2RlLCB3aGljaCB0aGVuIGNyZWF0ZXMgTkVXIHJlc29sdmVycyBmb3JcbiAgICAvLyBzdWJzZXF1ZW50IGV2ZW50cy4gUmUtcHJvY2Vzc2luZyBldmVudHMgbWF0Y2hlcyB0aGVzZSBuZXcgcmVzb2x2ZXJzXG4gICAgLy8gYWdhaW5zdCBldmVudHMgdGhhdCB3ZXJlIGFscmVhZHkgZGVsaXZlcmVkLlxuICAgIHtcbiAgICAgIGxldCBtYXhJdGVyYXRpb25zID0gMTAwO1xuICAgICAgbGV0IG1hZGVQcm9ncmVzczogYm9vbGVhbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbWFkZVByb2dyZXNzID0gYXdhaXQgcHJvY2Vzc0V2ZW50cyhcbiAgICAgICAgICB2bSxcbiAgICAgICAgICBzZXJkZSxcbiAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgYWR2YW5jZUNsb2NrLFxuICAgICAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgICBsZXQgYmF0Y2g6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGJhdGNoID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgaWYgKGJhdGNoID4gMCkgbWFkZVByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSB3aGlsZSAoYmF0Y2ggPiAwKTtcbiAgICAgIH0gd2hpbGUgKG1hZGVQcm9ncmVzcyAmJiAtLW1heEl0ZXJhdGlvbnMgPiAwKTtcbiAgICAgIGlmIChtYWRlUHJvZ3Jlc3MgJiYgbWF4SXRlcmF0aW9ucyA9PT0gMCkge1xuICAgICAgICAvLyBUaGUgZHJhaW4gbG9vcCBoaXQgaXRzIGJvdW5kIHdoaWxlIHN0aWxsIG1ha2luZyBwcm9ncmVzczpcbiAgICAgICAgLy8gcHJvY2VlZGluZyBhcyBpZiBpdCBjb252ZXJnZWQgd291bGQgcHJlc2VudCBhcyBhIG15c3RlcmlvdXNcbiAgICAgICAgLy8gc3VzcGVuc2lvbiBvciByZXBsYXkgZGl2ZXJnZW5jZS4gTWFrZSB0aGUgZ2l2aW5nLXVwIHZpc2libGUgc29cbiAgICAgICAgLy8gYSB3ZWRnZSBpcyBhdHRyaWJ1dGFibGUgdG8gdGhpcyBib3VuZCByYXRoZXIgdGhhbiBhIG15c3RlcnkuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBldmVudCBkcmFpbiBsb29wIGhpdCBpdHMgaXRlcmF0aW9uIGJvdW5kIGJlZm9yZSByZWFjaGluZyBhIGZpeGVkIHBvaW50JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0gQ2hlY2sgcmVzdWx0IC0tLS1cbiAgICByZXR1cm4gbWFrZUxpdmVTZXNzaW9uKFxuICAgICAgdm0sXG4gICAgICBzZXJkZSxcbiAgICAgIGludGVycnVwdEJ1ZGdldCxcbiAgICAgIGFkdmFuY2VDbG9jayxcbiAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICk7XG4gIH1cbn1cblxuLyoqIFNlc3Npb24gd3JhcHBlciBmb3IgYSByZXN1bHQgd2hvc2UgVk0gaXMgYWxyZWFkeSBzZXR0bGVkL2Rpc3Bvc2VkLiAqL1xuZnVuY3Rpb24gbWFrZVNldHRsZWRTZXNzaW9uKFxuICByZXN1bHQ6IFF1aWNrSlNSdW50aW1lUmVzdWx0XG4pOiBRdWlja0pTV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmV0dXJuIHtcbiAgICByZXN1bHQsXG4gICAgY29udGludWVXaXRoRXZlbnRzOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdRdWlja0pTIHdvcmtmbG93IHNlc3Npb24gaXMgc2V0dGxlZCDigJQgY29udGludWVXaXRoRXZlbnRzIGlzIG9ubHkgdmFsaWQgd2hpbGUgc3VzcGVuZGVkJ1xuICAgICAgKTtcbiAgICB9LFxuICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICB9O1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSBWTSdzIHN0YXRlIGFuZCB3cmFwIGl0IGluIGEgbGl2ZSBzZXNzaW9uLiBXaGlsZSBzdXNwZW5kZWQsXG4gKiB0aGUgVk0gc3RheXMgYWxpdmUgc28gYGNvbnRpbnVlV2l0aEV2ZW50c2AgY2FuIHJlc3VtZSBpdCBpbiBwbGFjZTtcbiAqIHRlcm1pbmFsIHN0YXRlcyBkaXNwb3NlIHRoZSBWTSBpbW1lZGlhdGVseSAoaW5zaWRlIGNoZWNrV29ya2Zsb3dTdGF0ZSkuXG4gKi9cbmZ1bmN0aW9uIG1ha2VMaXZlU2Vzc2lvbihcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0LFxuICBhZHZhbmNlQ2xvY2s6IChtczogbnVtYmVyKSA9PiB2b2lkLFxuICBlbmNyeXB0aW9uS2V5PzogRGVjcnlwdGlvbktleVxuKTogUXVpY2tKU1dvcmtmbG93U2Vzc2lvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrV29ya2Zsb3dTdGF0ZSh2bSwgc2VyZGUsIHsga2VlcEFsaXZlT25TdXNwZW5kOiB0cnVlIH0pO1xuICBsZXQgYWxpdmUgPSAhIXJlc3VsdC5zdXNwZW5kZWQ7XG5cbiAgY29uc3Qgc2Vzc2lvbjogUXVpY2tKU1dvcmtmbG93U2Vzc2lvbiA9IHtcbiAgICByZXN1bHQsXG4gICAgYXN5bmMgY29udGludWVXaXRoRXZlbnRzKFxuICAgICAgbmV3RXZlbnRzOiBFdmVudFtdXG4gICAgKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD4ge1xuICAgICAgaWYgKCFhbGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1F1aWNrSlMgd29ya2Zsb3cgc2Vzc2lvbiBpcyBub3QgYWxpdmUg4oCUIGNvbnRpbnVlV2l0aEV2ZW50cyBpcyBvbmx5IHZhbGlkIHdoaWxlIHN1c3BlbmRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEZyZXNoIGV4ZWN1dGlvbiBidXJzdDogdGhlIGludGVycnVwdCBidWRnZXQgYm91bmRzIFZNIGNvbXB1dGUsXG4gICAgICAvLyBub3Qgd2FsbCB0aW1lIHNwZW50IHdhaXRpbmcgb24gaW5saW5lIHN0ZXBzIGJldHdlZW4gYnVyc3RzLlxuICAgICAgaW50ZXJydXB0QnVkZ2V0LnN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgbGV0IG1heEl0ZXJhdGlvbnMgPSAxMDA7XG4gICAgICBsZXQgbWFkZVByb2dyZXNzOiBib29sZWFuO1xuICAgICAgZG8ge1xuICAgICAgICBtYWRlUHJvZ3Jlc3MgPSBhd2FpdCBwcm9jZXNzRXZlbnRzKFxuICAgICAgICAgIHZtLFxuICAgICAgICAgIHNlcmRlLFxuICAgICAgICAgIG5ld0V2ZW50cyxcbiAgICAgICAgICBhZHZhbmNlQ2xvY2ssXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgICBsZXQgYmF0Y2g6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGJhdGNoID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgaWYgKGJhdGNoID4gMCkgbWFkZVByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSB3aGlsZSAoYmF0Y2ggPiAwKTtcbiAgICAgIH0gd2hpbGUgKG1hZGVQcm9ncmVzcyAmJiAtLW1heEl0ZXJhdGlvbnMgPiAwKTtcblxuICAgICAgY29uc3QgbmV4dCA9IGNoZWNrV29ya2Zsb3dTdGF0ZSh2bSwgc2VyZGUsIHtcbiAgICAgICAga2VlcEFsaXZlT25TdXNwZW5kOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBpZiAoIW5leHQuc3VzcGVuZGVkKSBhbGl2ZSA9IGZhbHNlO1xuICAgICAgc2Vzc2lvbi5yZXN1bHQgPSBuZXh0O1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSxcbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgaWYgKGFsaXZlKSB7XG4gICAgICAgIGFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdm0uZGlzcG9zZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBzbyBpZ25vcmUuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc2Vzc2lvbjtcbn1cblxuLy8gLS0tLSBFdmVudCBQcm9jZXNzaW5nIC0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50cyhcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgYWR2YW5jZUNsb2NrOiAobXM6IG51bWJlcikgPT4gdm9pZCxcbiAgZW5jcnlwdGlvbktleT86IERlY3J5cHRpb25LZXlcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAvLyBBIHNlYWxlZC1sb2cgbm9vcCBvY2N1cGllcyBhIHNsb3Qgd2hvc2Ugd3JpdGVyIGRpZWQ7IHRoZSBydW4gbmV2ZXJcbiAgICAvLyBvYnNlcnZlZCBpdC4gU3RlcCBvdmVyIGl0IEJFRk9SRSB0aGUgY2xvY2sgbGluZSBiZWxvdywgbm90IGF0IHRoZVxuICAgIC8vIHN3aXRjaDogaXRzIGBjcmVhdGVkQXRgIGlzIHRoZSBzZWFsZXIncyB3YWxsIGNsb2NrIGFuZCBjYW4gcG9zdGRhdGVcbiAgICAvLyBldmVyeSByZWFsIGV2ZW50IGFyb3VuZCBpdCwgc28gYWR2YW5jaW5nIHRvIGl0IHdvdWxkIGxlYWsgdGhlIHNlYWxlcidzXG4gICAgLy8gc2NoZWR1bGUgaW50byByZXBsYXkuIEJlY2F1c2UgdGhlIGNsb2NrIGlzIG1vbm90b25pYywgZXZlcnkgbGF0ZXJcbiAgICAvLyBEYXRlLm5vdygpIGluIHRoZSBydW4gd2l0aCBpdC4gVGhhdCB3b3VsZCBtYWtlIGEgbG9nIHdob3NlIGhvbGUgd2FzXG4gICAgLy8gc2VhbGVkIHJlcGxheSBkaWZmZXJlbnRseSBmcm9tIHRoZSBzYW1lIGxvZyB3aG9zZSBob2xlIGl0cyBvd24gd3JpdGVyXG4gICAgLy8gZmlsbGVkLCBhbmQgZGlmZmVyZW50bHkgZnJvbSB0aGlzIGxvZyBvbiB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoaWNoXG4gICAgLy8gc2tpcHMgbm9vcHMgaW4gYEV2ZW50c0NvbnN1bWVyYCBiZWZvcmUgYG9uQ29uc3VtZWRFdmVudGAgZmVlZHMgdGhlXG4gICAgLy8gY2xvY2suIFNhbWUgcnVsZSwgYm90aCBlbmdpbmVzLCBvbmUgcHJlZGljYXRlLlxuICAgIGlmIChpc1NlYWxlZE5vb3BFdmVudChldmVudCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gQWR2YW5jZSB0aGUgVk0ncyBkZXRlcm1pbmlzdGljIGNsb2NrIHRvIHRoaXMgZXZlbnQncyBjcmVhdGlvbiB0aW1lXG4gICAgLy8gQkVGT1JFIHJlc29sdmluZyBhbnl0aGluZywgc28gd29ya2Zsb3cgY29kZSB1bmJsb2NrZWQgYnkgdGhpcyBldmVudFxuICAgIC8vIG9ic2VydmVzIERhdGUubm93KCkgYXQgKG9yIGFmdGVyLCBzaW5jZSB0aGUgY2xvY2sgaXMgbW9ub3RvbmljKSB0aGUgdGltZVxuICAgIC8vIHRoZSBldmVudCB3YXMgcmVjb3JkZWQuIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAvLyBgb25Db25zdW1lZEV2ZW50IOKGkiB1cGRhdGVUaW1lc3RhbXAoK2V2ZW50LmNyZWF0ZWRBdClgLlxuICAgIGFkdmFuY2VDbG9jaygrZXZlbnQuY3JlYXRlZEF0KTtcblxuICAgIGNvbnN0IGNpZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjaWQpIGNvbnRpbnVlO1xuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgaGFuZGxlcyBxdW90ZXMsIGJhY2tzbGFzaGVzIGFuZCBjb250cm9sIGNoYXJhY3RlcnM7XG4gICAgLy8gY29ycmVsYXRpb24gaWRzIGFyZSBob3N0LWdlbmVyYXRlZCBVTElEcyB0b2RheSwgYnV0IHRoZSBldmFsLXN0cmluZ1xuICAgIC8vIHNhZmV0eSBzaG91bGRuJ3QgZGVwZW5kIG9uIHRoYXQgaW52YXJpYW50IGJlaW5nIGFzc2VydGVkIG5vd2hlcmUuXG4gICAgY29uc3QgY2lkSnMgPSBKU09OLnN0cmluZ2lmeShjaWQpO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9XG4gICAgICAnZXZlbnREYXRhJyBpbiBldmVudFxuICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gTG9nIHRoZSBldmVudCBhbmQgd2hldGhlciB0aGUgcmVzb2x2ZXIgZXhpc3RzXG4gICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzoge1xuICAgICAgICBjb25zdCBoYXNSZXNvbHZlciA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoYCEhZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV1gKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByYXdPdXRwdXQgPSBldmVudERhdGE/LnJlc3VsdCA/PyBldmVudERhdGE/Lm91dHB1dDtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIC8vIERlY3J5cHQgaWYgZW5jcnlwdGVkOiB0aGUgVk0gb25seSB1bmRlcnN0YW5kcyAnZGV2bCcgZm9ybWF0XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHN0ZXAgcmVzdWx0IHJhdycsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICByYXdQcmVmaXg6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShyYXdPdXRwdXQuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgICAgICAgICByYXdCeXRlTGVuZ3RoOiByYXdPdXRwdXQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgaXNCdWZmZXI6IEJ1ZmZlci5pc0J1ZmZlcihyYXdPdXRwdXQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWRPdXRwdXQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBzdGVwIHJlc3VsdCBkZWNyeXB0ZWQnLCB7XG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNpZCxcbiAgICAgICAgICAgICAgcHJlZml4OiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkT3V0cHV0LnN1YmFycmF5KDAsIDQpKSxcbiAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogZGVjcnlwdGVkT3V0cHV0LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKGdsb2JhbFRoaXMuX190bXBfcmVzdWx0KTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3RtcF9yZXN1bHQ7YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogc3RlcCByZXN1bHQgbm9uLWJpbmFyeScsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICB0eXBlOiB0eXBlb2YgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBpc051bGw6IHJhd091dHB1dCA9PT0gbnVsbCxcbiAgICAgICAgICAgICAgaXNVbmRlZmluZWQ6IHJhd091dHB1dCA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogcmF3T3V0cHV0Py5jb25zdHJ1Y3Rvcj8ubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKCR7c2VyaWFsaXplZH0pO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIERyYWluIEFMTCBtaWNyb3Rhc2tzIGFmdGVyIHJlc29sdmVcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwcmVwYXJlZCBvdXRjb21lIHNvIHRoZSBwcm9taXNlXG4gICAgICAgICAgLy8gc2V0dGxlcyB0aGUgbW9tZW50IHRoZSBWTSBjb25zdHJ1Y3RzIGl0IChzZWUgX190ZXJtaW5hbEJ1ZmZlclxuICAgICAgICAgIC8vIGluIHRoZSBib290c3RyYXApLiBXaXRob3V0IHRoaXMsIHRoZSBsaXZlLWNvbnRpbnVhdGlvbiBwYXRoXG4gICAgICAgICAgLy8gKHdoaWNoIHNjYW5zIGVhY2ggZGVsdGEgZXhhY3RseSBvbmNlKSBkcm9wcyB0aGUgdGVybWluYWwgYW5kXG4gICAgICAgICAgLy8gdGhlIGF3YWl0IG5ldmVyIHNldHRsZXMuXG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZE91dHB1dCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdPdXRwdXQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIGEgVk0gdmFsdWUgTk9XIChzYW1lIHBhdGggYXNcbiAgICAgICAgICAgIC8vIHRoZSByZXNvbHZlciBicmFuY2ggYWJvdmUpIGFuZCBidWZmZXIgdGhlIHZhbHVlIGl0c2VsZi5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6IGdsb2JhbFRoaXMuX190bXBfYnVmIH07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2J1ZjtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6ICR7c2VyaWFsaXplZH0gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gZXZlbnREYXRhPy5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3JEYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHBhdGggKHBvc3QtIzE4NTEpOiB0aGUgc3RlcCBoYW5kbGVyIGRlaHlkcmF0ZWQgdGhlXG4gICAgICAgICAgICAvLyB0aHJvd24gdmFsdWUgdGhyb3VnaCB0aGUgZmlyc3QtY2xhc3MgZXJyb3IgcGlwZWxpbmUuIERlY3J5cHRcbiAgICAgICAgICAgIC8vIChpZiBlbmNyeXB0ZWQpIGFuZCBwYXNzIHRoZSBieXRlcyB0byB0aGUgVk0tc2lkZSBkZXNlcmlhbGl6ZXJcbiAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JrZmxvdyBjYXRjaCBzZWVzIGEgcHJvcGVybHkgdHlwZWQgRXJyb3Igc3ViY2xhc3NcbiAgICAgICAgICAgIC8vIChUeXBlRXJyb3IsIEZhdGFsRXJyb3Igd2l0aCBvcmlnaW5hbCBjYXVzZSBjaGFpbiwgZXRjLikgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYW5kIHN0YWNrIHByZXNlcnZlZC5cbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICBjb25zdCBlcnJvckhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZCk7XG4gICAgICAgICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fdG1wX2Vycm9yJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGdsb2JhbFRoaXMuX190bXBfZXJyb3IpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2Vycm9yO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExlZ2FjeSBwYXRoOiBwcmUtcGlwZWxpbmUgZXZlbnRzIHN0b3JlZCBlcnJvciBhc1xuICAgICAgICAgICAgLy8gYHsgbWVzc2FnZSwgc3RhY2ssIGNvZGUgfWAuIFJlY29uc3RydWN0IGEgRmF0YWxFcnJvciBzb1xuICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2F0Y2ggY2FuIGRldGVjdCBpdCB2aWEgRmF0YWxFcnJvci5pcygpLCBtYXRjaGluZ1xuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFYxIHN0ZXAgaGFuZGxlciBiZWhhdmlvci5cbiAgICAgICAgICAgIGNvbnN0IGlzRXJyb3JPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgZXJyb3JEYXRhID09PSAnb2JqZWN0JyAmJiBlcnJvckRhdGEgIT09IG51bGw7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgID8gKCgoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tZXNzYWdlIGFzIHN0cmluZykgPz9cbiAgICAgICAgICAgICAgICAnU3RlcCBmYWlsZWQnKVxuICAgICAgICAgICAgICA6IHR5cGVvZiBlcnJvckRhdGEgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBlcnJvckRhdGFcbiAgICAgICAgICAgICAgICA6ICdTdGVwIGZhaWxlZCc7XG4gICAgICAgICAgICBjb25zdCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgKGlzRXJyb3JPYmplY3RcbiAgICAgICAgICAgICAgICA/IChlcnJvckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnN0YWNrXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpID8/IChldmVudERhdGE/LnN0YWNrIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb25zdCBzdGFja0Fzc2lnbm1lbnQgPSBlcnJvclN0YWNrXG4gICAgICAgICAgICAgID8gYGUuc3RhY2s9JHtKU09OLnN0cmluZ2lmeShlcnJvclN0YWNrKX07YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoJHtKU09OLnN0cmluZ2lmeShtc2cpfSk7ZS5uYW1lPVwiRmF0YWxFcnJvclwiO2UuZmF0YWw9dHJ1ZTske3N0YWNrQXNzaWdubWVudH1gICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGUpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07fSkoKWBcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwcmVwYXJlZCByZWplY3Rpb24gKHNlZSB0aGVcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZCBicmFuY2ggYWJvdmUgZm9yIHRoZSByYXRpb25hbGUpLlxuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGV2ZW50RGF0YT8uZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIHRoZSBWTSBlcnJvciB2YWx1ZSBOT1cgKHNhbWVcbiAgICAgICAgICAgIC8vIHBhdGggYXMgdGhlIHJlc29sdmVyIGJyYW5jaCBhYm92ZSkgYW5kIGJ1ZmZlciBpdC5cbiAgICAgICAgICAgIGNvbnN0IGVycm9ySGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF92YWx1ZVwiLCB2YWx1ZTogZ2xvYmFsVGhpcy5fX3RtcF9idWYgfTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYnVmO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpc0Vycm9yT2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIGVycm9yRGF0YSA9PT0gJ29iamVjdCcgJiYgZXJyb3JEYXRhICE9PSBudWxsO1xuICAgICAgICAgICAgY29uc3QgbXNnID0gaXNFcnJvck9iamVjdFxuICAgICAgICAgICAgICA/ICgoKGVycm9yRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikubWVzc2FnZSBhcyBzdHJpbmcpID8/XG4gICAgICAgICAgICAgICAgJ1N0ZXAgZmFpbGVkJylcbiAgICAgICAgICAgICAgOiB0eXBlb2YgZXJyb3JEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gZXJyb3JEYXRhXG4gICAgICAgICAgICAgICAgOiAnU3RlcCBmYWlsZWQnO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgIChpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgICAgPyAoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zdGFja1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSA/PyAoZXZlbnREYXRhPy5zdGFjayBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF9lcnJvclwiLCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9LCBzdGFjazogJHtlcnJvclN0YWNrID8gSlNPTi5zdHJpbmdpZnkoZXJyb3JTdGFjaykgOiAndW5kZWZpbmVkJ30gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3YWl0X2NvbXBsZXRlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIChzZWUgc3RlcF9jb21wbGV0ZWQgYWJvdmUpLlxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlclske2NpZEpzfV0gPSB7IGtpbmQ6IFwicmVzb2x2ZV91bmRlZmluZWRcIiB9O2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2F0dHJfc2V0Jzoge1xuICAgICAgICAvLyBPbmx5IHdvcmtmbG93LXdyaXR0ZW4gYXR0cmlidXRlIGV2ZW50cyByZXNvbHZlIGEgcGVuZGluZ1xuICAgICAgICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZTsgc3RlcC9zeXN0ZW0gd3JpdGVycyBzaGFyZSBub1xuICAgICAgICAvLyBjb3JyZWxhdGlvbklkcyB3aXRoIFZNIHJlc29sdmVycywgc28gdGhlIGd1YXJkIGlzIGRlZmVuc2l2ZS5cbiAgICAgICAgY29uc3Qgd3JpdGVyID0gKGV2ZW50RGF0YT8ud3JpdGVyIGFzIHsgdHlwZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKVxuICAgICAgICAgID8udHlwZTtcbiAgICAgICAgaWYgKHdyaXRlciAhPT0gJ3dvcmtmbG93JykgYnJlYWs7XG4gICAgICAgIGNvbnN0IGhhc1Jlc29sdmVyID0gdm0uZHVtcChcbiAgICAgICAgICB2bS5ldmFsQ29kZShgISFnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XWApXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaGFzUmVzb2x2ZXIpIHtcbiAgICAgICAgICAvLyBObyByZXNvbHZlciB5ZXQsIHNvIGJ1ZmZlciAoc2VlIHN0ZXBfY29tcGxldGVkIGFib3ZlKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdW5kZWZpbmVkXCIgfTtgXG4gICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaG9va19yZWNlaXZlZCc6IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBldmVudCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgKGRlbGl2ZXJlZCBvclxuICAgICAgICAvLyBidWZmZXJlZCkgd2l0aGluIHRoaXMgaW52b2NhdGlvbi4gUHJldmVudHMgZG91YmxlLWRlbGl2ZXJ5IHdoZW5cbiAgICAgICAgLy8gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICBjb25zdCBhbHJlYWR5UHJvY2Vzc2VkID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgID8gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYCEhKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzICYmIGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSlgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoYWxyZWFkeVByb2Nlc3NlZCkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBob29rX3JlY2VpdmVkIGFscmVhZHkgcHJvY2Vzc2VkJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2lsaWVudC1yZXN1bWUgZGVkdXAgKHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIEV2ZW50c0NvbnN1bWVyIGluIHdvcmtmbG93L2hvb2sudHMpOiB0d28gaG9va19yZWNlaXZlZCByb3dzIGZvclxuICAgICAgICAvLyBPTkUgcmVzdW1lIGF0dGVtcHQgc2hhcmUgYSBjbGllbnQtbWludGVkIGByZXN1bWVJZGAgKGEgZHVwbGljYXRlXG4gICAgICAgIC8vIGNhbiBiZSBjb21taXR0ZWQgd2hlbiB0aGUgbWF0ZXJpYWxpemF0aW9uIGZhbGxiYWNrIHJhY2VzIGFcbiAgICAgICAgLy8gZGVsYXllZCBkaXJlY3Qgd3JpdGUsIHNpbmNlIGhvb2tfcmVjZWl2ZWQgaGFzIG5vIHN0b3JhZ2UgdW5pcXVlbmVzc1xuICAgICAgICAvLyBjb25zdHJhaW50KS4gRGVsaXZlciBvbmx5IHRoZSBmaXJzdC1pbi1sb2cgb2NjdXJyZW5jZS4gVGhlIHNlZW5cbiAgICAgICAgLy8gc2V0IGxpdmVzIGluIHRoZSBWTSBoZWFwIHNvIGl0IGlzIGRldGVybWluaXN0aWMgcGVyIHJlcGxheSBhbmRcbiAgICAgICAgLy8gc3Vydml2ZXMgZXZlbnQgcmUtc2NhbnMgd2l0aGluIHRoZSBpbnZvY2F0aW9uLiBFdmVudHMgd2l0aG91dCBhXG4gICAgICAgIC8vIHJlc3VtZUlkIChvbGRlciBTREtzKSBhcmUgbmV2ZXIgZGVkdXBlZC5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRvcC1sZXZlbCBldmVudC5yZXN1bWVJZCBpcyB0aGUgY2Fub25pY2FsIGxvY2F0aW9uICh0aGUgYmFja2VuZFxuICAgICAgICAgIC8vIGhvaXN0cyBpdCB0byBhIGZpcnN0LWNsYXNzIGNvbHVtbik7IHRoZSBuZXN0ZWRcbiAgICAgICAgICAvLyBldmVudERhdGEucmVzdW1lSWQgZm9ybSBpcyBhIGRlcHJlY2F0ZWQgbGVnYWN5IGZhbGxiYWNrLlxuICAgICAgICAgIC8vIE1pcnJvcnMgdGhlIG5vZGUgZW5naW5lJ3MgZGVkdXAgaW4gd29ya2Zsb3cvaG9vay50cy5cbiAgICAgICAgICBjb25zdCByZXN1bWVJZCA9XG4gICAgICAgICAgICAoZXZlbnQgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSkucmVzdW1lSWQgPz9cbiAgICAgICAgICAgIChldmVudERhdGEgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnJlc3VtZUlkO1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdW1lSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bWVJZEpzID0gSlNPTi5zdHJpbmdpZnkocmVzdW1lSWQpO1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlID0gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgPSBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgfHwge30pWyR7cmVzdW1lSWRKc31dID09PSB0cnVlYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGR1cGxpY2F0ZSBob29rX3JlY2VpdmVkIGZvciB0aGUgc2FtZSByZXN1bWUgYXR0ZW1wdCwgZHJvcHBpbmcnLFxuICAgICAgICAgICAgICAgIHsgY29ycmVsYXRpb25JZDogY2lkLCBldmVudElkOiBldmVudC5ldmVudElkLCByZXN1bWVJZCB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgICBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSA9IHRydWU7YFxuICAgICAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHNbJHtyZXN1bWVJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFib3J0IGRlbGl2ZXJ5OiBob29rX3JlY2VpdmVkIGZvciBhbiBBYm9ydENvbnRyb2xsZXIncyBzeXN0ZW1cbiAgICAgICAgLy8gaG9vayBmbGlwcyB0aGUgcmVnaXN0ZXJlZCBzaWduYWwgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSBwcm9taXNlLlxuICAgICAgICAvLyBUaGUgcGF5bG9hZCBpcyB0aGUgZGVoeWRyYXRlZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgb2JqZWN0LlxuICAgICAgICBjb25zdCBpc0Fib3J0SG9vayA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgISEoZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyAmJiBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzWyR7Y2lkSnN9XSlgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNBYm9ydEhvb2spIHtcbiAgICAgICAgICBjb25zdCByYXdBYm9ydFBheWxvYWQgPSBldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgICAgaWYgKHJhd0Fib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdBYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYWJvcnQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgdmFyIHA9Z2xvYmFsVGhpcy5fX3RtcF9hYm9ydDtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYWJvcnQ7YCArXG4gICAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19hYm9ydFNpZ25hbHNbJHtjaWRKc31dLl9zZXRBYm9ydGVkKHAmJnR5cGVvZiBwPT09XCJvYmplY3RcIj9wLnJlYXNvbjp1bmRlZmluZWQpO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFsc1ske2NpZEpzfV0uX3NldEFib3J0ZWQodW5kZWZpbmVkKTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGFib3J0IGlzIGR1cmFibHkgcmVjb3JkZWQsIHNvIGNsZWFyIHRoZSBwZW5kaW5nIG9wJ3NcbiAgICAgICAgICAvLyBhYm9ydFJlcXVlc3RlZCBtYXJrZXIgc28gdGhlIGhvc3QgZG9lc24ndCByZS1yZWNvcmQgaXQgKHRoZVxuICAgICAgICAgIC8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBjYW4gc2V0IHRoZSBmbGFnIGJlZm9yZSB0aGlzXG4gICAgICAgICAgLy8gZXZlbnQgaXMgcHJvY2Vzc2VkIHdoZW4gaXQgaGFwcGVucyBsYXRlciBpbiByZXBsYXkgb3JkZXIsXG4gICAgICAgICAgLy8gYW5kIGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBub3QgdW5pcXVlIHBlciBjb3JyZWxhdGlvbklkKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgYHZhciBwPWdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbmQoZnVuY3Rpb24ocSl7cmV0dXJuIHEuY29ycmVsYXRpb25JZD09PSR7SlNPTi5zdHJpbmdpZnkoY2lkKX0mJnEudHlwZT09PVwiaG9va1wiO30pO2AgK1xuICAgICAgICAgICAgICBgaWYocClwLmFib3J0UmVxdWVzdGVkPWZhbHNlO2AgK1xuICAgICAgICAgICAgICBgfSkoKWBcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICBpZiAoZXZlbnQuZXZlbnRJZCkge1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgPSBnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyB8fCB7fSlbJHtKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKX1dID0gdHJ1ZTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGI6IG51bWJlcjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgYiA9IHZtLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgICAgfSB3aGlsZSAoYiA+IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmF3UGF5bG9hZCA9IGV2ZW50RGF0YT8ucGF5bG9hZCA/PyBldmVudERhdGE/LnJlc3VsdDtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2tfcmVjZWl2ZWQnLCB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgaGFzUmVzb2x2ZXIsXG4gICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiByYXdQYXlsb2FkLFxuICAgICAgICAgIHBheWxvYWRJc1VpbnQ4QXJyYXk6IHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgICAgICAgIHBheWxvYWRLZXlzOlxuICAgICAgICAgICAgcmF3UGF5bG9hZCAmJiB0eXBlb2YgcmF3UGF5bG9hZCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyhyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYXNSZXNvbHZlcikge1xuICAgICAgICAgIGlmIChyYXdQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gRGVjcnlwdCBpZiBlbmNyeXB0ZWQ6IHRoZSBWTSBvbmx5IHVuZGVyc3RhbmRzICdkZXZsJyBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZFBheWxvYWQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWRIYW5kbGUgPSBzZXJkZS5kZXNlcmlhbGl6ZShkZWNyeXB0ZWRQYXlsb2FkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgcGF5bG9hZEhhbmRsZSk7XG4gICAgICAgICAgICBwYXlsb2FkSGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZShnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdCk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfcmVzdWx0O2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID1cbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dLnJlc29sdmUoJHtzZXJpYWxpemVkfSk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTWFyayB0aGlzIGV2ZW50IGFzIHByb2Nlc3NlZCBpbiB0aGUgVk0gaGVhcCB0byBwcmV2ZW50XG4gICAgICAgICAgLy8gZG91YmxlLWRlbGl2ZXJ5IHdoZW4gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzIHx8IHt9KVske0pTT04uc3RyaW5naWZ5KGV2ZW50LmV2ZW50SWQpfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwYXlsb2FkIGluIHRoZSBWTSBoZWFwLiBXaGVuXG4gICAgICAgICAgLy8gY3JlYXRlSG9va1Byb21pc2UoKSBpcyBjYWxsZWQgbGF0ZXIsIGl0IHdpbGwgZHJhaW4gdGhpcyBidWZmZXJcbiAgICAgICAgICAvLyBmaXJzdCAobWF0Y2hpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgcGF5bG9hZHNRdWV1ZSBiZWhhdmlvcikuXG4gICAgICAgICAgY29uc3QgZXZlbnRJZEpzID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKVxuICAgICAgICAgICAgOiAnbnVsbCc7XG4gICAgICAgICAgY29uc3QgYnVmZmVyQW5kVHJhY2sgPVxuICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXJbJHtjaWRKc31dID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyWyR7Y2lkSnN9XSB8fCBbXSlgICtcbiAgICAgICAgICAgIGAucHVzaCglUEFZTE9BRCUpO2AgK1xuICAgICAgICAgICAgKGV2ZW50LmV2ZW50SWRcbiAgICAgICAgICAgICAgPyBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7ZXZlbnRJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICAgOiAnJyk7XG4gICAgICAgICAgaWYgKHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAvLyBEZWNyeXB0IGlmIGVuY3J5cHRlZDogdGhlIFZNIG9ubHkgdW5kZXJzdGFuZHMgJ2RldmwnIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkUGF5bG9hZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdQYXlsb2FkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZEhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZFBheWxvYWQpO1xuICAgICAgICAgICAgdm0uc2V0UHJvcCh2bS5nbG9iYWwsICdfX3RtcF9yZXN1bHQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgLy8gTk9URTogcmVwbGFjZW1lbnQgaXMgYSBmdW5jdGlvbiBzbyBgJGAtc2VxdWVuY2VzIGluIHRoZVxuICAgICAgICAgICAgLy8gc3Vic3RpdHV0ZWQgSlMgbmV2ZXIgZ2V0IGludGVycHJldGVkIGFzIFN0cmluZy5yZXBsYWNlXG4gICAgICAgICAgICAvLyBzcGVjaWFsIHJlcGxhY2VtZW50IHBhdHRlcm5zLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgJyVQQVlMT0FEJScsXG4gICAgICAgICAgICAgICAgKCkgPT4gJ2dsb2JhbFRoaXMuX190bXBfcmVzdWx0J1xuICAgICAgICAgICAgICApICsgJ2RlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdDsnXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd1BheWxvYWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmF3UGF5bG9hZClcbiAgICAgICAgICAgICAgICA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVwbGFjZW1lbnQ6IGEgSlNPTi1zZXJpYWxpemVkIHBheWxvYWQgY2FuIGNvbnRhaW5cbiAgICAgICAgICAgIC8vIGAkJmAsIGAkJ2AsIGAkXFxgYCwgLi4uIHdoaWNoIFN0cmluZy5yZXBsYWNlIHdvdWxkIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gZXhwYW5kLCBzaWxlbnRseSBjb3JydXB0aW5nIHRoZSBpbmplY3RlZCBjb2RlLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoJyVQQVlMT0FEJScsICgpID0+IHNlcmlhbGl6ZWQpXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2NvbmZsaWN0Jzoge1xuICAgICAgICAvLyBBbm90aGVyIHdvcmtmbG93IG93bnMgdGhpcyBob29rIHRva2VuLiBQYXlsb2FkIGF3YWl0ZXJzIHJlamVjdFxuICAgICAgICAvLyB3aXRoIEhvb2tDb25mbGljdEVycm9yOyBnZXRDb25mbGljdCgpIGF3YWl0ZXJzIHJlc29sdmUgd2l0aCBhXG4gICAgICAgIC8vIFJ1biBoYW5kbGUgZm9yIHRoZSBjb25mbGljdGluZyBydW4gKHJldml2ZWQgdGhyb3VnaCB0aGUgVk0nc1xuICAgICAgICAvLyBjbGFzcyByZWdpc3RyeSBzbyBpdHMgbWV0aG9kcyBhcmUgZHVyYWJsZSBzdGVwIHByb3hpZXMpIG9yXG4gICAgICAgIC8vIHJlamVjdCB3aXRoIHRoZSBlcnJvciB3aGVuIG5vIGhhbmRsZSBjYW4gYmUgY29uc3RydWN0ZWQsXG4gICAgICAgIC8vIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBob29rLnRzIGhvb2tfY29uZmxpY3QgaGFuZGxpbmcuXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0VG9rZW4gPSAoZXZlbnREYXRhPy50b2tlbiBhcyBzdHJpbmcpID8/ICd1bmtub3duJztcbiAgICAgICAgY29uc3QgY29uZmxpY3RpbmdSdW5JZCA9IGV2ZW50RGF0YT8uY29uZmxpY3RpbmdSdW5JZCBhc1xuICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGRpZFNldHRsZSA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgIHZhciBjaWQgPSAke0pTT04uc3RyaW5naWZ5KGNpZCl9O1xuICAgICAgICAgICAgICB2YXIgdG9rZW4gPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0VG9rZW4pfTtcbiAgICAgICAgICAgICAgdmFyIGNvbmZsaWN0aW5nUnVuSWQgPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0aW5nUnVuSWQgPz8gbnVsbCl9O1xuICAgICAgICAgICAgICB2YXIgRXJyQ2xzID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXTtcbiAgICAgICAgICAgICAgdmFyIGVycjtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSBuZXcgRXJyQ2xzKHRva2VuLCBjb25mbGljdGluZ1J1bklkIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdIb29rIHRva2VuIFwiJyArIHRva2VuICsgJ1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgd29ya2Zsb3cnKTtcbiAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICdIb29rQ29uZmxpY3RFcnJvcic7XG4gICAgICAgICAgICAgICAgZXJyLnRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIGVyci5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgcnVuID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpXTtcbiAgICAgICAgICAgICAgICB2YXIgUnVuQ2xzID0gcmVnICYmIHJlZy5nZXQoJ2NsYXNzLy93b3JrZmxvdy8vUnVuJyk7XG4gICAgICAgICAgICAgICAgdmFyIGRlcyA9IFJ1bkNscyAmJiBSdW5DbHNbU3ltYm9sLmZvcignd29ya2Zsb3ctZGVzZXJpYWxpemUnKV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIHJ1biA9IGRlcy5jYWxsKFJ1bkNscywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzICYmIGdsb2JhbFRoaXMuX19ob29rc1tjaWRdO1xuICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY29uZmxpY3QgPSB7IGVycm9yOiBlcnIsIHJ1bjogcnVuIH07XG4gICAgICAgICAgICAgICAgdmFyIGdjID0gc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnM7XG4gICAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocnVuKSB7IGdjW2ldLnJlc29sdmUocnVuKTsgfSBlbHNlIHsgZ2NbaV0ucmVqZWN0KGVycik7IH1cbiAgICAgICAgICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NpZF07XG4gICAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHNldHRsZWQ7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRpZFNldHRsZSkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2NyZWF0ZWQnOlxuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgY2FzZSAnd2FpdF9jcmVhdGVkJzoge1xuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hvb2tfY3JlYXRlZCc6IHtcbiAgICAgICAgLy8gQ29uZmlybSBjcmVhdGlvbiBmb3IgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyczogcmVzb2x2ZSB0aGVtIHdpdGhcbiAgICAgICAgLy8gbnVsbCAobm8gY29uZmxpY3QpIG9uY2UgdGhlIGV2ZW50IGxvZyBwcm92ZXMgdGhlIGhvb2sgZXhpc3RzLlxuICAgICAgICBjb25zdCBzZXR0bGVkR2V0Q29uZmxpY3QgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBnbG9iYWxUaGlzLl9faG9va3MgJiYgZ2xvYmFsVGhpcy5fX2hvb2tzWyR7SlNPTi5zdHJpbmdpZnkoY2lkKX1dO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHN0YXRlLmNyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB2YXIgZ2MgPSBzdGF0ZS5nZXRDb25mbGljdFJlc29sdmVycztcbiAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYy5sZW5ndGg7IGkrKykgZ2NbaV0ucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdjLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNldHRsZWRHZXRDb25mbGljdCkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2Rpc3Bvc2VkJzoge1xuICAgICAgICAvLyBEaXNhbWJpZ3VhdGUgZnJvbSB0aGUgYGhvb2tgIHBlbmRpbmcgb3Agd2l0aCB0aGUgc2FtZVxuICAgICAgICAvLyBjb3JyZWxhdGlvbklkOiB3ZSB3YW50IHRvIG1hcmsgdGhlIGBob29rX2Rpc3Bvc2VgIGVudHJ5LlxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMsICdob29rX2Rpc3Bvc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gbWFya0NyZWF0ZWQodm06IFF1aWNrSlMsIGNpZEpzOiBzdHJpbmcsIG9wVHlwZT86IHN0cmluZyk6IHZvaWQge1xuICAvLyBgY2lkSnNgIGlzIHRoZSBKU09OLnN0cmluZ2lmeS1xdW90ZWQgY29ycmVsYXRpb24gaWQgKHNlZSBwcm9jZXNzRXZlbnRzKS5cbiAgLy8gYGhvb2tgIGFuZCBgaG9va19kaXNwb3NlYCBwZW5kaW5nIG9wcyBzaGFyZSB0aGUgc2FtZSBjb3JyZWxhdGlvbklkLFxuICAvLyBzbyB3aGVuIHByb2Nlc3NpbmcgYGhvb2tfZGlzcG9zZWRgIGV2ZW50cyB3ZSBtdXN0IGRpc2FtYmlndWF0ZSBieVxuICAvLyB0eXBlOiBvdGhlcndpc2UgYC5maW5kKClgIHJldHVybnMgdGhlIG9yaWdpbmFsIGBob29rYCBvcCBhbmQgdGhlXG4gIC8vIGBob29rX2Rpc3Bvc2VgIG9wIGlzIG5ldmVyIG1hcmtlZCwgY2F1c2luZyB0aGUgZW50cnlwb2ludCB0byBrZWVwXG4gIC8vIHJldHJ5aW5nIGEgaG9va19kaXNwb3NlZCBmb3IgYW4gYWxyZWFkeS1kZWxldGVkIGVudGl0eS5cbiAgY29uc3QgcHJlZGljYXRlID0gb3BUeXBlXG4gICAgPyBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9JiZwLnR5cGU9PT0ke0pTT04uc3RyaW5naWZ5KG9wVHlwZSl9O31gXG4gICAgOiBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9O31gO1xuICB2bS5ldmFsQ29kZShcbiAgICBgdmFyIF9fcD1nbG9iYWxUaGlzLl9fcGVuZGluZy5maW5kKCR7cHJlZGljYXRlfSk7YCArXG4gICAgICBgaWYoX19wKV9fcC5oYXNDcmVhdGVkRXZlbnQ9dHJ1ZTtgXG4gICkuZGlzcG9zZSgpO1xufVxuXG4vLyAtLS0tIFN0YXRlIENoZWNraW5nIC0tLS1cblxuLyoqXG4gKiBDb2xsZWN0IGxlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgd2hlblxuICogdGhlIHdvcmtmbG93IHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUnc1xuICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcyAod29ya2Zsb3cudHMpOiBzdGlsbC1hbGl2ZSBzeXN0ZW0gaG9va3NcbiAqIChBYm9ydENvbnRyb2xsZXIpIHdpdGhvdXQgYW4gYWJvcnQgaW4gZmxpZ2h0IGFyZSBpbXBsaWNpdGx5IGRpc3Bvc2VkIHNvXG4gKiB0aGV5IGRvbid0IGxlYWsgaG9vayByb3dzOyBvcHMgd2l0aG91dCBjcmVhdGVkIGV2ZW50cyAoZmlyZS1hbmQtZm9yZ2V0XG4gKiBhdHRyaWJ1dGVzL2hvb2tzL3N0ZXBzL3dhaXRzKSBhbmQgcGVuZGluZyBhYm9ydCByZWNvcmRpbmdzIGFyZSBzdXJmYWNlZFxuICogZm9yIHRoZSBlbnRyeXBvaW50IHRvIGZsdXNoLlxuICovXG4vKipcbiAqIFBlci1WTSBjYWNoZSBvZiBzZXJpYWxpemVkIHBlbmRpbmctb3AgZmllbGQgYnl0ZXMsIGtleWVkXG4gKiBgY29ycmVsYXRpb25JZDpmaWVsZGAuIEEgc3RlcCdzIHJhdyBpbnB1dCBpcyBpbW11dGFibGUgb25jZSBwdXNoZWQsIHNvXG4gKiBpdHMgYnl0ZXMgYXJlIGNvbXB1dGVkIG9uY2UgZXZlbiB0aG91Z2ggdGhlIG9wIGlzIHJlLWNvbGxlY3RlZCBvbiBldmVyeVxuICogc3VzcGVuc2lvbiBpdCBzdGF5cyBwZW5kaW5nIHRocm91Z2guXG4gKi9cbi8vIHBlci1jb3B5LW9rOiBrZXllZCBvbiB0aGUgVk0gaW5zdGFuY2UsIGFuZCBhIFZNIGlzIGNyZWF0ZWQgYW5kIGRyaXZlbiBieSBvbmVcbi8vIGNvcHkuIEFub3RoZXIgY29weSBob2xkcyBubyByZWZlcmVuY2UgdG8gdGhlIGtleSwgc28gYSBzaGFyZWQgbWFwIGNvdWxkIG5ldmVyXG4vLyBiZSByZWFkIGZyb20gaXQuXG5jb25zdCBwZW5kaW5nQnl0ZUNhY2hlID0gbmV3IFdlYWtNYXA8UXVpY2tKUywgTWFwPHN0cmluZywgVWludDhBcnJheT4+KCk7XG5cbmZ1bmN0aW9uIGVuc3VyZVBlbmRpbmdCeXRlQ2FjaGUodm06IFF1aWNrSlMpOiBNYXA8c3RyaW5nLCBVaW50OEFycmF5PiB7XG4gIGxldCBjYWNoZSA9IHBlbmRpbmdCeXRlQ2FjaGUuZ2V0KHZtKTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHBlbmRpbmdCeXRlQ2FjaGUuc2V0KHZtLCBjYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIFRoZSBwZW5kaW5nLW9wIGZpZWxkcyB0aGF0IGhvbGQgUkFXIGd1ZXN0IHZhbHVlcyAodGhlIGJvb3RzdHJhcCBubyBsb25nZXJcbiAqIHNlcmlhbGl6ZXMgdGhlbSBpbiB0aGUgVk0pLiBDb2xsZWN0aW9uIHByb2plY3RzIHRoZW0gb3V0IG9mIHRoZSBkdW1wZWRcbiAqIHBsYWluIG1ldGFkYXRhIGFuZCBzZXJpYWxpemVzIGVhY2ggdGhyb3VnaCBhIGhhbmRsZSB3aXRoIHRoZSBob3N0IHNlcmRlLlxuICovXG5jb25zdCBSQVdfUEVORElOR19GSUVMRFMgPSBbJ2lucHV0JywgJ21ldGFkYXRhJywgJ2Fib3J0UGF5bG9hZCddIGFzIGNvbnN0O1xuXG4vKipcbiAqIER1bXAgYSBmaWx0ZXJlZCB2aWV3IG9mIGBnbG9iYWxUaGlzLl9fcGVuZGluZ2AgdG8gaG9zdCBQZW5kaW5nT3BlcmF0aW9uXG4gKiBvYmplY3RzLCBzZXJpYWxpemluZyB0aGUgcmF3LXZhbHVlIGZpZWxkcyBob3N0LXNpZGUuIGBmaWx0ZXJFeHByYCBpcyBhXG4gKiBndWVzdCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBhcnJheSBvZiBvcHMgdG8gY29sbGVjdC5cbiAqL1xuZnVuY3Rpb24gZHVtcFBlbmRpbmdPcHMoXG4gIHZtOiBRdWlja0pTLFxuICBzZXJkZTogUXVpY2tKU1NlcmRlLFxuICBmaWx0ZXJFeHByOiBzdHJpbmcsXG4gIGJ5dGVDYWNoZT86IE1hcDxzdHJpbmcsIFVpbnQ4QXJyYXk+XG4pOiBQZW5kaW5nT3BlcmF0aW9uW10ge1xuICB1c2luZyBwcm9qZWN0ZWQgPSB2bS5ldmFsQ29kZShgKGZ1bmN0aW9uKCl7XG4gICAgdmFyIG9wcyA9ICR7ZmlsdGVyRXhwcn07XG4gICAgZ2xvYmFsVGhpcy5fX3Jhd0ZpZWxkcyA9IFtdO1xuICAgIC8vIFNldHRsZWQgb3BzIOKAlCBjcmVhdGVkLCByZXNvbHZlci1sZXNzLCBubyBhYm9ydCBpbiBmbGlnaHQg4oCUIGFyZVxuICAgIC8vIG5ldmVyIGNvbGxlY3RlZCBhZ2FpbiBieSBlaXRoZXIgdGhlIHN1c3BlbnNpb24gb3IgdGhlIGRyYWluXG4gICAgLy8gZmlsdGVyLCBzbyB0aGVpciBjYWNoZWQgYnl0ZXMgYXJlIGRlYWQgd2VpZ2h0OyBzdXJmYWNlIHRoZWlyIGNpZHNcbiAgICAvLyBzbyB0aGUgaG9zdCBjYW4gZXZpY3QgdGhlbSAoc2VlIHRoZSBieXRlLWNhY2hlIGV2aWN0aW9uIGJlbG93KS5cbiAgICB2YXIgc2V0dGxlZCA9IFtdO1xuICAgIGdsb2JhbFRoaXMuX19wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24ocCl7XG4gICAgICBpZiAocC5oYXNDcmVhdGVkRXZlbnQgJiYgIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbcC5jb3JyZWxhdGlvbklkXSAmJiAhcC5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICBzZXR0bGVkLnB1c2gocC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBzZXR0bGVkOiBzZXR0bGVkLCBvcHM6IG9wcy5tYXAoZnVuY3Rpb24ocCl7XG4gICAgICB2YXIgcSA9IHt9O1xuICAgICAgZm9yICh2YXIgayBpbiBwKSB7XG4gICAgICAgIGlmIChrID09PSAnaW5wdXQnIHx8IGsgPT09ICdtZXRhZGF0YScgfHwgayA9PT0gJ2Fib3J0UGF5bG9hZCcpIGNvbnRpbnVlO1xuICAgICAgICBxW2tdID0gcFtrXTtcbiAgICAgIH1cbiAgICAgIHZhciByYXcgPSB7fTtcbiAgICAgIFsnaW5wdXQnLCAnbWV0YWRhdGEnLCAnYWJvcnRQYXlsb2FkJ10uZm9yRWFjaChmdW5jdGlvbihmKXtcbiAgICAgICAgaWYgKHBbZl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJhd1tmXSA9IGdsb2JhbFRoaXMuX19yYXdGaWVsZHMubGVuZ3RoO1xuICAgICAgICAgIGdsb2JhbFRoaXMuX19yYXdGaWVsZHMucHVzaChwW2ZdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBxLl9fcmF3SW5kaWNlcyA9IHJhdztcbiAgICAgIHJldHVybiBxO1xuICAgIH0pIH07XG4gIH0pKClgKTtcbiAgY29uc3QgZHVtcGVkID0gdm0uZHVtcChwcm9qZWN0ZWQpIGFzIHtcbiAgICBzZXR0bGVkOiBzdHJpbmdbXTtcbiAgICBvcHM6IChQZW5kaW5nT3BlcmF0aW9uICYge1xuICAgICAgX19yYXdJbmRpY2VzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICB9KVtdO1xuICB9O1xuICBjb25zdCBwbGFpbk9wcyA9IGR1bXBlZC5vcHM7XG4gIC8vIEJ5dGUtY2FjaGUgZXZpY3Rpb246IGVudHJpZXMgZm9yIHNldHRsZWQgb3BzIGNhbiBuZXZlciBiZSByZWFkIGFnYWluXG4gIC8vIChuZWl0aGVyIGNvbGxlY3Rpb24gZmlsdGVyIG1hdGNoZXMgYSBzZXR0bGVkIG9wKSwgc28gZHJvcHBpbmcgdGhlbVxuICAvLyBib3VuZHMgdGhlIGNhY2hlIGJ5IHRoZSBMSVZFIHBlbmRpbmcgc2V0IGluc3RlYWQgb2YgZ3Jvd2luZ1xuICAvLyBtb25vdG9uaWNhbGx5IGZvciB0aGUgVk0ncyBsaWZldGltZSwgd2hpY2ggbWF0dGVycyBmb3IgdGhlIGlubGluZVxuICAvLyBsb29wJ3MgbG9uZy1saXZlZCBzZXNzaW9ucyBhbmQgc25hcHNob3QtcmVzdG9yZWQgVk1zLlxuICBpZiAoYnl0ZUNhY2hlICYmIGR1bXBlZC5zZXR0bGVkLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGNpZCBvZiBkdW1wZWQuc2V0dGxlZCkge1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBSQVdfUEVORElOR19GSUVMRFMpIHtcbiAgICAgICAgYnl0ZUNhY2hlLmRlbGV0ZShgJHtjaWR9OiR7ZmllbGR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVzaW5nIHJhd0ZpZWxkcyA9IHZtLmV2YWxDb2RlKCdnbG9iYWxUaGlzLl9fcmF3RmllbGRzJyk7XG4gIGZvciAoY29uc3Qgb3Agb2YgcGxhaW5PcHMpIHtcbiAgICBjb25zdCByYXdJbmRpY2VzID0gb3AuX19yYXdJbmRpY2VzID8/IHt9O1xuICAgIGRlbGV0ZSBvcC5fX3Jhd0luZGljZXM7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBSQVdfUEVORElOR19GSUVMRFMpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmF3SW5kaWNlc1tmaWVsZF07XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGAke29wLmNvcnJlbGF0aW9uSWR9OiR7ZmllbGR9YDtcbiAgICAgIGxldCBieXRlcyA9IGJ5dGVDYWNoZT8uZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmICghYnl0ZXMpIHtcbiAgICAgICAgdXNpbmcgdmFsdWVIYW5kbGUgPSByYXdGaWVsZHMuZ2V0UHJvcChTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBieXRlcyA9IHNlcmRlLnNlcmlhbGl6ZSh2YWx1ZUhhbmRsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEEgc3RlcCBpbnB1dCB0aGF0IHJlZnVzZXMgdG8gc2VyaWFsaXplIGlzIGEgZGV0ZXJtaW5pc3RpYyB1c2VyXG4gICAgICAgICAgLy8gZXJyb3I6IGZhaWxpbmcgdGhlIHdob2xlIGNvbGxlY3Rpb24gaGVyZSB3b3VsZCBmYWlsIHRoZSBydW5cbiAgICAgICAgICAvLyBmcm9tIHRoZSBvdXRzaWRlLCB3aGVyZSBubyB3b3JrZmxvdyBjb2RlIGNhbiBvYnNlcnZlIGl0IChhbmRcbiAgICAgICAgICAvLyB3aXRoIGEgYmFyZSBEZXZhbHVlRXJyb3IgaW5zdGVhZCBvZiB0aGUgZnJhbWVkIG1lc3NhZ2UgdGhlXG4gICAgICAgICAgLy8gbm9kZTp2bSBlbmdpbmUgcHJvZHVjZXMpLiBSZWZyYW1lIGl0IGV4YWN0bHkgbGlrZVxuICAgICAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBkb2VzIGFuZCBzdXJmYWNlIGl0IG9uIHRoZSBvcDogdGhlXG4gICAgICAgICAgLy8gZW50cnlwb2ludCBmaW5hbGl6ZXMgdGhlIHN0ZXAgYXMgc3RlcF9jcmVhdGVkICsgc3RlcF9mYWlsZWQgc29cbiAgICAgICAgICAvLyB0aGUgZmFpbHVyZSByZWplY3RzIGludG8gdGhlIHdvcmtmbG93LCBjYXRjaGFibGUuIE90aGVyIHJhd1xuICAgICAgICAgIC8vIGZpZWxkcyAoaG9vayBtZXRhZGF0YSwgYWJvcnQgcGF5bG9hZHMpIGtlZXAgdGhlIHRocm93aW5nXG4gICAgICAgICAgLy8gYmVoYXZpb3IsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIHNjb3BlLlxuICAgICAgICAgIGlmIChvcC50eXBlID09PSAnc3RlcCcgJiYgZmllbGQgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnc3RlcCBhcmd1bWVudHMnLFxuICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAob3AgYXMgUGVuZGluZ1N0ZXApLnNlcmlhbGl6YXRpb25FcnJvciA9IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIHsgaGludCwgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBieXRlQ2FjaGU/LnNldChjYWNoZUtleSwgYnl0ZXMpO1xuICAgICAgfVxuICAgICAgKG9wIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2ZpZWxkXSA9IGJ5dGVzO1xuICAgIH1cbiAgfVxuICB2bS5ldmFsQ29kZSgnZGVsZXRlIGdsb2JhbFRoaXMuX19yYXdGaWVsZHMnKS5kaXNwb3NlKCk7XG4gIHJldHVybiBwbGFpbk9wcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdERyYWluT3BlcmF0aW9ucyhcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGVcbik6IFBlbmRpbmdPcGVyYXRpb25bXSB7XG4gIC8vIFNoYXJlIHRoZSBwZXItVk0gYnl0ZSBjYWNoZSB3aXRoIHRoZSBzdXNwZW5zaW9uIHBhdGg6IGFuIG9wIHRoYXQgd2FzXG4gIC8vIHNlcmlhbGl6ZWQgZHVyaW5nIGEgc3VzcGVuc2lvbiBwYXNzIG11c3QgcmV1c2UgdGhvc2UgZXhhY3QgYnl0ZXMgYXRcbiAgLy8gdGVybWluYWwgZHJhaW4sIHNpbmNlIHJlLXNlcmlhbGl6aW5nIGNhbiBpbnZva2UgZ2V0dGVycyBhZ2FpbiBhbmQgcHJvZHVjZVxuICAvLyBhIERJRkZFUkVOVCBieXRlIHNlcXVlbmNlIGZvciB3aGF0IHRoZSBldmVudCBsb2cgdHJlYXRzIGFzIG9uZSB2YWx1ZS5cbiAgcmV0dXJuIGR1bXBQZW5kaW5nT3BzKFxuICAgIHZtLFxuICAgIHNlcmRlLFxuICAgIGAoZnVuY3Rpb24oKXtcbiAgICB2YXIgdG9EaXNwb3NlID0gW107XG4gICAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihwKXtcbiAgICAgIGlmIChwLnR5cGUgPT09IFwiaG9va1wiICYmIHAuaXNTeXN0ZW0gJiYgIXAuYWJvcnRSZXF1ZXN0ZWQgJiYgIXAuZGlzcG9zZWQpIHtcbiAgICAgICAgcC5kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIC8vIE9ubHkgZGlzcG9zZSBob29rcyB0aGF0IHdlcmUgZHVyYWJseSBjcmVhdGVkOyBhIGhvb2sgdGhhdCBuZXZlclxuICAgICAgICAvLyByZWFjaGVkIHN0b3JhZ2UgaGFzIG5vdGhpbmcgdG8gY2xlYW4gdXAuXG4gICAgICAgIGlmIChwLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgICAgIHRvRGlzcG9zZS5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaG9va19kaXNwb3NlXCIsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBoYXNDcmVhdGVkRXZlbnQ6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdG9EaXNwb3NlLmZvckVhY2goZnVuY3Rpb24oZCl7IGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goZCk7IH0pO1xuICAgIHJldHVybiBnbG9iYWxUaGlzLl9fcGVuZGluZy5maWx0ZXIoZnVuY3Rpb24ocCl7XG4gICAgICBpZiAocC5hYm9ydFJlcXVlc3RlZCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocC5oYXNDcmVhdGVkRXZlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFNraXAgc3lzdGVtIGhvb2tzIHRoYXQgd2VyZSBkaXNwb3NlZCBiZWZvcmUgZXZlciBiZWluZyBjcmVhdGVkLlxuICAgICAgaWYgKHAudHlwZSA9PT0gXCJob29rXCIgJiYgcC5kaXNwb3NlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pKClgLFxuICAgIGVuc3VyZVBlbmRpbmdCeXRlQ2FjaGUodm0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrV29ya2Zsb3dTdGF0ZShcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIG9wdHM6IHsga2VlcEFsaXZlT25TdXNwZW5kPzogYm9vbGVhbiB9ID0ge31cbik6IFF1aWNrSlNSdW50aW1lUmVzdWx0IHtcbiAgLy8gQ2hlY2sgY29tcGxldGVkOiBfX3dvcmtmbG93UmVzdWx0IGhvbGRzIHRoZSBSQVcgcmV0dXJuIHZhbHVlICh3aXRoIGFcbiAgLy8gc2VwYXJhdGUgZG9uZSBmbGFnIHNvIGB1bmRlZmluZWRgIHJlc3VsdHMgYXJlIGRpc3Rpbmd1aXNoYWJsZSk7IHRoZVxuICAvLyBob3N0IHNlcmlhbGl6ZXMgaXQgdGhyb3VnaCBhIGhhbmRsZS5cbiAge1xuICAgIHVzaW5nIGRvbmUgPSB2bS5ldmFsQ29kZSgnZ2xvYmFsVGhpcy5fX3dvcmtmbG93RG9uZSA9PT0gdHJ1ZScpO1xuICAgIGlmIChkb25lLnRvQm9vbGVhbigpKSB7XG4gICAgICB1c2luZyBoID0gdm0uZXZhbENvZGUoJ2dsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCcpO1xuICAgICAgY29uc3QgcmVzdWx0Qnl0ZXMgPSBzZXJkZS5zZXJpYWxpemUoaCk7XG4gICAgICBjb25zdCBkcmFpbk9wZXJhdGlvbnMgPSBjb2xsZWN0RHJhaW5PcGVyYXRpb25zKHZtLCBzZXJkZSk7XG4gICAgICB2bS5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wbGV0ZWQ6IHtcbiAgICAgICAgICByZXN1bHQ6IHJlc3VsdEJ5dGVzLFxuICAgICAgICAgIC4uLihkcmFpbk9wZXJhdGlvbnMubGVuZ3RoID4gMCA/IHsgZHJhaW5PcGVyYXRpb25zIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGZhaWxlZFxuICB7XG4gICAgdXNpbmcgaCA9IHZtLmV2YWxDb2RlKCdnbG9iYWxUaGlzLl9fd29ya2Zsb3dFcnJvcicpO1xuICAgIGlmICghaC5pc1VuZGVmaW5lZCkge1xuICAgICAgLy8gVGhlIGRpc3BsYXkgZmllbGRzIGFyZSBwbGFpbiBzdHJpbmdzOyB0aGUgdGhyb3duIHZhbHVlIGl0c2VsZiBpc1xuICAgICAgLy8gUkFXIGFuZCBzZXJpYWxpemVkIGhvc3Qtc2lkZSB0aHJvdWdoIGEgaGFuZGxlLlxuICAgICAgY29uc3QgZXJyb3JPYmogPSBoLmlzU3RyaW5nXG4gICAgICAgID8gKGgudG9TdHJpbmcoKSBhcyBzdHJpbmcpXG4gICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgIHVzaW5nIHBsYWluID0gdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICcoZnVuY3Rpb24oZSl7cmV0dXJuIHttZXNzYWdlOiBlLm1lc3NhZ2UsIHN0YWNrOiBlLnN0YWNrLCBuYW1lOiBlLm5hbWV9O30pKGdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yKSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdm0uZHVtcChwbGFpbikgYXMge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgICAgIHN0YWNrPzogc3RyaW5nO1xuICAgICAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgbGV0IHZhbHVlQnl0ZXM6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWguaXNTdHJpbmcpIHtcbiAgICAgICAgdXNpbmcgcmF3VmFsdWUgPSBoLmdldFByb3AoJ3ZhbHVlJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWVCeXRlcyA9IHNlcmRlLnNlcmlhbGl6ZShyYXdWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKHNlcmlhbGl6ZUVycikge1xuICAgICAgICAgIC8vIEEgdGhyb3duIHZhbHVlIHRoZSBjb2RlYyBjYW5ub3Qgc2VyaWFsaXplIG11c3Qgbm90IG1hc2sgdGhlXG4gICAgICAgICAgLy8gd29ya2Zsb3cgZmFpbHVyZSBpdHNlbGYsIHNvIGZhbGwgYmFjayB0byB0aGUgZGlzcGxheSBmaWVsZHMuXG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIHNlcmlhbGl6ZSB0aHJvd24gd29ya2Zsb3cgZXJyb3InLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICA/IHNlcmlhbGl6ZUVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICA6IFN0cmluZyhzZXJpYWxpemVFcnIpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGZhaWxlZCA9XG4gICAgICAgIHR5cGVvZiBlcnJvck9iaiA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHsgbWVzc2FnZTogZXJyb3JPYmogfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck9iai5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyb3JPYmouc3RhY2sgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBuYW1lOiBlcnJvck9iai5uYW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdmFsdWVCeXRlcyxcbiAgICAgICAgICAgIH07XG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdRdWlja0pTIHJ1bnRpbWU6IHdvcmtmbG93IGZhaWxlZCBpbiBWTScsIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBmYWlsZWQubWVzc2FnZSxcbiAgICAgICAgZXJyb3JOYW1lOiBmYWlsZWQubmFtZSxcbiAgICAgICAgZXJyb3JTdGFjazogZmFpbGVkLnN0YWNrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkcmFpbk9wZXJhdGlvbnMgPSBjb2xsZWN0RHJhaW5PcGVyYXRpb25zKHZtLCBzZXJkZSk7XG4gICAgICB2bS5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmYWlsZWQ6IHtcbiAgICAgICAgICAuLi5mYWlsZWQsXG4gICAgICAgICAgLi4uKGRyYWluT3BlcmF0aW9ucy5sZW5ndGggPiAwID8geyBkcmFpbk9wZXJhdGlvbnMgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgc3VzcGVuZGVkOiB0aGUgd29ya2Zsb3cgaXMgc3VzcGVuZGVkIGlmIHRoZXJlIGFyZSBhY3RpdmUgcmVzb2x2ZXJzXG4gIC8vIE9SIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IGhhdmVuJ3QgYmVlbiBjcmVhdGVkIHlldCAoZS5nLiBob29rcyBjcmVhdGVkXG4gIC8vIHVwZnJvbnQgYnV0IG5vdCB5ZXQgYXdhaXRlZClcbiAge1xuICAgIHVzaW5nIGggPSB2bS5ldmFsQ29kZShcbiAgICAgICdPYmplY3Qua2V5cyhnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzKS5sZW5ndGggPiAwIHx8IGdsb2JhbFRoaXMuX19wZW5kaW5nLnNvbWUoZnVuY3Rpb24ocCl7cmV0dXJuIXAuaGFzQ3JlYXRlZEV2ZW50O30pJ1xuICAgICk7XG4gICAgaWYgKHZtLmR1bXAoaCkpIHtcbiAgICAgIC8vIE9wcyB3aXRoIGFuIGFjdGl2ZSByZXNvbHZlciBvciB3aXRob3V0IGEgY3JlYXRlZCBldmVudCBhcmVcbiAgICAgIC8vIHBlbmRpbmc7IGFib3J0LXJlcXVlc3RlZCBob29rcyBhcmUgYWxzbyBzdXJmYWNlZCAoZXZlbiB3aGVuXG4gICAgICAvLyBhbHJlYWR5IGNyZWF0ZWQgYW5kIHVuYXdhaXRlZCkgc28gdGhlIGhvc3QgcmVjb3JkcyB0aGUgYWJvcnQuXG4gICAgICBjb25zdCBwZW5kaW5nT3BzID0gZHVtcFBlbmRpbmdPcHMoXG4gICAgICAgIHZtLFxuICAgICAgICBzZXJkZSxcbiAgICAgICAgYGdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4hIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbcC5jb3JyZWxhdGlvbklkXSB8fCAhcC5oYXNDcmVhdGVkRXZlbnQgfHwgcC5hYm9ydFJlcXVlc3RlZDt9KWAsXG4gICAgICAgIGVuc3VyZVBlbmRpbmdCeXRlQ2FjaGUodm0pXG4gICAgICApO1xuICAgICAgaWYgKCFvcHRzLmtlZXBBbGl2ZU9uU3VzcGVuZCkgdm0uZGlzcG9zZSgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdXNwZW5kZWQ6IHtcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcGVuZGluZ09wcyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdm0uZGlzcG9zZSgpO1xuICByZXR1cm4geyBmYWlsZWQ6IHsgbWVzc2FnZTogJ1dvcmtmbG93IGVuZGVkIGluIHVua25vd24gc3RhdGUnIH0gfTtcbn1cblxuLy8gLS0tLSBIZWxwZXJzIC0tLS1cblxuZnVuY3Rpb24gZXh0cmFjdEVycm9yKFxuICB2bTogUXVpY2tKUyxcbiAgZXJyOiB1bmtub3duLFxuICBmYWxsYmFja01lc3NhZ2U6IHN0cmluZ1xuKTogUXVpY2tKU1J1bnRpbWVSZXN1bHQge1xuICBsZXQgbWVzc2FnZSA9IGZhbGxiYWNrTWVzc2FnZTtcbiAgbGV0IHN0YWNrOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGVyciBpbnN0YW5jZW9mIEpTRXhjZXB0aW9uKSB7XG4gICAgY29uc3QgZXJyb3IgPSB2bS5kdW1wKGVyci5oYW5kbGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgICBlcnIuaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICBtZXNzYWdlID0gKGVycm9yPy5tZXNzYWdlIGFzIHN0cmluZykgPz8gZXJyLm1lc3NhZ2UgPz8gZmFsbGJhY2tNZXNzYWdlO1xuICAgIHN0YWNrID0gKGVycm9yPy5zdGFjayBhcyBzdHJpbmcpID8/IGVyci5zdGFjaztcbiAgICBuYW1lID0gKGVycm9yPy5uYW1lIGFzIHN0cmluZykgPz8gZXJyLm5hbWU7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBtZXNzYWdlID0gZXJyLm1lc3NhZ2UgPz8gZmFsbGJhY2tNZXNzYWdlO1xuICAgIHN0YWNrID0gZXJyLnN0YWNrO1xuICAgIG5hbWUgPSBlcnIubmFtZTtcbiAgfVxuXG4gIHZtLmRpc3Bvc2UoKTtcbiAgcmV0dXJuIHtcbiAgICBmYWlsZWQ6IHsgbWVzc2FnZSwgc3RhY2ssIG5hbWUgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNdXRhYmxlIGludGVycnVwdCBidWRnZXQgZm9yIGEgVk0uIFF1aWNrSlMgcG9sbHMgdGhlIGludGVycnVwdCBoYW5kbGVyXG4gKiBkdXJpbmcgSlMgZXhlY3V0aW9uOyB3aGVuIGl0IHJldHVybnMgdHJ1ZSwgZXhlY3V0aW9uIGFib3J0cy4gVGhlIGJ1ZGdldFxuICogYm91bmRzIGEgc2luZ2xlIGhvc3QtPlZNIGV4ZWN1dGlvbiBidXJzdCAoYnVuZGxlIGV2YWwgKyBldmVudFxuICogcHJvY2Vzc2luZyksIG5vdCB0b3RhbCBWTSBsaWZldGltZTogdGhlIGlubGluZS1zdGVwIGxvb3Aga2VlcHMgYSBWTVxuICogYWxpdmUgYWNyb3NzIHN0ZXAgZXhlY3V0aW9ucyB0aGF0IGNhbiBsZWdpdGltYXRlbHkgdGFrZSBtaW51dGVzLCBzbyB0aGVcbiAqIGhvc3QgcmVzZXRzIHRoZSBidWRnZXQgYmVmb3JlIGVhY2ggcmUtZW50cnkgKHNlZSByZXNldEJ1ZGdldCBjYWxscykuXG4gKlxuICogVGhlIHBlci1idXJzdCBjZWlsaW5nIGlzIHRoZSBzYW1lIGNvbmZpZ3VyYWJsZSBidWRnZXQgYXMgdGhlIG5vZGVcbiAqIGVuZ2luZSdzIFJlcGxheUJ1ZGdldCAoUkVQTEFZX1RJTUVPVVRfTVMsIGRlZmF1bHQgMjQwcyk6IGEgd29ya2Zsb3dcbiAqIHdob3NlIHJlcGxheSB0aGUgbm9kZSBlbmdpbmUgaGFuZGxlcyBmaW5lIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGhlcmVcbiAqIGJ5IGEgbG93ZXIgaGFyZGNvZGVkIGNlaWxpbmcuIFRoZSBpbnRlcnJ1cHQgZXJyb3IgZXNjYXBlc1xuICogcnVuUXVpY2tKU1dvcmtmbG93IGFuZCByZWFjaGVzIHRoZSByZXBsYXkgbG9vcCdzIGNhdGNoIGluIHJ1bnRpbWUudHMsXG4gKiB3aGljaCByZWNvcmRzIHJ1bl9mYWlsZWQuXG4gKi9cbmludGVyZmFjZSBJbnRlcnJ1cHRCdWRnZXQge1xuICBzdGFydDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRlcnJ1cHRIYW5kbGVyKGJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0KTogKCkgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBnZXRSZXBsYXlUaW1lb3V0TXMoKTtcbiAgcmV0dXJuICgpID0+IERhdGUubm93KCkgLSBidWRnZXQuc3RhcnQgPiB0aW1lb3V0O1xufVxuIl19