@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51
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.
- package/README.md +5 -0
- package/dist/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +8 -6
- package/dist/create-hook.d.ts +72 -7
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +297 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +673 -42
- package/dist/flushable-stream.d.ts +97 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +291 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +19 -12
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -16
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +415 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +686 -57
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1863 -0
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +186 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +768 -130
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +75 -0
- package/dist/runtime/suspension-handler.d.ts +247 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1304 -125
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3911 -489
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +8 -4
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1885 -277
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +63 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +80 -13
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +433 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +319 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +107 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +900 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +108 -60
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +125 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -776
|
@@ -0,0 +1,616 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VM-compatible common reducers and revivers.
|
|
3
|
+
*
|
|
4
|
+
* Identical to common.ts but without Node.js dependencies:
|
|
5
|
+
* - Uses native `btoa` / `atob` (provided by quickjs-wasi's base64
|
|
6
|
+
* extension, see `quickjs-assets.generated.ts`) instead of Buffer
|
|
7
|
+
* or pure-JS base64.
|
|
8
|
+
* - Uses `instanceof Error` instead of `types.isNativeError()`.
|
|
9
|
+
*
|
|
10
|
+
* This module is safe to bundle into the QuickJS WASM VM.
|
|
11
|
+
*/
|
|
12
|
+
// ---- Base64 helpers (native btoa/atob from the quickjs-wasi base64 extension) ----
|
|
13
|
+
function arrayBufferToBase64(value, offset, length) {
|
|
14
|
+
if (length === 0)
|
|
15
|
+
return '.';
|
|
16
|
+
// btoa requires a binary string. Build it from the byte view.
|
|
17
|
+
const uint8 = new Uint8Array(value, offset, length);
|
|
18
|
+
let binary = '';
|
|
19
|
+
for (let i = 0; i < uint8.length; i++) {
|
|
20
|
+
binary += String.fromCharCode(uint8[i]);
|
|
21
|
+
}
|
|
22
|
+
return btoa(binary);
|
|
23
|
+
}
|
|
24
|
+
function viewToBase64(value) {
|
|
25
|
+
return arrayBufferToBase64(value.buffer, value.byteOffset, value.byteLength);
|
|
26
|
+
}
|
|
27
|
+
function reviveArrayBuffer(value) {
|
|
28
|
+
if (value === '.')
|
|
29
|
+
return new ArrayBuffer(0);
|
|
30
|
+
const binary = atob(value);
|
|
31
|
+
const bytes = new Uint8Array(binary.length);
|
|
32
|
+
for (let i = 0; i < binary.length; i++) {
|
|
33
|
+
bytes[i] = binary.charCodeAt(i);
|
|
34
|
+
}
|
|
35
|
+
return bytes.buffer;
|
|
36
|
+
}
|
|
37
|
+
// ---- Error subclass helper ----
|
|
38
|
+
// Creates a reducer for a built-in Error subclass whose serialized shape
|
|
39
|
+
// is exactly { message, stack, cause? }. Matches by `value.name`
|
|
40
|
+
// (instance property) for cross-realm + bundler-output robustness; see
|
|
41
|
+
// the host-side common.ts for full rationale.
|
|
42
|
+
function makeNamedErrorSubclassReducer(subclassName) {
|
|
43
|
+
return (value) => {
|
|
44
|
+
if (!(value instanceof Error))
|
|
45
|
+
return false;
|
|
46
|
+
if (value.name !== subclassName)
|
|
47
|
+
return false;
|
|
48
|
+
const reduced = {
|
|
49
|
+
message: value.message,
|
|
50
|
+
stack: value.stack,
|
|
51
|
+
};
|
|
52
|
+
if ('cause' in value)
|
|
53
|
+
reduced.cause = value.cause;
|
|
54
|
+
return reduced;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Creates a reviver for a built-in Error subclass. Looks up the
|
|
58
|
+
// constructor on globalThis so the resulting object passes
|
|
59
|
+
// `instanceof TypeError` etc. in the consuming realm. Falls back to
|
|
60
|
+
// a base Error with the right `.name` if the constructor is not
|
|
61
|
+
// available (defensive: built-ins always exist).
|
|
62
|
+
function makeNamedErrorSubclassReviver(subclassName) {
|
|
63
|
+
return (value) => {
|
|
64
|
+
const Cls = globalThis[subclassName];
|
|
65
|
+
let error;
|
|
66
|
+
if (typeof Cls === 'function') {
|
|
67
|
+
error = new Cls(value.message);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
error = new Error(value.message);
|
|
71
|
+
error.name = subclassName;
|
|
72
|
+
}
|
|
73
|
+
if (value.stack !== undefined)
|
|
74
|
+
error.stack = value.stack;
|
|
75
|
+
if ('cause' in value)
|
|
76
|
+
error.cause = value.cause;
|
|
77
|
+
return error;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// ---- Reducers ----
|
|
81
|
+
export function getCommonReducers() {
|
|
82
|
+
return {
|
|
83
|
+
ArrayBuffer: (value) => value instanceof ArrayBuffer &&
|
|
84
|
+
arrayBufferToBase64(value, 0, value.byteLength),
|
|
85
|
+
BigInt: (value) => typeof value === 'bigint' && value.toString(),
|
|
86
|
+
BigInt64Array: (value) => value instanceof BigInt64Array && viewToBase64(value),
|
|
87
|
+
BigUint64Array: (value) => value instanceof BigUint64Array && viewToBase64(value),
|
|
88
|
+
Date: (value) => {
|
|
89
|
+
if (!(value instanceof Date))
|
|
90
|
+
return false;
|
|
91
|
+
const valid = !Number.isNaN(value.getDate());
|
|
92
|
+
return valid ? value.toISOString() : '.';
|
|
93
|
+
},
|
|
94
|
+
// DOMException is checked before Error so that DOMException-specific
|
|
95
|
+
// shape (name, message, stack, cause) survives the round-trip.
|
|
96
|
+
DOMException: (value) => {
|
|
97
|
+
if (!(value instanceof DOMException))
|
|
98
|
+
return false;
|
|
99
|
+
const reduced = {
|
|
100
|
+
message: value.message,
|
|
101
|
+
name: value.name,
|
|
102
|
+
stack: value.stack,
|
|
103
|
+
};
|
|
104
|
+
if ('cause' in value)
|
|
105
|
+
reduced.cause = value.cause;
|
|
106
|
+
return reduced;
|
|
107
|
+
},
|
|
108
|
+
// First-class Error subclass reducers. Order matters: each subclass
|
|
109
|
+
// reducer is checked before the generic `Error` catch-all so that
|
|
110
|
+
// e.g. a TypeError instance routes through the TypeError reducer
|
|
111
|
+
// instead of the base Error reducer. Matching is by `value.name`
|
|
112
|
+
// (the instance property) for cross-realm + bundler robustness;
|
|
113
|
+
// see common.ts for full rationale.
|
|
114
|
+
AggregateError: (value) => {
|
|
115
|
+
if (!(value instanceof Error) || value.name !== 'AggregateError')
|
|
116
|
+
return false;
|
|
117
|
+
const reduced = {
|
|
118
|
+
message: value.message,
|
|
119
|
+
stack: value.stack,
|
|
120
|
+
errors: value.errors,
|
|
121
|
+
};
|
|
122
|
+
if ('cause' in value)
|
|
123
|
+
reduced.cause = value.cause;
|
|
124
|
+
return reduced;
|
|
125
|
+
},
|
|
126
|
+
EvalError: makeNamedErrorSubclassReducer('EvalError'),
|
|
127
|
+
FatalError: makeNamedErrorSubclassReducer('FatalError'),
|
|
128
|
+
// HookConflictError carries an extra token (+ optional
|
|
129
|
+
// conflictingRunId); mirror the host-side common.ts reducer.
|
|
130
|
+
HookConflictError: (value) => {
|
|
131
|
+
if (!(value instanceof Error) || value.name !== 'HookConflictError')
|
|
132
|
+
return false;
|
|
133
|
+
const reduced = {
|
|
134
|
+
message: value.message,
|
|
135
|
+
stack: value.stack,
|
|
136
|
+
token: value.token,
|
|
137
|
+
};
|
|
138
|
+
if (value.conflictingRunId !== undefined) {
|
|
139
|
+
reduced.conflictingRunId = value.conflictingRunId;
|
|
140
|
+
}
|
|
141
|
+
if ('cause' in value)
|
|
142
|
+
reduced.cause = value.cause;
|
|
143
|
+
return reduced;
|
|
144
|
+
},
|
|
145
|
+
RangeError: makeNamedErrorSubclassReducer('RangeError'),
|
|
146
|
+
ReferenceError: makeNamedErrorSubclassReducer('ReferenceError'),
|
|
147
|
+
// RetryableError carries an extra retryAfter; serialize as numeric
|
|
148
|
+
// epoch timestamp for cross-realm safety (see host-side common.ts).
|
|
149
|
+
RetryableError: (value) => {
|
|
150
|
+
if (!(value instanceof Error) || value.name !== 'RetryableError')
|
|
151
|
+
return false;
|
|
152
|
+
const retryAfterRaw = value.retryAfter;
|
|
153
|
+
let retryAfter;
|
|
154
|
+
if (retryAfterRaw &&
|
|
155
|
+
typeof retryAfterRaw === 'object' &&
|
|
156
|
+
typeof retryAfterRaw.getTime === 'function') {
|
|
157
|
+
const t = retryAfterRaw.getTime();
|
|
158
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
159
|
+
}
|
|
160
|
+
else if (typeof retryAfterRaw === 'string' ||
|
|
161
|
+
typeof retryAfterRaw === 'number') {
|
|
162
|
+
const t = new Date(retryAfterRaw).getTime();
|
|
163
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
retryAfter = Date.now() + 1000;
|
|
167
|
+
}
|
|
168
|
+
const reduced = {
|
|
169
|
+
message: value.message,
|
|
170
|
+
stack: value.stack,
|
|
171
|
+
retryAfter,
|
|
172
|
+
};
|
|
173
|
+
if ('cause' in value)
|
|
174
|
+
reduced.cause = value.cause;
|
|
175
|
+
return reduced;
|
|
176
|
+
},
|
|
177
|
+
// RuntimeDecryptionError carries an extra `context` object (operation,
|
|
178
|
+
// byteLength, formatPrefix) that the generic Error reducer would drop.
|
|
179
|
+
RuntimeDecryptionError: (value) => {
|
|
180
|
+
if (!(value instanceof Error) || value.name !== 'RuntimeDecryptionError')
|
|
181
|
+
return false;
|
|
182
|
+
const reduced = {
|
|
183
|
+
message: value.message,
|
|
184
|
+
stack: value.stack,
|
|
185
|
+
};
|
|
186
|
+
const context = value.context;
|
|
187
|
+
if (context !== undefined) {
|
|
188
|
+
reduced.context = context;
|
|
189
|
+
}
|
|
190
|
+
if ('cause' in value)
|
|
191
|
+
reduced.cause = value.cause;
|
|
192
|
+
return reduced;
|
|
193
|
+
},
|
|
194
|
+
StreamError: (value) => {
|
|
195
|
+
const base = makeNamedErrorSubclassReducer('StreamError')(value);
|
|
196
|
+
if (!base)
|
|
197
|
+
return false;
|
|
198
|
+
const reduced = { ...base };
|
|
199
|
+
const status = value.status;
|
|
200
|
+
const url = value.url;
|
|
201
|
+
if (typeof status === 'number')
|
|
202
|
+
reduced.status = status;
|
|
203
|
+
if (typeof url === 'string')
|
|
204
|
+
reduced.url = url;
|
|
205
|
+
return reduced;
|
|
206
|
+
},
|
|
207
|
+
SyntaxError: makeNamedErrorSubclassReducer('SyntaxError'),
|
|
208
|
+
TypeError: makeNamedErrorSubclassReducer('TypeError'),
|
|
209
|
+
URIError: makeNamedErrorSubclassReducer('URIError'),
|
|
210
|
+
// Base Error reducer: catch-all. Matched LAST after subclass-specific
|
|
211
|
+
// reducers above. Preserves `name` so user Error subclasses without
|
|
212
|
+
// dedicated reducers retain their identity through the round-trip.
|
|
213
|
+
Error: (value) => {
|
|
214
|
+
// In the VM, use instanceof Error (no node:util available)
|
|
215
|
+
if (!(value instanceof Error))
|
|
216
|
+
return false;
|
|
217
|
+
const reduced = {
|
|
218
|
+
name: value.name,
|
|
219
|
+
message: value.message,
|
|
220
|
+
stack: value.stack,
|
|
221
|
+
};
|
|
222
|
+
if ('cause' in value)
|
|
223
|
+
reduced.cause = value.cause;
|
|
224
|
+
return reduced;
|
|
225
|
+
},
|
|
226
|
+
Float32Array: (value) => value instanceof Float32Array && viewToBase64(value),
|
|
227
|
+
Float64Array: (value) => value instanceof Float64Array && viewToBase64(value),
|
|
228
|
+
Int8Array: (value) => value instanceof Int8Array && viewToBase64(value),
|
|
229
|
+
Int16Array: (value) => value instanceof Int16Array && viewToBase64(value),
|
|
230
|
+
Int32Array: (value) => value instanceof Int32Array && viewToBase64(value),
|
|
231
|
+
Map: (value) => value instanceof Map && Array.from(value),
|
|
232
|
+
RegExp: (value) => value instanceof RegExp && {
|
|
233
|
+
source: value.source,
|
|
234
|
+
flags: value.flags,
|
|
235
|
+
},
|
|
236
|
+
// Request/Response/Headers: serialize using the polyfill constructors
|
|
237
|
+
Headers: (value) => {
|
|
238
|
+
const H = globalThis.Headers;
|
|
239
|
+
if (!H || !(value instanceof H))
|
|
240
|
+
return false;
|
|
241
|
+
return Array.from(value);
|
|
242
|
+
},
|
|
243
|
+
Request: (value) => {
|
|
244
|
+
const R = globalThis.Request;
|
|
245
|
+
if (!R)
|
|
246
|
+
return false;
|
|
247
|
+
// Use instanceof OR check for the Request-specific .json method
|
|
248
|
+
// (duck-typing on method/url alone would match plain objects and
|
|
249
|
+
// cause infinite recursion since the reducer output also has those)
|
|
250
|
+
if (!(value instanceof R) && typeof value?.json !== 'function')
|
|
251
|
+
return false;
|
|
252
|
+
if (typeof value?.method !== 'string')
|
|
253
|
+
return false;
|
|
254
|
+
const data = {
|
|
255
|
+
method: value.method,
|
|
256
|
+
url: value.url,
|
|
257
|
+
headers: value.headers,
|
|
258
|
+
body: value.body,
|
|
259
|
+
duplex: value.duplex,
|
|
260
|
+
};
|
|
261
|
+
// Include the webhook response writable stream if present
|
|
262
|
+
const responseWritable = value[Symbol.for('WEBHOOK_RESPONSE_WRITABLE')];
|
|
263
|
+
if (responseWritable) {
|
|
264
|
+
data.responseWritable = responseWritable;
|
|
265
|
+
}
|
|
266
|
+
return data;
|
|
267
|
+
},
|
|
268
|
+
Response: (value) => {
|
|
269
|
+
const R = globalThis.Response;
|
|
270
|
+
if (!R)
|
|
271
|
+
return false;
|
|
272
|
+
// Use instanceof OR check for Response-specific .clone method
|
|
273
|
+
if (!(value instanceof R) && typeof value?.clone !== 'function')
|
|
274
|
+
return false;
|
|
275
|
+
if (typeof value?.status !== 'number')
|
|
276
|
+
return false;
|
|
277
|
+
return {
|
|
278
|
+
type: value.type,
|
|
279
|
+
url: value.url,
|
|
280
|
+
status: value.status,
|
|
281
|
+
statusText: value.statusText,
|
|
282
|
+
headers: value.headers,
|
|
283
|
+
body: value.body,
|
|
284
|
+
redirected: value.redirected,
|
|
285
|
+
};
|
|
286
|
+
},
|
|
287
|
+
ReadableStream: ((value) => {
|
|
288
|
+
if (value == null)
|
|
289
|
+
return false;
|
|
290
|
+
const RS = globalThis.ReadableStream;
|
|
291
|
+
if (!RS ||
|
|
292
|
+
!(value instanceof RS || Object.getPrototypeOf(value) === RS.prototype))
|
|
293
|
+
return false;
|
|
294
|
+
const bodyInit = value[Symbol.for('BODY_INIT')];
|
|
295
|
+
if (bodyInit !== undefined) {
|
|
296
|
+
return { bodyInit };
|
|
297
|
+
}
|
|
298
|
+
// Preserve stream name if present (opaque pointer for passing to steps)
|
|
299
|
+
const name = value[Symbol.for('WORKFLOW_STREAM_NAME')];
|
|
300
|
+
if (name) {
|
|
301
|
+
const s = { name };
|
|
302
|
+
const type = value[Symbol.for('WORKFLOW_STREAM_TYPE')];
|
|
303
|
+
if (type)
|
|
304
|
+
s.type = type;
|
|
305
|
+
// Preserve wire framing so the step-side reviver can unframe
|
|
306
|
+
// byte streams (framed-v1); dropping it turns a framed webhook
|
|
307
|
+
// body into raw length-prefixed bytes for the consumer.
|
|
308
|
+
const framing = value[Symbol.for('WORKFLOW_STREAM_FRAMING')];
|
|
309
|
+
if (framing)
|
|
310
|
+
s.framing = framing;
|
|
311
|
+
return s;
|
|
312
|
+
}
|
|
313
|
+
return { name: '__empty' };
|
|
314
|
+
}),
|
|
315
|
+
WritableStream: ((value) => {
|
|
316
|
+
if (value == null)
|
|
317
|
+
return false;
|
|
318
|
+
const WS = globalThis.WritableStream;
|
|
319
|
+
if (!WS ||
|
|
320
|
+
!(value instanceof WS || Object.getPrototypeOf(value) === WS.prototype))
|
|
321
|
+
return false;
|
|
322
|
+
const name = value[Symbol.for('WORKFLOW_STREAM_NAME')];
|
|
323
|
+
const s = {
|
|
324
|
+
name: name || '__empty',
|
|
325
|
+
};
|
|
326
|
+
// When the handle was forwarded from another run (parent -> child
|
|
327
|
+
// via start()), preserve the foreign runId/deploymentId so the
|
|
328
|
+
// step-side reviver opens the writable against the original stream.
|
|
329
|
+
// Mirrors the node:vm workflow reducer in serialization.ts.
|
|
330
|
+
const foreignRunId = value[Symbol.for('WORKFLOW_STREAM_SERVER_RUN_ID')];
|
|
331
|
+
if (typeof foreignRunId === 'string')
|
|
332
|
+
s.runId = foreignRunId;
|
|
333
|
+
const foreignDeploymentId = value[Symbol.for('WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID')];
|
|
334
|
+
if (typeof foreignDeploymentId === 'string') {
|
|
335
|
+
s.deploymentId = foreignDeploymentId;
|
|
336
|
+
}
|
|
337
|
+
return s;
|
|
338
|
+
}),
|
|
339
|
+
Set: (value) => value instanceof Set && Array.from(value),
|
|
340
|
+
URL: (value) => value instanceof URL && value.href,
|
|
341
|
+
WorkflowFunction: (value) => {
|
|
342
|
+
// Only match function references with a workflowId property (set by
|
|
343
|
+
// the SWC compiler on workflow functions). Plain { workflowId } objects
|
|
344
|
+
// are NOT matched; this prevents infinite recursion since the reduced
|
|
345
|
+
// form { workflowId } is a plain object, not a function.
|
|
346
|
+
if (typeof value !== 'function')
|
|
347
|
+
return false;
|
|
348
|
+
const workflowId = value.workflowId;
|
|
349
|
+
if (typeof workflowId !== 'string')
|
|
350
|
+
return false;
|
|
351
|
+
return { workflowId };
|
|
352
|
+
},
|
|
353
|
+
URLSearchParams: (value) => {
|
|
354
|
+
if (!(value instanceof URLSearchParams))
|
|
355
|
+
return false;
|
|
356
|
+
return value.size === 0 ? '.' : String(value);
|
|
357
|
+
},
|
|
358
|
+
Uint8Array: (value) => value instanceof Uint8Array && viewToBase64(value),
|
|
359
|
+
Uint8ClampedArray: (value) => value instanceof Uint8ClampedArray && viewToBase64(value),
|
|
360
|
+
Uint16Array: (value) => value instanceof Uint16Array && viewToBase64(value),
|
|
361
|
+
Uint32Array: (value) => value instanceof Uint32Array && viewToBase64(value),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
// ---- Revivers ----
|
|
365
|
+
export function getCommonRevivers() {
|
|
366
|
+
return {
|
|
367
|
+
ArrayBuffer: (value) => reviveArrayBuffer(value),
|
|
368
|
+
BigInt: (value) => BigInt(value),
|
|
369
|
+
BigInt64Array: (value) => new BigInt64Array(reviveArrayBuffer(value)),
|
|
370
|
+
BigUint64Array: (value) => new BigUint64Array(reviveArrayBuffer(value)),
|
|
371
|
+
Date: (value) => new Date(value),
|
|
372
|
+
DOMException: (value) => {
|
|
373
|
+
const error = new DOMException(value.message, value.name);
|
|
374
|
+
if (value.stack !== undefined)
|
|
375
|
+
error.stack = value.stack;
|
|
376
|
+
if ('cause' in value)
|
|
377
|
+
error.cause = value.cause;
|
|
378
|
+
return error;
|
|
379
|
+
},
|
|
380
|
+
AggregateError: (value) => {
|
|
381
|
+
const error = new AggregateError(value.errors ?? [], value.message);
|
|
382
|
+
if (value.stack !== undefined)
|
|
383
|
+
error.stack = value.stack;
|
|
384
|
+
if ('cause' in value)
|
|
385
|
+
error.cause = value.cause;
|
|
386
|
+
return error;
|
|
387
|
+
},
|
|
388
|
+
EvalError: makeNamedErrorSubclassReviver('EvalError'),
|
|
389
|
+
FatalError: (value) => {
|
|
390
|
+
// Prefer the host-registered FatalError class (registered via
|
|
391
|
+
// Symbol.for keys by @workflow/errors so `instanceof FatalError`
|
|
392
|
+
// works across realms). Fall back to a synthesized Error with
|
|
393
|
+
// the right .name when no registration is present.
|
|
394
|
+
// FatalError's constructor takes only `message`, so cause is
|
|
395
|
+
// attached as a property after construction (matching the host
|
|
396
|
+
// reviver in common.ts).
|
|
397
|
+
const Cls = globalThis[Symbol.for('@workflow/errors//FatalError')];
|
|
398
|
+
let error;
|
|
399
|
+
if (typeof Cls === 'function') {
|
|
400
|
+
error = new Cls(value.message);
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
error = new Error(value.message);
|
|
404
|
+
error.name = 'FatalError';
|
|
405
|
+
}
|
|
406
|
+
if (value.stack !== undefined)
|
|
407
|
+
error.stack = value.stack;
|
|
408
|
+
if ('cause' in value)
|
|
409
|
+
error.cause = value.cause;
|
|
410
|
+
return error;
|
|
411
|
+
},
|
|
412
|
+
HookConflictError: (value) => {
|
|
413
|
+
// Prefer the registered HookConflictError class (see the FatalError
|
|
414
|
+
// reviver above). Its constructor takes (token, conflictingRunId).
|
|
415
|
+
const Cls = globalThis[Symbol.for('@workflow/errors//HookConflictError')];
|
|
416
|
+
let error;
|
|
417
|
+
if (typeof Cls === 'function') {
|
|
418
|
+
error = new Cls(value.token, value.conflictingRunId);
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
error = new Error(value.message);
|
|
422
|
+
error.name = 'HookConflictError';
|
|
423
|
+
error.token = value.token;
|
|
424
|
+
if (value.conflictingRunId !== undefined) {
|
|
425
|
+
error.conflictingRunId = value.conflictingRunId;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (value.stack !== undefined)
|
|
429
|
+
error.stack = value.stack;
|
|
430
|
+
if ('cause' in value)
|
|
431
|
+
error.cause = value.cause;
|
|
432
|
+
return error;
|
|
433
|
+
},
|
|
434
|
+
RangeError: makeNamedErrorSubclassReviver('RangeError'),
|
|
435
|
+
ReferenceError: makeNamedErrorSubclassReviver('ReferenceError'),
|
|
436
|
+
RetryableError: (value) => {
|
|
437
|
+
// RetryableError's constructor accepts (message, { retryAfter }).
|
|
438
|
+
// Cause is attached after construction (the constructor does not
|
|
439
|
+
// forward it). retryAfter is stored as a Date in the VM realm.
|
|
440
|
+
const Cls = globalThis[Symbol.for('@workflow/errors//RetryableError')];
|
|
441
|
+
const retryAfter = new Date(value.retryAfter);
|
|
442
|
+
let error;
|
|
443
|
+
if (typeof Cls === 'function') {
|
|
444
|
+
error = new Cls(value.message, { retryAfter });
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
error = new Error(value.message);
|
|
448
|
+
error.name = 'RetryableError';
|
|
449
|
+
error.retryAfter = retryAfter;
|
|
450
|
+
}
|
|
451
|
+
if (value.stack !== undefined)
|
|
452
|
+
error.stack = value.stack;
|
|
453
|
+
if ('cause' in value)
|
|
454
|
+
error.cause = value.cause;
|
|
455
|
+
return error;
|
|
456
|
+
},
|
|
457
|
+
RuntimeDecryptionError: (value) => {
|
|
458
|
+
// Prefer the registered RuntimeDecryptionError class (see the
|
|
459
|
+
// FatalError reviver above). Its constructor accepts
|
|
460
|
+
// (message, { cause, context }).
|
|
461
|
+
const Cls = globalThis[Symbol.for('@workflow/errors//RuntimeDecryptionError')];
|
|
462
|
+
let error;
|
|
463
|
+
if (typeof Cls === 'function') {
|
|
464
|
+
const opts = {};
|
|
465
|
+
if ('cause' in value)
|
|
466
|
+
opts.cause = value.cause;
|
|
467
|
+
if (value.context !== undefined)
|
|
468
|
+
opts.context = value.context;
|
|
469
|
+
error = new Cls(value.message, opts);
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
error = new Error(value.message);
|
|
473
|
+
error.name = 'RuntimeDecryptionError';
|
|
474
|
+
if (value.context !== undefined) {
|
|
475
|
+
error.context = value.context;
|
|
476
|
+
}
|
|
477
|
+
if ('cause' in value)
|
|
478
|
+
error.cause = value.cause;
|
|
479
|
+
}
|
|
480
|
+
if (value.stack !== undefined)
|
|
481
|
+
error.stack = value.stack;
|
|
482
|
+
return error;
|
|
483
|
+
},
|
|
484
|
+
StreamError: (value) => {
|
|
485
|
+
const Cls = globalThis[Symbol.for('@workflow/errors//StreamError')];
|
|
486
|
+
let error;
|
|
487
|
+
if (typeof Cls === 'function') {
|
|
488
|
+
error = new Cls(value.message, {
|
|
489
|
+
...('cause' in value ? { cause: value.cause } : {}),
|
|
490
|
+
status: value.status,
|
|
491
|
+
url: value.url,
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
error = new Error(value.message);
|
|
496
|
+
error.name = 'StreamError';
|
|
497
|
+
if ('cause' in value)
|
|
498
|
+
error.cause = value.cause;
|
|
499
|
+
if (value.status !== undefined)
|
|
500
|
+
error.status = value.status;
|
|
501
|
+
if (value.url !== undefined)
|
|
502
|
+
error.url = value.url;
|
|
503
|
+
}
|
|
504
|
+
if (value.stack !== undefined)
|
|
505
|
+
error.stack = value.stack;
|
|
506
|
+
return error;
|
|
507
|
+
},
|
|
508
|
+
SyntaxError: makeNamedErrorSubclassReviver('SyntaxError'),
|
|
509
|
+
TypeError: makeNamedErrorSubclassReviver('TypeError'),
|
|
510
|
+
URIError: makeNamedErrorSubclassReviver('URIError'),
|
|
511
|
+
Error: (value) => {
|
|
512
|
+
const error = new Error(value.message);
|
|
513
|
+
error.name = value.name;
|
|
514
|
+
if (value.stack !== undefined)
|
|
515
|
+
error.stack = value.stack;
|
|
516
|
+
if ('cause' in value)
|
|
517
|
+
error.cause = value.cause;
|
|
518
|
+
return error;
|
|
519
|
+
},
|
|
520
|
+
Float32Array: (value) => new Float32Array(reviveArrayBuffer(value)),
|
|
521
|
+
Float64Array: (value) => new Float64Array(reviveArrayBuffer(value)),
|
|
522
|
+
Int8Array: (value) => new Int8Array(reviveArrayBuffer(value)),
|
|
523
|
+
Int16Array: (value) => new Int16Array(reviveArrayBuffer(value)),
|
|
524
|
+
Int32Array: (value) => new Int32Array(reviveArrayBuffer(value)),
|
|
525
|
+
Map: (value) => new Map(value),
|
|
526
|
+
RegExp: (value) => new RegExp(value.source, value.flags),
|
|
527
|
+
Set: (value) => new Set(value),
|
|
528
|
+
URL: (value) => new URL(value),
|
|
529
|
+
WorkflowFunction: (value) => Object.assign(() => {
|
|
530
|
+
throw new Error('Workflow functions cannot be called directly. Use start() to invoke them.');
|
|
531
|
+
}, { workflowId: value.workflowId }),
|
|
532
|
+
URLSearchParams: (value) => new URLSearchParams(value === '.' ? '' : value),
|
|
533
|
+
Uint8Array: (value) => new Uint8Array(reviveArrayBuffer(value)),
|
|
534
|
+
Uint8ClampedArray: (value) => new Uint8ClampedArray(reviveArrayBuffer(value)),
|
|
535
|
+
Uint16Array: (value) => new Uint16Array(reviveArrayBuffer(value)),
|
|
536
|
+
Uint32Array: (value) => new Uint32Array(reviveArrayBuffer(value)),
|
|
537
|
+
// Web API types: revived as plain objects in the VM since the real
|
|
538
|
+
// constructors (Headers, Request, Response) are not available in QuickJS.
|
|
539
|
+
// The workflow code can access the properties but not call Web API methods.
|
|
540
|
+
Headers: (value) => {
|
|
541
|
+
return new globalThis.Headers(value);
|
|
542
|
+
},
|
|
543
|
+
Request: (value) => {
|
|
544
|
+
const Req = globalThis.Request;
|
|
545
|
+
if (Req) {
|
|
546
|
+
value.json = Req.prototype.json;
|
|
547
|
+
value.text = Req.prototype.text;
|
|
548
|
+
value.arrayBuffer = Req.prototype.arrayBuffer;
|
|
549
|
+
}
|
|
550
|
+
// Carry over the webhook response writable stream to the symbol property
|
|
551
|
+
if (value.responseWritable) {
|
|
552
|
+
value[Symbol.for('WEBHOOK_RESPONSE_WRITABLE')] = value.responseWritable;
|
|
553
|
+
}
|
|
554
|
+
return value;
|
|
555
|
+
},
|
|
556
|
+
Response: (value) => {
|
|
557
|
+
// Don't use Object.setPrototypeOf: devalue continues to set properties
|
|
558
|
+
// on the object after the reviver runs, and getter-only properties
|
|
559
|
+
// (like 'ok') on the prototype would cause "no setter" errors.
|
|
560
|
+
// Instead, copy methods directly onto the object.
|
|
561
|
+
const Resp = globalThis.Response;
|
|
562
|
+
if (Resp) {
|
|
563
|
+
value.json = Resp.prototype.json;
|
|
564
|
+
value.text = Resp.prototype.text;
|
|
565
|
+
value.arrayBuffer = Resp.prototype.arrayBuffer;
|
|
566
|
+
if (Resp.prototype.bytes)
|
|
567
|
+
value.bytes = Resp.prototype.bytes;
|
|
568
|
+
if (Resp.prototype.clone)
|
|
569
|
+
value.clone = Resp.prototype.clone;
|
|
570
|
+
}
|
|
571
|
+
value._body = value.body;
|
|
572
|
+
value.ok = value.status >= 200 && value.status < 300;
|
|
573
|
+
value.bodyUsed = false;
|
|
574
|
+
return value;
|
|
575
|
+
},
|
|
576
|
+
ReadableStream: (value) => {
|
|
577
|
+
const RS = globalThis.ReadableStream;
|
|
578
|
+
const stream = Object.create(RS ? RS.prototype : {});
|
|
579
|
+
if (value && 'bodyInit' in value) {
|
|
580
|
+
// Body from Response/Request constructor: store the raw data
|
|
581
|
+
stream[Symbol.for('BODY_INIT')] = value.bodyInit;
|
|
582
|
+
}
|
|
583
|
+
else if (value && 'name' in value) {
|
|
584
|
+
// Named stream reference: preserve the name/type for re-serialization.
|
|
585
|
+
// Streams are opaque pointers in the VM; they can be passed to steps
|
|
586
|
+
// but not consumed directly.
|
|
587
|
+
stream[Symbol.for('WORKFLOW_STREAM_NAME')] = value.name;
|
|
588
|
+
if (value.type)
|
|
589
|
+
stream[Symbol.for('WORKFLOW_STREAM_TYPE')] = value.type;
|
|
590
|
+
if (value.framing) {
|
|
591
|
+
stream[Symbol.for('WORKFLOW_STREAM_FRAMING')] = value.framing;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return stream;
|
|
595
|
+
},
|
|
596
|
+
WritableStream: (value) => {
|
|
597
|
+
const WS = globalThis.WritableStream;
|
|
598
|
+
const stream = Object.create(WS ? WS.prototype : {});
|
|
599
|
+
if (value && 'name' in value) {
|
|
600
|
+
stream[Symbol.for('WORKFLOW_STREAM_NAME')] = value.name;
|
|
601
|
+
}
|
|
602
|
+
// Preserve the foreign runId/deploymentId, if present, so that when
|
|
603
|
+
// the handle is later passed to a step the workflow reducer can
|
|
604
|
+
// forward it through to the step reviver (cross-run writable
|
|
605
|
+
// forwarding via start()).
|
|
606
|
+
if (value && typeof value.runId === 'string') {
|
|
607
|
+
stream[Symbol.for('WORKFLOW_STREAM_SERVER_RUN_ID')] = value.runId;
|
|
608
|
+
}
|
|
609
|
+
if (value && typeof value.deploymentId === 'string') {
|
|
610
|
+
stream[Symbol.for('WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID')] = value.deploymentId;
|
|
611
|
+
}
|
|
612
|
+
return stream;
|
|
613
|
+
},
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXZtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLXZtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFJSCxxRkFBcUY7QUFFckYsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxJQUFJLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDN0IsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdEMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFzQjtJQUMxQyxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYTtJQUN0QyxJQUFJLEtBQUssS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLE1B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LENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzFELENBQUM7WUFDRCxvRUFBb0U7WUFDcEUsZ0VBQWdFO1lBQ2hFLDZEQUE2RDtZQUM3RCwyQkFBMkI7WUFDM0IsSUFBSSxLQUFLLElBQUksT0FBUSxLQUFhLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN0RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLEdBQ2pELEtBQ0QsQ0FBQyxLQUFLLENBQUM7WUFDVixDQUFDO1lBQ0QsSUFBSSxLQUFLLElBQUksT0FBUSxLQUFhLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLEdBQ3hELEtBQ0QsQ0FBQyxZQUFZLENBQUM7WUFDakIsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVk0tY29tcGF0aWJsZSBjb21tb24gcmVkdWNlcnMgYW5kIHJldml2ZXJzLlxuICpcbiAqIElkZW50aWNhbCB0byBjb21tb24udHMgYnV0IHdpdGhvdXQgTm9kZS5qcyBkZXBlbmRlbmNpZXM6XG4gKiAtIFVzZXMgbmF0aXZlIGBidG9hYCAvIGBhdG9iYCAocHJvdmlkZWQgYnkgcXVpY2tqcy13YXNpJ3MgYmFzZTY0XG4gKiAgIGV4dGVuc2lvbiwgc2VlIGBxdWlja2pzLWFzc2V0cy5nZW5lcmF0ZWQudHNgKSBpbnN0ZWFkIG9mIEJ1ZmZlclxuICogICBvciBwdXJlLUpTIGJhc2U2NC5cbiAqIC0gVXNlcyBgaW5zdGFuY2VvZiBFcnJvcmAgaW5zdGVhZCBvZiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYC5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBzYWZlIHRvIGJ1bmRsZSBpbnRvIHRoZSBRdWlja0pTIFdBU00gVk0uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgKG5hdGl2ZSBidG9hL2F0b2IgZnJvbSB0aGUgcXVpY2tqcy13YXNpIGJhc2U2NCBleHRlbnNpb24pIC0tLS1cblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChcbiAgdmFsdWU6IEFycmF5QnVmZmVyTGlrZSxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIGxlbmd0aDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBidG9hIHJlcXVpcmVzIGEgYmluYXJ5IHN0cmluZy4gQnVpbGQgaXQgZnJvbSB0aGUgYnl0ZSB2aWV3LlxuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIGxldCBiaW5hcnkgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1aW50OC5sZW5ndGg7IGkrKykge1xuICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVpbnQ4W2ldISk7XG4gIH1cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KTtcbn1cblxuZnVuY3Rpb24gdmlld1RvQmFzZTY0KHZhbHVlOiBBcnJheUJ1ZmZlclZpZXcpOiBzdHJpbmcge1xuICByZXR1cm4gYXJyYXlCdWZmZXJUb0Jhc2U2NCh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZTogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICBpZiAodmFsdWUgPT09ICcuJykgcmV0dXJuIG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgY29uc3QgYmluYXJ5ID0gYXRvYih2YWx1ZSk7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnl0ZXMuYnVmZmVyIGFzIEFycmF5QnVmZmVyO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlciAtLS0tXG5cbi8vIENyZWF0ZXMgYSByZWR1Y2VyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzIHdob3NlIHNlcmlhbGl6ZWQgc2hhcGVcbi8vIGlzIGV4YWN0bHkgeyBtZXNzYWdlLCBzdGFjaywgY2F1c2U/IH0uIE1hdGNoZXMgYnkgYHZhbHVlLm5hbWVgXG4vLyAoaW5zdGFuY2UgcHJvcGVydHkpIGZvciBjcm9zcy1yZWFsbSArIGJ1bmRsZXItb3V0cHV0IHJvYnVzdG5lc3M7IHNlZVxuLy8gdGhlIGhvc3Qtc2lkZSBjb21tb24udHMgZm9yIGZ1bGwgcmF0aW9uYWxlLlxuZnVuY3Rpb24gbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoc3ViY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZTogdW5rbm93blxuICApOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9IHwgZmFsc2UgPT4ge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHZhbHVlLm5hbWUgIT09IHN1YmNsYXNzTmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlZHVjZWQ6IHsgbWVzc2FnZTogc3RyaW5nOyBzdGFjaz86IHN0cmluZzsgY2F1c2U/OiB1bmtub3duIH0gPSB7XG4gICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgIH07XG4gICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSAodmFsdWUgYXMgeyBjYXVzZTogdW5rbm93biB9KS5jYXVzZTtcbiAgICByZXR1cm4gcmVkdWNlZDtcbiAgfTtcbn1cblxuLy8gQ3JlYXRlcyBhIHJldml2ZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3MuIExvb2tzIHVwIHRoZVxuLy8gY29uc3RydWN0b3Igb24gZ2xvYmFsVGhpcyBzbyB0aGUgcmVzdWx0aW5nIG9iamVjdCBwYXNzZXNcbi8vIGBpbnN0YW5jZW9mIFR5cGVFcnJvcmAgZXRjLiBpbiB0aGUgY29uc3VtaW5nIHJlYWxtLiBGYWxscyBiYWNrIHRvXG4vLyBhIGJhc2UgRXJyb3Igd2l0aCB0aGUgcmlnaHQgYC5uYW1lYCBpZiB0aGUgY29uc3RydWN0b3IgaXMgbm90XG4vLyBhdmFpbGFibGUgKGRlZmVuc2l2ZTogYnVpbHQtaW5zIGFsd2F5cyBleGlzdCkuXG5mdW5jdGlvbiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmV2aXZlcihzdWJjbGFzc05hbWU6IHN0cmluZykge1xuICByZXR1cm4gKHZhbHVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9KSA9PiB7XG4gICAgY29uc3QgQ2xzID0gKGdsb2JhbFRoaXMgYXMgYW55KVtzdWJjbGFzc05hbWVdO1xuICAgIGxldCBlcnJvcjogRXJyb3I7XG4gICAgaWYgKHR5cGVvZiBDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yID0gbmV3IENscyh2YWx1ZS5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBlcnJvci5uYW1lID0gc3ViY2xhc3NOYW1lO1xuICAgIH1cbiAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgKGVycm9yIGFzIGFueSkuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH07XG59XG5cbi8vIC0tLS0gUmVkdWNlcnMgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmVkdWNlcnMoKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyICYmXG4gICAgICBhcnJheUJ1ZmZlclRvQmFzZTY0KHZhbHVlLCAwLCB2YWx1ZS5ieXRlTGVuZ3RoKSxcbiAgICBCaWdJbnQ6ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyAmJiB2YWx1ZS50b1N0cmluZygpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIEJpZ1VpbnQ2NEFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgRGF0ZTogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB2YWxpZCA9ICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgIHJldHVybiB2YWxpZCA/IHZhbHVlLnRvSVNPU3RyaW5nKCkgOiAnLic7XG4gICAgfSxcbiAgICAvLyBET01FeGNlcHRpb24gaXMgY2hlY2tlZCBiZWZvcmUgRXJyb3Igc28gdGhhdCBET01FeGNlcHRpb24tc3BlY2lmaWNcbiAgICAvLyBzaGFwZSAobmFtZSwgbWVzc2FnZSwgc3RhY2ssIGNhdXNlKSBzdXJ2aXZlcyB0aGUgcm91bmQtdHJpcC5cbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydET01FeGNlcHRpb24nXSA9IHtcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIC8vIEZpcnN0LWNsYXNzIEVycm9yIHN1YmNsYXNzIHJlZHVjZXJzLiBPcmRlciBtYXR0ZXJzOiBlYWNoIHN1YmNsYXNzXG4gICAgLy8gcmVkdWNlciBpcyBjaGVja2VkIGJlZm9yZSB0aGUgZ2VuZXJpYyBgRXJyb3JgIGNhdGNoLWFsbCBzbyB0aGF0XG4gICAgLy8gZS5nLiBhIFR5cGVFcnJvciBpbnN0YW5jZSByb3V0ZXMgdGhyb3VnaCB0aGUgVHlwZUVycm9yIHJlZHVjZXJcbiAgICAvLyBpbnN0ZWFkIG9mIHRoZSBiYXNlIEVycm9yIHJlZHVjZXIuIE1hdGNoaW5nIGlzIGJ5IGB2YWx1ZS5uYW1lYFxuICAgIC8vICh0aGUgaW5zdGFuY2UgcHJvcGVydHkpIGZvciBjcm9zcy1yZWFsbSArIGJ1bmRsZXIgcm9idXN0bmVzcztcbiAgICAvLyBzZWUgY29tbW9uLnRzIGZvciBmdWxsIHJhdGlvbmFsZS5cbiAgICBBZ2dyZWdhdGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB8fCB2YWx1ZS5uYW1lICE9PSAnQWdncmVnYXRlRXJyb3InKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydBZ2dyZWdhdGVFcnJvciddID0ge1xuICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICAgIGVycm9yczogKHZhbHVlIGFzIEFnZ3JlZ2F0ZUVycm9yKS5lcnJvcnMsXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgRXZhbEVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignRXZhbEVycm9yJyksXG4gICAgRmF0YWxFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0ZhdGFsRXJyb3InKSxcbiAgICAvLyBIb29rQ29uZmxpY3RFcnJvciBjYXJyaWVzIGFuIGV4dHJhIHRva2VuICgrIG9wdGlvbmFsXG4gICAgLy8gY29uZmxpY3RpbmdSdW5JZCk7IG1pcnJvciB0aGUgaG9zdC1zaWRlIGNvbW1vbi50cyByZWR1Y2VyLlxuICAgIEhvb2tDb25mbGljdEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHx8IHZhbHVlLm5hbWUgIT09ICdIb29rQ29uZmxpY3RFcnJvcicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0hvb2tDb25mbGljdEVycm9yJ10gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICAgICAgdG9rZW46ICh2YWx1ZSBhcyBhbnkpLnRva2VuLFxuICAgICAgfTtcbiAgICAgIGlmICgodmFsdWUgYXMgYW55KS5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb25mbGljdGluZ1J1bklkID0gKHZhbHVlIGFzIGFueSkuY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgIH1cbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIFJhbmdlRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSYW5nZUVycm9yJyksXG4gICAgUmVmZXJlbmNlRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIC8vIFJldHJ5YWJsZUVycm9yIGNhcnJpZXMgYW4gZXh0cmEgcmV0cnlBZnRlcjsgc2VyaWFsaXplIGFzIG51bWVyaWNcbiAgICAvLyBlcG9jaCB0aW1lc3RhbXAgZm9yIGNyb3NzLXJlYWxtIHNhZmV0eSAoc2VlIGhvc3Qtc2lkZSBjb21tb24udHMpLlxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHx8IHZhbHVlLm5hbWUgIT09ICdSZXRyeWFibGVFcnJvcicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJSYXcgPSAodmFsdWUgYXMgYW55KS5yZXRyeUFmdGVyO1xuICAgICAgbGV0IHJldHJ5QWZ0ZXI6IG51bWJlcjtcbiAgICAgIGlmIChcbiAgICAgICAgcmV0cnlBZnRlclJhdyAmJlxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIChyZXRyeUFmdGVyUmF3IGFzIHsgZ2V0VGltZT86IHVua25vd24gfSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSAocmV0cnlBZnRlclJhdyBhcyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXJSYXcpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1JldHJ5YWJsZUVycm9yJ10gPSB7XG4gICAgICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgICAgICAgcmV0cnlBZnRlcixcbiAgICAgIH07XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICAvLyBSdW50aW1lRGVjcnlwdGlvbkVycm9yIGNhcnJpZXMgYW4gZXh0cmEgYGNvbnRleHRgIG9iamVjdCAob3BlcmF0aW9uLFxuICAgIC8vIGJ5dGVMZW5ndGgsIGZvcm1hdFByZWZpeCkgdGhhdCB0aGUgZ2VuZXJpYyBFcnJvciByZWR1Y2VyIHdvdWxkIGRyb3AuXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB8fCB2YWx1ZS5uYW1lICE9PSAnUnVudGltZURlY3J5cHRpb25FcnJvcicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InXSA9IHtcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSAodmFsdWUgYXMgYW55KS5jb250ZXh0O1xuICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWR1Y2VkLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgfVxuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgU3RyZWFtRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdTdHJlYW1FcnJvcicpKHZhbHVlKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnU3RyZWFtRXJyb3InXSA9IHsgLi4uYmFzZSB9O1xuICAgICAgY29uc3Qgc3RhdHVzID0gKHZhbHVlIGFzIGFueSkuc3RhdHVzO1xuICAgICAgY29uc3QgdXJsID0gKHZhbHVlIGFzIGFueSkudXJsO1xuICAgICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSByZWR1Y2VkLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykgcmVkdWNlZC51cmwgPSB1cmw7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZWR1Y2VyKCdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1VSSUVycm9yJyksXG4gICAgLy8gQmFzZSBFcnJvciByZWR1Y2VyOiBjYXRjaC1hbGwuIE1hdGNoZWQgTEFTVCBhZnRlciBzdWJjbGFzcy1zcGVjaWZpY1xuICAgIC8vIHJlZHVjZXJzIGFib3ZlLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHVzZXIgRXJyb3Igc3ViY2xhc3NlcyB3aXRob3V0XG4gICAgLy8gZGVkaWNhdGVkIHJlZHVjZXJzIHJldGFpbiB0aGVpciBpZGVudGl0eSB0aHJvdWdoIHRoZSByb3VuZC10cmlwLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIEluIHRoZSBWTSwgdXNlIGluc3RhbmNlb2YgRXJyb3IgKG5vIG5vZGU6dXRpbCBhdmFpbGFibGUpXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRXJyb3InXSA9IHtcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gKHZhbHVlIGFzIGFueSkuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEZsb2F0MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50OEFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgSW50OEFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIEludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgSW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIE1hcDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIE1hcCAmJiBBcnJheS5mcm9tKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwICYmIHtcbiAgICAgICAgc291cmNlOiB2YWx1ZS5zb3VyY2UsXG4gICAgICAgIGZsYWdzOiB2YWx1ZS5mbGFncyxcbiAgICAgIH0sXG4gICAgLy8gUmVxdWVzdC9SZXNwb25zZS9IZWFkZXJzOiBzZXJpYWxpemUgdXNpbmcgdGhlIHBvbHlmaWxsIGNvbnN0cnVjdG9yc1xuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgSCA9IChnbG9iYWxUaGlzIGFzIGFueSkuSGVhZGVycztcbiAgICAgIGlmICghSCB8fCAhKHZhbHVlIGluc3RhbmNlb2YgSCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlIGFzIEl0ZXJhYmxlPFtzdHJpbmcsIHN0cmluZ10+KTtcbiAgICB9LFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUiA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVxdWVzdDtcbiAgICAgIGlmICghUikgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gVXNlIGluc3RhbmNlb2YgT1IgY2hlY2sgZm9yIHRoZSBSZXF1ZXN0LXNwZWNpZmljIC5qc29uIG1ldGhvZFxuICAgICAgLy8gKGR1Y2stdHlwaW5nIG9uIG1ldGhvZC91cmwgYWxvbmUgd291bGQgbWF0Y2ggcGxhaW4gb2JqZWN0cyBhbmRcbiAgICAgIC8vIGNhdXNlIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB0aGUgcmVkdWNlciBvdXRwdXQgYWxzbyBoYXMgdGhvc2UpXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFIpICYmIHR5cGVvZiB2YWx1ZT8uanNvbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZT8ubWV0aG9kICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IHZhbHVlLmhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZhbHVlLmJvZHksXG4gICAgICAgIGR1cGxleDogdmFsdWUuZHVwbGV4LFxuICAgICAgfTtcbiAgICAgIC8vIEluY2x1ZGUgdGhlIHdlYmhvb2sgcmVzcG9uc2Ugd3JpdGFibGUgc3RyZWFtIGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IHJlc3BvbnNlV3JpdGFibGUgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFJyldO1xuICAgICAgaWYgKHJlc3BvbnNlV3JpdGFibGUpIHtcbiAgICAgICAgZGF0YS5yZXNwb25zZVdyaXRhYmxlID0gcmVzcG9uc2VXcml0YWJsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgUiA9IChnbG9iYWxUaGlzIGFzIGFueSkuUmVzcG9uc2U7XG4gICAgICBpZiAoIVIpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFVzZSBpbnN0YW5jZW9mIE9SIGNoZWNrIGZvciBSZXNwb25zZS1zcGVjaWZpYyAuY2xvbmUgbWV0aG9kXG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFIpICYmIHR5cGVvZiB2YWx1ZT8uY2xvbmUgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWU/LnN0YXR1cyAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBzdGF0dXM6IHZhbHVlLnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogdmFsdWUuc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogdmFsdWUuaGVhZGVycyxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgIH07XG4gICAgfSxcbiAgICBSZWFkYWJsZVN0cmVhbTogKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgUlMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlYWRhYmxlU3RyZWFtO1xuICAgICAgaWYgKFxuICAgICAgICAhUlMgfHxcbiAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJTIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IFJTLnByb3RvdHlwZSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgYm9keUluaXQgPSB2YWx1ZVtTeW1ib2wuZm9yKCdCT0RZX0lOSVQnKV07XG4gICAgICBpZiAoYm9keUluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4geyBib2R5SW5pdCB9O1xuICAgICAgfVxuICAgICAgLy8gUHJlc2VydmUgc3RyZWFtIG5hbWUgaWYgcHJlc2VudCAob3BhcXVlIHBvaW50ZXIgZm9yIHBhc3NpbmcgdG8gc3RlcHMpXG4gICAgICBjb25zdCBuYW1lID0gdmFsdWVbU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX05BTUUnKV07XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICBjb25zdCBzOiBhbnkgPSB7IG5hbWUgfTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbHVlW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyldO1xuICAgICAgICBpZiAodHlwZSkgcy50eXBlID0gdHlwZTtcbiAgICAgICAgLy8gUHJlc2VydmUgd2lyZSBmcmFtaW5nIHNvIHRoZSBzdGVwLXNpZGUgcmV2aXZlciBjYW4gdW5mcmFtZVxuICAgICAgICAvLyBieXRlIHN0cmVhbXMgKGZyYW1lZC12MSk7IGRyb3BwaW5nIGl0IHR1cm5zIGEgZnJhbWVkIHdlYmhvb2tcbiAgICAgICAgLy8gYm9keSBpbnRvIHJhdyBsZW5ndGgtcHJlZml4ZWQgYnl0ZXMgZm9yIHRoZSBjb25zdW1lci5cbiAgICAgICAgY29uc3QgZnJhbWluZyA9IHZhbHVlW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9GUkFNSU5HJyldO1xuICAgICAgICBpZiAoZnJhbWluZykgcy5mcmFtaW5nID0gZnJhbWluZztcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBuYW1lOiAnX19lbXB0eScgfTtcbiAgICB9KSBhcyBhbnksXG4gICAgV3JpdGFibGVTdHJlYW06ICgodmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IFdTID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Xcml0YWJsZVN0cmVhbTtcbiAgICAgIGlmIChcbiAgICAgICAgIVdTIHx8XG4gICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBXUyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBXUy5wcm90b3R5cGUpXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fTkFNRScpXTtcbiAgICAgIGNvbnN0IHM6IHsgbmFtZTogc3RyaW5nOyBydW5JZD86IHN0cmluZzsgZGVwbG95bWVudElkPzogc3RyaW5nIH0gPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgfHwgJ19fZW1wdHknLFxuICAgICAgfTtcbiAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSB3YXMgZm9yd2FyZGVkIGZyb20gYW5vdGhlciBydW4gKHBhcmVudCAtPiBjaGlsZFxuICAgICAgLy8gdmlhIHN0YXJ0KCkpLCBwcmVzZXJ2ZSB0aGUgZm9yZWlnbiBydW5JZC9kZXBsb3ltZW50SWQgc28gdGhlXG4gICAgICAvLyBzdGVwLXNpZGUgcmV2aXZlciBvcGVucyB0aGUgd3JpdGFibGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgc3RyZWFtLlxuICAgICAgLy8gTWlycm9ycyB0aGUgbm9kZTp2bSB3b3JrZmxvdyByZWR1Y2VyIGluIHNlcmlhbGl6YXRpb24udHMuXG4gICAgICBjb25zdCBmb3JlaWduUnVuSWQgPSB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCcpXTtcbiAgICAgIGlmICh0eXBlb2YgZm9yZWlnblJ1bklkID09PSAnc3RyaW5nJykgcy5ydW5JZCA9IGZvcmVpZ25SdW5JZDtcbiAgICAgIGNvbnN0IGZvcmVpZ25EZXBsb3ltZW50SWQgPVxuICAgICAgICB2YWx1ZVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSUQnKV07XG4gICAgICBpZiAodHlwZW9mIGZvcmVpZ25EZXBsb3ltZW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHMuZGVwbG95bWVudElkID0gZm9yZWlnbkRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH0pIGFzIGFueSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBTZXQgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgVVJMOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgVVJMICYmIHZhbHVlLmhyZWYsXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBPbmx5IG1hdGNoIGZ1bmN0aW9uIHJlZmVyZW5jZXMgd2l0aCBhIHdvcmtmbG93SWQgcHJvcGVydHkgKHNldCBieVxuICAgICAgLy8gdGhlIFNXQyBjb21waWxlciBvbiB3b3JrZmxvdyBmdW5jdGlvbnMpLiBQbGFpbiB7IHdvcmtmbG93SWQgfSBvYmplY3RzXG4gICAgICAvLyBhcmUgTk9UIG1hdGNoZWQ7IHRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHNpbmNlIHRoZSByZWR1Y2VkXG4gICAgICAvLyBmb3JtIHsgd29ya2Zsb3dJZCB9IGlzIGEgcGxhaW4gb2JqZWN0LCBub3QgYSBmdW5jdGlvbi5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHdvcmtmbG93SWQgPSAodmFsdWUgYXMgYW55KS53b3JrZmxvd0lkO1xuICAgICAgaWYgKHR5cGVvZiB3b3JrZmxvd0lkICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHsgd29ya2Zsb3dJZCB9O1xuICAgIH0sXG4gICAgVVJMU2VhcmNoUGFyYW1zOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHZhbHVlLnNpemUgPT09IDAgPyAnLicgOiBTdHJpbmcodmFsdWUpO1xuICAgIH0sXG4gICAgVWludDhBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgVWludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gIH07XG59XG5cbi8vIC0tLS0gUmV2aXZlcnMgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmV2aXZlcnMoKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpLFxuICAgIEJpZ0ludDogKHZhbHVlOiBzdHJpbmcpID0+IEJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnSW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBCaWdVaW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IERhdGUodmFsdWUpLFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IodmFsdWUuZXJyb3JzID8/IFtdLCB2YWx1ZS5tZXNzYWdlKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIChlcnJvciBhcyBhbnkpLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBFdmFsRXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFByZWZlciB0aGUgaG9zdC1yZWdpc3RlcmVkIEZhdGFsRXJyb3IgY2xhc3MgKHJlZ2lzdGVyZWQgdmlhXG4gICAgICAvLyBTeW1ib2wuZm9yIGtleXMgYnkgQHdvcmtmbG93L2Vycm9ycyBzbyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYFxuICAgICAgLy8gd29ya3MgYWNyb3NzIHJlYWxtcykuIEZhbGwgYmFjayB0byBhIHN5bnRoZXNpemVkIEVycm9yIHdpdGhcbiAgICAgIC8vIHRoZSByaWdodCAubmFtZSB3aGVuIG5vIHJlZ2lzdHJhdGlvbiBpcyBwcmVzZW50LlxuICAgICAgLy8gRmF0YWxFcnJvcidzIGNvbnN0cnVjdG9yIHRha2VzIG9ubHkgYG1lc3NhZ2VgLCBzbyBjYXVzZSBpc1xuICAgICAgLy8gYXR0YWNoZWQgYXMgYSBwcm9wZXJ0eSBhZnRlciBjb25zdHJ1Y3Rpb24gKG1hdGNoaW5nIHRoZSBob3N0XG4gICAgICAvLyByZXZpdmVyIGluIGNvbW1vbi50cykuXG4gICAgICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgIF07XG4gICAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgQ2xzKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSk7XG4gICAgICAgIGVycm9yLm5hbWUgPSAnRmF0YWxFcnJvcic7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUHJlZmVyIHRoZSByZWdpc3RlcmVkIEhvb2tDb25mbGljdEVycm9yIGNsYXNzIChzZWUgdGhlIEZhdGFsRXJyb3JcbiAgICAgIC8vIHJldml2ZXIgYWJvdmUpLiBJdHMgY29uc3RydWN0b3IgdGFrZXMgKHRva2VuLCBjb25mbGljdGluZ1J1bklkKS5cbiAgICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0hvb2tDb25mbGljdEVycm9yJylcbiAgICAgIF07XG4gICAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgQ2xzKHZhbHVlLnRva2VuLCB2YWx1ZS5jb25mbGljdGluZ1J1bklkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5uYW1lID0gJ0hvb2tDb25mbGljdEVycm9yJztcbiAgICAgICAgKGVycm9yIGFzIGFueSkudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgICAgaWYgKHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmNvbmZsaWN0aW5nUnVuSWQgPSB2YWx1ZS5jb25mbGljdGluZ1J1bklkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUmV0cnlhYmxlRXJyb3IncyBjb25zdHJ1Y3RvciBhY2NlcHRzIChtZXNzYWdlLCB7IHJldHJ5QWZ0ZXIgfSkuXG4gICAgICAvLyBDYXVzZSBpcyBhdHRhY2hlZCBhZnRlciBjb25zdHJ1Y3Rpb24gKHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdFxuICAgICAgLy8gZm9yd2FyZCBpdCkuIHJldHJ5QWZ0ZXIgaXMgc3RvcmVkIGFzIGEgRGF0ZSBpbiB0aGUgVk0gcmVhbG0uXG4gICAgICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICBdO1xuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgbGV0IGVycm9yOiBFcnJvcjtcbiAgICAgIGlmICh0eXBlb2YgQ2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yID0gbmV3IENscyh2YWx1ZS5tZXNzYWdlLCB7IHJldHJ5QWZ0ZXIgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdSZXRyeWFibGVFcnJvcic7XG4gICAgICAgIChlcnJvciBhcyBhbnkpLnJldHJ5QWZ0ZXIgPSByZXRyeUFmdGVyO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgKGVycm9yIGFzIGFueSkuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUHJlZmVyIHRoZSByZWdpc3RlcmVkIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgY2xhc3MgKHNlZSB0aGVcbiAgICAgIC8vIEZhdGFsRXJyb3IgcmV2aXZlciBhYm92ZSkuIEl0cyBjb25zdHJ1Y3RvciBhY2NlcHRzXG4gICAgICAvLyAobWVzc2FnZSwgeyBjYXVzZSwgY29udGV4dCB9KS5cbiAgICAgIGNvbnN0IENscyA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1J1bnRpbWVEZWNyeXB0aW9uRXJyb3InKVxuICAgICAgXTtcbiAgICAgIGxldCBlcnJvcjogRXJyb3I7XG4gICAgICBpZiAodHlwZW9mIENscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBvcHRzOiB7IGNhdXNlPzogdW5rbm93bjsgY29udGV4dD86IHVua25vd24gfSA9IHt9O1xuICAgICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgb3B0cy5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgICBpZiAodmFsdWUuY29udGV4dCAhPT0gdW5kZWZpbmVkKSBvcHRzLmNvbnRleHQgPSB2YWx1ZS5jb250ZXh0O1xuICAgICAgICBlcnJvciA9IG5ldyBDbHModmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgICAgaWYgKHZhbHVlLmNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIChlcnJvciBhcyBhbnkpLmNvbnRleHQgPSB2YWx1ZS5jb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZXJyb3IgYXMgYW55KS5jYXVzZSA9ICh2YWx1ZSBhcyBhbnkpLmNhdXNlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTdHJlYW1FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9TdHJlYW1FcnJvcicpXG4gICAgICBdO1xuICAgICAgbGV0IGVycm9yOiBFcnJvcjtcbiAgICAgIGlmICh0eXBlb2YgQ2xzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yID0gbmV3IENscyh2YWx1ZS5tZXNzYWdlLCB7XG4gICAgICAgICAgLi4uKCdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDoge30pLFxuICAgICAgICAgIHN0YXR1czogdmFsdWUuc3RhdHVzLFxuICAgICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5uYW1lID0gJ1N0cmVhbUVycm9yJztcbiAgICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIChlcnJvciBhcyBhbnkpLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgIT09IHVuZGVmaW5lZCkgKGVycm9yIGFzIGFueSkuc3RhdHVzID0gdmFsdWUuc3RhdHVzO1xuICAgICAgICBpZiAodmFsdWUudXJsICE9PSB1bmRlZmluZWQpIChlcnJvciBhcyBhbnkpLnVybCA9IHZhbHVlLnVybDtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgU3ludGF4RXJyb3I6IG1ha2VOYW1lZEVycm9yU3ViY2xhc3NSZXZpdmVyKCdTeW50YXhFcnJvcicpLFxuICAgIFR5cGVFcnJvcjogbWFrZU5hbWVkRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBtYWtlTmFtZWRFcnJvclN1YmNsYXNzUmV2aXZlcignVVJJRXJyb3InKSxcbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgIGVycm9yLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgKGVycm9yIGFzIGFueSkuY2F1c2UgPSAodmFsdWUgYXMgYW55KS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEZsb2F0MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBGbG9hdDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgRmxvYXQ2NEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgSW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgSW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgSW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIE1hcDogKHZhbHVlKSA9PiBuZXcgTWFwKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT4gbmV3IFJlZ0V4cCh2YWx1ZS5zb3VyY2UsIHZhbHVlLmZsYWdzKSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gbmV3IFNldCh2YWx1ZSksXG4gICAgVVJMOiAodmFsdWUpID0+IG5ldyBVUkwodmFsdWUpLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4gbmV3IFVSTFNlYXJjaFBhcmFtcyh2YWx1ZSA9PT0gJy4nID8gJycgOiB2YWx1ZSksXG4gICAgVWludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBVaW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgVWludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBVaW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIC8vIFdlYiBBUEkgdHlwZXM6IHJldml2ZWQgYXMgcGxhaW4gb2JqZWN0cyBpbiB0aGUgVk0gc2luY2UgdGhlIHJlYWxcbiAgICAvLyBjb25zdHJ1Y3RvcnMgKEhlYWRlcnMsIFJlcXVlc3QsIFJlc3BvbnNlKSBhcmUgbm90IGF2YWlsYWJsZSBpbiBRdWlja0pTLlxuICAgIC8vIFRoZSB3b3JrZmxvdyBjb2RlIGNhbiBhY2Nlc3MgdGhlIHByb3BlcnRpZXMgYnV0IG5vdCBjYWxsIFdlYiBBUEkgbWV0aG9kcy5cbiAgICBIZWFkZXJzOiAodmFsdWUpID0+IHtcbiAgICAgIHJldHVybiBuZXcgKGdsb2JhbFRoaXMgYXMgYW55KS5IZWFkZXJzKHZhbHVlKTtcbiAgICB9LFxuICAgIFJlcXVlc3Q6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICBjb25zdCBSZXEgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLlJlcXVlc3Q7XG4gICAgICBpZiAoUmVxKSB7XG4gICAgICAgIHZhbHVlLmpzb24gPSBSZXEucHJvdG90eXBlLmpzb247XG4gICAgICAgIHZhbHVlLnRleHQgPSBSZXEucHJvdG90eXBlLnRleHQ7XG4gICAgICAgIHZhbHVlLmFycmF5QnVmZmVyID0gUmVxLnByb3RvdHlwZS5hcnJheUJ1ZmZlcjtcbiAgICAgIH1cbiAgICAgIC8vIENhcnJ5IG92ZXIgdGhlIHdlYmhvb2sgcmVzcG9uc2Ugd3JpdGFibGUgc3RyZWFtIHRvIHRoZSBzeW1ib2wgcHJvcGVydHlcbiAgICAgIGlmICh2YWx1ZS5yZXNwb25zZVdyaXRhYmxlKSB7XG4gICAgICAgIHZhbHVlW1N5bWJvbC5mb3IoJ1dFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUnKV0gPSB2YWx1ZS5yZXNwb25zZVdyaXRhYmxlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgUmVzcG9uc2U6ICh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAvLyBEb24ndCB1c2UgT2JqZWN0LnNldFByb3RvdHlwZU9mOiBkZXZhbHVlIGNvbnRpbnVlcyB0byBzZXQgcHJvcGVydGllc1xuICAgICAgLy8gb24gdGhlIG9iamVjdCBhZnRlciB0aGUgcmV2aXZlciBydW5zLCBhbmQgZ2V0dGVyLW9ubHkgcHJvcGVydGllc1xuICAgICAgLy8gKGxpa2UgJ29rJykgb24gdGhlIHByb3RvdHlwZSB3b3VsZCBjYXVzZSBcIm5vIHNldHRlclwiIGVycm9ycy5cbiAgICAgIC8vIEluc3RlYWQsIGNvcHkgbWV0aG9kcyBkaXJlY3RseSBvbnRvIHRoZSBvYmplY3QuXG4gICAgICBjb25zdCBSZXNwID0gKGdsb2JhbFRoaXMgYXMgYW55KS5SZXNwb25zZTtcbiAgICAgIGlmIChSZXNwKSB7XG4gICAgICAgIHZhbHVlLmpzb24gPSBSZXNwLnByb3RvdHlwZS5qc29uO1xuICAgICAgICB2YWx1ZS50ZXh0ID0gUmVzcC5wcm90b3R5cGUudGV4dDtcbiAgICAgICAgdmFsdWUuYXJyYXlCdWZmZXIgPSBSZXNwLnByb3RvdHlwZS5hcnJheUJ1ZmZlcjtcbiAgICAgICAgaWYgKFJlc3AucHJvdG90eXBlLmJ5dGVzKSB2YWx1ZS5ieXRlcyA9IFJlc3AucHJvdG90eXBlLmJ5dGVzO1xuICAgICAgICBpZiAoUmVzcC5wcm90b3R5cGUuY2xvbmUpIHZhbHVlLmNsb25lID0gUmVzcC5wcm90b3R5cGUuY2xvbmU7XG4gICAgICB9XG4gICAgICB2YWx1ZS5fYm9keSA9IHZhbHVlLmJvZHk7XG4gICAgICB2YWx1ZS5vayA9IHZhbHVlLnN0YXR1cyA+PSAyMDAgJiYgdmFsdWUuc3RhdHVzIDwgMzAwO1xuICAgICAgdmFsdWUuYm9keVVzZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIFJlYWRhYmxlU3RyZWFtOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IFJTID0gKGdsb2JhbFRoaXMgYXMgYW55KS5SZWFkYWJsZVN0cmVhbTtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IE9iamVjdC5jcmVhdGUoUlMgPyBSUy5wcm90b3R5cGUgOiB7fSk7XG4gICAgICBpZiAodmFsdWUgJiYgJ2JvZHlJbml0JyBpbiB2YWx1ZSkge1xuICAgICAgICAvLyBCb2R5IGZyb20gUmVzcG9uc2UvUmVxdWVzdCBjb25zdHJ1Y3Rvcjogc3RvcmUgdGhlIHJhdyBkYXRhXG4gICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdCT0RZX0lOSVQnKV0gPSB2YWx1ZS5ib2R5SW5pdDtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgJ25hbWUnIGluIHZhbHVlKSB7XG4gICAgICAgIC8vIE5hbWVkIHN0cmVhbSByZWZlcmVuY2U6IHByZXNlcnZlIHRoZSBuYW1lL3R5cGUgZm9yIHJlLXNlcmlhbGl6YXRpb24uXG4gICAgICAgIC8vIFN0cmVhbXMgYXJlIG9wYXF1ZSBwb2ludGVycyBpbiB0aGUgVk07IHRoZXkgY2FuIGJlIHBhc3NlZCB0byBzdGVwc1xuICAgICAgICAvLyBidXQgbm90IGNvbnN1bWVkIGRpcmVjdGx5LlxuICAgICAgICBzdHJlYW1bU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX05BTUUnKV0gPSB2YWx1ZS5uYW1lO1xuICAgICAgICBpZiAodmFsdWUudHlwZSkgc3RyZWFtW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9UWVBFJyldID0gdmFsdWUudHlwZTtcbiAgICAgICAgaWYgKHZhbHVlLmZyYW1pbmcpIHtcbiAgICAgICAgICBzdHJlYW1bU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX0ZSQU1JTkcnKV0gPSB2YWx1ZS5mcmFtaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sXG4gICAgV3JpdGFibGVTdHJlYW06ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgV1MgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLldyaXRhYmxlU3RyZWFtO1xuICAgICAgY29uc3Qgc3RyZWFtID0gT2JqZWN0LmNyZWF0ZShXUyA/IFdTLnByb3RvdHlwZSA6IHt9KTtcbiAgICAgIGlmICh2YWx1ZSAmJiAnbmFtZScgaW4gdmFsdWUpIHtcbiAgICAgICAgc3RyZWFtW1N5bWJvbC5mb3IoJ1dPUktGTE9XX1NUUkVBTV9OQU1FJyldID0gdmFsdWUubmFtZTtcbiAgICAgIH1cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBmb3JlaWduIHJ1bklkL2RlcGxveW1lbnRJZCwgaWYgcHJlc2VudCwgc28gdGhhdCB3aGVuXG4gICAgICAvLyB0aGUgaGFuZGxlIGlzIGxhdGVyIHBhc3NlZCB0byBhIHN0ZXAgdGhlIHdvcmtmbG93IHJlZHVjZXIgY2FuXG4gICAgICAvLyBmb3J3YXJkIGl0IHRocm91Z2ggdG8gdGhlIHN0ZXAgcmV2aXZlciAoY3Jvc3MtcnVuIHdyaXRhYmxlXG4gICAgICAvLyBmb3J3YXJkaW5nIHZpYSBzdGFydCgpKS5cbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkucnVuSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHN0cmVhbVtTeW1ib2wuZm9yKCdXT1JLRkxPV19TVFJFQU1fU0VSVkVSX1JVTl9JRCcpXSA9IChcbiAgICAgICAgICB2YWx1ZSBhcyBhbnlcbiAgICAgICAgKS5ydW5JZDtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkuZGVwbG95bWVudElkID09PSAnc3RyaW5nJykge1xuICAgICAgICBzdHJlYW1bU3ltYm9sLmZvcignV09SS0ZMT1dfU1RSRUFNX1NFUlZFUl9ERVBMT1lNRU5UX0lEJyldID0gKFxuICAgICAgICAgIHZhbHVlIGFzIGFueVxuICAgICAgICApLmRlcGxveW1lbnRJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|