@workflow/core 5.0.0-beta.5 → 5.0.0-beta.50

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 (310) hide show
  1. package/dist/attribute-changes.d.ts +5 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +35 -2
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +74 -5
  7. package/dist/capture-stack.d.ts +1 -1
  8. package/dist/capture-stack.js +2 -2
  9. package/dist/class-serialization.d.ts +32 -0
  10. package/dist/class-serialization.d.ts.map +1 -1
  11. package/dist/class-serialization.js +37 -1
  12. package/dist/classify-error.d.ts +19 -3
  13. package/dist/classify-error.d.ts.map +1 -1
  14. package/dist/classify-error.js +98 -6
  15. package/dist/context-violation-error.d.ts +5 -5
  16. package/dist/context-violation-error.d.ts.map +1 -1
  17. package/dist/context-violation-error.js +8 -6
  18. package/dist/create-hook.d.ts +72 -7
  19. package/dist/create-hook.d.ts.map +1 -1
  20. package/dist/create-hook.js +1 -1
  21. package/dist/define-hook.js +2 -2
  22. package/dist/describe-error.d.ts +7 -7
  23. package/dist/describe-error.d.ts.map +1 -1
  24. package/dist/describe-error.js +97 -12
  25. package/dist/encryption.d.ts +38 -4
  26. package/dist/encryption.d.ts.map +1 -1
  27. package/dist/encryption.js +96 -14
  28. package/dist/events-consumer.d.ts +271 -0
  29. package/dist/events-consumer.d.ts.map +1 -1
  30. package/dist/events-consumer.js +646 -42
  31. package/dist/flushable-stream.d.ts +56 -1
  32. package/dist/flushable-stream.d.ts.map +1 -1
  33. package/dist/flushable-stream.js +123 -11
  34. package/dist/global.d.ts +36 -2
  35. package/dist/global.d.ts.map +1 -1
  36. package/dist/global.js +21 -6
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3 -2
  40. package/dist/log-format.d.ts +2 -2
  41. package/dist/log-format.js +7 -7
  42. package/dist/logger.d.ts +1 -0
  43. package/dist/logger.d.ts.map +1 -1
  44. package/dist/logger.js +10 -6
  45. package/dist/private.d.ts +226 -9
  46. package/dist/private.d.ts.map +1 -1
  47. package/dist/private.js +626 -7
  48. package/dist/replay-payload-cache.d.ts +64 -0
  49. package/dist/replay-payload-cache.d.ts.map +1 -0
  50. package/dist/replay-payload-cache.js +158 -0
  51. package/dist/runtime/compute-instance.d.ts +13 -0
  52. package/dist/runtime/compute-instance.d.ts.map +1 -0
  53. package/dist/runtime/compute-instance.js +14 -0
  54. package/dist/runtime/constants.d.ts +315 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +502 -16
  57. package/dist/runtime/count-step-started-events.d.ts +52 -0
  58. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  59. package/dist/runtime/count-step-started-events.js +72 -0
  60. package/dist/runtime/deployment-guard.d.ts +99 -0
  61. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  62. package/dist/runtime/deployment-guard.js +154 -0
  63. package/dist/runtime/get-port-lazy.d.ts +15 -0
  64. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  65. package/dist/runtime/get-port-lazy.js +75 -6
  66. package/dist/runtime/get-world-lazy.d.ts +5 -14
  67. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  68. package/dist/runtime/get-world-lazy.js +19 -29
  69. package/dist/runtime/helpers.d.ts +341 -29
  70. package/dist/runtime/helpers.d.ts.map +1 -1
  71. package/dist/runtime/helpers.js +559 -57
  72. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  73. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  74. package/dist/runtime/quickjs-assets.generated.js +30 -0
  75. package/dist/runtime/quickjs-entrypoint.d.ts +136 -0
  76. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  77. package/dist/runtime/quickjs-entrypoint.js +1686 -0
  78. package/dist/runtime/quickjs-runtime.d.ts +244 -0
  79. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  80. package/dist/runtime/quickjs-runtime.js +2427 -0
  81. package/dist/runtime/quickjs-serde.d.ts +107 -0
  82. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-serde.js +2159 -0
  84. package/dist/runtime/replay-budget.d.ts +97 -0
  85. package/dist/runtime/replay-budget.d.ts.map +1 -0
  86. package/dist/runtime/replay-budget.js +139 -0
  87. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  88. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  89. package/dist/runtime/replay-recovery-reporter.js +64 -0
  90. package/dist/runtime/resume-hook.d.ts +91 -8
  91. package/dist/runtime/resume-hook.d.ts.map +1 -1
  92. package/dist/runtime/resume-hook.js +512 -89
  93. package/dist/runtime/resume-latency.d.ts +150 -0
  94. package/dist/runtime/resume-latency.d.ts.map +1 -0
  95. package/dist/runtime/resume-latency.js +155 -0
  96. package/dist/runtime/run-id-time.d.ts +19 -0
  97. package/dist/runtime/run-id-time.d.ts.map +1 -0
  98. package/dist/runtime/run-id-time.js +42 -0
  99. package/dist/runtime/run.d.ts +72 -7
  100. package/dist/runtime/run.d.ts.map +1 -1
  101. package/dist/runtime/run.js +280 -53
  102. package/dist/runtime/runs.d.ts +54 -3
  103. package/dist/runtime/runs.d.ts.map +1 -1
  104. package/dist/runtime/runs.js +126 -16
  105. package/dist/runtime/start.d.ts +101 -2
  106. package/dist/runtime/start.d.ts.map +1 -1
  107. package/dist/runtime/start.js +352 -61
  108. package/dist/runtime/step-executor.d.ts +205 -5
  109. package/dist/runtime/step-executor.d.ts.map +1 -1
  110. package/dist/runtime/step-executor.js +760 -127
  111. package/dist/runtime/step-latency.d.ts +220 -0
  112. package/dist/runtime/step-latency.d.ts.map +1 -0
  113. package/dist/runtime/step-latency.js +215 -0
  114. package/dist/runtime/step-ownership.d.ts +72 -0
  115. package/dist/runtime/step-ownership.d.ts.map +1 -0
  116. package/dist/runtime/step-ownership.js +114 -0
  117. package/dist/runtime/step-single-flight.d.ts +12 -0
  118. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  119. package/dist/runtime/step-single-flight.js +75 -0
  120. package/dist/runtime/suspension-handler.d.ts +269 -7
  121. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  122. package/dist/runtime/suspension-handler.js +1253 -125
  123. package/dist/runtime/unserializable-step.d.ts +34 -0
  124. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  125. package/dist/runtime/unserializable-step.js +52 -0
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +106 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +136 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +32 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +44 -0
  141. package/dist/runtime/world-init.d.ts +17 -42
  142. package/dist/runtime/world-init.d.ts.map +1 -1
  143. package/dist/runtime/world-init.js +18 -43
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +75 -19
  147. package/dist/runtime.d.ts +10 -6
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3741 -490
  150. package/dist/sealed-box.d.ts +167 -0
  151. package/dist/sealed-box.d.ts.map +1 -0
  152. package/dist/sealed-box.js +571 -0
  153. package/dist/serialization/client.d.ts +3 -3
  154. package/dist/serialization/client.d.ts.map +1 -1
  155. package/dist/serialization/client.js +8 -4
  156. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  157. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  158. package/dist/serialization/codec-devalue-vm.js +148 -0
  159. package/dist/serialization/codec-devalue.d.ts +1 -1
  160. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  161. package/dist/serialization/codec-devalue.js +24 -6
  162. package/dist/serialization/codec.d.ts +37 -2
  163. package/dist/serialization/codec.d.ts.map +1 -1
  164. package/dist/serialization/codec.js +2 -2
  165. package/dist/serialization/compression.d.ts +105 -0
  166. package/dist/serialization/compression.d.ts.map +1 -0
  167. package/dist/serialization/compression.js +261 -0
  168. package/dist/serialization/encryption.d.ts +119 -17
  169. package/dist/serialization/encryption.d.ts.map +1 -1
  170. package/dist/serialization/encryption.js +152 -17
  171. package/dist/serialization/errors.d.ts +13 -0
  172. package/dist/serialization/errors.d.ts.map +1 -1
  173. package/dist/serialization/errors.js +20 -2
  174. package/dist/serialization/format.d.ts +6 -6
  175. package/dist/serialization/format.js +7 -7
  176. package/dist/serialization/hardened.d.ts +156 -0
  177. package/dist/serialization/hardened.d.ts.map +1 -0
  178. package/dist/serialization/hardened.js +538 -0
  179. package/dist/serialization/index.d.ts +10 -8
  180. package/dist/serialization/index.d.ts.map +1 -1
  181. package/dist/serialization/index.js +10 -8
  182. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  183. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  184. package/dist/serialization/reducers/class-vm.js +77 -0
  185. package/dist/serialization/reducers/class.d.ts.map +1 -1
  186. package/dist/serialization/reducers/class.js +11 -6
  187. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  188. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  189. package/dist/serialization/reducers/common-vm.js +616 -0
  190. package/dist/serialization/reducers/common.d.ts +1 -1
  191. package/dist/serialization/reducers/common.d.ts.map +1 -1
  192. package/dist/serialization/reducers/common.js +202 -62
  193. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  194. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  195. package/dist/serialization/reducers/step-function-vm.js +97 -0
  196. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  197. package/dist/serialization/reducers/step-function.js +25 -9
  198. package/dist/serialization/step.d.ts +4 -4
  199. package/dist/serialization/step.d.ts.map +1 -1
  200. package/dist/serialization/step.js +9 -5
  201. package/dist/serialization/types.d.ts +80 -1
  202. package/dist/serialization/types.d.ts.map +1 -1
  203. package/dist/serialization/types.js +15 -1
  204. package/dist/serialization/workflow-vm.d.ts +29 -0
  205. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  206. package/dist/serialization/workflow-vm.js +74 -0
  207. package/dist/serialization-format.d.ts +64 -8
  208. package/dist/serialization-format.d.ts.map +1 -1
  209. package/dist/serialization-format.js +225 -73
  210. package/dist/serialization.d.ts +262 -34
  211. package/dist/serialization.d.ts.map +1 -1
  212. package/dist/serialization.js +1879 -274
  213. package/dist/set-attributes.d.ts +13 -0
  214. package/dist/set-attributes.d.ts.map +1 -0
  215. package/dist/set-attributes.js +60 -0
  216. package/dist/source-map.d.ts +25 -0
  217. package/dist/source-map.d.ts.map +1 -1
  218. package/dist/source-map.js +154 -10
  219. package/dist/step/context-storage.d.ts +61 -2
  220. package/dist/step/context-storage.d.ts.map +1 -1
  221. package/dist/step/context-storage.js +7 -5
  222. package/dist/step/writable-stream.d.ts +3 -3
  223. package/dist/step/writable-stream.d.ts.map +1 -1
  224. package/dist/step/writable-stream.js +72 -9
  225. package/dist/step.d.ts.map +1 -1
  226. package/dist/step.js +148 -27
  227. package/dist/symbols.d.ts +50 -0
  228. package/dist/symbols.d.ts.map +1 -1
  229. package/dist/symbols.js +51 -1
  230. package/dist/telemetry/semantic-conventions.d.ts +397 -2
  231. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  232. package/dist/telemetry/semantic-conventions.js +297 -3
  233. package/dist/telemetry.d.ts +91 -0
  234. package/dist/telemetry.d.ts.map +1 -1
  235. package/dist/telemetry.js +244 -17
  236. package/dist/test-support/orchestrator-context.d.ts +25 -0
  237. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  238. package/dist/test-support/orchestrator-context.js +101 -0
  239. package/dist/types.d.ts +6 -0
  240. package/dist/types.d.ts.map +1 -1
  241. package/dist/types.js +23 -1
  242. package/dist/util.d.ts +0 -5
  243. package/dist/util.d.ts.map +1 -1
  244. package/dist/util.js +1 -15
  245. package/dist/version.d.ts +1 -1
  246. package/dist/version.d.ts.map +1 -1
  247. package/dist/version.js +2 -2
  248. package/dist/vm/index.d.ts.map +1 -1
  249. package/dist/vm/index.js +84 -14
  250. package/dist/vm/script-cache.d.ts +26 -0
  251. package/dist/vm/script-cache.d.ts.map +1 -0
  252. package/dist/vm/script-cache.js +131 -0
  253. package/dist/vm/uint8array-base64.js +1 -1
  254. package/dist/workflow/abort-controller.d.ts +2 -2
  255. package/dist/workflow/abort-controller.d.ts.map +1 -1
  256. package/dist/workflow/abort-controller.js +88 -21
  257. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  258. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  259. package/dist/workflow/attribute-dispatcher.js +45 -0
  260. package/dist/workflow/create-hook.d.ts.map +1 -1
  261. package/dist/workflow/create-hook.js +24 -3
  262. package/dist/workflow/get-workflow-metadata.js +2 -2
  263. package/dist/workflow/hook.d.ts.map +1 -1
  264. package/dist/workflow/hook.js +304 -47
  265. package/dist/workflow/index.d.ts +1 -0
  266. package/dist/workflow/index.d.ts.map +1 -1
  267. package/dist/workflow/index.js +2 -1
  268. package/dist/workflow/set-attributes.d.ts +68 -0
  269. package/dist/workflow/set-attributes.d.ts.map +1 -0
  270. package/dist/workflow/set-attributes.js +60 -0
  271. package/dist/workflow/sleep.d.ts.map +1 -1
  272. package/dist/workflow/sleep.js +58 -12
  273. package/dist/workflow/world-init-stub.d.ts +3 -3
  274. package/dist/workflow/world-init-stub.js +4 -4
  275. package/dist/workflow.d.ts +95 -3
  276. package/dist/workflow.d.ts.map +1 -1
  277. package/dist/workflow.js +895 -561
  278. package/docs/api-reference/create-hook.mdx +89 -10
  279. package/docs/api-reference/create-webhook.mdx +16 -15
  280. package/docs/api-reference/define-hook.mdx +35 -33
  281. package/docs/api-reference/fatal-error.mdx +30 -8
  282. package/docs/api-reference/fetch.mdx +14 -10
  283. package/docs/api-reference/get-step-metadata.mdx +2 -2
  284. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  285. package/docs/api-reference/get-writable.mdx +7 -7
  286. package/docs/api-reference/index.mdx +4 -1
  287. package/docs/api-reference/retryable-error.mdx +1 -1
  288. package/docs/api-reference/set-attributes.mdx +61 -0
  289. package/docs/api-reference/sleep.mdx +4 -4
  290. package/docs/foundations/cancellation.mdx +31 -32
  291. package/docs/foundations/errors-and-retries.mdx +42 -11
  292. package/docs/foundations/hooks.mdx +64 -35
  293. package/docs/foundations/idempotency.mdx +244 -12
  294. package/docs/foundations/index.mdx +1 -23
  295. package/docs/foundations/meta.json +2 -1
  296. package/docs/foundations/serialization.mdx +21 -22
  297. package/docs/foundations/starting-workflows.mdx +106 -30
  298. package/docs/foundations/streaming.mdx +107 -59
  299. package/docs/foundations/versioning.mdx +263 -0
  300. package/docs/foundations/workflows-and-steps.mdx +9 -9
  301. package/docs/how-it-works/cancellation.mdx +63 -63
  302. package/docs/how-it-works/code-transform.mdx +83 -67
  303. package/docs/how-it-works/encryption.mdx +30 -26
  304. package/docs/how-it-works/event-sourcing.mdx +98 -34
  305. package/docs/how-it-works/framework-integrations.mdx +96 -337
  306. package/docs/how-it-works/understanding-directives.mdx +22 -22
  307. package/package.json +24 -15
  308. package/dist/runtime/step-handler.d.ts +0 -2
  309. package/dist/runtime/step-handler.d.ts.map +0 -1
  310. package/dist/runtime/step-handler.js +0 -776
@@ -1,5 +1,59 @@
1
1
  import type * as api from '@opentelemetry/api';
2
2
  import type { Span, SpanKind, SpanOptions } from '@opentelemetry/api';
3
+ import { WorkflowSuspension } from './global.js';
4
+ /**
5
+ * Controls how workflow/step queue-handler spans relate to the run-origin
6
+ * trace context carried in queue messages:
7
+ *
8
+ * - `'linked'` (default): each invocation starts a NEW root trace; the
9
+ * run-origin context (and the incoming delivery context) are attached as
10
+ * span links. This keeps traces bounded per invocation instead of
11
+ * stitching a long-lived run into one giant trace.
12
+ * - `'continuous'`: the restored run-origin context becomes the parent of
13
+ * the invocation span (legacy behavior), producing a single trace that
14
+ * spans the entire run.
15
+ */
16
+ export type WorkflowTraceMode = 'linked' | 'continuous';
17
+ /**
18
+ * Resolves the active trace mode from the `WORKFLOW_TRACE_MODE` env var.
19
+ * Defaults to `'linked'`; any value other than `'continuous'` selects it.
20
+ * Unrecognized non-empty values (e.g. typos like `continous`) emit a
21
+ * one-time warning so silent fallback to `linked` is at least visible.
22
+ */
23
+ export declare function getWorkflowTraceMode(): WorkflowTraceMode;
24
+ /**
25
+ * Returns whether a serialized trace carrier is usable, i.e. present and
26
+ * non-empty. `serializeTraceCarrier()` returns `{}` when no OTEL SDK is
27
+ * registered or no span is active, and `start()` always attaches the
28
+ * carrier to the first queue message, so an empty carrier must be treated
29
+ * the same as an absent one wherever the trace-mode logic branches.
30
+ */
31
+ export declare function isUsableTraceCarrier(carrier: Record<string, string> | undefined): carrier is Record<string, string>;
32
+ /**
33
+ * Returns the trace carrier to attach to messages the current invocation
34
+ * enqueues. In `linked` mode the ORIGINAL run-origin carrier is forwarded
35
+ * unchanged (when usable) so every future invocation links back to the same
36
+ * origin; otherwise (`continuous` mode, or no usable incoming carrier)
37
+ * the current (active) context is serialized, so the trace keeps chaining
38
+ * (continuous) or the first instrumented invocation becomes the de-facto
39
+ * origin (linked).
40
+ */
41
+ export declare function getNextTraceCarrier(traceMode: WorkflowTraceMode, incomingCarrier: Record<string, string> | undefined): Promise<Record<string, string>>;
42
+ /**
43
+ * Builds the span links for a queue-delivered invocation span
44
+ * (`workflow.execute` / `step.execute`):
45
+ *
46
+ * - In `linked` mode the invocation span is a CHILD of the local delivery
47
+ * (flow-route) context, so the only link is to the run-origin context
48
+ * from the message's trace carrier, connecting this bounded per-invocation
49
+ * trace back to where the run was started. The run-origin context is a
50
+ * link, never a parent, and re-enqueues forward the original carrier
51
+ * unchanged, so the whole run is never stitched into one giant trace.
52
+ * The link is skipped when the carrier is absent, empty, or invalid.
53
+ * - In `continuous` mode the run-origin context is restored as the parent
54
+ * instead, and the link points at the incoming delivery context.
55
+ */
56
+ export declare function buildInvocationSpanLinks(traceMode: WorkflowTraceMode, incomingCarrier: Record<string, string> | undefined): Promise<api.Link[] | undefined>;
3
57
  /**
4
58
  * Serializes the current trace context into a format that can be passed through queues
5
59
  * @returns A record of strings representing the trace context
@@ -19,6 +73,36 @@ export declare function deserializeTraceCarrier(traceCarrier: Record<string, str
19
73
  */
20
74
  export declare function withTraceContext<T>(traceCarrier: Record<string, string> | undefined, fn: () => Promise<T>): Promise<T>;
21
75
  export declare function trace<T>(spanName: string, ...args: [fn: (span?: Span) => Promise<T>] | [opts: SpanOptions, fn: (span?: Span) => Promise<T>]): Promise<T>;
76
+ /** Starts a child span without installing it as the active context. */
77
+ export declare function startTraceSpan(spanName: string): Promise<{
78
+ end: () => void;
79
+ fail: (error: unknown) => void;
80
+ }>;
81
+ /** Bind work to the currently active span even when it starts from a child. */
82
+ export declare function bindActiveTraceContext<Args extends unknown[], Result>(fn: (...args: Args) => Result): Promise<(...args: Args) => Result>;
83
+ /** Keeps a parked workflow's ambient trace context aligned with each resume. */
84
+ export declare function createRefreshableTraceContext(): Promise<{
85
+ refresh(): void;
86
+ run: <T>(fn: () => T) => T;
87
+ }>;
88
+ /**
89
+ * Emit a span whose start is back-dated to `startEpochMs` and whose end is now,
90
+ * so its duration reflects an interval only measurable at its end (e.g.
91
+ * time-to-first-chunk, known when the first chunk arrives). Unlike `trace()`,
92
+ * this records an already-elapsed span in one shot rather than wrapping a
93
+ * callback. No-op when OpenTelemetry is not available.
94
+ */
95
+ export declare function recordElapsedSpan(spanName: string, startEpochMs: number, opts?: SpanOptions): Promise<void>;
96
+ /**
97
+ * Records the same user-code interval as the inner `step.execute` span. The
98
+ * configured OpenTelemetry meter provider attaches resource dimensions such as
99
+ * service.name, so this avoids accepting a caller-controlled service tag.
100
+ */
101
+ export declare function recordStepExecutionDuration(durationMs: number, status: 'ok' | 'error'): Promise<void>;
102
+ /**
103
+ * Applies the workflow suspension algebraic effect to an active span.
104
+ */
105
+ export declare function applyWorkflowSuspensionToSpan(error: WorkflowSuspension, span: api.Span): void;
22
106
  export declare function getSpanContextForTraceCarrier(carrier: Record<string, string>): Promise<api.SpanContext | undefined>;
23
107
  export declare function getActiveSpan(): Promise<api.Span | undefined>;
24
108
  /**
@@ -31,6 +115,13 @@ export declare function instrumentObject<T extends object>(prefix: string, o: T)
31
115
  export declare function getSpanKind(field: keyof typeof SpanKind): Promise<api.SpanKind | undefined>;
32
116
  export declare function withOtel<T>(fn: (otel: typeof api) => T): Promise<Awaited<T> | undefined>;
33
117
  export declare function linkToCurrentContext(): Promise<[api.Link] | undefined>;
118
+ /**
119
+ * Builds a span link pointing at the span context embedded in a serialized
120
+ * trace carrier (e.g. the run-origin context flowing through queue
121
+ * messages). Returns `undefined` when OTEL is unavailable, the carrier is
122
+ * absent, or it does not contain a valid span context.
123
+ */
124
+ export declare function linkToTraceCarrier(carrier: Record<string, string> | undefined): Promise<api.Link | undefined>;
34
125
  /**
35
126
  * Workflow context to propagate via baggage
36
127
  */
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUtE;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAO7E;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,oCAMrC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAChD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAcZ;AAiBD,wBAAsB,KAAK,CAAC,CAAC,EAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,IAAI,EACH,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACjC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GACvD,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAwBD,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,wCAQhC;AAED,wBAAsB,aAAa,kCAElC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAa1E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,OAAO,QAAQ,qCAE7D;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC,GAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAIjC;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAMtE;AAMD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CACjD,sBAAsB,GAAG,SAAS,CACnC,CAgBA"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
package/dist/telemetry.js CHANGED
@@ -1,10 +1,75 @@
1
- import { once } from '@workflow/utils';
1
+ import { globalSingleton, once } from '@workflow/utils';
2
2
  import { WorkflowSuspension } from './global.js';
3
3
  import { runtimeLogger } from './logger.js';
4
4
  import * as Attr from './telemetry/semantic-conventions.js';
5
- // ============================================================
6
- // Trace Context Propagation Utilities
7
- // ============================================================
5
+ /**
6
+ * Unrecognized `WORKFLOW_TRACE_MODE` values we already warned about. On
7
+ * `globalThis` (see `globalSingleton`) so the warning stays once per process
8
+ * rather than once per bundler layer.
9
+ */
10
+ const traceModeWarnings = globalSingleton('@workflow/core//traceModeWarnings', 1, () => ({ unrecognized: new Set() }));
11
+ /**
12
+ * Resolves the active trace mode from the `WORKFLOW_TRACE_MODE` env var.
13
+ * Defaults to `'linked'`; any value other than `'continuous'` selects it.
14
+ * Unrecognized non-empty values (e.g. typos like `continous`) emit a
15
+ * one-time warning so silent fallback to `linked` is at least visible.
16
+ */
17
+ export function getWorkflowTraceMode() {
18
+ const value = process.env.WORKFLOW_TRACE_MODE;
19
+ if (value === 'continuous')
20
+ return 'continuous';
21
+ if (value &&
22
+ value !== 'linked' &&
23
+ !traceModeWarnings.unrecognized.has(value)) {
24
+ traceModeWarnings.unrecognized.add(value);
25
+ runtimeLogger.warn(`Unrecognized WORKFLOW_TRACE_MODE value "${value}"; expected "linked" or "continuous". Falling back to "linked".`);
26
+ }
27
+ return 'linked';
28
+ }
29
+ /**
30
+ * Returns whether a serialized trace carrier is usable, i.e. present and
31
+ * non-empty. `serializeTraceCarrier()` returns `{}` when no OTEL SDK is
32
+ * registered or no span is active, and `start()` always attaches the
33
+ * carrier to the first queue message, so an empty carrier must be treated
34
+ * the same as an absent one wherever the trace-mode logic branches.
35
+ */
36
+ export function isUsableTraceCarrier(carrier) {
37
+ return carrier !== undefined && Object.keys(carrier).length > 0;
38
+ }
39
+ /**
40
+ * Returns the trace carrier to attach to messages the current invocation
41
+ * enqueues. In `linked` mode the ORIGINAL run-origin carrier is forwarded
42
+ * unchanged (when usable) so every future invocation links back to the same
43
+ * origin; otherwise (`continuous` mode, or no usable incoming carrier)
44
+ * the current (active) context is serialized, so the trace keeps chaining
45
+ * (continuous) or the first instrumented invocation becomes the de-facto
46
+ * origin (linked).
47
+ */
48
+ export function getNextTraceCarrier(traceMode, incomingCarrier) {
49
+ return traceMode === 'linked' && isUsableTraceCarrier(incomingCarrier)
50
+ ? Promise.resolve(incomingCarrier)
51
+ : serializeTraceCarrier();
52
+ }
53
+ /**
54
+ * Builds the span links for a queue-delivered invocation span
55
+ * (`workflow.execute` / `step.execute`):
56
+ *
57
+ * - In `linked` mode the invocation span is a CHILD of the local delivery
58
+ * (flow-route) context, so the only link is to the run-origin context
59
+ * from the message's trace carrier, connecting this bounded per-invocation
60
+ * trace back to where the run was started. The run-origin context is a
61
+ * link, never a parent, and re-enqueues forward the original carrier
62
+ * unchanged, so the whole run is never stitched into one giant trace.
63
+ * The link is skipped when the carrier is absent, empty, or invalid.
64
+ * - In `continuous` mode the run-origin context is restored as the parent
65
+ * instead, and the link points at the incoming delivery context.
66
+ */
67
+ export async function buildInvocationSpanLinks(traceMode, incomingCarrier) {
68
+ if (traceMode !== 'linked')
69
+ return linkToCurrentContext();
70
+ const originLink = await linkToTraceCarrier(isUsableTraceCarrier(incomingCarrier) ? incomingCarrier : undefined);
71
+ return originLink ? [originLink] : undefined;
72
+ }
8
73
  /**
9
74
  * Serializes the current trace context into a format that can be passed through queues
10
75
  * @returns A record of strings representing the trace context
@@ -50,6 +115,17 @@ export async function withTraceContext(traceCarrier, fn) {
50
115
  return otel.context.with(extractedContext, async () => await fn());
51
116
  }
52
117
  const OtelApi = once(async () => {
118
+ // `@opentelemetry/api` is an optional peer dependency. The static specifier
119
+ // is intentional: esbuild-bundled targets (the CLI's
120
+ // `vercel-build-output-api` build, Nitro, Astro) ship a self-contained
121
+ // bundle with no node_modules, so the package must be *inlined* at build
122
+ // time for spans to work at runtime; a runtime-built specifier is opaque to
123
+ // esbuild and would silently disable tracing there. Bundlers that reject an
124
+ // unresolvable static `import()` when the peer isn't installed (Rollup/Vite,
125
+ // e.g. SvelteKit) instead externalize `@opentelemetry/api` in the workflow
126
+ // framework integration, which keeps the build green and still loads real
127
+ // OTel when the peer is present. Runtime semantics: present → loaded, absent
128
+ // → caught and tracing disabled.
53
129
  try {
54
130
  return await import('@opentelemetry/api');
55
131
  }
@@ -62,8 +138,72 @@ const Tracer = once(async () => {
62
138
  const api = await OtelApi.value;
63
139
  if (!api)
64
140
  return null;
65
- return api.trace.getTracer('workflow');
141
+ const tracer = api.trace.getTracer('workflow');
142
+ logOtelDiagnosticOnce(api, tracer);
143
+ return tracer;
66
144
  });
145
+ const StepExecutionDurationHistogram = once(async () => {
146
+ const otel = await OtelApi.value;
147
+ if (!otel)
148
+ return null;
149
+ // service.name is a resource attribute, applied by the configured provider.
150
+ return otel.metrics
151
+ .getMeter('workflow')
152
+ .createHistogram('workflow.step.execute.duration', {
153
+ description: 'Duration of user step execution',
154
+ unit: 'ms',
155
+ });
156
+ });
157
+ /**
158
+ * One-shot runtime diagnostic (DEBUG=workflow:* only), same shape as the one
159
+ * world-vercel emits tagged `world-vercel`: prints how this module instance
160
+ * of `@opentelemetry/api` sees the global registration, so a deployment's
161
+ * logs show the two packages' views side by side.
162
+ */
163
+ // per-copy-ok: this diagnostic reports how THIS module instance sees the global
164
+ // OTel registration, which is the whole point of the log. With several copies
165
+ // in a process, each one's view is what is worth seeing.
166
+ let otelDiagLogged = false;
167
+ function describeThrownValue(value) {
168
+ try {
169
+ if (typeof value === 'object' &&
170
+ value !== null &&
171
+ 'message' in value &&
172
+ typeof value.message === 'string') {
173
+ return value.message;
174
+ }
175
+ return String(value);
176
+ }
177
+ catch {
178
+ return 'Unknown error';
179
+ }
180
+ }
181
+ function logOtelDiagnosticOnce(otel, tracer) {
182
+ const debugEnabled = typeof process !== 'undefined' &&
183
+ typeof process.env.DEBUG === 'string' &&
184
+ (process.env.DEBUG.includes('workflow:') || process.env.DEBUG === '*');
185
+ if (otelDiagLogged || !debugEnabled)
186
+ return;
187
+ otelDiagLogged = true;
188
+ try {
189
+ const g = globalThis[Symbol.for('opentelemetry.js.api.1')];
190
+ const provider = otel.trace.getTracerProvider();
191
+ const delegate = provider.getDelegate?.() ?? provider;
192
+ const probe = tracer.startSpan('workflow.otel.probe.core');
193
+ console.warn('[workflow:otel-diag] core', JSON.stringify({
194
+ globalRegistrationVersion: g?.version ?? null,
195
+ providerCtor: provider?.constructor?.name ?? null,
196
+ delegateCtor: delegate?.constructor?.name ?? null,
197
+ tracerCtor: tracer?.constructor?.name ?? null,
198
+ probeCtor: probe?.constructor?.name ?? null,
199
+ probeRecording: probe.isRecording(),
200
+ }));
201
+ probe.end();
202
+ }
203
+ catch (error) {
204
+ console.warn('[workflow:otel-diag] core failed:', error instanceof Error ? error.message : error);
205
+ }
206
+ }
67
207
  export async function trace(spanName, ...args) {
68
208
  const [tracer, otel] = await Promise.all([Tracer.value, OtelApi.value]);
69
209
  const { fn, opts } = typeof args[0] === 'function'
@@ -81,11 +221,16 @@ export async function trace(spanName, ...args) {
81
221
  return result;
82
222
  }
83
223
  catch (e) {
84
- span.setStatus({
85
- code: otel.SpanStatusCode.ERROR,
86
- message: e.message,
87
- });
88
- applyWorkflowSuspensionToSpan(e, otel, span);
224
+ if (WorkflowSuspension.is(e)) {
225
+ span.setStatus({ code: otel.SpanStatusCode.OK });
226
+ applyWorkflowSuspensionToSpan(e, span);
227
+ }
228
+ else {
229
+ span.setStatus({
230
+ code: otel.SpanStatusCode.ERROR,
231
+ message: describeThrownValue(e),
232
+ });
233
+ }
89
234
  throw e;
90
235
  }
91
236
  finally {
@@ -93,15 +238,78 @@ export async function trace(spanName, ...args) {
93
238
  }
94
239
  });
95
240
  }
241
+ /** Starts a child span without installing it as the active context. */
242
+ export async function startTraceSpan(spanName) {
243
+ const [tracer, otel] = await Promise.all([Tracer.value, OtelApi.value]);
244
+ if (!tracer || !otel)
245
+ return { end() { }, fail() { } };
246
+ const span = tracer.startSpan(spanName);
247
+ let ended = false;
248
+ const finish = (status) => {
249
+ if (ended)
250
+ return;
251
+ ended = true;
252
+ span.setStatus(status);
253
+ span.end();
254
+ };
255
+ return {
256
+ end: () => finish({ code: otel.SpanStatusCode.OK }),
257
+ fail: (error) => finish({
258
+ code: otel.SpanStatusCode.ERROR,
259
+ message: describeThrownValue(error),
260
+ }),
261
+ };
262
+ }
263
+ /** Bind work to the currently active span even when it starts from a child. */
264
+ export async function bindActiveTraceContext(fn) {
265
+ const otel = await OtelApi.value;
266
+ return otel ? otel.context.bind(otel.context.active(), fn) : fn;
267
+ }
268
+ /** Keeps a parked workflow's ambient trace context aligned with each resume. */
269
+ export async function createRefreshableTraceContext() {
270
+ const otel = await OtelApi.value;
271
+ if (!otel) {
272
+ return { refresh() { }, run: (fn) => fn() };
273
+ }
274
+ let current = otel.context.active();
275
+ const context = {
276
+ getValue: (key) => current.getValue(key),
277
+ setValue: (key, value) => current.setValue(key, value),
278
+ deleteValue: (key) => current.deleteValue(key),
279
+ };
280
+ return {
281
+ refresh: () => {
282
+ current = otel.context.active();
283
+ },
284
+ run: (fn) => otel.context.with(context, fn),
285
+ };
286
+ }
96
287
  /**
97
- * Applies workflow suspension attributes to the given span if the error is a WorkflowSuspension
98
- * which is technically not an error, but an algebraic effect indicating suspension.
288
+ * Emit a span whose start is back-dated to `startEpochMs` and whose end is now,
289
+ * so its duration reflects an interval only measurable at its end (e.g.
290
+ * time-to-first-chunk, known when the first chunk arrives). Unlike `trace()`,
291
+ * this records an already-elapsed span in one shot rather than wrapping a
292
+ * callback. No-op when OpenTelemetry is not available.
99
293
  */
100
- function applyWorkflowSuspensionToSpan(error, otel, span) {
101
- if (!error || !WorkflowSuspension.is(error)) {
294
+ export async function recordElapsedSpan(spanName, startEpochMs, opts) {
295
+ const tracer = await Tracer.value;
296
+ if (!tracer)
102
297
  return;
103
- }
104
- span.setStatus({ code: otel.SpanStatusCode.OK });
298
+ tracer.startSpan(spanName, { ...opts, startTime: startEpochMs }).end();
299
+ }
300
+ /**
301
+ * Records the same user-code interval as the inner `step.execute` span. The
302
+ * configured OpenTelemetry meter provider attaches resource dimensions such as
303
+ * service.name, so this avoids accepting a caller-controlled service tag.
304
+ */
305
+ export async function recordStepExecutionDuration(durationMs, status) {
306
+ const histogram = await StepExecutionDurationHistogram.value;
307
+ histogram?.record(durationMs, { 'workflow.step.status': status });
308
+ }
309
+ /**
310
+ * Applies the workflow suspension algebraic effect to an active span.
311
+ */
312
+ export function applyWorkflowSuspensionToSpan(error, span) {
105
313
  span.setAttributes({
106
314
  ...Attr.WorkflowSuspensionState('suspended'),
107
315
  ...Attr.WorkflowSuspensionStepCount(error.stepCount),
@@ -158,6 +366,25 @@ export function linkToCurrentContext() {
158
366
  return [{ context }];
159
367
  });
160
368
  }
369
+ /**
370
+ * Builds a span link pointing at the span context embedded in a serialized
371
+ * trace carrier (e.g. the run-origin context flowing through queue
372
+ * messages). Returns `undefined` when OTEL is unavailable, the carrier is
373
+ * absent, or it does not contain a valid span context.
374
+ */
375
+ export async function linkToTraceCarrier(carrier) {
376
+ if (!carrier)
377
+ return;
378
+ const [context, otel] = await Promise.all([
379
+ getSpanContextForTraceCarrier(carrier),
380
+ OtelApi.value,
381
+ ]);
382
+ if (!context || !otel)
383
+ return;
384
+ if (!otel.trace.isSpanContextValid(context))
385
+ return;
386
+ return { context };
387
+ }
161
388
  /**
162
389
  * Sets workflow context as OTEL baggage for automatic propagation.
163
390
  * Baggage is propagated across service boundaries via HTTP headers.
@@ -197,4 +424,4 @@ export async function getWorkflowBaggage() {
197
424
  workflowName: name,
198
425
  };
199
426
  }
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxLQUFLLElBQUksTUFBTSxxQ0FBcUMsQ0FBQztBQUU1RCwrREFBK0Q7QUFDL0Qsc0NBQXNDO0FBQ3RDLCtEQUErRDtBQUUvRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQjtJQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNyQixNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFDO0lBQzNDLDhDQUE4QztJQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsWUFBb0M7SUFFcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTztJQUNsQix1Q0FBdUM7SUFDdkMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdC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SUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0I7SUFHdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFL0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUN6RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUV0RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXRDLE9BQU87UUFDTCxhQUFhLEVBQUUsS0FBSztRQUNwQixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgYXBpIGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5LaW5kLCBTcGFuT3B0aW9ucyB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgeyBvbmNlIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyIGZyb20gJy4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUcmFjZSBDb250ZXh0IFByb3BhZ2F0aW9uIFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2VyaWFsaXplcyB0aGUgY3VycmVudCB0cmFjZSBjb250ZXh0IGludG8gYSBmb3JtYXQgdGhhdCBjYW4gYmUgcGFzc2VkIHRocm91Z2ggcXVldWVzXG4gKiBAcmV0dXJucyBBIHJlY29yZCBvZiBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgdHJhY2UgY29udGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4ge307XG4gIGNvbnN0IGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gSW5qZWN0IHRoZSBjdXJyZW50IGNvbnRleHQgaW50byB0aGUgY2FycmllclxuICBvdGVsLnByb3BhZ2F0aW9uLmluamVjdChvdGVsLmNvbnRleHQuYWN0aXZlKCksIGNhcnJpZXIpO1xuICByZXR1cm4gY2Fycmllcjtcbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZXMgdHJhY2UgY29udGV4dCBhbmQgcmV0dXJucyBhIGNvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250aW51ZSB0aGUgdHJhY2VcbiAqIEBwYXJhbSB0cmFjZUNhcnJpZXIgVGhlIHNlcmlhbGl6ZWQgdHJhY2UgY29udGV4dFxuICogQHJldHVybnMgT3BlblRlbGVtZXRyeSBjb250ZXh0IHdpdGggdGhlIHJlc3RvcmVkIHRyYWNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZVRyYWNlQ2FycmllcihcbiAgdHJhY2VDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pIHtcbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuO1xuICAvLyBFeHRyYWN0IHRoZSBjb250ZXh0IGZyb20gdGhlIGNhcnJpZXJcbiAgcmV0dXJuIG90ZWwucHJvcGFnYXRpb24uZXh0cmFjdChvdGVsLmNvbnRleHQuYWN0aXZlKCksIHRyYWNlQ2Fycmllcik7XG59XG5cbi8qKlxuICogUnVucyBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIGRlc2VyaWFsaXplZCB0cmFjZVxuICogQHBhcmFtIHRyYWNlQ2FycmllciBUaGUgc2VyaWFsaXplZCB0cmFjZSBjYXJyaWVyIChvcHRpb25hbClcbiAqIEBwYXJhbSBmbiBUaGUgZnVuY3Rpb24gdG8gcnVuIHdpdGhpbiB0aGUgdHJhY2UgY29udGV4dFxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhUcmFjZUNvbnRleHQ8VD4oXG4gIHRyYWNlQ2FycmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgZm46ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBpZiAoIXRyYWNlQ2Fycmllcikge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgY29uc3Qgb3RlbCA9IGF3YWl0IE90ZWxBcGkudmFsdWU7XG4gIGlmICghb3RlbCkgcmV0dXJuIGZuKCk7XG5cbiAgY29uc3QgZXh0cmFjdGVkQ29udGV4dCA9IGF3YWl0IGRlc2VyaWFsaXplVHJhY2VDYXJyaWVyKHRyYWNlQ2Fycmllcik7XG4gIGlmICghZXh0cmFjdGVkQ29udGV4dCkge1xuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgcmV0dXJuIG90ZWwuY29udGV4dC53aXRoKGV4dHJhY3RlZENvbnRleHQsIGFzeW5jICgpID0+IGF3YWl0IGZuKCkpO1xufVxuXG5jb25zdCBPdGVsQXBpID0gb25jZShhc3luYyAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGltcG9ydCgnQG9wZW50ZWxlbWV0cnkvYXBpJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJ1bnRpbWVMb2dnZXIuaW5mbygnT3BlblRlbGVtZXRyeSBub3QgYXZhaWxhYmxlLCB0cmFjaW5nIHdpbGwgYmUgZGlzYWJsZWQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSk7XG5cbmNvbnN0IFRyYWNlciA9IG9uY2UoYXN5bmMgKCkgPT4ge1xuICBjb25zdCBhcGkgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIWFwaSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBhcGkudHJhY2UuZ2V0VHJhY2VyKCd3b3JrZmxvdycpO1xufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFjZTxUPihcbiAgc3Bhbk5hbWU6IHN0cmluZyxcbiAgLi4uYXJnczpcbiAgICB8IFtmbjogKHNwYW4/OiBTcGFuKSA9PiBQcm9taXNlPFQ+XVxuICAgIHwgW29wdHM6IFNwYW5PcHRpb25zLCBmbjogKHNwYW4/OiBTcGFuKSA9PiBQcm9taXNlPFQ+XVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IFt0cmFjZXIsIG90ZWxdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1RyYWNlci52YWx1ZSwgT3RlbEFwaS52YWx1ZV0pO1xuICBjb25zdCB7IGZuLCBvcHRzIH0gPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHsgZm46IGFyZ3NbMF0sIG9wdHM6IHt9IH1cbiAgICAgIDogeyBmbjogYXJnc1sxXSwgb3B0czogYXJnc1swXSB9O1xuICBpZiAoIWZuKSB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIHRvIHRyYWNlIG11c3QgYmUgcHJvdmlkZWQnKTtcblxuICBpZiAoIXRyYWNlciB8fCAhb3RlbCkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9XG5cbiAgcmV0dXJuIHRyYWNlci5zdGFydEFjdGl2ZVNwYW4oc3Bhbk5hbWUsIG9wdHMsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKHNwYW4pO1xuICAgICAgc3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBvdGVsLlNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgIGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6IChlIGFzIEVycm9yKS5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgICBhcHBseVdvcmtmbG93U3VzcGVuc2lvblRvU3BhbihlLCBvdGVsLCBzcGFuKTtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNwYW4uZW5kKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHdvcmtmbG93IHN1c3BlbnNpb24gYXR0cmlidXRlcyB0byB0aGUgZ2l2ZW4gc3BhbiBpZiB0aGUgZXJyb3IgaXMgYSBXb3JrZmxvd1N1c3BlbnNpb25cbiAqIHdoaWNoIGlzIHRlY2huaWNhbGx5IG5vdCBhbiBlcnJvciwgYnV0IGFuIGFsZ2VicmFpYyBlZmZlY3QgaW5kaWNhdGluZyBzdXNwZW5zaW9uLlxuICovXG5mdW5jdGlvbiBhcHBseVdvcmtmbG93U3VzcGVuc2lvblRvU3BhbihcbiAgZXJyb3I6IHVua25vd24sXG4gIG90ZWw6IHR5cGVvZiBhcGksXG4gIHNwYW46IGFwaS5TcGFuXG4pIHtcbiAgaWYgKCFlcnJvciB8fCAhV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycm9yKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogb3RlbC5TcGFuU3RhdHVzQ29kZS5PSyB9KTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAgICAuLi5BdHRyLldvcmtmbG93U3VzcGVuc2lvblN0YXRlKCdzdXNwZW5kZWQnKSxcbiAgICAuLi5BdHRyLldvcmtmbG93U3VzcGVuc2lvblN0ZXBDb3VudChlcnJvci5zdGVwQ291bnQpLFxuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uSG9va0NvdW50KGVycm9yLmhvb2tDb3VudCksXG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25XYWl0Q291bnQoZXJyb3Iud2FpdENvdW50KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTcGFuQ29udGV4dEZvclRyYWNlQ2FycmllcihcbiAgY2FycmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKSB7XG4gIGNvbnN0IFtkZXNlcmlhbGl6ZWQsIG90ZWxdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGRlc2VyaWFsaXplVHJhY2VDYXJyaWVyKGNhcnJpZXIpLFxuICAgIE90ZWxBcGkudmFsdWUsXG4gIF0pO1xuICBpZiAoIWRlc2VyaWFsaXplZCB8fCAhb3RlbCkgcmV0dXJuO1xuICByZXR1cm4gb3RlbC50cmFjZS5nZXRTcGFuQ29udGV4dChkZXNlcmlhbGl6ZWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWN0aXZlU3BhbigpIHtcbiAgcmV0dXJuIGF3YWl0IHdpdGhPdGVsKChvdGVsKSA9PiBvdGVsLnRyYWNlLmdldEFjdGl2ZVNwYW4oKSk7XG59XG5cbi8qKlxuICogV3JhcHMgYWxsIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHdpdGggdHJhY2luZyBzcGFucy5cbiAqIEBwYXJhbSBwcmVmaXggLSBQcmVmaXggZm9yIHNwYW4gbmFtZXMgKGUuZy4sIFwiV09STEQucnVuc1wiKVxuICogQHBhcmFtIG8gLSBPYmplY3Qgd2l0aCBtZXRob2RzIHRvIGluc3RydW1lbnRcbiAqIEByZXR1cm5zIEluc3RydW1lbnRlZCBvYmplY3Qgd2l0aCBzYW1lIGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1bWVudE9iamVjdDxUIGV4dGVuZHMgb2JqZWN0PihwcmVmaXg6IHN0cmluZywgbzogVCk6IFQge1xuICBjb25zdCBoYW5kbGVycyA9IHt9IGFzIFQ7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG8pIGFzIChrZXlvZiBUKVtdKSB7XG4gICAgaWYgKHR5cGVvZiBvW2tleV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhhbmRsZXJzW2tleV0gPSBvW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGYgPSBvW2tleV07XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICBoYW5kbGVyc1trZXldID0gYXN5bmMgKC4uLmFyZ3M6IGFueVtdKSA9PlxuICAgICAgICB0cmFjZShgJHtwcmVmaXh9LiR7U3RyaW5nKGtleSl9YCwge30sICgpID0+IGYoLi4uYXJncykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGFuZGxlcnM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTcGFuS2luZChmaWVsZDoga2V5b2YgdHlwZW9mIFNwYW5LaW5kKSB7XG4gIHJldHVybiB3aXRoT3RlbCgoeCkgPT4geC5TcGFuS2luZFtmaWVsZF0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aE90ZWw8VD4oXG4gIGZuOiAob3RlbDogdHlwZW9mIGFwaSkgPT4gVFxuKTogUHJvbWlzZTxBd2FpdGVkPFQ+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBhd2FpdCBmbihvdGVsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtUb0N1cnJlbnRDb250ZXh0KCk6IFByb21pc2U8W2FwaS5MaW5rXSB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gd2l0aE90ZWwoKG90ZWwpOiBbYXBpLkxpbmtdIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gb3RlbC50cmFjZS5nZXRBY3RpdmVTcGFuKCk/LnNwYW5Db250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0KSByZXR1cm47XG4gICAgcmV0dXJuIFt7IGNvbnRleHQgfV07XG4gIH0pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJhZ2dhZ2UgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBXb3JrZmxvdyBjb250ZXh0IHRvIHByb3BhZ2F0ZSB2aWEgYmFnZ2FnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQge1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNldHMgd29ya2Zsb3cgY29udGV4dCBhcyBPVEVMIGJhZ2dhZ2UgZm9yIGF1dG9tYXRpYyBwcm9wYWdhdGlvbi5cbiAqIEJhZ2dhZ2UgaXMgcHJvcGFnYXRlZCBhY3Jvc3Mgc2VydmljZSBib3VuZGFyaWVzIHZpYSBIVFRQIGhlYWRlcnMuXG4gKiBAcGFyYW0gY29udGV4dCAtIFdvcmtmbG93IGNvbnRleHQgdG8gc2V0IGFzIGJhZ2dhZ2VcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcnVuIHdpdGhpbiB0aGUgYmFnZ2FnZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoV29ya2Zsb3dCYWdnYWdlPFQ+KFxuICBjb250ZXh0OiBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0LFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiBmbigpO1xuXG4gIC8vIENyZWF0ZSBiYWdnYWdlIHdpdGggd29ya2Zsb3cgY29udGV4dFxuICBjb25zdCBiYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKHtcbiAgICAnd29ya2Zsb3cucnVuX2lkJzogeyB2YWx1ZTogY29udGV4dC53b3JrZmxvd1J1bklkIH0sXG4gICAgJ3dvcmtmbG93Lm5hbWUnOiB7IHZhbHVlOiBjb250ZXh0LndvcmtmbG93TmFtZSB9LFxuICB9KTtcblxuICAvLyBTZXQgYmFnZ2FnZSBpbiBjb250ZXh0IGFuZCBydW4gZnVuY3Rpb25cbiAgY29uc3QgY29udGV4dFdpdGhCYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5zZXRCYWdnYWdlKFxuICAgIG90ZWwuY29udGV4dC5hY3RpdmUoKSxcbiAgICBiYWdnYWdlXG4gICk7XG5cbiAgcmV0dXJuIG90ZWwuY29udGV4dC53aXRoKGNvbnRleHRXaXRoQmFnZ2FnZSwgKCkgPT4gZm4oKSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHdvcmtmbG93IGNvbnRleHQgZnJvbSBPVEVMIGJhZ2dhZ2UuXG4gKiBAcmV0dXJucyBXb3JrZmxvdyBjb250ZXh0IGlmIHByZXNlbnQgaW4gYmFnZ2FnZSwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2Zsb3dCYWdnYWdlKCk6IFByb21pc2U8XG4gIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJhZ2dhZ2UgPSBvdGVsLnByb3BhZ2F0aW9uLmdldEJhZ2dhZ2Uob3RlbC5jb250ZXh0LmFjdGl2ZSgpKTtcbiAgaWYgKCFiYWdnYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJ1bklkID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cucnVuX2lkJyk/LnZhbHVlO1xuICBjb25zdCBuYW1lID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cubmFtZScpPy52YWx1ZTtcblxuICBpZiAoIXJ1bklkIHx8ICFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lOiBuYW1lLFxuICB9O1xufVxuIl19
427
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0scUNBQXFDLENBQUM7QUFvQjVEOzs7O0dBSUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FDdkMsbUNBQW1DLEVBQ25DLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksR0FBRyxFQUFVLEVBQUUsQ0FBQyxDQUM1QyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDOUMsSUFBSSxLQUFLLEtBQUssWUFBWTtRQUFFLE9BQU8sWUFBWSxDQUFDO0lBQ2hELElBQ0UsS0FBSztRQUNMLEtBQUssS0FBSyxRQUFRO1FBQ2xCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDMUMsQ0FBQztRQUNELGlCQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsYUFBYSxDQUFDLElBQUksQ0FDaEIsMkNBQTJDLEtBQUssaUVBQWlFLENBQ2xILENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBMkM7SUFFM0MsT0FBTyxPQUFPLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJ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USxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUV0RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXRDLE9BQU87UUFDTCxhQUFhLEVBQUUsS0FBSztRQUNwQixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgYXBpIGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5LaW5kLCBTcGFuT3B0aW9ucyB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24sIG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYWNlIENvbnRleHQgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb250cm9scyBob3cgd29ya2Zsb3cvc3RlcCBxdWV1ZS1oYW5kbGVyIHNwYW5zIHJlbGF0ZSB0byB0aGUgcnVuLW9yaWdpblxuICogdHJhY2UgY29udGV4dCBjYXJyaWVkIGluIHF1ZXVlIG1lc3NhZ2VzOlxuICpcbiAqIC0gYCdsaW5rZWQnYCAoZGVmYXVsdCk6IGVhY2ggaW52b2NhdGlvbiBzdGFydHMgYSBORVcgcm9vdCB0cmFjZTsgdGhlXG4gKiAgIHJ1bi1vcmlnaW4gY29udGV4dCAoYW5kIHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0KSBhcmUgYXR0YWNoZWQgYXNcbiAqICAgc3BhbiBsaW5rcy4gVGhpcyBrZWVwcyB0cmFjZXMgYm91bmRlZCBwZXIgaW52b2NhdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHN0aXRjaGluZyBhIGxvbmctbGl2ZWQgcnVuIGludG8gb25lIGdpYW50IHRyYWNlLlxuICogLSBgJ2NvbnRpbnVvdXMnYDogdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dCBiZWNvbWVzIHRoZSBwYXJlbnQgb2ZcbiAqICAgdGhlIGludm9jYXRpb24gc3BhbiAobGVnYWN5IGJlaGF2aW9yKSwgcHJvZHVjaW5nIGEgc2luZ2xlIHRyYWNlIHRoYXRcbiAqICAgc3BhbnMgdGhlIGVudGlyZSBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93VHJhY2VNb2RlID0gJ2xpbmtlZCcgfCAnY29udGludW91cyc7XG5cbi8qKlxuICogVW5yZWNvZ25pemVkIGBXT1JLRkxPV19UUkFDRV9NT0RFYCB2YWx1ZXMgd2UgYWxyZWFkeSB3YXJuZWQgYWJvdXQuIE9uXG4gKiBgZ2xvYmFsVGhpc2AgKHNlZSBgZ2xvYmFsU2luZ2xldG9uYCkgc28gdGhlIHdhcm5pbmcgc3RheXMgb25jZSBwZXIgcHJvY2Vzc1xuICogcmF0aGVyIHRoYW4gb25jZSBwZXIgYnVuZGxlciBsYXllci5cbiAqL1xuY29uc3QgdHJhY2VNb2RlV2FybmluZ3MgPSBnbG9iYWxTaW5nbGV0b24oXG4gICdAd29ya2Zsb3cvY29yZS8vdHJhY2VNb2RlV2FybmluZ3MnLFxuICAxLFxuICAoKSA9PiAoeyB1bnJlY29nbml6ZWQ6IG5ldyBTZXQ8c3RyaW5nPigpIH0pXG4pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhY3RpdmUgdHJhY2UgbW9kZSBmcm9tIHRoZSBgV09SS0ZMT1dfVFJBQ0VfTU9ERWAgZW52IHZhci5cbiAqIERlZmF1bHRzIHRvIGAnbGlua2VkJ2A7IGFueSB2YWx1ZSBvdGhlciB0aGFuIGAnY29udGludW91cydgIHNlbGVjdHMgaXQuXG4gKiBVbnJlY29nbml6ZWQgbm9uLWVtcHR5IHZhbHVlcyAoZS5nLiB0eXBvcyBsaWtlIGBjb250aW5vdXNgKSBlbWl0IGFcbiAqIG9uZS10aW1lIHdhcm5pbmcgc28gc2lsZW50IGZhbGxiYWNrIHRvIGBsaW5rZWRgIGlzIGF0IGxlYXN0IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpOiBXb3JrZmxvd1RyYWNlTW9kZSB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVFJBQ0VfTU9ERTtcbiAgaWYgKHZhbHVlID09PSAnY29udGludW91cycpIHJldHVybiAnY29udGludW91cyc7XG4gIGlmIChcbiAgICB2YWx1ZSAmJlxuICAgIHZhbHVlICE9PSAnbGlua2VkJyAmJlxuICAgICF0cmFjZU1vZGVXYXJuaW5ncy51bnJlY29nbml6ZWQuaGFzKHZhbHVlKVxuICApIHtcbiAgICB0cmFjZU1vZGVXYXJuaW5ncy51bnJlY29nbml6ZWQuYWRkKHZhbHVlKTtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICBgVW5yZWNvZ25pemVkIFdPUktGTE9XX1RSQUNFX01PREUgdmFsdWUgXCIke3ZhbHVlfVwiOyBleHBlY3RlZCBcImxpbmtlZFwiIG9yIFwiY29udGludW91c1wiLiBGYWxsaW5nIGJhY2sgdG8gXCJsaW5rZWRcIi5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gJ2xpbmtlZCc7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgc2VyaWFsaXplZCB0cmFjZSBjYXJyaWVyIGlzIHVzYWJsZSwgaS5lLiBwcmVzZW50IGFuZFxuICogbm9uLWVtcHR5LiBgc2VyaWFsaXplVHJhY2VDYXJyaWVyKClgIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzXG4gKiByZWdpc3RlcmVkIG9yIG5vIHNwYW4gaXMgYWN0aXZlLCBhbmQgYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyB0aGVcbiAqIGNhcnJpZXIgdG8gdGhlIGZpcnN0IHF1ZXVlIG1lc3NhZ2UsIHNvIGFuIGVtcHR5IGNhcnJpZXIgbXVzdCBiZSB0cmVhdGVkXG4gKiB0aGUgc2FtZSBhcyBhbiBhYnNlbnQgb25lIHdoZXJldmVyIHRoZSB0cmFjZS1tb2RlIGxvZ2ljIGJyYW5jaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVc2FibGVUcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IGNhcnJpZXIgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBjYXJyaWVyICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMoY2FycmllcikubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cmFjZSBjYXJyaWVyIHRvIGF0dGFjaCB0byBtZXNzYWdlcyB0aGUgY3VycmVudCBpbnZvY2F0aW9uXG4gKiBlbnF1ZXVlcy4gSW4gYGxpbmtlZGAgbW9kZSB0aGUgT1JJR0lOQUwgcnVuLW9yaWdpbiBjYXJyaWVyIGlzIGZvcndhcmRlZFxuICogdW5jaGFuZ2VkICh3aGVuIHVzYWJsZSkgc28gZXZlcnkgZnV0dXJlIGludm9jYXRpb24gbGlua3MgYmFjayB0byB0aGUgc2FtZVxuICogb3JpZ2luOyBvdGhlcndpc2UgKGBjb250aW51b3VzYCBtb2RlLCBvciBubyB1c2FibGUgaW5jb21pbmcgY2FycmllcilcbiAqIHRoZSBjdXJyZW50IChhY3RpdmUpIGNvbnRleHQgaXMgc2VyaWFsaXplZCwgc28gdGhlIHRyYWNlIGtlZXBzIGNoYWluaW5nXG4gKiAoY29udGludW91cykgb3IgdGhlIGZpcnN0IGluc3RydW1lbnRlZCBpbnZvY2F0aW9uIGJlY29tZXMgdGhlIGRlLWZhY3RvXG4gKiBvcmlnaW4gKGxpbmtlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0VHJhY2VDYXJyaWVyKFxuICB0cmFjZU1vZGU6IFdvcmtmbG93VHJhY2VNb2RlLFxuICBpbmNvbWluZ0NhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICByZXR1cm4gdHJhY2VNb2RlID09PSAnbGlua2VkJyAmJiBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ0NhcnJpZXIpXG4gICAgPyBQcm9taXNlLnJlc29sdmUoaW5jb21pbmdDYXJyaWVyKVxuICAgIDogc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzcGFuIGxpbmtzIGZvciBhIHF1ZXVlLWRlbGl2ZXJlZCBpbnZvY2F0aW9uIHNwYW5cbiAqIChgd29ya2Zsb3cuZXhlY3V0ZWAgLyBgc3RlcC5leGVjdXRlYCk6XG4gKlxuICogLSBJbiBgbGlua2VkYCBtb2RlIHRoZSBpbnZvY2F0aW9uIHNwYW4gaXMgYSBDSElMRCBvZiB0aGUgbG9jYWwgZGVsaXZlcnlcbiAqICAgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIHRoZSBvbmx5IGxpbmsgaXMgdG8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dFxuICogICBmcm9tIHRoZSBtZXNzYWdlJ3MgdHJhY2UgY2FycmllciwgY29ubmVjdGluZyB0aGlzIGJvdW5kZWQgcGVyLWludm9jYXRpb25cbiAqICAgdHJhY2UgYmFjayB0byB3aGVyZSB0aGUgcnVuIHdhcyBzdGFydGVkLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIGFcbiAqICAgbGluaywgbmV2ZXIgYSBwYXJlbnQsIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gKiAgIHVuY2hhbmdlZCwgc28gdGhlIHdob2xlIHJ1biBpcyBuZXZlciBzdGl0Y2hlZCBpbnRvIG9uZSBnaWFudCB0cmFjZS5cbiAqICAgVGhlIGxpbmsgaXMgc2tpcHBlZCB3aGVuIHRoZSBjYXJyaWVyIGlzIGFic2VudCwgZW1wdHksIG9yIGludmFsaWQuXG4gKiAtIEluIGBjb250aW51b3VzYCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgcmVzdG9yZWQgYXMgdGhlIHBhcmVudFxuICogICBpbnN0ZWFkLCBhbmQgdGhlIGxpbmsgcG9pbnRzIGF0IHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzKFxuICB0cmFjZU1vZGU6IFdvcmtmbG93VHJhY2VNb2RlLFxuICBpbmNvbWluZ0NhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8YXBpLkxpbmtbXSB8IHVuZGVmaW5lZD4ge1xuICBpZiAodHJhY2VNb2RlICE9PSAnbGlua2VkJykgcmV0dXJuIGxpbmtUb0N1cnJlbnRDb250ZXh0KCk7XG4gIGNvbnN0IG9yaWdpbkxpbmsgPSBhd2FpdCBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gICAgaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdDYXJyaWVyKSA/IGluY29taW5nQ2FycmllciA6IHVuZGVmaW5lZFxuICApO1xuICByZXR1cm4gb3JpZ2luTGluayA/IFtvcmlnaW5MaW5rXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBwYXNzZWQgdGhyb3VnaCBxdWV1ZXNcbiAqIEByZXR1cm5zIEEgcmVjb3JkIG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0cmFjZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiB7fTtcbiAgY29uc3QgY2FycmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvLyBJbmplY3QgdGhlIGN1cnJlbnQgY29udGV4dCBpbnRvIHRoZSBjYXJyaWVyXG4gIG90ZWwucHJvcGFnYXRpb24uaW5qZWN0KG90ZWwuY29udGV4dC5hY3RpdmUoKSwgY2Fycmllcik7XG4gIHJldHVybiBjYXJyaWVyO1xufVxuXG4vKipcbiAqIERlc2VyaWFsaXplcyB0cmFjZSBjb250ZXh0IGFuZCByZXR1cm5zIGEgY29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnRpbnVlIHRoZSB0cmFjZVxuICogQHBhcmFtIHRyYWNlQ2FycmllciBUaGUgc2VyaWFsaXplZCB0cmFjZSBjb250ZXh0XG4gKiBAcmV0dXJucyBPcGVuVGVsZW1ldHJ5IGNvbnRleHQgd2l0aCB0aGUgcmVzdG9yZWQgdHJhY2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc2VyaWFsaXplVHJhY2VDYXJyaWVyKFxuICB0cmFjZUNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm47XG4gIC8vIEV4dHJhY3QgdGhlIGNvbnRleHQgZnJvbSB0aGUgY2FycmllclxuICByZXR1cm4gb3RlbC5wcm9wYWdhdGlvbi5leHRyYWN0KG90ZWwuY29udGV4dC5hY3RpdmUoKSwgdHJhY2VDYXJyaWVyKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgZGVzZXJpYWxpemVkIHRyYWNlXG4gKiBAcGFyYW0gdHJhY2VDYXJyaWVyIFRoZSBzZXJpYWxpemVkIHRyYWNlIGNhcnJpZXIgKG9wdGlvbmFsKVxuICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byBydW4gd2l0aGluIHRoZSB0cmFjZSBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFRyYWNlQ29udGV4dDxUPihcbiAgdHJhY2VDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGlmICghdHJhY2VDYXJyaWVyKSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gZm4oKTtcblxuICBjb25zdCBleHRyYWN0ZWRDb250ZXh0ID0gYXdhaXQgZGVzZXJpYWxpemVUcmFjZUNhcnJpZXIodHJhY2VDYXJyaWVyKTtcbiAgaWYgKCFleHRyYWN0ZWRDb250ZXh0KSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICByZXR1cm4gb3RlbC5jb250ZXh0LndpdGgoZXh0cmFjdGVkQ29udGV4dCwgYXN5bmMgKCkgPT4gYXdhaXQgZm4oKSk7XG59XG5cbmNvbnN0IE90ZWxBcGkgPSBvbmNlKGFzeW5jICgpID0+IHtcbiAgLy8gYEBvcGVudGVsZW1ldHJ5L2FwaWAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5LiBUaGUgc3RhdGljIHNwZWNpZmllclxuICAvLyBpcyBpbnRlbnRpb25hbDogZXNidWlsZC1idW5kbGVkIHRhcmdldHMgKHRoZSBDTEknc1xuICAvLyBgdmVyY2VsLWJ1aWxkLW91dHB1dC1hcGlgIGJ1aWxkLCBOaXRybywgQXN0cm8pIHNoaXAgYSBzZWxmLWNvbnRhaW5lZFxuICAvLyBidW5kbGUgd2l0aCBubyBub2RlX21vZHVsZXMsIHNvIHRoZSBwYWNrYWdlIG11c3QgYmUgKmlubGluZWQqIGF0IGJ1aWxkXG4gIC8vIHRpbWUgZm9yIHNwYW5zIHRvIHdvcmsgYXQgcnVudGltZTsgYSBydW50aW1lLWJ1aWx0IHNwZWNpZmllciBpcyBvcGFxdWUgdG9cbiAgLy8gZXNidWlsZCBhbmQgd291bGQgc2lsZW50bHkgZGlzYWJsZSB0cmFjaW5nIHRoZXJlLiBCdW5kbGVycyB0aGF0IHJlamVjdCBhblxuICAvLyB1bnJlc29sdmFibGUgc3RhdGljIGBpbXBvcnQoKWAgd2hlbiB0aGUgcGVlciBpc24ndCBpbnN0YWxsZWQgKFJvbGx1cC9WaXRlLFxuICAvLyBlLmcuIFN2ZWx0ZUtpdCkgaW5zdGVhZCBleHRlcm5hbGl6ZSBgQG9wZW50ZWxlbWV0cnkvYXBpYCBpbiB0aGUgd29ya2Zsb3dcbiAgLy8gZnJhbWV3b3JrIGludGVncmF0aW9uLCB3aGljaCBrZWVwcyB0aGUgYnVpbGQgZ3JlZW4gYW5kIHN0aWxsIGxvYWRzIHJlYWxcbiAgLy8gT1RlbCB3aGVuIHRoZSBwZWVyIGlzIHByZXNlbnQuIFJ1bnRpbWUgc2VtYW50aWNzOiBwcmVzZW50IOKGkiBsb2FkZWQsIGFic2VudFxuICAvLyDihpIgY2F1Z2h0IGFuZCB0cmFjaW5nIGRpc2FibGVkLlxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBpbXBvcnQoJ0BvcGVudGVsZW1ldHJ5L2FwaScpO1xuICB9IGNhdGNoIHtcbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ09wZW5UZWxlbWV0cnkgbm90IGF2YWlsYWJsZSwgdHJhY2luZyB3aWxsIGJlIGRpc2FibGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuXG5jb25zdCBUcmFjZXIgPSBvbmNlKGFzeW5jICgpID0+IHtcbiAgY29uc3QgYXBpID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFhcGkpIHJldHVybiBudWxsO1xuICBjb25zdCB0cmFjZXIgPSBhcGkudHJhY2UuZ2V0VHJhY2VyKCd3b3JrZmxvdycpO1xuICBsb2dPdGVsRGlhZ25vc3RpY09uY2UoYXBpLCB0cmFjZXIpO1xuICByZXR1cm4gdHJhY2VyO1xufSk7XG5cbmNvbnN0IFN0ZXBFeGVjdXRpb25EdXJhdGlvbkhpc3RvZ3JhbSA9IG9uY2UoYXN5bmMgKCkgPT4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gbnVsbDtcbiAgLy8gc2VydmljZS5uYW1lIGlzIGEgcmVzb3VyY2UgYXR0cmlidXRlLCBhcHBsaWVkIGJ5IHRoZSBjb25maWd1cmVkIHByb3ZpZGVyLlxuICByZXR1cm4gb3RlbC5tZXRyaWNzXG4gICAgLmdldE1ldGVyKCd3b3JrZmxvdycpXG4gICAgLmNyZWF0ZUhpc3RvZ3JhbSgnd29ya2Zsb3cuc3RlcC5leGVjdXRlLmR1cmF0aW9uJywge1xuICAgICAgZGVzY3JpcHRpb246ICdEdXJhdGlvbiBvZiB1c2VyIHN0ZXAgZXhlY3V0aW9uJyxcbiAgICAgIHVuaXQ6ICdtcycsXG4gICAgfSk7XG59KTtcblxuLyoqXG4gKiBPbmUtc2hvdCBydW50aW1lIGRpYWdub3N0aWMgKERFQlVHPXdvcmtmbG93Oiogb25seSksIHNhbWUgc2hhcGUgYXMgdGhlIG9uZVxuICogd29ybGQtdmVyY2VsIGVtaXRzIHRhZ2dlZCBgd29ybGQtdmVyY2VsYDogcHJpbnRzIGhvdyB0aGlzIG1vZHVsZSBpbnN0YW5jZVxuICogb2YgYEBvcGVudGVsZW1ldHJ5L2FwaWAgc2VlcyB0aGUgZ2xvYmFsIHJlZ2lzdHJhdGlvbiwgc28gYSBkZXBsb3ltZW50J3NcbiAqIGxvZ3Mgc2hvdyB0aGUgdHdvIHBhY2thZ2VzJyB2aWV3cyBzaWRlIGJ5IHNpZGUuXG4gKi9cbi8vIHBlci1jb3B5LW9rOiB0aGlzIGRpYWdub3N0aWMgcmVwb3J0cyBob3cgVEhJUyBtb2R1bGUgaW5zdGFuY2Ugc2VlcyB0aGUgZ2xvYmFsXG4vLyBPVGVsIHJlZ2lzdHJhdGlvbiwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBsb2cuIFdpdGggc2V2ZXJhbCBjb3BpZXNcbi8vIGluIGEgcHJvY2VzcywgZWFjaCBvbmUncyB2aWV3IGlzIHdoYXQgaXMgd29ydGggc2VlaW5nLlxubGV0IG90ZWxEaWFnTG9nZ2VkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVGhyb3duVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAnbWVzc2FnZScgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ1Vua25vd24gZXJyb3InO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvZ090ZWxEaWFnbm9zdGljT25jZShvdGVsOiB0eXBlb2YgYXBpLCB0cmFjZXI6IGFwaS5UcmFjZXIpOiB2b2lkIHtcbiAgY29uc3QgZGVidWdFbmFibGVkID1cbiAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5lbnYuREVCVUcgPT09ICdzdHJpbmcnICYmXG4gICAgKHByb2Nlc3MuZW52LkRFQlVHLmluY2x1ZGVzKCd3b3JrZmxvdzonKSB8fCBwcm9jZXNzLmVudi5ERUJVRyA9PT0gJyonKTtcbiAgaWYgKG90ZWxEaWFnTG9nZ2VkIHx8ICFkZWJ1Z0VuYWJsZWQpIHJldHVybjtcbiAgb3RlbERpYWdMb2dnZWQgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGcgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgICBTeW1ib2wuZm9yKCdvcGVudGVsZW1ldHJ5LmpzLmFwaS4xJylcbiAgICBdIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gb3RlbC50cmFjZS5nZXRUcmFjZXJQcm92aWRlcigpO1xuICAgIGNvbnN0IGRlbGVnYXRlID1cbiAgICAgIChwcm92aWRlciBhcyB7IGdldERlbGVnYXRlPzogKCkgPT4gdW5rbm93biB9KS5nZXREZWxlZ2F0ZT8uKCkgPz8gcHJvdmlkZXI7XG4gICAgY29uc3QgcHJvYmUgPSB0cmFjZXIuc3RhcnRTcGFuKCd3b3JrZmxvdy5vdGVsLnByb2JlLmNvcmUnKTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3dvcmtmbG93Om90ZWwtZGlhZ10gY29yZScsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdsb2JhbFJlZ2lzdHJhdGlvblZlcnNpb246IGc/LnZlcnNpb24gPz8gbnVsbCxcbiAgICAgICAgcHJvdmlkZXJDdG9yOiBwcm92aWRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gbnVsbCxcbiAgICAgICAgZGVsZWdhdGVDdG9yOiAoZGVsZWdhdGUgYXMgb2JqZWN0IHwgbnVsbCk/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIHRyYWNlckN0b3I6IHRyYWNlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gbnVsbCxcbiAgICAgICAgcHJvYmVDdG9yOiBwcm9iZT8uY29uc3RydWN0b3I/Lm5hbWUgPz8gbnVsbCxcbiAgICAgICAgcHJvYmVSZWNvcmRpbmc6IHByb2JlLmlzUmVjb3JkaW5nKCksXG4gICAgICB9KVxuICAgICk7XG4gICAgcHJvYmUuZW5kKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1t3b3JrZmxvdzpvdGVsLWRpYWddIGNvcmUgZmFpbGVkOicsXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhY2U8VD4oXG4gIHNwYW5OYW1lOiBzdHJpbmcsXG4gIC4uLmFyZ3M6XG4gICAgfCBbZm46IChzcGFuPzogU3BhbikgPT4gUHJvbWlzZTxUPl1cbiAgICB8IFtvcHRzOiBTcGFuT3B0aW9ucywgZm46IChzcGFuPzogU3BhbikgPT4gUHJvbWlzZTxUPl1cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBbdHJhY2VyLCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtUcmFjZXIudmFsdWUsIE90ZWxBcGkudmFsdWVdKTtcbiAgY29uc3QgeyBmbiwgb3B0cyB9ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyB7IGZuOiBhcmdzWzBdLCBvcHRzOiB7fSB9XG4gICAgICA6IHsgZm46IGFyZ3NbMV0sIG9wdHM6IGFyZ3NbMF0gfTtcbiAgaWYgKCFmbikgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiB0byB0cmFjZSBtdXN0IGJlIHByb3ZpZGVkJyk7XG5cbiAgaWYgKCF0cmFjZXIgfHwgIW90ZWwpIHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfVxuXG4gIHJldHVybiB0cmFjZXIuc3RhcnRBY3RpdmVTcGFuKHNwYW5OYW1lLCBvcHRzLCBhc3luYyAoc3BhbikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihzcGFuKTtcbiAgICAgIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogb3RlbC5TcGFuU3RhdHVzQ29kZS5PSyB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlKSkge1xuICAgICAgICBzcGFuLnNldFN0YXR1cyh7IGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuT0sgfSk7XG4gICAgICAgIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKGUsIHNwYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgIGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgbWVzc2FnZTogZGVzY3JpYmVUaHJvd25WYWx1ZShlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiBTdGFydHMgYSBjaGlsZCBzcGFuIHdpdGhvdXQgaW5zdGFsbGluZyBpdCBhcyB0aGUgYWN0aXZlIGNvbnRleHQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUcmFjZVNwYW4oc3Bhbk5hbWU6IHN0cmluZykge1xuICBjb25zdCBbdHJhY2VyLCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtUcmFjZXIudmFsdWUsIE90ZWxBcGkudmFsdWVdKTtcbiAgaWYgKCF0cmFjZXIgfHwgIW90ZWwpIHJldHVybiB7IGVuZCgpIHt9LCBmYWlsKCkge30gfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2VyLnN0YXJ0U3BhbihzcGFuTmFtZSk7XG4gIGxldCBlbmRlZCA9IGZhbHNlO1xuICBjb25zdCBmaW5pc2ggPSAoc3RhdHVzOiBhcGkuU3BhblN0YXR1cykgPT4ge1xuICAgIGlmIChlbmRlZCkgcmV0dXJuO1xuICAgIGVuZGVkID0gdHJ1ZTtcbiAgICBzcGFuLnNldFN0YXR1cyhzdGF0dXMpO1xuICAgIHNwYW4uZW5kKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBlbmQ6ICgpID0+IGZpbmlzaCh7IGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuT0sgfSksXG4gICAgZmFpbDogKGVycm9yOiB1bmtub3duKSA9PlxuICAgICAgZmluaXNoKHtcbiAgICAgICAgY29kZTogb3RlbC5TcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgbWVzc2FnZTogZGVzY3JpYmVUaHJvd25WYWx1ZShlcnJvciksXG4gICAgICB9KSxcbiAgfTtcbn1cblxuLyoqIEJpbmQgd29yayB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBzcGFuIGV2ZW4gd2hlbiBpdCBzdGFydHMgZnJvbSBhIGNoaWxkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJpbmRBY3RpdmVUcmFjZUNvbnRleHQ8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihcbiAgZm46ICguLi5hcmdzOiBBcmdzKSA9PiBSZXN1bHRcbik6IFByb21pc2U8KC4uLmFyZ3M6IEFyZ3MpID0+IFJlc3VsdD4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgcmV0dXJuIG90ZWwgPyBvdGVsLmNvbnRleHQuYmluZChvdGVsLmNvbnRleHQuYWN0aXZlKCksIGZuKSA6IGZuO1xufVxuXG4vKiogS2VlcHMgYSBwYXJrZWQgd29ya2Zsb3cncyBhbWJpZW50IHRyYWNlIGNvbnRleHQgYWxpZ25lZCB3aXRoIGVhY2ggcmVzdW1lLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlZnJlc2hhYmxlVHJhY2VDb250ZXh0KCkge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSB7XG4gICAgcmV0dXJuIHsgcmVmcmVzaCgpIHt9LCBydW46IDxUPihmbjogKCkgPT4gVCk6IFQgPT4gZm4oKSB9O1xuICB9XG5cbiAgbGV0IGN1cnJlbnQgPSBvdGVsLmNvbnRleHQuYWN0aXZlKCk7XG4gIGNvbnN0IGNvbnRleHQ6IGFwaS5Db250ZXh0ID0ge1xuICAgIGdldFZhbHVlOiAoa2V5KSA9PiBjdXJyZW50LmdldFZhbHVlKGtleSksXG4gICAgc2V0VmFsdWU6IChrZXksIHZhbHVlKSA9PiBjdXJyZW50LnNldFZhbHVlKGtleSwgdmFsdWUpLFxuICAgIGRlbGV0ZVZhbHVlOiAoa2V5KSA9PiBjdXJyZW50LmRlbGV0ZVZhbHVlKGtleSksXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZWZyZXNoOiAoKSA9PiB7XG4gICAgICBjdXJyZW50ID0gb3RlbC5jb250ZXh0LmFjdGl2ZSgpO1xuICAgIH0sXG4gICAgcnVuOiA8VD4oZm46ICgpID0+IFQpOiBUID0+IG90ZWwuY29udGV4dC53aXRoKGNvbnRleHQsIGZuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgc3BhbiB3aG9zZSBzdGFydCBpcyBiYWNrLWRhdGVkIHRvIGBzdGFydEVwb2NoTXNgIGFuZCB3aG9zZSBlbmQgaXMgbm93LFxuICogc28gaXRzIGR1cmF0aW9uIHJlZmxlY3RzIGFuIGludGVydmFsIG9ubHkgbWVhc3VyYWJsZSBhdCBpdHMgZW5kIChlLmcuXG4gKiB0aW1lLXRvLWZpcnN0LWNodW5rLCBrbm93biB3aGVuIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzKS4gVW5saWtlIGB0cmFjZSgpYCxcbiAqIHRoaXMgcmVjb3JkcyBhbiBhbHJlYWR5LWVsYXBzZWQgc3BhbiBpbiBvbmUgc2hvdCByYXRoZXIgdGhhbiB3cmFwcGluZyBhXG4gKiBjYWxsYmFjay4gTm8tb3Agd2hlbiBPcGVuVGVsZW1ldHJ5IGlzIG5vdCBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvcmRFbGFwc2VkU3BhbihcbiAgc3Bhbk5hbWU6IHN0cmluZyxcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIG9wdHM/OiBTcGFuT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRyYWNlciA9IGF3YWl0IFRyYWNlci52YWx1ZTtcbiAgaWYgKCF0cmFjZXIpIHJldHVybjtcbiAgdHJhY2VyLnN0YXJ0U3BhbihzcGFuTmFtZSwgeyAuLi5vcHRzLCBzdGFydFRpbWU6IHN0YXJ0RXBvY2hNcyB9KS5lbmQoKTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHRoZSBzYW1lIHVzZXItY29kZSBpbnRlcnZhbCBhcyB0aGUgaW5uZXIgYHN0ZXAuZXhlY3V0ZWAgc3Bhbi4gVGhlXG4gKiBjb25maWd1cmVkIE9wZW5UZWxlbWV0cnkgbWV0ZXIgcHJvdmlkZXIgYXR0YWNoZXMgcmVzb3VyY2UgZGltZW5zaW9ucyBzdWNoIGFzXG4gKiBzZXJ2aWNlLm5hbWUsIHNvIHRoaXMgYXZvaWRzIGFjY2VwdGluZyBhIGNhbGxlci1jb250cm9sbGVkIHNlcnZpY2UgdGFnLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3JkU3RlcEV4ZWN1dGlvbkR1cmF0aW9uKFxuICBkdXJhdGlvbk1zOiBudW1iZXIsXG4gIHN0YXR1czogJ29rJyB8ICdlcnJvcidcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBoaXN0b2dyYW0gPSBhd2FpdCBTdGVwRXhlY3V0aW9uRHVyYXRpb25IaXN0b2dyYW0udmFsdWU7XG4gIGhpc3RvZ3JhbT8ucmVjb3JkKGR1cmF0aW9uTXMsIHsgJ3dvcmtmbG93LnN0ZXAuc3RhdHVzJzogc3RhdHVzIH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIHdvcmtmbG93IHN1c3BlbnNpb24gYWxnZWJyYWljIGVmZmVjdCB0byBhbiBhY3RpdmUgc3Bhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKFxuICBlcnJvcjogV29ya2Zsb3dTdXNwZW5zaW9uLFxuICBzcGFuOiBhcGkuU3BhblxuKTogdm9pZCB7XG4gIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25TdGF0ZSgnc3VzcGVuZGVkJyksXG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25TdGVwQ291bnQoZXJyb3Iuc3RlcENvdW50KSxcbiAgICAuLi5BdHRyLldvcmtmbG93U3VzcGVuc2lvbkhvb2tDb3VudChlcnJvci5ob29rQ291bnQpLFxuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uV2FpdENvdW50KGVycm9yLndhaXRDb3VudCksXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3BhbkNvbnRleHRGb3JUcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuICBjb25zdCBbZGVzZXJpYWxpemVkLCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBkZXNlcmlhbGl6ZVRyYWNlQ2FycmllcihjYXJyaWVyKSxcbiAgICBPdGVsQXBpLnZhbHVlLFxuICBdKTtcbiAgaWYgKCFkZXNlcmlhbGl6ZWQgfHwgIW90ZWwpIHJldHVybjtcbiAgcmV0dXJuIG90ZWwudHJhY2UuZ2V0U3BhbkNvbnRleHQoZGVzZXJpYWxpemVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFjdGl2ZVNwYW4oKSB7XG4gIHJldHVybiBhd2FpdCB3aXRoT3RlbCgob3RlbCkgPT4gb3RlbC50cmFjZS5nZXRBY3RpdmVTcGFuKCkpO1xufVxuXG4vKipcbiAqIFdyYXBzIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCB3aXRoIHRyYWNpbmcgc3BhbnMuXG4gKiBAcGFyYW0gcHJlZml4IC0gUHJlZml4IGZvciBzcGFuIG5hbWVzIChlLmcuLCBcIldPUkxELnJ1bnNcIilcbiAqIEBwYXJhbSBvIC0gT2JqZWN0IHdpdGggbWV0aG9kcyB0byBpbnN0cnVtZW50XG4gKiBAcmV0dXJucyBJbnN0cnVtZW50ZWQgb2JqZWN0IHdpdGggc2FtZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydW1lbnRPYmplY3Q8VCBleHRlbmRzIG9iamVjdD4ocHJlZml4OiBzdHJpbmcsIG86IFQpOiBUIHtcbiAgY29uc3QgaGFuZGxlcnMgPSB7fSBhcyBUO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvKSBhcyAoa2V5b2YgVClbXSkge1xuICAgIGlmICh0eXBlb2Ygb1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBoYW5kbGVyc1trZXldID0gb1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmID0gb1trZXldO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgaGFuZGxlcnNba2V5XSA9IGFzeW5jICguLi5hcmdzOiBhbnlbXSkgPT5cbiAgICAgICAgdHJhY2UoYCR7cHJlZml4fS4ke1N0cmluZyhrZXkpfWAsIHt9LCAoKSA9PiBmKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXJzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3BhbktpbmQoZmllbGQ6IGtleW9mIHR5cGVvZiBTcGFuS2luZCkge1xuICByZXR1cm4gd2l0aE90ZWwoKHgpID0+IHguU3BhbktpbmRbZmllbGRdKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhPdGVsPFQ+KFxuICBmbjogKG90ZWw6IHR5cGVvZiBhcGkpID0+IFRcbik6IFByb21pc2U8QXdhaXRlZDxUPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXdhaXQgZm4ob3RlbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVG9DdXJyZW50Q29udGV4dCgpOiBQcm9taXNlPFthcGkuTGlua10gfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHdpdGhPdGVsKChvdGVsKTogW2FwaS5MaW5rXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG90ZWwudHJhY2UuZ2V0QWN0aXZlU3BhbigpPy5zcGFuQ29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xuICAgIHJldHVybiBbeyBjb250ZXh0IH1dO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBzcGFuIGxpbmsgcG9pbnRpbmcgYXQgdGhlIHNwYW4gY29udGV4dCBlbWJlZGRlZCBpbiBhIHNlcmlhbGl6ZWRcbiAqIHRyYWNlIGNhcnJpZXIgKGUuZy4gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmbG93aW5nIHRocm91Z2ggcXVldWVcbiAqIG1lc3NhZ2VzKS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIE9URUwgaXMgdW5hdmFpbGFibGUsIHRoZSBjYXJyaWVyIGlzXG4gKiBhYnNlbnQsIG9yIGl0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBzcGFuIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8YXBpLkxpbmsgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFjYXJyaWVyKSByZXR1cm47XG4gIGNvbnN0IFtjb250ZXh0LCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBnZXRTcGFuQ29udGV4dEZvclRyYWNlQ2FycmllcihjYXJyaWVyKSxcbiAgICBPdGVsQXBpLnZhbHVlLFxuICBdKTtcbiAgaWYgKCFjb250ZXh0IHx8ICFvdGVsKSByZXR1cm47XG4gIGlmICghb3RlbC50cmFjZS5pc1NwYW5Db250ZXh0VmFsaWQoY29udGV4dCkpIHJldHVybjtcbiAgcmV0dXJuIHsgY29udGV4dCB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJhZ2dhZ2UgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBXb3JrZmxvdyBjb250ZXh0IHRvIHByb3BhZ2F0ZSB2aWEgYmFnZ2FnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQge1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNldHMgd29ya2Zsb3cgY29udGV4dCBhcyBPVEVMIGJhZ2dhZ2UgZm9yIGF1dG9tYXRpYyBwcm9wYWdhdGlvbi5cbiAqIEJhZ2dhZ2UgaXMgcHJvcGFnYXRlZCBhY3Jvc3Mgc2VydmljZSBib3VuZGFyaWVzIHZpYSBIVFRQIGhlYWRlcnMuXG4gKiBAcGFyYW0gY29udGV4dCAtIFdvcmtmbG93IGNvbnRleHQgdG8gc2V0IGFzIGJhZ2dhZ2VcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcnVuIHdpdGhpbiB0aGUgYmFnZ2FnZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoV29ya2Zsb3dCYWdnYWdlPFQ+KFxuICBjb250ZXh0OiBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0LFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiBmbigpO1xuXG4gIC8vIENyZWF0ZSBiYWdnYWdlIHdpdGggd29ya2Zsb3cgY29udGV4dFxuICBjb25zdCBiYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKHtcbiAgICAnd29ya2Zsb3cucnVuX2lkJzogeyB2YWx1ZTogY29udGV4dC53b3JrZmxvd1J1bklkIH0sXG4gICAgJ3dvcmtmbG93Lm5hbWUnOiB7IHZhbHVlOiBjb250ZXh0LndvcmtmbG93TmFtZSB9LFxuICB9KTtcblxuICAvLyBTZXQgYmFnZ2FnZSBpbiBjb250ZXh0IGFuZCBydW4gZnVuY3Rpb25cbiAgY29uc3QgY29udGV4dFdpdGhCYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5zZXRCYWdnYWdlKFxuICAgIG90ZWwuY29udGV4dC5hY3RpdmUoKSxcbiAgICBiYWdnYWdlXG4gICk7XG5cbiAgcmV0dXJuIG90ZWwuY29udGV4dC53aXRoKGNvbnRleHRXaXRoQmFnZ2FnZSwgKCkgPT4gZm4oKSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHdvcmtmbG93IGNvbnRleHQgZnJvbSBPVEVMIGJhZ2dhZ2UuXG4gKiBAcmV0dXJucyBXb3JrZmxvdyBjb250ZXh0IGlmIHByZXNlbnQgaW4gYmFnZ2FnZSwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2Zsb3dCYWdnYWdlKCk6IFByb21pc2U8XG4gIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJhZ2dhZ2UgPSBvdGVsLnByb3BhZ2F0aW9uLmdldEJhZ2dhZ2Uob3RlbC5jb250ZXh0LmFjdGl2ZSgpKTtcbiAgaWYgKCFiYWdnYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJ1bklkID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cucnVuX2lkJyk/LnZhbHVlO1xuICBjb25zdCBuYW1lID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cubmFtZScpPy52YWx1ZTtcblxuICBpZiAoIXJ1bklkIHx8ICFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lOiBuYW1lLFxuICB9O1xufVxuIl19
@@ -0,0 +1,25 @@
1
+ import type { Event } from '@workflow/world';
2
+ import type { WorkflowOrchestratorContext } from '../private.js';
3
+ /**
4
+ * Builds an orchestrator context that replays a hand-written event log through
5
+ * the real workflow primitives (`createUseStep`, `createSleep`,
6
+ * `createCreateHook`), without a World or a VM entrypoint.
7
+ */
8
+ export declare function setupWorkflowContext(events: Event[], options?: {
9
+ onDuplicateEvent?: (event: Event) => void;
10
+ }): WorkflowOrchestratorContext;
11
+ /**
12
+ * Deterministic correlation IDs from the ULID generator with seed 'test', in
13
+ * the order {@link setupWorkflowContext}'s generator mints them.
14
+ */
15
+ export declare const CORR_IDS: string[];
16
+ /**
17
+ * Runs `workflowFn` against `ctx`, racing it against the context's error
18
+ * channel so a `WorkflowSuspension` or a detected divergence surfaces as
19
+ * `error` rather than hanging.
20
+ */
21
+ export declare function runWithDiscontinuation(ctx: WorkflowOrchestratorContext, workflowFn: () => Promise<any>): Promise<{
22
+ result?: any;
23
+ error?: any;
24
+ }>;
25
+ //# sourceMappingURL=orchestrator-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-context.d.ts","sourceRoot":"","sources":["../../src/test-support/orchestrator-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAK7C,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAIjE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,KAAK,EAAE,EACf,OAAO,GAAE;IAAE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAAO,GAC1D,2BAA2B,CA2D7B;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,UAOpB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GAC7B,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAexC"}