@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,4 +1,4 @@
1
- import { RUN_ERROR_CODES, SerializationError, WorkflowRuntimeError, } from '@workflow/errors';
1
+ import { CorruptedEventLogError, RUN_ERROR_CODES, SerializationError, WorkflowRuntimeError, } from '@workflow/errors';
2
2
  import { classifyRunError } from './classify-error.js';
3
3
  import { NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, UnavailableInWorkflowContextError, } from './context-errors.js';
4
4
  const CONTEXT_ERROR_NAMES = new Set([
@@ -16,10 +16,15 @@ function isContextViolationError(err) {
16
16
  const SERIALIZATION_ERROR_HINT = 'A value passed across a workflow/step boundary could not be serialized. See the error message for the offending path and the Learn More link for details.';
17
17
  const CONTEXT_ERROR_HINT = 'A workflow-only or step-only API was called from the wrong context. The error message includes the exact API and how to move the call.';
18
18
  const RUNTIME_ERROR_HINT = 'This is an internal workflow SDK error, not a bug in your code. If it keeps happening, please report it with the stack trace and the runId.';
19
- const REPLAY_TIMEOUT_HINT = 'The workflow replay took too long. This usually means the event log is unusually large or the workflow function is doing heavy synchronous work between step boundaries.';
19
+ const CORRUPTED_EVENT_LOG_HINT = 'The workflow event log contains orphaned or mismatched events and cannot be replayed. This is an internal workflow SDK error; please report it with the runId.';
20
+ const REPLAY_TIMEOUT_HINT = 'The workflow replay between step boundaries took too long. This bounds workflow-VM and event-log replay time only — step bodies (`"use step"` functions) are excluded. This usually means the event log is unusually large or the workflow function is doing heavy synchronous work in workflow code outside of step bodies. Override the default budget via the WORKFLOW_REPLAY_TIMEOUT_MS env var if needed.';
20
21
  const MAX_DELIVERIES_HINT = 'The workflow queue exceeded its max-delivery budget. This usually indicates a persistent runtime failure — check the most recent stack traces for the underlying cause.';
22
+ const MAX_EVENTS_HINT = 'The workflow exceeded the maximum number of events per run. This usually means unbounded work in the workflow function — e.g. a loop that keeps creating steps without terminating. Break long-running workflows into child workflows to stay under the limit.';
23
+ const STREAM_ERROR_HINT = 'Workflow stream infrastructure failed while reading or writing data. This is an SDK or backend failure, not an error in your workflow code; please retry the run and report persistent failures with the runId.';
24
+ const WORLD_CONTRACT_HINT = 'The workflow backend returned data that violated the SDK contract. This is not retryable; please report it with the stack trace and runId.';
25
+ const DEPLOYMENT_MISMATCH_HINT = "The run was delivered to a deployment other than the deployment it is pinned to, and was stopped to protect against code-skew errors after the runtime failed to re-route it there. Verify that the run's deployment is still available and that queue callbacks route to it.";
21
26
  function normalizeErrorCode(code) {
22
- // Values read back from persisted events are `string | undefined` we
27
+ // Values read back from persisted events are `string | undefined`, so we
23
28
  // only trust codes that match a known entry in `RUN_ERROR_CODES`.
24
29
  const known = Object.values(RUN_ERROR_CODES);
25
30
  if (code && known.includes(code)) {
@@ -29,21 +34,27 @@ function normalizeErrorCode(code) {
29
34
  }
30
35
  /**
31
36
  * Data-driven variant of {@link describeError} that works from persisted
32
- * event fields instead of a live `Error` instance. Intended for CLI/web
33
- * renderers that read failure events and no longer have the original
34
- * thrown object.
37
+ * event fields instead of a live `Error` instance. Intended for command-line
38
+ * interface (CLI) and web renderers that read failure events and no longer
39
+ * have the original thrown object.
35
40
  */
36
41
  export function describeRunError(signal) {
37
- const errorCode = normalizeErrorCode(signal.errorCode);
38
42
  const name = signal.errorName;
43
+ const errorCode = name === 'CorruptedEventLogError'
44
+ ? RUN_ERROR_CODES.CORRUPTED_EVENT_LOG
45
+ : normalizeErrorCode(signal.errorCode);
39
46
  if (name === 'SerializationError') {
40
47
  return { attribution: 'user', errorCode, hint: SERIALIZATION_ERROR_HINT };
41
48
  }
42
49
  if (name && CONTEXT_ERROR_NAMES.has(name)) {
43
50
  return { attribution: 'user', errorCode, hint: CONTEXT_ERROR_HINT };
44
51
  }
45
- if (name === 'WorkflowRuntimeError' || name === 'StepNotRegisteredError') {
46
- return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
52
+ if (name === 'CorruptedEventLogError') {
53
+ return {
54
+ attribution: 'sdk',
55
+ errorCode,
56
+ hint: CORRUPTED_EVENT_LOG_HINT,
57
+ };
47
58
  }
48
59
  if (errorCode === RUN_ERROR_CODES.REPLAY_TIMEOUT) {
49
60
  return { attribution: 'sdk', errorCode, hint: REPLAY_TIMEOUT_HINT };
@@ -51,13 +62,43 @@ export function describeRunError(signal) {
51
62
  if (errorCode === RUN_ERROR_CODES.MAX_DELIVERIES_EXCEEDED) {
52
63
  return { attribution: 'sdk', errorCode, hint: MAX_DELIVERIES_HINT };
53
64
  }
65
+ if (errorCode === RUN_ERROR_CODES.MAX_EVENTS_EXCEEDED) {
66
+ return { attribution: 'user', errorCode, hint: MAX_EVENTS_HINT };
67
+ }
68
+ if (errorCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
69
+ return {
70
+ attribution: 'sdk',
71
+ errorCode,
72
+ hint: CORRUPTED_EVENT_LOG_HINT,
73
+ };
74
+ }
75
+ if (errorCode === RUN_ERROR_CODES.STREAM_ERROR) {
76
+ return {
77
+ attribution: 'sdk',
78
+ errorCode,
79
+ hint: STREAM_ERROR_HINT,
80
+ };
81
+ }
82
+ if (errorCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
83
+ return {
84
+ attribution: 'sdk',
85
+ errorCode,
86
+ hint: WORLD_CONTRACT_HINT,
87
+ };
88
+ }
89
+ if (errorCode === RUN_ERROR_CODES.DEPLOYMENT_MISMATCH) {
90
+ return { attribution: 'sdk', errorCode, hint: DEPLOYMENT_MISMATCH_HINT };
91
+ }
92
+ if (name === 'WorkflowRuntimeError' || name === 'StepNotRegisteredError') {
93
+ return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
94
+ }
54
95
  if (errorCode === RUN_ERROR_CODES.RUNTIME_ERROR) {
55
96
  return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
56
97
  }
57
98
  return { attribution: 'user', errorCode };
58
99
  }
59
100
  /**
60
- * Describe an error for user-facing presentation. Purely informational
101
+ * Describe an error for user-facing presentation. Purely informational: it
61
102
  * does not change any persisted event data or error classification used by
62
103
  * the runtime.
63
104
  *
@@ -69,7 +110,7 @@ export function describeRunError(signal) {
69
110
  * - Context-violation errors (`NotInWorkflowContextError`, etc.) likewise
70
111
  * describe a user mistake.
71
112
  * - `WorkflowRuntimeError` (and subclasses like `StepNotRegisteredError`)
72
- * indicates an internal SDK invariant broke surface that as `sdk`.
113
+ * indicates an internal SDK invariant broke, so surface that as `sdk`.
73
114
  *
74
115
  * @param err The error value thrown by the workflow / step.
75
116
  * @param errorCode Optional precomputed error code. Callers that already
@@ -93,6 +134,22 @@ export function describeError(err, errorCode) {
93
134
  hint: CONTEXT_ERROR_HINT,
94
135
  };
95
136
  }
137
+ if (CorruptedEventLogError.is(err)) {
138
+ return {
139
+ attribution: 'sdk',
140
+ errorCode: effectiveCode,
141
+ hint: CORRUPTED_EVENT_LOG_HINT,
142
+ };
143
+ }
144
+ // Check DEPLOYMENT_MISMATCH before the generic WorkflowRuntimeError branch:
145
+ // WorkflowDeploymentMismatchError subclasses it, but has its own code + hint.
146
+ if (effectiveCode === RUN_ERROR_CODES.DEPLOYMENT_MISMATCH) {
147
+ return {
148
+ attribution: 'sdk',
149
+ errorCode: effectiveCode,
150
+ hint: DEPLOYMENT_MISMATCH_HINT,
151
+ };
152
+ }
96
153
  if (err instanceof WorkflowRuntimeError) {
97
154
  return {
98
155
  attribution: 'sdk',
@@ -114,6 +171,34 @@ export function describeError(err, errorCode) {
114
171
  hint: MAX_DELIVERIES_HINT,
115
172
  };
116
173
  }
174
+ if (effectiveCode === RUN_ERROR_CODES.MAX_EVENTS_EXCEEDED) {
175
+ return {
176
+ attribution: 'user',
177
+ errorCode: effectiveCode,
178
+ hint: MAX_EVENTS_HINT,
179
+ };
180
+ }
181
+ if (effectiveCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
182
+ return {
183
+ attribution: 'sdk',
184
+ errorCode: effectiveCode,
185
+ hint: CORRUPTED_EVENT_LOG_HINT,
186
+ };
187
+ }
188
+ if (effectiveCode === RUN_ERROR_CODES.STREAM_ERROR) {
189
+ return {
190
+ attribution: 'sdk',
191
+ errorCode: effectiveCode,
192
+ hint: STREAM_ERROR_HINT,
193
+ };
194
+ }
195
+ if (effectiveCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
196
+ return {
197
+ attribution: 'sdk',
198
+ errorCode: effectiveCode,
199
+ hint: WORLD_CONTRACT_HINT,
200
+ };
201
+ }
117
202
  return { attribution: 'user', errorCode: effectiveCode };
118
203
  }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVzY3JpYmUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGVBQWUsRUFFZixrQkFBa0IsRUFDbEIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLGlDQUFpQyxHQUNsQyxNQUFNLHFCQUFxQixDQUFDO0FBNEM3QixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2xDLDJCQUEyQjtJQUMzQix1QkFBdUI7SUFDdkIsaUNBQWlDO0lBQ2pDLG1DQUFtQztDQUNwQyxDQUFDLENBQUM7QUFFSCxTQUFTLHVCQUF1QixDQUFDLEdBQVk7SUFDM0MsT0FBTyxDQUNMLEdBQUcsWUFBWSx5QkFBeUI7UUFDeEMsR0FBRyxZQUFZLHFCQUFxQjtRQUNwQyxHQUFHLFlBQVksK0JBQStCO1FBQzlDLEdBQUcsWUFBWSxpQ0FBaUMsQ0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLHdCQUF3QixHQUM1QiwySkFBMkosQ0FBQztBQUM5SixNQUFNLGtCQUFrQixHQUN0Qix3SUFBd0ksQ0FBQztBQUMzSSxNQUFNLGtCQUFrQixHQUN0Qiw2SUFBNkksQ0FBQztBQUNoSixNQUFNLG1CQUFtQixHQUN2QiwwS0FBMEssQ0FBQztBQUM3SyxNQUFNLG1CQUFtQixHQUN2Qix5S0FBeUssQ0FBQztBQUU1SyxTQUFTLGtCQUFrQixDQUFDLElBQXdCO0lBQ2xELHVFQUF1RTtJQUN2RSxrRUFBa0U7SUFDbEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQXNCLENBQUM7SUFDbEUsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEs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RUQsSUFBSSxhQUFhLEtBQUssZUFBZSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDOUQsT0FBTztZQUNMLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLElBQUksRUFBRSxtQkFBbUI7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciB9IGZyb20gJy4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHtcbiAgTm90SW5TdGVwQ29udGV4dEVycm9yLFxuICBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yLFxuICBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yLFxuICBVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG59IGZyb20gJy4vY29udGV4dC1lcnJvcnMuanMnO1xuXG4vKipcbiAqIEF0dHJpYnV0aW9uIG9mIGEgd29ya2Zsb3cvc3RlcCBmYWlsdXJlIGZvciBwcmVzZW50YXRpb24uXG4gKlxuICogLSBgdXNlcmA6IHRoZSBlcnJvciBjYW1lIGZyb20gY3VzdG9tZXIgY29kZSAoYSBzdGVwIG9yIHdvcmtmbG93IGZ1bmN0aW9uXG4gKiAgIHRocmV3LCBvciBhIHZhbHVlIHRoZXkgcGFzc2VkIGFjcm9zcyBhIGJvdW5kYXJ5IHdhc24ndCBzZXJpYWxpemFibGUpLlxuICogLSBgc2RrYDogdGhlIFNESyBwcm9kdWNlZCB0aGUgZXJyb3IgaXRzZWxmIOKAlCBhbiBpbnRlcm5hbCBpbnZhcmlhbnQgYnJva2UsXG4gKiAgIG9yIGEgcnVudGltZSBndWFyZCByZWplY3RlZCB0aGUgY2FsbC4gVGhlc2Ugc2hvdWxkIGJlIHJhcmU7IHdoZW4gdGhleVxuICogICBoYXBwZW4gd2Ugd2FudCB0byBmcmFtZSB0aGUgdGVybWluYWwgb3V0cHV0IGFzIFwidGhpcyBpcyB1cywgbm90IHlvdS5cIlxuICovXG5leHBvcnQgdHlwZSBFcnJvckF0dHJpYnV0aW9uID0gJ3VzZXInIHwgJ3Nkayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGF0dHJpYnV0aW9uOiBFcnJvckF0dHJpYnV0aW9uO1xuICBlcnJvckNvZGU6IFJ1bkVycm9yQ29kZTtcbiAgLyoqXG4gICAqIFNob3J0LCBjbGFzcy1hd2FyZSBoaW50IHRvIGhlbHAgYSB1c2VyIHVuZGVyc3RhbmQgd2hhdCB0aGUgZXJyb3IgbWVhbnMuXG4gICAqIE9ubHkgc2V0IGZvciB3ZWxsLWtub3duIFNESyBlcnJvciBjbGFzc2VzIChTZXJpYWxpemF0aW9uRXJyb3IsXG4gICAqIFdvcmtmbG93UnVudGltZUVycm9yLCBjb250ZXh0LXZpb2xhdGlvbiBlcnJvcnMpOyBgdW5kZWZpbmVkYCBmb3IgcGxhaW5cbiAgICogdXNlciBlcnJvcnMsIHdoZXJlIHRoZSBzdGFjayBpcyBhbHJlYWR5IHRoZSBtb3N0IHVzZWZ1bCB0aGluZyB0byBzaG93LlxuICAgKi9cbiAgaGludD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBFcnJvciBzaWduYWwgZmllbGRzIGNhcnJpZWQgb24gcGVyc2lzdGVkIGZhaWx1cmUgZXZlbnRzIChlLmcuXG4gKiBgcnVuX2ZhaWxlZGAgLyBgc3RlcF9mYWlsZWRgKS4gVGhlIHNoYXBlIGlzIGludGVudGlvbmFsbHkgbG9vc2U6XG4gKlxuICogLSBgZXJyb3JDb2RlYCBpcyB0eXBlZCBhcyBgc3RyaW5nYCByYXRoZXIgdGhhbiBgUnVuRXJyb3JDb2RlYCBiZWNhdXNlXG4gKiAgIHRoZSB2YWx1ZSBjb21lcyBmcm9tIHN0b3JlZCBKU09OL0NCT1IgYW5kIG1heSBwcmVkYXRlIHRoZSBjdXJyZW50XG4gKiAgIGVudW0g4oCUIGNhbGxlcnMgc2hvdWxkIG5vdCBuYXJyb3cgb24gaXQgYmxpbmRseS4gVmFsdWVzIHRoYXQgZG9uJ3RcbiAqICAgbWF0Y2ggYSBrbm93biBgUlVOX0VSUk9SX0NPREVTYCBlbnRyeSBmYWxsIHRocm91Z2ggdG8gVVNFUl9FUlJPUi5cbiAqIC0gYGVycm9yTmFtZWAgaXMgdGhlIHRocm93biBgRXJyb3IjbmFtZWAuIEl0IGlzIG5vdCB1bml2ZXJzYWxseVxuICogICBwZXJzaXN0ZWQgdG9kYXk7IGNhbGxlcnMgdGhhdCBoYXZlIGFjY2VzcyB0byBpdCAoZWl0aGVyIHZpYSBhblxuICogICBpbi1tZW1vcnkgdGhyb3cgb3IgYSByaWNoZXIgcGF5bG9hZCkgY2FuIHBhc3MgaXQgaW4gdG8gc2hhcnBlblxuICogICB0aGUgYXR0cmlidXRpb24gYW5kIGhpbnQuIFdoZW4gYWJzZW50LCBgZGVzY3JpYmVSdW5FcnJvcmAgc3RpbGxcbiAqICAgcmV0dXJucyBhIHNlbnNpYmxlIGF0dHJpYnV0aW9uIGZyb20gYGVycm9yQ29kZWAgYWxvbmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVyc2lzdGVkRXJyb3JTaWduYWwge1xuICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gIGVycm9yTmFtZT86IHN0cmluZztcbn1cblxuY29uc3QgQ09OVEVYVF9FUlJPUl9OQU1FUyA9IG5ldyBTZXQoW1xuICAnTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcicsXG4gICdOb3RJblN0ZXBDb250ZXh0RXJyb3InLFxuICAnTm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHRFcnJvcicsXG4gICdVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3InLFxuXSk7XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFZpb2xhdGlvbkVycm9yKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGVyciBpbnN0YW5jZW9mIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IgfHxcbiAgICBlcnIgaW5zdGFuY2VvZiBOb3RJblN0ZXBDb250ZXh0RXJyb3IgfHxcbiAgICBlcnIgaW5zdGFuY2VvZiBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yIHx8XG4gICAgZXJyIGluc3RhbmNlb2YgVW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dEVycm9yXG4gICk7XG59XG5cbmNvbnN0IFNFUklBTElaQVRJT05fRVJST1JfSElOVCA9XG4gICdBIHZhbHVlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdy9zdGVwIGJvdW5kYXJ5IGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLiBTZWUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBvZmZlbmRpbmcgcGF0aCBhbmQgdGhlIExlYXJuIE1vcmUgbGluayBmb3IgZGV0YWlscy4nO1xuY29uc3QgQ09OVEVYVF9FUlJPUl9ISU5UID1cbiAgJ0Egd29ya2Zsb3ctb25seSBvciBzdGVwLW9ubHkgQVBJIHdhcyBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgY29udGV4dC4gVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4YWN0IEFQSSBhbmQgaG93IHRvIG1vdmUgdGhlIGNhbGwuJztcbmNvbnN0IFJVTlRJTUVfRVJST1JfSElOVCA9XG4gICdUaGlzIGlzIGFuIGludGVybmFsIHdvcmtmbG93IFNESyBlcnJvciwgbm90IGEgYnVnIGluIHlvdXIgY29kZS4gSWYgaXQga2VlcHMgaGFwcGVuaW5nLCBwbGVhc2UgcmVwb3J0IGl0IHdpdGggdGhlIHN0YWNrIHRyYWNlIGFuZCB0aGUgcnVuSWQuJztcbmNvbnN0IFJFUExBWV9USU1FT1VUX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHJlcGxheSB0b29rIHRvbyBsb25nLiBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIGV2ZW50IGxvZyBpcyB1bnVzdWFsbHkgbGFyZ2Ugb3IgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGRvaW5nIGhlYXZ5IHN5bmNocm9ub3VzIHdvcmsgYmV0d2VlbiBzdGVwIGJvdW5kYXJpZXMuJztcbmNvbnN0IE1BWF9ERUxJVkVSSUVTX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHF1ZXVlIGV4Y2VlZGVkIGl0cyBtYXgtZGVsaXZlcnkgYnVkZ2V0LiBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgcGVyc2lzdGVudCBydW50aW1lIGZhaWx1cmUg4oCUIGNoZWNrIHRoZSBtb3N0IHJlY2VudCBzdGFjayB0cmFjZXMgZm9yIHRoZSB1bmRlcmx5aW5nIGNhdXNlLic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQ29kZShjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSdW5FcnJvckNvZGUge1xuICAvLyBWYWx1ZXMgcmVhZCBiYWNrIGZyb20gcGVyc2lzdGVkIGV2ZW50cyBhcmUgYHN0cmluZyB8IHVuZGVmaW5lZGAg4oCUIHdlXG4gIC8vIG9ubHkgdHJ1c3QgY29kZXMgdGhhdCBtYXRjaCBhIGtub3duIGVudHJ5IGluIGBSVU5fRVJST1JfQ09ERVNgLlxuICBjb25zdCBrbm93biA9IE9iamVjdC52YWx1ZXMoUlVOX0VSUk9SX0NPREVTKSBhcyByZWFkb25seSBzdHJpbmdbXTtcbiAgaWYgKGNvZGUgJiYga25vd24uaW5jbHVkZXMoY29kZSkpIHtcbiAgICByZXR1cm4gY29kZSBhcyBSdW5FcnJvckNvZGU7XG4gIH1cbiAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5VU0VSX0VSUk9SO1xufVxuXG4vKipcbiAqIERhdGEtZHJpdmVuIHZhcmlhbnQgb2Yge0BsaW5rIGRlc2NyaWJlRXJyb3J9IHRoYXQgd29ya3MgZnJvbSBwZXJzaXN0ZWRcbiAqIGV2ZW50IGZpZWxkcyBpbnN0ZWFkIG9mIGEgbGl2ZSBgRXJyb3JgIGluc3RhbmNlLiBJbnRlbmRlZCBmb3IgQ0xJL3dlYlxuICogcmVuZGVyZXJzIHRoYXQgcmVhZCBmYWlsdXJlIGV2ZW50cyBhbmQgbm8gbG9uZ2VyIGhhdmUgdGhlIG9yaWdpbmFsXG4gKiB0aHJvd24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVSdW5FcnJvcihcbiAgc2lnbmFsOiBQZXJzaXN0ZWRFcnJvclNpZ25hbFxuKTogRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGNvbnN0IGVycm9yQ29kZSA9IG5vcm1hbGl6ZUVycm9yQ29kZShzaWduYWwuZXJyb3JDb2RlKTtcbiAgY29uc3QgbmFtZSA9IHNpZ25hbC5lcnJvck5hbWU7XG5cbiAgaWYgKG5hbWUgPT09ICdTZXJpYWxpemF0aW9uRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlLCBoaW50OiBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQgfTtcbiAgfVxuICBpZiAobmFtZSAmJiBDT05URVhUX0VSUk9SX05BTUVTLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSwgaGludDogQ09OVEVYVF9FUlJPUl9ISU5UIH07XG4gIH1cbiAgaWYgKG5hbWUgPT09ICdXb3JrZmxvd1J1bnRpbWVFcnJvcicgfHwgbmFtZSA9PT0gJ1N0ZXBOb3RSZWdpc3RlcmVkRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQgfTtcbiAgfVxuICBpZiAoZXJyb3JDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUikge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBSVU5USU1FX0VSUk9SX0hJTlQgfTtcbiAgfVxuICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGUgfTtcbn1cblxuLyoqXG4gKiBEZXNjcmliZSBhbiBlcnJvciBmb3IgdXNlci1mYWNpbmcgcHJlc2VudGF0aW9uLiBQdXJlbHkgaW5mb3JtYXRpb25hbCDigJRcbiAqIGRvZXMgbm90IGNoYW5nZSBhbnkgcGVyc2lzdGVkIGV2ZW50IGRhdGEgb3IgZXJyb3IgY2xhc3NpZmljYXRpb24gdXNlZCBieVxuICogdGhlIHJ1bnRpbWUuXG4gKlxuICogVGhlIGF0dHJpYnV0aW9uIGhlcmUgaXMgbW9yZSBudWFuY2VkIHRoYW4gYGNsYXNzaWZ5UnVuRXJyb3JgOlxuICpcbiAqIC0gYFNlcmlhbGl6YXRpb25FcnJvcmAgaXMgdGVjaG5pY2FsbHkgcmFpc2VkIGJ5IHRoZSBTREssIGJ1dCBpdCBhbG1vc3RcbiAqICAgYWx3YXlzIHBvaW50cyBhdCBzb21ldGhpbmcgdGhlIGNhbGxlciBkaWQgKHBhc3NlZCBhIG5vbi1zZXJpYWxpemFibGVcbiAqICAgdmFsdWUsIGRpZG4ndCByZWdpc3RlciBhIGNsYXNzKS4gV2UgYXR0cmlidXRlIGl0IHRvIHRoZSB1c2VyLlxuICogLSBDb250ZXh0LXZpb2xhdGlvbiBlcnJvcnMgKGBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yYCwgZXRjLikgbGlrZXdpc2VcbiAqICAgZGVzY3JpYmUgYSB1c2VyIG1pc3Rha2UuXG4gKiAtIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgKGFuZCBzdWJjbGFzc2VzIGxpa2UgYFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3JgKVxuICogICBpbmRpY2F0ZXMgYW4gaW50ZXJuYWwgU0RLIGludmFyaWFudCBicm9rZSDigJQgc3VyZmFjZSB0aGF0IGFzIGBzZGtgLlxuICpcbiAqIEBwYXJhbSBlcnIgVGhlIGVycm9yIHZhbHVlIHRocm93biBieSB0aGUgd29ya2Zsb3cgLyBzdGVwLlxuICogQHBhcmFtIGVycm9yQ29kZSBPcHRpb25hbCBwcmVjb21wdXRlZCBlcnJvciBjb2RlLiBDYWxsZXJzIHRoYXQgYWxyZWFkeVxuICogICBrbm93IHRoZSBjb2RlIChlLmcuIGBSRVBMQVlfVElNRU9VVGAgb3IgYE1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEYCwgd2hpY2hcbiAqICAgYGNsYXNzaWZ5UnVuRXJyb3JgIGNhbid0IGRlcml2ZSBmcm9tIHRoZSBlcnJvciBhbG9uZSkgc2hvdWxkIHBhc3MgaXQgc29cbiAqICAgdGhlIGF0dHJpYnV0aW9uIGFuZCBoaW50IHJlZmxlY3QgdGhlIGFjdHVhbCBmYWlsdXJlIGNhdGVnb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVFcnJvcihcbiAgZXJyOiB1bmtub3duLFxuICBlcnJvckNvZGU/OiBSdW5FcnJvckNvZGVcbik6IEVycm9yRGVzY3JpcHRpb24ge1xuICBjb25zdCBlZmZlY3RpdmVDb2RlID0gZXJyb3JDb2RlID8/IGNsYXNzaWZ5UnVuRXJyb3IoZXJyKTtcblxuICBpZiAoU2VyaWFsaXphdGlvbkVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICd1c2VyJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFNFUklBTElaQVRJT05fRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzQ29udGV4dFZpb2xhdGlvbkVycm9yKGVycikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICd1c2VyJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IENPTlRFWFRfRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVyciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSB9O1xufVxuIl19
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVzY3JpYmUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBRWYsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQixpQ0FBaUMsR0FDbEMsTUFBTSxxQkFBcUIsQ0FBQztBQTRDN0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNsQywyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGlDQUFpQztJQUNqQyxtQ0FBbUM7Q0FDcEMsQ0FBQyxDQUFDO0FBRUgsU0FBUyx1QkFBdUIsQ0FBQyxHQUFZO0lBQzNDLE9BQU8sQ0FDTCxHQUFHLFlBQVkseUJBQXlCO1FBQ3hDLEdBQUcsWUFBWSxxQkFBcUI7UUFDcEMsR0FBRyxZQUFZLCtCQUErQjtRQUM5QyxHQUFHLFlBQVksaUNBQWlDLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSx3QkFBd0IsR0FDNUIsMkpBQTJKLENBQUM7QUFDOUosTUFBTSxrQkFBa0IsR0FDdEIsd0lBQXdJLENBQUM7QUFDM0ksTUFBTSxrQkFBa0IsR0FDdEIsNklBQTZJLENBQUM7QUFDaEosTUFBTSx3QkFBd0IsR0FDNUIsZ0tBQWdLLENBQUM7QUFDbkssTUFBTSxtQkFBbUIsR0FDdkIsZ1pBQWdaLENBQUM7QUFDblosTUFBTSxtQkFBbUIsR0FDdkIseUtBQXlLLENBQUM7QUFDNUssTUFBTSxlQUFlLEdBQ25CLGdRQUFnUSxDQUFDO0FBQ25RLE1BQU0saUJBQWlCLEdBQ3JCLGlOQUFpTixDQUFDO0FBQ3BOLE1BQU0sbUJBQW1CLEdBQ3ZCLDRJQUE0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Q0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLEtBQUs7WUFDbEIsU0FBUyxFQUFFLGFBQWE7WUFDeEIsSUFBSSxFQUFFLGlCQUFpQjtTQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksYUFBYSxLQUFLLGVBQWUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNELE9BQU87WUFDTCxXQUFXLEVBQUUsS0FBSztZQUNsQixTQUFTLEVBQUUsYUFBYTtZQUN4QixJQUFJLEVBQUUsbUJBQW1CO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb3JydXB0ZWRFdmVudExvZ0Vycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGNsYXNzaWZ5UnVuRXJyb3IgfSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7XG4gIE5vdEluU3RlcENvbnRleHRFcnJvcixcbiAgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcixcbiAgTm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHRFcnJvcixcbiAgVW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dEVycm9yLFxufSBmcm9tICcuL2NvbnRleHQtZXJyb3JzLmpzJztcblxuLyoqXG4gKiBBdHRyaWJ1dGlvbiBvZiBhIHdvcmtmbG93L3N0ZXAgZmFpbHVyZSBmb3IgcHJlc2VudGF0aW9uLlxuICpcbiAqIC0gYHVzZXJgOiB0aGUgZXJyb3IgY2FtZSBmcm9tIGN1c3RvbWVyIGNvZGUgKGEgc3RlcCBvciB3b3JrZmxvdyBmdW5jdGlvblxuICogICB0aHJldywgb3IgYSB2YWx1ZSB0aGV5IHBhc3NlZCBhY3Jvc3MgYSBib3VuZGFyeSB3YXNuJ3Qgc2VyaWFsaXphYmxlKS5cbiAqIC0gYHNka2A6IHRoZSBTREsgcHJvZHVjZWQgdGhlIGVycm9yIGl0c2VsZjogYW4gaW50ZXJuYWwgaW52YXJpYW50IGJyb2tlLFxuICogICBvciBhIHJ1bnRpbWUgZ3VhcmQgcmVqZWN0ZWQgdGhlIGNhbGwuIFRoZXNlIHNob3VsZCBiZSByYXJlOyB3aGVuIHRoZXlcbiAqICAgaGFwcGVuIHdlIHdhbnQgdG8gZnJhbWUgdGhlIHRlcm1pbmFsIG91dHB1dCBhcyBcInRoaXMgaXMgdXMsIG5vdCB5b3UuXCJcbiAqL1xuZXhwb3J0IHR5cGUgRXJyb3JBdHRyaWJ1dGlvbiA9ICd1c2VyJyB8ICdzZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRGVzY3JpcHRpb24ge1xuICBhdHRyaWJ1dGlvbjogRXJyb3JBdHRyaWJ1dGlvbjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIC8qKlxuICAgKiBTaG9ydCwgY2xhc3MtYXdhcmUgaGludCB0byBoZWxwIGEgdXNlciB1bmRlcnN0YW5kIHdoYXQgdGhlIGVycm9yIG1lYW5zLlxuICAgKiBPbmx5IHNldCBmb3Igd2VsbC1rbm93biBTREsgZXJyb3IgY2xhc3NlcyAoU2VyaWFsaXphdGlvbkVycm9yLFxuICAgKiBXb3JrZmxvd1J1bnRpbWVFcnJvciwgY29udGV4dC12aW9sYXRpb24gZXJyb3JzKTsgYHVuZGVmaW5lZGAgZm9yIHBsYWluXG4gICAqIHVzZXIgZXJyb3JzLCB3aGVyZSB0aGUgc3RhY2sgaXMgYWxyZWFkeSB0aGUgbW9zdCB1c2VmdWwgdGhpbmcgdG8gc2hvdy5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXJyb3Igc2lnbmFsIGZpZWxkcyBjYXJyaWVkIG9uIHBlcnNpc3RlZCBmYWlsdXJlIGV2ZW50cyAoZS5nLlxuICogYHJ1bl9mYWlsZWRgIC8gYHN0ZXBfZmFpbGVkYCkuIFRoZSBzaGFwZSBpcyBpbnRlbnRpb25hbGx5IGxvb3NlOlxuICpcbiAqIC0gYGVycm9yQ29kZWAgaXMgdHlwZWQgYXMgYHN0cmluZ2AgcmF0aGVyIHRoYW4gYFJ1bkVycm9yQ29kZWAgYmVjYXVzZVxuICogICB0aGUgdmFsdWUgY29tZXMgZnJvbSBzdG9yZWQgSlNPTi9DQk9SIGFuZCBtYXkgcHJlZGF0ZSB0aGUgY3VycmVudFxuICogICBlbnVtLCBzbyBjYWxsZXJzIHNob3VsZCBub3QgbmFycm93IG9uIGl0IGJsaW5kbHkuIFZhbHVlcyB0aGF0IGRvbid0XG4gKiAgIG1hdGNoIGEga25vd24gYFJVTl9FUlJPUl9DT0RFU2AgZW50cnkgZmFsbCB0aHJvdWdoIHRvIFVTRVJfRVJST1IuXG4gKiAtIGBlcnJvck5hbWVgIGlzIHRoZSB0aHJvd24gYEVycm9yI25hbWVgLiBJdCBpcyBub3QgdW5pdmVyc2FsbHlcbiAqICAgcGVyc2lzdGVkIHRvZGF5OyBjYWxsZXJzIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gaXQgKGVpdGhlciB2aWEgYW5cbiAqICAgaW4tbWVtb3J5IHRocm93IG9yIGEgcmljaGVyIHBheWxvYWQpIGNhbiBwYXNzIGl0IGluIHRvIHNoYXJwZW5cbiAqICAgdGhlIGF0dHJpYnV0aW9uIGFuZCBoaW50LiBXaGVuIGFic2VudCwgYGRlc2NyaWJlUnVuRXJyb3JgIHN0aWxsXG4gKiAgIHJldHVybnMgYSBzZW5zaWJsZSBhdHRyaWJ1dGlvbiBmcm9tIGBlcnJvckNvZGVgIGFsb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNpc3RlZEVycm9yU2lnbmFsIHtcbiAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICBlcnJvck5hbWU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTlRFWFRfRVJST1JfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ05vdEluV29ya2Zsb3dDb250ZXh0RXJyb3InLFxuICAnTm90SW5TdGVwQ29udGV4dEVycm9yJyxcbiAgJ05vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3InLFxuICAnVW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dEVycm9yJyxcbl0pO1xuXG5mdW5jdGlvbiBpc0NvbnRleHRWaW9sYXRpb25FcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBlcnIgaW5zdGFuY2VvZiBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yIHx8XG4gICAgZXJyIGluc3RhbmNlb2YgTm90SW5TdGVwQ29udGV4dEVycm9yIHx8XG4gICAgZXJyIGluc3RhbmNlb2YgTm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHRFcnJvciB8fFxuICAgIGVyciBpbnN0YW5jZW9mIFVuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvclxuICApO1xufVxuXG5jb25zdCBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQgPVxuICAnQSB2YWx1ZSBwYXNzZWQgYWNyb3NzIGEgd29ya2Zsb3cvc3RlcCBib3VuZGFyeSBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4gU2VlIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgb2ZmZW5kaW5nIHBhdGggYW5kIHRoZSBMZWFybiBNb3JlIGxpbmsgZm9yIGRldGFpbHMuJztcbmNvbnN0IENPTlRFWFRfRVJST1JfSElOVCA9XG4gICdBIHdvcmtmbG93LW9ubHkgb3Igc3RlcC1vbmx5IEFQSSB3YXMgY2FsbGVkIGZyb20gdGhlIHdyb25nIGNvbnRleHQuIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGFjdCBBUEkgYW5kIGhvdyB0byBtb3ZlIHRoZSBjYWxsLic7XG5jb25zdCBSVU5USU1FX0VSUk9SX0hJTlQgPVxuICAnVGhpcyBpcyBhbiBpbnRlcm5hbCB3b3JrZmxvdyBTREsgZXJyb3IsIG5vdCBhIGJ1ZyBpbiB5b3VyIGNvZGUuIElmIGl0IGtlZXBzIGhhcHBlbmluZywgcGxlYXNlIHJlcG9ydCBpdCB3aXRoIHRoZSBzdGFjayB0cmFjZSBhbmQgdGhlIHJ1bklkLic7XG5jb25zdCBDT1JSVVBURURfRVZFTlRfTE9HX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IGV2ZW50IGxvZyBjb250YWlucyBvcnBoYW5lZCBvciBtaXNtYXRjaGVkIGV2ZW50cyBhbmQgY2Fubm90IGJlIHJlcGxheWVkLiBUaGlzIGlzIGFuIGludGVybmFsIHdvcmtmbG93IFNESyBlcnJvcjsgcGxlYXNlIHJlcG9ydCBpdCB3aXRoIHRoZSBydW5JZC4nO1xuY29uc3QgUkVQTEFZX1RJTUVPVVRfSElOVCA9XG4gICdUaGUgd29ya2Zsb3cgcmVwbGF5IGJldHdlZW4gc3RlcCBib3VuZGFyaWVzIHRvb2sgdG9vIGxvbmcuIFRoaXMgYm91bmRzIHdvcmtmbG93LVZNIGFuZCBldmVudC1sb2cgcmVwbGF5IHRpbWUgb25seSDigJQgc3RlcCBib2RpZXMgKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9ucykgYXJlIGV4Y2x1ZGVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIGV2ZW50IGxvZyBpcyB1bnVzdWFsbHkgbGFyZ2Ugb3IgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGRvaW5nIGhlYXZ5IHN5bmNocm9ub3VzIHdvcmsgaW4gd29ya2Zsb3cgY29kZSBvdXRzaWRlIG9mIHN0ZXAgYm9kaWVzLiBPdmVycmlkZSB0aGUgZGVmYXVsdCBidWRnZXQgdmlhIHRoZSBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUyBlbnYgdmFyIGlmIG5lZWRlZC4nO1xuY29uc3QgTUFYX0RFTElWRVJJRVNfSElOVCA9XG4gICdUaGUgd29ya2Zsb3cgcXVldWUgZXhjZWVkZWQgaXRzIG1heC1kZWxpdmVyeSBidWRnZXQuIFRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYSBwZXJzaXN0ZW50IHJ1bnRpbWUgZmFpbHVyZSDigJQgY2hlY2sgdGhlIG1vc3QgcmVjZW50IHN0YWNrIHRyYWNlcyBmb3IgdGhlIHVuZGVybHlpbmcgY2F1c2UuJztcbmNvbnN0IE1BWF9FVkVOVFNfSElOVCA9XG4gICdUaGUgd29ya2Zsb3cgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyBwZXIgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMgdW5ib3VuZGVkIHdvcmsgaW4gdGhlIHdvcmtmbG93IGZ1bmN0aW9uIOKAlCBlLmcuIGEgbG9vcCB0aGF0IGtlZXBzIGNyZWF0aW5nIHN0ZXBzIHdpdGhvdXQgdGVybWluYXRpbmcuIEJyZWFrIGxvbmctcnVubmluZyB3b3JrZmxvd3MgaW50byBjaGlsZCB3b3JrZmxvd3MgdG8gc3RheSB1bmRlciB0aGUgbGltaXQuJztcbmNvbnN0IFNUUkVBTV9FUlJPUl9ISU5UID1cbiAgJ1dvcmtmbG93IHN0cmVhbSBpbmZyYXN0cnVjdHVyZSBmYWlsZWQgd2hpbGUgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuIFRoaXMgaXMgYW4gU0RLIG9yIGJhY2tlbmQgZmFpbHVyZSwgbm90IGFuIGVycm9yIGluIHlvdXIgd29ya2Zsb3cgY29kZTsgcGxlYXNlIHJldHJ5IHRoZSBydW4gYW5kIHJlcG9ydCBwZXJzaXN0ZW50IGZhaWx1cmVzIHdpdGggdGhlIHJ1bklkLic7XG5jb25zdCBXT1JMRF9DT05UUkFDVF9ISU5UID1cbiAgJ1RoZSB3b3JrZmxvdyBiYWNrZW5kIHJldHVybmVkIGRhdGEgdGhhdCB2aW9sYXRlZCB0aGUgU0RLIGNvbnRyYWN0LiBUaGlzIGlzIG5vdCByZXRyeWFibGU7IHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgc3RhY2sgdHJhY2UgYW5kIHJ1bklkLic7XG5jb25zdCBERVBMT1lNRU5UX01JU01BVENIX0hJTlQgPVxuICBcIlRoZSBydW4gd2FzIGRlbGl2ZXJlZCB0byBhIGRlcGxveW1lbnQgb3RoZXIgdGhhbiB0aGUgZGVwbG95bWVudCBpdCBpcyBwaW5uZWQgdG8sIGFuZCB3YXMgc3RvcHBlZCB0byBwcm90ZWN0IGFnYWluc3QgY29kZS1za2V3IGVycm9ycyBhZnRlciB0aGUgcnVudGltZSBmYWlsZWQgdG8gcmUtcm91dGUgaXQgdGhlcmUuIFZlcmlmeSB0aGF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBhbmQgdGhhdCBxdWV1ZSBjYWxsYmFja3Mgcm91dGUgdG8gaXQuXCI7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQ29kZShjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSdW5FcnJvckNvZGUge1xuICAvLyBWYWx1ZXMgcmVhZCBiYWNrIGZyb20gcGVyc2lzdGVkIGV2ZW50cyBhcmUgYHN0cmluZyB8IHVuZGVmaW5lZGAsIHNvIHdlXG4gIC8vIG9ubHkgdHJ1c3QgY29kZXMgdGhhdCBtYXRjaCBhIGtub3duIGVudHJ5IGluIGBSVU5fRVJST1JfQ09ERVNgLlxuICBjb25zdCBrbm93biA9IE9iamVjdC52YWx1ZXMoUlVOX0VSUk9SX0NPREVTKSBhcyByZWFkb25seSBzdHJpbmdbXTtcbiAgaWYgKGNvZGUgJiYga25vd24uaW5jbHVkZXMoY29kZSkpIHtcbiAgICByZXR1cm4gY29kZSBhcyBSdW5FcnJvckNvZGU7XG4gIH1cbiAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5VU0VSX0VSUk9SO1xufVxuXG4vKipcbiAqIERhdGEtZHJpdmVuIHZhcmlhbnQgb2Yge0BsaW5rIGRlc2NyaWJlRXJyb3J9IHRoYXQgd29ya3MgZnJvbSBwZXJzaXN0ZWRcbiAqIGV2ZW50IGZpZWxkcyBpbnN0ZWFkIG9mIGEgbGl2ZSBgRXJyb3JgIGluc3RhbmNlLiBJbnRlbmRlZCBmb3IgY29tbWFuZC1saW5lXG4gKiBpbnRlcmZhY2UgKENMSSkgYW5kIHdlYiByZW5kZXJlcnMgdGhhdCByZWFkIGZhaWx1cmUgZXZlbnRzIGFuZCBubyBsb25nZXJcbiAqIGhhdmUgdGhlIG9yaWdpbmFsIHRocm93biBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZVJ1bkVycm9yKFxuICBzaWduYWw6IFBlcnNpc3RlZEVycm9yU2lnbmFsXG4pOiBFcnJvckRlc2NyaXB0aW9uIHtcbiAgY29uc3QgbmFtZSA9IHNpZ25hbC5lcnJvck5hbWU7XG4gIGNvbnN0IGVycm9yQ29kZSA9XG4gICAgbmFtZSA9PT0gJ0NvcnJ1cHRlZEV2ZW50TG9nRXJyb3InXG4gICAgICA/IFJVTl9FUlJPUl9DT0RFUy5DT1JSVVBURURfRVZFTlRfTE9HXG4gICAgICA6IG5vcm1hbGl6ZUVycm9yQ29kZShzaWduYWwuZXJyb3JDb2RlKTtcblxuICBpZiAobmFtZSA9PT0gJ1NlcmlhbGl6YXRpb25FcnJvcicpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGUsIGhpbnQ6IFNFUklBTElaQVRJT05fRVJST1JfSElOVCB9O1xuICB9XG4gIGlmIChuYW1lICYmIENPTlRFWFRfRVJST1JfTkFNRVMuaGFzKG5hbWUpKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlLCBoaW50OiBDT05URVhUX0VSUk9SX0hJTlQgfTtcbiAgfVxuICBpZiAobmFtZSA9PT0gJ0NvcnJ1cHRlZEV2ZW50TG9nRXJyb3InKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZSxcbiAgICAgIGhpbnQ6IENPUlJVUFRFRF9FVkVOVF9MT0dfSElOVCxcbiAgICB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQgfTtcbiAgfVxuICBpZiAoZXJyb3JDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuTUFYX0VWRU5UU19FWENFRURFRCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSwgaGludDogTUFYX0VWRU5UU19ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkNPUlJVUFRFRF9FVkVOVF9MT0cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlNUUkVBTV9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGUsXG4gICAgICBoaW50OiBTVFJFQU1fRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGUsXG4gICAgICBoaW50OiBXT1JMRF9DT05UUkFDVF9ISU5ULFxuICAgIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkRFUExPWU1FTlRfTUlTTUFUQ0gpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogREVQTE9ZTUVOVF9NSVNNQVRDSF9ISU5UIH07XG4gIH1cbiAgaWYgKG5hbWUgPT09ICdXb3JrZmxvd1J1bnRpbWVFcnJvcicgfHwgbmFtZSA9PT0gJ1N0ZXBOb3RSZWdpc3RlcmVkRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCB9O1xuICB9XG4gIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSB9O1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGFuIGVycm9yIGZvciB1c2VyLWZhY2luZyBwcmVzZW50YXRpb24uIFB1cmVseSBpbmZvcm1hdGlvbmFsOiBpdFxuICogZG9lcyBub3QgY2hhbmdlIGFueSBwZXJzaXN0ZWQgZXZlbnQgZGF0YSBvciBlcnJvciBjbGFzc2lmaWNhdGlvbiB1c2VkIGJ5XG4gKiB0aGUgcnVudGltZS5cbiAqXG4gKiBUaGUgYXR0cmlidXRpb24gaGVyZSBpcyBtb3JlIG51YW5jZWQgdGhhbiBgY2xhc3NpZnlSdW5FcnJvcmA6XG4gKlxuICogLSBgU2VyaWFsaXphdGlvbkVycm9yYCBpcyB0ZWNobmljYWxseSByYWlzZWQgYnkgdGhlIFNESywgYnV0IGl0IGFsbW9zdFxuICogICBhbHdheXMgcG9pbnRzIGF0IHNvbWV0aGluZyB0aGUgY2FsbGVyIGRpZCAocGFzc2VkIGEgbm9uLXNlcmlhbGl6YWJsZVxuICogICB2YWx1ZSwgZGlkbid0IHJlZ2lzdGVyIGEgY2xhc3MpLiBXZSBhdHRyaWJ1dGUgaXQgdG8gdGhlIHVzZXIuXG4gKiAtIENvbnRleHQtdmlvbGF0aW9uIGVycm9ycyAoYE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3JgLCBldGMuKSBsaWtld2lzZVxuICogICBkZXNjcmliZSBhIHVzZXIgbWlzdGFrZS5cbiAqIC0gYFdvcmtmbG93UnVudGltZUVycm9yYCAoYW5kIHN1YmNsYXNzZXMgbGlrZSBgU3RlcE5vdFJlZ2lzdGVyZWRFcnJvcmApXG4gKiAgIGluZGljYXRlcyBhbiBpbnRlcm5hbCBTREsgaW52YXJpYW50IGJyb2tlLCBzbyBzdXJmYWNlIHRoYXQgYXMgYHNka2AuXG4gKlxuICogQHBhcmFtIGVyciBUaGUgZXJyb3IgdmFsdWUgdGhyb3duIGJ5IHRoZSB3b3JrZmxvdyAvIHN0ZXAuXG4gKiBAcGFyYW0gZXJyb3JDb2RlIE9wdGlvbmFsIHByZWNvbXB1dGVkIGVycm9yIGNvZGUuIENhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiAgIGtub3cgdGhlIGNvZGUgKGUuZy4gYFJFUExBWV9USU1FT1VUYCBvciBgTUFYX0RFTElWRVJJRVNfRVhDRUVERURgLCB3aGljaFxuICogICBgY2xhc3NpZnlSdW5FcnJvcmAgY2FuJ3QgZGVyaXZlIGZyb20gdGhlIGVycm9yIGFsb25lKSBzaG91bGQgcGFzcyBpdCBzb1xuICogICB0aGUgYXR0cmlidXRpb24gYW5kIGhpbnQgcmVmbGVjdCB0aGUgYWN0dWFsIGZhaWx1cmUgY2F0ZWdvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZUVycm9yKFxuICBlcnI6IHVua25vd24sXG4gIGVycm9yQ29kZT86IFJ1bkVycm9yQ29kZVxuKTogRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGNvbnN0IGVmZmVjdGl2ZUNvZGUgPSBlcnJvckNvZGUgPz8gY2xhc3NpZnlSdW5FcnJvcihlcnIpO1xuXG4gIGlmIChTZXJpYWxpemF0aW9uRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3VzZXInLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogU0VSSUFMSVpBVElPTl9FUlJPUl9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoaXNDb250ZXh0VmlvbGF0aW9uRXJyb3IoZXJyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3VzZXInLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogQ09OVEVYVF9FUlJPUl9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoQ29ycnVwdGVkRXZlbnRMb2dFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IENPUlJVUFRFRF9FVkVOVF9MT0dfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ2hlY2sgREVQTE9ZTUVOVF9NSVNNQVRDSCBiZWZvcmUgdGhlIGdlbmVyaWMgV29ya2Zsb3dSdW50aW1lRXJyb3IgYnJhbmNoOlxuICAvLyBXb3JrZmxvd0RlcGxveW1lbnRNaXNtYXRjaEVycm9yIHN1YmNsYXNzZXMgaXQsIGJ1dCBoYXMgaXRzIG93biBjb2RlICsgaGludC5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5ERVBMT1lNRU5UX01JU01BVENIKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IERFUExPWU1FTlRfTUlTTUFUQ0hfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVyciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChlZmZlY3RpdmVDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuTUFYX0VWRU5UU19FWENFRURFRCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3VzZXInLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogTUFYX0VWRU5UU19ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkNPUlJVUFRFRF9FVkVOVF9MT0cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlNUUkVBTV9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBTVFJFQU1fRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBXT1JMRF9DT05UUkFDVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUgfTtcbn1cbiJdfQ==
@@ -12,34 +12,68 @@
12
12
  * calls on every encrypt/decrypt invocation.
13
13
  *
14
14
  * Wire format: `[nonce (12 bytes)][ciphertext + auth tag]`
15
- * The `encr` format prefix is NOT part of this module it's added/stripped
15
+ * The `encr` format prefix is NOT part of this module: it's added/stripped
16
16
  * by the serialization layer in `maybeEncrypt`/`maybeDecrypt`.
17
17
  */
18
18
  export type CryptoKey = import('node:crypto').webcrypto.CryptoKey;
19
+ /** AES-GCM nonce length in bytes. */
20
+ export declare const NONCE_LENGTH = 12;
21
+ /** AES-GCM authentication tag length in bits. */
22
+ export declare const TAG_LENGTH = 128;
23
+ /** AES-GCM authentication tag length in bytes. */
24
+ export declare const TAG_BYTES: number;
19
25
  /**
20
26
  * Import a raw AES-256 key as a `CryptoKey` for use with `encrypt()`/`decrypt()`.
21
27
  *
22
28
  * Callers should call this once per run (after `getEncryptionKeyForRun()`)
23
29
  * and pass the resulting `CryptoKey` to all subsequent encrypt/decrypt calls.
24
30
  *
31
+ * Pass `usages: ['encrypt']` (or `['decrypt']`) for cross-run scenarios
32
+ * where the caller should not be able to perform the inverse operation
33
+ * with the key. For example, a child workflow writing into a parent
34
+ * run's forwarded WritableStream only needs to encrypt, never decrypt.
35
+ *
25
36
  * @param raw - Raw 32-byte AES-256 key (from World.getEncryptionKeyForRun)
37
+ * @param usages - Key usages. Defaults to `['encrypt', 'decrypt']`.
26
38
  * @returns CryptoKey ready for AES-GCM operations
27
39
  */
28
- export declare function importKey(raw: Uint8Array): Promise<import("crypto").webcrypto.CryptoKey>;
40
+ export declare function importKey(raw: Uint8Array, usages?: ReadonlyArray<'encrypt' | 'decrypt'>): Promise<import("crypto").webcrypto.CryptoKey>;
29
41
  /**
30
42
  * Encrypt data using AES-256-GCM.
31
43
  *
32
44
  * @param key - CryptoKey from `importKey()`
33
45
  * @param data - Plaintext to encrypt
46
+ * @param aad - Optional additional authenticated data. Not encrypted, but
47
+ * covered by the GCM auth tag: decryption fails unless the exact same
48
+ * bytes are supplied. Used by the sealed-box layer to bind ciphertext to
49
+ * a `projectId|runId` context. Omit for no AAD (the legacy behavior).
34
50
  * @returns `[nonce (12 bytes)][ciphertext + GCM auth tag]`
35
51
  */
36
- export declare function encrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8Array>;
52
+ export declare function encrypt(key: CryptoKey, data: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
37
53
  /**
38
54
  * Decrypt data using AES-256-GCM.
39
55
  *
56
+ * Any failure inside the Web Crypto layer (most commonly an
57
+ * `OperationError: The operation failed for an operation-specific reason`
58
+ * raised by `AESCipherJob.onDone` when the GCM authentication tag does
59
+ * not verify) is rewrapped as {@link RuntimeDecryptionError}. The
60
+ * wrapped error carries the original DOMException as `cause`, plus a
61
+ * small diagnostic context (`operation`, input `byteLength`) to help
62
+ * disambiguate ciphertext corruption from key mismatch from truncated
63
+ * transport reads.
64
+ *
65
+ * Note: `data` is the raw AES payload (`[nonce][ciphertext + tag]`), not a
66
+ * format-prefixed envelope: callers strip the `encr` marker via
67
+ * `decodeFormatPrefix()` before reaching this function. The outer
68
+ * envelope's format prefix is therefore attached by the serialization
69
+ * layer (`serialization/encryption.ts`), which is the layer that has it.
70
+ *
40
71
  * @param key - CryptoKey from `importKey()`
41
72
  * @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
73
+ * @param aad - Optional additional authenticated data. Must match the bytes
74
+ * passed to {@link encrypt} exactly, otherwise the GCM tag fails to verify
75
+ * and a {@link RuntimeDecryptionError} is thrown.
42
76
  * @returns Decrypted plaintext
43
77
  */
44
- export declare function decrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8Array>;
78
+ export declare function decrypt(key: CryptoKey, data: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
45
79
  //# sourceMappingURL=encryption.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;AAMlE;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,UAAU,iDAU9C;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAWrB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAerB"}
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;AAElE,qCAAqC;AACrC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,iDAAiD;AACjD,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,kDAAkD;AAClD,eAAO,MAAM,SAAS,QAAiB,CAAC;AAGxC;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,aAAa,CAAC,SAAS,GAAG,SAAS,CAA0B,iDAiBtE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAiCrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CA+CrB"}
@@ -1,6 +1,10 @@
1
- import { WorkflowRuntimeError } from '@workflow/errors';
2
- const NONCE_LENGTH = 12;
3
- const TAG_LENGTH = 128; // bits
1
+ import { RuntimeDecryptionError, WorkflowRuntimeError } from '@workflow/errors';
2
+ /** AES-GCM nonce length in bytes. */
3
+ export const NONCE_LENGTH = 12;
4
+ /** AES-GCM authentication tag length in bits. */
5
+ export const TAG_LENGTH = 128;
6
+ /** AES-GCM authentication tag length in bytes. */
7
+ export const TAG_BYTES = TAG_LENGTH / 8;
4
8
  const KEY_LENGTH = 32; // bytes (AES-256)
5
9
  /**
6
10
  * Import a raw AES-256 key as a `CryptoKey` for use with `encrypt()`/`decrypt()`.
@@ -8,28 +12,59 @@ const KEY_LENGTH = 32; // bytes (AES-256)
8
12
  * Callers should call this once per run (after `getEncryptionKeyForRun()`)
9
13
  * and pass the resulting `CryptoKey` to all subsequent encrypt/decrypt calls.
10
14
  *
15
+ * Pass `usages: ['encrypt']` (or `['decrypt']`) for cross-run scenarios
16
+ * where the caller should not be able to perform the inverse operation
17
+ * with the key. For example, a child workflow writing into a parent
18
+ * run's forwarded WritableStream only needs to encrypt, never decrypt.
19
+ *
11
20
  * @param raw - Raw 32-byte AES-256 key (from World.getEncryptionKeyForRun)
21
+ * @param usages - Key usages. Defaults to `['encrypt', 'decrypt']`.
12
22
  * @returns CryptoKey ready for AES-GCM operations
13
23
  */
14
- export async function importKey(raw) {
24
+ export async function importKey(raw, usages = ['encrypt', 'decrypt']) {
15
25
  if (raw.byteLength !== KEY_LENGTH) {
16
26
  throw new WorkflowRuntimeError(`Encryption key must be exactly ${KEY_LENGTH} bytes, got ${raw.byteLength}`);
17
27
  }
18
- return globalThis.crypto.subtle.importKey('raw', raw, 'AES-GCM', false, [
19
- 'encrypt',
20
- 'decrypt',
21
- ]);
28
+ return globalThis.crypto.subtle.importKey('raw', raw, 'AES-GCM', false,
29
+ // `KeyUsage` is a DOM-lib type that's not in scope under `es2022`.
30
+ // The `ReadonlyArray<'encrypt' | 'decrypt'>` parameter type matches
31
+ // a strict subset of `KeyUsage[]`, so this cast is sound.
32
+ usages);
22
33
  }
23
34
  /**
24
35
  * Encrypt data using AES-256-GCM.
25
36
  *
26
37
  * @param key - CryptoKey from `importKey()`
27
38
  * @param data - Plaintext to encrypt
39
+ * @param aad - Optional additional authenticated data. Not encrypted, but
40
+ * covered by the GCM auth tag: decryption fails unless the exact same
41
+ * bytes are supplied. Used by the sealed-box layer to bind ciphertext to
42
+ * a `projectId|runId` context. Omit for no AAD (the legacy behavior).
28
43
  * @returns `[nonce (12 bytes)][ciphertext + GCM auth tag]`
29
44
  */
30
- export async function encrypt(key, data) {
45
+ export async function encrypt(key, data, aad) {
31
46
  const nonce = globalThis.crypto.getRandomValues(new Uint8Array(NONCE_LENGTH));
32
- const ciphertext = await globalThis.crypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, data);
47
+ let ciphertext;
48
+ try {
49
+ ciphertext = await globalThis.crypto.subtle.encrypt({
50
+ name: 'AES-GCM',
51
+ iv: nonce,
52
+ tagLength: TAG_LENGTH,
53
+ ...(aad ? { additionalData: aad } : {}),
54
+ }, key, data);
55
+ }
56
+ catch (cause) {
57
+ // Re-wrap any Web Crypto failure (DOMException etc.) as a
58
+ // RuntimeDecryptionError. Failures here are rare: they happen e.g.
59
+ // when a CryptoKey was imported with `usages: ['decrypt']` only.
60
+ throw new RuntimeDecryptionError(`AES-256-GCM encryption failed: ${cause instanceof Error ? cause.message : String(cause)}`, {
61
+ cause,
62
+ context: {
63
+ operation: 'encrypt',
64
+ byteLength: data.byteLength,
65
+ },
66
+ });
67
+ }
33
68
  const result = new Uint8Array(NONCE_LENGTH + ciphertext.byteLength);
34
69
  result.set(nonce, 0);
35
70
  result.set(new Uint8Array(ciphertext), NONCE_LENGTH);
@@ -38,18 +73,65 @@ export async function encrypt(key, data) {
38
73
  /**
39
74
  * Decrypt data using AES-256-GCM.
40
75
  *
76
+ * Any failure inside the Web Crypto layer (most commonly an
77
+ * `OperationError: The operation failed for an operation-specific reason`
78
+ * raised by `AESCipherJob.onDone` when the GCM authentication tag does
79
+ * not verify) is rewrapped as {@link RuntimeDecryptionError}. The
80
+ * wrapped error carries the original DOMException as `cause`, plus a
81
+ * small diagnostic context (`operation`, input `byteLength`) to help
82
+ * disambiguate ciphertext corruption from key mismatch from truncated
83
+ * transport reads.
84
+ *
85
+ * Note: `data` is the raw AES payload (`[nonce][ciphertext + tag]`), not a
86
+ * format-prefixed envelope: callers strip the `encr` marker via
87
+ * `decodeFormatPrefix()` before reaching this function. The outer
88
+ * envelope's format prefix is therefore attached by the serialization
89
+ * layer (`serialization/encryption.ts`), which is the layer that has it.
90
+ *
41
91
  * @param key - CryptoKey from `importKey()`
42
92
  * @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
93
+ * @param aad - Optional additional authenticated data. Must match the bytes
94
+ * passed to {@link encrypt} exactly, otherwise the GCM tag fails to verify
95
+ * and a {@link RuntimeDecryptionError} is thrown.
43
96
  * @returns Decrypted plaintext
44
97
  */
45
- export async function decrypt(key, data) {
98
+ export async function decrypt(key, data, aad) {
46
99
  const minLength = NONCE_LENGTH + TAG_LENGTH / 8; // nonce + auth tag
47
100
  if (data.byteLength < minLength) {
48
- throw new WorkflowRuntimeError(`Encrypted data too short: expected at least ${minLength} bytes, got ${data.byteLength}`);
101
+ throw new RuntimeDecryptionError(`Encrypted data too short: expected at least ${minLength} bytes, got ${data.byteLength}`, {
102
+ context: {
103
+ operation: 'decrypt',
104
+ byteLength: data.byteLength,
105
+ },
106
+ });
49
107
  }
50
108
  const nonce = data.subarray(0, NONCE_LENGTH);
51
109
  const ciphertext = data.subarray(NONCE_LENGTH);
52
- const plaintext = await globalThis.crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, ciphertext);
110
+ let plaintext;
111
+ try {
112
+ plaintext = await globalThis.crypto.subtle.decrypt({
113
+ name: 'AES-GCM',
114
+ iv: nonce,
115
+ tagLength: TAG_LENGTH,
116
+ ...(aad ? { additionalData: aad } : {}),
117
+ }, key, ciphertext);
118
+ }
119
+ catch (cause) {
120
+ // The most common shape we see in the wild is a DOMException with
121
+ // `name: 'OperationError'` and message "The operation failed for
122
+ // an operation-specific reason", which is what Web Crypto throws
123
+ // when the GCM auth tag does not verify. Re-throw as
124
+ // RuntimeDecryptionError, attaching diagnostic context (byte length)
125
+ // that the bare DOMException lacks.
126
+ const causeMsg = cause instanceof Error ? cause.message : String(cause);
127
+ throw new RuntimeDecryptionError(`AES-256-GCM decryption failed: ${causeMsg}`, {
128
+ cause,
129
+ context: {
130
+ operation: 'decrypt',
131
+ byteLength: data.byteLength,
132
+ },
133
+ });
134
+ }
53
135
  return new Uint8Array(plaintext);
54
136
  }
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUJ4RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTztBQUMvQixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFlO0lBQzdDLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksb0JBQW9CLENBQzVCLGtDQUFrQyxVQUFVLGVBQWUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUM1RSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtRQUN0RSxTQUFTO1FBQ1QsU0FBUztLQUNWLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsR0FBYyxFQUNkLElBQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDOUUsTUFBTSxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ3ZELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFDckQsR0FBRyxFQUNILElBQUksQ0FDTCxDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsR0FBYyxFQUNkLElBQWdCO0lBRWhCLE1BQU0sU0FBUyxHQUFHLFlBQVksR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ3BFLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksb0JBQW9CLENBQzVCLCtDQUErQyxTQUFTLGVBQWUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUN6RixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ3RELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFDckQsR0FBRyxFQUNILFVBQVUsQ0FDWCxDQUFDO0lBQ0YsT0FBTyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcblxuLyoqXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbiBtb2R1bGUuXG4gKlxuICogVXNlcyB0aGUgV2ViIENyeXB0byBBUEkgKGBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGVgKSB3aGljaCB3b3JrcyBpblxuICogYm90aCBtb2Rlcm4gYnJvd3NlcnMgYW5kIE5vZGUuanMgMjArLiBUaGlzIG1vZHVsZSBpcyBpbnRlbnRpb25hbGx5XG4gKiBmcmVlIG9mIE5vZGUuanMtc3BlY2lmaWMgaW1wb3J0cyBzbyBpdCBjYW4gYmUgYnVuZGxlZCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogVGhlIFdvcmxkIGludGVyZmFjZSAoYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gKSByZXR1cm5zIGEgcmF3IDMyLWJ5dGVcbiAqIEFFUy0yNTYga2V5LiBDYWxsZXJzIHNob3VsZCB1c2UgYGltcG9ydEtleSgpYCBvbmNlIHRvIGNvbnZlcnQgaXQgdG8gYVxuICogYENyeXB0b0tleWAsIHRoZW4gcGFzcyB0aGF0IHRvIGBlbmNyeXB0KClgL2BkZWNyeXB0KClgIGZvciBhbGxcbiAqIG9wZXJhdGlvbnMgd2l0aGluIHRoZSBzYW1lIHJ1bi4gVGhpcyBhdm9pZHMgcmVwZWF0ZWQgYGltcG9ydEtleSgpYFxuICogY2FsbHMgb24gZXZlcnkgZW5jcnlwdC9kZWNyeXB0IGludm9jYXRpb24uXG4gKlxuICogV2lyZSBmb3JtYXQ6IGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIGF1dGggdGFnXWBcbiAqIFRoZSBgZW5jcmAgZm9ybWF0IHByZWZpeCBpcyBOT1QgcGFydCBvZiB0aGlzIG1vZHVsZSDigJQgaXQncyBhZGRlZC9zdHJpcHBlZFxuICogYnkgdGhlIHNlcmlhbGl6YXRpb24gbGF5ZXIgaW4gYG1heWJlRW5jcnlwdGAvYG1heWJlRGVjcnlwdGAuXG4gKi9cblxuLy8gQ3J5cHRvS2V5IGlzIGEgZ2xvYmFsIHR5cGUgaW4gYnJvd3NlcnMgYW5kIE5vZGUuanMgMjArLCBidXQgVHlwZVNjcmlwdCdzXG4vLyBgZXMyMDIyYCBsaWIgZG9lc24ndCBpbmNsdWRlIGl0LiBSZS1leHBvcnQgaXQgZnJvbSB0aGUgbm9kZTpjcnlwdG8gdHlwZXNcbi8vIHNvIGNvbnN1bWVycyBjYW4gcmVmZXJlbmNlIGl0IHdpdGhvdXQgYWRkaW5nIGBkb21gIGxpYi5cbmV4cG9ydCB0eXBlIENyeXB0b0tleSA9IGltcG9ydCgnbm9kZTpjcnlwdG8nKS53ZWJjcnlwdG8uQ3J5cHRvS2V5O1xuXG5jb25zdCBOT05DRV9MRU5HVEggPSAxMjtcbmNvbnN0IFRBR19MRU5HVEggPSAxMjg7IC8vIGJpdHNcbmNvbnN0IEtFWV9MRU5HVEggPSAzMjsgLy8gYnl0ZXMgKEFFUy0yNTYpXG5cbi8qKlxuICogSW1wb3J0IGEgcmF3IEFFUy0yNTYga2V5IGFzIGEgYENyeXB0b0tleWAgZm9yIHVzZSB3aXRoIGBlbmNyeXB0KClgL2BkZWNyeXB0KClgLlxuICpcbiAqIENhbGxlcnMgc2hvdWxkIGNhbGwgdGhpcyBvbmNlIHBlciBydW4gKGFmdGVyIGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKClgKVxuICogYW5kIHBhc3MgdGhlIHJlc3VsdGluZyBgQ3J5cHRvS2V5YCB0byBhbGwgc3Vic2VxdWVudCBlbmNyeXB0L2RlY3J5cHQgY2FsbHMuXG4gKlxuICogQHBhcmFtIHJhdyAtIFJhdyAzMi1ieXRlIEFFUy0yNTYga2V5IChmcm9tIFdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pXG4gKiBAcmV0dXJucyBDcnlwdG9LZXkgcmVhZHkgZm9yIEFFUy1HQ00gb3BlcmF0aW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0S2V5KHJhdzogVWludDhBcnJheSkge1xuICBpZiAocmF3LmJ5dGVMZW5ndGggIT09IEtFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgRW5jcnlwdGlvbiBrZXkgbXVzdCBiZSBleGFjdGx5ICR7S0VZX0xFTkdUSH0gYnl0ZXMsIGdvdCAke3Jhdy5ieXRlTGVuZ3RofWBcbiAgICApO1xuICB9XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLCByYXcsICdBRVMtR0NNJywgZmFsc2UsIFtcbiAgICAnZW5jcnlwdCcsXG4gICAgJ2RlY3J5cHQnLFxuICBdKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGRhdGEgdXNpbmcgQUVTLTI1Ni1HQ00uXG4gKlxuICogQHBhcmFtIGtleSAtIENyeXB0b0tleSBmcm9tIGBpbXBvcnRLZXkoKWBcbiAqIEBwYXJhbSBkYXRhIC0gUGxhaW50ZXh0IHRvIGVuY3J5cHRcbiAqIEByZXR1cm5zIGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIEdDTSBhdXRoIHRhZ11gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IG5vbmNlID0gZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KE5PTkNFX0xFTkdUSCkpO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgeyBuYW1lOiAnQUVTLUdDTScsIGl2OiBub25jZSwgdGFnTGVuZ3RoOiBUQUdfTEVOR1RIIH0sXG4gICAga2V5LFxuICAgIGRhdGFcbiAgKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTk9OQ0VfTEVOR1RIICsgY2lwaGVydGV4dC5ieXRlTGVuZ3RoKTtcbiAgcmVzdWx0LnNldChub25jZSwgMCk7XG4gIHJlc3VsdC5zZXQobmV3IFVpbnQ4QXJyYXkoY2lwaGVydGV4dCksIE5PTkNFX0xFTkdUSCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIHVzaW5nIEFFUy0yNTYtR0NNLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBDcnlwdG9LZXkgZnJvbSBgaW1wb3J0S2V5KClgXG4gKiBAcGFyYW0gZGF0YSAtIGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIEdDTSBhdXRoIHRhZ11gXG4gKiBAcmV0dXJucyBEZWNyeXB0ZWQgcGxhaW50ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IG1pbkxlbmd0aCA9IE5PTkNFX0xFTkdUSCArIFRBR19MRU5HVEggLyA4OyAvLyBub25jZSArIGF1dGggdGFnXG4gIGlmIChkYXRhLmJ5dGVMZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgRW5jcnlwdGVkIGRhdGEgdG9vIHNob3J0OiBleHBlY3RlZCBhdCBsZWFzdCAke21pbkxlbmd0aH0gYnl0ZXMsIGdvdCAke2RhdGEuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zdCBub25jZSA9IGRhdGEuc3ViYXJyYXkoMCwgTk9OQ0VfTEVOR1RIKTtcbiAgY29uc3QgY2lwaGVydGV4dCA9IGRhdGEuc3ViYXJyYXkoTk9OQ0VfTEVOR1RIKTtcbiAgY29uc3QgcGxhaW50ZXh0ID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgeyBuYW1lOiAnQUVTLUdDTScsIGl2OiBub25jZSwgdGFnTGVuZ3RoOiBUQUdfTEVOR1RIIH0sXG4gICAga2V5LFxuICAgIGNpcGhlcnRleHRcbiAgKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBsYWludGV4dCk7XG59XG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUJoRixxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMvQixpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM5QixrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDeEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUMsa0JBQWtCO0FBRXpDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQzdCLEdBQWUsRUFDZixTQUErQyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFFckUsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsa0NBQWtDLFVBQVUsZUFBZSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQzVFLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3ZDLEtBQUssRUFDTCxHQUFHLEVBQ0gsU0FBUyxFQUNULEtBQUs7SUFDTCxtRUFBbUU7SUFDbkUsb0VBQW9FO0lBQ3BFLDBEQUEwRDtJQUMxRCxNQUFtQyxDQUNwQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsR0FBYyxFQUNkLElBQWdCLEVBQ2hCLEdBQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFB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QUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLHNCQUFzQixDQUM5QixrQ0FBa0MsUUFBUSxFQUFFLEVBQzVDO1lBQ0UsS0FBSztZQUNMLE9BQU8sRUFBRTtnQkFDUCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5cbi8qKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gbW9kdWxlLlxuICpcbiAqIFVzZXMgdGhlIFdlYiBDcnlwdG8gQVBJIChgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlYCkgd2hpY2ggd29ya3MgaW5cbiAqIGJvdGggbW9kZXJuIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKy4gVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseVxuICogZnJlZSBvZiBOb2RlLmpzLXNwZWNpZmljIGltcG9ydHMgc28gaXQgY2FuIGJlIGJ1bmRsZWQgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSBXb3JsZCBpbnRlcmZhY2UgKGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCkgcmV0dXJucyBhIHJhdyAzMi1ieXRlXG4gKiBBRVMtMjU2IGtleS4gQ2FsbGVycyBzaG91bGQgdXNlIGBpbXBvcnRLZXkoKWAgb25jZSB0byBjb252ZXJ0IGl0IHRvIGFcbiAqIGBDcnlwdG9LZXlgLCB0aGVuIHBhc3MgdGhhdCB0byBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYCBmb3IgYWxsXG4gKiBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBydW4uIFRoaXMgYXZvaWRzIHJlcGVhdGVkIGBpbXBvcnRLZXkoKWBcbiAqIGNhbGxzIG9uIGV2ZXJ5IGVuY3J5cHQvZGVjcnlwdCBpbnZvY2F0aW9uLlxuICpcbiAqIFdpcmUgZm9ybWF0OiBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBhdXRoIHRhZ11gXG4gKiBUaGUgYGVuY3JgIGZvcm1hdCBwcmVmaXggaXMgTk9UIHBhcnQgb2YgdGhpcyBtb2R1bGU6IGl0J3MgYWRkZWQvc3RyaXBwZWRcbiAqIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIGluIGBtYXliZUVuY3J5cHRgL2BtYXliZURlY3J5cHRgLlxuICovXG5cbi8vIENyeXB0b0tleSBpcyBhIGdsb2JhbCB0eXBlIGluIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKywgYnV0IFR5cGVTY3JpcHQnc1xuLy8gYGVzMjAyMmAgbGliIGRvZXNuJ3QgaW5jbHVkZSBpdC4gUmUtZXhwb3J0IGl0IGZyb20gdGhlIG5vZGU6Y3J5cHRvIHR5cGVzXG4vLyBzbyBjb25zdW1lcnMgY2FuIHJlZmVyZW5jZSBpdCB3aXRob3V0IGFkZGluZyBgZG9tYCBsaWIuXG5leHBvcnQgdHlwZSBDcnlwdG9LZXkgPSBpbXBvcnQoJ25vZGU6Y3J5cHRvJykud2ViY3J5cHRvLkNyeXB0b0tleTtcblxuLyoqIEFFUy1HQ00gbm9uY2UgbGVuZ3RoIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IE5PTkNFX0xFTkdUSCA9IDEyO1xuLyoqIEFFUy1HQ00gYXV0aGVudGljYXRpb24gdGFnIGxlbmd0aCBpbiBiaXRzLiAqL1xuZXhwb3J0IGNvbnN0IFRBR19MRU5HVEggPSAxMjg7XG4vKiogQUVTLUdDTSBhdXRoZW50aWNhdGlvbiB0YWcgbGVuZ3RoIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IFRBR19CWVRFUyA9IFRBR19MRU5HVEggLyA4O1xuY29uc3QgS0VZX0xFTkdUSCA9IDMyOyAvLyBieXRlcyAoQUVTLTI1NilcblxuLyoqXG4gKiBJbXBvcnQgYSByYXcgQUVTLTI1NiBrZXkgYXMgYSBgQ3J5cHRvS2V5YCBmb3IgdXNlIHdpdGggYGVuY3J5cHQoKWAvYGRlY3J5cHQoKWAuXG4gKlxuICogQ2FsbGVycyBzaG91bGQgY2FsbCB0aGlzIG9uY2UgcGVyIHJ1biAoYWZ0ZXIgYGdldEVuY3J5cHRpb25LZXlGb3JSdW4oKWApXG4gKiBhbmQgcGFzcyB0aGUgcmVzdWx0aW5nIGBDcnlwdG9LZXlgIHRvIGFsbCBzdWJzZXF1ZW50IGVuY3J5cHQvZGVjcnlwdCBjYWxscy5cbiAqXG4gKiBQYXNzIGB1c2FnZXM6IFsnZW5jcnlwdCddYCAob3IgYFsnZGVjcnlwdCddYCkgZm9yIGNyb3NzLXJ1biBzY2VuYXJpb3NcbiAqIHdoZXJlIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHBlcmZvcm0gdGhlIGludmVyc2Ugb3BlcmF0aW9uXG4gKiB3aXRoIHRoZSBrZXkuIEZvciBleGFtcGxlLCBhIGNoaWxkIHdvcmtmbG93IHdyaXRpbmcgaW50byBhIHBhcmVudFxuICogcnVuJ3MgZm9yd2FyZGVkIFdyaXRhYmxlU3RyZWFtIG9ubHkgbmVlZHMgdG8gZW5jcnlwdCwgbmV2ZXIgZGVjcnlwdC5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IDMyLWJ5dGUgQUVTLTI1NiBrZXkgKGZyb20gV29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bilcbiAqIEBwYXJhbSB1c2FnZXMgLSBLZXkgdXNhZ2VzLiBEZWZhdWx0cyB0byBgWydlbmNyeXB0JywgJ2RlY3J5cHQnXWAuXG4gKiBAcmV0dXJucyBDcnlwdG9LZXkgcmVhZHkgZm9yIEFFUy1HQ00gb3BlcmF0aW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0S2V5KFxuICByYXc6IFVpbnQ4QXJyYXksXG4gIHVzYWdlczogUmVhZG9ubHlBcnJheTwnZW5jcnlwdCcgfCAnZGVjcnlwdCc+ID0gWydlbmNyeXB0JywgJ2RlY3J5cHQnXVxuKSB7XG4gIGlmIChyYXcuYnl0ZUxlbmd0aCAhPT0gS0VZX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgIGBFbmNyeXB0aW9uIGtleSBtdXN0IGJlIGV4YWN0bHkgJHtLRVlfTEVOR1RIfSBieXRlcywgZ290ICR7cmF3LmJ5dGVMZW5ndGh9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgJ3JhdycsXG4gICAgcmF3LFxuICAgICdBRVMtR0NNJyxcbiAgICBmYWxzZSxcbiAgICAvLyBgS2V5VXNhZ2VgIGlzIGEgRE9NLWxpYiB0eXBlIHRoYXQncyBub3QgaW4gc2NvcGUgdW5kZXIgYGVzMjAyMmAuXG4gICAgLy8gVGhlIGBSZWFkb25seUFycmF5PCdlbmNyeXB0JyB8ICdkZWNyeXB0Jz5gIHBhcmFtZXRlciB0eXBlIG1hdGNoZXNcbiAgICAvLyBhIHN0cmljdCBzdWJzZXQgb2YgYEtleVVzYWdlW11gLCBzbyB0aGlzIGNhc3QgaXMgc291bmQuXG4gICAgdXNhZ2VzIGFzICgnZW5jcnlwdCcgfCAnZGVjcnlwdCcpW11cbiAgKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGRhdGEgdXNpbmcgQUVTLTI1Ni1HQ00uXG4gKlxuICogQHBhcmFtIGtleSAtIENyeXB0b0tleSBmcm9tIGBpbXBvcnRLZXkoKWBcbiAqIEBwYXJhbSBkYXRhIC0gUGxhaW50ZXh0IHRvIGVuY3J5cHRcbiAqIEBwYXJhbSBhYWQgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0ZWQgZGF0YS4gTm90IGVuY3J5cHRlZCwgYnV0XG4gKiAgIGNvdmVyZWQgYnkgdGhlIEdDTSBhdXRoIHRhZzogZGVjcnlwdGlvbiBmYWlscyB1bmxlc3MgdGhlIGV4YWN0IHNhbWVcbiAqICAgYnl0ZXMgYXJlIHN1cHBsaWVkLiBVc2VkIGJ5IHRoZSBzZWFsZWQtYm94IGxheWVyIHRvIGJpbmQgY2lwaGVydGV4dCB0b1xuICogICBhIGBwcm9qZWN0SWR8cnVuSWRgIGNvbnRleHQuIE9taXQgZm9yIG5vIEFBRCAodGhlIGxlZ2FjeSBiZWhhdmlvcikuXG4gKiBAcmV0dXJucyBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gYXV0aCB0YWddYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIGFhZD86IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBub25jZSA9IGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShOT05DRV9MRU5HVEgpKTtcbiAgbGV0IGNpcGhlcnRleHQ6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIGNpcGhlcnRleHQgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0FFUy1HQ00nLFxuICAgICAgICBpdjogbm9uY2UsXG4gICAgICAgIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCxcbiAgICAgICAgLi4uKGFhZCA/IHsgYWRkaXRpb25hbERhdGE6IGFhZCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIGtleSxcbiAgICAgIGRhdGFcbiAgICApO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIC8vIFJlLXdyYXAgYW55IFdlYiBDcnlwdG8gZmFpbHVyZSAoRE9NRXhjZXB0aW9uIGV0Yy4pIGFzIGFcbiAgICAvLyBSdW50aW1lRGVjcnlwdGlvbkVycm9yLiBGYWlsdXJlcyBoZXJlIGFyZSByYXJlOiB0aGV5IGhhcHBlbiBlLmcuXG4gICAgLy8gd2hlbiBhIENyeXB0b0tleSB3YXMgaW1wb3J0ZWQgd2l0aCBgdXNhZ2VzOiBbJ2RlY3J5cHQnXWAgb25seS5cbiAgICB0aHJvdyBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgIGBBRVMtMjU2LUdDTSBlbmNyeXB0aW9uIGZhaWxlZDogJHtjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSl9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdlbmNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBkYXRhLmJ5dGVMZW5ndGgsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShOT05DRV9MRU5HVEggKyBjaXBoZXJ0ZXh0LmJ5dGVMZW5ndGgpO1xuICByZXN1bHQuc2V0KG5vbmNlLCAwKTtcbiAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShjaXBoZXJ0ZXh0KSwgTk9OQ0VfTEVOR1RIKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGRhdGEgdXNpbmcgQUVTLTI1Ni1HQ00uXG4gKlxuICogQW55IGZhaWx1cmUgaW5zaWRlIHRoZSBXZWIgQ3J5cHRvIGxheWVyIChtb3N0IGNvbW1vbmx5IGFuXG4gKiBgT3BlcmF0aW9uRXJyb3I6IFRoZSBvcGVyYXRpb24gZmFpbGVkIGZvciBhbiBvcGVyYXRpb24tc3BlY2lmaWMgcmVhc29uYFxuICogcmFpc2VkIGJ5IGBBRVNDaXBoZXJKb2Iub25Eb25lYCB3aGVuIHRoZSBHQ00gYXV0aGVudGljYXRpb24gdGFnIGRvZXNcbiAqIG5vdCB2ZXJpZnkpIGlzIHJld3JhcHBlZCBhcyB7QGxpbmsgUnVudGltZURlY3J5cHRpb25FcnJvcn0uIFRoZVxuICogd3JhcHBlZCBlcnJvciBjYXJyaWVzIHRoZSBvcmlnaW5hbCBET01FeGNlcHRpb24gYXMgYGNhdXNlYCwgcGx1cyBhXG4gKiBzbWFsbCBkaWFnbm9zdGljIGNvbnRleHQgKGBvcGVyYXRpb25gLCBpbnB1dCBgYnl0ZUxlbmd0aGApIHRvIGhlbHBcbiAqIGRpc2FtYmlndWF0ZSBjaXBoZXJ0ZXh0IGNvcnJ1cHRpb24gZnJvbSBrZXkgbWlzbWF0Y2ggZnJvbSB0cnVuY2F0ZWRcbiAqIHRyYW5zcG9ydCByZWFkcy5cbiAqXG4gKiBOb3RlOiBgZGF0YWAgaXMgdGhlIHJhdyBBRVMgcGF5bG9hZCAoYFtub25jZV1bY2lwaGVydGV4dCArIHRhZ11gKSwgbm90IGFcbiAqIGZvcm1hdC1wcmVmaXhlZCBlbnZlbG9wZTogY2FsbGVycyBzdHJpcCB0aGUgYGVuY3JgIG1hcmtlciB2aWFcbiAqIGBkZWNvZGVGb3JtYXRQcmVmaXgoKWAgYmVmb3JlIHJlYWNoaW5nIHRoaXMgZnVuY3Rpb24uIFRoZSBvdXRlclxuICogZW52ZWxvcGUncyBmb3JtYXQgcHJlZml4IGlzIHRoZXJlZm9yZSBhdHRhY2hlZCBieSB0aGUgc2VyaWFsaXphdGlvblxuICogbGF5ZXIgKGBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHNgKSwgd2hpY2ggaXMgdGhlIGxheWVyIHRoYXQgaGFzIGl0LlxuICpcbiAqIEBwYXJhbSBrZXkgLSBDcnlwdG9LZXkgZnJvbSBgaW1wb3J0S2V5KClgXG4gKiBAcGFyYW0gZGF0YSAtIGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIEdDTSBhdXRoIHRhZ11gXG4gKiBAcGFyYW0gYWFkIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEuIE11c3QgbWF0Y2ggdGhlIGJ5dGVzXG4gKiAgIHBhc3NlZCB0byB7QGxpbmsgZW5jcnlwdH0gZXhhY3RseSwgb3RoZXJ3aXNlIHRoZSBHQ00gdGFnIGZhaWxzIHRvIHZlcmlmeVxuICogICBhbmQgYSB7QGxpbmsgUnVudGltZURlY3J5cHRpb25FcnJvcn0gaXMgdGhyb3duLlxuICogQHJldHVybnMgRGVjcnlwdGVkIHBsYWludGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIGFhZD86IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBtaW5MZW5ndGggPSBOT05DRV9MRU5HVEggKyBUQUdfTEVOR1RIIC8gODsgLy8gbm9uY2UgKyBhdXRoIHRhZ1xuICBpZiAoZGF0YS5ieXRlTGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICBgRW5jcnlwdGVkIGRhdGEgdG9vIHNob3J0OiBleHBlY3RlZCBhdCBsZWFzdCAke21pbkxlbmd0aH0gYnl0ZXMsIGdvdCAke2RhdGEuYnl0ZUxlbmd0aH1gLFxuICAgICAge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgYnl0ZUxlbmd0aDogZGF0YS5ieXRlTGVuZ3RoLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgY29uc3Qgbm9uY2UgPSBkYXRhLnN1YmFycmF5KDAsIE5PTkNFX0xFTkdUSCk7XG4gIGNvbnN0IGNpcGhlcnRleHQgPSBkYXRhLnN1YmFycmF5KE5PTkNFX0xFTkdUSCk7XG4gIGxldCBwbGFpbnRleHQ6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIHBsYWludGV4dCA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnQUVTLUdDTScsXG4gICAgICAgIGl2OiBub25jZSxcbiAgICAgICAgdGFnTGVuZ3RoOiBUQUdfTEVOR1RILFxuICAgICAgICAuLi4oYWFkID8geyBhZGRpdGlvbmFsRGF0YTogYWFkIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgY2lwaGVydGV4dFxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gVGhlIG1vc3QgY29tbW9uIHNoYXBlIHdlIHNlZSBpbiB0aGUgd2lsZCBpcyBhIERPTUV4Y2VwdGlvbiB3aXRoXG4gICAgLy8gYG5hbWU6ICdPcGVyYXRpb25FcnJvcidgIGFuZCBtZXNzYWdlIFwiVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yXG4gICAgLy8gYW4gb3BlcmF0aW9uLXNwZWNpZmljIHJlYXNvblwiLCB3aGljaCBpcyB3aGF0IFdlYiBDcnlwdG8gdGhyb3dzXG4gICAgLy8gd2hlbiB0aGUgR0NNIGF1dGggdGFnIGRvZXMgbm90IHZlcmlmeS4gUmUtdGhyb3cgYXNcbiAgICAvLyBSdW50aW1lRGVjcnlwdGlvbkVycm9yLCBhdHRhY2hpbmcgZGlhZ25vc3RpYyBjb250ZXh0IChieXRlIGxlbmd0aClcbiAgICAvLyB0aGF0IHRoZSBiYXJlIERPTUV4Y2VwdGlvbiBsYWNrcy5cbiAgICBjb25zdCBjYXVzZU1zZyA9IGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5tZXNzYWdlIDogU3RyaW5nKGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgIGBBRVMtMjU2LUdDTSBkZWNyeXB0aW9uIGZhaWxlZDogJHtjYXVzZU1zZ31gLFxuICAgICAge1xuICAgICAgICBjYXVzZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHJldHVybiBuZXcgVWludDhBcnJheShwbGFpbnRleHQpO1xufVxuIl19