footprintjs 9.3.0 → 9.5.0
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/AGENTS.md +2 -1
- package/CLAUDE.md +2 -1
- package/dist/advanced.js +1 -1
- package/dist/esm/advanced.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +15 -2
- package/dist/esm/lib/capture/envelope.js +187 -0
- package/dist/esm/lib/capture/index.js +16 -0
- package/dist/esm/lib/capture/policies.js +29 -0
- package/dist/esm/lib/capture/summarize.js +58 -0
- package/dist/esm/lib/engine/handlers/ContinuationResolver.js +23 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +9 -1
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.js +62 -44
- package/dist/esm/lib/memory/index.js +2 -2
- package/dist/esm/lib/memory/types.js +7 -4
- package/dist/esm/lib/observer-queue/deferredDispatcher.js +226 -0
- package/dist/esm/lib/observer-queue/flushDriver.js +163 -0
- package/dist/esm/lib/observer-queue/index.js +22 -0
- package/dist/esm/lib/observer-queue/mergedQueue.js +91 -0
- package/dist/esm/lib/observer-queue/ring.js +122 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +13 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +20 -1
- package/dist/index.js +1 -1
- package/dist/lib/builder/FlowChartBuilder.js +15 -2
- package/dist/lib/capture/envelope.js +192 -0
- package/dist/lib/capture/index.js +23 -0
- package/dist/lib/capture/policies.js +30 -0
- package/dist/lib/capture/summarize.js +63 -0
- package/dist/lib/engine/handlers/ContinuationResolver.js +23 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +9 -1
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +63 -45
- package/dist/lib/memory/index.js +3 -2
- package/dist/lib/memory/types.js +10 -5
- package/dist/lib/observer-queue/deferredDispatcher.js +230 -0
- package/dist/lib/observer-queue/flushDriver.js +167 -0
- package/dist/lib/observer-queue/index.js +36 -0
- package/dist/lib/observer-queue/mergedQueue.js +95 -0
- package/dist/lib/observer-queue/ring.js +126 -0
- package/dist/lib/runner/ExecutionRuntime.js +13 -1
- package/dist/lib/runner/FlowChartExecutor.js +20 -1
- package/dist/types/advanced.d.ts +1 -1
- package/dist/types/index.d.ts +13 -0
- package/dist/types/lib/capture/envelope.d.ts +169 -0
- package/dist/types/lib/capture/index.d.ts +16 -0
- package/dist/types/lib/capture/policies.d.ts +42 -0
- package/dist/types/lib/capture/summarize.d.ts +65 -0
- package/dist/types/lib/engine/handlers/ContinuationResolver.d.ts +15 -2
- package/dist/types/lib/engine/types.d.ts +3 -0
- package/dist/types/lib/memory/StageContext.d.ts +38 -1
- package/dist/types/lib/memory/index.d.ts +2 -2
- package/dist/types/lib/memory/types.d.ts +33 -22
- package/dist/types/lib/observer-queue/deferredDispatcher.d.ts +169 -0
- package/dist/types/lib/observer-queue/flushDriver.d.ts +124 -0
- package/dist/types/lib/observer-queue/index.d.ts +25 -0
- package/dist/types/lib/observer-queue/mergedQueue.d.ts +85 -0
- package/dist/types/lib/observer-queue/ring.d.ts +99 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +11 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +43 -1
- package/package.json +1 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* capture/envelope.ts — RFC-001 Block 1: capture envelopes + payload summarizer.
|
|
4
|
+
*
|
|
5
|
+
* Pattern: Point-in-time capture. An observer event is snapshotted into a
|
|
6
|
+
* self-contained, immutable envelope at the moment it happens, so
|
|
7
|
+
* DELIVERY can be deferred (RFC-001 "one beat behind") without the
|
|
8
|
+
* payload drifting under later engine mutations.
|
|
9
|
+
* Role: The capture tier of the deferred-observer pipeline
|
|
10
|
+
* (`src/lib/observer-queue/`). Pure module — ZERO engine imports
|
|
11
|
+
* (only `capture/` internals); the engine wiring is RFC-001
|
|
12
|
+
* Blocks 6–10.
|
|
13
|
+
*
|
|
14
|
+
* Capture policies (RFC-001 §5):
|
|
15
|
+
* - `'summary'` — bounded, reference-free summarization via
|
|
16
|
+
* {@link summarizePayload}. Built on the SAME classification path as the
|
|
17
|
+
* retention markers in `summarize.ts` (#14 / #13c-A), extended with
|
|
18
|
+
* bounded structural descent. Structured-clone-safe by construction.
|
|
19
|
+
* - `'clone'` — `structuredClone` at capture time (the capture-tier
|
|
20
|
+
* spelling of retention `'full'` — see the mapping notes in
|
|
21
|
+
* `policies.ts`). If the payload is not clonable (functions, symbols,
|
|
22
|
+
* live handles), capture DEGRADES to `'summary'` and reports through the
|
|
23
|
+
* `warn` hook — a capture must never throw into the producer.
|
|
24
|
+
* - `'ref'` — pass-through of the live reference. The CALLER asserts
|
|
25
|
+
* immutability for the delivery window (safe e.g. for committed-state
|
|
26
|
+
* reads, proven immutable-after-swap in #13/#13b). Exempt from the
|
|
27
|
+
* clone-safety guarantee — see the dev-warn seam below.
|
|
28
|
+
*
|
|
29
|
+
* Dev-warn seam (resolves the isDevMode-would-be-an-engine-import problem):
|
|
30
|
+
* This module must not import `scope/detectCircular` (engine territory).
|
|
31
|
+
* Instead, `capture()` accepts {@link CaptureHooks} with an optional
|
|
32
|
+
* `warn` callback and invokes it on every `'ref'` capture and every
|
|
33
|
+
* `'clone'` degradation. The WIRING layer (Block 6) binds `warn` to an
|
|
34
|
+
* `isDevMode()`-gated, deduplicated console warner; the pure module stays
|
|
35
|
+
* engine-free and silent by default (no hooks ⇒ no warning, zero cost).
|
|
36
|
+
*
|
|
37
|
+
* Summarizer bounds (documented contract, exported as constants):
|
|
38
|
+
* - depth ≤ {@link PAYLOAD_SUMMARY_MAX_DEPTH} (3) — deeper structure
|
|
39
|
+
* collapses to a classified leaf with `depthClipped: true`.
|
|
40
|
+
* - breadth ≤ {@link PAYLOAD_SUMMARY_MAX_ENTRIES} (16) per object/array —
|
|
41
|
+
* the remainder is dropped and flagged `truncated: true` (the honest
|
|
42
|
+
* `size` still reports the real count).
|
|
43
|
+
* - total ≤ {@link PAYLOAD_SUMMARY_MAX_NODES} (128) summary nodes per
|
|
44
|
+
* payload — a global budget so wide×deep payloads stay O(1)-bounded.
|
|
45
|
+
* - string previews ≤ `SUMMARY_PREVIEW_LENGTH` (80) chars.
|
|
46
|
+
* Cycles are detected (ancestor set) and flagged `circular: true`;
|
|
47
|
+
* throwing getters yield a `'unreadable'` leaf; symbol-keyed properties
|
|
48
|
+
* are ignored (same as JSON / `Object.keys`); `Map`/`Set` are leaves with
|
|
49
|
+
* their REAL entry count (no descent — matches `summarize.ts`).
|
|
50
|
+
*/
|
|
51
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
|
+
exports.capture = exports.summarizePayload = exports.PAYLOAD_SUMMARY_MAX_NODES = exports.PAYLOAD_SUMMARY_MAX_ENTRIES = exports.PAYLOAD_SUMMARY_MAX_DEPTH = void 0;
|
|
53
|
+
const summarize_js_1 = require("./summarize.js");
|
|
54
|
+
/** Max nesting depth a payload summary descends before clipping. */
|
|
55
|
+
exports.PAYLOAD_SUMMARY_MAX_DEPTH = 3;
|
|
56
|
+
/** Max entries summarized per object/array level before truncating. */
|
|
57
|
+
exports.PAYLOAD_SUMMARY_MAX_ENTRIES = 16;
|
|
58
|
+
/** Global per-payload budget of summary nodes (wide×deep hard bound). */
|
|
59
|
+
exports.PAYLOAD_SUMMARY_MAX_NODES = 128;
|
|
60
|
+
/**
|
|
61
|
+
* Classify one value through the ONE classification path shared with the
|
|
62
|
+
* retention markers. GATE NOTE: Block 1 may not modify `summarize.ts`, so
|
|
63
|
+
* the module-private `classifyValue` is reached through its exported facade
|
|
64
|
+
* and the brand field is dropped by explicit copy — Block 6 may export
|
|
65
|
+
* `classifyValue` directly and inline this hop.
|
|
66
|
+
*/
|
|
67
|
+
function classifyLeaf(value) {
|
|
68
|
+
const marker = (0, summarize_js_1.summarizeWriteValue)(value);
|
|
69
|
+
const leaf = { type: marker.type };
|
|
70
|
+
if (marker.size !== undefined)
|
|
71
|
+
leaf.size = marker.size;
|
|
72
|
+
if (marker.preview !== undefined)
|
|
73
|
+
leaf.preview = marker.preview;
|
|
74
|
+
return leaf;
|
|
75
|
+
}
|
|
76
|
+
/** Read one child property, converting throwing getters into a leaf. */
|
|
77
|
+
function summarizeChild(parent, key, depth, budget, ancestors) {
|
|
78
|
+
let child;
|
|
79
|
+
try {
|
|
80
|
+
child = parent[key];
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return { type: 'unreadable', preview: '[getter threw during capture]' };
|
|
84
|
+
}
|
|
85
|
+
return summarizeNode(child, depth, budget, ancestors);
|
|
86
|
+
}
|
|
87
|
+
function summarizeNode(value, depth, budget, ancestors) {
|
|
88
|
+
budget.nodesLeft -= 1;
|
|
89
|
+
const leaf = classifyLeaf(value);
|
|
90
|
+
// Only plain containers descend. Map/Set stay leaves (real entry count
|
|
91
|
+
// already on `size` — matches summarize.ts); everything else is a leaf.
|
|
92
|
+
const container = (leaf.type === 'object' || leaf.type === 'array') && typeof value === 'object' && value !== null;
|
|
93
|
+
if (!container || value instanceof Map || value instanceof Set)
|
|
94
|
+
return leaf;
|
|
95
|
+
const obj = value;
|
|
96
|
+
if (ancestors.has(obj))
|
|
97
|
+
return { ...leaf, circular: true };
|
|
98
|
+
if (depth >= exports.PAYLOAD_SUMMARY_MAX_DEPTH)
|
|
99
|
+
return { ...leaf, depthClipped: true };
|
|
100
|
+
if (budget.nodesLeft <= 0)
|
|
101
|
+
return { ...leaf, truncated: true };
|
|
102
|
+
ancestors.add(obj);
|
|
103
|
+
try {
|
|
104
|
+
if (Array.isArray(value)) {
|
|
105
|
+
const limit = Math.min(value.length, exports.PAYLOAD_SUMMARY_MAX_ENTRIES);
|
|
106
|
+
const items = [];
|
|
107
|
+
let clipped = value.length > limit;
|
|
108
|
+
for (let i = 0; i < limit; i++) {
|
|
109
|
+
if (budget.nodesLeft <= 0) {
|
|
110
|
+
clipped = true;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
items.push(summarizeChild(value, i, depth + 1, budget, ancestors));
|
|
114
|
+
}
|
|
115
|
+
return clipped ? { ...leaf, items, truncated: true } : { ...leaf, items };
|
|
116
|
+
}
|
|
117
|
+
const keys = Object.keys(obj);
|
|
118
|
+
const limit = Math.min(keys.length, exports.PAYLOAD_SUMMARY_MAX_ENTRIES);
|
|
119
|
+
// Built via entries + fromEntries so hostile keys ('__proto__', ...)
|
|
120
|
+
// become own data properties — never prototype writes.
|
|
121
|
+
const entries = [];
|
|
122
|
+
let clipped = keys.length > limit;
|
|
123
|
+
for (let i = 0; i < limit; i++) {
|
|
124
|
+
if (budget.nodesLeft <= 0) {
|
|
125
|
+
clipped = true;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
entries.push([keys[i], summarizeChild(obj, keys[i], depth + 1, budget, ancestors)]);
|
|
129
|
+
}
|
|
130
|
+
const fields = Object.fromEntries(entries);
|
|
131
|
+
return clipped ? { ...leaf, fields, truncated: true } : { ...leaf, fields };
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
ancestors.delete(obj);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Produce a bounded, reference-free, structured-clone-safe summary of an
|
|
139
|
+
* arbitrary payload. Never throws; never holds a reference into the source
|
|
140
|
+
* value (every node is a fresh object whose fields are primitives). Bounds
|
|
141
|
+
* are documented in the module header.
|
|
142
|
+
*/
|
|
143
|
+
function summarizePayload(payload) {
|
|
144
|
+
const budget = { nodesLeft: exports.PAYLOAD_SUMMARY_MAX_NODES };
|
|
145
|
+
const root = summarizeNode(payload, 0, budget, new Set());
|
|
146
|
+
return { __payloadSummary: true, ...root };
|
|
147
|
+
}
|
|
148
|
+
exports.summarizePayload = summarizePayload;
|
|
149
|
+
/** Materialize the payload per policy — see the module header contract. */
|
|
150
|
+
function capturePayload(request, policy, hooks) {
|
|
151
|
+
if (policy === 'ref') {
|
|
152
|
+
hooks?.warn?.(`[footprintjs capture] 'ref' capture for ${request.channel}.${request.method} passes a LIVE reference ` +
|
|
153
|
+
'through deferred delivery — the caller asserts the payload is immutable until delivered.');
|
|
154
|
+
return request.payload;
|
|
155
|
+
}
|
|
156
|
+
if (policy === 'clone') {
|
|
157
|
+
try {
|
|
158
|
+
return structuredClone(request.payload);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
hooks?.warn?.(`[footprintjs capture] 'clone' capture for ${request.channel}.${request.method} failed ` +
|
|
162
|
+
"(structuredClone threw — unclonable payload); degraded to 'summary'.");
|
|
163
|
+
return summarizePayload(request.payload);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return summarizePayload(request.payload);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Capture one observer event into an immutable {@link CaptureEnvelope}.
|
|
170
|
+
*
|
|
171
|
+
* Guarantees:
|
|
172
|
+
* - Never throws into the producer (`'clone'` degradation, summarizer
|
|
173
|
+
* never-throws contract).
|
|
174
|
+
* - The returned envelope is shallow-frozen — `seq`/`channel`/... cannot
|
|
175
|
+
* be reassigned. Under `'summary'`/`'clone'` the payload holds no live
|
|
176
|
+
* reference into the source; under `'ref'` it intentionally does.
|
|
177
|
+
* - Default policy is `'summary'` (cheapest safe tier).
|
|
178
|
+
*/
|
|
179
|
+
function capture(request, policy = 'summary', hooks) {
|
|
180
|
+
const capturedAt = hooks?.now !== undefined ? hooks.now() : Date.now();
|
|
181
|
+
return Object.freeze({
|
|
182
|
+
seq: request.seq,
|
|
183
|
+
channel: request.channel,
|
|
184
|
+
method: request.method,
|
|
185
|
+
runtimeStageId: request.runtimeStageId,
|
|
186
|
+
runId: request.runId,
|
|
187
|
+
payload: capturePayload(request, policy, hooks),
|
|
188
|
+
capturedAt,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
exports.capture = capture;
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52ZWxvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvZW52ZWxvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7OztBQUVILGlEQUE0RTtBQWlFNUUsb0VBQW9FO0FBQ3ZELFFBQUEseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRTNDLHVFQUF1RTtBQUMxRCxRQUFBLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUU5Qyx5RUFBeUU7QUFDNUQsUUFBQSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUEwRDdDOzs7Ozs7R0FNRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQWM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxrQ0FBbUIsRUFBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBcUIsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3ZELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTO1FBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ2hFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FDckIsTUFBYyxFQUNkLEdBQW9CLEVBQ3BCLEtBQWEsRUFDYixNQUF1QixFQUN2QixTQUFzQjtJQUV0QixJQUFJLEtBQWMsQ0FBQztJQUNuQixJQUFJLENBQUM7UUFDSCxLQUFLLEdBQUksTUFBMkMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxZ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LEVBQUUsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQy9DLFVBQVU7S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBZkQsMEJBZUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGNhcHR1cmUvZW52ZWxvcGUudHMg4oCUIFJGQy0wMDEgQmxvY2sgMTogY2FwdHVyZSBlbnZlbG9wZXMgKyBwYXlsb2FkIHN1bW1hcml6ZXIuXG4gKlxuICogUGF0dGVybjogIFBvaW50LWluLXRpbWUgY2FwdHVyZS4gQW4gb2JzZXJ2ZXIgZXZlbnQgaXMgc25hcHNob3R0ZWQgaW50byBhXG4gKiAgICAgICAgICAgc2VsZi1jb250YWluZWQsIGltbXV0YWJsZSBlbnZlbG9wZSBhdCB0aGUgbW9tZW50IGl0IGhhcHBlbnMsIHNvXG4gKiAgICAgICAgICAgREVMSVZFUlkgY2FuIGJlIGRlZmVycmVkIChSRkMtMDAxIFwib25lIGJlYXQgYmVoaW5kXCIpIHdpdGhvdXQgdGhlXG4gKiAgICAgICAgICAgcGF5bG9hZCBkcmlmdGluZyB1bmRlciBsYXRlciBlbmdpbmUgbXV0YXRpb25zLlxuICogUm9sZTogICAgIFRoZSBjYXB0dXJlIHRpZXIgb2YgdGhlIGRlZmVycmVkLW9ic2VydmVyIHBpcGVsaW5lXG4gKiAgICAgICAgICAgKGBzcmMvbGliL29ic2VydmVyLXF1ZXVlL2ApLiBQdXJlIG1vZHVsZSDigJQgWkVSTyBlbmdpbmUgaW1wb3J0c1xuICogICAgICAgICAgIChvbmx5IGBjYXB0dXJlL2AgaW50ZXJuYWxzKTsgdGhlIGVuZ2luZSB3aXJpbmcgaXMgUkZDLTAwMVxuICogICAgICAgICAgIEJsb2NrcyA24oCTMTAuXG4gKlxuICogQ2FwdHVyZSBwb2xpY2llcyAoUkZDLTAwMSDCpzUpOlxuICogICAtIGAnc3VtbWFyeSdgIOKAlCBib3VuZGVkLCByZWZlcmVuY2UtZnJlZSBzdW1tYXJpemF0aW9uIHZpYVxuICogICAgIHtAbGluayBzdW1tYXJpemVQYXlsb2FkfS4gQnVpbHQgb24gdGhlIFNBTUUgY2xhc3NpZmljYXRpb24gcGF0aCBhcyB0aGVcbiAqICAgICByZXRlbnRpb24gbWFya2VycyBpbiBgc3VtbWFyaXplLnRzYCAoIzE0IC8gIzEzYy1BKSwgZXh0ZW5kZWQgd2l0aFxuICogICAgIGJvdW5kZWQgc3RydWN0dXJhbCBkZXNjZW50LiBTdHJ1Y3R1cmVkLWNsb25lLXNhZmUgYnkgY29uc3RydWN0aW9uLlxuICogICAtIGAnY2xvbmUnYCAgIOKAlCBgc3RydWN0dXJlZENsb25lYCBhdCBjYXB0dXJlIHRpbWUgKHRoZSBjYXB0dXJlLXRpZXJcbiAqICAgICBzcGVsbGluZyBvZiByZXRlbnRpb24gYCdmdWxsJ2Ag4oCUIHNlZSB0aGUgbWFwcGluZyBub3RlcyBpblxuICogICAgIGBwb2xpY2llcy50c2ApLiBJZiB0aGUgcGF5bG9hZCBpcyBub3QgY2xvbmFibGUgKGZ1bmN0aW9ucywgc3ltYm9scyxcbiAqICAgICBsaXZlIGhhbmRsZXMpLCBjYXB0dXJlIERFR1JBREVTIHRvIGAnc3VtbWFyeSdgIGFuZCByZXBvcnRzIHRocm91Z2ggdGhlXG4gKiAgICAgYHdhcm5gIGhvb2sg4oCUIGEgY2FwdHVyZSBtdXN0IG5ldmVyIHRocm93IGludG8gdGhlIHByb2R1Y2VyLlxuICogICAtIGAncmVmJ2AgICAgIOKAlCBwYXNzLXRocm91Z2ggb2YgdGhlIGxpdmUgcmVmZXJlbmNlLiBUaGUgQ0FMTEVSIGFzc2VydHNcbiAqICAgICBpbW11dGFiaWxpdHkgZm9yIHRoZSBkZWxpdmVyeSB3aW5kb3cgKHNhZmUgZS5nLiBmb3IgY29tbWl0dGVkLXN0YXRlXG4gKiAgICAgcmVhZHMsIHByb3ZlbiBpbW11dGFibGUtYWZ0ZXItc3dhcCBpbiAjMTMvIzEzYikuIEV4ZW1wdCBmcm9tIHRoZVxuICogICAgIGNsb25lLXNhZmV0eSBndWFyYW50ZWUg4oCUIHNlZSB0aGUgZGV2LXdhcm4gc2VhbSBiZWxvdy5cbiAqXG4gKiBEZXYtd2FybiBzZWFtIChyZXNvbHZlcyB0aGUgaXNEZXZNb2RlLXdvdWxkLWJlLWFuLWVuZ2luZS1pbXBvcnQgcHJvYmxlbSk6XG4gKiAgIFRoaXMgbW9kdWxlIG11c3Qgbm90IGltcG9ydCBgc2NvcGUvZGV0ZWN0Q2lyY3VsYXJgIChlbmdpbmUgdGVycml0b3J5KS5cbiAqICAgSW5zdGVhZCwgYGNhcHR1cmUoKWAgYWNjZXB0cyB7QGxpbmsgQ2FwdHVyZUhvb2tzfSB3aXRoIGFuIG9wdGlvbmFsXG4gKiAgIGB3YXJuYCBjYWxsYmFjayBhbmQgaW52b2tlcyBpdCBvbiBldmVyeSBgJ3JlZidgIGNhcHR1cmUgYW5kIGV2ZXJ5XG4gKiAgIGAnY2xvbmUnYCBkZWdyYWRhdGlvbi4gVGhlIFdJUklORyBsYXllciAoQmxvY2sgNikgYmluZHMgYHdhcm5gIHRvIGFuXG4gKiAgIGBpc0Rldk1vZGUoKWAtZ2F0ZWQsIGRlZHVwbGljYXRlZCBjb25zb2xlIHdhcm5lcjsgdGhlIHB1cmUgbW9kdWxlIHN0YXlzXG4gKiAgIGVuZ2luZS1mcmVlIGFuZCBzaWxlbnQgYnkgZGVmYXVsdCAobm8gaG9va3Mg4oeSIG5vIHdhcm5pbmcsIHplcm8gY29zdCkuXG4gKlxuICogU3VtbWFyaXplciBib3VuZHMgKGRvY3VtZW50ZWQgY29udHJhY3QsIGV4cG9ydGVkIGFzIGNvbnN0YW50cyk6XG4gKiAgIC0gZGVwdGggICDiiaQge0BsaW5rIFBBWUxPQURfU1VNTUFSWV9NQVhfREVQVEh9ICAgKDMpIOKAlCBkZWVwZXIgc3RydWN0dXJlXG4gKiAgICAgY29sbGFwc2VzIHRvIGEgY2xhc3NpZmllZCBsZWFmIHdpdGggYGRlcHRoQ2xpcHBlZDogdHJ1ZWAuXG4gKiAgIC0gYnJlYWR0aCDiiaQge0BsaW5rIFBBWUxPQURfU1VNTUFSWV9NQVhfRU5UUklFU30gKDE2KSBwZXIgb2JqZWN0L2FycmF5IOKAlFxuICogICAgIHRoZSByZW1haW5kZXIgaXMgZHJvcHBlZCBhbmQgZmxhZ2dlZCBgdHJ1bmNhdGVkOiB0cnVlYCAodGhlIGhvbmVzdFxuICogICAgIGBzaXplYCBzdGlsbCByZXBvcnRzIHRoZSByZWFsIGNvdW50KS5cbiAqICAgLSB0b3RhbCAgIOKJpCB7QGxpbmsgUEFZTE9BRF9TVU1NQVJZX01BWF9OT0RFU30gICAoMTI4KSBzdW1tYXJ5IG5vZGVzIHBlclxuICogICAgIHBheWxvYWQg4oCUIGEgZ2xvYmFsIGJ1ZGdldCBzbyB3aWRlw5dkZWVwIHBheWxvYWRzIHN0YXkgTygxKS1ib3VuZGVkLlxuICogICAtIHN0cmluZyBwcmV2aWV3cyDiiaQgYFNVTU1BUllfUFJFVklFV19MRU5HVEhgICg4MCkgY2hhcnMuXG4gKiAgIEN5Y2xlcyBhcmUgZGV0ZWN0ZWQgKGFuY2VzdG9yIHNldCkgYW5kIGZsYWdnZWQgYGNpcmN1bGFyOiB0cnVlYDtcbiAqICAgdGhyb3dpbmcgZ2V0dGVycyB5aWVsZCBhIGAndW5yZWFkYWJsZSdgIGxlYWY7IHN5bWJvbC1rZXllZCBwcm9wZXJ0aWVzXG4gKiAgIGFyZSBpZ25vcmVkIChzYW1lIGFzIEpTT04gLyBgT2JqZWN0LmtleXNgKTsgYE1hcGAvYFNldGAgYXJlIGxlYXZlcyB3aXRoXG4gKiAgIHRoZWlyIFJFQUwgZW50cnkgY291bnQgKG5vIGRlc2NlbnQg4oCUIG1hdGNoZXMgYHN1bW1hcml6ZS50c2ApLlxuICovXG5cbmltcG9ydCB7IHR5cGUgU3VtbWFyeVZhbHVlVHlwZSwgc3VtbWFyaXplV3JpdGVWYWx1ZSB9IGZyb20gJy4vc3VtbWFyaXplLmpzJztcblxuLyoqIFdoaWNoIG9ic2VydmVyIGNoYW5uZWwgcHJvZHVjZWQgYSBjYXB0dXJlZCBldmVudCAoUkZDLTAwMSDCpzUpLiAqL1xuZXhwb3J0IHR5cGUgQ2FwdHVyZUNoYW5uZWwgPSAnc2NvcGUnIHwgJ2Zsb3cnIHwgJ2VtaXQnO1xuXG4vKipcbiAqIEhvdyBhbiBldmVudCBwYXlsb2FkIGlzIG1hdGVyaWFsaXplZCBpbnRvIHRoZSBlbnZlbG9wZSAoUkZDLTAwMSDCpzUpLlxuICogU2VlIHRoZSBtb2R1bGUgaGVhZGVyIGZvciB0aGUgZnVsbCBwZXItcG9saWN5IGNvbnRyYWN0LlxuICovXG5leHBvcnQgdHlwZSBDYXB0dXJlUG9saWN5ID0gJ3N1bW1hcnknIHwgJ2Nsb25lJyB8ICdyZWYnO1xuXG4vKipcbiAqIEEgY2FwdHVyZWQgb2JzZXJ2ZXIgZXZlbnQg4oCUIHNlbGYtY29udGFpbmVkIGFuZCBpbW11dGFibGUgKHNoYWxsb3ctZnJvemVuXG4gKiBhdCBjcmVhdGlvbikuIGBzZXFgIGlzIHRoZSBhcnJpdmFsIHN0YW1wIGFzc2lnbmVkIGF0IGNhcHR1cmUgdW5kZXIgdGhlXG4gKiBzaW5nbGUgSlMgdGhyZWFkOiBpdCB0b3RhbGx5IG9yZGVycyBldmVudHMgQUNST1NTIGFsbCB0aHJlZSBjaGFubmVscywgaXNcbiAqIG1vbm90b25pYywgYW5kIGlzIGdhcC1kZXRlY3RhYmxlIChhIGRyb3BwZWQgZXZlbnQgbGVhdmVzIGEgdmlzaWJsZSBob2xlXG4gKiBpbiB0aGUgZGVsaXZlcmVkIGBzZXFgIHNlcXVlbmNlIOKAlCBob25lc3QgbG9zcyBhY2NvdW50aW5nKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlRW52ZWxvcGUge1xuICAvKiogQXJyaXZhbCBzdGFtcCDigJQgdG90YWwgb3JkZXIgYWNyb3NzIGNoYW5uZWxzOyBnYXBzIHJldmVhbCBkcm9wcy4gKi9cbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIC8qKiBQcm9kdWNpbmcgb2JzZXJ2ZXIgY2hhbm5lbC4gKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWw7XG4gIC8qKiBQcm9kdWNpbmcgaG9vayBuYW1lIOKAlCBgJ29uV3JpdGUnYCwgYCdvblN0YWdlRXhlY3V0ZWQnYCwgYCdvbkVtaXQnYCwgLi4uICovXG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICAvKiogVGhlIGV4ZWN1dGlvbiBzdGVwIHRoYXQgcHJvZHVjZWQgdGhlIGV2ZW50IChgc3RhZ2VJZCNleGVjdXRpb25JbmRleGApLiAqL1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVGhlIHJ1biB0aGF0IHByb2R1Y2VkIHRoZSBldmVudCAoQ29udmVudGlvbiA0IHBlci1ydW4gc2NvcGluZykuICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXIge0BsaW5rIENhcHR1cmVQb2xpY3l9IOKAlCBORVZFUiBhIGxpdmUgZW5naW5lIHJlZmVyZW5jZSB1bmRlclxuICAgKiBgJ3N1bW1hcnknYCAvIGAnY2xvbmUnYDsgdW5kZXIgYCdyZWYnYCB0aGUgY2FsbGVyIGFzc2VydGVkIGltbXV0YWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWQ6IHVua25vd247XG4gIC8qKiBDYXB0dXJlIHdhbGwtY2xvY2sgKG1zIGVwb2NoIGJ5IGRlZmF1bHQ7IGluamVjdGFibGUgdmlhIGhvb2tzLm5vdykuICovXG4gIHJlYWRvbmx5IGNhcHR1cmVkQXQ6IG51bWJlcjtcbn1cblxuLyoqIFRoZSByYXcgZXZlbnQgZGVzY3JpcHRpb24gaGFuZGVkIHRvIHtAbGluayBjYXB0dXJlfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZVJlcXVlc3Qge1xuICAvKiogQXJyaXZhbCBzdGFtcCDigJQgYXNzaWduZWQgYnkgdGhlIG1lcmdlZCBxdWV1ZSdzIGNvdW50ZXIgKEJsb2NrIDMpLiAqL1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbiAgcmVhZG9ubHkgY2hhbm5lbDogQ2FwdHVyZUNoYW5uZWw7XG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKiogVGhlIExJVkUgcGF5bG9hZCDigJQgYGNhcHR1cmUoKWAgbWF0ZXJpYWxpemVzIGl0IHBlciBwb2xpY3kuICovXG4gIHJlYWRvbmx5IHBheWxvYWQ6IHVua25vd247XG59XG5cbi8qKlxuICogRW5naW5lLWZyZWUgc2VhbXMgaW5qZWN0ZWQgYnkgdGhlIHdpcmluZyBsYXllciAoQmxvY2sgNikuIFRoZSBwdXJlIG1vZHVsZVxuICogbmV2ZXIgaW1wb3J0cyBkZXYtbW9kZSBvciBjbG9jayBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSG9va3Mge1xuICAvKipcbiAgICogRGlhZ25vc3RpYyBzaW5rIOKAlCBpbnZva2VkIG9uIGV2ZXJ5IGAncmVmJ2AgY2FwdHVyZSAoY2FsbGVyLWFzc2VydGVkXG4gICAqIGltbXV0YWJpbGl0eSkgYW5kIGV2ZXJ5IGAnY2xvbmUnYCDihpIgYCdzdW1tYXJ5J2AgZGVncmFkYXRpb24uIEJsb2NrIDZcbiAgICogYmluZHMgdGhpcyB0byBhbiBgaXNEZXZNb2RlKClgLWdhdGVkLCBkZWR1cGxpY2F0ZWQgd2FybmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgd2Fybj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDbG9jayBmb3IgYGNhcHR1cmVkQXRgIOKAlCBkZWZhdWx0cyB0byBgRGF0ZS5ub3dgLiBJbmplY3RhYmxlIGZvciB0ZXN0cy4gKi9cbiAgcmVhZG9ubHkgbm93PzogKCkgPT4gbnVtYmVyO1xufVxuXG4vKiogTWF4IG5lc3RpbmcgZGVwdGggYSBwYXlsb2FkIHN1bW1hcnkgZGVzY2VuZHMgYmVmb3JlIGNsaXBwaW5nLiAqL1xuZXhwb3J0IGNvbnN0IFBBWUxPQURfU1VNTUFSWV9NQVhfREVQVEggPSAzO1xuXG4vKiogTWF4IGVudHJpZXMgc3VtbWFyaXplZCBwZXIgb2JqZWN0L2FycmF5IGxldmVsIGJlZm9yZSB0cnVuY2F0aW5nLiAqL1xuZXhwb3J0IGNvbnN0IFBBWUxPQURfU1VNTUFSWV9NQVhfRU5UUklFUyA9IDE2O1xuXG4vKiogR2xvYmFsIHBlci1wYXlsb2FkIGJ1ZGdldCBvZiBzdW1tYXJ5IG5vZGVzICh3aWRlw5dkZWVwIGhhcmQgYm91bmQpLiAqL1xuZXhwb3J0IGNvbnN0IFBBWUxPQURfU1VNTUFSWV9NQVhfTk9ERVMgPSAxMjg7XG5cbi8qKlxuICogTGVhZiBjbGFzc2lmaWNhdGlvbiBmb3IgYSBzdW1tYXJ5IG5vZGUg4oCUIHRoZSBgc3VtbWFyaXplLnRzYCBmYW1pbHkgcGx1c1xuICogYCd1bnJlYWRhYmxlJ2AgZm9yIHByb3BlcnRpZXMgd2hvc2UgZ2V0dGVyIHRocmV3IGR1cmluZyBjYXB0dXJlLlxuICovXG5leHBvcnQgdHlwZSBQYXlsb2FkU3VtbWFyeVR5cGUgPSBTdW1tYXJ5VmFsdWVUeXBlIHwgJ3VucmVhZGFibGUnO1xuXG4vKipcbiAqIE9uZSBub2RlIG9mIGEgcGF5bG9hZCBzdW1tYXJ5IHRyZWUuIEV2ZXJ5IGZpZWxkIGlzIGEgcHJpbWl0aXZlLCBhIHBsYWluXG4gKiBvYmplY3QsIG9yIGEgcGxhaW4gYXJyYXkg4oCUIHN0cnVjdHVyZWQtY2xvbmUtc2FmZSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZFN1bW1hcnlOb2RlIHtcbiAgLyoqIENsYXNzaWZpY2F0aW9uIOKAlCBzYW1lIHJ1bGVzIGFzIHRoZSByZXRlbnRpb24gbWFya2VycyAob25lIGNvZGUgcGF0aCkuICovXG4gIHJlYWRvbmx5IHR5cGU6IFBheWxvYWRTdW1tYXJ5VHlwZTtcbiAgLyoqIEhvbmVzdCBzaXplIHByb3h5OiBzdHJpbmcgbGVuZ3RoLCBhcnJheSBsZW5ndGgsIG9yIGtleS9lbnRyeSBjb3VudC4gKi9cbiAgcmVhZG9ubHkgc2l6ZT86IG51bWJlcjtcbiAgLyoqIEZpcnN0IGBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIYCBjaGFycyDigJQgcHJpbWl0aXZlcy9zdHJpbmdzIG9ubHkuICovXG4gIHJlYWRvbmx5IHByZXZpZXc/OiBzdHJpbmc7XG4gIC8qKiBTdW1tYXJpemVkIG93biBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCBwcm9wZXJ0aWVzIChvYmplY3RzKS4gKi9cbiAgcmVhZG9ubHkgZmllbGRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUGF5bG9hZFN1bW1hcnlOb2RlPj47XG4gIC8qKiBTdW1tYXJpemVkIGxlYWRpbmcgaXRlbXMgKGFycmF5cykuICovXG4gIHJlYWRvbmx5IGl0ZW1zPzogcmVhZG9ubHkgUGF5bG9hZFN1bW1hcnlOb2RlW107XG4gIC8qKiBFbnRyaWVzIHdlcmUgb21pdHRlZCBoZXJlIChicmVhZHRoIGNhcCBvciBub2RlIGJ1ZGdldCkuICovXG4gIHJlYWRvbmx5IHRydW5jYXRlZD86IGJvb2xlYW47XG4gIC8qKiBUaGlzIHZhbHVlIGlzIGFuIGFuY2VzdG9yIG9mIGl0c2VsZiDigJQgZGVzY2VudCBzdG9wcGVkLiAqL1xuICByZWFkb25seSBjaXJjdWxhcj86IHRydWU7XG4gIC8qKiB7QGxpbmsgUEFZTE9BRF9TVU1NQVJZX01BWF9ERVBUSH0gcmVhY2hlZCDigJQgY2hpbGRyZW4gbm90IGRlc2NlbmRlZC4gKi9cbiAgcmVhZG9ubHkgZGVwdGhDbGlwcGVkPzogdHJ1ZTtcbn1cblxuLyoqXG4gKiBSb290IG9mIGEgcGF5bG9hZCBzdW1tYXJ5IOKAlCBicmFuZGVkIHNvIGNvbnN1bWVycyAoYW5kIHRlc3RzKSBjYW4gZGV0ZWN0XG4gKiB0aGF0IGEgcGF5bG9hZCB3YXMgc3VtbWFyaXplZCByYXRoZXIgdGhhbiBjbG9uZWQuIFNpYmxpbmcgb2YgdGhlXG4gKiBgX19yZWFkU3VtbWFyeWAgLyBgX193cml0ZVN1bW1hcnlgIHJldGVudGlvbiBtYXJrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRTdW1tYXJ5IGV4dGVuZHMgUGF5bG9hZFN1bW1hcnlOb2RlIHtcbiAgLyoqIERpc2NyaW1pbmFudCDigJQgYCdzdW1tYXJ5J2AtcG9saWN5IGVudmVsb3BlIHBheWxvYWRzIGNhcnJ5IHRoaXMuICovXG4gIHJlYWRvbmx5IF9fcGF5bG9hZFN1bW1hcnk6IHRydWU7XG59XG5cbi8qKiBNdXRhYmxlIGNvbnN0cnVjdGlvbiBzaGFwZSBmb3Ige0BsaW5rIFBheWxvYWRTdW1tYXJ5Tm9kZX0uICovXG5pbnRlcmZhY2UgU3VtbWFyeU5vZGVEcmFmdCB7XG4gIHR5cGU6IFBheWxvYWRTdW1tYXJ5VHlwZTtcbiAgc2l6ZT86IG51bWJlcjtcbiAgcHJldmlldz86IHN0cmluZztcbiAgZmllbGRzPzogUmVjb3JkPHN0cmluZywgUGF5bG9hZFN1bW1hcnlOb2RlPjtcbiAgaXRlbXM/OiBQYXlsb2FkU3VtbWFyeU5vZGVbXTtcbiAgdHJ1bmNhdGVkPzogYm9vbGVhbjtcbiAgY2lyY3VsYXI/OiB0cnVlO1xuICBkZXB0aENsaXBwZWQ/OiB0cnVlO1xufVxuXG4vKiogU2hhcmVkIG11dGFibGUgbm9kZSBidWRnZXQgZm9yIG9uZSB7QGxpbmsgc3VtbWFyaXplUGF5bG9hZH0gY2FsbC4gKi9cbmludGVyZmFjZSBTdW1tYXJpemVCdWRnZXQge1xuICBub2Rlc0xlZnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDbGFzc2lmeSBvbmUgdmFsdWUgdGhyb3VnaCB0aGUgT05FIGNsYXNzaWZpY2F0aW9uIHBhdGggc2hhcmVkIHdpdGggdGhlXG4gKiByZXRlbnRpb24gbWFya2Vycy4gR0FURSBOT1RFOiBCbG9jayAxIG1heSBub3QgbW9kaWZ5IGBzdW1tYXJpemUudHNgLCBzb1xuICogdGhlIG1vZHVsZS1wcml2YXRlIGBjbGFzc2lmeVZhbHVlYCBpcyByZWFjaGVkIHRocm91Z2ggaXRzIGV4cG9ydGVkIGZhY2FkZVxuICogYW5kIHRoZSBicmFuZCBmaWVsZCBpcyBkcm9wcGVkIGJ5IGV4cGxpY2l0IGNvcHkg4oCUIEJsb2NrIDYgbWF5IGV4cG9ydFxuICogYGNsYXNzaWZ5VmFsdWVgIGRpcmVjdGx5IGFuZCBpbmxpbmUgdGhpcyBob3AuXG4gKi9cbmZ1bmN0aW9uIGNsYXNzaWZ5TGVhZih2YWx1ZTogdW5rbm93bik6IFN1bW1hcnlOb2RlRHJhZnQge1xuICBjb25zdCBtYXJrZXIgPSBzdW1tYXJpemVXcml0ZVZhbHVlKHZhbHVlKTtcbiAgY29uc3QgbGVhZjogU3VtbWFyeU5vZGVEcmFmdCA9IHsgdHlwZTogbWFya2VyLnR5cGUgfTtcbiAgaWYgKG1hcmtlci5zaXplICE9PSB1bmRlZmluZWQpIGxlYWYuc2l6ZSA9IG1hcmtlci5zaXplO1xuICBpZiAobWFya2VyLnByZXZpZXcgIT09IHVuZGVmaW5lZCkgbGVhZi5wcmV2aWV3ID0gbWFya2VyLnByZXZpZXc7XG4gIHJldHVybiBsZWFmO1xufVxuXG4vKiogUmVhZCBvbmUgY2hpbGQgcHJvcGVydHksIGNvbnZlcnRpbmcgdGhyb3dpbmcgZ2V0dGVycyBpbnRvIGEgbGVhZi4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZUNoaWxkKFxuICBwYXJlbnQ6IG9iamVjdCxcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIsXG4gIGRlcHRoOiBudW1iZXIsXG4gIGJ1ZGdldDogU3VtbWFyaXplQnVkZ2V0LFxuICBhbmNlc3RvcnM6IFNldDxvYmplY3Q+LFxuKTogUGF5bG9hZFN1bW1hcnlOb2RlIHtcbiAgbGV0IGNoaWxkOiB1bmtub3duO1xuICB0cnkge1xuICAgIGNoaWxkID0gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCB1bmtub3duPilba2V5XTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ3VucmVhZGFibGUnLCBwcmV2aWV3OiAnW2dldHRlciB0aHJldyBkdXJpbmcgY2FwdHVyZV0nIH07XG4gIH1cbiAgcmV0dXJuIHN1bW1hcml6ZU5vZGUoY2hpbGQsIGRlcHRoLCBidWRnZXQsIGFuY2VzdG9ycyk7XG59XG5cbmZ1bmN0aW9uIHN1bW1hcml6ZU5vZGUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBkZXB0aDogbnVtYmVyLFxuICBidWRnZXQ6IFN1bW1hcml6ZUJ1ZGdldCxcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0Pixcbik6IFBheWxvYWRTdW1tYXJ5Tm9kZSB7XG4gIGJ1ZGdldC5ub2Rlc0xlZnQgLT0gMTtcbiAgY29uc3QgbGVhZiA9IGNsYXNzaWZ5TGVhZih2YWx1ZSk7XG5cbiAgLy8gT25seSBwbGFpbiBjb250YWluZXJzIGRlc2NlbmQuIE1hcC9TZXQgc3RheSBsZWF2ZXMgKHJlYWwgZW50cnkgY291bnRcbiAgLy8gYWxyZWFkeSBvbiBgc2l6ZWAg4oCUIG1hdGNoZXMgc3VtbWFyaXplLnRzKTsgZXZlcnl0aGluZyBlbHNlIGlzIGEgbGVhZi5cbiAgY29uc3QgY29udGFpbmVyID0gKGxlYWYudHlwZSA9PT0gJ29iamVjdCcgfHwgbGVhZi50eXBlID09PSAnYXJyYXknKSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xuICBpZiAoIWNvbnRhaW5lciB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIGxlYWY7XG5cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgb2JqZWN0O1xuICBpZiAoYW5jZXN0b3JzLmhhcyhvYmopKSByZXR1cm4geyAuLi5sZWFmLCBjaXJjdWxhcjogdHJ1ZSB9O1xuICBpZiAoZGVwdGggPj0gUEFZTE9BRF9TVU1NQVJZX01BWF9ERVBUSCkgcmV0dXJuIHsgLi4ubGVhZiwgZGVwdGhDbGlwcGVkOiB0cnVlIH07XG4gIGlmIChidWRnZXQubm9kZXNMZWZ0IDw9IDApIHJldHVybiB7IC4uLmxlYWYsIHRydW5jYXRlZDogdHJ1ZSB9O1xuXG4gIGFuY2VzdG9ycy5hZGQob2JqKTtcbiAgdHJ5IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4odmFsdWUubGVuZ3RoLCBQQVlMT0FEX1NVTU1BUllfTUFYX0VOVFJJRVMpO1xuICAgICAgY29uc3QgaXRlbXM6IFBheWxvYWRTdW1tYXJ5Tm9kZVtdID0gW107XG4gICAgICBsZXQgY2xpcHBlZCA9IHZhbHVlLmxlbmd0aCA+IGxpbWl0O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7XG4gICAgICAgIGlmIChidWRnZXQubm9kZXNMZWZ0IDw9IDApIHtcbiAgICAgICAgICBjbGlwcGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpdGVtcy5wdXNoKHN1bW1hcml6ZUNoaWxkKHZhbHVlLCBpLCBkZXB0aCArIDEsIGJ1ZGdldCwgYW5jZXN0b3JzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xpcHBlZCA/IHsgLi4ubGVhZiwgaXRlbXMsIHRydW5jYXRlZDogdHJ1ZSB9IDogeyAuLi5sZWFmLCBpdGVtcyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oa2V5cy5sZW5ndGgsIFBBWUxPQURfU1VNTUFSWV9NQVhfRU5UUklFUyk7XG4gICAgLy8gQnVpbHQgdmlhIGVudHJpZXMgKyBmcm9tRW50cmllcyBzbyBob3N0aWxlIGtleXMgKCdfX3Byb3RvX18nLCAuLi4pXG4gICAgLy8gYmVjb21lIG93biBkYXRhIHByb3BlcnRpZXMg4oCUIG5ldmVyIHByb3RvdHlwZSB3cml0ZXMuXG4gICAgY29uc3QgZW50cmllczogQXJyYXk8W3N0cmluZywgUGF5bG9hZFN1bW1hcnlOb2RlXT4gPSBbXTtcbiAgICBsZXQgY2xpcHBlZCA9IGtleXMubGVuZ3RoID4gbGltaXQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7XG4gICAgICBpZiAoYnVkZ2V0Lm5vZGVzTGVmdCA8PSAwKSB7XG4gICAgICAgIGNsaXBwZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGVudHJpZXMucHVzaChba2V5c1tpXSwgc3VtbWFyaXplQ2hpbGQob2JqLCBrZXlzW2ldLCBkZXB0aCArIDEsIGJ1ZGdldCwgYW5jZXN0b3JzKV0pO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG4gICAgcmV0dXJuIGNsaXBwZWQgPyB7IC4uLmxlYWYsIGZpZWxkcywgdHJ1bmNhdGVkOiB0cnVlIH0gOiB7IC4uLmxlYWYsIGZpZWxkcyB9O1xuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUob2JqKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2R1Y2UgYSBib3VuZGVkLCByZWZlcmVuY2UtZnJlZSwgc3RydWN0dXJlZC1jbG9uZS1zYWZlIHN1bW1hcnkgb2YgYW5cbiAqIGFyYml0cmFyeSBwYXlsb2FkLiBOZXZlciB0aHJvd3M7IG5ldmVyIGhvbGRzIGEgcmVmZXJlbmNlIGludG8gdGhlIHNvdXJjZVxuICogdmFsdWUgKGV2ZXJ5IG5vZGUgaXMgYSBmcmVzaCBvYmplY3Qgd2hvc2UgZmllbGRzIGFyZSBwcmltaXRpdmVzKS4gQm91bmRzXG4gKiBhcmUgZG9jdW1lbnRlZCBpbiB0aGUgbW9kdWxlIGhlYWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVBheWxvYWQocGF5bG9hZDogdW5rbm93bik6IFBheWxvYWRTdW1tYXJ5IHtcbiAgY29uc3QgYnVkZ2V0OiBTdW1tYXJpemVCdWRnZXQgPSB7IG5vZGVzTGVmdDogUEFZTE9BRF9TVU1NQVJZX01BWF9OT0RFUyB9O1xuICBjb25zdCByb290ID0gc3VtbWFyaXplTm9kZShwYXlsb2FkLCAwLCBidWRnZXQsIG5ldyBTZXQ8b2JqZWN0PigpKTtcbiAgcmV0dXJuIHsgX19wYXlsb2FkU3VtbWFyeTogdHJ1ZSwgLi4ucm9vdCB9O1xufVxuXG4vKiogTWF0ZXJpYWxpemUgdGhlIHBheWxvYWQgcGVyIHBvbGljeSDigJQgc2VlIHRoZSBtb2R1bGUgaGVhZGVyIGNvbnRyYWN0LiAqL1xuZnVuY3Rpb24gY2FwdHVyZVBheWxvYWQocmVxdWVzdDogQ2FwdHVyZVJlcXVlc3QsIHBvbGljeTogQ2FwdHVyZVBvbGljeSwgaG9va3M/OiBDYXB0dXJlSG9va3MpOiB1bmtub3duIHtcbiAgaWYgKHBvbGljeSA9PT0gJ3JlZicpIHtcbiAgICBob29rcz8ud2Fybj8uKFxuICAgICAgYFtmb290cHJpbnRqcyBjYXB0dXJlXSAncmVmJyBjYXB0dXJlIGZvciAke3JlcXVlc3QuY2hhbm5lbH0uJHtyZXF1ZXN0Lm1ldGhvZH0gcGFzc2VzIGEgTElWRSByZWZlcmVuY2UgYCArXG4gICAgICAgICd0aHJvdWdoIGRlZmVycmVkIGRlbGl2ZXJ5IOKAlCB0aGUgY2FsbGVyIGFzc2VydHMgdGhlIHBheWxvYWQgaXMgaW1tdXRhYmxlIHVudGlsIGRlbGl2ZXJlZC4nLFxuICAgICk7XG4gICAgcmV0dXJuIHJlcXVlc3QucGF5bG9hZDtcbiAgfVxuICBpZiAocG9saWN5ID09PSAnY2xvbmUnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUocmVxdWVzdC5wYXlsb2FkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGhvb2tzPy53YXJuPy4oXG4gICAgICAgIGBbZm9vdHByaW50anMgY2FwdHVyZV0gJ2Nsb25lJyBjYXB0dXJlIGZvciAke3JlcXVlc3QuY2hhbm5lbH0uJHtyZXF1ZXN0Lm1ldGhvZH0gZmFpbGVkIGAgK1xuICAgICAgICAgIFwiKHN0cnVjdHVyZWRDbG9uZSB0aHJldyDigJQgdW5jbG9uYWJsZSBwYXlsb2FkKTsgZGVncmFkZWQgdG8gJ3N1bW1hcnknLlwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzdW1tYXJpemVQYXlsb2FkKHJlcXVlc3QucGF5bG9hZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdW1tYXJpemVQYXlsb2FkKHJlcXVlc3QucGF5bG9hZCk7XG59XG5cbi8qKlxuICogQ2FwdHVyZSBvbmUgb2JzZXJ2ZXIgZXZlbnQgaW50byBhbiBpbW11dGFibGUge0BsaW5rIENhcHR1cmVFbnZlbG9wZX0uXG4gKlxuICogR3VhcmFudGVlczpcbiAqICAgLSBOZXZlciB0aHJvd3MgaW50byB0aGUgcHJvZHVjZXIgKGAnY2xvbmUnYCBkZWdyYWRhdGlvbiwgc3VtbWFyaXplclxuICogICAgIG5ldmVyLXRocm93cyBjb250cmFjdCkuXG4gKiAgIC0gVGhlIHJldHVybmVkIGVudmVsb3BlIGlzIHNoYWxsb3ctZnJvemVuIOKAlCBgc2VxYC9gY2hhbm5lbGAvLi4uIGNhbm5vdFxuICogICAgIGJlIHJlYXNzaWduZWQuIFVuZGVyIGAnc3VtbWFyeSdgL2AnY2xvbmUnYCB0aGUgcGF5bG9hZCBob2xkcyBubyBsaXZlXG4gKiAgICAgcmVmZXJlbmNlIGludG8gdGhlIHNvdXJjZTsgdW5kZXIgYCdyZWYnYCBpdCBpbnRlbnRpb25hbGx5IGRvZXMuXG4gKiAgIC0gRGVmYXVsdCBwb2xpY3kgaXMgYCdzdW1tYXJ5J2AgKGNoZWFwZXN0IHNhZmUgdGllcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlKFxuICByZXF1ZXN0OiBDYXB0dXJlUmVxdWVzdCxcbiAgcG9saWN5OiBDYXB0dXJlUG9saWN5ID0gJ3N1bW1hcnknLFxuICBob29rcz86IENhcHR1cmVIb29rcyxcbik6IENhcHR1cmVFbnZlbG9wZSB7XG4gIGNvbnN0IGNhcHR1cmVkQXQgPSBob29rcz8ubm93ICE9PSB1bmRlZmluZWQgPyBob29rcy5ub3coKSA6IERhdGUubm93KCk7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBzZXE6IHJlcXVlc3Quc2VxLFxuICAgIGNoYW5uZWw6IHJlcXVlc3QuY2hhbm5lbCxcbiAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgIHJ1bnRpbWVTdGFnZUlkOiByZXF1ZXN0LnJ1bnRpbWVTdGFnZUlkLFxuICAgIHJ1bklkOiByZXF1ZXN0LnJ1bklkLFxuICAgIHBheWxvYWQ6IGNhcHR1cmVQYXlsb2FkKHJlcXVlc3QsIHBvbGljeSwgaG9va3MpLFxuICAgIGNhcHR1cmVkQXQsXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* istanbul ignore file */
|
|
3
|
+
/**
|
|
4
|
+
* capture/ — Shared value-capture / retention primitives (zero deps, leaf
|
|
5
|
+
* module — `memory/` imports it, never the reverse).
|
|
6
|
+
*
|
|
7
|
+
* One home for "what do we keep about a tracked operation's value?":
|
|
8
|
+
* - `RetentionPolicy` — the `'full' | 'summary' | 'off'` family behind the
|
|
9
|
+
* #14 `readTracking` and #13c-A `writeTracking` dials.
|
|
10
|
+
* - `summarizeReadValue` / `summarizeWriteValue` — the parameterized
|
|
11
|
+
* summary-marker builders sharing one classification path.
|
|
12
|
+
*
|
|
13
|
+
* RFC-001 (deferred observer delivery) builds its capture tier on this
|
|
14
|
+
* module — see the mapping notes in `policies.ts`.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.summarizeWriteValue = exports.summarizeReadValue = exports.SUMMARY_PREVIEW_LENGTH = exports.READ_PREVIEW_LENGTH = void 0;
|
|
18
|
+
var summarize_js_1 = require("./summarize.js");
|
|
19
|
+
Object.defineProperty(exports, "READ_PREVIEW_LENGTH", { enumerable: true, get: function () { return summarize_js_1.READ_PREVIEW_LENGTH; } });
|
|
20
|
+
Object.defineProperty(exports, "SUMMARY_PREVIEW_LENGTH", { enumerable: true, get: function () { return summarize_js_1.SUMMARY_PREVIEW_LENGTH; } });
|
|
21
|
+
Object.defineProperty(exports, "summarizeReadValue", { enumerable: true, get: function () { return summarize_js_1.summarizeReadValue; } });
|
|
22
|
+
Object.defineProperty(exports, "summarizeWriteValue", { enumerable: true, get: function () { return summarize_js_1.summarizeWriteValue; } });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBCQUEwQjtBQUMxQjs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUlILCtDQUFzSDtBQUE3RyxtSEFBQSxtQkFBbUIsT0FBQTtBQUFFLHNIQUFBLHNCQUFzQixPQUFBO0FBQUUsa0hBQUEsa0JBQWtCLE9BQUE7QUFBRSxtSEFBQSxtQkFBbUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGlzdGFuYnVsIGlnbm9yZSBmaWxlICovXG4vKipcbiAqIGNhcHR1cmUvIOKAlCBTaGFyZWQgdmFsdWUtY2FwdHVyZSAvIHJldGVudGlvbiBwcmltaXRpdmVzICh6ZXJvIGRlcHMsIGxlYWZcbiAqIG1vZHVsZSDigJQgYG1lbW9yeS9gIGltcG9ydHMgaXQsIG5ldmVyIHRoZSByZXZlcnNlKS5cbiAqXG4gKiBPbmUgaG9tZSBmb3IgXCJ3aGF0IGRvIHdlIGtlZXAgYWJvdXQgYSB0cmFja2VkIG9wZXJhdGlvbidzIHZhbHVlP1wiOlxuICogICAtIGBSZXRlbnRpb25Qb2xpY3lgIOKAlCB0aGUgYCdmdWxsJyB8ICdzdW1tYXJ5JyB8ICdvZmYnYCBmYW1pbHkgYmVoaW5kIHRoZVxuICogICAgICMxNCBgcmVhZFRyYWNraW5nYCBhbmQgIzEzYy1BIGB3cml0ZVRyYWNraW5nYCBkaWFscy5cbiAqICAgLSBgc3VtbWFyaXplUmVhZFZhbHVlYCAvIGBzdW1tYXJpemVXcml0ZVZhbHVlYCDigJQgdGhlIHBhcmFtZXRlcml6ZWRcbiAqICAgICBzdW1tYXJ5LW1hcmtlciBidWlsZGVycyBzaGFyaW5nIG9uZSBjbGFzc2lmaWNhdGlvbiBwYXRoLlxuICpcbiAqIFJGQy0wMDEgKGRlZmVycmVkIG9ic2VydmVyIGRlbGl2ZXJ5KSBidWlsZHMgaXRzIGNhcHR1cmUgdGllciBvbiB0aGlzXG4gKiBtb2R1bGUg4oCUIHNlZSB0aGUgbWFwcGluZyBub3RlcyBpbiBgcG9saWNpZXMudHNgLlxuICovXG5cbmV4cG9ydCB0eXBlIHsgUmV0ZW50aW9uUG9saWN5IH0gZnJvbSAnLi9wb2xpY2llcy5qcyc7XG5leHBvcnQgdHlwZSB7IFJlYWRTdW1tYXJ5TWFya2VyLCBTdW1tYXJ5VmFsdWVUeXBlLCBXcml0ZVN1bW1hcnlNYXJrZXIgfSBmcm9tICcuL3N1bW1hcml6ZS5qcyc7XG5leHBvcnQgeyBSRUFEX1BSRVZJRVdfTEVOR1RILCBTVU1NQVJZX1BSRVZJRVdfTEVOR1RILCBzdW1tYXJpemVSZWFkVmFsdWUsIHN1bW1hcml6ZVdyaXRlVmFsdWUgfSBmcm9tICcuL3N1bW1hcml6ZS5qcyc7XG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* policies.ts — The retention policy family shared by every snapshot-tracking
|
|
4
|
+
* dial (#14 `readTracking`, #13c-A `writeTracking`).
|
|
5
|
+
*
|
|
6
|
+
* RETENTION answers "what does the engine KEEP in its own snapshot state
|
|
7
|
+
* (`StageSnapshot.stageReads` / `stageWrites`, and therefore the commit
|
|
8
|
+
* observer's mutations payload) after the moment of the operation?" It is
|
|
9
|
+
* distinct from DELIVERY — what an observer receives at event time
|
|
10
|
+
* (`ScopeRecorder.onRead`/`onWrite` always deliver the live value, in every
|
|
11
|
+
* retention mode).
|
|
12
|
+
*
|
|
13
|
+
* ── RFC-001 (deferred observer delivery) mapping ──────────────────────────
|
|
14
|
+
* RFC-001's capture tier uses the vocabulary `'clone' | 'summary' | 'ref'`.
|
|
15
|
+
* When its Block 1 lands it builds on THIS module:
|
|
16
|
+
*
|
|
17
|
+
* - RFC capture `'clone'` ≈ retention `'full'` (alias at the module
|
|
18
|
+
* boundary — same semantics: structuredClone at capture time).
|
|
19
|
+
* - RFC capture `'summary'` ≈ retention `'summary'` (same marker shapes —
|
|
20
|
+
* see `summarize.ts`).
|
|
21
|
+
* - RFC capture `'ref'` is DELIVERY-tier only and is NOT implemented here
|
|
22
|
+
* — reserved. Retention must never hold live references into engine
|
|
23
|
+
* state: retained entries outlive the stage (the execution tree keeps
|
|
24
|
+
* them for the whole run), while a `'ref'` is only safe within the
|
|
25
|
+
* immutability window of the captured value. Holding one in retention
|
|
26
|
+
* would either pin state generations (the #18 leak) or expose
|
|
27
|
+
* later-mutated values as if they were point-in-time captures.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcG9saWNpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcG9saWNpZXMudHMg4oCUIFRoZSByZXRlbnRpb24gcG9saWN5IGZhbWlseSBzaGFyZWQgYnkgZXZlcnkgc25hcHNob3QtdHJhY2tpbmdcbiAqIGRpYWwgKCMxNCBgcmVhZFRyYWNraW5nYCwgIzEzYy1BIGB3cml0ZVRyYWNraW5nYCkuXG4gKlxuICogUkVURU5USU9OIGFuc3dlcnMgXCJ3aGF0IGRvZXMgdGhlIGVuZ2luZSBLRUVQIGluIGl0cyBvd24gc25hcHNob3Qgc3RhdGVcbiAqIChgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAvIGBzdGFnZVdyaXRlc2AsIGFuZCB0aGVyZWZvcmUgdGhlIGNvbW1pdFxuICogb2JzZXJ2ZXIncyBtdXRhdGlvbnMgcGF5bG9hZCkgYWZ0ZXIgdGhlIG1vbWVudCBvZiB0aGUgb3BlcmF0aW9uP1wiIEl0IGlzXG4gKiBkaXN0aW5jdCBmcm9tIERFTElWRVJZIOKAlCB3aGF0IGFuIG9ic2VydmVyIHJlY2VpdmVzIGF0IGV2ZW50IHRpbWVcbiAqIChgU2NvcGVSZWNvcmRlci5vblJlYWRgL2BvbldyaXRlYCBhbHdheXMgZGVsaXZlciB0aGUgbGl2ZSB2YWx1ZSwgaW4gZXZlcnlcbiAqIHJldGVudGlvbiBtb2RlKS5cbiAqXG4gKiDilIDilIAgUkZDLTAwMSAoZGVmZXJyZWQgb2JzZXJ2ZXIgZGVsaXZlcnkpIG1hcHBpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBSRkMtMDAxJ3MgY2FwdHVyZSB0aWVyIHVzZXMgdGhlIHZvY2FidWxhcnkgYCdjbG9uZScgfCAnc3VtbWFyeScgfCAncmVmJ2AuXG4gKiBXaGVuIGl0cyBCbG9jayAxIGxhbmRzIGl0IGJ1aWxkcyBvbiBUSElTIG1vZHVsZTpcbiAqXG4gKiAgIC0gUkZDIGNhcHR1cmUgYCdjbG9uZSdgICAg4omIIHJldGVudGlvbiBgJ2Z1bGwnYCAoYWxpYXMgYXQgdGhlIG1vZHVsZVxuICogICAgIGJvdW5kYXJ5IOKAlCBzYW1lIHNlbWFudGljczogc3RydWN0dXJlZENsb25lIGF0IGNhcHR1cmUgdGltZSkuXG4gKiAgIC0gUkZDIGNhcHR1cmUgYCdzdW1tYXJ5J2Ag4omIIHJldGVudGlvbiBgJ3N1bW1hcnknYCAoc2FtZSBtYXJrZXIgc2hhcGVzIOKAlFxuICogICAgIHNlZSBgc3VtbWFyaXplLnRzYCkuXG4gKiAgIC0gUkZDIGNhcHR1cmUgYCdyZWYnYCBpcyBERUxJVkVSWS10aWVyIG9ubHkgYW5kIGlzIE5PVCBpbXBsZW1lbnRlZCBoZXJlXG4gKiAgICAg4oCUIHJlc2VydmVkLiBSZXRlbnRpb24gbXVzdCBuZXZlciBob2xkIGxpdmUgcmVmZXJlbmNlcyBpbnRvIGVuZ2luZVxuICogICAgIHN0YXRlOiByZXRhaW5lZCBlbnRyaWVzIG91dGxpdmUgdGhlIHN0YWdlICh0aGUgZXhlY3V0aW9uIHRyZWUga2VlcHNcbiAqICAgICB0aGVtIGZvciB0aGUgd2hvbGUgcnVuKSwgd2hpbGUgYSBgJ3JlZidgIGlzIG9ubHkgc2FmZSB3aXRoaW4gdGhlXG4gKiAgICAgaW1tdXRhYmlsaXR5IHdpbmRvdyBvZiB0aGUgY2FwdHVyZWQgdmFsdWUuIEhvbGRpbmcgb25lIGluIHJldGVudGlvblxuICogICAgIHdvdWxkIGVpdGhlciBwaW4gc3RhdGUgZ2VuZXJhdGlvbnMgKHRoZSAjMTggbGVhaykgb3IgZXhwb3NlXG4gKiAgICAgbGF0ZXItbXV0YXRlZCB2YWx1ZXMgYXMgaWYgdGhleSB3ZXJlIHBvaW50LWluLXRpbWUgY2FwdHVyZXMuXG4gKi9cblxuLyoqXG4gKiBIb3cgYSB0cmFja2VkIG9wZXJhdGlvbidzIHZhbHVlIGlzIHJldGFpbmVkIGluIHRoZSBwZXItc3RhZ2Ugc25hcHNob3Qgdmlldy5cbiAqXG4gKiAtIGAnZnVsbCdgIOKAlCBgc3RydWN0dXJlZENsb25lYCB0aGUgdmFsdWUgYXQgdGhlIG1vbWVudCBvZiB0aGUgb3BlcmF0aW9uXG4gKiAgICh0aGUgaGlzdG9yaWNhbCBkZWZhdWx0IGZvciBib3RoIGRpYWxzOyBwb2ludC1pbi10aW1lLCBkZXRhY2hlZCBjb3B5KS5cbiAqIC0gYCdzdW1tYXJ5J2Ag4oCUIHJldGFpbiBhIGNoZWFwIG1hcmtlciAodHlwZSArIHNpemUgcHJveHkgKyBzaG9ydCBwcmV2aWV3KVxuICogICBpbnN0ZWFkIG9mIHRoZSB2YWx1ZS4gTygxKS1pc2ggcGVyIG9wZXJhdGlvbjsgbm8gdmFsdWUgY2xvbmUuXG4gKiAtIGAnb2ZmJ2Ag4oCUIHJldGFpbiBub3RoaW5nLiBUaGUgb3BlcmF0aW9uIGl0c2VsZiBpcyB1bmFmZmVjdGVkIChyZWFkc1xuICogICBzdGlsbCByZXR1cm4gdmFsdWVzLCB3cml0ZXMgc3RpbGwgY29tbWl0KTsgb25seSB0aGUgc25hcHNob3QgYm9va2tlZXBpbmdcbiAqICAgaXMgc2tpcHBlZC5cbiAqXG4gKiBgUmVhZFRyYWNraW5nTW9kZWAgKCMxNCkgYW5kIGBXcml0ZVRyYWNraW5nTW9kZWAgKCMxM2MtQSkgYXJlIHB1YmxpY1xuICogYWxpYXNlcyBvZiB0aGlzIHR5cGUg4oCUIHNlZSBgbWVtb3J5L3R5cGVzLnRzYC5cbiAqL1xuZXhwb3J0IHR5cGUgUmV0ZW50aW9uUG9saWN5ID0gJ2Z1bGwnIHwgJ3N1bW1hcnknIHwgJ29mZic7XG4iXX0=
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* summarize.ts — Cheap value summarization for `'summary'` retention.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `StageContext` (#14's `summarizeReadValue`) into a shared,
|
|
6
|
+
* brand-parameterized helper so both snapshot-tracking dials (#14
|
|
7
|
+
* `readTracking`, #13c-A `writeTracking`) — and later RFC-001's deferred
|
|
8
|
+
* observer capture tier — produce identical summaries from ONE code path.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately avoids every O(value) operation: no clone, no serialization.
|
|
11
|
+
* See {@link ReadSummaryMarker} for the honest-cost contract.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.summarizeWriteValue = exports.summarizeReadValue = exports.READ_PREVIEW_LENGTH = exports.SUMMARY_PREVIEW_LENGTH = void 0;
|
|
15
|
+
/** Max characters captured in a summary marker's `preview`. */
|
|
16
|
+
exports.SUMMARY_PREVIEW_LENGTH = 80;
|
|
17
|
+
/**
|
|
18
|
+
* Compat alias for {@link SUMMARY_PREVIEW_LENGTH} — the name shipped with
|
|
19
|
+
* #14, kept so existing import paths (`memory/types`, the memory barrel)
|
|
20
|
+
* stay valid. Same constant; reads and writes share one preview cap.
|
|
21
|
+
*/
|
|
22
|
+
exports.READ_PREVIEW_LENGTH = exports.SUMMARY_PREVIEW_LENGTH;
|
|
23
|
+
/**
|
|
24
|
+
* The one classification path both brands share — every per-type rule
|
|
25
|
+
* (including the Map/Set real-entry-count handling) lives here exactly once.
|
|
26
|
+
*/
|
|
27
|
+
function classifyValue(value) {
|
|
28
|
+
if (value === null)
|
|
29
|
+
return { type: 'null' };
|
|
30
|
+
if (typeof value === 'string') {
|
|
31
|
+
return { type: 'string', size: value.length, preview: value.slice(0, exports.SUMMARY_PREVIEW_LENGTH) };
|
|
32
|
+
}
|
|
33
|
+
if (Array.isArray(value))
|
|
34
|
+
return { type: 'array', size: value.length };
|
|
35
|
+
if (value instanceof Map || value instanceof Set) {
|
|
36
|
+
// Object.keys() on a Map/Set is always [] — report the real entry count.
|
|
37
|
+
return { type: 'object', size: value.size };
|
|
38
|
+
}
|
|
39
|
+
if (typeof value === 'object') {
|
|
40
|
+
return { type: 'object', size: Object.keys(value).length };
|
|
41
|
+
}
|
|
42
|
+
if (typeof value === 'function')
|
|
43
|
+
return { type: 'function' };
|
|
44
|
+
// number | boolean | bigint | symbol — String() is O(rendered length)
|
|
45
|
+
return { type: typeof value, preview: String(value).slice(0, exports.SUMMARY_PREVIEW_LENGTH) };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Summarize a tracked READ for `readTracking: 'summary'` (#14). Byte-identical
|
|
49
|
+
* output to the pre-extraction `StageContext`-local implementation.
|
|
50
|
+
*/
|
|
51
|
+
function summarizeReadValue(value) {
|
|
52
|
+
return { __readSummary: true, ...classifyValue(value) };
|
|
53
|
+
}
|
|
54
|
+
exports.summarizeReadValue = summarizeReadValue;
|
|
55
|
+
/**
|
|
56
|
+
* Summarize a tracked WRITE for `writeTracking: 'summary'` (#13c-A). Sibling
|
|
57
|
+
* of {@link summarizeReadValue} — same classification, distinct brand.
|
|
58
|
+
*/
|
|
59
|
+
function summarizeWriteValue(value) {
|
|
60
|
+
return { __writeSummary: true, ...classifyValue(value) };
|
|
61
|
+
}
|
|
62
|
+
exports.summarizeWriteValue = summarizeWriteValue;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3N1bW1hcml6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBRUgsK0RBQStEO0FBQ2xELFFBQUEsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBRXpDOzs7O0dBSUc7QUFDVSxRQUFBLG1CQUFtQixHQUFHLDhCQUFzQixDQUFDO0FBa0QxRDs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLDhCQUFzQixDQUFDLEVBQUUsQ0FBQztJQUNqRyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkUsSUFBSSxLQUFLLFlBQVksR0FBRyxJQUFJLEtBQUssWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNqRCx5RUFBeUU7UUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFnQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssVUFBVTtRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDN0Qsc0VBQXNFO0lBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxLQUF5QixFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSw4QkFBc0IsQ0FBQyxFQUFFLENBQUM7QUFDN0csQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLEtBQWM7SUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFjO0lBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDM0QsQ0FBQztBQUZELGtEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzdW1tYXJpemUudHMg4oCUIENoZWFwIHZhbHVlIHN1bW1hcml6YXRpb24gZm9yIGAnc3VtbWFyeSdgIHJldGVudGlvbi5cbiAqXG4gKiBFeHRyYWN0ZWQgZnJvbSBgU3RhZ2VDb250ZXh0YCAoIzE0J3MgYHN1bW1hcml6ZVJlYWRWYWx1ZWApIGludG8gYSBzaGFyZWQsXG4gKiBicmFuZC1wYXJhbWV0ZXJpemVkIGhlbHBlciBzbyBib3RoIHNuYXBzaG90LXRyYWNraW5nIGRpYWxzICgjMTRcbiAqIGByZWFkVHJhY2tpbmdgLCAjMTNjLUEgYHdyaXRlVHJhY2tpbmdgKSDigJQgYW5kIGxhdGVyIFJGQy0wMDEncyBkZWZlcnJlZFxuICogb2JzZXJ2ZXIgY2FwdHVyZSB0aWVyIOKAlCBwcm9kdWNlIGlkZW50aWNhbCBzdW1tYXJpZXMgZnJvbSBPTkUgY29kZSBwYXRoLlxuICpcbiAqIERlbGliZXJhdGVseSBhdm9pZHMgZXZlcnkgTyh2YWx1ZSkgb3BlcmF0aW9uOiBubyBjbG9uZSwgbm8gc2VyaWFsaXphdGlvbi5cbiAqIFNlZSB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9IGZvciB0aGUgaG9uZXN0LWNvc3QgY29udHJhY3QuXG4gKi9cblxuLyoqIE1heCBjaGFyYWN0ZXJzIGNhcHR1cmVkIGluIGEgc3VtbWFyeSBtYXJrZXIncyBgcHJldmlld2AuICovXG5leHBvcnQgY29uc3QgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSCA9IDgwO1xuXG4vKipcbiAqIENvbXBhdCBhbGlhcyBmb3Ige0BsaW5rIFNVTU1BUllfUFJFVklFV19MRU5HVEh9IOKAlCB0aGUgbmFtZSBzaGlwcGVkIHdpdGhcbiAqICMxNCwga2VwdCBzbyBleGlzdGluZyBpbXBvcnQgcGF0aHMgKGBtZW1vcnkvdHlwZXNgLCB0aGUgbWVtb3J5IGJhcnJlbClcbiAqIHN0YXkgdmFsaWQuIFNhbWUgY29uc3RhbnQ7IHJlYWRzIGFuZCB3cml0ZXMgc2hhcmUgb25lIHByZXZpZXcgY2FwLlxuICovXG5leHBvcnQgY29uc3QgUkVBRF9QUkVWSUVXX0xFTkdUSCA9IFNVTU1BUllfUFJFVklFV19MRU5HVEg7XG5cbi8qKiBgdHlwZW9mYCByZXN1bHQsIHJlZmluZWQgdG8gJ2FycmF5JyAvICdudWxsJyBmb3Igb2JqZWN0cy4gKi9cbmV4cG9ydCB0eXBlIFN1bW1hcnlWYWx1ZVR5cGUgPVxuICB8ICdzdHJpbmcnXG4gIHwgJ251bWJlcidcbiAgfCAnYm9vbGVhbidcbiAgfCAnYmlnaW50J1xuICB8ICdzeW1ib2wnXG4gIHwgJ2Z1bmN0aW9uJ1xuICB8ICdvYmplY3QnXG4gIHwgJ2FycmF5J1xuICB8ICdudWxsJztcblxuLyoqIEJyYW5kLWZyZWUgc3VtbWFyeSBmaWVsZHMgc2hhcmVkIGJ5IGJvdGggbWFya2VyIHNoYXBlcy4gKi9cbmludGVyZmFjZSBWYWx1ZVN1bW1hcnkge1xuICAvKiogYHR5cGVvZmAgcmVzdWx0LCByZWZpbmVkIHRvICdhcnJheScgLyAnbnVsbCcgZm9yIG9iamVjdHMuICovXG4gIHR5cGU6IFN1bW1hcnlWYWx1ZVR5cGU7XG4gIC8qKiBTaXplIHByb3h5OiBzdHJpbmcgbGVuZ3RoLCBhcnJheSBsZW5ndGgsIG9yIG9iamVjdCBrZXkgY291bnQuICovXG4gIHNpemU/OiBudW1iZXI7XG4gIC8qKiBGaXJzdCB7QGxpbmsgU1VNTUFSWV9QUkVWSUVXX0xFTkdUSH0gY2hhcnMg4oCUIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3Mgb25seS4gKi9cbiAgcHJldmlldz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBNYXJrZXIgcmVjb3JkZWQgaW4gYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgdW5kZXIgYHJlYWRUcmFja2luZzogJ3N1bW1hcnknYC5cbiAqXG4gKiBIb25lc3QgY29zdCBub3RlOiBgc2l6ZWAgaXMgYSBjaGVhcCBwcm94eSAoc3RyaW5nIGxlbmd0aCAvIGFycmF5IGxlbmd0aCAvXG4gKiBvYmplY3Qga2V5IGNvdW50KSwgTk9UIGEgc2VyaWFsaXplZCBieXRlIGNvdW50IOKAlCBjb21wdXRpbmcgcmVhbCBieXRlIHNpemVcbiAqIHdvdWxkIHJlcXVpcmUgYW4gTyh2YWx1ZSkgc2VyaWFsaXphdGlvbiwgd2hpY2ggaXMgZXhhY3RseSB0aGUgY29zdCB0aGVcbiAqIHN1bW1hcnkgbW9kZSByZW1vdmVzLiBgcHJldmlld2AgaXMgb25seSBwcm9kdWNlZCBmb3IgcHJpbWl0aXZlcyBhbmQgc3RyaW5nc1xuICogKGZpcnN0IHtAbGluayBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIfSBjaGFyYWN0ZXJzKTsgb2JqZWN0cyBhbmQgYXJyYXlzIGNhcnJ5XG4gKiBubyBwcmV2aWV3IGZvciB0aGUgc2FtZSByZWFzb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZFN1bW1hcnlNYXJrZXIgZXh0ZW5kcyBWYWx1ZVN1bW1hcnkge1xuICAvKiogRGlzY3JpbWluYW50IOKAlCBsZXRzIHNuYXBzaG90IGNvbnN1bWVycyBkZXRlY3QgbWFya2VyIGVudHJpZXMuICovXG4gIF9fcmVhZFN1bW1hcnk6IHRydWU7XG59XG5cbi8qKlxuICogTWFya2VyIHJlY29yZGVkIGluIGBTdGFnZVNuYXBzaG90LnN0YWdlV3JpdGVzYCAoYW5kIHRoZSBjb21taXQgb2JzZXJ2ZXInc1xuICogbXV0YXRpb25zIHBheWxvYWQpIHVuZGVyIGB3cml0ZVRyYWNraW5nOiAnc3VtbWFyeSdgICgjMTNjLUEpLiBTYW1lIGZpZWxkc1xuICogYW5kIGNvc3QgY29udHJhY3QgYXMge0BsaW5rIFJlYWRTdW1tYXJ5TWFya2VyfTsgZGlzdGluY3QgYnJhbmQgc28gY29uc3VtZXJzXG4gKiBjYW4gdGVsbCB3aGljaCBkaWFsIHByb2R1Y2VkIGFuIGVudHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlU3VtbWFyeU1hcmtlciBleHRlbmRzIFZhbHVlU3VtbWFyeSB7XG4gIC8qKiBEaXNjcmltaW5hbnQg4oCUIGxldHMgc25hcHNob3QgY29uc3VtZXJzIGRldGVjdCBtYXJrZXIgZW50cmllcy4gKi9cbiAgX193cml0ZVN1bW1hcnk6IHRydWU7XG59XG5cbi8qKlxuICogVGhlIG9uZSBjbGFzc2lmaWNhdGlvbiBwYXRoIGJvdGggYnJhbmRzIHNoYXJlIOKAlCBldmVyeSBwZXItdHlwZSBydWxlXG4gKiAoaW5jbHVkaW5nIHRoZSBNYXAvU2V0IHJlYWwtZW50cnktY291bnQgaGFuZGxpbmcpIGxpdmVzIGhlcmUgZXhhY3RseSBvbmNlLlxuICovXG5mdW5jdGlvbiBjbGFzc2lmeVZhbHVlKHZhbHVlOiB1bmtub3duKTogVmFsdWVTdW1tYXJ5IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4geyB0eXBlOiAnbnVsbCcgfTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnc3RyaW5nJywgc2l6ZTogdmFsdWUubGVuZ3RoLCBwcmV2aWV3OiB2YWx1ZS5zbGljZSgwLCBTVU1NQVJZX1BSRVZJRVdfTEVOR1RIKSB9O1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHsgdHlwZTogJ2FycmF5Jywgc2l6ZTogdmFsdWUubGVuZ3RoIH07XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgIC8vIE9iamVjdC5rZXlzKCkgb24gYSBNYXAvU2V0IGlzIGFsd2F5cyBbXSDigJQgcmVwb3J0IHRoZSByZWFsIGVudHJ5IGNvdW50LlxuICAgIHJldHVybiB7IHR5cGU6ICdvYmplY3QnLCBzaXplOiB2YWx1ZS5zaXplIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnb2JqZWN0Jywgc2l6ZTogT2JqZWN0LmtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxlbmd0aCB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHJldHVybiB7IHR5cGU6ICdmdW5jdGlvbicgfTtcbiAgLy8gbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IHN5bWJvbCDigJQgU3RyaW5nKCkgaXMgTyhyZW5kZXJlZCBsZW5ndGgpXG4gIHJldHVybiB7IHR5cGU6IHR5cGVvZiB2YWx1ZSBhcyBTdW1tYXJ5VmFsdWVUeXBlLCBwcmV2aWV3OiBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIFNVTU1BUllfUFJFVklFV19MRU5HVEgpIH07XG59XG5cbi8qKlxuICogU3VtbWFyaXplIGEgdHJhY2tlZCBSRUFEIGZvciBgcmVhZFRyYWNraW5nOiAnc3VtbWFyeSdgICgjMTQpLiBCeXRlLWlkZW50aWNhbFxuICogb3V0cHV0IHRvIHRoZSBwcmUtZXh0cmFjdGlvbiBgU3RhZ2VDb250ZXh0YC1sb2NhbCBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVJlYWRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IFJlYWRTdW1tYXJ5TWFya2VyIHtcbiAgcmV0dXJuIHsgX19yZWFkU3VtbWFyeTogdHJ1ZSwgLi4uY2xhc3NpZnlWYWx1ZSh2YWx1ZSkgfTtcbn1cblxuLyoqXG4gKiBTdW1tYXJpemUgYSB0cmFja2VkIFdSSVRFIGZvciBgd3JpdGVUcmFja2luZzogJ3N1bW1hcnknYCAoIzEzYy1BKS4gU2libGluZ1xuICogb2Yge0BsaW5rIHN1bW1hcml6ZVJlYWRWYWx1ZX0g4oCUIHNhbWUgY2xhc3NpZmljYXRpb24sIGRpc3RpbmN0IGJyYW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplV3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IFdyaXRlU3VtbWFyeU1hcmtlciB7XG4gIHJldHVybiB7IF9fd3JpdGVTdW1tYXJ5OiB0cnVlLCAuLi5jbGFzc2lmeVZhbHVlKHZhbHVlKSB9O1xufVxuIl19
|
|
@@ -30,6 +30,18 @@ class ContinuationResolver {
|
|
|
30
30
|
* Key: node.id, Value: visit count (0 = first visit).
|
|
31
31
|
*/
|
|
32
32
|
iterationCounters = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Total fn-bearing dynamic-next hops this traverser has followed.
|
|
35
|
+
*
|
|
36
|
+
* Fresh fn-bearing nodes bypass the per-node-id iteration counter (they
|
|
37
|
+
* are new nodes, often without stable ids — there is no back-edge to
|
|
38
|
+
* count). Without a bound, a stage that keeps returning a function-bearing
|
|
39
|
+
* dynamic `next` runs FOREVER on the flat trampoline (no stack overflow
|
|
40
|
+
* brakes it either). This run-total counter puts such chains under the
|
|
41
|
+
* same `maxIterations` budget (default 1000, tuned via
|
|
42
|
+
* `RunOptions.maxIterations`) that bounds loop edges.
|
|
43
|
+
*/
|
|
44
|
+
dynamicNextHops = 0;
|
|
33
45
|
onIterationUpdate;
|
|
34
46
|
maxIterations;
|
|
35
47
|
constructor(deps, nodeResolver, onIterationUpdate, maxIterations) {
|
|
@@ -55,14 +67,21 @@ class ContinuationResolver {
|
|
|
55
67
|
* `onLoop` narrative), in the same order.
|
|
56
68
|
*
|
|
57
69
|
* Three dynamicNext patterns:
|
|
58
|
-
* - StageNode with fn → truly dynamic node, returned as-is (no
|
|
59
|
-
* tracking — it is a fresh node, not a back-edge
|
|
70
|
+
* - StageNode with fn → truly dynamic node, returned as-is (no per-node
|
|
71
|
+
* iteration tracking — it is a fresh node, not a back-edge — but the
|
|
72
|
+
* run-total dynamic-hop budget applies; see `dynamicNextHops`).
|
|
60
73
|
* - String ID → reference to an existing node, resolved via NodeResolver.
|
|
61
74
|
* - StageNode without fn → reference by ID, resolved via NodeResolver.
|
|
62
75
|
*/
|
|
63
76
|
resolveTarget(dynamicNext, currentNode, context, branchPath, traversalContext) {
|
|
64
|
-
// Truly dynamic node (has fn) → execute directly, no iteration
|
|
77
|
+
// Truly dynamic node (has fn) → execute directly, no per-node iteration
|
|
78
|
+
// tracking (fresh node, not a back-edge) — but the CHAIN of such hops is
|
|
79
|
+
// bounded by the run-total guard below, mirroring the loop budget.
|
|
65
80
|
if (typeof dynamicNext !== 'string' && dynamicNext.fn) {
|
|
81
|
+
if (this.dynamicNextHops >= this.maxIterations) {
|
|
82
|
+
throw new Error(`Maximum dynamic-next continuations (${this.maxIterations}) exceeded at stage '${currentNode.id ?? currentNode.name}' ` + `(dynamic target '${dynamicNext.name}'). Set maxIterations to increase the limit.`);
|
|
83
|
+
}
|
|
84
|
+
this.dynamicNextHops++;
|
|
66
85
|
context.addLog('dynamicNextDirect', true);
|
|
67
86
|
context.addLog('dynamicNextName', dynamicNext.name);
|
|
68
87
|
context.addFlowDebugMessage('next', `Moving to ${dynamicNext.name} stage (dynamic)`, {
|
|
@@ -124,4 +143,4 @@ class ContinuationResolver {
|
|
|
124
143
|
}
|
|
125
144
|
}
|
|
126
145
|
exports.ContinuationResolver = ContinuationResolver;
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGludWF0aW9uUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7OztBQVNVLFFBQUEsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBYTNDLE1BQWEsb0JBQW9CO0lBV1o7SUFDQTtJQVhuQjs7O09BR0c7SUFDSyxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUxQyxpQkFBaUIsQ0FBMkM7SUFDNUQsYUFBYSxDQUFTO0lBRXZDLFlBQ21CLElBQStCLEVBQy9CLFlBQXdDLEVBQ3pELGlCQUEyRCxFQUMzRCxhQUFzQjtRQUhMLFNBQUksR0FBSixJQUFJLENBQTJCO1FBQy9CLGlCQUFZLEdBQVosWUFBWSxDQUE0QjtRQUl6RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLElBQUksOEJBQXNCLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FDWCxXQUE2QyxFQUM3QyxJQUE2QixFQUM3QixPQUFxQixFQUNyQixTQUFtQyxFQUNuQyxVQUE4QixFQUM5QixXQUF3QyxFQUN4QyxnQkFBbUM7UUFFbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILGFBQWEsQ0FDWCxXQUE2QyxF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Z0IsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQW9CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BHLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCLENBQUMsTUFBYztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDYiw0QkFBNEIsSUFBSSxDQUFDLGFBQWEsd0JBQXdCLE1BQU0sS0FBSztnQkFDL0UsMENBQTBDLENBQzdDLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFNBQWlCO1FBQ3RELE9BQU8sU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUNqRSxDQUFDO0NBQ0Y7QUFySUQsb0RBcUlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250aW51YXRpb25SZXNvbHZlciDigJQgQmFjay1lZGdlIHJlc29sdXRpb24gKyBpdGVyYXRpb24gY291bnRpbmcuXG4gKlxuICogUmVzb2x2ZXMgZHluYW1pYyBjb250aW51YXRpb25zIChsb29wLWJhY2tzLCBkeW5hbWljIG5leHQpIGFuZCB0cmFja3NcbiAqIHBlci1ub2RlIGl0ZXJhdGlvbiBjb3VudHMgZm9yIGNvbnRleHQgdHJlZSBuYW1pbmcuXG4gKlxuICogU3VwcG9ydHMgdGhyZWUgZHluYW1pY05leHQgcGF0dGVybnM6XG4gKiAtIFN0cmluZyBJRCDihpIgcmVmZXJlbmNlIHRvIGV4aXN0aW5nIG5vZGUgKHJlc29sdmUgdmlhIE5vZGVSZXNvbHZlcilcbiAqIC0gU3RhZ2VOb2RlIHdpdGggZm4g4oaSIHRydWx5IGR5bmFtaWMgbm9kZSAoZXhlY3V0ZSBkaXJlY3RseSlcbiAqIC0gU3RhZ2VOb2RlIHdpdGhvdXQgZm4g4oaSIHJlZmVyZW5jZSBieSBJRCAocmVzb2x2ZSB2aWEgTm9kZVJlc29sdmVyKVxuICpcbiAqIFR3byBlbnRyeSBwb2ludHM6XG4gKiAtIGByZXNvbHZlVGFyZ2V0YCDigJQgcmVzb2x2ZXMgdGhlIGNvbnRpbnVhdGlvbiB0byBgeyBub2RlLCBjb250ZXh0IH1gIGFuZFxuICogICBmaXJlcyBldmVyeSBzaWRlIGVmZmVjdCAoaXRlcmF0aW9uIGNvdW50aW5nLCBkZWJ1ZyBsb2dzLCBgb25Mb29wYFxuICogICBuYXJyYXRpdmUpIFdJVEhPVVQgZXhlY3V0aW5nLiBUaGUgdHJhdmVyc2VyJ3MgdHJhbXBvbGluZSBkcml2ZXIgdXNlc1xuICogICB0aGlzIHRvIGZvbGxvdyBsb29wIGVkZ2VzIGl0ZXJhdGl2ZWx5IOKAlCBmbGF0IHN0YWNrLCBzbyB0aGUgaXRlcmF0aW9uXG4gKiAgIGxpbWl0IChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICogLSBgcmVzb2x2ZWAg4oCUIHJlc29sdmVUYXJnZXQgKyBpbW1lZGlhdGUgZXhlY3V0aW9uIHZpYSB0aGUgcHJvdmlkZWRcbiAqICAgYGV4ZWN1dGVOb2RlYCBjYWxsYmFjay4gS2VwdCBmb3IgZGlyZWN0L2FkdmFuY2VkIGNhbGxlcnMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXJEZXBzIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuL05vZGVSZXNvbHZlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGVOb2RlRm4gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0lURVJBVElPTlMgPSAxMDAwO1xuXG4vKipcbiAqIEEgcmVzb2x2ZWQgY29udGludWF0aW9uIHRhcmdldCDigJQgdGhlIG5vZGUgdG8gZXhlY3V0ZSBuZXh0IHBsdXMgdGhlXG4gKiBTdGFnZUNvbnRleHQgdG8gZXhlY3V0ZSBpdCBpbi4gQWxsIHNpZGUgZWZmZWN0cyAoaXRlcmF0aW9uIGNvdW50aW5nLFxuICogZGVidWcgbG9ncywgYG9uTG9vcGAgbmFycmF0aXZlKSBoYXZlIGFscmVhZHkgZmlyZWQgYnkgdGhlIHRpbWUgdGhpc1xuICogaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRDb250aW51YXRpb248VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBjb250ZXh0OiBTdGFnZUNvbnRleHQ7XG59XG5cbmV4cG9ydCBjbGFzcyBDb250aW51YXRpb25SZXNvbHZlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEl0ZXJhdGlvbiBjb3VudGVyIHBlciBub2RlIElELlxuICAgKiBLZXk6IG5vZGUuaWQsIFZhbHVlOiB2aXNpdCBjb3VudCAoMCA9IGZpcnN0IHZpc2l0KS5cbiAgICovXG4gIHByaXZhdGUgaXRlcmF0aW9uQ291bnRlcnM6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhJdGVyYXRpb25zOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPixcbiAgICBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLm9uSXRlcmF0aW9uVXBkYXRlID0gb25JdGVyYXRpb25VcGRhdGU7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gbWF4SXRlcmF0aW9ucyA/PyBERUZBVUxUX01BWF9JVEVSQVRJT05TO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBkeW5hbWljIGNvbnRpbnVhdGlvbiBhbmQgZXhlY3V0ZSBpdCBpbW1lZGlhdGVseS5cbiAgICogRXF1aXZhbGVudCB0byBgZXhlY3V0ZU5vZGUoLi4ucmVzb2x2ZVRhcmdldCguLi4pKWAg4oCUIHRoZSB0cmF2ZXJzZXInc1xuICAgKiBkcml2ZXIgbG9vcCBjYWxscyBgcmVzb2x2ZVRhcmdldGAgZGlyZWN0bHkgaW5zdGVhZCBzbyB0aGUgY29udGludWF0aW9uXG4gICAqIGJlY29tZXMgYSBmbGF0IHRyYW1wb2xpbmUgaG9wIHJhdGhlciB0aGFuIGEgcmV0YWluZWQgcmVjdXJzaXZlIGZyYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZShcbiAgICBkeW5hbWljTmV4dDogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZVRhcmdldChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgcmV0dXJuIGV4ZWN1dGVOb2RlKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgZHluYW1pYyBjb250aW51YXRpb24gdG8gaXRzIHRhcmdldCBub2RlICsgbmV4dCBTdGFnZUNvbnRleHRcbiAgICogV0lUSE9VVCBleGVjdXRpbmcgaXQuIEZpcmVzIHRoZSBzYW1lIHNpZGUgZWZmZWN0cyBgcmVzb2x2ZWAgYWx3YXlzIGRpZFxuICAgKiAoaXRlcmF0aW9uIGNvdW50aW5nICsgbGltaXQsIGBkeW5hbWljTmV4dCpgIGxvZ3MsIGxvb3AgZGVidWcgbWVzc2FnZSxcbiAgICogYG9uTG9vcGAgbmFycmF0aXZlKSwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqIFRocmVlIGR5bmFtaWNOZXh0IHBhdHRlcm5zOlxuICAgKiAtIFN0YWdlTm9kZSB3aXRoIGZuIOKGkiB0cnVseSBkeW5hbWljIG5vZGUsIHJldHVybmVkIGFzLWlzIChubyBpdGVyYXRpb25cbiAgICogICB0cmFja2luZyDigJQgaXQgaXMgYSBmcmVzaCBub2RlLCBub3QgYSBiYWNrLWVkZ2UpLlxuICAgKiAtIFN0cmluZyBJRCDihpIgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG5vZGUsIHJlc29sdmVkIHZpYSBOb2RlUmVzb2x2ZXIuXG4gICAqIC0gU3RhZ2VOb2RlIHdpdGhvdXQgZm4g4oaSIHJlZmVyZW5jZSBieSBJRCwgcmVzb2x2ZWQgdmlhIE5vZGVSZXNvbHZlci5cbiAgICovXG4gIHJlc29sdmVUYXJnZXQoXG4gICAgZHluYW1pY05leHQ6IHN0cmluZyB8IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGN1cnJlbnROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBSZXNvbHZlZENvbnRpbnVhdGlvbjxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBUcnVseSBkeW5hbWljIG5vZGUgKGhhcyBmbikg4oaSIGV4ZWN1dGUgZGlyZWN0bHksIG5vIGl0ZXJhdGlvbiB0cmFja2luZy5cbiAgICBpZiAodHlwZW9mIGR5bmFtaWNOZXh0ICE9PSAnc3RyaW5nJyAmJiBkeW5hbWljTmV4dC5mbikge1xuICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0RGlyZWN0JywgdHJ1ZSk7XG4gICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY05leHROYW1lJywgZHluYW1pY05leHQubmFtZSk7XG5cbiAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbmV4dCcsIGBNb3ZpbmcgdG8gJHtkeW5hbWljTmV4dC5uYW1lfSBzdGFnZSAoZHluYW1pYylgLCB7XG4gICAgICAgIHRhcmdldFN0YWdlOiBkeW5hbWljTmV4dC5uYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG5leHRTdGFnZUNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIGR5bmFtaWNOZXh0Lm5hbWUsIGR5bmFtaWNOZXh0LmlkKTtcbiAgICAgIHJldHVybiB7IG5vZGU6IGR5bmFtaWNOZXh0LCBjb250ZXh0OiBuZXh0U3RhZ2VDb250ZXh0IH07XG4gICAgfVxuXG4gICAgLy8gUmVmZXJlbmNlIOKAlCBieSBzdHJpbmcgSUQgb3IgYnkgbm9kZS13aXRob3V0LWZuIElELiBBIG5vZGUgcmVmZXJlbmNlXG4gICAgLy8gd2l0aG91dCBhbiBpZCBpcyBhIHVzYWdlIGVycm9yOyBhIHN0cmluZyByZWZlcmVuY2UgaXMgcGFzc2VkIHRocm91Z2hcbiAgICAvLyB2ZXJiYXRpbSAoYW4gdW5rbm93biBpZCBzdXJmYWNlcyBhcyBcInRhcmdldCBub2RlIG5vdCBmb3VuZFwiIGJlbG93KS5cbiAgICBpZiAodHlwZW9mIGR5bmFtaWNOZXh0ICE9PSAnc3RyaW5nJyAmJiAhZHluYW1pY05leHQuaWQpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdkeW5hbWljTmV4dCBub2RlIG11c3QgaGF2ZSBhbiBpZCB3aGVuIHVzZWQgYXMgcmVmZXJlbmNlJztcbiAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtjdXJyZW50Tm9kZS5uYW1lfV06YCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IG5leHROb2RlSWQgPSB0eXBlb2YgZHluYW1pY05leHQgPT09ICdzdHJpbmcnID8gZHluYW1pY05leHQgOiBkeW5hbWljTmV4dC5pZCE7XG5cbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGhpcy5ub2RlUmVzb2x2ZXIuZmluZE5vZGVCeUlkKG5leHROb2RlSWQpO1xuICAgIGlmICghdGFyZ2V0Tm9kZSkge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYGR5bmFtaWNOZXh0IHRhcmdldCBub2RlIG5vdCBmb3VuZDogJHtuZXh0Tm9kZUlkfWA7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7Y3VycmVudE5vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZXJhdGlvbiA9IHRoaXMuZ2V0QW5kSW5jcmVtZW50SXRlcmF0aW9uKG5leHROb2RlSWQpO1xuICAgIGNvbnN0IGl0ZXJhdGVkU3RhZ2VOYW1lID0gdGhpcy5nZXRJdGVyYXRlZFN0YWdlTmFtZSh0YXJnZXROb2RlLm5hbWUsIGl0ZXJhdGlvbik7XG4gICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0VGFyZ2V0JywgbmV4dE5vZGVJZCk7XG4gICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0SXRlcmF0aW9uJywgaXRlcmF0aW9uKTtcblxuICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnbG9vcCcsIGBMb29waW5nIGJhY2sgdG8gJHt0YXJnZXROb2RlLm5hbWV9IChpdGVyYXRpb24gJHtpdGVyYXRpb24gKyAxfSlgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogdGFyZ2V0Tm9kZS5uYW1lLFxuICAgICAgaXRlcmF0aW9uOiBpdGVyYXRpb24gKyAxLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkxvb3AodGFyZ2V0Tm9kZS5uYW1lLCBpdGVyYXRpb24gKyAxLCB0YXJnZXROb2RlLmRlc2NyaXB0aW9uLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgIGNvbnN0IG5leHRTdGFnZUNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIGl0ZXJhdGVkU3RhZ2VOYW1lLCB0YXJnZXROb2RlLmlkKTtcbiAgICByZXR1cm4geyBub2RlOiB0YXJnZXROb2RlLCBjb250ZXh0OiBuZXh0U3RhZ2VDb250ZXh0IH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBuZXh0IGl0ZXJhdGlvbiBudW1iZXIgZm9yIGEgbm9kZSBhbmQgaW5jcmVtZW50LlxuICAgKiBSZXR1cm5zIDAgZm9yIGZpcnN0IHZpc2l0LCAxIGZvciBzZWNvbmQsIGV0Yy5cbiAgICogVGhyb3dzIGlmIG1heEl0ZXJhdGlvbnMgZXhjZWVkZWQgKGluZmluaXRlIGxvb3AgZ3VhcmQpLlxuICAgKi9cbiAgZ2V0QW5kSW5jcmVtZW50SXRlcmF0aW9uKG5vZGVJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5pdGVyYXRpb25Db3VudGVycy5nZXQobm9kZUlkKSA/PyAwO1xuICAgIGlmIChjdXJyZW50ID49IHRoaXMubWF4SXRlcmF0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgKCR7dGhpcy5tYXhJdGVyYXRpb25zfSkgZXhjZWVkZWQgZm9yIG5vZGUgJyR7bm9kZUlkfScuIGAgK1xuICAgICAgICAgICdTZXQgbWF4SXRlcmF0aW9ucyB0byBpbmNyZWFzZSB0aGUgbGltaXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuaXRlcmF0aW9uQ291bnRlcnMuc2V0KG5vZGVJZCwgY3VycmVudCArIDEpO1xuXG4gICAgaWYgKHRoaXMub25JdGVyYXRpb25VcGRhdGUpIHtcbiAgICAgIHRoaXMub25JdGVyYXRpb25VcGRhdGUobm9kZUlkLCBjdXJyZW50ICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gaXRlcmF0ZWQgc3RhZ2UgbmFtZSBmb3IgY29udGV4dCB0cmVlLlxuICAgKiBGaXJzdCB2aXNpdDogXCJhc2tMTE1cIiwgc2Vjb25kOiBcImFza0xMTS4xXCIsIHRoaXJkOiBcImFza0xMTS4yXCIuXG4gICAqL1xuICBnZXRJdGVyYXRlZFN0YWdlTmFtZShiYXNlTmFtZTogc3RyaW5nLCBpdGVyYXRpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZXJhdGlvbiA9PT0gMCA/IGJhc2VOYW1lIDogYCR7YmFzZU5hbWV9LiR7aXRlcmF0aW9ufWA7XG4gIH1cbn1cbiJdfQ==
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGludWF0aW9uUmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9Db250aW51YXRpb25SZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7OztBQVNVLFFBQUEsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0FBYTNDLE1BQWEsb0JBQW9CO0lBd0JaO0lBQ0E7SUF4Qm5COzs7T0FHRztJQUNLLGlCQUFpQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNEOzs7Ozs7Ozs7O09BVUc7SUFDSyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRVgsaUJBQWlCLENBQTJDO0lBQzVELGFBQWEsQ0FBUztJQUV2QyxZQUNtQixJQUErQixFQUMvQixZQUF3QyxFQUN6RCxpQkFBMkQsRUFDM0QsYUFBc0I7UUFITCxTQUFJLEdBQUosSUFBSSxDQUEyQjtRQUMvQixpQkFBWSxHQUFaLFlBQVksQ0FBNEI7UUFJekQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxJQUFJLDhCQUFzQixDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsV0FBNkMsRUFDN0MsSUFBNkIsRUFDN0IsT0FBcUIsRUFDckIsU0FBbUMsRUFDbkMsVUFBOEIsRUFDOUIsV0FBd0MsRUFDeEMsZ0JBQW1DO1FBRW5DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDNUYsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RSxD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QUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILG9CQUFvQixDQUFDLFFBQWdCLEVBQUUsU0FBaUI7UUFDdEQsT0FBTyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBQ2pFLENBQUM7Q0FDRjtBQTlKRCxvREE4SkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRpbnVhdGlvblJlc29sdmVyIOKAlCBCYWNrLWVkZ2UgcmVzb2x1dGlvbiArIGl0ZXJhdGlvbiBjb3VudGluZy5cbiAqXG4gKiBSZXNvbHZlcyBkeW5hbWljIGNvbnRpbnVhdGlvbnMgKGxvb3AtYmFja3MsIGR5bmFtaWMgbmV4dCkgYW5kIHRyYWNrc1xuICogcGVyLW5vZGUgaXRlcmF0aW9uIGNvdW50cyBmb3IgY29udGV4dCB0cmVlIG5hbWluZy5cbiAqXG4gKiBTdXBwb3J0cyB0aHJlZSBkeW5hbWljTmV4dCBwYXR0ZXJuczpcbiAqIC0gU3RyaW5nIElEIOKGkiByZWZlcmVuY2UgdG8gZXhpc3Rpbmcgbm9kZSAocmVzb2x2ZSB2aWEgTm9kZVJlc29sdmVyKVxuICogLSBTdGFnZU5vZGUgd2l0aCBmbiDihpIgdHJ1bHkgZHluYW1pYyBub2RlIChleGVjdXRlIGRpcmVjdGx5KVxuICogLSBTdGFnZU5vZGUgd2l0aG91dCBmbiDihpIgcmVmZXJlbmNlIGJ5IElEIChyZXNvbHZlIHZpYSBOb2RlUmVzb2x2ZXIpXG4gKlxuICogVHdvIGVudHJ5IHBvaW50czpcbiAqIC0gYHJlc29sdmVUYXJnZXRgIOKAlCByZXNvbHZlcyB0aGUgY29udGludWF0aW9uIHRvIGB7IG5vZGUsIGNvbnRleHQgfWAgYW5kXG4gKiAgIGZpcmVzIGV2ZXJ5IHNpZGUgZWZmZWN0IChpdGVyYXRpb24gY291bnRpbmcsIGRlYnVnIGxvZ3MsIGBvbkxvb3BgXG4gKiAgIG5hcnJhdGl2ZSkgV0lUSE9VVCBleGVjdXRpbmcuIFRoZSB0cmF2ZXJzZXIncyB0cmFtcG9saW5lIGRyaXZlciB1c2VzXG4gKiAgIHRoaXMgdG8gZm9sbG93IGxvb3AgZWRnZXMgaXRlcmF0aXZlbHkg4oCUIGZsYXQgc3RhY2ssIHNvIHRoZSBpdGVyYXRpb25cbiAqICAgbGltaXQgKG5vdCBjYWxsLXN0YWNrIGRlcHRoKSBpcyB3aGF0IGJvdW5kcyBhIGxvb3AuXG4gKiAtIGByZXNvbHZlYCDigJQgcmVzb2x2ZVRhcmdldCArIGltbWVkaWF0ZSBleGVjdXRpb24gdmlhIHRoZSBwcm92aWRlZFxuICogICBgZXhlY3V0ZU5vZGVgIGNhbGxiYWNrLiBLZXB0IGZvciBkaXJlY3QvYWR2YW5jZWQgY2FsbGVycy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE5vZGVSZXNvbHZlciB9IGZyb20gJy4vTm9kZVJlc29sdmVyLmpzJztcbmltcG9ydCB0eXBlIHsgRXhlY3V0ZU5vZGVGbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfSVRFUkFUSU9OUyA9IDEwMDA7XG5cbi8qKlxuICogQSByZXNvbHZlZCBjb250aW51YXRpb24gdGFyZ2V0IOKAlCB0aGUgbm9kZSB0byBleGVjdXRlIG5leHQgcGx1cyB0aGVcbiAqIFN0YWdlQ29udGV4dCB0byBleGVjdXRlIGl0IGluLiBBbGwgc2lkZSBlZmZlY3RzIChpdGVyYXRpb24gY291bnRpbmcsXG4gKiBkZWJ1ZyBsb2dzLCBgb25Mb29wYCBuYXJyYXRpdmUpIGhhdmUgYWxyZWFkeSBmaXJlZCBieSB0aGUgdGltZSB0aGlzXG4gKiBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENvbnRpbnVhdGlvbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRpbnVhdGlvblJlc29sdmVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogSXRlcmF0aW9uIGNvdW50ZXIgcGVyIG5vZGUgSUQuXG4gICAqIEtleTogbm9kZS5pZCwgVmFsdWU6IHZpc2l0IGNvdW50ICgwID0gZmlyc3QgdmlzaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBpdGVyYXRpb25Db3VudGVyczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogVG90YWwgZm4tYmVhcmluZyBkeW5hbWljLW5leHQgaG9wcyB0aGlzIHRyYXZlcnNlciBoYXMgZm9sbG93ZWQuXG4gICAqXG4gICAqIEZyZXNoIGZuLWJlYXJpbmcgbm9kZXMgYnlwYXNzIHRoZSBwZXItbm9kZS1pZCBpdGVyYXRpb24gY291bnRlciAodGhleVxuICAgKiBhcmUgbmV3IG5vZGVzLCBvZnRlbiB3aXRob3V0IHN0YWJsZSBpZHMg4oCUIHRoZXJlIGlzIG5vIGJhY2stZWRnZSB0b1xuICAgKiBjb3VudCkuIFdpdGhvdXQgYSBib3VuZCwgYSBzdGFnZSB0aGF0IGtlZXBzIHJldHVybmluZyBhIGZ1bmN0aW9uLWJlYXJpbmdcbiAgICogZHluYW1pYyBgbmV4dGAgcnVucyBGT1JFVkVSIG9uIHRoZSBmbGF0IHRyYW1wb2xpbmUgKG5vIHN0YWNrIG92ZXJmbG93XG4gICAqIGJyYWtlcyBpdCBlaXRoZXIpLiBUaGlzIHJ1bi10b3RhbCBjb3VudGVyIHB1dHMgc3VjaCBjaGFpbnMgdW5kZXIgdGhlXG4gICAqIHNhbWUgYG1heEl0ZXJhdGlvbnNgIGJ1ZGdldCAoZGVmYXVsdCAxMDAwLCB0dW5lZCB2aWFcbiAgICogYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApIHRoYXQgYm91bmRzIGxvb3AgZWRnZXMuXG4gICAqL1xuICBwcml2YXRlIGR5bmFtaWNOZXh0SG9wcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhJdGVyYXRpb25zOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPixcbiAgICBvbkl0ZXJhdGlvblVwZGF0ZT86IChub2RlSWQ6IHN0cmluZywgY291bnQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLm9uSXRlcmF0aW9uVXBkYXRlID0gb25JdGVyYXRpb25VcGRhdGU7XG4gICAgdGhpcy5tYXhJdGVyYXRpb25zID0gbWF4SXRlcmF0aW9ucyA/PyBERUZBVUxUX01BWF9JVEVSQVRJT05TO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBkeW5hbWljIGNvbnRpbnVhdGlvbiBhbmQgZXhlY3V0ZSBpdCBpbW1lZGlhdGVseS5cbiAgICogRXF1aXZhbGVudCB0byBgZXhlY3V0ZU5vZGUoLi4ucmVzb2x2ZVRhcmdldCguLi4pKWAg4oCUIHRoZSB0cmF2ZXJzZXInc1xuICAgKiBkcml2ZXIgbG9vcCBjYWxscyBgcmVzb2x2ZVRhcmdldGAgZGlyZWN0bHkgaW5zdGVhZCBzbyB0aGUgY29udGludWF0aW9uXG4gICAqIGJlY29tZXMgYSBmbGF0IHRyYW1wb2xpbmUgaG9wIHJhdGhlciB0aGFuIGEgcmV0YWluZWQgcmVjdXJzaXZlIGZyYW1lLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZShcbiAgICBkeW5hbWljTmV4dDogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbiB9LFxuICAgIGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBleGVjdXRlTm9kZTogRXhlY3V0ZU5vZGVGbjxUT3V0LCBUU2NvcGU+LFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZVRhcmdldChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgcmV0dXJuIGV4ZWN1dGVOb2RlKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJlYWtGbGFnLCBicmFuY2hQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgZHluYW1pYyBjb250aW51YXRpb24gdG8gaXRzIHRhcmdldCBub2RlICsgbmV4dCBTdGFnZUNvbnRleHRcbiAgICogV0lUSE9VVCBleGVjdXRpbmcgaXQuIEZpcmVzIHRoZSBzYW1lIHNpZGUgZWZmZWN0cyBgcmVzb2x2ZWAgYWx3YXlzIGRpZFxuICAgKiAoaXRlcmF0aW9uIGNvdW50aW5nICsgbGltaXQsIGBkeW5hbWljTmV4dCpgIGxvZ3MsIGxvb3AgZGVidWcgbWVzc2FnZSxcbiAgICogYG9uTG9vcGAgbmFycmF0aXZlKSwgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqIFRocmVlIGR5bmFtaWNOZXh0IHBhdHRlcm5zOlxuICAgKiAtIFN0YWdlTm9kZSB3aXRoIGZuIOKGkiB0cnVseSBkeW5hbWljIG5vZGUsIHJldHVybmVkIGFzLWlzIChubyBwZXItbm9kZVxuICAgKiAgIGl0ZXJhdGlvbiB0cmFja2luZyDigJQgaXQgaXMgYSBmcmVzaCBub2RlLCBub3QgYSBiYWNrLWVkZ2Ug4oCUIGJ1dCB0aGVcbiAgICogICBydW4tdG90YWwgZHluYW1pYy1ob3AgYnVkZ2V0IGFwcGxpZXM7IHNlZSBgZHluYW1pY05leHRIb3BzYCkuXG4gICAqIC0gU3RyaW5nIElEIOKGkiByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgbm9kZSwgcmVzb2x2ZWQgdmlhIE5vZGVSZXNvbHZlci5cbiAgICogLSBTdGFnZU5vZGUgd2l0aG91dCBmbiDihpIgcmVmZXJlbmNlIGJ5IElELCByZXNvbHZlZCB2aWEgTm9kZVJlc29sdmVyLlxuICAgKi9cbiAgcmVzb2x2ZVRhcmdldChcbiAgICBkeW5hbWljTmV4dDogc3RyaW5nIHwgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VycmVudE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgdHJhdmVyc2FsQ29udGV4dD86IFRyYXZlcnNhbENvbnRleHQsXG4gICk6IFJlc29sdmVkQ29udGludWF0aW9uPFRPdXQsIFRTY29wZT4ge1xuICAgIC8vIFRydWx5IGR5bmFtaWMgbm9kZSAoaGFzIGZuKSDihpIgZXhlY3V0ZSBkaXJlY3RseSwgbm8gcGVyLW5vZGUgaXRlcmF0aW9uXG4gICAgLy8gdHJhY2tpbmcgKGZyZXNoIG5vZGUsIG5vdCBhIGJhY2stZWRnZSkg4oCUIGJ1dCB0aGUgQ0hBSU4gb2Ygc3VjaCBob3BzIGlzXG4gICAgLy8gYm91bmRlZCBieSB0aGUgcnVuLXRvdGFsIGd1YXJkIGJlbG93LCBtaXJyb3JpbmcgdGhlIGxvb3AgYnVkZ2V0LlxuICAgIGlmICh0eXBlb2YgZHluYW1pY05leHQgIT09ICdzdHJpbmcnICYmIGR5bmFtaWNOZXh0LmZuKSB7XG4gICAgICBpZiAodGhpcy5keW5hbWljTmV4dEhvcHMgPj0gdGhpcy5tYXhJdGVyYXRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWF4aW11bSBkeW5hbWljLW5leHQgY29udGludWF0aW9ucyAoJHt0aGlzLm1heEl0ZXJhdGlvbnN9KSBleGNlZWRlZCBhdCBzdGFnZSAnJHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLmlkID8/IGN1cnJlbnROb2RlLm5hbWVcbiAgICAgICAgICB9JyBgICsgYChkeW5hbWljIHRhcmdldCAnJHtkeW5hbWljTmV4dC5uYW1lfScpLiBTZXQgbWF4SXRlcmF0aW9ucyB0byBpbmNyZWFzZSB0aGUgbGltaXQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHluYW1pY05leHRIb3BzKys7XG5cbiAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dERpcmVjdCcsIHRydWUpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ2R5bmFtaWNOZXh0TmFtZScsIGR5bmFtaWNOZXh0Lm5hbWUpO1xuXG4gICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ25leHQnLCBgTW92aW5nIHRvICR7ZHluYW1pY05leHQubmFtZX0gc3RhZ2UgKGR5bmFtaWMpYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogZHluYW1pY05leHQubmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZXh0U3RhZ2VDb250ZXh0ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBkeW5hbWljTmV4dC5uYW1lLCBkeW5hbWljTmV4dC5pZCk7XG4gICAgICByZXR1cm4geyBub2RlOiBkeW5hbWljTmV4dCwgY29udGV4dDogbmV4dFN0YWdlQ29udGV4dCB9O1xuICAgIH1cblxuICAgIC8vIFJlZmVyZW5jZSDigJQgYnkgc3RyaW5nIElEIG9yIGJ5IG5vZGUtd2l0aG91dC1mbiBJRC4gQSBub2RlIHJlZmVyZW5jZVxuICAgIC8vIHdpdGhvdXQgYW4gaWQgaXMgYSB1c2FnZSBlcnJvcjsgYSBzdHJpbmcgcmVmZXJlbmNlIGlzIHBhc3NlZCB0aHJvdWdoXG4gICAgLy8gdmVyYmF0aW0gKGFuIHVua25vd24gaWQgc3VyZmFjZXMgYXMgXCJ0YXJnZXQgbm9kZSBub3QgZm91bmRcIiBiZWxvdykuXG4gICAgaWYgKHR5cGVvZiBkeW5hbWljTmV4dCAhPT0gJ3N0cmluZycgJiYgIWR5bmFtaWNOZXh0LmlkKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnZHluYW1pY05leHQgbm9kZSBtdXN0IGhhdmUgYW4gaWQgd2hlbiB1c2VkIGFzIHJlZmVyZW5jZSc7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7Y3VycmVudE5vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zdCBuZXh0Tm9kZUlkID0gdHlwZW9mIGR5bmFtaWNOZXh0ID09PSAnc3RyaW5nJyA/IGR5bmFtaWNOZXh0IDogZHluYW1pY05leHQuaWQhO1xuXG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuZXh0Tm9kZUlkKTtcbiAgICBpZiAoIXRhcmdldE5vZGUpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBkeW5hbWljTmV4dCB0YXJnZXQgbm9kZSBub3QgZm91bmQ6ICR7bmV4dE5vZGVJZH1gO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske2N1cnJlbnROb2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVyYXRpb24gPSB0aGlzLmdldEFuZEluY3JlbWVudEl0ZXJhdGlvbihuZXh0Tm9kZUlkKTtcbiAgICBjb25zdCBpdGVyYXRlZFN0YWdlTmFtZSA9IHRoaXMuZ2V0SXRlcmF0ZWRTdGFnZU5hbWUodGFyZ2V0Tm9kZS5uYW1lLCBpdGVyYXRpb24pO1xuICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dFRhcmdldCcsIG5leHROb2RlSWQpO1xuICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljTmV4dEl0ZXJhdGlvbicsIGl0ZXJhdGlvbik7XG5cbiAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ2xvb3AnLCBgTG9vcGluZyBiYWNrIHRvICR7dGFyZ2V0Tm9kZS5uYW1lfSAoaXRlcmF0aW9uICR7aXRlcmF0aW9uICsgMX0pYCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHRhcmdldE5vZGUubmFtZSxcbiAgICAgIGl0ZXJhdGlvbjogaXRlcmF0aW9uICsgMSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25Mb29wKHRhcmdldE5vZGUubmFtZSwgaXRlcmF0aW9uICsgMSwgdGFyZ2V0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICBjb25zdCBuZXh0U3RhZ2VDb250ZXh0ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBpdGVyYXRlZFN0YWdlTmFtZSwgdGFyZ2V0Tm9kZS5pZCk7XG4gICAgcmV0dXJuIHsgbm9kZTogdGFyZ2V0Tm9kZSwgY29udGV4dDogbmV4dFN0YWdlQ29udGV4dCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmV4dCBpdGVyYXRpb24gbnVtYmVyIGZvciBhIG5vZGUgYW5kIGluY3JlbWVudC5cbiAgICogUmV0dXJucyAwIGZvciBmaXJzdCB2aXNpdCwgMSBmb3Igc2Vjb25kLCBldGMuXG4gICAqIFRocm93cyBpZiBtYXhJdGVyYXRpb25zIGV4Y2VlZGVkIChpbmZpbml0ZSBsb29wIGd1YXJkKS5cbiAgICovXG4gIGdldEFuZEluY3JlbWVudEl0ZXJhdGlvbihub2RlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuaXRlcmF0aW9uQ291bnRlcnMuZ2V0KG5vZGVJZCkgPz8gMDtcbiAgICBpZiAoY3VycmVudCA+PSB0aGlzLm1heEl0ZXJhdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1heGltdW0gbG9vcCBpdGVyYXRpb25zICgke3RoaXMubWF4SXRlcmF0aW9uc30pIGV4Y2VlZGVkIGZvciBub2RlICcke25vZGVJZH0nLiBgICtcbiAgICAgICAgICAnU2V0IG1heEl0ZXJhdGlvbnMgdG8gaW5jcmVhc2UgdGhlIGxpbWl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLml0ZXJhdGlvbkNvdW50ZXJzLnNldChub2RlSWQsIGN1cnJlbnQgKyAxKTtcblxuICAgIGlmICh0aGlzLm9uSXRlcmF0aW9uVXBkYXRlKSB7XG4gICAgICB0aGlzLm9uSXRlcmF0aW9uVXBkYXRlKG5vZGVJZCwgY3VycmVudCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIGl0ZXJhdGVkIHN0YWdlIG5hbWUgZm9yIGNvbnRleHQgdHJlZS5cbiAgICogRmlyc3QgdmlzaXQ6IFwiYXNrTExNXCIsIHNlY29uZDogXCJhc2tMTE0uMVwiLCB0aGlyZDogXCJhc2tMTE0uMlwiLlxuICAgKi9cbiAgZ2V0SXRlcmF0ZWRTdGFnZU5hbWUoYmFzZU5hbWU6IHN0cmluZywgaXRlcmF0aW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBpdGVyYXRpb24gPT09IDAgPyBiYXNlTmFtZSA6IGAke2Jhc2VOYW1lfS4ke2l0ZXJhdGlvbn1gO1xuICB9XG59XG4iXX0=
|