@workflow/core 5.0.0-beta.35 → 5.0.0-beta.37

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 (137) hide show
  1. package/dist/capabilities.d.ts +6 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +13 -1
  4. package/dist/classify-error.d.ts.map +1 -1
  5. package/dist/classify-error.js +5 -2
  6. package/dist/create-hook.d.ts +41 -22
  7. package/dist/create-hook.d.ts.map +1 -1
  8. package/dist/create-hook.js +1 -1
  9. package/dist/describe-error.d.ts.map +1 -1
  10. package/dist/describe-error.js +12 -1
  11. package/dist/encryption.d.ts +15 -2
  12. package/dist/encryption.d.ts.map +1 -1
  13. package/dist/encryption.js +28 -7
  14. package/dist/flushable-stream.d.ts +55 -0
  15. package/dist/flushable-stream.d.ts.map +1 -1
  16. package/dist/flushable-stream.js +106 -4
  17. package/dist/global.d.ts +2 -0
  18. package/dist/global.d.ts.map +1 -1
  19. package/dist/global.js +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -2
  23. package/dist/log-format.js +3 -3
  24. package/dist/private.d.ts +82 -50
  25. package/dist/private.d.ts.map +1 -1
  26. package/dist/private.js +149 -22
  27. package/dist/replay-payload-cache.d.ts +57 -0
  28. package/dist/replay-payload-cache.d.ts.map +1 -0
  29. package/dist/replay-payload-cache.js +143 -0
  30. package/dist/runtime/constants.d.ts +11 -0
  31. package/dist/runtime/constants.d.ts.map +1 -1
  32. package/dist/runtime/constants.js +26 -1
  33. package/dist/runtime/count-step-started-events.d.ts +52 -0
  34. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  35. package/dist/runtime/count-step-started-events.js +72 -0
  36. package/dist/runtime/get-port-lazy.js +4 -4
  37. package/dist/runtime/helpers.d.ts +47 -16
  38. package/dist/runtime/helpers.d.ts.map +1 -1
  39. package/dist/runtime/helpers.js +97 -28
  40. package/dist/runtime/resume-hook.d.ts +6 -3
  41. package/dist/runtime/resume-hook.d.ts.map +1 -1
  42. package/dist/runtime/resume-hook.js +180 -58
  43. package/dist/runtime/run.d.ts.map +1 -1
  44. package/dist/runtime/run.js +3 -3
  45. package/dist/runtime/runs.d.ts.map +1 -1
  46. package/dist/runtime/runs.js +5 -3
  47. package/dist/runtime/start.d.ts.map +1 -1
  48. package/dist/runtime/start.js +65 -18
  49. package/dist/runtime/step-executor.d.ts +48 -8
  50. package/dist/runtime/step-executor.d.ts.map +1 -1
  51. package/dist/runtime/step-executor.js +90 -20
  52. package/dist/runtime/suspension-handler.js +3 -3
  53. package/dist/runtime/world.d.ts +2 -7
  54. package/dist/runtime/world.d.ts.map +1 -1
  55. package/dist/runtime/world.js +3 -10
  56. package/dist/runtime.d.ts +1 -1
  57. package/dist/runtime.d.ts.map +1 -1
  58. package/dist/runtime.js +398 -184
  59. package/dist/sealed-box.d.ts +167 -0
  60. package/dist/sealed-box.d.ts.map +1 -0
  61. package/dist/sealed-box.js +571 -0
  62. package/dist/serialization/client.d.ts +3 -3
  63. package/dist/serialization/client.d.ts.map +1 -1
  64. package/dist/serialization/client.js +1 -1
  65. package/dist/serialization/codec.d.ts +6 -4
  66. package/dist/serialization/codec.d.ts.map +1 -1
  67. package/dist/serialization/codec.js +1 -1
  68. package/dist/serialization/encryption.d.ts +118 -17
  69. package/dist/serialization/encryption.d.ts.map +1 -1
  70. package/dist/serialization/encryption.js +131 -15
  71. package/dist/serialization/step.d.ts +4 -4
  72. package/dist/serialization/step.d.ts.map +1 -1
  73. package/dist/serialization/step.js +2 -2
  74. package/dist/serialization/types.d.ts +20 -0
  75. package/dist/serialization/types.d.ts.map +1 -1
  76. package/dist/serialization/types.js +11 -1
  77. package/dist/serialization-format.d.ts +44 -4
  78. package/dist/serialization-format.d.ts.map +1 -1
  79. package/dist/serialization-format.js +66 -9
  80. package/dist/serialization.d.ts +61 -21
  81. package/dist/serialization.d.ts.map +1 -1
  82. package/dist/serialization.js +556 -200
  83. package/dist/set-attributes.d.ts +2 -7
  84. package/dist/set-attributes.d.ts.map +1 -1
  85. package/dist/set-attributes.js +1 -6
  86. package/dist/step/context-storage.d.ts +2 -2
  87. package/dist/step/context-storage.d.ts.map +1 -1
  88. package/dist/step/context-storage.js +2 -2
  89. package/dist/step/writable-stream.d.ts.map +1 -1
  90. package/dist/step/writable-stream.js +14 -3
  91. package/dist/step.d.ts.map +1 -1
  92. package/dist/step.js +87 -22
  93. package/dist/symbols.d.ts +26 -0
  94. package/dist/symbols.d.ts.map +1 -1
  95. package/dist/symbols.js +27 -1
  96. package/dist/telemetry/semantic-conventions.d.ts +4 -4
  97. package/dist/telemetry/semantic-conventions.js +2 -2
  98. package/dist/version.d.ts +1 -1
  99. package/dist/version.js +2 -2
  100. package/dist/vm/index.d.ts.map +1 -1
  101. package/dist/vm/index.js +76 -9
  102. package/dist/workflow/abort-controller.d.ts +1 -1
  103. package/dist/workflow/abort-controller.d.ts.map +1 -1
  104. package/dist/workflow/abort-controller.js +38 -3
  105. package/dist/workflow/hook.d.ts.map +1 -1
  106. package/dist/workflow/hook.js +85 -30
  107. package/dist/workflow/index.d.ts +1 -1
  108. package/dist/workflow/index.d.ts.map +1 -1
  109. package/dist/workflow/index.js +2 -2
  110. package/dist/workflow/set-attributes.d.ts +0 -9
  111. package/dist/workflow/set-attributes.d.ts.map +1 -1
  112. package/dist/workflow/set-attributes.js +1 -6
  113. package/dist/workflow/sleep.d.ts.map +1 -1
  114. package/dist/workflow/sleep.js +21 -9
  115. package/dist/workflow.d.ts +14 -11
  116. package/dist/workflow.d.ts.map +1 -1
  117. package/dist/workflow.js +37 -92
  118. package/docs/api-reference/create-hook.mdx +43 -2
  119. package/docs/api-reference/define-hook.mdx +26 -24
  120. package/docs/api-reference/fatal-error.mdx +29 -7
  121. package/docs/api-reference/fetch.mdx +3 -4
  122. package/docs/api-reference/set-attributes.mdx +0 -4
  123. package/docs/api-reference/sleep.mdx +1 -1
  124. package/docs/foundations/hooks.mdx +1 -1
  125. package/docs/foundations/idempotency.mdx +16 -9
  126. package/docs/how-it-works/cancellation.mdx +2 -2
  127. package/docs/how-it-works/code-transform.mdx +19 -15
  128. package/docs/how-it-works/encryption.mdx +3 -3
  129. package/docs/how-it-works/event-sourcing.mdx +6 -6
  130. package/docs/how-it-works/framework-integrations.mdx +96 -342
  131. package/package.json +6 -6
  132. package/dist/runtime/step-handler.d.ts +0 -2
  133. package/dist/runtime/step-handler.d.ts.map +0 -1
  134. package/dist/runtime/step-handler.js +0 -839
  135. package/dist/step-hydration-cache.d.ts +0 -148
  136. package/dist/step-hydration-cache.d.ts.map +0 -1
  137. package/dist/step-hydration-cache.js +0 -171
@@ -187,6 +187,31 @@ export function getMaxInlineSteps() {
187
187
  }
188
188
  return parsed;
189
189
  }
190
+ const warnedMaxEventsValues = new Set();
191
+ /**
192
+ * Optional client-side override for the server-supplied per-run event ceiling.
193
+ * When set to a positive integer, the runtime clamps the server's limit *down*
194
+ * to this value (never raises it) so enforcement can be exercised without a
195
+ * server-side change. `undefined` (unset) ⇒ use the server value as-is.
196
+ *
197
+ * Reads `process.env.WORKFLOW_MAX_EVENTS_OVERRIDE` lazily so tests and
198
+ * deployments can override per invocation. Invalid values fall back to unset
199
+ * (no throw — the env var is an escape hatch) and emit a one-time warning.
200
+ */
201
+ export function getMaxEventsOverride() {
202
+ const raw = process.env.WORKFLOW_MAX_EVENTS_OVERRIDE;
203
+ if (!raw)
204
+ return undefined;
205
+ const parsed = Number(raw);
206
+ if (!Number.isInteger(parsed) || parsed <= 0) {
207
+ if (!warnedMaxEventsValues.has(raw)) {
208
+ warnedMaxEventsValues.add(raw);
209
+ runtimeLogger.warn('Ignoring WORKFLOW_MAX_EVENTS_OVERRIDE: not a positive integer; using server limit', { raw });
210
+ }
211
+ return undefined;
212
+ }
213
+ return parsed;
214
+ }
190
215
  /**
191
216
  * Whether optimistic inline step start is enabled. When on, the owned-inline
192
217
  * path begins running a brand-new step's body *before* its lazy `step_started`
@@ -319,4 +344,4 @@ export const REPLAY_DIVERGENCE_MAX_RETRIES = 3;
319
344
  export function getReplayDivergenceMaxRetries() {
320
345
  return envNumber('WORKFLOW_REPLAY_DIVERGENCE_MAX_RETRIES', REPLAY_DIVERGENCE_MAX_RETRIES, { integer: true });
321
346
  }
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLHNEQUFzRDtBQUN0RCwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0Usc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxPQUFPLFNBQVMsQ0FBQywrQkFBK0IsRUFBRSxvQkFBb0IsRUFBRTtRQUN0RSxPQUFPLEVBQUUsSUFBSTtRQUNiLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLG9CQUFvQjtLQUMxQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUM7QUFFN0Ms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UyxDQUNkLHlDQUF5QyxFQUN6Qyw4QkFBOEIsRUFDOUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLGtDQUFrQyxFQUFFLENBQ25FLENBQUM7QUFDSixDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxDQUFDO0FBRS9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSw2QkFBNkI7SUFDM0MsT0FBTyxTQUFTLENBQ2Qsd0NBQXdDLEVBQ3hDLDZCQUE2QixFQUM3QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FDbEIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbi8vIE1heGltdW0gbnVtYmVyIG9mIHF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHRzIGJlZm9yZSB0aGUgaGFuZGxlciBnaXZlcyB1cCBhbmRcbi8vIGdyYWNlZnVsbHkgZmFpbHMgdGhlIHJ1bi9zdGVwLiBUaGlzIG11c3QgYmUgYm91bmRlZCB1bmRlciB0aGUgVlFTIG1lc3NhZ2Vcbi8vIG1heCB2aXNpYmlsaXR5IHdpbmRvdyAoMjQgaG91cnMpIHNvIHRoYXQgb3VyIGhhbmRsZXItc2lkZSBmYWlsdXJlIHBhdGhcbi8vIHJlbGlhYmx5IGV4ZWN1dGVzIGJlZm9yZSBWUVMgZXhwaXJlcyB0aGUgbWVzc2FnZS5cbi8vXG4vLyBUaGUgZWZmZWN0aXZlIHdhbGwtY2xvY2sgc3Vydml2YWwgZGVwZW5kcyBvbiB0aGUgcGVyLXJlZGVsaXZlcnkgYmFja29mZjogdGhlXG4vLyBgcmV0cnktYWZ0ZXJgIHRoZSBoYW5kbGVyIHJldHVybnMgKHNlZSB3b3JsZC12ZXJjZWxcbi8vIGBnZXRIYW5kbGVyRXJyb3JSZXRyeUFmdGVyU2Vjb25kc2ApIGZlZCB0aHJvdWdoIFZRUyBgY2FsY3VsYXRlQmFja29mZkRlbGF5YC5cbi8vIFZRUyB1c2VzIG91ciB2YWx1ZSBmb3IgdGhlIGZpcnN0IDMyIGF0dGVtcHRzIChjbGFtcGVkIHRvIFs1cywgOTAwc10pIHRoZW5cbi8vIGFwcGxpZXMgaXRzIG93biBleHBvbmVudGlhbCBncm93dGgg4oCUIGV2ZXJ5IGhvcCBoYXJkLWNhcHBlZCBhdCB0aGUgU1FTIGxpbWl0XG4vLyBvZiA5MDBzLiBXaXRoIHRoZSBiYWNrb2ZmIHJhbXBpbmcgdG93YXJkIHRoYXQgOTAwcyBjZWlsaW5nIChyZWFjaGVkIGJ5XG4vLyB+ZGVsaXZlcnkgMTEpLCA0OCBhdHRlbXB0cyBzcGFuIHJvdWdobHkgOeKAkzEwIGhvdXJzIG9mIHdhbGwtY2xvY2sgKH4zNSwwMDBzKSxcbi8vIGNvbWZvcnRhYmx5IHVuZGVyIHRoZSAyNC1ob3VyIG1lc3NhZ2UtdmlzaWJpbGl0eSBsaW1pdCBzbyB0aGUgZmFpbHVyZSBwYXRoXG4vLyBydW5zIGJlZm9yZSB0aGUgbWVzc2FnZSBleHBpcmVzLiAoQSBmbGF0dGVyLCBsb3ctY2FwcGVkIGJhY2tvZmYgZXhoYXVzdHMgdGhlXG4vLyBidWRnZXQgaW4gb25seSBhIGZldyBob3VycywgZmFpbGluZyBvdGhlcndpc2UtaGVhbHRoeSBydW5zIGR1cmluZyBhIHRyYW5zaWVudFxuLy8gYmFja2VuZCBvdXRhZ2U7IGNvbnZlcnNlbHksIHNwYW5uaW5nIHRoZSBmdWxsIDI0aCB3aW5kb3cgd291bGQgcmVxdWlyZSBhXG4vLyBzdWJzdGFudGlhbGx5IGhpZ2hlciBjYXAgaGVyZSwgbm90IGEgaGlnaGVyIHBlci1ob3AgY2VpbGluZyDigJQgVlFTIGNsYW1wc1xuLy8gZXZlcnkgaG9wIGF0IDkwMHMuKVxuZXhwb3J0IGNvbnN0IE1BWF9RVUVVRV9ERUxJVkVSSUVTID0gNDg7XG5cbi8qKlxuICogRWZmZWN0aXZlIG1heCBxdWV1ZSBkZWxpdmVyaWVzLiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX01BWF9RVUVVRV9ERUxJVkVSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFF1ZXVlRGVsaXZlcmllcygpOiBudW1iZXIge1xuICAvLyBPbmx5IGV2ZXIgbG93ZXIgdGhlIGRlbGl2ZXJ5IGJ1ZGdldC4gVGhlIGRlZmF1bHQgaXMgY2FsaWJyYXRlZCBzbyB0aGVcbiAgLy8gaGFuZGxlci1zaWRlIGZhaWx1cmUgcGF0aCBydW5zIGJlZm9yZSBWUVMgbWVzc2FnZS1yZXRlbnRpb24gZXhwaXJ5IChzZWVcbiAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgYWJvdmUpOyBhIGhpZ2hlciB2YWx1ZSB3b3VsZCBieXBhc3MgdGhhdCBpbnZhcmlhbnQgYW5kXG4gIC8vIGxldCBhIGJhZCBkZXBsb3ltZW50IHJlZGVsaXZlciB1bnRpbCBxdWV1ZSBleHBpcnkgaW5zdGVhZCBvZiByZWNvcmRpbmdcbiAgLy8gcnVuX2ZhaWwuIGBtYXhgIGNsYW1wcyBhIHRvby1oaWdoIG92ZXJyaWRlIGJhY2sgZG93biB0byB0aGUgc2FmZSBkZWZhdWx0LlxuICByZXR1cm4gZW52TnVtYmVyKCdXT1JLRkxPV19NQVhfUVVFVUVfREVMSVZFUklFUycsIE1BWF9RVUVVRV9ERUxJVkVSSUVTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gICAgbWF4OiBNQVhfUVVFVUVfREVMSVZFUklFUyxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgYWxsb3dlZCBmb3IgdGhlICpyZXBsYXkqIHBvcnRpb24gb2YgYSBzaW5nbGUgd29ya2Zsb3dcbiAqIGhhbmRsZXIgaW52b2NhdGlvbiAoaW4gbXMpLiBUaGlzIGJ1ZGdldCBvbmx5IGNvdmVycyBkZXRlcm1pbmlzdGljLXJlcGxheVxuICogYW5kIHdvcmtmbG93LVZNIGV4ZWN1dGlvbiBiZXR3ZWVuIHN0ZXAgYm91bmRhcmllcyDigJQgaW5saW5lIHN0ZXAgYm9kaWVzXG4gKiAoYFwidXNlIHN0ZXBcImAgZnVuY3Rpb25zIGludm9rZWQgdmlhIGBleGVjdXRlU3RlcGApIGRvIE5PVCBjb3VudCBhZ2FpbnN0XG4gKiBpdC4gU3RlcCBib2RpZXMgYXJlIGJvdW5kZWQgc2VwYXJhdGVseSBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICogYG1heER1cmF0aW9uYCAoZS5nLiA4MDBzIG9uIFZlcmNlbCBQcm8gRmx1aWQpIGFuZCBgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU2AuXG4gKlxuICogSWYgdGhlIG5vbi1zdGVwIChcInJlcGxheVwiKSB0aW1lIHdpdGhpbiBhIHNpbmdsZSBpbnZvY2F0aW9uIGV4Y2VlZHMgdGhpc1xuICogYnVkZ2V0LCB0aGUgaGFuZGxlciBleGl0cyBzbyB0aGUgcXVldWUgY2FuIHJldHJ5LiBBZnRlclxuICogYFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTYCBleGhhdXN0ZWQgYXR0ZW1wdHMgdGhlIHJ1biBpcyBmYWlsZWQgd2l0aFxuICogYFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVGAuXG4gKlxuICogTm90ZSB0aGF0IG9uIFZlcmNlbCBIb2JieSAoc3RhbmRhcmQgZnVuY3Rpb25zKSwgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAqIGlzIDYwcyDigJQgd2VsbCBiZWxvdyB0aGlzIGJ1ZGdldCwgc28gdGhlIHBsYXRmb3JtIFNJR1RFUk0gd2lsbCBmaXJlIGZpcnN0XG4gKiBhbmQgdGhlIHF1ZXVlIHdpbGwgcmUtZGVsaXZlciB1bnRpbCB0aGUgdmlzaWJpbGl0eSB3aW5kb3cgZXhwaXJlcy4gV2l0aFxuICogRmx1aWQgQ29tcHV0ZSBvbiBIb2JieSB0aGUgcGVyLWZ1bmN0aW9uIGNlaWxpbmcgcmlzZXMgdG8gMzAwcywgc3RpbGxcbiAqIHVuZGVyIHRoZSBkZWZhdWx0IGJ1ZGdldC5cbiAqXG4gKiBPdmVycmlkZSB2aWEgdGhlIGBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgZW52IHZhciAoY2xhbXBlZCB0b1xuICogYE1JTl9SRVBMQVlfVElNRU9VVF9NU2AuLmBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUExBWV9USU1FT1VUX01TID0gMjQwXzAwMDtcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgcmVwbGF5LXRpbWVvdXQgZW52IHZhciBvdmVycmlkZS4gKi9cbmV4cG9ydCBjb25zdCBNSU5fUkVQTEFZX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSByZXBsYXktdGltZW91dCBlbnYgdmFyIG92ZXJyaWRlLiA3ODBzIGxlYXZlcyDiiaUyMHMgb2ZcbiAqIGhlYWRyb29tIHVuZGVyIFZlcmNlbCBQcm8gRmx1aWQncyA4MDBzIGZ1bmN0aW9uIGNlaWxpbmcgc28gdGhlIGhhbmRsZXJcbiAqIGNhbiB3cml0ZSBgcnVuX2ZhaWxlZGAgYmVmb3JlIFNJR1RFUk0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfUkVQTEFZX1RJTUVPVVRfTVMgPSA3ODBfMDAwO1xuXG4vLyBUcmFjayB3aGljaCByYXcgZW52IHZhciB2YWx1ZXMgd2UndmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQgc28gdGhlIHdhcm5pbmdcbi8vIGxvZyBvbmx5IGZpcmVzIG9uY2UgcGVyIHByb2Nlc3MgKHRoZSBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1hbnkgdGltZXMpLlxuY29uc3Qgd2FybmVkUmVwbGF5VGltZW91dFZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5mdW5jdGlvbiB3YXJuT25jZShcbiAgcmF3OiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQge1xuICBpZiAod2FybmVkUmVwbGF5VGltZW91dFZhbHVlcy5oYXMocmF3KSkgcmV0dXJuO1xuICB3YXJuZWRSZXBsYXlUaW1lb3V0VmFsdWVzLmFkZChyYXcpO1xuICBydW50aW1lTG9nZ2VyLndhcm4obWVzc2FnZSwgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHJlcGxheS10aW1lb3V0IGJ1ZGdldCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVNgIGxhemlseSBzbyB0ZXN0cyBhbmRcbiAqIGRlcGxveW1lbnRzIGNhbiBvdmVycmlkZSBwZXIgaW52b2NhdGlvbi4gSW52YWxpZCAvIG91dC1vZi1yYW5nZSB2YWx1ZXNcbiAqIGZhbGwgYmFjayB0byBhIHNhZmUgdmFsdWUgKG5vIHRocm93IOKAlCB0aGUgZW52IHZhciBpcyBhbiBlc2NhcGUgaGF0Y2gsXG4gKiBub3QgYSBoYXJkIHJlcXVpcmVtZW50KSBhbmQgZW1pdCBhIG9uZS10aW1lIHdhcm5pbmcgc28gbWlzY29uZmlndXJhdGlvblxuICogaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheVRpbWVvdXRNcygpOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUztcbiAgaWYgKCFyYXcpIHJldHVybiBSRVBMQVlfVElNRU9VVF9NUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgfHwgcGFyc2VkIDw9IDApIHtcbiAgICB3YXJuT25jZShcbiAgICAgIHJhdyxcbiAgICAgICdJZ25vcmluZyBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUzogbm90IGEgcG9zaXRpdmUgZmluaXRlIG51bWJlcjsgdXNpbmcgZGVmYXVsdCcsXG4gICAgICB7IHJhdywgZGVmYXVsdE1zOiBSRVBMQVlfVElNRU9VVF9NUyB9XG4gICAgKTtcbiAgICByZXR1cm4gUkVQTEFZX1RJTUVPVVRfTVM7XG4gIH1cbiAgaWYgKHBhcnNlZCA8IE1JTl9SRVBMQVlfVElNRU9VVF9NUykge1xuICAgIHdhcm5PbmNlKHJhdywgJ1dPUktGTE9XX1JFUExBWV9USU1FT1VUX01TIGJlbG93IG1pbmltdW07IGNsYW1wZWQnLCB7XG4gICAgICByYXcsXG4gICAgICBjbGFtcGVkTXM6IE1JTl9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICAgIG1pbk1zOiBNSU5fUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gICAgcmV0dXJuIE1JTl9SRVBMQVlfVElNRU9VVF9NUztcbiAgfVxuICBpZiAocGFyc2VkID4gTUFYX1JFUExBWV9USU1FT1VUX01TKSB7XG4gICAgd2Fybk9uY2UocmF3LCAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgYWJvdmUgbWF4aW11bTsgY2xhbXBlZCcsIHtcbiAgICAgIHJhdyxcbiAgICAgIGNsYW1wZWRNczogTUFYX1JFUExBWV9USU1FT1VUX01TLFxuICAgICAgbWF4TXM6IE1BWF9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgICByZXR1cm4gTUFYX1JFUExBWV9USU1FT1VUX01TO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogUmVzZXQgdGhlIHdhcm4tb25jZSBjYWNoZS4gVGVzdC1vbmx5IOKAlCBleHBvcnRlZCBzbyB1bml0IHRlc3RzIGNhblxuICogZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCByZXBlYXRlZGx5IHdpdGhvdXQgc2hhcmluZyBzdGF0ZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFJlcGxheVRpbWVvdXRXYXJuQ2FjaGVGb3JUZXN0cygpOiB2b2lkIHtcbiAgd2FybmVkUmVwbGF5VGltZW91dFZhbHVlcy5jbGVhcigpO1xufVxuXG4vLyBOdW1iZXIgb2YgcXVldWUgZGVsaXZlcnkgYXR0ZW1wdHMgdG8gYWxsb3cgYmVmb3JlIHBlcm1hbmVudGx5IGZhaWxpbmcgYSBydW5cbi8vIGR1ZSB0byBhIHJlcGxheSB0aW1lb3V0LiBPbiBhdHRlbXB0cyAxIHRocm91Z2ggdGhpcyB2YWx1ZSwgdGhlIHRpbWVvdXRcbi8vIGhhbmRsZXIgZXhpdHMgd2l0aG91dCB3cml0aW5nIHJ1bl9mYWlsZWQgc28gdGhlIHF1ZXVlIHJldHJpZXMgdGhlIG1lc3NhZ2UuXG4vLyBPbiB0aGUgbmV4dCBhdHRlbXB0IHRoZSBydW4gaXMgbWFya2VkIGFzIGZhaWxlZC5cbmV4cG9ydCBjb25zdCBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIHJlcGxheS10aW1lb3V0IHJldHJ5IGJ1ZGdldC4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5VGltZW91dE1heFJldHJpZXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVMnLFxuICAgIFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBzdGVwcyB0aGUgb3duZWQtaW5saW5lIHBhdGggcnVucyBpbmxpbmUgKGluXG4gKiBwYXJhbGxlbCkgcGVyIHN1c3BlbnNpb24uIFRoZSByZXN0IGFyZSBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycy4gRWFjaFxuICogaW5saW5lIHN0ZXAgaXMgY3JlYXRlZCBsYXppbHkg4oCUIGl0cyBgc3RlcF9jcmVhdGVkYCBpcyBmb2xkZWQgaW50byB0aGVcbiAqIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgYGV4ZWN1dGVTdGVwYCBzZW5kcyDigJQgc28gaW5saW5pbmcgTiBzdGVwcyBzYXZlcyBOIHF1ZXVlXG4gKiByb3VuZC10cmlwcyBmb3IgYSBgUHJvbWlzZS5hbGxgLXN0eWxlIGZhbi1vdXQuIGAxYCByZXByb2R1Y2VzIHRoZVxuICogc2luZ2xlLWlubGluZS1zdGVwIGJlaGF2aW9yIGV4YWN0bHkgKHVzZWZ1bCBraWxsLXN3aXRjaCkuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCAoY2xhbXBlZCB0b1xuICogYE1JTl9NQVhfSU5MSU5FX1NURVBTYC4uYE1BWF9NQVhfSU5MSU5FX1NURVBTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5MSU5FX1NURVBTID0gMztcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZSAoMSA9IHNpbmdsZSBpbmxpbmUgc3RlcCkuICovXG5leHBvcnQgY29uc3QgTUlOX01BWF9JTkxJTkVfU1RFUFMgPSAxO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZS4gSW5saW5lIGJvZGllcyBydW4gaW4gcGFyYWxsZWxcbiAqIHdpdGhpbiBvbmUgZnVuY3Rpb24gaW52b2NhdGlvbiwgc28gdGhpcyBjYXBzIG1lbW9yeS9DUFUgZmFuLW91dCBwZXIgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9NQVhfSU5MSU5FX1NURVBTID0gMTY7XG5cbi8vIFdhcm4tb25jZSBjYWNoZSBmb3IgV09SS0ZMT1dfTUFYX0lOTElORV9TVEVQUywga2V5ZWQgYnkgcmF3IGVudiB2YWx1ZS5cbmNvbnN0IHdhcm5lZE1heElubGluZVN0ZXBzVmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIG1heCBudW1iZXIgb2YgaW5saW5lIHN0ZXBzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgLyBvdXQtb2YtcmFuZ2UgdmFsdWVzIGZhbGxcbiAqIGJhY2sgdG8gYSBzYWZlIHZhbHVlIChubyB0aHJvdyDigJQgdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIG1pc2NvbmZpZ3VyYXRpb24gaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heElubGluZVN0ZXBzKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM7XG4gIGlmICghcmF3KSByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdJZ25vcmluZyBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTOiBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyOyB1c2luZyBkZWZhdWx0JyxcbiAgICAgICAgeyByYXcsIGRlZmF1bHRWYWx1ZTogTUFYX0lOTElORV9TVEVQUyB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgfVxuICBpZiAocGFyc2VkIDwgTUlOX01BWF9JTkxJTkVfU1RFUFMpIHJldHVybiBNSU5fTUFYX0lOTElORV9TVEVQUztcbiAgaWYgKHBhcnNlZCA+IE1BWF9NQVhfSU5MSU5FX1NURVBTKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1dPUktGTE9XX01BWF9JTkxJTkVfU1RFUFMgYWJvdmUgbWF4aW11bTsgY2xhbXBlZCcsIHtcbiAgICAgICAgcmF3LFxuICAgICAgICBjbGFtcGVkVmFsdWU6IE1BWF9NQVhfSU5MSU5FX1NURVBTLFxuICAgICAgICBtYXhWYWx1ZTogTUFYX01BWF9JTkxJTkVfU1RFUFMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIE1BWF9NQVhfSU5MSU5FX1NURVBTO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciBvcHRpbWlzdGljIGlubGluZSBzdGVwIHN0YXJ0IGlzIGVuYWJsZWQuIFdoZW4gb24sIHRoZSBvd25lZC1pbmxpbmVcbiAqIHBhdGggYmVnaW5zIHJ1bm5pbmcgYSBicmFuZC1uZXcgc3RlcCdzIGJvZHkgKmJlZm9yZSogaXRzIGxhenkgYHN0ZXBfc3RhcnRlZGBcbiAqIG5ldHdvcmsgY2FsbCByZXNvbHZlcyAodGhlIGlucHV0IGlzIGFscmVhZHkga25vd24gbG9jYWxseSksIGF3YWl0aW5nIHRoZVxuICogYHN0ZXBfc3RhcnRlZGAgb25seSBiZWZvcmUgdGhlIHRlcm1pbmFsIHdyaXRlLlxuICpcbiAqIFRoaXMgY2FuIHJ1biBhIHN0ZXAgYm9keSBtb3JlIHRoYW4gb25jZSB3aGVuIGhhbmRsZXJzIHJhY2UgZm9yIHRoZSBzYW1lXG4gKiBzdGVwJ3MgY3JlYXRlLWNsYWltIOKAlCBib3RoIHJ1biB0aGUgYm9keSBiZWZvcmUgb25lIHdpbnMuIFRoYXQgaXMgdW5zYWZlIGZvclxuICogc3RlcHMgd2l0aCBub24taWRlbXBvdGVudCBzaWRlIGVmZmVjdHM7IGluIHBhcnRpY3VsYXIsIHR3byBjb25jdXJyZW50IHJ1bnNcbiAqIG9mIGEgc3RlcCB0aGF0IHdyaXRlcyB0byB0aGUgd29ya2Zsb3cgc3RyZWFtIChlLmcuIGFuIEFJIGFnZW50IHN0cmVhbWluZ1xuICogdG9rZW5zKSBjYW4gaW50ZXJsZWF2ZSBhbmQgY29ycnVwdCB0aGUgc3RyZWFtIGRhdGEuIFNvIHRoZSBvcHRpbWl6YXRpb24gaXNcbiAqICoqb2ZmIGJ5IGRlZmF1bHQqKiBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IG9wdGVkIGludG8gcGVyIGRlcGxveW1lbnQuXG4gKlxuICogUmVhZHMgYHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUYCBsYXppbHkuIERlZmF1bHQgT0ZGO1xuICogZW5hYmxlZCBvbmx5IGJ5IGFuIGV4cGxpY2l0IGAnMSdgIC8gYCd0cnVlJ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGltaXN0aWNJbmxpbmVTdGFydEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmF3ID09PSAnMScgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIG9wZXJhdG9yIGhhcyAqKmV4cGxpY2l0bHkgZGlzYWJsZWQqKiBvcHRpbWlzdGljIGlubGluZSBzdGFydCB2aWFcbiAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wYCAvIGA9ZmFsc2VgLiBEaXN0aW5jdCBmcm9tIFwidW5zZXRcIjogdW5zZXRcbiAqIGxlYXZlcyB0aGUgb3B0aW1pemF0aW9uIG9mZiBieSBkZWZhdWx0IGJ1dCBsZXRzIHR1cmJvIGZvcmNlIGl0IG9uOyBhbiBleHBsaWNpdFxuICogYDBgL2BmYWxzZWAgaXMgYW4gb3BlcmF0b3Igb3B0LW91dCB0aGF0IHR1cmJvIG11c3QgaG9ub3IgKHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0IHN0aWxsIHJ1bnMgYSBzdGVwIGJvZHkgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgL2BydW5fc3RhcnRlZGAgaXNcbiAqIGNvbmZpcm1lZCwgdGhlIHByb3BlcnR5IHN1Y2ggYW4gb3BlcmF0b3IgaXMgb3B0aW5nIG91dCBvZiksIHNvXG4gKiBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIGRlZmVycyB0byB0aGlzLiBSZWFkcyB0aGUgZW52IHZhciBsYXppbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGltaXN0aWNJbmxpbmVTdGFydEV4cGxpY2l0bHlEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIFwidHVyYm8gbW9kZVwiIGlzIGVuYWJsZWQuIFR1cmJvIG1vZGUgZmFzdC1wYXRocyB0aGUgKmZpcnN0IGRlbGl2ZXJ5IG9mXG4gKiB0aGUgZmlyc3QgaW52b2NhdGlvbiogb2YgYSBydW4gKGRldGVjdGVkIGJ5IHRoZSBlbnRyeXBvaW50IHZpYSBgcnVuSW5wdXRgXG4gKiBwcmVzZW5jZSArIGBtZXRhZGF0YS5hdHRlbXB0ID09PSAxYCk6IGl0IGJhY2tncm91bmRzIHRoZSBgcnVuX3N0YXJ0ZWRgIGV2ZW50XG4gKiBjcmVhdGlvbiwgc2tpcHMgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB5ZXQpLFxuICogYW5kIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGVwIHN0YXJ0IGZvciB0aGF0IGludm9jYXRpb24g4oCUIGluZGVwZW5kZW50IG9mXG4gKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgLlxuICpcbiAqIEZvcmNpbmcgb3B0aW1pc3RpYyBzdGFydCBpcyBzYWZlIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgZGVsaXZlcnkgaGFzIG5vXG4gKiBjb25jdXJyZW50IHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBzdGVwIGNyZWF0ZS1jbGFpbSwgc28gYSBzdGVwIGJvZHkgcnVuc1xuICogZXhhY3RseSBvbmNlLiBUaGF0IHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSBlbmRzIGFzIHNvb24gYXMgdGhlIHJ1biBjcmVhdGVzIGFcbiAqIGhvb2sgb3Igd2FpdCAod2hpY2ggaW50cm9kdWNlIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyksIHNvIHRoZSBydW50aW1lXG4gKiBleGl0cyB0dXJibyBhdCB0aGF0IHBvaW50LlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19UVVJCT2AgbGF6aWx5LiBEZWZhdWx0ICoqT04qKjsgZGlzYWJsZWQgb25seSBieSBhblxuICogZXhwbGljaXQgYCcwJ2AgLyBgJ2ZhbHNlJ2AgKGNhc2UtaW5zZW5zaXRpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1RVUkJPO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhKHJhdyA9PT0gJzAnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGlubGluZSBzdGVwIG93bmVyc2hpcCBpcyBlbmFibGVkIChkZWZhdWx0IE9OKS4gV2hlbiBvbiwgdGhlIGxhenlcbiAqIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgY3JlYXRlcyBhbiBpbmxpbmUgc3RlcCByZWNvcmRzIHRoZSBvd25pbmcgcXVldWVcbiAqIG1lc3NhZ2UgSUQsIGFuZCB3YWtlIHJlcGxheXMgdGhhdCBvYnNlcnZlIGFuIGFjdGl2ZWx5LW93bmVkIHN0ZXAgZW5xdWV1ZSBhXG4gKiAqZGVsYXllZCBiYWNrc3RvcCogbWVzc2FnZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IHJlcXVldWVpbmcgaXQg4oCUIGZpeGluZ1xuICogZHVwbGljYXRlIGlubGluZSBzdGVwIGV4ZWN1dGlvbiB3aGVuIGEgaG9vay93YWl0IHdha2VzIGEgcnVuIG1pZC1zdGVwXG4gKiAodmVyY2VsL3dvcmtmbG93IzI3ODApLlxuICpcbiAqIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQPTBgIChvciBgZmFsc2VgKSBpcyB0aGUga2lsbCBzd2l0Y2g6IGRpc3BhdGNoXG4gKiByZXZlcnRzIHRvIHRoZSB1bmNvbmRpdGlvbmFsIGltbWVkaWF0ZSByZXF1ZXVlLiBTdGFtcGluZyBpcyB1bmFmZmVjdGVkIOKAlFxuICogdGhlIHJlY29yZGVkIG93bmVyTWVzc2FnZUlkIGlzIGluZXJ0IGRhdGEgd2hlbiB0aGUgc3dpdGNoIGlzIG9mZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpbmxpbmUtb3duZXJzaGlwIGxlYXNlLCBpbiBzZWNvbmRzOiBob3cgbG9uZyBhZnRlciBhIHN0ZXAncyBsYXRlc3RcbiAqIChzdGFtcGVkKSBgc3RlcF9zdGFydGVkYCBhIG5vbi1vd25lciBpbnZvY2F0aW9uIGFzc3VtZXMgdGhlIG93bmluZ1xuICogaW52b2NhdGlvbiBtYXkgc3RpbGwgYmUgYWxpdmUuIFdpdGhpbiB0aGUgbGVhc2UsIHdha2UgcmVwbGF5cyBlbnF1ZXVlIHRoZVxuICogc3RlcCdzIGJhY2tzdG9wIG1lc3NhZ2Ugd2l0aCBgZGVsYXlTZWNvbmRzID0gbGVhc2UgcmVtYWluaW5nYCBpbnN0ZWFkIG9mXG4gKiBpbW1lZGlhdGVseTsgcGFzdCBpdCwgdGhleSBlbnF1ZXVlIGltbWVkaWF0ZWx5ICh0b2RheSdzIGJlaGF2aW9yKS5cbiAqXG4gKiBXaHkgYSBmaXhlZCA4NjAgYW5kIG5vdCBhIHZhbHVlIGRlcml2ZWQgZnJvbSB0aGUgZnVuY3Rpb24ncyBgbWF4RHVyYXRpb25gOlxuICogbmVpdGhlciBydW50aW1lIG5vciBidWlsZCB0aW1lIGNhbiBzZWUgdGhlIHJlc29sdmVkIHZhbHVlIOKAlCBidWlsZGVycyBlbWl0XG4gKiBgbWF4RHVyYXRpb246ICdtYXgnYCwgd2hpY2ggdGhlIHBsYXRmb3JtIHJlc29sdmVzIHBlci1wbGFuIGF0IGRlcGxveSwgYW5kXG4gKiBubyBlbnYgdmFyIG9yIHJlcXVlc3QtY29udGV4dCBkZWFkbGluZSBBUEkgZXhwb3NlcyB0aGUgcmVzdWx0LiBUaGUgYm91bmRcbiAqIGNvbWVzIGZyb20gYSBwbGF0Zm9ybSBydWxlIGluc3RlYWQ6IGR1cmF0aW9ucyBhYm92ZSA4MDBzIHJlcXVpcmUgZXhwbGljaXRcbiAqIHBlci1mdW5jdGlvbiBudW1lcmljIGNvbmZpZywgc28gYSBidWlsZGVyLWVtaXR0ZWQgYCdtYXgnYCByZXNvbHZlcyB0byBhdFxuICogbW9zdCA4MDBzIOKAlCA4NjBzIHRoZXJlZm9yZSBkb21pbmF0ZXMgYW55IHdvcmtmbG93IHJvdXRlJ3MgaW52b2NhdGlvblxuICogbGlmZXRpbWUgcGx1cyBzY2hlZHVsaW5nIHNsYWNrLiBSZXZpc2l0IHdoZW4gdGhhdCBjZWlsaW5nIG1vdmVzICh0aGVcbiAqIDMwLW1pbnV0ZSBkdXJhdGlvbiBiZXRhIGJlY29taW5nIHJlYWNoYWJsZSB2aWEgYCdtYXgnYCB3b3VsZCBpbnZhbGlkYXRlXG4gKiB0aGUgYm91bmQpLiBXb3JsZHMgd2l0aG91dCBhbiBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsLFxuICogc2VsZi1ob3N0ZWQpIGdldCBubyBkZWF0aCBwcm9vZiBmcm9tIGFueSBjb25zdGFudCDigJQgdGhlcmUgdGhlIGluLXByb2Nlc3NcbiAqIHNpbmdsZS1mbGlnaHQgbGF5ZXIgKHN0ZXAtc2luZ2xlLWZsaWdodC50cykgaXMgd2hhdCBtYWtlcyBhIGJhY2tzdG9wXG4gKiBmaXJpbmcgbWlkLXN0ZXAgaGFybWxlc3MuXG4gKlxuICogODYwIGFsc28gc3RheXMgdW5kZXIgdGhlIHF1ZXVlJ3MgOTAwcyBtYXhpbXVtIGRlbGF5IChTUVMgY2FwKSwgc28gYVxuICogYmFja3N0b3AncyBmdWxsIGxlYXNlIHJlbWFpbmRlciBhbHdheXMgZml0cyBpbiBhIHNpbmdsZSBkZWxheWVkIG1lc3NhZ2UuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFNgIChjbGFtcGVkIHRvXG4gKiAxLi5gTUFYX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2ApLlxuICovXG5leHBvcnQgY29uc3QgSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTID0gODYwO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgbGVhc2UgZW52IG92ZXJyaWRlLiA5MDBzIGlzIHRoZSBxdWV1ZSdzIG1heGltdW1cbiAqIHBlci1tZXNzYWdlIGRlbGF5IChTUVMgY2FwKSDigJQgYSBsb25nZXIgbGVhc2Ugd291bGQgbmVlZCBkZWxheSBjaGFpbmluZ1xuICogbGlrZSBsb25nIHdhaXRzIHVzZTsgY2xhbXAgaW5zdGVhZCBzbyBvbmUgZGVsYXllZCBtZXNzYWdlIGFsd2F5cyBzdWZmaWNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgPSA5MDA7XG5cbi8qKlxuICogRWZmZWN0aXZlIGlubGluZS1vd25lcnNoaXAgbGVhc2UuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2Ag4oCUIGUuZy4gcmFpc2UgaXQgb24gc2VsZi1ob3N0ZWRcbiAqIG11bHRpLWluc3RhbmNlIHdvcmxkcyB3aXRoIGxvbmctcnVubmluZyBzdGVwcyB0byB3aWRlbiB0aGUgd2luZG93IGluIHdoaWNoXG4gKiBhIGxpdmUgb3duZXIgaXMgcHJvdGVjdGVkIGZyb20gYSBjb25jdXJyZW50IGJhY2tzdG9wIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElubGluZU93bmVyc2hpcExlYXNlU2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMnLFxuICAgIElOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSwgbWF4OiBNQVhfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTIH1cbiAgKTtcbn1cblxuLy8gQSByZXBsYXktY29uc3VtZXIgbWlzbWF0Y2ggY2FuIGJlIGNhdXNlZCBieSBhIHRyYW5zaWVudCBkaXZlcmdlbnQgcmVwbGF5XG4vLyByYXRoZXIgdGhhbiBhbiBpbnZhbGlkIHBlcnNpc3RlZCBoaXN0b3J5LiBRdWV1ZSBib3VuZGVkIHJlY292ZXJ5IHJlcGxheXNcbi8vIGJlZm9yZSByZWNvcmRpbmcgdGVybWluYWwgY29ycnVwdGlvbiBmb3IgYSBydW4gdGhhdCBjYW5ub3QgcmVwbGF5LlxuZXhwb3J0IGNvbnN0IFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFZmZlY3RpdmUgcmVwbGF5LWRpdmVyZ2VuY2UgcmVjb3ZlcnkgYnVkZ2V0LiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19SRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUycsXG4gICAgUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cbiJdfQ==
347
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLHNEQUFzRDtBQUN0RCwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0Usc0JBQXNCO0FBQ3RCLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLDRFQUE0RTtJQUM1RSxPQUFPLFNBQVMsQ0FBQywrQkFBK0IsRUFBRSxvQkFBb0IsRUFBRTtRQUN0RSxPQUFPLEVBQUUsSUFBSTtRQUNiLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLG9CQUFvQjtLQUMxQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDO0FBRTVDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUM7QUFFN0Ms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dW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbi8vIE1heGltdW0gbnVtYmVyIG9mIHF1ZXVlIGRlbGl2ZXJ5IGF0dGVtcHRzIGJlZm9yZSB0aGUgaGFuZGxlciBnaXZlcyB1cCBhbmRcbi8vIGdyYWNlZnVsbHkgZmFpbHMgdGhlIHJ1bi9zdGVwLiBUaGlzIG11c3QgYmUgYm91bmRlZCB1bmRlciB0aGUgVlFTIG1lc3NhZ2Vcbi8vIG1heCB2aXNpYmlsaXR5IHdpbmRvdyAoMjQgaG91cnMpIHNvIHRoYXQgb3VyIGhhbmRsZXItc2lkZSBmYWlsdXJlIHBhdGhcbi8vIHJlbGlhYmx5IGV4ZWN1dGVzIGJlZm9yZSBWUVMgZXhwaXJlcyB0aGUgbWVzc2FnZS5cbi8vXG4vLyBUaGUgZWZmZWN0aXZlIHdhbGwtY2xvY2sgc3Vydml2YWwgZGVwZW5kcyBvbiB0aGUgcGVyLXJlZGVsaXZlcnkgYmFja29mZjogdGhlXG4vLyBgcmV0cnktYWZ0ZXJgIHRoZSBoYW5kbGVyIHJldHVybnMgKHNlZSB3b3JsZC12ZXJjZWxcbi8vIGBnZXRIYW5kbGVyRXJyb3JSZXRyeUFmdGVyU2Vjb25kc2ApIGZlZCB0aHJvdWdoIFZRUyBgY2FsY3VsYXRlQmFja29mZkRlbGF5YC5cbi8vIFZRUyB1c2VzIG91ciB2YWx1ZSBmb3IgdGhlIGZpcnN0IDMyIGF0dGVtcHRzIChjbGFtcGVkIHRvIFs1cywgOTAwc10pIHRoZW5cbi8vIGFwcGxpZXMgaXRzIG93biBleHBvbmVudGlhbCBncm93dGgg4oCUIGV2ZXJ5IGhvcCBoYXJkLWNhcHBlZCBhdCB0aGUgU1FTIGxpbWl0XG4vLyBvZiA5MDBzLiBXaXRoIHRoZSBiYWNrb2ZmIHJhbXBpbmcgdG93YXJkIHRoYXQgOTAwcyBjZWlsaW5nIChyZWFjaGVkIGJ5XG4vLyB+ZGVsaXZlcnkgMTEpLCA0OCBhdHRlbXB0cyBzcGFuIHJvdWdobHkgOeKAkzEwIGhvdXJzIG9mIHdhbGwtY2xvY2sgKH4zNSwwMDBzKSxcbi8vIGNvbWZvcnRhYmx5IHVuZGVyIHRoZSAyNC1ob3VyIG1lc3NhZ2UtdmlzaWJpbGl0eSBsaW1pdCBzbyB0aGUgZmFpbHVyZSBwYXRoXG4vLyBydW5zIGJlZm9yZSB0aGUgbWVzc2FnZSBleHBpcmVzLiAoQSBmbGF0dGVyLCBsb3ctY2FwcGVkIGJhY2tvZmYgZXhoYXVzdHMgdGhlXG4vLyBidWRnZXQgaW4gb25seSBhIGZldyBob3VycywgZmFpbGluZyBvdGhlcndpc2UtaGVhbHRoeSBydW5zIGR1cmluZyBhIHRyYW5zaWVudFxuLy8gYmFja2VuZCBvdXRhZ2U7IGNvbnZlcnNlbHksIHNwYW5uaW5nIHRoZSBmdWxsIDI0aCB3aW5kb3cgd291bGQgcmVxdWlyZSBhXG4vLyBzdWJzdGFudGlhbGx5IGhpZ2hlciBjYXAgaGVyZSwgbm90IGEgaGlnaGVyIHBlci1ob3AgY2VpbGluZyDigJQgVlFTIGNsYW1wc1xuLy8gZXZlcnkgaG9wIGF0IDkwMHMuKVxuZXhwb3J0IGNvbnN0IE1BWF9RVUVVRV9ERUxJVkVSSUVTID0gNDg7XG5cbi8qKlxuICogRWZmZWN0aXZlIG1heCBxdWV1ZSBkZWxpdmVyaWVzLiBPdmVycmlkZSB2aWEgYFdPUktGTE9XX01BWF9RVUVVRV9ERUxJVkVSSUVTYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFF1ZXVlRGVsaXZlcmllcygpOiBudW1iZXIge1xuICAvLyBPbmx5IGV2ZXIgbG93ZXIgdGhlIGRlbGl2ZXJ5IGJ1ZGdldC4gVGhlIGRlZmF1bHQgaXMgY2FsaWJyYXRlZCBzbyB0aGVcbiAgLy8gaGFuZGxlci1zaWRlIGZhaWx1cmUgcGF0aCBydW5zIGJlZm9yZSBWUVMgbWVzc2FnZS1yZXRlbnRpb24gZXhwaXJ5IChzZWVcbiAgLy8gTUFYX1FVRVVFX0RFTElWRVJJRVMgYWJvdmUpOyBhIGhpZ2hlciB2YWx1ZSB3b3VsZCBieXBhc3MgdGhhdCBpbnZhcmlhbnQgYW5kXG4gIC8vIGxldCBhIGJhZCBkZXBsb3ltZW50IHJlZGVsaXZlciB1bnRpbCBxdWV1ZSBleHBpcnkgaW5zdGVhZCBvZiByZWNvcmRpbmdcbiAgLy8gcnVuX2ZhaWwuIGBtYXhgIGNsYW1wcyBhIHRvby1oaWdoIG92ZXJyaWRlIGJhY2sgZG93biB0byB0aGUgc2FmZSBkZWZhdWx0LlxuICByZXR1cm4gZW52TnVtYmVyKCdXT1JLRkxPV19NQVhfUVVFVUVfREVMSVZFUklFUycsIE1BWF9RVUVVRV9ERUxJVkVSSUVTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gICAgbWF4OiBNQVhfUVVFVUVfREVMSVZFUklFUyxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgYWxsb3dlZCBmb3IgdGhlICpyZXBsYXkqIHBvcnRpb24gb2YgYSBzaW5nbGUgd29ya2Zsb3dcbiAqIGhhbmRsZXIgaW52b2NhdGlvbiAoaW4gbXMpLiBUaGlzIGJ1ZGdldCBvbmx5IGNvdmVycyBkZXRlcm1pbmlzdGljLXJlcGxheVxuICogYW5kIHdvcmtmbG93LVZNIGV4ZWN1dGlvbiBiZXR3ZWVuIHN0ZXAgYm91bmRhcmllcyDigJQgaW5saW5lIHN0ZXAgYm9kaWVzXG4gKiAoYFwidXNlIHN0ZXBcImAgZnVuY3Rpb25zIGludm9rZWQgdmlhIGBleGVjdXRlU3RlcGApIGRvIE5PVCBjb3VudCBhZ2FpbnN0XG4gKiBpdC4gU3RlcCBib2RpZXMgYXJlIGJvdW5kZWQgc2VwYXJhdGVseSBieSB0aGUgcGxhdGZvcm0ncyBmdW5jdGlvblxuICogYG1heER1cmF0aW9uYCAoZS5nLiA4MDBzIG9uIFZlcmNlbCBQcm8gRmx1aWQpIGFuZCBgTk9fSU5MSU5FX1JFUExBWV9BRlRFUl9NU2AuXG4gKlxuICogSWYgdGhlIG5vbi1zdGVwIChcInJlcGxheVwiKSB0aW1lIHdpdGhpbiBhIHNpbmdsZSBpbnZvY2F0aW9uIGV4Y2VlZHMgdGhpc1xuICogYnVkZ2V0LCB0aGUgaGFuZGxlciBleGl0cyBzbyB0aGUgcXVldWUgY2FuIHJldHJ5LiBBZnRlclxuICogYFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTYCBleGhhdXN0ZWQgYXR0ZW1wdHMgdGhlIHJ1biBpcyBmYWlsZWQgd2l0aFxuICogYFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVGAuXG4gKlxuICogTm90ZSB0aGF0IG9uIFZlcmNlbCBIb2JieSAoc3RhbmRhcmQgZnVuY3Rpb25zKSwgdGhlIHBsYXRmb3JtIGBtYXhEdXJhdGlvbmBcbiAqIGlzIDYwcyDigJQgd2VsbCBiZWxvdyB0aGlzIGJ1ZGdldCwgc28gdGhlIHBsYXRmb3JtIFNJR1RFUk0gd2lsbCBmaXJlIGZpcnN0XG4gKiBhbmQgdGhlIHF1ZXVlIHdpbGwgcmUtZGVsaXZlciB1bnRpbCB0aGUgdmlzaWJpbGl0eSB3aW5kb3cgZXhwaXJlcy4gV2l0aFxuICogRmx1aWQgQ29tcHV0ZSBvbiBIb2JieSB0aGUgcGVyLWZ1bmN0aW9uIGNlaWxpbmcgcmlzZXMgdG8gMzAwcywgc3RpbGxcbiAqIHVuZGVyIHRoZSBkZWZhdWx0IGJ1ZGdldC5cbiAqXG4gKiBPdmVycmlkZSB2aWEgdGhlIGBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NU2AgZW52IHZhciAoY2xhbXBlZCB0b1xuICogYE1JTl9SRVBMQVlfVElNRU9VVF9NU2AuLmBNQVhfUkVQTEFZX1RJTUVPVVRfTVNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUExBWV9USU1FT1VUX01TID0gMjQwXzAwMDtcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgcmVwbGF5LXRpbWVvdXQgZW52IHZhciBvdmVycmlkZS4gKi9cbmV4cG9ydCBjb25zdCBNSU5fUkVQTEFZX1RJTUVPVVRfTVMgPSAzMF8wMDA7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgZm9yIHRoZSByZXBsYXktdGltZW91dCBlbnYgdmFyIG92ZXJyaWRlLiA3ODBzIGxlYXZlcyDiiaUyMHMgb2ZcbiAqIGhlYWRyb29tIHVuZGVyIFZlcmNlbCBQcm8gRmx1aWQncyA4MDBzIGZ1bmN0aW9uIGNlaWxpbmcgc28gdGhlIGhhbmRsZXJcbiAqIGNhbiB3cml0ZSBgcnVuX2ZhaWxlZGAgYmVmb3JlIFNJR1RFUk0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfUkVQTEFZX1RJTUVPVVRfTVMgPSA3ODBfMDAwO1xuXG4vLyBUcmFjayB3aGljaCByYXcgZW52IHZhciB2YWx1ZXMgd2UndmUgYWxyZWFkeSB3YXJuZWQgYWJvdXQgc28gdGhlIHdhcm5pbmdcbi8vIGxvZyBvbmx5IGZpcmVzIG9uY2UgcGVyIHByb2Nlc3MgKHRoZSBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1hbnkgdGltZXMpLlxuY29uc3Qgd2FybmVkUmVwbGF5VGltZW91dFZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5mdW5jdGlvbiB3YXJuT25jZShcbiAgcmF3OiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQge1xuICBpZiAod2FybmVkUmVwbGF5VGltZW91dFZhbHVlcy5oYXMocmF3KSkgcmV0dXJuO1xuICB3YXJuZWRSZXBsYXlUaW1lb3V0VmFsdWVzLmFkZChyYXcpO1xuICBydW50aW1lTG9nZ2VyLndhcm4obWVzc2FnZSwgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHJlcGxheS10aW1lb3V0IGJ1ZGdldCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzcy5cbiAqXG4gKiBSZWFkcyBgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVNgIGxhemlseSBzbyB0ZXN0cyBhbmRcbiAqIGRlcGxveW1lbnRzIGNhbiBvdmVycmlkZSBwZXIgaW52b2NhdGlvbi4gSW52YWxpZCAvIG91dC1vZi1yYW5nZSB2YWx1ZXNcbiAqIGZhbGwgYmFjayB0byBhIHNhZmUgdmFsdWUgKG5vIHRocm93IOKAlCB0aGUgZW52IHZhciBpcyBhbiBlc2NhcGUgaGF0Y2gsXG4gKiBub3QgYSBoYXJkIHJlcXVpcmVtZW50KSBhbmQgZW1pdCBhIG9uZS10aW1lIHdhcm5pbmcgc28gbWlzY29uZmlndXJhdGlvblxuICogaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlcGxheVRpbWVvdXRNcygpOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUztcbiAgaWYgKCFyYXcpIHJldHVybiBSRVBMQVlfVElNRU9VVF9NUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgfHwgcGFyc2VkIDw9IDApIHtcbiAgICB3YXJuT25jZShcbiAgICAgIHJhdyxcbiAgICAgICdJZ25vcmluZyBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUzogbm90IGEgcG9zaXRpdmUgZmluaXRlIG51bWJlcjsgdXNpbmcgZGVmYXVsdCcsXG4gICAgICB7IHJhdywgZGVmYXVsdE1zOiBSRVBMQVlfVElNRU9VVF9NUyB9XG4gICAgKTtcbiAgICByZXR1cm4gUkVQTEFZX1RJTUVPVVRfTVM7XG4gIH1cbiAgaWYgKHBhcnNlZCA8IE1JTl9SRVBMQVlfVElNRU9VVF9NUykge1xuICAgIHdhcm5PbmNlKHJhdywgJ1dPUktGTE9XX1JFUExBWV9USU1FT1VUX01TIGJlbG93IG1pbmltdW07IGNsYW1wZWQnLCB7XG4gICAgICByYXcsXG4gICAgICBjbGFtcGVkTXM6IE1JTl9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICAgIG1pbk1zOiBNSU5fUkVQTEFZX1RJTUVPVVRfTVMsXG4gICAgfSk7XG4gICAgcmV0dXJuIE1JTl9SRVBMQVlfVElNRU9VVF9NUztcbiAgfVxuICBpZiAocGFyc2VkID4gTUFYX1JFUExBWV9USU1FT1VUX01TKSB7XG4gICAgd2Fybk9uY2UocmF3LCAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgYWJvdmUgbWF4aW11bTsgY2xhbXBlZCcsIHtcbiAgICAgIHJhdyxcbiAgICAgIGNsYW1wZWRNczogTUFYX1JFUExBWV9USU1FT1VUX01TLFxuICAgICAgbWF4TXM6IE1BWF9SRVBMQVlfVElNRU9VVF9NUyxcbiAgICB9KTtcbiAgICByZXR1cm4gTUFYX1JFUExBWV9USU1FT1VUX01TO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogUmVzZXQgdGhlIHdhcm4tb25jZSBjYWNoZS4gVGVzdC1vbmx5IOKAlCBleHBvcnRlZCBzbyB1bml0IHRlc3RzIGNhblxuICogZXhlcmNpc2UgdGhlIHdhcm4gcGF0aCByZXBlYXRlZGx5IHdpdGhvdXQgc2hhcmluZyBzdGF0ZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFJlcGxheVRpbWVvdXRXYXJuQ2FjaGVGb3JUZXN0cygpOiB2b2lkIHtcbiAgd2FybmVkUmVwbGF5VGltZW91dFZhbHVlcy5jbGVhcigpO1xufVxuXG4vLyBOdW1iZXIgb2YgcXVldWUgZGVsaXZlcnkgYXR0ZW1wdHMgdG8gYWxsb3cgYmVmb3JlIHBlcm1hbmVudGx5IGZhaWxpbmcgYSBydW5cbi8vIGR1ZSB0byBhIHJlcGxheSB0aW1lb3V0LiBPbiBhdHRlbXB0cyAxIHRocm91Z2ggdGhpcyB2YWx1ZSwgdGhlIHRpbWVvdXRcbi8vIGhhbmRsZXIgZXhpdHMgd2l0aG91dCB3cml0aW5nIHJ1bl9mYWlsZWQgc28gdGhlIHF1ZXVlIHJldHJpZXMgdGhlIG1lc3NhZ2UuXG4vLyBPbiB0aGUgbmV4dCBhdHRlbXB0IHRoZSBydW4gaXMgbWFya2VkIGFzIGZhaWxlZC5cbmV4cG9ydCBjb25zdCBSRVBMQVlfVElNRU9VVF9NQVhfUkVUUklFUyA9IDM7XG5cbi8qKlxuICogRWZmZWN0aXZlIHJlcGxheS10aW1lb3V0IHJldHJ5IGJ1ZGdldC4gT3ZlcnJpZGUgdmlhXG4gKiBgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5VGltZW91dE1heFJldHJpZXMoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTUFYX1JFVFJJRVMnLFxuICAgIFJFUExBWV9USU1FT1VUX01BWF9SRVRSSUVTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBzdGVwcyB0aGUgb3duZWQtaW5saW5lIHBhdGggcnVucyBpbmxpbmUgKGluXG4gKiBwYXJhbGxlbCkgcGVyIHN1c3BlbnNpb24uIFRoZSByZXN0IGFyZSBxdWV1ZWQgdG8gYmFja2dyb3VuZCBoYW5kbGVycy4gRWFjaFxuICogaW5saW5lIHN0ZXAgaXMgY3JlYXRlZCBsYXppbHkg4oCUIGl0cyBgc3RlcF9jcmVhdGVkYCBpcyBmb2xkZWQgaW50byB0aGVcbiAqIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgYGV4ZWN1dGVTdGVwYCBzZW5kcyDigJQgc28gaW5saW5pbmcgTiBzdGVwcyBzYXZlcyBOIHF1ZXVlXG4gKiByb3VuZC10cmlwcyBmb3IgYSBgUHJvbWlzZS5hbGxgLXN0eWxlIGZhbi1vdXQuIGAxYCByZXByb2R1Y2VzIHRoZVxuICogc2luZ2xlLWlubGluZS1zdGVwIGJlaGF2aW9yIGV4YWN0bHkgKHVzZWZ1bCBraWxsLXN3aXRjaCkuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCAoY2xhbXBlZCB0b1xuICogYE1JTl9NQVhfSU5MSU5FX1NURVBTYC4uYE1BWF9NQVhfSU5MSU5FX1NURVBTYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfSU5MSU5FX1NURVBTID0gMztcblxuLyoqIExvd2VyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZSAoMSA9IHNpbmdsZSBpbmxpbmUgc3RlcCkuICovXG5leHBvcnQgY29uc3QgTUlOX01BWF9JTkxJTkVfU1RFUFMgPSAxO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgaW5saW5lLXN0ZXBzIGVudiBvdmVycmlkZS4gSW5saW5lIGJvZGllcyBydW4gaW4gcGFyYWxsZWxcbiAqIHdpdGhpbiBvbmUgZnVuY3Rpb24gaW52b2NhdGlvbiwgc28gdGhpcyBjYXBzIG1lbW9yeS9DUFUgZmFuLW91dCBwZXIgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9NQVhfSU5MSU5FX1NURVBTID0gMTY7XG5cbi8vIFdhcm4tb25jZSBjYWNoZSBmb3IgV09SS0ZMT1dfTUFYX0lOTElORV9TVEVQUywga2V5ZWQgYnkgcmF3IGVudiB2YWx1ZS5cbmNvbnN0IHdhcm5lZE1heElubGluZVN0ZXBzVmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIG1heCBudW1iZXIgb2YgaW5saW5lIHN0ZXBzIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTYCBsYXppbHkgc28gdGVzdHMgYW5kXG4gKiBkZXBsb3ltZW50cyBjYW4gb3ZlcnJpZGUgcGVyIGludm9jYXRpb24uIEludmFsaWQgLyBvdXQtb2YtcmFuZ2UgdmFsdWVzIGZhbGxcbiAqIGJhY2sgdG8gYSBzYWZlIHZhbHVlIChubyB0aHJvdyDigJQgdGhlIGVudiB2YXIgaXMgYW4gZXNjYXBlIGhhdGNoKSBhbmQgZW1pdCBhXG4gKiBvbmUtdGltZSB3YXJuaW5nIHNvIG1pc2NvbmZpZ3VyYXRpb24gaXMgb2JzZXJ2YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1heElubGluZVN0ZXBzKCk6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9JTkxJTkVfU1RFUFM7XG4gIGlmICghcmF3KSByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHJhdyk7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdJZ25vcmluZyBXT1JLRkxPV19NQVhfSU5MSU5FX1NURVBTOiBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyOyB1c2luZyBkZWZhdWx0JyxcbiAgICAgICAgeyByYXcsIGRlZmF1bHRWYWx1ZTogTUFYX0lOTElORV9TVEVQUyB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gTUFYX0lOTElORV9TVEVQUztcbiAgfVxuICBpZiAocGFyc2VkIDwgTUlOX01BWF9JTkxJTkVfU1RFUFMpIHJldHVybiBNSU5fTUFYX0lOTElORV9TVEVQUztcbiAgaWYgKHBhcnNlZCA+IE1BWF9NQVhfSU5MSU5FX1NURVBTKSB7XG4gICAgaWYgKCF3YXJuZWRNYXhJbmxpbmVTdGVwc1ZhbHVlcy5oYXMocmF3KSkge1xuICAgICAgd2FybmVkTWF4SW5saW5lU3RlcHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oJ1dPUktGTE9XX01BWF9JTkxJTkVfU1RFUFMgYWJvdmUgbWF4aW11bTsgY2xhbXBlZCcsIHtcbiAgICAgICAgcmF3LFxuICAgICAgICBjbGFtcGVkVmFsdWU6IE1BWF9NQVhfSU5MSU5FX1NURVBTLFxuICAgICAgICBtYXhWYWx1ZTogTUFYX01BWF9JTkxJTkVfU1RFUFMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIE1BWF9NQVhfSU5MSU5FX1NURVBTO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmNvbnN0IHdhcm5lZE1heEV2ZW50c1ZhbHVlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIE9wdGlvbmFsIGNsaWVudC1zaWRlIG92ZXJyaWRlIGZvciB0aGUgc2VydmVyLXN1cHBsaWVkIHBlci1ydW4gZXZlbnQgY2VpbGluZy5cbiAqIFdoZW4gc2V0IHRvIGEgcG9zaXRpdmUgaW50ZWdlciwgdGhlIHJ1bnRpbWUgY2xhbXBzIHRoZSBzZXJ2ZXIncyBsaW1pdCAqZG93bipcbiAqIHRvIHRoaXMgdmFsdWUgKG5ldmVyIHJhaXNlcyBpdCkgc28gZW5mb3JjZW1lbnQgY2FuIGJlIGV4ZXJjaXNlZCB3aXRob3V0IGFcbiAqIHNlcnZlci1zaWRlIGNoYW5nZS4gYHVuZGVmaW5lZGAgKHVuc2V0KSDih5IgdXNlIHRoZSBzZXJ2ZXIgdmFsdWUgYXMtaXMuXG4gKlxuICogUmVhZHMgYHByb2Nlc3MuZW52LldPUktGTE9XX01BWF9FVkVOVFNfT1ZFUlJJREVgIGxhemlseSBzbyB0ZXN0cyBhbmRcbiAqIGRlcGxveW1lbnRzIGNhbiBvdmVycmlkZSBwZXIgaW52b2NhdGlvbi4gSW52YWxpZCB2YWx1ZXMgZmFsbCBiYWNrIHRvIHVuc2V0XG4gKiAobm8gdGhyb3cg4oCUIHRoZSBlbnYgdmFyIGlzIGFuIGVzY2FwZSBoYXRjaCkgYW5kIGVtaXQgYSBvbmUtdGltZSB3YXJuaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF4RXZlbnRzT3ZlcnJpZGUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTUFYX0VWRU5UU19PVkVSUklERTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcihyYXcpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGFyc2VkKSB8fCBwYXJzZWQgPD0gMCkge1xuICAgIGlmICghd2FybmVkTWF4RXZlbnRzVmFsdWVzLmhhcyhyYXcpKSB7XG4gICAgICB3YXJuZWRNYXhFdmVudHNWYWx1ZXMuYWRkKHJhdyk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdJZ25vcmluZyBXT1JLRkxPV19NQVhfRVZFTlRTX09WRVJSSURFOiBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyOyB1c2luZyBzZXJ2ZXIgbGltaXQnLFxuICAgICAgICB7IHJhdyB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogV2hldGhlciBvcHRpbWlzdGljIGlubGluZSBzdGVwIHN0YXJ0IGlzIGVuYWJsZWQuIFdoZW4gb24sIHRoZSBvd25lZC1pbmxpbmVcbiAqIHBhdGggYmVnaW5zIHJ1bm5pbmcgYSBicmFuZC1uZXcgc3RlcCdzIGJvZHkgKmJlZm9yZSogaXRzIGxhenkgYHN0ZXBfc3RhcnRlZGBcbiAqIG5ldHdvcmsgY2FsbCByZXNvbHZlcyAodGhlIGlucHV0IGlzIGFscmVhZHkga25vd24gbG9jYWxseSksIGF3YWl0aW5nIHRoZVxuICogYHN0ZXBfc3RhcnRlZGAgb25seSBiZWZvcmUgdGhlIHRlcm1pbmFsIHdyaXRlLlxuICpcbiAqIFRoaXMgY2FuIHJ1biBhIHN0ZXAgYm9keSBtb3JlIHRoYW4gb25jZSB3aGVuIGhhbmRsZXJzIHJhY2UgZm9yIHRoZSBzYW1lXG4gKiBzdGVwJ3MgY3JlYXRlLWNsYWltIOKAlCBib3RoIHJ1biB0aGUgYm9keSBiZWZvcmUgb25lIHdpbnMuIFRoYXQgaXMgdW5zYWZlIGZvclxuICogc3RlcHMgd2l0aCBub24taWRlbXBvdGVudCBzaWRlIGVmZmVjdHM7IGluIHBhcnRpY3VsYXIsIHR3byBjb25jdXJyZW50IHJ1bnNcbiAqIG9mIGEgc3RlcCB0aGF0IHdyaXRlcyB0byB0aGUgd29ya2Zsb3cgc3RyZWFtIChlLmcuIGFuIEFJIGFnZW50IHN0cmVhbWluZ1xuICogdG9rZW5zKSBjYW4gaW50ZXJsZWF2ZSBhbmQgY29ycnVwdCB0aGUgc3RyZWFtIGRhdGEuIFNvIHRoZSBvcHRpbWl6YXRpb24gaXNcbiAqICoqb2ZmIGJ5IGRlZmF1bHQqKiBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IG9wdGVkIGludG8gcGVyIGRlcGxveW1lbnQuXG4gKlxuICogUmVhZHMgYHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUYCBsYXppbHkuIERlZmF1bHQgT0ZGO1xuICogZW5hYmxlZCBvbmx5IGJ5IGFuIGV4cGxpY2l0IGAnMSdgIC8gYCd0cnVlJ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGltaXN0aWNJbmxpbmVTdGFydEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX09QVElNSVNUSUNfSU5MSU5FX1NUQVJUO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmF3ID09PSAnMScgfHwgcmF3LnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIG9wZXJhdG9yIGhhcyAqKmV4cGxpY2l0bHkgZGlzYWJsZWQqKiBvcHRpbWlzdGljIGlubGluZSBzdGFydCB2aWFcbiAqIGBXT1JLRkxPV19PUFRJTUlTVElDX0lOTElORV9TVEFSVD0wYCAvIGA9ZmFsc2VgLiBEaXN0aW5jdCBmcm9tIFwidW5zZXRcIjogdW5zZXRcbiAqIGxlYXZlcyB0aGUgb3B0aW1pemF0aW9uIG9mZiBieSBkZWZhdWx0IGJ1dCBsZXRzIHR1cmJvIGZvcmNlIGl0IG9uOyBhbiBleHBsaWNpdFxuICogYDBgL2BmYWxzZWAgaXMgYW4gb3BlcmF0b3Igb3B0LW91dCB0aGF0IHR1cmJvIG11c3QgaG9ub3IgKHR1cmJvJ3MgZm9yY2VkXG4gKiBvcHRpbWlzdGljIHN0YXJ0IHN0aWxsIHJ1bnMgYSBzdGVwIGJvZHkgYmVmb3JlIGBzdGVwX3N0YXJ0ZWRgL2BydW5fc3RhcnRlZGAgaXNcbiAqIGNvbmZpcm1lZCwgdGhlIHByb3BlcnR5IHN1Y2ggYW4gb3BlcmF0b3IgaXMgb3B0aW5nIG91dCBvZiksIHNvXG4gKiBgZm9yY2VPcHRpbWlzdGljU3RhcnRgIGRlZmVycyB0byB0aGlzLiBSZWFkcyB0aGUgZW52IHZhciBsYXppbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09wdGltaXN0aWNJbmxpbmVTdGFydEV4cGxpY2l0bHlEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlQ7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiByYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIFwidHVyYm8gbW9kZVwiIGlzIGVuYWJsZWQuIFR1cmJvIG1vZGUgZmFzdC1wYXRocyB0aGUgKmZpcnN0IGRlbGl2ZXJ5IG9mXG4gKiB0aGUgZmlyc3QgaW52b2NhdGlvbiogb2YgYSBydW4gKGRldGVjdGVkIGJ5IHRoZSBlbnRyeXBvaW50IHZpYSBgcnVuSW5wdXRgXG4gKiBwcmVzZW5jZSArIGBtZXRhZGF0YS5hdHRlbXB0ID09PSAxYCk6IGl0IGJhY2tncm91bmRzIHRoZSBgcnVuX3N0YXJ0ZWRgIGV2ZW50XG4gKiBjcmVhdGlvbiwgc2tpcHMgdGhlIGluaXRpYWwgZXZlbnQtbG9nIGxvYWQgKG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB5ZXQpLFxuICogYW5kIGZvcmNlcyBvcHRpbWlzdGljIGlubGluZSBzdGVwIHN0YXJ0IGZvciB0aGF0IGludm9jYXRpb24g4oCUIGluZGVwZW5kZW50IG9mXG4gKiBgV09SS0ZMT1dfT1BUSU1JU1RJQ19JTkxJTkVfU1RBUlRgLlxuICpcbiAqIEZvcmNpbmcgb3B0aW1pc3RpYyBzdGFydCBpcyBzYWZlIGhlcmUgYmVjYXVzZSB0aGUgZmlyc3QgZGVsaXZlcnkgaGFzIG5vXG4gKiBjb25jdXJyZW50IHBlZXIgaGFuZGxlciB0byByYWNlIHRoZSBzdGVwIGNyZWF0ZS1jbGFpbSwgc28gYSBzdGVwIGJvZHkgcnVuc1xuICogZXhhY3RseSBvbmNlLiBUaGF0IHNpbmdsZS1oYW5kbGVyIGd1YXJhbnRlZSBlbmRzIGFzIHNvb24gYXMgdGhlIHJ1biBjcmVhdGVzIGFcbiAqIGhvb2sgb3Igd2FpdCAod2hpY2ggaW50cm9kdWNlIHJlc3VtZS9wYXJhbGxlbCBpbnZvY2F0aW9ucyksIHNvIHRoZSBydW50aW1lXG4gKiBleGl0cyB0dXJibyBhdCB0aGF0IHBvaW50LlxuICpcbiAqIFJlYWRzIGBwcm9jZXNzLmVudi5XT1JLRkxPV19UVVJCT2AgbGF6aWx5LiBEZWZhdWx0ICoqT04qKjsgZGlzYWJsZWQgb25seSBieSBhblxuICogZXhwbGljaXQgYCcwJ2AgLyBgJ2ZhbHNlJ2AgKGNhc2UtaW5zZW5zaXRpdmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUdXJib0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52LldPUktGTE9XX1RVUkJPO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhKHJhdyA9PT0gJzAnIHx8IHJhdy50b0xvd2VyQ2FzZSgpID09PSAnZmFsc2UnKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGlubGluZSBzdGVwIG93bmVyc2hpcCBpcyBlbmFibGVkIChkZWZhdWx0IE9OKS4gV2hlbiBvbiwgdGhlIGxhenlcbiAqIGBzdGVwX3N0YXJ0ZWRgIHRoYXQgY3JlYXRlcyBhbiBpbmxpbmUgc3RlcCByZWNvcmRzIHRoZSBvd25pbmcgcXVldWVcbiAqIG1lc3NhZ2UgSUQsIGFuZCB3YWtlIHJlcGxheXMgdGhhdCBvYnNlcnZlIGFuIGFjdGl2ZWx5LW93bmVkIHN0ZXAgZW5xdWV1ZSBhXG4gKiAqZGVsYXllZCBiYWNrc3RvcCogbWVzc2FnZSBpbnN0ZWFkIG9mIGltbWVkaWF0ZWx5IHJlcXVldWVpbmcgaXQg4oCUIGZpeGluZ1xuICogZHVwbGljYXRlIGlubGluZSBzdGVwIGV4ZWN1dGlvbiB3aGVuIGEgaG9vay93YWl0IHdha2VzIGEgcnVuIG1pZC1zdGVwXG4gKiAodmVyY2VsL3dvcmtmbG93IzI3ODApLlxuICpcbiAqIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQPTBgIChvciBgZmFsc2VgKSBpcyB0aGUga2lsbCBzd2l0Y2g6IGRpc3BhdGNoXG4gKiByZXZlcnRzIHRvIHRoZSB1bmNvbmRpdGlvbmFsIGltbWVkaWF0ZSByZXF1ZXVlLiBTdGFtcGluZyBpcyB1bmFmZmVjdGVkIOKAlFxuICogdGhlIHJlY29yZGVkIG93bmVyTWVzc2FnZUlkIGlzIGluZXJ0IGRhdGEgd2hlbiB0aGUgc3dpdGNoIGlzIG9mZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIShyYXcgPT09ICcwJyB8fCByYXcudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpbmxpbmUtb3duZXJzaGlwIGxlYXNlLCBpbiBzZWNvbmRzOiBob3cgbG9uZyBhZnRlciBhIHN0ZXAncyBsYXRlc3RcbiAqIChzdGFtcGVkKSBgc3RlcF9zdGFydGVkYCBhIG5vbi1vd25lciBpbnZvY2F0aW9uIGFzc3VtZXMgdGhlIG93bmluZ1xuICogaW52b2NhdGlvbiBtYXkgc3RpbGwgYmUgYWxpdmUuIFdpdGhpbiB0aGUgbGVhc2UsIHdha2UgcmVwbGF5cyBlbnF1ZXVlIHRoZVxuICogc3RlcCdzIGJhY2tzdG9wIG1lc3NhZ2Ugd2l0aCBgZGVsYXlTZWNvbmRzID0gbGVhc2UgcmVtYWluaW5nYCBpbnN0ZWFkIG9mXG4gKiBpbW1lZGlhdGVseTsgcGFzdCBpdCwgdGhleSBlbnF1ZXVlIGltbWVkaWF0ZWx5ICh0b2RheSdzIGJlaGF2aW9yKS5cbiAqXG4gKiBXaHkgYSBmaXhlZCA4NjAgYW5kIG5vdCBhIHZhbHVlIGRlcml2ZWQgZnJvbSB0aGUgZnVuY3Rpb24ncyBgbWF4RHVyYXRpb25gOlxuICogbmVpdGhlciBydW50aW1lIG5vciBidWlsZCB0aW1lIGNhbiBzZWUgdGhlIHJlc29sdmVkIHZhbHVlIOKAlCBidWlsZGVycyBlbWl0XG4gKiBgbWF4RHVyYXRpb246ICdtYXgnYCwgd2hpY2ggdGhlIHBsYXRmb3JtIHJlc29sdmVzIHBlci1wbGFuIGF0IGRlcGxveSwgYW5kXG4gKiBubyBlbnYgdmFyIG9yIHJlcXVlc3QtY29udGV4dCBkZWFkbGluZSBBUEkgZXhwb3NlcyB0aGUgcmVzdWx0LiBUaGUgYm91bmRcbiAqIGNvbWVzIGZyb20gYSBwbGF0Zm9ybSBydWxlIGluc3RlYWQ6IGR1cmF0aW9ucyBhYm92ZSA4MDBzIHJlcXVpcmUgZXhwbGljaXRcbiAqIHBlci1mdW5jdGlvbiBudW1lcmljIGNvbmZpZywgc28gYSBidWlsZGVyLWVtaXR0ZWQgYCdtYXgnYCByZXNvbHZlcyB0byBhdFxuICogbW9zdCA4MDBzIOKAlCA4NjBzIHRoZXJlZm9yZSBkb21pbmF0ZXMgYW55IHdvcmtmbG93IHJvdXRlJ3MgaW52b2NhdGlvblxuICogbGlmZXRpbWUgcGx1cyBzY2hlZHVsaW5nIHNsYWNrLiBSZXZpc2l0IHdoZW4gdGhhdCBjZWlsaW5nIG1vdmVzICh0aGVcbiAqIDMwLW1pbnV0ZSBkdXJhdGlvbiBiZXRhIGJlY29taW5nIHJlYWNoYWJsZSB2aWEgYCdtYXgnYCB3b3VsZCBpbnZhbGlkYXRlXG4gKiB0aGUgYm91bmQpLiBXb3JsZHMgd2l0aG91dCBhbiBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsLFxuICogc2VsZi1ob3N0ZWQpIGdldCBubyBkZWF0aCBwcm9vZiBmcm9tIGFueSBjb25zdGFudCDigJQgdGhlcmUgdGhlIGluLXByb2Nlc3NcbiAqIHNpbmdsZS1mbGlnaHQgbGF5ZXIgKHN0ZXAtc2luZ2xlLWZsaWdodC50cykgaXMgd2hhdCBtYWtlcyBhIGJhY2tzdG9wXG4gKiBmaXJpbmcgbWlkLXN0ZXAgaGFybWxlc3MuXG4gKlxuICogODYwIGFsc28gc3RheXMgdW5kZXIgdGhlIHF1ZXVlJ3MgOTAwcyBtYXhpbXVtIGRlbGF5IChTUVMgY2FwKSwgc28gYVxuICogYmFja3N0b3AncyBmdWxsIGxlYXNlIHJlbWFpbmRlciBhbHdheXMgZml0cyBpbiBhIHNpbmdsZSBkZWxheWVkIG1lc3NhZ2UuXG4gKlxuICogT3ZlcnJpZGUgdmlhIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFNgIChjbGFtcGVkIHRvXG4gKiAxLi5gTUFYX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2ApLlxuICovXG5leHBvcnQgY29uc3QgSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTID0gODYwO1xuXG4vKipcbiAqIFVwcGVyIGJvdW5kIGZvciB0aGUgbGVhc2UgZW52IG92ZXJyaWRlLiA5MDBzIGlzIHRoZSBxdWV1ZSdzIG1heGltdW1cbiAqIHBlci1tZXNzYWdlIGRlbGF5IChTUVMgY2FwKSDigJQgYSBsb25nZXIgbGVhc2Ugd291bGQgbmVlZCBkZWxheSBjaGFpbmluZ1xuICogbGlrZSBsb25nIHdhaXRzIHVzZTsgY2xhbXAgaW5zdGVhZCBzbyBvbmUgZGVsYXllZCBtZXNzYWdlIGFsd2F5cyBzdWZmaWNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMgPSA5MDA7XG5cbi8qKlxuICogRWZmZWN0aXZlIGlubGluZS1vd25lcnNoaXAgbGVhc2UuIE92ZXJyaWRlIHZpYVxuICogYFdPUktGTE9XX0lOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EU2Ag4oCUIGUuZy4gcmFpc2UgaXQgb24gc2VsZi1ob3N0ZWRcbiAqIG11bHRpLWluc3RhbmNlIHdvcmxkcyB3aXRoIGxvbmctcnVubmluZyBzdGVwcyB0byB3aWRlbiB0aGUgd2luZG93IGluIHdoaWNoXG4gKiBhIGxpdmUgb3duZXIgaXMgcHJvdGVjdGVkIGZyb20gYSBjb25jdXJyZW50IGJhY2tzdG9wIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElubGluZU93bmVyc2hpcExlYXNlU2Vjb25kcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFMnLFxuICAgIElOTElORV9PV05FUlNISVBfTEVBU0VfU0VDT05EUyxcbiAgICB7IGludGVnZXI6IHRydWUsIG1pbjogMSwgbWF4OiBNQVhfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTIH1cbiAgKTtcbn1cblxuLy8gQSByZXBsYXktY29uc3VtZXIgbWlzbWF0Y2ggY2FuIGJlIGNhdXNlZCBieSBhIHRyYW5zaWVudCBkaXZlcmdlbnQgcmVwbGF5XG4vLyByYXRoZXIgdGhhbiBhbiBpbnZhbGlkIHBlcnNpc3RlZCBoaXN0b3J5LiBRdWV1ZSBib3VuZGVkIHJlY292ZXJ5IHJlcGxheXNcbi8vIGJlZm9yZSByZWNvcmRpbmcgdGVybWluYWwgY29ycnVwdGlvbiBmb3IgYSBydW4gdGhhdCBjYW5ub3QgcmVwbGF5LlxuZXhwb3J0IGNvbnN0IFJFUExBWV9ESVZFUkdFTkNFX01BWF9SRVRSSUVTID0gMztcblxuLyoqXG4gKiBFZmZlY3RpdmUgcmVwbGF5LWRpdmVyZ2VuY2UgcmVjb3ZlcnkgYnVkZ2V0LiBPdmVycmlkZSB2aWFcbiAqIGBXT1JLRkxPV19SRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFU2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBsYXlEaXZlcmdlbmNlTWF4UmV0cmllcygpOiBudW1iZXIge1xuICByZXR1cm4gZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19SRVBMQVlfRElWRVJHRU5DRV9NQVhfUkVUUklFUycsXG4gICAgUkVQTEFZX0RJVkVSR0VOQ0VfTUFYX1JFVFJJRVMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlIH1cbiAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,52 @@
1
+ import type { Event } from '@workflow/world';
2
+ /**
3
+ * Scope for {@link countStepStartedEvents}:
4
+ * - `{ type: 'ownedBy', messageId }` counts only starts whose
5
+ * `eventData.ownerMessageId` matches — i.e. attempts performed by that
6
+ * owning queue message (inline lazy starts and owned-recovery re-stamps).
7
+ * - `{ type: 'totalAttempts' }` estimates the step's genuine attempt total
8
+ * across its whole lifecycle: unstamped (bare) starts — which only real
9
+ * queue-dispatched background deliveries write — plus the starts of the
10
+ * single most-started owner. A genuine lifecycle has at most one inline
11
+ * owner phase (ownership is claimed atomically at step creation and
12
+ * lapses permanently at `step_retrying` or on any bare start), so taking
13
+ * the max over owners counts that phase's real attempts while invocations
14
+ * racing on the same batch — which stamp their own one-off message IDs —
15
+ * contribute at most their single largest count instead of accumulating.
16
+ */
17
+ export type StepStartScope = {
18
+ type: 'ownedBy';
19
+ messageId: string;
20
+ } | {
21
+ type: 'totalAttempts';
22
+ };
23
+ /**
24
+ * Number of `step_started` events already recorded for a step, used as the
25
+ * authoritative attempt count for the maxRetries ceiling (the only bound for
26
+ * steps that time out without writing a `step_failed`).
27
+ *
28
+ * IMPORTANT: the raw (unscoped) count is NOT a reliable attempt number.
29
+ * Concurrent invocations racing on the same pending batch (stale replays,
30
+ * wake replays, a step message dispatched by a replay that lost the
31
+ * create-claim race, ...) can each write a `step_started` for the same
32
+ * logical attempt — worlds without an atomic start guard (world-local) let
33
+ * all of them through. Counting those duplicates as "attempts" made the
34
+ * maxRetries ceiling fire on healthy runs and fail them with a false
35
+ * "exceeded max retries" (see workflow#3069).
36
+ *
37
+ * Callers therefore scope the count to the starts their ceiling is actually
38
+ * about via `scope`:
39
+ * - the inline owned-recovery ceiling counts only THIS message's starts
40
+ * (`ownedBy`) — each real (re)delivery of the owning message stamps its
41
+ * `ownerMessageId` on the start it writes, while racing invocations stamp
42
+ * their own IDs (or none), so they no longer inflate the count;
43
+ * - the background-step ceiling counts the lifecycle attempt total
44
+ * (`totalAttempts`: bare starts plus the largest single owner's starts) —
45
+ * so a step that exhausted part of its budget under inline ownership
46
+ * before transitioning to queued/bare retries still trips the combined
47
+ * ceiling, while racers' one-off stamped duplicates don't accumulate, and
48
+ * throttle/too-early redeliveries (which write no start at all) stay
49
+ * excluded as before.
50
+ */
51
+ export declare function countStepStartedEvents(events: Event[] | null | undefined, stepId: string, scope?: StepStartScope): number;
52
+ //# sourceMappingURL=count-step-started-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count-step-started-events.d.ts","sourceRoot":"","sources":["../../src/runtime/count-step-started-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC;AAU9B;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,cAAc,GACrB,MAAM,CAmCR"}
@@ -0,0 +1,72 @@
1
+ const ownerOf = (e) => 'eventData' in e &&
2
+ e.eventData &&
3
+ 'ownerMessageId' in e.eventData &&
4
+ typeof e.eventData.ownerMessageId === 'string'
5
+ ? e.eventData.ownerMessageId
6
+ : undefined;
7
+ /**
8
+ * Number of `step_started` events already recorded for a step, used as the
9
+ * authoritative attempt count for the maxRetries ceiling (the only bound for
10
+ * steps that time out without writing a `step_failed`).
11
+ *
12
+ * IMPORTANT: the raw (unscoped) count is NOT a reliable attempt number.
13
+ * Concurrent invocations racing on the same pending batch (stale replays,
14
+ * wake replays, a step message dispatched by a replay that lost the
15
+ * create-claim race, ...) can each write a `step_started` for the same
16
+ * logical attempt — worlds without an atomic start guard (world-local) let
17
+ * all of them through. Counting those duplicates as "attempts" made the
18
+ * maxRetries ceiling fire on healthy runs and fail them with a false
19
+ * "exceeded max retries" (see workflow#3069).
20
+ *
21
+ * Callers therefore scope the count to the starts their ceiling is actually
22
+ * about via `scope`:
23
+ * - the inline owned-recovery ceiling counts only THIS message's starts
24
+ * (`ownedBy`) — each real (re)delivery of the owning message stamps its
25
+ * `ownerMessageId` on the start it writes, while racing invocations stamp
26
+ * their own IDs (or none), so they no longer inflate the count;
27
+ * - the background-step ceiling counts the lifecycle attempt total
28
+ * (`totalAttempts`: bare starts plus the largest single owner's starts) —
29
+ * so a step that exhausted part of its budget under inline ownership
30
+ * before transitioning to queued/bare retries still trips the combined
31
+ * ceiling, while racers' one-off stamped duplicates don't accumulate, and
32
+ * throttle/too-early redeliveries (which write no start at all) stay
33
+ * excluded as before.
34
+ */
35
+ export function countStepStartedEvents(events, stepId, scope) {
36
+ if (!events) {
37
+ return 0;
38
+ }
39
+ let bare = 0;
40
+ const byOwner = new Map();
41
+ for (const e of events) {
42
+ if (e.eventType !== 'step_started' || e.correlationId !== stepId) {
43
+ continue;
44
+ }
45
+ const owner = ownerOf(e);
46
+ if (owner === undefined) {
47
+ bare++;
48
+ }
49
+ else {
50
+ byOwner.set(owner, (byOwner.get(owner) ?? 0) + 1);
51
+ }
52
+ }
53
+ if (scope === undefined) {
54
+ let total = bare;
55
+ for (const count of byOwner.values()) {
56
+ total += count;
57
+ }
58
+ return total;
59
+ }
60
+ if (scope.type === 'ownedBy') {
61
+ return byOwner.get(scope.messageId) ?? 0;
62
+ }
63
+ // totalAttempts
64
+ let maxOwner = 0;
65
+ for (const count of byOwner.values()) {
66
+ if (count > maxOwner) {
67
+ maxOwner = count;
68
+ }
69
+ }
70
+ return bare + maxOwner;
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnQtc3RlcC1zdGFydGVkLWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvdW50LXN0ZXAtc3RhcnRlZC1ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUJBLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBUSxFQUFzQixFQUFFLENBQy9DLFdBQVcsSUFBSSxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxTQUFTO0lBQ1gsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLFNBQVM7SUFDL0IsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsS0FBSyxRQUFRO0lBQzVDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWM7SUFDNUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUVoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUFrQyxFQUNsQyxNQUFjLEVBQ2QsS0FBc0I7SUFFdEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDMUMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssY0FBYyxJQUFJLENBQUMsQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDakUsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLEtBQUssSUFBSSxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsZ0JBQWdCO0lBQ2hCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksS0FBSyxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksR0FBRyxRQUFRLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIFNjb3BlIGZvciB7QGxpbmsgY291bnRTdGVwU3RhcnRlZEV2ZW50c306XG4gKiAtIGB7IHR5cGU6ICdvd25lZEJ5JywgbWVzc2FnZUlkIH1gIGNvdW50cyBvbmx5IHN0YXJ0cyB3aG9zZVxuICogICBgZXZlbnREYXRhLm93bmVyTWVzc2FnZUlkYCBtYXRjaGVzIOKAlCBpLmUuIGF0dGVtcHRzIHBlcmZvcm1lZCBieSB0aGF0XG4gKiAgIG93bmluZyBxdWV1ZSBtZXNzYWdlIChpbmxpbmUgbGF6eSBzdGFydHMgYW5kIG93bmVkLXJlY292ZXJ5IHJlLXN0YW1wcykuXG4gKiAtIGB7IHR5cGU6ICd0b3RhbEF0dGVtcHRzJyB9YCBlc3RpbWF0ZXMgdGhlIHN0ZXAncyBnZW51aW5lIGF0dGVtcHQgdG90YWxcbiAqICAgYWNyb3NzIGl0cyB3aG9sZSBsaWZlY3ljbGU6IHVuc3RhbXBlZCAoYmFyZSkgc3RhcnRzIOKAlCB3aGljaCBvbmx5IHJlYWxcbiAqICAgcXVldWUtZGlzcGF0Y2hlZCBiYWNrZ3JvdW5kIGRlbGl2ZXJpZXMgd3JpdGUg4oCUIHBsdXMgdGhlIHN0YXJ0cyBvZiB0aGVcbiAqICAgc2luZ2xlIG1vc3Qtc3RhcnRlZCBvd25lci4gQSBnZW51aW5lIGxpZmVjeWNsZSBoYXMgYXQgbW9zdCBvbmUgaW5saW5lXG4gKiAgIG93bmVyIHBoYXNlIChvd25lcnNoaXAgaXMgY2xhaW1lZCBhdG9taWNhbGx5IGF0IHN0ZXAgY3JlYXRpb24gYW5kXG4gKiAgIGxhcHNlcyBwZXJtYW5lbnRseSBhdCBgc3RlcF9yZXRyeWluZ2Agb3Igb24gYW55IGJhcmUgc3RhcnQpLCBzbyB0YWtpbmdcbiAqICAgdGhlIG1heCBvdmVyIG93bmVycyBjb3VudHMgdGhhdCBwaGFzZSdzIHJlYWwgYXR0ZW1wdHMgd2hpbGUgaW52b2NhdGlvbnNcbiAqICAgcmFjaW5nIG9uIHRoZSBzYW1lIGJhdGNoIOKAlCB3aGljaCBzdGFtcCB0aGVpciBvd24gb25lLW9mZiBtZXNzYWdlIElEcyDigJRcbiAqICAgY29udHJpYnV0ZSBhdCBtb3N0IHRoZWlyIHNpbmdsZSBsYXJnZXN0IGNvdW50IGluc3RlYWQgb2YgYWNjdW11bGF0aW5nLlxuICovXG5leHBvcnQgdHlwZSBTdGVwU3RhcnRTY29wZSA9XG4gIHwgeyB0eXBlOiAnb3duZWRCeSc7IG1lc3NhZ2VJZDogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICd0b3RhbEF0dGVtcHRzJyB9O1xuXG5jb25zdCBvd25lck9mID0gKGU6IEV2ZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gICdldmVudERhdGEnIGluIGUgJiZcbiAgZS5ldmVudERhdGEgJiZcbiAgJ293bmVyTWVzc2FnZUlkJyBpbiBlLmV2ZW50RGF0YSAmJlxuICB0eXBlb2YgZS5ldmVudERhdGEub3duZXJNZXNzYWdlSWQgPT09ICdzdHJpbmcnXG4gICAgPyBlLmV2ZW50RGF0YS5vd25lck1lc3NhZ2VJZFxuICAgIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIE51bWJlciBvZiBgc3RlcF9zdGFydGVkYCBldmVudHMgYWxyZWFkeSByZWNvcmRlZCBmb3IgYSBzdGVwLCB1c2VkIGFzIHRoZVxuICogYXV0aG9yaXRhdGl2ZSBhdHRlbXB0IGNvdW50IGZvciB0aGUgbWF4UmV0cmllcyBjZWlsaW5nICh0aGUgb25seSBib3VuZCBmb3JcbiAqIHN0ZXBzIHRoYXQgdGltZSBvdXQgd2l0aG91dCB3cml0aW5nIGEgYHN0ZXBfZmFpbGVkYCkuXG4gKlxuICogSU1QT1JUQU5UOiB0aGUgcmF3ICh1bnNjb3BlZCkgY291bnQgaXMgTk9UIGEgcmVsaWFibGUgYXR0ZW1wdCBudW1iZXIuXG4gKiBDb25jdXJyZW50IGludm9jYXRpb25zIHJhY2luZyBvbiB0aGUgc2FtZSBwZW5kaW5nIGJhdGNoIChzdGFsZSByZXBsYXlzLFxuICogd2FrZSByZXBsYXlzLCBhIHN0ZXAgbWVzc2FnZSBkaXNwYXRjaGVkIGJ5IGEgcmVwbGF5IHRoYXQgbG9zdCB0aGVcbiAqIGNyZWF0ZS1jbGFpbSByYWNlLCAuLi4pIGNhbiBlYWNoIHdyaXRlIGEgYHN0ZXBfc3RhcnRlZGAgZm9yIHRoZSBzYW1lXG4gKiBsb2dpY2FsIGF0dGVtcHQg4oCUIHdvcmxkcyB3aXRob3V0IGFuIGF0b21pYyBzdGFydCBndWFyZCAod29ybGQtbG9jYWwpIGxldFxuICogYWxsIG9mIHRoZW0gdGhyb3VnaC4gQ291bnRpbmcgdGhvc2UgZHVwbGljYXRlcyBhcyBcImF0dGVtcHRzXCIgbWFkZSB0aGVcbiAqIG1heFJldHJpZXMgY2VpbGluZyBmaXJlIG9uIGhlYWx0aHkgcnVucyBhbmQgZmFpbCB0aGVtIHdpdGggYSBmYWxzZVxuICogXCJleGNlZWRlZCBtYXggcmV0cmllc1wiIChzZWUgd29ya2Zsb3cjMzA2OSkuXG4gKlxuICogQ2FsbGVycyB0aGVyZWZvcmUgc2NvcGUgdGhlIGNvdW50IHRvIHRoZSBzdGFydHMgdGhlaXIgY2VpbGluZyBpcyBhY3R1YWxseVxuICogYWJvdXQgdmlhIGBzY29wZWA6XG4gKiAtIHRoZSBpbmxpbmUgb3duZWQtcmVjb3ZlcnkgY2VpbGluZyBjb3VudHMgb25seSBUSElTIG1lc3NhZ2UncyBzdGFydHNcbiAqICAgKGBvd25lZEJ5YCkg4oCUIGVhY2ggcmVhbCAocmUpZGVsaXZlcnkgb2YgdGhlIG93bmluZyBtZXNzYWdlIHN0YW1wcyBpdHNcbiAqICAgYG93bmVyTWVzc2FnZUlkYCBvbiB0aGUgc3RhcnQgaXQgd3JpdGVzLCB3aGlsZSByYWNpbmcgaW52b2NhdGlvbnMgc3RhbXBcbiAqICAgdGhlaXIgb3duIElEcyAob3Igbm9uZSksIHNvIHRoZXkgbm8gbG9uZ2VyIGluZmxhdGUgdGhlIGNvdW50O1xuICogLSB0aGUgYmFja2dyb3VuZC1zdGVwIGNlaWxpbmcgY291bnRzIHRoZSBsaWZlY3ljbGUgYXR0ZW1wdCB0b3RhbFxuICogICAoYHRvdGFsQXR0ZW1wdHNgOiBiYXJlIHN0YXJ0cyBwbHVzIHRoZSBsYXJnZXN0IHNpbmdsZSBvd25lcidzIHN0YXJ0cykg4oCUXG4gKiAgIHNvIGEgc3RlcCB0aGF0IGV4aGF1c3RlZCBwYXJ0IG9mIGl0cyBidWRnZXQgdW5kZXIgaW5saW5lIG93bmVyc2hpcFxuICogICBiZWZvcmUgdHJhbnNpdGlvbmluZyB0byBxdWV1ZWQvYmFyZSByZXRyaWVzIHN0aWxsIHRyaXBzIHRoZSBjb21iaW5lZFxuICogICBjZWlsaW5nLCB3aGlsZSByYWNlcnMnIG9uZS1vZmYgc3RhbXBlZCBkdXBsaWNhdGVzIGRvbid0IGFjY3VtdWxhdGUsIGFuZFxuICogICB0aHJvdHRsZS90b28tZWFybHkgcmVkZWxpdmVyaWVzICh3aGljaCB3cml0ZSBubyBzdGFydCBhdCBhbGwpIHN0YXlcbiAqICAgZXhjbHVkZWQgYXMgYmVmb3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnRTdGVwU3RhcnRlZEV2ZW50cyhcbiAgZXZlbnRzOiBFdmVudFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc3RlcElkOiBzdHJpbmcsXG4gIHNjb3BlPzogU3RlcFN0YXJ0U2NvcGVcbik6IG51bWJlciB7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgbGV0IGJhcmUgPSAwO1xuICBjb25zdCBieU93bmVyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmV2ZW50VHlwZSAhPT0gJ3N0ZXBfc3RhcnRlZCcgfHwgZS5jb3JyZWxhdGlvbklkICE9PSBzdGVwSWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBvd25lciA9IG93bmVyT2YoZSk7XG4gICAgaWYgKG93bmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJhcmUrKztcbiAgICB9IGVsc2Uge1xuICAgICAgYnlPd25lci5zZXQob3duZXIsIChieU93bmVyLmdldChvd25lcikgPz8gMCkgKyAxKTtcbiAgICB9XG4gIH1cbiAgaWYgKHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgdG90YWwgPSBiYXJlO1xuICAgIGZvciAoY29uc3QgY291bnQgb2YgYnlPd25lci52YWx1ZXMoKSkge1xuICAgICAgdG90YWwgKz0gY291bnQ7XG4gICAgfVxuICAgIHJldHVybiB0b3RhbDtcbiAgfVxuICBpZiAoc2NvcGUudHlwZSA9PT0gJ293bmVkQnknKSB7XG4gICAgcmV0dXJuIGJ5T3duZXIuZ2V0KHNjb3BlLm1lc3NhZ2VJZCkgPz8gMDtcbiAgfVxuICAvLyB0b3RhbEF0dGVtcHRzXG4gIGxldCBtYXhPd25lciA9IDA7XG4gIGZvciAoY29uc3QgY291bnQgb2YgYnlPd25lci52YWx1ZXMoKSkge1xuICAgIGlmIChjb3VudCA+IG1heE93bmVyKSB7XG4gICAgICBtYXhPd25lciA9IGNvdW50O1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmFyZSArIG1heE93bmVyO1xufVxuIl19
@@ -9,12 +9,12 @@
9
9
  import { createRequire } from 'node:module';
10
10
  import { pathToFileURL } from 'node:url';
11
11
  let _getPort;
12
- // Per-process cache of the resolved port. The workflow dev server listens on a
12
+ // Per-process cache of the resolved port. The workflow server listens on a
13
13
  // stable port for the lifetime of the process, but `getPort()` rediscovers it
14
14
  // on every call by querying the OS for the process's listening sockets — on
15
15
  // macOS that shells out to `lsof` (~60ms), which the runtime pays on EVERY
16
- // workflow replay (the non-Vercel branch of `runWorkflow`). Since the port does
17
- // not change within a process, resolve it once and reuse it. `_inFlight`
16
+ // workflow replay or step invocation. Since the port does not change within a
17
+ // process, resolve it once and reuse it. `_inFlight`
18
18
  // dedupes concurrent first calls so discovery never runs more than once.
19
19
  //
20
20
  // The first concrete port is pinned for the lifetime of the process — there is
@@ -89,4 +89,4 @@ export function setPortResolverForTesting(fn) {
89
89
  _cachedPort = undefined;
90
90
  _inFlight = undefined;
91
91
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXBvcnQtbGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2dldC1wb3J0LWxhenkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV6QyxJQUFJLFFBQXlELENBQUM7QUFFOUQsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLGdGQUFnRjtBQUNoRix5RUFBeUU7QUFDekUseUVBQXlFO0FBQ3pFLEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsVUFBVTtBQUNWLElBQUksV0FBK0IsQ0FBQztBQUNwQyxJQUFJLFNBQWtELENBQUM7QUFFdkQsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXO0lBQy9CLGdFQUFnRTtJQUNoRSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsMkVBQTJFO0lBQzNFLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsb0VBQW9FO1lBQ3BFLE1BQU0sSUFBSSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELG1FQUFtRTtZQUNuRSw0REFBNEQ7WUFDNUQsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUM1QixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDcEQsQ0FBQztZQUNGLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUN6QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsOERBQThEO1lBQzlELFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxrREFBa0Q7SUFDbEQsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRCxTQUFTLEdBQUcsUUFBUSxFQUFFO1NBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2IsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSx1REFBdUQ7UUFDdkQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDWixTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUNyQixXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQ3hCLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxFQUFxQztJQUVyQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExhenkgbG9hZGVyIGZvciBnZXRQb3J0IHRoYXQgcHJldmVudHMgYnVuZGxlcnMgKFR1cmJvcGFjaywgZXNidWlsZClcbiAqIGZyb20gc3RhdGljYWxseSB0cmFjaW5nIEB3b3JrZmxvdy91dGlscy9nZXQtcG9ydCBhbmQgaXRzIGZpbGVzeXN0ZW1cbiAqIG9wZXJhdGlvbnMgKHJlYWRkaXIsIHJlYWRGaWxlLCByZWFkbGluaykgaW50byB0aGUgZmxvdyByb3V0ZSBidW5kbGUuXG4gKlxuICogVXNlcyBjcmVhdGVSZXF1aXJlIHdpdGggYSBkeW5hbWljYWxseSBjb25zdHJ1Y3RlZCBzcGVjaWZpZXIgc28gdGhlXG4gKiBkZXBlbmRlbmN5IGlzIGludmlzaWJsZSB0byBidW5kbGVyIHN0YXRpYyBhbmFseXNpcy5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcblxubGV0IF9nZXRQb3J0OiAoKCkgPT4gUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+KSB8IHVuZGVmaW5lZDtcblxuLy8gUGVyLXByb2Nlc3MgY2FjaGUgb2YgdGhlIHJlc29sdmVkIHBvcnQuIFRoZSB3b3JrZmxvdyBkZXYgc2VydmVyIGxpc3RlbnMgb24gYVxuLy8gc3RhYmxlIHBvcnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvY2VzcywgYnV0IGBnZXRQb3J0KClgIHJlZGlzY292ZXJzIGl0XG4vLyBvbiBldmVyeSBjYWxsIGJ5IHF1ZXJ5aW5nIHRoZSBPUyBmb3IgdGhlIHByb2Nlc3MncyBsaXN0ZW5pbmcgc29ja2V0cyDigJQgb25cbi8vIG1hY09TIHRoYXQgc2hlbGxzIG91dCB0byBgbHNvZmAgKH42MG1zKSwgd2hpY2ggdGhlIHJ1bnRpbWUgcGF5cyBvbiBFVkVSWVxuLy8gd29ya2Zsb3cgcmVwbGF5ICh0aGUgbm9uLVZlcmNlbCBicmFuY2ggb2YgYHJ1bldvcmtmbG93YCkuIFNpbmNlIHRoZSBwb3J0IGRvZXNcbi8vIG5vdCBjaGFuZ2Ugd2l0aGluIGEgcHJvY2VzcywgcmVzb2x2ZSBpdCBvbmNlIGFuZCByZXVzZSBpdC4gYF9pbkZsaWdodGBcbi8vIGRlZHVwZXMgY29uY3VycmVudCBmaXJzdCBjYWxscyBzbyBkaXNjb3ZlcnkgbmV2ZXIgcnVucyBtb3JlIHRoYW4gb25jZS5cbi8vXG4vLyBUaGUgZmlyc3QgY29uY3JldGUgcG9ydCBpcyBwaW5uZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvY2VzcyDigJQgdGhlcmUgaXNcbi8vIG5vIHBlci1jYWxsIHJlLXJlc29sdXRpb24uIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHRoZSBydW50aW1lIG9ubHkgcnVucyBpbnNpZGVcbi8vIHRoZSBhbHJlYWR5LWxpc3RlbmluZyBkZXYtc2VydmVyIHByb2Nlc3MsIGFuZCBgZ2V0UG9ydCgpYCAtPiBgZ2V0QWxsUG9ydHMoKWBcbi8vIHJldHVybnMgYSBkZXRlcm1pbmlzdGljIG9yZGVyLCBzbyByZXBlYXRlZCBjYWxscyB3b3VsZCByZXNvbHZlIHRoZSBzYW1lIHBvcnRcbi8vIGFueXdheS5cbmxldCBfY2FjaGVkUG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IF9pbkZsaWdodDogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UG9ydExhenkoKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgLy8gRmFzdCBwYXRoOiBhbHJlYWR5IHJlc29sdmVkIGEgY29uY3JldGUgcG9ydCBmb3IgdGhpcyBwcm9jZXNzLlxuICBpZiAoX2NhY2hlZFBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBfY2FjaGVkUG9ydDtcbiAgfVxuICAvLyBBIGRpc2NvdmVyeSBpcyBhbHJlYWR5IHJ1bm5pbmcg4oCUIHNoYXJlIGl0IHJhdGhlciB0aGFuIHN0YXJ0aW5nIGEgc2Vjb25kLlxuICBpZiAoX2luRmxpZ2h0KSB7XG4gICAgcmV0dXJuIF9pbkZsaWdodDtcbiAgfVxuXG4gIGlmICghX2dldFBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ29uc3RydWN0IHNwZWNpZmllciBhdCBydW50aW1lIHRvIGRlZmVhdCBidW5kbGVyIHN0YXRpYyBhbmFseXNpcy5cbiAgICAgIGNvbnN0IHNwZWMgPSBbJ0B3b3JrZmxvdy91dGlscycsICdnZXQtcG9ydCddLmpvaW4oJy8nKTtcbiAgICAgIC8vIFVzZSBwcm9jZXNzLmN3ZCgpLWJhc2VkIGNyZWF0ZVJlcXVpcmUgZm9yIENKUy9FU00gY29tcGF0aWJpbGl0eS5cbiAgICAgIC8vIGltcG9ydC5tZXRhLnVybCBpcyB1bmF2YWlsYWJsZSBpbiBDSlMgcmUtYnVuZGxlZCBvdXRwdXRzLlxuICAgICAgY29uc3QgX3JlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKFxuICAgICAgICBwYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkgKyAnL3BhY2thZ2UuanNvbicpLmhyZWZcbiAgICAgICk7XG4gICAgICBjb25zdCBtb2QgPSBfcmVxdWlyZShzcGVjKTtcbiAgICAgIF9nZXRQb3J0ID0gbW9kLmdldFBvcnQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNb2R1bGUgbm90IGF2YWlsYWJsZSAoZS5nLiwgaW4gYSBicm93c2VyIG9yIG1pbmltYWwgYnVuZGxlKVxuICAgICAgX2dldFBvcnQgPSBhc3luYyAoKSA9PiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gYF9nZXRQb3J0YCBpcyBhbHdheXMgYXNzaWduZWQgYnkgdGhlIGJsb2NrIGFib3ZlOyB0aGUgZmFsbGJhY2sga2VlcHMgdGhlXG4gIC8vIHR5cGUgbm9uLW51bGxhYmxlIHdpdGhvdXQgYSBub24tbnVsbCBhc3NlcnRpb24uXG4gIGNvbnN0IHJlc29sdmVyID0gX2dldFBvcnQgPz8gKGFzeW5jICgpID0+IHVuZGVmaW5lZCk7XG4gIF9pbkZsaWdodCA9IHJlc29sdmVyKClcbiAgICAudGhlbigocG9ydCkgPT4ge1xuICAgICAgLy8gT25seSBjYWNoZSBhIGNvbmNyZXRlIHBvcnQuIEEgdHJhbnNpZW50IGB1bmRlZmluZWRgIChlLmcuIHRoZSBzZXJ2ZXIgaXNcbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgeWV0IG9uIHRoZSB2ZXJ5IGZpcnN0IHJlcGxheSkgbXVzdCBub3QgcG9pc29uIHRoZSBjYWNoZSDigJRcbiAgICAgIC8vIGxlYXZpbmcgaXQgdW5zZXQgbGV0cyB0aGUgbmV4dCBjYWxsIHJldHJ5IGRpc2NvdmVyeS5cbiAgICAgIGlmICh0eXBlb2YgcG9ydCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgX2NhY2hlZFBvcnQgPSBwb3J0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICBfaW5GbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIHJldHVybiBfaW5GbGlnaHQ7XG59XG5cbi8qKlxuICogUmVzZXRzIHRoZSBwZXItcHJvY2VzcyBwb3J0IGNhY2hlLiBJbnRlbmRlZCBmb3IgdGVzdHM7IG5vdCB1c2VkIG9uIHRoZSBob3RcbiAqIHBhdGguIENhbGxlcnMgbXVzdCBsZXQgYW55IGluLWZsaWdodCBsb29rdXAgc2V0dGxlIChhd2FpdCB0aGUgcGVuZGluZ1xuICogYGdldFBvcnRMYXp5KClgIGNhbGwpIGJlZm9yZSByZXNldHRpbmc6IGNsZWFyaW5nIGBfaW5GbGlnaHRgIGhlcmUgZG9lcyBub3RcbiAqIGNhbmNlbCBhbiBhbHJlYWR5LXNjaGVkdWxlZCByZXNvbHV0aW9uLCBzbyBhIGxhdGUgYC50aGVuYCBjb3VsZCBvdGhlcndpc2VcbiAqIHJlcG9wdWxhdGUgYF9jYWNoZWRQb3J0YCBhZnRlciB0aGUgcmVzZXQgYW5kIGJsZWVkIGludG8gdGhlIG5leHQgdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0UG9ydENhY2hlRm9yVGVzdGluZygpOiB2b2lkIHtcbiAgX2dldFBvcnQgPSB1bmRlZmluZWQ7XG4gIF9jYWNoZWRQb3J0ID0gdW5kZWZpbmVkO1xuICBfaW5GbGlnaHQgPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYSBmYWtlIHBvcnQgcmVzb2x2ZXIgYW5kIGNsZWFycyB0aGUgY2FjaGUuIFRlc3Qtb25seSBzZWFtOiB0aGUgcmVhbFxuICogcmVzb2x2ZXIgaXMgbG9hZGVkIHZpYSBgY3JlYXRlUmVxdWlyZWAgd2l0aCBhIHJ1bnRpbWUtYnVpbHQgc3BlY2lmaWVyICh0b1xuICogaGlkZSBpdCBmcm9tIGJ1bmRsZXJzKSwgd2hpY2ggYWxzbyBkZWZlYXRzIG1vZHVsZSBtb2NraW5nLCBzbyBpbmplY3Rpb24gaXNcbiAqIHRoZSBvbmx5IGRldGVybWluaXN0aWMgd2F5IHRvIGV4ZXJjaXNlIHRoZSBjYWNoaW5nIGNvbnRyYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UG9ydFJlc29sdmVyRm9yVGVzdGluZyhcbiAgZm46ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPlxuKTogdm9pZCB7XG4gIF9nZXRQb3J0ID0gZm47XG4gIF9jYWNoZWRQb3J0ID0gdW5kZWZpbmVkO1xuICBfaW5GbGlnaHQgPSB1bmRlZmluZWQ7XG59XG4iXX0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXBvcnQtbGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2dldC1wb3J0LWxhenkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV6QyxJQUFJLFFBQXlELENBQUM7QUFFOUQsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLDhFQUE4RTtBQUM5RSxxREFBcUQ7QUFDckQseUVBQXlFO0FBQ3pFLEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsVUFBVTtBQUNWLElBQUksV0FBK0IsQ0FBQztBQUNwQyxJQUFJLFNBQWtELENBQUM7QUFFdkQsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXO0lBQy9CLGdFQUFnRTtJQUNoRSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsMkVBQTJFO0lBQzNFLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsb0VBQW9FO1lBQ3BFLE1BQU0sSUFBSSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELG1FQUFtRTtZQUNuRSw0REFBNEQ7WUFDNUQsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUM1QixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDcEQsQ0FBQztZQUNGLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUN6QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsOERBQThEO1lBQzlELFFBQVEsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxrREFBa0Q7SUFDbEQsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRCxTQUFTLEdBQUcsUUFBUSxFQUFFO1NBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ2IsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSx1REFBdUQ7UUFDdkQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDWixTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUNyQixXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQ3hCLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxFQUFxQztJQUVyQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExhenkgbG9hZGVyIGZvciBnZXRQb3J0IHRoYXQgcHJldmVudHMgYnVuZGxlcnMgKFR1cmJvcGFjaywgZXNidWlsZClcbiAqIGZyb20gc3RhdGljYWxseSB0cmFjaW5nIEB3b3JrZmxvdy91dGlscy9nZXQtcG9ydCBhbmQgaXRzIGZpbGVzeXN0ZW1cbiAqIG9wZXJhdGlvbnMgKHJlYWRkaXIsIHJlYWRGaWxlLCByZWFkbGluaykgaW50byB0aGUgZmxvdyByb3V0ZSBidW5kbGUuXG4gKlxuICogVXNlcyBjcmVhdGVSZXF1aXJlIHdpdGggYSBkeW5hbWljYWxseSBjb25zdHJ1Y3RlZCBzcGVjaWZpZXIgc28gdGhlXG4gKiBkZXBlbmRlbmN5IGlzIGludmlzaWJsZSB0byBidW5kbGVyIHN0YXRpYyBhbmFseXNpcy5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcblxubGV0IF9nZXRQb3J0OiAoKCkgPT4gUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+KSB8IHVuZGVmaW5lZDtcblxuLy8gUGVyLXByb2Nlc3MgY2FjaGUgb2YgdGhlIHJlc29sdmVkIHBvcnQuIFRoZSB3b3JrZmxvdyBzZXJ2ZXIgbGlzdGVucyBvbiBhXG4vLyBzdGFibGUgcG9ydCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm9jZXNzLCBidXQgYGdldFBvcnQoKWAgcmVkaXNjb3ZlcnMgaXRcbi8vIG9uIGV2ZXJ5IGNhbGwgYnkgcXVlcnlpbmcgdGhlIE9TIGZvciB0aGUgcHJvY2VzcydzIGxpc3RlbmluZyBzb2NrZXRzIOKAlCBvblxuLy8gbWFjT1MgdGhhdCBzaGVsbHMgb3V0IHRvIGBsc29mYCAofjYwbXMpLCB3aGljaCB0aGUgcnVudGltZSBwYXlzIG9uIEVWRVJZXG4vLyB3b3JrZmxvdyByZXBsYXkgb3Igc3RlcCBpbnZvY2F0aW9uLiBTaW5jZSB0aGUgcG9ydCBkb2VzIG5vdCBjaGFuZ2Ugd2l0aGluIGFcbi8vIHByb2Nlc3MsIHJlc29sdmUgaXQgb25jZSBhbmQgcmV1c2UgaXQuIGBfaW5GbGlnaHRgXG4vLyBkZWR1cGVzIGNvbmN1cnJlbnQgZmlyc3QgY2FsbHMgc28gZGlzY292ZXJ5IG5ldmVyIHJ1bnMgbW9yZSB0aGFuIG9uY2UuXG4vL1xuLy8gVGhlIGZpcnN0IGNvbmNyZXRlIHBvcnQgaXMgcGlubmVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2Nlc3Mg4oCUIHRoZXJlIGlzXG4vLyBubyBwZXItY2FsbCByZS1yZXNvbHV0aW9uLiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgcnVudGltZSBvbmx5IHJ1bnMgaW5zaWRlXG4vLyB0aGUgYWxyZWFkeS1saXN0ZW5pbmcgZGV2LXNlcnZlciBwcm9jZXNzLCBhbmQgYGdldFBvcnQoKWAgLT4gYGdldEFsbFBvcnRzKClgXG4vLyByZXR1cm5zIGEgZGV0ZXJtaW5pc3RpYyBvcmRlciwgc28gcmVwZWF0ZWQgY2FsbHMgd291bGQgcmVzb2x2ZSB0aGUgc2FtZSBwb3J0XG4vLyBhbnl3YXkuXG5sZXQgX2NhY2hlZFBvcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbmxldCBfaW5GbGlnaHQ6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBvcnRMYXp5KCk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIC8vIEZhc3QgcGF0aDogYWxyZWFkeSByZXNvbHZlZCBhIGNvbmNyZXRlIHBvcnQgZm9yIHRoaXMgcHJvY2Vzcy5cbiAgaWYgKF9jYWNoZWRQb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gX2NhY2hlZFBvcnQ7XG4gIH1cbiAgLy8gQSBkaXNjb3ZlcnkgaXMgYWxyZWFkeSBydW5uaW5nIOKAlCBzaGFyZSBpdCByYXRoZXIgdGhhbiBzdGFydGluZyBhIHNlY29uZC5cbiAgaWYgKF9pbkZsaWdodCkge1xuICAgIHJldHVybiBfaW5GbGlnaHQ7XG4gIH1cblxuICBpZiAoIV9nZXRQb3J0KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnN0cnVjdCBzcGVjaWZpZXIgYXQgcnVudGltZSB0byBkZWZlYXQgYnVuZGxlciBzdGF0aWMgYW5hbHlzaXMuXG4gICAgICBjb25zdCBzcGVjID0gWydAd29ya2Zsb3cvdXRpbHMnLCAnZ2V0LXBvcnQnXS5qb2luKCcvJyk7XG4gICAgICAvLyBVc2UgcHJvY2Vzcy5jd2QoKS1iYXNlZCBjcmVhdGVSZXF1aXJlIGZvciBDSlMvRVNNIGNvbXBhdGliaWxpdHkuXG4gICAgICAvLyBpbXBvcnQubWV0YS51cmwgaXMgdW5hdmFpbGFibGUgaW4gQ0pTIHJlLWJ1bmRsZWQgb3V0cHV0cy5cbiAgICAgIGNvbnN0IF9yZXF1aXJlID0gY3JlYXRlUmVxdWlyZShcbiAgICAgICAgcGF0aFRvRmlsZVVSTChwcm9jZXNzLmN3ZCgpICsgJy9wYWNrYWdlLmpzb24nKS5ocmVmXG4gICAgICApO1xuICAgICAgY29uc3QgbW9kID0gX3JlcXVpcmUoc3BlYyk7XG4gICAgICBfZ2V0UG9ydCA9IG1vZC5nZXRQb3J0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTW9kdWxlIG5vdCBhdmFpbGFibGUgKGUuZy4sIGluIGEgYnJvd3NlciBvciBtaW5pbWFsIGJ1bmRsZSlcbiAgICAgIF9nZXRQb3J0ID0gYXN5bmMgKCkgPT4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIGBfZ2V0UG9ydGAgaXMgYWx3YXlzIGFzc2lnbmVkIGJ5IHRoZSBibG9jayBhYm92ZTsgdGhlIGZhbGxiYWNrIGtlZXBzIHRoZVxuICAvLyB0eXBlIG5vbi1udWxsYWJsZSB3aXRob3V0IGEgbm9uLW51bGwgYXNzZXJ0aW9uLlxuICBjb25zdCByZXNvbHZlciA9IF9nZXRQb3J0ID8/IChhc3luYyAoKSA9PiB1bmRlZmluZWQpO1xuICBfaW5GbGlnaHQgPSByZXNvbHZlcigpXG4gICAgLnRoZW4oKHBvcnQpID0+IHtcbiAgICAgIC8vIE9ubHkgY2FjaGUgYSBjb25jcmV0ZSBwb3J0LiBBIHRyYW5zaWVudCBgdW5kZWZpbmVkYCAoZS5nLiB0aGUgc2VydmVyIGlzXG4gICAgICAvLyBub3QgbGlzdGVuaW5nIHlldCBvbiB0aGUgdmVyeSBmaXJzdCByZXBsYXkpIG11c3Qgbm90IHBvaXNvbiB0aGUgY2FjaGUg4oCUXG4gICAgICAvLyBsZWF2aW5nIGl0IHVuc2V0IGxldHMgdGhlIG5leHQgY2FsbCByZXRyeSBkaXNjb3ZlcnkuXG4gICAgICBpZiAodHlwZW9mIHBvcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIF9jYWNoZWRQb3J0ID0gcG9ydDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3J0O1xuICAgIH0pXG4gICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgX2luRmxpZ2h0ID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICByZXR1cm4gX2luRmxpZ2h0O1xufVxuXG4vKipcbiAqIFJlc2V0cyB0aGUgcGVyLXByb2Nlc3MgcG9ydCBjYWNoZS4gSW50ZW5kZWQgZm9yIHRlc3RzOyBub3QgdXNlZCBvbiB0aGUgaG90XG4gKiBwYXRoLiBDYWxsZXJzIG11c3QgbGV0IGFueSBpbi1mbGlnaHQgbG9va3VwIHNldHRsZSAoYXdhaXQgdGhlIHBlbmRpbmdcbiAqIGBnZXRQb3J0TGF6eSgpYCBjYWxsKSBiZWZvcmUgcmVzZXR0aW5nOiBjbGVhcmluZyBgX2luRmxpZ2h0YCBoZXJlIGRvZXMgbm90XG4gKiBjYW5jZWwgYW4gYWxyZWFkeS1zY2hlZHVsZWQgcmVzb2x1dGlvbiwgc28gYSBsYXRlIGAudGhlbmAgY291bGQgb3RoZXJ3aXNlXG4gKiByZXBvcHVsYXRlIGBfY2FjaGVkUG9ydGAgYWZ0ZXIgdGhlIHJlc2V0IGFuZCBibGVlZCBpbnRvIHRoZSBuZXh0IHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFBvcnRDYWNoZUZvclRlc3RpbmcoKTogdm9pZCB7XG4gIF9nZXRQb3J0ID0gdW5kZWZpbmVkO1xuICBfY2FjaGVkUG9ydCA9IHVuZGVmaW5lZDtcbiAgX2luRmxpZ2h0ID0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGEgZmFrZSBwb3J0IHJlc29sdmVyIGFuZCBjbGVhcnMgdGhlIGNhY2hlLiBUZXN0LW9ubHkgc2VhbTogdGhlIHJlYWxcbiAqIHJlc29sdmVyIGlzIGxvYWRlZCB2aWEgYGNyZWF0ZVJlcXVpcmVgIHdpdGggYSBydW50aW1lLWJ1aWx0IHNwZWNpZmllciAodG9cbiAqIGhpZGUgaXQgZnJvbSBidW5kbGVycyksIHdoaWNoIGFsc28gZGVmZWF0cyBtb2R1bGUgbW9ja2luZywgc28gaW5qZWN0aW9uIGlzXG4gKiB0aGUgb25seSBkZXRlcm1pbmlzdGljIHdheSB0byBleGVyY2lzZSB0aGUgY2FjaGluZyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBvcnRSZXNvbHZlckZvclRlc3RpbmcoXG4gIGZuOiAoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD5cbik6IHZvaWQge1xuICBfZ2V0UG9ydCA9IGZuO1xuICBfY2FjaGVkUG9ydCA9IHVuZGVmaW5lZDtcbiAgX2luRmxpZ2h0ID0gdW5kZWZpbmVkO1xufVxuIl19
@@ -1,5 +1,5 @@
1
1
  import type { Event, HealthCheckPayload, ValidQueueName, WorkflowRun, World } from '@workflow/world';
2
- import { type CryptoKey } from '../encryption.js';
2
+ import { type PayloadKey } from '../serialization/encryption.js';
3
3
  /**
4
4
  * Validates a workflow name and returns the corresponding queue name.
5
5
  * Ensures the workflow name only contains safe characters before
@@ -25,6 +25,15 @@ export interface HealthCheckResult {
25
25
  * or a non-JSON plain-text health response.
26
26
  */
27
27
  workflowCoreVersion?: string;
28
+ /**
29
+ * The target run's X25519 public key (base64), returned only when the probe
30
+ * carried a `runId` and the responding deployment has encryption enabled.
31
+ *
32
+ * Lets a cross-deployment `start()` seal the workflow arguments using a
33
+ * response it was already waiting on, instead of making a separate
34
+ * key-lookup request.
35
+ */
36
+ encryptionPublicKey?: string;
28
37
  }
29
38
  /**
30
39
  * Checks if the given message is a health check payload.
@@ -36,15 +45,20 @@ export declare function parseHealthCheckPayload(message: unknown): HealthCheckPa
36
45
  * The caller can listen to this stream to get the health check response.
37
46
  *
38
47
  * @param healthCheck - The parsed health check payload
39
- * @param endpoint - Which endpoint is responding ('workflow' or 'step')
40
48
  */
41
- export declare function handleHealthCheckMessage(healthCheck: HealthCheckPayload, endpoint: 'workflow' | 'step', worldSpecVersion?: number): Promise<void>;
42
- export type HealthCheckEndpoint = 'workflow' | 'step';
49
+ export declare function handleHealthCheckMessage(healthCheck: HealthCheckPayload, worldSpecVersion?: number): Promise<void>;
43
50
  export interface HealthCheckOptions {
44
51
  /** Timeout in milliseconds to wait for health check response. Default: 30000 (30s) */
45
52
  timeout?: number;
46
53
  /** Deployment ID to send the health check to. Falls back to process.env.VERCEL_DEPLOYMENT_ID. */
47
54
  deploymentId?: string;
55
+ /**
56
+ * The run id the caller is about to create. When set, the responding
57
+ * deployment derives that run's public key locally and returns it as
58
+ * `encryptionPublicKey`, letting a cross-deployment `start()` seal the
59
+ * workflow arguments without a separate key lookup.
60
+ */
61
+ runId?: string;
48
62
  /**
49
63
  * Queue namespace of the target deployment (e.g. `'eve'` for topics like
50
64
  * `__eve_wkf_workflow_*`). Falls back to `WORKFLOW_QUEUE_NAMESPACE` in the
@@ -56,7 +70,14 @@ export interface HealthCheckOptions {
56
70
  */
57
71
  namespace?: string;
58
72
  }
59
- export declare function healthCheck(world: World, endpoint: HealthCheckEndpoint, options?: HealthCheckOptions): Promise<HealthCheckResult>;
73
+ export declare function healthCheck(world: World, options?: HealthCheckOptions): Promise<HealthCheckResult>;
74
+ /**
75
+ * Appends events whose IDs are not already present in `target`.
76
+ *
77
+ * Pass the IDs currently present in `target` when appending repeatedly to the
78
+ * same array. The set is updated alongside `target`.
79
+ */
80
+ export declare function appendUniqueEvents(target: Event[], events: readonly Event[], targetIds?: Set<string>): void;
60
81
  /**
61
82
  * Loads workflow run events by iterating through all pages of paginated
62
83
  * results. Events are returned in chronological (ascending) order for
@@ -89,10 +110,12 @@ export interface MutableEventLog {
89
110
  cursor: string | null;
90
111
  }
91
112
  /**
92
- * Whether the optimistic-concurrency guard for event creation is enabled
93
- * (`WORKFLOW_PRECONDITION_GUARD=1`, set where the runtime executes). Off by
94
- * default: replay-context creates only send a `stateUpdatedAt` snapshot (and
95
- * can therefore be rejected with 412 by the backend) when it is enabled.
113
+ * Whether the optimistic-concurrency guard for event creation is enabled.
114
+ * **On by default** where the runtime executes: replay-context creates send a
115
+ * `stateUpdatedAt` snapshot (and can be rejected with 412 by a supporting
116
+ * backend) unless `WORKFLOW_PRECONDITION_GUARD` is set to `0`. Backends without
117
+ * guard support ignore the snapshot, so enabling by default is
118
+ * backward-compatible.
96
119
  */
97
120
  export declare function isPreconditionGuardEnabled(): boolean;
98
121
  /**
@@ -145,13 +168,21 @@ export declare function getQueueOverhead(message: {
145
168
  [k: string]: number;
146
169
  } | undefined;
147
170
  /**
148
- * Returns a memoized accessor for the per-run AES-256 encryption key.
171
+ * Returns a memoized accessor for a run's full encryption capability.
172
+ *
173
+ * The first call resolves the run's key material via
174
+ * `world.getEncryptionKeyForRun` (which may do HKDF derivation locally on
175
+ * Vercel, or a network fetch from external contexts) and derives a
176
+ * {@link PayloadKey} from it; subsequent calls await the same cached promise.
177
+ * If the world doesn't support encryption or the run has no key configured,
178
+ * the cached value is `undefined`.
149
179
  *
150
- * The first call resolves the key via `world.getEncryptionKeyForRun` (which
151
- * may do HKDF derivation locally on Vercel, or a network fetch from
152
- * external contexts) and imports it as a `CryptoKey`; subsequent calls
153
- * await the same cached promise. If the world doesn't support encryption
154
- * or the run has no key configured, the cached value is `undefined`.
180
+ * The resolved value is deliberately the *full* capability the symmetric AES
181
+ * key plus the run's X25519 keypair not just a `CryptoKey`. A run reading
182
+ * its own event log can encounter sealed (`encp`) payloads that another run
183
+ * wrote to it (a cross-deployment hook resumption, say), and opening those
184
+ * needs the keypair. Resolving only the symmetric key would leave those
185
+ * payloads unopenable and wedge the run.
155
186
  *
156
187
  * Used by step / workflow handlers to defer the (potentially expensive)
157
188
  * key fetch until the first code path that actually needs it — typically
@@ -166,5 +197,5 @@ export declare function getQueueOverhead(message: {
166
197
  * outer try/catch to log and surface the issue; the queue's redelivery
167
198
  * semantics will retry the key fetch on the next attempt.
168
199
  */
169
- export declare function memoizeEncryptionKey(world: World, runOrId: WorkflowRun | string): () => Promise<CryptoKey | undefined>;
200
+ export declare function memoizeEncryptionKey(world: World, runOrId: WorkflowRun | string): () => Promise<PayloadKey | undefined>;
170
201
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/runtime/helpers.ts"],"names":[],"mappings":"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"}