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