footprintjs 7.0.0 → 7.1.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/README.md +16 -0
- package/dist/esm/lib/memory/TransactionBuffer.js +92 -9
- package/dist/esm/lib/memory/utils.js +62 -1
- package/dist/lib/memory/TransactionBuffer.js +91 -8
- package/dist/lib/memory/utils.js +64 -2
- package/dist/types/lib/memory/TransactionBuffer.d.ts +67 -1
- package/dist/types/lib/memory/utils.d.ts +29 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -235,6 +235,22 @@ npx degit footprintjs/footPrint/ai-instructions footprint-ai && bash footprint-a
|
|
|
235
235
|
|
|
236
236
|
---
|
|
237
237
|
|
|
238
|
+
## Roadmap — community extension points
|
|
239
|
+
|
|
240
|
+
These are deliberately deferred ideas where footprintjs aims to be a *true
|
|
241
|
+
developer's friend*: ship a great zero-config default, but let teams who need it
|
|
242
|
+
**bring their own** implementation. Contributions welcome — open an issue to
|
|
243
|
+
discuss before a PR.
|
|
244
|
+
|
|
245
|
+
- **Pluggable performance primitives (bring-your-own).** Hot-path internals
|
|
246
|
+
(`deepEqual` for change-only commits, `deepSmartMerge`, deep clones) are
|
|
247
|
+
built-in today. A future opt-in would let extreme-throughput consumers inject
|
|
248
|
+
their own (e.g. a SIMD fast-deep-equal or structural-sharing clone) while
|
|
249
|
+
everyone else keeps the default. Must honour the existing structural-equality
|
|
250
|
+
contract (a wrong comparator could drop real changes), so it ships with a
|
|
251
|
+
documented contract + dev-mode validation. See
|
|
252
|
+
[Commit change semantics](./docs/design/commit-change-semantics.md).
|
|
253
|
+
|
|
238
254
|
## Documentation
|
|
239
255
|
|
|
240
256
|
| Resource | Link |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* - Records operation trace for deterministic replay
|
|
9
9
|
*/
|
|
10
10
|
import { nativeGet as _get, nativeSet as _set } from './pathOps.js';
|
|
11
|
-
import { deepSmartMerge, normalisePath } from './utils.js';
|
|
11
|
+
import { deepEqual, deepSmartMerge, DELIM, normalisePath } from './utils.js';
|
|
12
12
|
export class TransactionBuffer {
|
|
13
13
|
baseSnapshot;
|
|
14
14
|
workingCopy;
|
|
@@ -45,16 +45,64 @@ export class TransactionBuffer {
|
|
|
45
45
|
return _get(this.workingCopy, path, defaultValue);
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
|
-
* Flush all staged mutations and return the commit bundle
|
|
48
|
+
* Flush all staged mutations and return the commit bundle — recording the
|
|
49
|
+
* stage's NET CHANGE, not its raw write log.
|
|
50
|
+
*
|
|
51
|
+
* ── WHY (the defect this fixes) ─────────────────────────────────────────
|
|
52
|
+
* Previously every `set`/`merge` was recorded verbatim, so the commit bundle
|
|
53
|
+
* was a log of *operations* rather than *changes*. Two operations produce no
|
|
54
|
+
* net change yet were still committed as "mutations":
|
|
55
|
+
*
|
|
56
|
+
* 1. No-op write — writing a key the value it already holds (e.g. an
|
|
57
|
+
* agent context slot re-emitting identical content every
|
|
58
|
+
* turn). base K=1, stage writes K=1.
|
|
59
|
+
* 2. Write-revert — changing then restoring a key within one stage.
|
|
60
|
+
* base K=1, stage writes K=2 then K=1.
|
|
61
|
+
*
|
|
62
|
+
* Recording these as mutations (a) bloated causal slicing / backtracking with
|
|
63
|
+
* spurious dependencies on intermediate values that never reach final state,
|
|
64
|
+
* and (b) made downstream "what changed here?" consumers light up stages that
|
|
65
|
+
* changed nothing — most visibly the lens highlight flagging every slot.
|
|
66
|
+
*
|
|
67
|
+
* ── HOW ─────────────────────────────────────────────────────────────────
|
|
68
|
+
* At commit we hold BOTH `baseSnapshot` (state when the stage began) and
|
|
69
|
+
* `workingCopy` (state after all its writes). For each path the stage touched
|
|
70
|
+
* we keep it in the bundle ONLY if its final value differs from the base
|
|
71
|
+
* value ({@link deepEqual}). No-op AND write-revert paths drop out, because
|
|
72
|
+
* both compare equal to base. This is a single net-delta diff at commit time
|
|
73
|
+
* — one deep compare per touched path, O(changed state), paid once per stage
|
|
74
|
+
* (NOT per write). A naive per-write deep-equal skip would be more expensive
|
|
75
|
+
* and would still miss write-revert (the intermediate write differs from the
|
|
76
|
+
* value present at the moment of writing).
|
|
77
|
+
*
|
|
78
|
+
* ── TWO HONEST TIERS (by design — do not "unify" them) ──────────────────
|
|
79
|
+
* • commit (here) = CHANGE-level — truthful net delta. Feeds the commit
|
|
80
|
+
* log, causal chain, narrative, and the lens highlight.
|
|
81
|
+
* • `onWrite` event = OP-level — fires on EVERY write attempt regardless of
|
|
82
|
+
* net change. Feeds metrics / behavioural observability
|
|
83
|
+
* (a debugger wants to see "wrote 2, then reverted").
|
|
84
|
+
* `onWrite` is unchanged by this method; only the COMMIT becomes change-only.
|
|
85
|
+
*
|
|
86
|
+
* ── EMPTY COMMITS ARE INTENTIONAL ───────────────────────────────────────
|
|
87
|
+
* A stage that nets no change commits an EMPTY patch — NOT nothing.
|
|
88
|
+
* {@link StageContext.commit} still records the bundle unconditionally, so
|
|
89
|
+
* every executed stage remains a time-travel cursor stop (its `runtimeStageId`
|
|
90
|
+
* marker is preserved); only its PATCH is empty. This is what keeps the
|
|
91
|
+
* commit-indexed slider stable while making the highlight truthful.
|
|
92
|
+
*
|
|
93
|
+
* ── KNOWN LIMITATIONS / FUTURE ──────────────────────────────────────────
|
|
94
|
+
* • Explicit key DELETION is still unrepresentable in MemoryPatch (a removed
|
|
95
|
+
* key cannot be expressed). Setting a key to `undefined` is treated as a
|
|
96
|
+
* change (value differs from base), not a deletion. Tracked for a future
|
|
97
|
+
* `delete` verb.
|
|
98
|
+
* • Array-merge dedup in {@link deepSmartMerge} still uses reference equality
|
|
99
|
+
* (`new Set`), so deep-equal *objects* in a merged array are not deduped.
|
|
100
|
+
* Orthogonal to this change; tracked separately.
|
|
101
|
+
*
|
|
49
102
|
* Resets the buffer to empty state after commit.
|
|
50
103
|
*/
|
|
51
104
|
commit() {
|
|
52
|
-
const payload =
|
|
53
|
-
overwrite: structuredClone(this.overwritePatch),
|
|
54
|
-
updates: structuredClone(this.updatePatch),
|
|
55
|
-
redactedPaths: new Set(this.redactedPaths),
|
|
56
|
-
trace: [...this.opTrace],
|
|
57
|
-
};
|
|
105
|
+
const payload = this.toChangeOnlyPayload();
|
|
58
106
|
this.overwritePatch = {};
|
|
59
107
|
this.updatePatch = {};
|
|
60
108
|
this.opTrace.length = 0;
|
|
@@ -62,5 +110,40 @@ export class TransactionBuffer {
|
|
|
62
110
|
this.workingCopy = {};
|
|
63
111
|
return payload;
|
|
64
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Rebuild overwrite / updates / trace keeping ONLY paths whose final value
|
|
115
|
+
* differs from the base value — i.e. the stage's net change. See
|
|
116
|
+
* {@link TransactionBuffer.commit} for the rationale.
|
|
117
|
+
*
|
|
118
|
+
* Paths are compared at the exact granularity they were written (each trace
|
|
119
|
+
* entry's path), against `workingCopy` (final) vs `baseSnapshot` (start).
|
|
120
|
+
* Surviving `set` paths copy their final value from `overwritePatch`;
|
|
121
|
+
* surviving `merge` paths copy their accumulated delta from `updatePatch` —
|
|
122
|
+
* preserving the set-vs-merge verb so replay ({@link applySmartMerge}) is
|
|
123
|
+
* byte-for-byte identical to recording only the real changes.
|
|
124
|
+
*/
|
|
125
|
+
toChangeOnlyPayload() {
|
|
126
|
+
const overwrite = {};
|
|
127
|
+
const updates = {};
|
|
128
|
+
const trace = [];
|
|
129
|
+
const survivingPaths = new Set();
|
|
130
|
+
for (const op of this.opTrace) {
|
|
131
|
+
const segments = op.path.split(DELIM);
|
|
132
|
+
const before = _get(this.baseSnapshot, segments);
|
|
133
|
+
const after = _get(this.workingCopy, segments);
|
|
134
|
+
if (deepEqual(before, after))
|
|
135
|
+
continue; // no-op or write-then-revert → no net change
|
|
136
|
+
trace.push(op);
|
|
137
|
+
survivingPaths.add(op.path);
|
|
138
|
+
if (op.verb === 'set') {
|
|
139
|
+
_set(overwrite, segments, structuredClone(_get(this.overwritePatch, segments)));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
_set(updates, segments, structuredClone(_get(this.updatePatch, segments)));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const redactedPaths = new Set([...this.redactedPaths].filter((path) => survivingPaths.has(path)));
|
|
146
|
+
return { overwrite, updates, redactedPaths, trace };
|
|
147
|
+
}
|
|
65
148
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0QsTUFBTSxPQUFPLGlCQUFpQjtJQUNYLFlBQVksQ0FBTTtJQUMzQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUE4QyxFQUFFLENBQUM7SUFDeEQsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFMUMsWUFBWSxJQUFTO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCw0Q0FBNEM7SUFDNUMsR0FBRyxDQUFDLElBQXlCLEVBQUUsS0FBVSxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsS0FBSyxDQUFDLElBQXlCLEVBQUUsS0FBVSxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQy9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsaUVBQWlFO0lBQ2pFLEdBQUcsQ0FBQyxJQUF5QixFQUFFLFlBQWtCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNO1FBTUosTUFBTSxPQUFPLEdBQUc7WUFDZCxTQUFTLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDL0MsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzFDLGFBQWEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzFDLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUN6QixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFFdEIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1ZmZlciDigJQgVHJhbnNhY3Rpb25hbCB3cml0ZSBidWZmZXIgZm9yIHN0YWdlIG11dGF0aW9uc1xuICpcbiAqIENvbGxlY3RzIHdyaXRlcyBkdXJpbmcgZXhlY3V0aW9uIGFuZCBjb21taXRzIHRoZW0gYXRvbWljYWxseS5cbiAqIExpa2UgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBidWZmZXI6XG4gKiAtIENoYW5nZXMgc3RhZ2VkIGhlcmUgYmVmb3JlIGJlaW5nIGNvbW1pdHRlZCB0byBTaGFyZWRNZW1vcnlcbiAqIC0gRW5hYmxlcyByZWFkLWFmdGVyLXdyaXRlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIHN0YWdlXG4gKiAtIFJlY29yZHMgb3BlcmF0aW9uIHRyYWNlIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheVxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVTZXQgYXMgX3NldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWVwU21hcnRNZXJnZSwgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWZmZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihiYXNlOiBhbnkpIHtcbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICB9XG5cbiAgLyoqIEhhcmQgb3ZlcndyaXRlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gKi9cbiAgc2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB2YWx1ZSk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgocGF0aCkpO1xuICAgIH1cbiAgICB0aGlzLm9wVHJhY2UucHVzaCh7IHBhdGg6IG5vcm1hbGlzZVBhdGgocGF0aCksIHZlcmI6ICdzZXQnIH0pO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiAqL1xuICBtZXJnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoKSA/PyB7fTtcbiAgICBjb25zdCBtZXJnZWQgPSBkZWVwU21hcnRNZXJnZShleGlzdGluZywgdmFsdWUpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnbWVyZ2UnIH0pO1xuICB9XG5cbiAgLyoqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYWxsIHN0YWdlZCBtdXRhdGlvbnMgYW5kIHJldHVybiB0aGUgY29tbWl0IGJ1bmRsZS5cbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIG92ZXJ3cml0ZTogc3RydWN0dXJlZENsb25lKHRoaXMub3ZlcndyaXRlUGF0Y2gpLFxuICAgICAgdXBkYXRlczogc3RydWN0dXJlZENsb25lKHRoaXMudXBkYXRlUGF0Y2gpLFxuICAgICAgcmVkYWN0ZWRQYXRoczogbmV3IFNldCh0aGlzLnJlZGFjdGVkUGF0aHMpLFxuICAgICAgdHJhY2U6IFsuLi50aGlzLm9wVHJhY2VdLFxuICAgIH07XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMud29ya2luZ0NvcHkgPSB7fTtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG59XG4iXX0=
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU3RSxNQUFNLE9BQU8saUJBQWlCO0lBQ1gsWUFBWSxDQUFNO0lBQzNCLFdBQVcsQ0FBTTtJQUVqQixjQUFjLEdBQWdCLEVBQUUsQ0FBQztJQUNqQyxXQUFXLEdBQWdCLEVBQUUsQ0FBQztJQUM5QixPQUFPLEdBQThDLEVBQUUsQ0FBQztJQUN4RCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUUxQyxZQUFZLElBQVM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxHQUFHLENBQUMsSUFBeUIsRUFBRSxLQUFVLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFDN0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxLQUFLLENBQUMsSUFBeUIsRUFBRSxLQUFVLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEYsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsR0FBRyxDQUFDLElBQXlCLEVBQUUsWUFBa0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdERztJQUNILE1BQU07UUFNSixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUUzQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUV0QixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxtQkFBbUI7UUFNekIsTUFBTSxTQUFTLEdBQWdCLEVBQUUsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBZ0IsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUE4QyxFQUFFLENBQUM7UUFDNUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNqRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO2dCQUFFLFNBQVMsQ0FBQyw2Q0FBNkM7WUFFckYsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNmLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDdEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1ZmZlciDigJQgVHJhbnNhY3Rpb25hbCB3cml0ZSBidWZmZXIgZm9yIHN0YWdlIG11dGF0aW9uc1xuICpcbiAqIENvbGxlY3RzIHdyaXRlcyBkdXJpbmcgZXhlY3V0aW9uIGFuZCBjb21taXRzIHRoZW0gYXRvbWljYWxseS5cbiAqIExpa2UgYSBkYXRhYmFzZSB0cmFuc2FjdGlvbiBidWZmZXI6XG4gKiAtIENoYW5nZXMgc3RhZ2VkIGhlcmUgYmVmb3JlIGJlaW5nIGNvbW1pdHRlZCB0byBTaGFyZWRNZW1vcnlcbiAqIC0gRW5hYmxlcyByZWFkLWFmdGVyLXdyaXRlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIHN0YWdlXG4gKiAtIFJlY29yZHMgb3BlcmF0aW9uIHRyYWNlIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheVxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVTZXQgYXMgX3NldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRlZXBTbWFydE1lcmdlLCBERUxJTSwgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWZmZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihiYXNlOiBhbnkpIHtcbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICB9XG5cbiAgLyoqIEhhcmQgb3ZlcndyaXRlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gKi9cbiAgc2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB2YWx1ZSk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgocGF0aCkpO1xuICAgIH1cbiAgICB0aGlzLm9wVHJhY2UucHVzaCh7IHBhdGg6IG5vcm1hbGlzZVBhdGgocGF0aCksIHZlcmI6ICdzZXQnIH0pO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiAqL1xuICBtZXJnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoKSA/PyB7fTtcbiAgICBjb25zdCBtZXJnZWQgPSBkZWVwU21hcnRNZXJnZShleGlzdGluZywgdmFsdWUpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnbWVyZ2UnIH0pO1xuICB9XG5cbiAgLyoqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggYWxsIHN0YWdlZCBtdXRhdGlvbnMgYW5kIHJldHVybiB0aGUgY29tbWl0IGJ1bmRsZSDigJQgcmVjb3JkaW5nIHRoZVxuICAgKiBzdGFnZSdzIE5FVCBDSEFOR0UsIG5vdCBpdHMgcmF3IHdyaXRlIGxvZy5cbiAgICpcbiAgICog4pSA4pSAIFdIWSAodGhlIGRlZmVjdCB0aGlzIGZpeGVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogUHJldmlvdXNseSBldmVyeSBgc2V0YC9gbWVyZ2VgIHdhcyByZWNvcmRlZCB2ZXJiYXRpbSwgc28gdGhlIGNvbW1pdCBidW5kbGVcbiAgICogd2FzIGEgbG9nIG9mICpvcGVyYXRpb25zKiByYXRoZXIgdGhhbiAqY2hhbmdlcyouIFR3byBvcGVyYXRpb25zIHByb2R1Y2Ugbm9cbiAgICogbmV0IGNoYW5nZSB5ZXQgd2VyZSBzdGlsbCBjb21taXR0ZWQgYXMgXCJtdXRhdGlvbnNcIjpcbiAgICpcbiAgICogICAxLiBOby1vcCB3cml0ZSAgIOKAlCB3cml0aW5nIGEga2V5IHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhvbGRzIChlLmcuIGFuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGFnZW50IGNvbnRleHQgc2xvdCByZS1lbWl0dGluZyBpZGVudGljYWwgY29udGVudCBldmVyeVxuICAgKiAgICAgICAgICAgICAgICAgICAgICB0dXJuKS4gYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTEuXG4gICAqICAgMi4gV3JpdGUtcmV2ZXJ0ICDigJQgY2hhbmdpbmcgdGhlbiByZXN0b3JpbmcgYSBrZXkgd2l0aGluIG9uZSBzdGFnZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgYmFzZSBLPTEsIHN0YWdlIHdyaXRlcyBLPTIgdGhlbiBLPTEuXG4gICAqXG4gICAqIFJlY29yZGluZyB0aGVzZSBhcyBtdXRhdGlvbnMgKGEpIGJsb2F0ZWQgY2F1c2FsIHNsaWNpbmcgLyBiYWNrdHJhY2tpbmcgd2l0aFxuICAgKiBzcHVyaW91cyBkZXBlbmRlbmNpZXMgb24gaW50ZXJtZWRpYXRlIHZhbHVlcyB0aGF0IG5ldmVyIHJlYWNoIGZpbmFsIHN0YXRlLFxuICAgKiBhbmQgKGIpIG1hZGUgZG93bnN0cmVhbSBcIndoYXQgY2hhbmdlZCBoZXJlP1wiIGNvbnN1bWVycyBsaWdodCB1cCBzdGFnZXMgdGhhdFxuICAgKiBjaGFuZ2VkIG5vdGhpbmcg4oCUIG1vc3QgdmlzaWJseSB0aGUgbGVucyBoaWdobGlnaHQgZmxhZ2dpbmcgZXZlcnkgc2xvdC5cbiAgICpcbiAgICog4pSA4pSAIEhPVyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogQXQgY29tbWl0IHdlIGhvbGQgQk9USCBgYmFzZVNuYXBzaG90YCAoc3RhdGUgd2hlbiB0aGUgc3RhZ2UgYmVnYW4pIGFuZFxuICAgKiBgd29ya2luZ0NvcHlgIChzdGF0ZSBhZnRlciBhbGwgaXRzIHdyaXRlcykuIEZvciBlYWNoIHBhdGggdGhlIHN0YWdlIHRvdWNoZWRcbiAgICogd2Uga2VlcCBpdCBpbiB0aGUgYnVuZGxlIE9OTFkgaWYgaXRzIGZpbmFsIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgYmFzZVxuICAgKiB2YWx1ZSAoe0BsaW5rIGRlZXBFcXVhbH0pLiBOby1vcCBBTkQgd3JpdGUtcmV2ZXJ0IHBhdGhzIGRyb3Agb3V0LCBiZWNhdXNlXG4gICAqIGJvdGggY29tcGFyZSBlcXVhbCB0byBiYXNlLiBUaGlzIGlzIGEgc2luZ2xlIG5ldC1kZWx0YSBkaWZmIGF0IGNvbW1pdCB0aW1lXG4gICAqIOKAlCBvbmUgZGVlcCBjb21wYXJlIHBlciB0b3VjaGVkIHBhdGgsIE8oY2hhbmdlZCBzdGF0ZSksIHBhaWQgb25jZSBwZXIgc3RhZ2VcbiAgICogKE5PVCBwZXIgd3JpdGUpLiBBIG5haXZlIHBlci13cml0ZSBkZWVwLWVxdWFsIHNraXAgd291bGQgYmUgbW9yZSBleHBlbnNpdmVcbiAgICogYW5kIHdvdWxkIHN0aWxsIG1pc3Mgd3JpdGUtcmV2ZXJ0ICh0aGUgaW50ZXJtZWRpYXRlIHdyaXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICogdmFsdWUgcHJlc2VudCBhdCB0aGUgbW9tZW50IG9mIHdyaXRpbmcpLlxuICAgKlxuICAgKiDilIDilIAgVFdPIEhPTkVTVCBUSUVSUyAoYnkgZGVzaWduIOKAlCBkbyBub3QgXCJ1bmlmeVwiIHRoZW0pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiAgIOKAoiBjb21taXQgKGhlcmUpICAgPSBDSEFOR0UtbGV2ZWwg4oCUIHRydXRoZnVsIG5ldCBkZWx0YS4gRmVlZHMgdGhlIGNvbW1pdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbG9nLCBjYXVzYWwgY2hhaW4sIG5hcnJhdGl2ZSwgYW5kIHRoZSBsZW5zIGhpZ2hsaWdodC5cbiAgICogICDigKIgYG9uV3JpdGVgIGV2ZW50ID0gT1AtbGV2ZWwg4oCUIGZpcmVzIG9uIEVWRVJZIHdyaXRlIGF0dGVtcHQgcmVnYXJkbGVzcyBvZlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgbmV0IGNoYW5nZS4gRmVlZHMgbWV0cmljcyAvIGJlaGF2aW91cmFsIG9ic2VydmFiaWxpdHlcbiAgICogICAgICAgICAgICAgICAgICAgICAgIChhIGRlYnVnZ2VyIHdhbnRzIHRvIHNlZSBcIndyb3RlIDIsIHRoZW4gcmV2ZXJ0ZWRcIikuXG4gICAqIGBvbldyaXRlYCBpcyB1bmNoYW5nZWQgYnkgdGhpcyBtZXRob2Q7IG9ubHkgdGhlIENPTU1JVCBiZWNvbWVzIGNoYW5nZS1vbmx5LlxuICAgKlxuICAgKiDilIDilIAgRU1QVFkgQ09NTUlUUyBBUkUgSU5URU5USU9OQUwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEEgc3RhZ2UgdGhhdCBuZXRzIG5vIGNoYW5nZSBjb21taXRzIGFuIEVNUFRZIHBhdGNoIOKAlCBOT1Qgbm90aGluZy5cbiAgICoge0BsaW5rIFN0YWdlQ29udGV4dC5jb21taXR9IHN0aWxsIHJlY29yZHMgdGhlIGJ1bmRsZSB1bmNvbmRpdGlvbmFsbHksIHNvXG4gICAqIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCAoaXRzIGBydW50aW1lU3RhZ2VJZGBcbiAgICogbWFya2VyIGlzIHByZXNlcnZlZCk7IG9ubHkgaXRzIFBBVENIIGlzIGVtcHR5LiBUaGlzIGlzIHdoYXQga2VlcHMgdGhlXG4gICAqIGNvbW1pdC1pbmRleGVkIHNsaWRlciBzdGFibGUgd2hpbGUgbWFraW5nIHRoZSBoaWdobGlnaHQgdHJ1dGhmdWwuXG4gICAqXG4gICAqIOKUgOKUgCBLTk9XTiBMSU1JVEFUSU9OUyAvIEZVVFVSRSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgRXhwbGljaXQga2V5IERFTEVUSU9OIGlzIHN0aWxsIHVucmVwcmVzZW50YWJsZSBpbiBNZW1vcnlQYXRjaCAoYSByZW1vdmVkXG4gICAqICAgICBrZXkgY2Fubm90IGJlIGV4cHJlc3NlZCkuIFNldHRpbmcgYSBrZXkgdG8gYHVuZGVmaW5lZGAgaXMgdHJlYXRlZCBhcyBhXG4gICAqICAgICBjaGFuZ2UgKHZhbHVlIGRpZmZlcnMgZnJvbSBiYXNlKSwgbm90IGEgZGVsZXRpb24uIFRyYWNrZWQgZm9yIGEgZnV0dXJlXG4gICAqICAgICBgZGVsZXRlYCB2ZXJiLlxuICAgKiAgIOKAoiBBcnJheS1tZXJnZSBkZWR1cCBpbiB7QGxpbmsgZGVlcFNtYXJ0TWVyZ2V9IHN0aWxsIHVzZXMgcmVmZXJlbmNlIGVxdWFsaXR5XG4gICAqICAgICAoYG5ldyBTZXRgKSwgc28gZGVlcC1lcXVhbCAqb2JqZWN0cyogaW4gYSBtZXJnZWQgYXJyYXkgYXJlIG5vdCBkZWR1cGVkLlxuICAgKiAgICAgT3J0aG9nb25hbCB0byB0aGlzIGNoYW5nZTsgdHJhY2tlZCBzZXBhcmF0ZWx5LlxuICAgKlxuICAgKiBSZXNldHMgdGhlIGJ1ZmZlciB0byBlbXB0eSBzdGF0ZSBhZnRlciBjb21taXQuXG4gICAqL1xuICBjb21taXQoKToge1xuICAgIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gICAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG4gICAgcmVkYWN0ZWRQYXRoczogU2V0PHN0cmluZz47XG4gICAgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdO1xuICB9IHtcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy50b0NoYW5nZU9ubHlQYXlsb2FkKCk7XG5cbiAgICB0aGlzLm92ZXJ3cml0ZVBhdGNoID0ge307XG4gICAgdGhpcy51cGRhdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMub3BUcmFjZS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkYWN0ZWRQYXRocy5jbGVhcigpO1xuICAgIHRoaXMud29ya2luZ0NvcHkgPSB7fTtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAg4oCUXG4gICAqIHByZXNlcnZpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIHNvIHJlcGxheSAoe0BsaW5rIGFwcGx5U21hcnRNZXJnZX0pIGlzXG4gICAqIGJ5dGUtZm9yLWJ5dGUgaWRlbnRpY2FsIHRvIHJlY29yZGluZyBvbmx5IHRoZSByZWFsIGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHRvQ2hhbmdlT25seVBheWxvYWQoKToge1xuICAgIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gICAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG4gICAgcmVkYWN0ZWRQYXRoczogU2V0PHN0cmluZz47XG4gICAgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdO1xuICB9IHtcbiAgICBjb25zdCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoID0ge307XG4gICAgY29uc3QgdXBkYXRlczogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgICBjb25zdCB0cmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB9W10gPSBbXTtcbiAgICBjb25zdCBzdXJ2aXZpbmdQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBvcCBvZiB0aGlzLm9wVHJhY2UpIHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICBjb25zdCBiZWZvcmUgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyk7XG4gICAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpO1xuICAgICAgaWYgKGRlZXBFcXVhbChiZWZvcmUsIGFmdGVyKSkgY29udGludWU7IC8vIG5vLW9wIG9yIHdyaXRlLXRoZW4tcmV2ZXJ0IOKGkiBubyBuZXQgY2hhbmdlXG5cbiAgICAgIHRyYWNlLnB1c2gob3ApO1xuICAgICAgc3Vydml2aW5nUGF0aHMuYWRkKG9wLnBhdGgpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdzZXQnKSB7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gbmV3IFNldChbLi4udGhpcy5yZWRhY3RlZFBhdGhzXS5maWx0ZXIoKHBhdGgpID0+IHN1cnZpdmluZ1BhdGhzLmhhcyhwYXRoKSkpO1xuICAgIHJldHVybiB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgcmVkYWN0ZWRQYXRocywgdHJhY2UgfTtcbiAgfVxufVxuIl19
|
|
@@ -123,6 +123,67 @@ export function redactPatch(patch, redactedSet) {
|
|
|
123
123
|
export function normalisePath(path) {
|
|
124
124
|
return path.map(String).join(DELIM);
|
|
125
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Structural deep equality for committed-state values.
|
|
128
|
+
*
|
|
129
|
+
* Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
|
|
130
|
+
* a path or merely re-wrote / reverted it to the value it already held (a
|
|
131
|
+
* "no-op write"). Committed state is JSON-shaped — it must survive
|
|
132
|
+
* `structuredClone` — so this only needs to handle the shapes that can reach a
|
|
133
|
+
* commit: primitives, arrays, and plain objects.
|
|
134
|
+
*
|
|
135
|
+
* Semantics:
|
|
136
|
+
* - reference / identical-primitive short-circuits first (cheap fast path)
|
|
137
|
+
* - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
|
|
138
|
+
* - arrays: equal length AND deep-equal element-wise (order-sensitive)
|
|
139
|
+
* - objects: identical own-key set AND deep-equal per key
|
|
140
|
+
* - mismatched kinds (array vs object, object vs null) → not equal
|
|
141
|
+
*
|
|
142
|
+
* Cost & safety:
|
|
143
|
+
* - Allocates NOTHING but transient `Object.keys` arrays — no clones. It is
|
|
144
|
+
* strictly cheaper than the `structuredClone` the commit already performs.
|
|
145
|
+
* - Primitive comparisons (the bulk of state) are O(1) via the `===` /
|
|
146
|
+
* `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
|
|
147
|
+
* by the value's own size.
|
|
148
|
+
* - Assumes ACYCLIC, JSON-shaped values — the same contract the memory layer
|
|
149
|
+
* already relies on (committed state is `structuredClone`d and must be
|
|
150
|
+
* JSON-serialisable for checkpoints). A cyclic value is out of contract
|
|
151
|
+
* here exactly as it is for checkpointing; dev mode flags cycles at write
|
|
152
|
+
* time via `ScopeFacade.setValue`.
|
|
153
|
+
*/
|
|
154
|
+
export function deepEqual(a, b) {
|
|
155
|
+
if (a === b)
|
|
156
|
+
return true; // same reference or identical primitive
|
|
157
|
+
if (typeof a !== typeof b)
|
|
158
|
+
return false;
|
|
159
|
+
if (a === null || b === null)
|
|
160
|
+
return a === b; // one is null, the other isn't
|
|
161
|
+
if (typeof a !== 'object')
|
|
162
|
+
return Object.is(a, b); // NaN-safe primitive compare
|
|
163
|
+
const aIsArray = Array.isArray(a);
|
|
164
|
+
if (aIsArray !== Array.isArray(b))
|
|
165
|
+
return false; // array vs plain object
|
|
166
|
+
if (aIsArray) {
|
|
167
|
+
if (a.length !== b.length)
|
|
168
|
+
return false;
|
|
169
|
+
for (let i = 0; i < a.length; i++) {
|
|
170
|
+
if (!deepEqual(a[i], b[i]))
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
const aKeys = Object.keys(a);
|
|
176
|
+
const bKeys = Object.keys(b);
|
|
177
|
+
if (aKeys.length !== bKeys.length)
|
|
178
|
+
return false;
|
|
179
|
+
for (const key of aKeys) {
|
|
180
|
+
if (!Object.prototype.hasOwnProperty.call(b, key))
|
|
181
|
+
return false;
|
|
182
|
+
if (!deepEqual(a[key], b[key]))
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
126
187
|
/**
|
|
127
188
|
* Deep union merge helper.
|
|
128
189
|
* - Arrays (non-empty): union without duplicates (encounter order preserved)
|
|
@@ -169,4 +230,4 @@ export function applySmartMerge(base, updates, overwrite, trace) {
|
|
|
169
230
|
}
|
|
170
231
|
return out;
|
|
171
232
|
}
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd2RixpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUk5Qjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBYyxFQUFFLE9BQTRCLEVBQUU7SUFDakYsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3JELFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixHQUFpQixFQUNqQixLQUFhLEVBQ2IsS0FBZSxFQUNmLEtBQWEsRUFDYixLQUFRLEVBQ1IsYUFBdUI7SUFFdkIsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLFVBQVUsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSSxPQUFPLEdBQWlCLEdBQUcsQ0FBQztJQUNoQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FB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QztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixJQUFTLEVBQ1QsT0FBb0IsRUFDcEIsU0FBc0IsRUFDdEIsS0FBZ0Q7SUFFaEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBIZWxwZXIgZnVuY3Rpb25zIGZvciBuZXN0ZWQgb2JqZWN0IG1hbmlwdWxhdGlvblxuICpcbiAqIFByb3ZpZGVzIGNvbnNpc3RlbnQgcGF0aCB0cmF2ZXJzYWwgYW5kIHZhbHVlIG1hbmlwdWxhdGlvbiBmb3IgdGhlIG1lbW9yeSBzeXN0ZW0uXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIEFTQ0lJIFVuaXQtU2VwYXJhdG9yIOKAlCBjYW5ub3QgYXBwZWFyIGluIEpTIGlkZW50aWZpZXJzLCBpbnZpc2libGUgaW4gbG9ncy4gKi9cbmV4cG9ydCBjb25zdCBERUxJTSA9ICdcXHUwMDFGJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFJlc29sdmVzIHJ1bi1uYW1lc3BhY2VkIGFuZCBnbG9iYWwgcGF0aHMuXG4gKiBFYWNoIGZsb3djaGFydCBleGVjdXRpb24gKHJ1bikgc3RvcmVzIGRhdGEgdW5kZXIgYHJ1bnMve2lkfS9gIHRvIHByZXZlbnQgY29sbGlzaW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkPzogc3RyaW5nLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBydW5JZCA/IFsncnVucycsIHJ1bklkLCAuLi5wYXRoXSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGgsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgX3BhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkLCBfcGF0aCk7XG4gIGNvbnN0IHBhdGggPSBydW5QYXRoIHx8IGdsb2JhbFBhdGg7XG4gIGNvbnN0IHBhdGhDb3B5ID0gWy4uLnBhdGhdO1xuICBsZXQgY3VycmVudDogTmVzdGVkT2JqZWN0ID0gb2JqO1xuICB3aGlsZSAocGF0aENvcHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGtleSA9IHBhdGhDb3B5LnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGtleSA9PT0gcnVuSWQgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICBjdXJyZW50W2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBydW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBfcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhydW5JZCwgX3BhdGgpO1xuICBjb25zdCBwYXRoID0gcnVuUGF0aCB8fCBnbG9iYWxQYXRoO1xuICBjb25zdCBwYXRoQ29weSA9IFsuLi5wYXRoXTtcbiAgbGV0IGN1cnJlbnQ6IE5lc3RlZE9iamVjdCA9IG9iajtcbiAgd2hpbGUgKHBhdGhDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBrZXkgPSBwYXRoQ29weS5zaGlmdCgpIGFzIHN0cmluZztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBrZXkgPT09IHJ1bklkICYmIGRlZmF1bHRWYWx1ZXMgPyBkZWZhdWx0VmFsdWVzIDoge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgdXBkYXRlVmFsdWUoY3VycmVudCwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV07XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVkYWN0cyBzZW5zaXRpdmUgdmFsdWVzIGluIGEgcGF0Y2ggZm9yIGxvZ2dpbmcvZGVidWdnaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFNldDogU2V0PHN0cmluZz4pOiBNZW1vcnlQYXRjaCB7XG4gIGNvbnN0IG91dCA9IHN0cnVjdHVyZWRDbG9uZShwYXRjaCk7XG4gIGZvciAoY29uc3QgZmxhdCBvZiByZWRhY3RlZFNldCkge1xuICAgIGNvbnN0IHBhdGhBcnIgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBpZiAoX2hhcyhvdXQsIHBhdGhBcnIpKSB7XG4gICAgICBjb25zdCBjdXJyID0gX2dldChvdXQsIHBhdGhBcnIpO1xuICAgICAgaWYgKHR5cGVvZiBjdXJyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBfc2V0KG91dCwgcGF0aEFyciwgJ1JFREFDVEVEJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXNlcyBhbiBhcnJheSBwYXRoIGludG8gYSBzdGFibGUgc3RyaW5nIGtleSB1c2luZyBERUxJTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVBhdGgocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLm1hcChTdHJpbmcpLmpvaW4oREVMSU0pO1xufVxuXG4vKipcbiAqIERlZXAgdW5pb24gbWVyZ2UgaGVscGVyLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IHVuaW9uIHdpdGhvdXQgZHVwbGljYXRlcyAoZW5jb3VudGVyIG9yZGVyIHByZXNlcnZlZClcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICByZXBsYWNlIOKAlCBzcmMgYFtdYCBjbGVhcnMgdGhlIGRlc3RpbmF0aW9uIGFycmF5LlxuICogICBSYXRpb25hbGU6IHdyaXRpbmcgYHNjb3BlLnRhZ3MgPSBbXWAgbWVhbnMgXCJjbGVhciB0YWdzXCIsIG5vdCBcImFwcGVuZCBub3RoaW5nXCIuXG4gKiAgIFdpdGhvdXQgdGhpcyBydWxlLCBhbiBlbXB0eS1hcnJheSB3cml0ZSBzaWxlbnRseSBiZWNvbWVzIGEgbm8tb3Agd2hpY2ggaXNcbiAqICAgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBmcm9tIGEgYnVnLlxuICogLSBPYmplY3RzOiByZWN1cnNpdmUgbWVyZ2VcbiAqIC0gUHJpbWl0aXZlczogc291cmNlIHdpbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBTbWFydE1lcmdlKGRzdDogYW55LCBzcmM6IGFueSk6IGFueSB7XG4gIGlmIChzcmMgPT09IG51bGwgfHwgdHlwZW9mIHNyYyAhPT0gJ29iamVjdCcpIHJldHVybiBzcmM7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3JjKSkge1xuICAgIGlmIChzcmMubGVuZ3RoID09PSAwKSByZXR1cm4gW107IC8vIGVtcHR5IHNyYyA9IGNsZWFyLCBub3Qgbm8tb3BcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkc3QpKSByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmRzdCwgLi4uc3JjXSldO1xuICAgIHJldHVybiBbLi4uc3JjXTtcbiAgfVxuXG4gIGNvbnN0IG91dDogYW55ID0geyAuLi4oZHN0ICYmIHR5cGVvZiBkc3QgPT09ICdvYmplY3QnID8gZHN0IDoge30pIH07XG4gIC8vIE9iamVjdC5rZXlzKCkgaXMgb3duLWVudW1lcmFibGUtb25seSBieSBzcGVjIOKAlCBubyBERU5JRUQgY2hlY2sgbmVlZGVkIGhlcmUuXG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgb3V0W2tdID0gZGVlcFNtYXJ0TWVyZ2Uob3V0W2tdLCBzcmNba10pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIGNvbW1pdCBidW5kbGUgdG8gYSBiYXNlIHN0YXRlIGJ5IHJlcGxheWluZyBvcGVyYXRpb25zIGluIG9yZGVyLlxuICogVHdvLXBoYXNlOiBVUERBVEUgKHVuaW9uLW1lcmdlKSB0aGVuIE9WRVJXUklURSAoZGlyZWN0IHNldCkuXG4gKiBHdWFyYW50ZWVzIFwibGFzdCB3cml0ZXIgd2luc1wiIHNlbWFudGljcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U21hcnRNZXJnZShcbiAgYmFzZTogYW55LFxuICB1cGRhdGVzOiBNZW1vcnlQYXRjaCxcbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCxcbiAgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdLFxuKTogYW55IHtcbiAgY29uc3Qgb3V0ID0gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICBmb3IgKGNvbnN0IHsgcGF0aCwgdmVyYiB9IG9mIHRyYWNlKSB7XG4gICAgY29uc3Qgc2VncyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgIGlmICh2ZXJiID09PSAnc2V0Jykge1xuICAgICAgX3NldChvdXQsIHNlZ3MsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KG92ZXJ3cml0ZSwgc2VncykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudCA9IF9nZXQob3V0LCBzZWdzKSA/PyB7fTtcbiAgICAgIF9zZXQob3V0LCBzZWdzLCBkZWVwU21hcnRNZXJnZShjdXJyZW50LCBfZ2V0KHVwZGF0ZXMsIHNlZ3MpKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd2RixpRkFBaUY7QUFDakYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUk5Qjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBYyxFQUFFLE9BQTRCLEVBQUU7SUFDakYsT0FBTztRQUNMLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ3JELFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixHQUFpQixFQUNqQixLQUFhLEVBQ2IsS0FBZSxFQUNmLEtBQWEsRUFDYixLQUFRLEVBQ1IsYUFBdUI7SUFFdkIsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLFVBQVUsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSSxPQUFPLEdBQWlCLEdBQUcsQ0FBQztJQUNoQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBWSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsR0FBUSxFQUNSLEtBQXlCLEVBQ3pCLEtBQTBCLEVBQzFCLEtBQXNCLEVBQ3RCLEtBQVEsRUFDUixhQUF1QjtJQUV2QixNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksVUFBVSxDQUFDO0lBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMzQixJQUFJLE9BQU8sR0FBaUIsR0FBRyxDQUFDO0lBQ2hDLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLEtBQUssSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuQyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBVyxFQUFFLEdBQW9CLEVBQUUsS0FBVTtJQUN2RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLHdDQUF3QztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQVEsQ0FBQztZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ2pFLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFTLEVBQUUsSUFBeUIsRUFBRSxLQUF1QjtJQUMxRixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzRCxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFrQixFQUFFLFdBQXdCO0lBQ3RFLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoQyxJQUFJLE9BQU8sSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBeUI7SUFDckQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBTSxFQUFFLENBQU07SUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsd0NBQXdDO0lBQ2xFLElBQUksT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJO1FBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsK0JBQStCO0lBQzdFLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7SUFFaEYsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxJQUFJLFFBQVEsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsd0JBQXdCO0lBRXpFLElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2hELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsR0FBUSxFQUFFLEdBQVE7SUFDL0MsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUV4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsK0JBQStCO1FBQ2hFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBUSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEUsOEVBQThFO0lBQzlFLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsSUFBUyxFQUNULE9BQW9CLEVBQ3BCLFNBQXNCLEVBQ3RCLEtBQWdEO0lBRWhELE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB1dGlscy50cyDigJQgSGVscGVyIGZ1bmN0aW9ucyBmb3IgbmVzdGVkIG9iamVjdCBtYW5pcHVsYXRpb25cbiAqXG4gKiBQcm92aWRlcyBjb25zaXN0ZW50IHBhdGggdHJhdmVyc2FsIGFuZCB2YWx1ZSBtYW5pcHVsYXRpb24gZm9yIHRoZSBtZW1vcnkgc3lzdGVtLlxuICogWmVybyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0IGFzIF9nZXQsIG5hdGl2ZUhhcyBhcyBfaGFzLCBuYXRpdmVTZXQgYXMgX3NldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBBU0NJSSBVbml0LVNlcGFyYXRvciDigJQgY2Fubm90IGFwcGVhciBpbiBKUyBpZGVudGlmaWVycywgaW52aXNpYmxlIGluIGxvZ3MuICovXG5leHBvcnQgY29uc3QgREVMSU0gPSAnXFx1MDAxRic7XG5cbnR5cGUgTmVzdGVkT2JqZWN0ID0geyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuLyoqXG4gKiBSZXNvbHZlcyBydW4tbmFtZXNwYWNlZCBhbmQgZ2xvYmFsIHBhdGhzLlxuICogRWFjaCBmbG93Y2hhcnQgZXhlY3V0aW9uIChydW4pIHN0b3JlcyBkYXRhIHVuZGVyIGBydW5zL3tpZH0vYCB0byBwcmV2ZW50IGNvbGxpc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5BbmRHbG9iYWxQYXRocyhydW5JZD86IHN0cmluZywgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdKSB7XG4gIHJldHVybiB7XG4gICAgcnVuUGF0aDogcnVuSWQgPyBbJ3J1bnMnLCBydW5JZCwgLi4ucGF0aF0gOiB1bmRlZmluZWQsXG4gICAgZ2xvYmFsUGF0aDogWy4uLnBhdGhdLFxuICB9O1xufVxuXG4vKipcbiAqIFNldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoLCBjcmVhdGluZyBpbnRlcm1lZGlhdGUgb2JqZWN0cyBhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIF9wYXRoOiBzdHJpbmdbXSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhydW5JZCwgX3BhdGgpO1xuICBjb25zdCBwYXRoID0gcnVuUGF0aCB8fCBnbG9iYWxQYXRoO1xuICBjb25zdCBwYXRoQ29weSA9IFsuLi5wYXRoXTtcbiAgbGV0IGN1cnJlbnQ6IE5lc3RlZE9iamVjdCA9IG9iajtcbiAgd2hpbGUgKHBhdGhDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBrZXkgPSBwYXRoQ29weS5zaGlmdCgpIGFzIHN0cmluZztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBrZXkgPT09IHJ1bklkICYmIGRlZmF1bHRWYWx1ZXMgPyBkZWZhdWx0VmFsdWVzIDoge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgY3VycmVudFtmaWVsZF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBEZWVwLW1lcmdlcyBhIHZhbHVlIGludG8gdGhlIG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKiAtIEFycmF5czogY29uY2F0ZW5hdGVcbiAqIC0gT2JqZWN0czogc2hhbGxvdyBtZXJnZSBhdCBlYWNoIGxldmVsXG4gKiAtIFByaW1pdGl2ZXM6IHJlcGxhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IGFueSxcbiAgcnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgX3BhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIGZpZWxkOiBzdHJpbmcgfCBudW1iZXIsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IGFueSB7XG4gIGNvbnN0IHsgcnVuUGF0aCwgZ2xvYmFsUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMocnVuSWQsIF9wYXRoKTtcbiAgY29uc3QgcGF0aCA9IHJ1blBhdGggfHwgZ2xvYmFsUGF0aDtcbiAgY29uc3QgcGF0aENvcHkgPSBbLi4ucGF0aF07XG4gIGxldCBjdXJyZW50OiBOZXN0ZWRPYmplY3QgPSBvYmo7XG4gIHdoaWxlIChwYXRoQ29weS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0aENvcHkuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgY3VycmVudFtrZXldID0ga2V5ID09PSBydW5JZCAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIHVwZGF0ZVZhbHVlKGN1cnJlbnQsIGZpZWxkLCB2YWx1ZSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogSW4tcGxhY2UgdmFsdWUgdXBkYXRlIHdpdGggbWVyZ2Ugc2VtYW50aWNzLlxuICogLSBBcnJheXMgKG5vbi1lbXB0eSk6IGNvbmNhdGVuYXRlIG9udG8gZXhpc3RpbmdcbiAqIC0gQXJyYXlzIChlbXB0eSk6ICAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBgW11gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gT2JqZWN0cyAobm9uLWVtcHR5KTogc2hhbGxvdyBtZXJnZSAoc3ByZWFkKVxuICogLSBPYmplY3RzIChlbXB0eSk6ICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGB7fWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBQcmltaXRpdmVzOiBkaXJlY3QgYXNzaWdubWVudFxuICpcbiAqIE5vdGUgb24gZW1wdHkgYXJyYXlzOiBib3RoIGB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKWAgYW5kXG4gKiBgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGV2YWx1YXRlIHRoZSBzYW1lIGZvciBhcnJheXMg4oCUIGBbXWAgaXMgdHJ1dGh5IGluXG4gKiBKYXZhU2NyaXB0LCBzbyB0aGUgYCYmYCBndWFyZCB3YXMgbmV2ZXIgdGhlIGlzc3VlLiBUaGUgYWN0dWFsIGJ1ZyB3YXMgdGhlXG4gKiBjb25jYXQgcGF0aDogYFsuLi5jdXIsIC4uLltdXWAgc2lsZW50bHkgcmV0dXJuZWQgYGN1cmAgdW5jaGFuZ2VkIHdoZW4gYHZhbHVlYFxuICogd2FzIGBbXWAsIG1ha2luZyBgdXBkYXRlVmFsdWUob2JqLCAndGFncycsIFtdKWAgYSBuby1vcCBpbnN0ZWFkIG9mIGEgY2xlYXIuXG4gKiBUaGUgZml4IGlzIHRoZSBleHBsaWNpdCBgdmFsdWUubGVuZ3RoID09PSAwYCBlYXJseS1yZXR1cm4gYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWUob2JqZWN0OiBhbnksIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogWy4uLmN1ciwgLi4udmFsdWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgb2JqZWN0W2tleV0gPSBjdXIgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi5jdXIsIC4uLnZhbHVlIH07XG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZGFjdHMgc2Vuc2l0aXZlIHZhbHVlcyBpbiBhIHBhdGNoIGZvciBsb2dnaW5nL2RlYnVnZ2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRTZXQ6IFNldDxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICBjb25zdCBvdXQgPSBzdHJ1Y3R1cmVkQ2xvbmUocGF0Y2gpO1xuICBmb3IgKGNvbnN0IGZsYXQgb2YgcmVkYWN0ZWRTZXQpIHtcbiAgICBjb25zdCBwYXRoQXJyID0gZmxhdC5zcGxpdChERUxJTSk7XG4gICAgaWYgKF9oYXMob3V0LCBwYXRoQXJyKSkge1xuICAgICAgY29uc3QgY3VyciA9IF9nZXQob3V0LCBwYXRoQXJyKTtcbiAgICAgIGlmICh0eXBlb2YgY3VyciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgX3NldChvdXQsIHBhdGhBcnIsICdSRURBQ1RFRCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE5vcm1hbGlzZXMgYW4gYXJyYXkgcGF0aCBpbnRvIGEgc3RhYmxlIHN0cmluZyBrZXkgdXNpbmcgREVMSU0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpc2VQYXRoKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5tYXAoU3RyaW5nKS5qb2luKERFTElNKTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRlZXAgZXF1YWxpdHkgZm9yIGNvbW1pdHRlZC1zdGF0ZSB2YWx1ZXMuXG4gKlxuICogVXNlZCBieSB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXJ9IHRvIGRlY2lkZSB3aGV0aGVyIGEgc3RhZ2UgYWN0dWFsbHkgQ0hBTkdFRFxuICogYSBwYXRoIG9yIG1lcmVseSByZS13cm90ZSAvIHJldmVydGVkIGl0IHRvIHRoZSB2YWx1ZSBpdCBhbHJlYWR5IGhlbGQgKGFcbiAqIFwibm8tb3Agd3JpdGVcIikuIENvbW1pdHRlZCBzdGF0ZSBpcyBKU09OLXNoYXBlZCDigJQgaXQgbXVzdCBzdXJ2aXZlXG4gKiBgc3RydWN0dXJlZENsb25lYCDigJQgc28gdGhpcyBvbmx5IG5lZWRzIHRvIGhhbmRsZSB0aGUgc2hhcGVzIHRoYXQgY2FuIHJlYWNoIGFcbiAqIGNvbW1pdDogcHJpbWl0aXZlcywgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy5cbiAqXG4gKiBTZW1hbnRpY3M6XG4gKiAgIC0gcmVmZXJlbmNlIC8gaWRlbnRpY2FsLXByaW1pdGl2ZSBzaG9ydC1jaXJjdWl0cyBmaXJzdCAoY2hlYXAgZmFzdCBwYXRoKVxuICogICAtIGBOYU5gIGVxdWFscyBgTmFOYCAocHJpbWl0aXZlIGNvbXBhcmUgZmFsbHMgYmFjayB0byBgT2JqZWN0LmlzYClcbiAqICAgLSBhcnJheXM6IGVxdWFsIGxlbmd0aCBBTkQgZGVlcC1lcXVhbCBlbGVtZW50LXdpc2UgKG9yZGVyLXNlbnNpdGl2ZSlcbiAqICAgLSBvYmplY3RzOiBpZGVudGljYWwgb3duLWtleSBzZXQgQU5EIGRlZXAtZXF1YWwgcGVyIGtleVxuICogICAtIG1pc21hdGNoZWQga2luZHMgKGFycmF5IHZzIG9iamVjdCwgb2JqZWN0IHZzIG51bGwpIOKGkiBub3QgZXF1YWxcbiAqXG4gKiBDb3N0ICYgc2FmZXR5OlxuICogICAtIEFsbG9jYXRlcyBOT1RISU5HIGJ1dCB0cmFuc2llbnQgYE9iamVjdC5rZXlzYCBhcnJheXMg4oCUIG5vIGNsb25lcy4gSXQgaXNcbiAqICAgICBzdHJpY3RseSBjaGVhcGVyIHRoYW4gdGhlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHRoZSBjb21taXQgYWxyZWFkeSBwZXJmb3Jtcy5cbiAqICAgLSBQcmltaXRpdmUgY29tcGFyaXNvbnMgKHRoZSBidWxrIG9mIHN0YXRlKSBhcmUgTygxKSB2aWEgdGhlIGA9PT1gIC9cbiAqICAgICBgT2JqZWN0LmlzYCBmYXN0IHBhdGhzOyBvbmx5IG5lc3RlZCBvYmplY3RzL2FycmF5cyBpbmN1ciBhIHdhbGssIGJvdW5kZWRcbiAqICAgICBieSB0aGUgdmFsdWUncyBvd24gc2l6ZS5cbiAqICAgLSBBc3N1bWVzIEFDWUNMSUMsIEpTT04tc2hhcGVkIHZhbHVlcyDigJQgdGhlIHNhbWUgY29udHJhY3QgdGhlIG1lbW9yeSBsYXllclxuICogICAgIGFscmVhZHkgcmVsaWVzIG9uIChjb21taXR0ZWQgc3RhdGUgaXMgYHN0cnVjdHVyZWRDbG9uZWBkIGFuZCBtdXN0IGJlXG4gKiAgICAgSlNPTi1zZXJpYWxpc2FibGUgZm9yIGNoZWNrcG9pbnRzKS4gQSBjeWNsaWMgdmFsdWUgaXMgb3V0IG9mIGNvbnRyYWN0XG4gKiAgICAgaGVyZSBleGFjdGx5IGFzIGl0IGlzIGZvciBjaGVja3BvaW50aW5nOyBkZXYgbW9kZSBmbGFncyBjeWNsZXMgYXQgd3JpdGVcbiAqICAgICB0aW1lIHZpYSBgU2NvcGVGYWNhZGUuc2V0VmFsdWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTsgLy8gc2FtZSByZWZlcmVuY2Ugb3IgaWRlbnRpY2FsIHByaW1pdGl2ZVxuICBpZiAodHlwZW9mIGEgIT09IHR5cGVvZiBiKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHJldHVybiBhID09PSBiOyAvLyBvbmUgaXMgbnVsbCwgdGhlIG90aGVyIGlzbid0XG4gIGlmICh0eXBlb2YgYSAhPT0gJ29iamVjdCcpIHJldHVybiBPYmplY3QuaXMoYSwgYik7IC8vIE5hTi1zYWZlIHByaW1pdGl2ZSBjb21wYXJlXG5cbiAgY29uc3QgYUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGEpO1xuICBpZiAoYUlzQXJyYXkgIT09IEFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTsgLy8gYXJyYXkgdnMgcGxhaW4gb2JqZWN0XG5cbiAgaWYgKGFJc0FycmF5KSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgYUtleXMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogRGVlcCB1bmlvbiBtZXJnZSBoZWxwZXIuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogdW5pb24gd2l0aG91dCBkdXBsaWNhdGVzIChlbmNvdW50ZXIgb3JkZXIgcHJlc2VydmVkKVxuICogLSBBcnJheXMgKGVtcHR5KTogICAgIHJlcGxhY2Ug4oCUIHNyYyBgW11gIGNsZWFycyB0aGUgZGVzdGluYXRpb24gYXJyYXkuXG4gKiAgIFJhdGlvbmFsZTogd3JpdGluZyBgc2NvcGUudGFncyA9IFtdYCBtZWFucyBcImNsZWFyIHRhZ3NcIiwgbm90IFwiYXBwZW5kIG5vdGhpbmdcIi5cbiAqICAgV2l0aG91dCB0aGlzIHJ1bGUsIGFuIGVtcHR5LWFycmF5IHdyaXRlIHNpbGVudGx5IGJlY29tZXMgYSBuby1vcCB3aGljaCBpc1xuICogICBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGZyb20gYSBidWcuXG4gKiAtIE9iamVjdHM6IHJlY3Vyc2l2ZSBtZXJnZVxuICogLSBQcmltaXRpdmVzOiBzb3VyY2Ugd2luc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFNtYXJ0TWVyZ2UoZHN0OiBhbnksIHNyYzogYW55KTogYW55IHtcbiAgaWYgKHNyYyA9PT0gbnVsbCB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JykgcmV0dXJuIHNyYztcblxuICBpZiAoQXJyYXkuaXNBcnJheShzcmMpKSB7XG4gICAgaWYgKHNyYy5sZW5ndGggPT09IDApIHJldHVybiBbXTsgLy8gZW1wdHkgc3JjID0gY2xlYXIsIG5vdCBuby1vcFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRzdCkpIHJldHVybiBbLi4ubmV3IFNldChbLi4uZHN0LCAuLi5zcmNdKV07XG4gICAgcmV0dXJuIFsuLi5zcmNdO1xuICB9XG5cbiAgY29uc3Qgb3V0OiBhbnkgPSB7IC4uLihkc3QgJiYgdHlwZW9mIGRzdCA9PT0gJ29iamVjdCcgPyBkc3QgOiB7fSkgfTtcbiAgLy8gT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5IGJ5IHNwZWMg4oCUIG5vIERFTklFRCBjaGVjayBuZWVkZWQgaGVyZS5cbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNyYykpIHtcbiAgICBvdXRba10gPSBkZWVwU21hcnRNZXJnZShvdXRba10sIHNyY1trXSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSB0byBhIGJhc2Ugc3RhdGUgYnkgcmVwbGF5aW5nIG9wZXJhdGlvbnMgaW4gb3JkZXIuXG4gKiBUd28tcGhhc2U6IFVQREFURSAodW5pb24tbWVyZ2UpIHRoZW4gT1ZFUldSSVRFIChkaXJlY3Qgc2V0KS5cbiAqIEd1YXJhbnRlZXMgXCJsYXN0IHdyaXRlciB3aW5zXCIgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTbWFydE1lcmdlKFxuICBiYXNlOiBhbnksXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLFxuICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICB0cmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB9W10sXG4pOiBhbnkge1xuICBjb25zdCBvdXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIGZvciAoY29uc3QgeyBwYXRoLCB2ZXJiIH0gb2YgdHJhY2UpIHtcbiAgICBjb25zdCBzZWdzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgaWYgKHZlcmIgPT09ICdzZXQnKSB7XG4gICAgICBfc2V0KG91dCwgc2Vncywgc3RydWN0dXJlZENsb25lKF9nZXQob3ZlcndyaXRlLCBzZWdzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gX2dldChvdXQsIHNlZ3MpID8/IHt9O1xuICAgICAgX3NldChvdXQsIHNlZ3MsIGRlZXBTbWFydE1lcmdlKGN1cnJlbnQsIF9nZXQodXBkYXRlcywgc2VncykpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
@@ -48,16 +48,64 @@ class TransactionBuffer {
|
|
|
48
48
|
return (0, pathOps_js_1.nativeGet)(this.workingCopy, path, defaultValue);
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
|
-
* Flush all staged mutations and return the commit bundle
|
|
51
|
+
* Flush all staged mutations and return the commit bundle — recording the
|
|
52
|
+
* stage's NET CHANGE, not its raw write log.
|
|
53
|
+
*
|
|
54
|
+
* ── WHY (the defect this fixes) ─────────────────────────────────────────
|
|
55
|
+
* Previously every `set`/`merge` was recorded verbatim, so the commit bundle
|
|
56
|
+
* was a log of *operations* rather than *changes*. Two operations produce no
|
|
57
|
+
* net change yet were still committed as "mutations":
|
|
58
|
+
*
|
|
59
|
+
* 1. No-op write — writing a key the value it already holds (e.g. an
|
|
60
|
+
* agent context slot re-emitting identical content every
|
|
61
|
+
* turn). base K=1, stage writes K=1.
|
|
62
|
+
* 2. Write-revert — changing then restoring a key within one stage.
|
|
63
|
+
* base K=1, stage writes K=2 then K=1.
|
|
64
|
+
*
|
|
65
|
+
* Recording these as mutations (a) bloated causal slicing / backtracking with
|
|
66
|
+
* spurious dependencies on intermediate values that never reach final state,
|
|
67
|
+
* and (b) made downstream "what changed here?" consumers light up stages that
|
|
68
|
+
* changed nothing — most visibly the lens highlight flagging every slot.
|
|
69
|
+
*
|
|
70
|
+
* ── HOW ─────────────────────────────────────────────────────────────────
|
|
71
|
+
* At commit we hold BOTH `baseSnapshot` (state when the stage began) and
|
|
72
|
+
* `workingCopy` (state after all its writes). For each path the stage touched
|
|
73
|
+
* we keep it in the bundle ONLY if its final value differs from the base
|
|
74
|
+
* value ({@link deepEqual}). No-op AND write-revert paths drop out, because
|
|
75
|
+
* both compare equal to base. This is a single net-delta diff at commit time
|
|
76
|
+
* — one deep compare per touched path, O(changed state), paid once per stage
|
|
77
|
+
* (NOT per write). A naive per-write deep-equal skip would be more expensive
|
|
78
|
+
* and would still miss write-revert (the intermediate write differs from the
|
|
79
|
+
* value present at the moment of writing).
|
|
80
|
+
*
|
|
81
|
+
* ── TWO HONEST TIERS (by design — do not "unify" them) ──────────────────
|
|
82
|
+
* • commit (here) = CHANGE-level — truthful net delta. Feeds the commit
|
|
83
|
+
* log, causal chain, narrative, and the lens highlight.
|
|
84
|
+
* • `onWrite` event = OP-level — fires on EVERY write attempt regardless of
|
|
85
|
+
* net change. Feeds metrics / behavioural observability
|
|
86
|
+
* (a debugger wants to see "wrote 2, then reverted").
|
|
87
|
+
* `onWrite` is unchanged by this method; only the COMMIT becomes change-only.
|
|
88
|
+
*
|
|
89
|
+
* ── EMPTY COMMITS ARE INTENTIONAL ───────────────────────────────────────
|
|
90
|
+
* A stage that nets no change commits an EMPTY patch — NOT nothing.
|
|
91
|
+
* {@link StageContext.commit} still records the bundle unconditionally, so
|
|
92
|
+
* every executed stage remains a time-travel cursor stop (its `runtimeStageId`
|
|
93
|
+
* marker is preserved); only its PATCH is empty. This is what keeps the
|
|
94
|
+
* commit-indexed slider stable while making the highlight truthful.
|
|
95
|
+
*
|
|
96
|
+
* ── KNOWN LIMITATIONS / FUTURE ──────────────────────────────────────────
|
|
97
|
+
* • Explicit key DELETION is still unrepresentable in MemoryPatch (a removed
|
|
98
|
+
* key cannot be expressed). Setting a key to `undefined` is treated as a
|
|
99
|
+
* change (value differs from base), not a deletion. Tracked for a future
|
|
100
|
+
* `delete` verb.
|
|
101
|
+
* • Array-merge dedup in {@link deepSmartMerge} still uses reference equality
|
|
102
|
+
* (`new Set`), so deep-equal *objects* in a merged array are not deduped.
|
|
103
|
+
* Orthogonal to this change; tracked separately.
|
|
104
|
+
*
|
|
52
105
|
* Resets the buffer to empty state after commit.
|
|
53
106
|
*/
|
|
54
107
|
commit() {
|
|
55
|
-
const payload =
|
|
56
|
-
overwrite: structuredClone(this.overwritePatch),
|
|
57
|
-
updates: structuredClone(this.updatePatch),
|
|
58
|
-
redactedPaths: new Set(this.redactedPaths),
|
|
59
|
-
trace: [...this.opTrace],
|
|
60
|
-
};
|
|
108
|
+
const payload = this.toChangeOnlyPayload();
|
|
61
109
|
this.overwritePatch = {};
|
|
62
110
|
this.updatePatch = {};
|
|
63
111
|
this.opTrace.length = 0;
|
|
@@ -65,6 +113,41 @@ class TransactionBuffer {
|
|
|
65
113
|
this.workingCopy = {};
|
|
66
114
|
return payload;
|
|
67
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Rebuild overwrite / updates / trace keeping ONLY paths whose final value
|
|
118
|
+
* differs from the base value — i.e. the stage's net change. See
|
|
119
|
+
* {@link TransactionBuffer.commit} for the rationale.
|
|
120
|
+
*
|
|
121
|
+
* Paths are compared at the exact granularity they were written (each trace
|
|
122
|
+
* entry's path), against `workingCopy` (final) vs `baseSnapshot` (start).
|
|
123
|
+
* Surviving `set` paths copy their final value from `overwritePatch`;
|
|
124
|
+
* surviving `merge` paths copy their accumulated delta from `updatePatch` —
|
|
125
|
+
* preserving the set-vs-merge verb so replay ({@link applySmartMerge}) is
|
|
126
|
+
* byte-for-byte identical to recording only the real changes.
|
|
127
|
+
*/
|
|
128
|
+
toChangeOnlyPayload() {
|
|
129
|
+
const overwrite = {};
|
|
130
|
+
const updates = {};
|
|
131
|
+
const trace = [];
|
|
132
|
+
const survivingPaths = new Set();
|
|
133
|
+
for (const op of this.opTrace) {
|
|
134
|
+
const segments = op.path.split(utils_js_1.DELIM);
|
|
135
|
+
const before = (0, pathOps_js_1.nativeGet)(this.baseSnapshot, segments);
|
|
136
|
+
const after = (0, pathOps_js_1.nativeGet)(this.workingCopy, segments);
|
|
137
|
+
if ((0, utils_js_1.deepEqual)(before, after))
|
|
138
|
+
continue; // no-op or write-then-revert → no net change
|
|
139
|
+
trace.push(op);
|
|
140
|
+
survivingPaths.add(op.path);
|
|
141
|
+
if (op.verb === 'set') {
|
|
142
|
+
(0, pathOps_js_1.nativeSet)(overwrite, segments, structuredClone((0, pathOps_js_1.nativeGet)(this.overwritePatch, segments)));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
(0, pathOps_js_1.nativeSet)(updates, segments, structuredClone((0, pathOps_js_1.nativeGet)(this.updatePatch, segments)));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const redactedPaths = new Set([...this.redactedPaths].filter((path) => survivingPaths.has(path)));
|
|
149
|
+
return { overwrite, updates, redactedPaths, trace };
|
|
150
|
+
}
|
|
68
151
|
}
|
|
69
152
|
exports.TransactionBuffer = TransactionBuffer;
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQUVILDZDQUFvRTtBQUVwRSx5Q0FBMkQ7QUFFM0QsTUFBYSxpQkFBaUI7SUFDWCxZQUFZLENBQU07SUFDM0IsV0FBVyxDQUFNO0lBRWpCLGNBQWMsR0FBZ0IsRUFBRSxDQUFDO0lBQ2pDLFdBQVcsR0FBZ0IsRUFBRSxDQUFDO0lBQzlCLE9BQU8sR0FBOEMsRUFBRSxDQUFDO0lBQ3hELGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTFDLFlBQVksSUFBUztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEdBQUcsQ0FBQyxJQUF5QixFQUFFLEtBQVUsRUFBRSxZQUFZLEdBQUcsS0FBSztRQUM3RCxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUEsd0JBQWEsRUFBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsOENBQThDO0lBQzlDLEtBQUssQ0FBQyxJQUF5QixFQUFFLEtBQVUsRUFBRSxZQUFZLEdBQUcsS0FBSztRQUMvRCxNQUFNLFFBQVEsR0FBRyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBQSx5QkFBYyxFQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUEseUJBQWMsRUFBQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RixJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUEsd0JBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFBLHdCQUFhLEVBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELGlFQUFpRTtJQUNqRSxHQUFHLENBQUMsSUFBeUIsRUFBRSxZQUFrQjtRQUMvQyxPQUFPLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTTtRQU1KLE1BQU0sT0FBTyxHQUFHO1lBQ2QsU0FBUyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQy9DLE9BQU8sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMxQyxhQUFhLEVBQUUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUMxQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDekIsQ0FBQztRQUVGLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXRCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQWxFRCw4Q0FrRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zYWN0aW9uQnVmZmVyIOKAlCBUcmFuc2FjdGlvbmFsIHdyaXRlIGJ1ZmZlciBmb3Igc3RhZ2UgbXV0YXRpb25zXG4gKlxuICogQ29sbGVjdHMgd3JpdGVzIGR1cmluZyBleGVjdXRpb24gYW5kIGNvbW1pdHMgdGhlbSBhdG9taWNhbGx5LlxuICogTGlrZSBhIGRhdGFiYXNlIHRyYW5zYWN0aW9uIGJ1ZmZlcjpcbiAqIC0gQ2hhbmdlcyBzdGFnZWQgaGVyZSBiZWZvcmUgYmVpbmcgY29tbWl0dGVkIHRvIFNoYXJlZE1lbW9yeVxuICogLSBFbmFibGVzIHJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kgd2l0aGluIGEgc3RhZ2VcbiAqIC0gUmVjb3JkcyBvcGVyYXRpb24gdHJhY2UgZm9yIGRldGVybWluaXN0aWMgcmVwbGF5XG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0IGFzIF9nZXQsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBTbWFydE1lcmdlLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVNuYXBzaG90OiBhbnk7XG4gIHByaXZhdGUgd29ya2luZ0NvcHk6IGFueTtcblxuICBwcml2YXRlIG92ZXJ3cml0ZVBhdGNoOiBNZW1vcnlQYXRjaCA9IHt9O1xuICBwcml2YXRlIHVwZGF0ZVBhdGNoOiBNZW1vcnlQYXRjaCA9IHt9O1xuICBwcml2YXRlIG9wVHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdID0gW107XG4gIHByaXZhdGUgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKGJhc2U6IGFueSkge1xuICAgIHRoaXMuYmFzZVNuYXBzaG90ID0gc3RydWN0dXJlZENsb25lKGJhc2UpO1xuICAgIHRoaXMud29ya2luZ0NvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIH1cblxuICAvKiogSGFyZCBvdmVyd3JpdGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChwYXRoKSk7XG4gICAgfVxuICAgIHRoaXMub3BUcmFjZS5wdXNoKHsgcGF0aDogbm9ybWFsaXNlUGF0aChwYXRoKSwgdmVyYjogJ3NldCcgfSk7XG4gIH1cblxuICAvKiogRGVlcCB1bmlvbiBtZXJnZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgX3NldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBtZXJnZWQpO1xuICAgIF9zZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCwgZGVlcFNtYXJ0TWVyZ2UoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoKSA/PyB7fSwgdmFsdWUpKTtcbiAgICBpZiAoc2hvdWxkUmVkYWN0KSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgocGF0aCkpO1xuICAgIH1cbiAgICB0aGlzLm9wVHJhY2UucHVzaCh7IHBhdGg6IG5vcm1hbGlzZVBhdGgocGF0aCksIHZlcmI6ICdtZXJnZScgfSk7XG4gIH1cblxuICAvKiogUmVhZCBjdXJyZW50IHZhbHVlIGF0IHBhdGggKGluY2x1ZGVzIHVuY29tbWl0dGVkIGNoYW5nZXMpLiAqL1xuICBnZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZGVmYXVsdFZhbHVlPzogYW55KSB7XG4gICAgcmV0dXJuIF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBhbGwgc3RhZ2VkIG11dGF0aW9ucyBhbmQgcmV0dXJuIHRoZSBjb21taXQgYnVuZGxlLlxuICAgKiBSZXNldHMgdGhlIGJ1ZmZlciB0byBlbXB0eSBzdGF0ZSBhZnRlciBjb21taXQuXG4gICAqL1xuICBjb21taXQoKToge1xuICAgIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gICAgdXBkYXRlczogTWVtb3J5UGF0Y2g7XG4gICAgcmVkYWN0ZWRQYXRoczogU2V0PHN0cmluZz47XG4gICAgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdO1xuICB9IHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgb3ZlcndyaXRlOiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5vdmVyd3JpdGVQYXRjaCksXG4gICAgICB1cGRhdGVzOiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy51cGRhdGVQYXRjaCksXG4gICAgICByZWRhY3RlZFBhdGhzOiBuZXcgU2V0KHRoaXMucmVkYWN0ZWRQYXRocyksXG4gICAgICB0cmFjZTogWy4uLnRoaXMub3BUcmFjZV0sXG4gICAgfTtcblxuICAgIHRoaXMub3ZlcndyaXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLnVwZGF0ZVBhdGNoID0ge307XG4gICAgdGhpcy5vcFRyYWNlLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5yZWRhY3RlZFBhdGhzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbn1cbiJdfQ==
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQUVILDZDQUFvRTtBQUVwRSx5Q0FBNkU7QUFFN0UsTUFBYSxpQkFBaUI7SUFDWCxZQUFZLENBQU07SUFDM0IsV0FBVyxDQUFNO0lBRWpCLGNBQWMsR0FBZ0IsRUFBRSxDQUFDO0lBQ2pDLFdBQVcsR0FBZ0IsRUFBRSxDQUFDO0lBQzlCLE9BQU8sR0FBOEMsRUFBRSxDQUFDO0lBQ3hELGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTFDLFlBQVksSUFBUztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEdBQUcsQ0FBQyxJQUF5QixFQUFFLEtBQVUsRUFBRSxZQUFZLEdBQUcsS0FBSztRQUM3RCxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUEsd0JBQWEsRUFBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxF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dEIsSUFBQSxzQkFBSSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBQSxzQkFBSSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBNUpELDhDQTRKQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFRyYW5zYWN0aW9uYWwgd3JpdGUgYnVmZmVyIGZvciBzdGFnZSBtdXRhdGlvbnNcbiAqXG4gKiBDb2xsZWN0cyB3cml0ZXMgZHVyaW5nIGV4ZWN1dGlvbiBhbmQgY29tbWl0cyB0aGVtIGF0b21pY2FsbHkuXG4gKiBMaWtlIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gYnVmZmVyOlxuICogLSBDaGFuZ2VzIHN0YWdlZCBoZXJlIGJlZm9yZSBiZWluZyBjb21taXR0ZWQgdG8gU2hhcmVkTWVtb3J5XG4gKiAtIEVuYWJsZXMgcmVhZC1hZnRlci13cml0ZSBjb25zaXN0ZW5jeSB3aXRoaW4gYSBzdGFnZVxuICogLSBSZWNvcmRzIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXlcbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBkZWVwU21hcnRNZXJnZSwgREVMSU0sIG5vcm1hbGlzZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoYmFzZTogYW55KSB7XG4gICAgdGhpcy5iYXNlU25hcHNob3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgfVxuXG4gIC8qKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgc3RydWN0dXJlZENsb25lKHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnc2V0JyB9KTtcbiAgfVxuXG4gIC8qKiBEZWVwIHVuaW9uIG1lcmdlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoLCBkZWVwU21hcnRNZXJnZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgpID8/IHt9LCB2YWx1ZSkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChwYXRoKSk7XG4gICAgfVxuICAgIHRoaXMub3BUcmFjZS5wdXNoKHsgcGF0aDogbm9ybWFsaXNlUGF0aChwYXRoKSwgdmVyYjogJ21lcmdlJyB9KTtcbiAgfVxuXG4gIC8qKiBSZWFkIGN1cnJlbnQgdmFsdWUgYXQgcGF0aCAoaW5jbHVkZXMgdW5jb21taXR0ZWQgY2hhbmdlcykuICovXG4gIGdldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpIHtcbiAgICByZXR1cm4gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiBpcyBzdGlsbCB1bnJlcHJlc2VudGFibGUgaW4gTWVtb3J5UGF0Y2ggKGEgcmVtb3ZlZFxuICAgKiAgICAga2V5IGNhbm5vdCBiZSBleHByZXNzZWQpLiBTZXR0aW5nIGEga2V5IHRvIGB1bmRlZmluZWRgIGlzIHRyZWF0ZWQgYXMgYVxuICAgKiAgICAgY2hhbmdlICh2YWx1ZSBkaWZmZXJzIGZyb20gYmFzZSksIG5vdCBhIGRlbGV0aW9uLiBUcmFja2VkIGZvciBhIGZ1dHVyZVxuICAgKiAgICAgYGRlbGV0ZWAgdmVyYi5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG5cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkIG92ZXJ3cml0ZSAvIHVwZGF0ZXMgLyB0cmFjZSBrZWVwaW5nIE9OTFkgcGF0aHMgd2hvc2UgZmluYWwgdmFsdWVcbiAgICogZGlmZmVycyBmcm9tIHRoZSBiYXNlIHZhbHVlIOKAlCBpLmUuIHRoZSBzdGFnZSdzIG5ldCBjaGFuZ2UuIFNlZVxuICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXIuY29tbWl0fSBmb3IgdGhlIHJhdGlvbmFsZS5cbiAgICpcbiAgICogUGF0aHMgYXJlIGNvbXBhcmVkIGF0IHRoZSBleGFjdCBncmFudWxhcml0eSB0aGV5IHdlcmUgd3JpdHRlbiAoZWFjaCB0cmFjZVxuICAgKiBlbnRyeSdzIHBhdGgpLCBhZ2FpbnN0IGB3b3JraW5nQ29weWAgKGZpbmFsKSB2cyBgYmFzZVNuYXBzaG90YCAoc3RhcnQpLlxuICAgKiBTdXJ2aXZpbmcgYHNldGAgcGF0aHMgY29weSB0aGVpciBmaW5hbCB2YWx1ZSBmcm9tIGBvdmVyd3JpdGVQYXRjaGA7XG4gICAqIHN1cnZpdmluZyBgbWVyZ2VgIHBhdGhzIGNvcHkgdGhlaXIgYWNjdW11bGF0ZWQgZGVsdGEgZnJvbSBgdXBkYXRlUGF0Y2hgIOKAlFxuICAgKiBwcmVzZXJ2aW5nIHRoZSBzZXQtdnMtbWVyZ2UgdmVyYiBzbyByZXBsYXkgKHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9KSBpc1xuICAgKiBieXRlLWZvci1ieXRlIGlkZW50aWNhbCB0byByZWNvcmRpbmcgb25seSB0aGUgcmVhbCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3Qgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXM6IE1lbW9yeVBhdGNoID0ge307XG4gICAgY29uc3QgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdID0gW107XG4gICAgY29uc3Qgc3Vydml2aW5nUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIGlmIChkZWVwRXF1YWwoYmVmb3JlLCBhZnRlcikpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKG9wKTtcbiAgICAgIHN1cnZpdmluZ1BhdGhzLmFkZChvcC5wYXRoKTtcbiAgICAgIGlmIChvcC52ZXJiID09PSAnc2V0Jykge1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQoWy4uLnRoaXMucmVkYWN0ZWRQYXRoc10uZmlsdGVyKChwYXRoKSA9PiBzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpKTtcbiAgICByZXR1cm4geyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlIH07XG4gIH1cbn1cbiJdfQ==
|
package/dist/lib/memory/utils.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Zero external dependencies.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.applySmartMerge = exports.deepSmartMerge = exports.normalisePath = exports.redactPatch = exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.getRunAndGlobalPaths = exports.DELIM = void 0;
|
|
9
|
+
exports.applySmartMerge = exports.deepSmartMerge = exports.deepEqual = exports.normalisePath = exports.redactPatch = exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.getRunAndGlobalPaths = exports.DELIM = void 0;
|
|
10
10
|
const pathOps_js_1 = require("./pathOps.js");
|
|
11
11
|
/** ASCII Unit-Separator — cannot appear in JS identifiers, invisible in logs. */
|
|
12
12
|
exports.DELIM = '\u001F';
|
|
@@ -133,6 +133,68 @@ function normalisePath(path) {
|
|
|
133
133
|
return path.map(String).join(exports.DELIM);
|
|
134
134
|
}
|
|
135
135
|
exports.normalisePath = normalisePath;
|
|
136
|
+
/**
|
|
137
|
+
* Structural deep equality for committed-state values.
|
|
138
|
+
*
|
|
139
|
+
* Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
|
|
140
|
+
* a path or merely re-wrote / reverted it to the value it already held (a
|
|
141
|
+
* "no-op write"). Committed state is JSON-shaped — it must survive
|
|
142
|
+
* `structuredClone` — so this only needs to handle the shapes that can reach a
|
|
143
|
+
* commit: primitives, arrays, and plain objects.
|
|
144
|
+
*
|
|
145
|
+
* Semantics:
|
|
146
|
+
* - reference / identical-primitive short-circuits first (cheap fast path)
|
|
147
|
+
* - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
|
|
148
|
+
* - arrays: equal length AND deep-equal element-wise (order-sensitive)
|
|
149
|
+
* - objects: identical own-key set AND deep-equal per key
|
|
150
|
+
* - mismatched kinds (array vs object, object vs null) → not equal
|
|
151
|
+
*
|
|
152
|
+
* Cost & safety:
|
|
153
|
+
* - Allocates NOTHING but transient `Object.keys` arrays — no clones. It is
|
|
154
|
+
* strictly cheaper than the `structuredClone` the commit already performs.
|
|
155
|
+
* - Primitive comparisons (the bulk of state) are O(1) via the `===` /
|
|
156
|
+
* `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
|
|
157
|
+
* by the value's own size.
|
|
158
|
+
* - Assumes ACYCLIC, JSON-shaped values — the same contract the memory layer
|
|
159
|
+
* already relies on (committed state is `structuredClone`d and must be
|
|
160
|
+
* JSON-serialisable for checkpoints). A cyclic value is out of contract
|
|
161
|
+
* here exactly as it is for checkpointing; dev mode flags cycles at write
|
|
162
|
+
* time via `ScopeFacade.setValue`.
|
|
163
|
+
*/
|
|
164
|
+
function deepEqual(a, b) {
|
|
165
|
+
if (a === b)
|
|
166
|
+
return true; // same reference or identical primitive
|
|
167
|
+
if (typeof a !== typeof b)
|
|
168
|
+
return false;
|
|
169
|
+
if (a === null || b === null)
|
|
170
|
+
return a === b; // one is null, the other isn't
|
|
171
|
+
if (typeof a !== 'object')
|
|
172
|
+
return Object.is(a, b); // NaN-safe primitive compare
|
|
173
|
+
const aIsArray = Array.isArray(a);
|
|
174
|
+
if (aIsArray !== Array.isArray(b))
|
|
175
|
+
return false; // array vs plain object
|
|
176
|
+
if (aIsArray) {
|
|
177
|
+
if (a.length !== b.length)
|
|
178
|
+
return false;
|
|
179
|
+
for (let i = 0; i < a.length; i++) {
|
|
180
|
+
if (!deepEqual(a[i], b[i]))
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
const aKeys = Object.keys(a);
|
|
186
|
+
const bKeys = Object.keys(b);
|
|
187
|
+
if (aKeys.length !== bKeys.length)
|
|
188
|
+
return false;
|
|
189
|
+
for (const key of aKeys) {
|
|
190
|
+
if (!Object.prototype.hasOwnProperty.call(b, key))
|
|
191
|
+
return false;
|
|
192
|
+
if (!deepEqual(a[key], b[key]))
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
exports.deepEqual = deepEqual;
|
|
136
198
|
/**
|
|
137
199
|
* Deep union merge helper.
|
|
138
200
|
* - Arrays (non-empty): union without duplicates (encounter order preserved)
|
|
@@ -181,4 +243,4 @@ function applySmartMerge(base, updates, overwrite, trace) {
|
|
|
181
243
|
return out;
|
|
182
244
|
}
|
|
183
245
|
exports.applySmartMerge = applySmartMerge;
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVILDZDQUF1RjtBQUd2RixpRkFBaUY7QUFDcEUsUUFBQSxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBSTlCOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEtBQWMsRUFBRSxPQUE0QixFQUFFO0lBQ2pGLE9BQU87UUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNyRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUxELG9EQUtDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlCLEVBQ2pCLEtBQWEsRUFDYixLQUFlLEVBQ2YsS0FBYSxFQUNiLEtBQVEsRUFDUixhQUF1QjtJQUV2QixNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksVUFBVSxDQUFDO0lBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMzQixJQUFJLE9BQU8sR0FBaUIsR0FBRyxDQUFDO0lBQ2hDLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLENB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RUQ7Ozs7R0FJRztBQUNILFNBQWdCLGVBQWUsQ0FDN0IsSUFBUyxFQUNULE9BQW9CLEVBQ3BCLFNBQXNCLEVBQ3RCLEtBQWdEO0lBRWhELE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFBLHNCQUFJLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBQSxzQkFBSSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE9BQU8sR0FBRyxJQUFBLHNCQUFJLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QyxJQUFBLHNCQUFJLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUEsc0JBQUksRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBakJELDBDQWlCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIEhlbHBlciBmdW5jdGlvbnMgZm9yIG5lc3RlZCBvYmplY3QgbWFuaXB1bGF0aW9uXG4gKlxuICogUHJvdmlkZXMgY29uc2lzdGVudCBwYXRoIHRyYXZlcnNhbCBhbmQgdmFsdWUgbWFuaXB1bGF0aW9uIGZvciB0aGUgbWVtb3J5IHN5c3RlbS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCBhcyBfZ2V0LCBuYXRpdmVIYXMgYXMgX2hhcywgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogQVNDSUkgVW5pdC1TZXBhcmF0b3Ig4oCUIGNhbm5vdCBhcHBlYXIgaW4gSlMgaWRlbnRpZmllcnMsIGludmlzaWJsZSBpbiBsb2dzLiAqL1xuZXhwb3J0IGNvbnN0IERFTElNID0gJ1xcdTAwMUYnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogUmVzb2x2ZXMgcnVuLW5hbWVzcGFjZWQgYW5kIGdsb2JhbCBwYXRocy5cbiAqIEVhY2ggZmxvd2NoYXJ0IGV4ZWN1dGlvbiAocnVuKSBzdG9yZXMgZGF0YSB1bmRlciBgcnVucy97aWR9L2AgdG8gcHJldmVudCBjb2xsaXNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVuQW5kR2xvYmFsUGF0aHMocnVuSWQ/OiBzdHJpbmcsIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IHJ1bklkID8gWydydW5zJywgcnVuSWQsIC4uLnBhdGhdIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCwgY3JlYXRpbmcgaW50ZXJtZWRpYXRlIG9iamVjdHMgYXMgbmVlZGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmVzdGVkVmFsdWU8VD4oXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBydW5JZDogc3RyaW5nLFxuICBfcGF0aDogc3RyaW5nW10sXG4gIGZpZWxkOiBzdHJpbmcsXG4gIHZhbHVlOiBULFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnN0IHsgcnVuUGF0aCwgZ2xvYmFsUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMocnVuSWQsIF9wYXRoKTtcbiAgY29uc3QgcGF0aCA9IHJ1blBhdGggfHwgZ2xvYmFsUGF0aDtcbiAgY29uc3QgcGF0aENvcHkgPSBbLi4ucGF0aF07XG4gIGxldCBjdXJyZW50OiBOZXN0ZWRPYmplY3QgPSBvYmo7XG4gIHdoaWxlIChwYXRoQ29weS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qga2V5ID0gcGF0aENvcHkuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgY3VycmVudFtrZXldID0ga2V5ID09PSBydW5JZCAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG4gIGN1cnJlbnRbZmllbGRdID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRGVlcC1tZXJnZXMgYSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIHJ1bklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIF9wYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkLCBfcGF0aCk7XG4gIGNvbnN0IHBhdGggPSBydW5QYXRoIHx8IGdsb2JhbFBhdGg7XG4gIGNvbnN0IHBhdGhDb3B5ID0gWy4uLnBhdGhdO1xuICBsZXQgY3VycmVudDogTmVzdGVkT2JqZWN0ID0gb2JqO1xuICB3aGlsZSAocGF0aENvcHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGtleSA9IHBhdGhDb3B5LnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGtleSA9PT0gcnVuSWQgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICB1cGRhdGVWYWx1ZShjdXJyZW50LCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOyAvLyBjbGVhcjogW10gcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB3aXRoIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKHJvb3Q6IGFueSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGQ/OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuICBjb25zdCBub2RlID0gcGF0aCAmJiBwYXRoLmxlbmd0aCA+IDAgPyBfZ2V0KHJvb3QsIHBhdGgpIDogcm9vdDtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBmaWVsZCkpIHtcbiAgICByZXR1cm4gbm9kZVtmaWVsZF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWRhY3RzIHNlbnNpdGl2ZSB2YWx1ZXMgaW4gYSBwYXRjaCBmb3IgbG9nZ2luZy9kZWJ1Z2dpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWRhY3RQYXRjaChwYXRjaDogTWVtb3J5UGF0Y2gsIHJlZGFjdGVkU2V0OiBTZXQ8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgY29uc3Qgb3V0ID0gc3RydWN0dXJlZENsb25lKHBhdGNoKTtcbiAgZm9yIChjb25zdCBmbGF0IG9mIHJlZGFjdGVkU2V0KSB7XG4gICAgY29uc3QgcGF0aEFyciA9IGZsYXQuc3BsaXQoREVMSU0pO1xuICAgIGlmIChfaGFzKG91dCwgcGF0aEFycikpIHtcbiAgICAgIGNvbnN0IGN1cnIgPSBfZ2V0KG91dCwgcGF0aEFycik7XG4gICAgICBpZiAodHlwZW9mIGN1cnIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIF9zZXQob3V0LCBwYXRoQXJyLCAnUkVEQUNURUQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpc2VzIGFuIGFycmF5IHBhdGggaW50byBhIHN0YWJsZSBzdHJpbmcga2V5IHVzaW5nIERFTElNLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXNlUGF0aChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgubWFwKFN0cmluZykuam9pbihERUxJTSk7XG59XG5cbi8qKlxuICogRGVlcCB1bmlvbiBtZXJnZSBoZWxwZXIuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogdW5pb24gd2l0aG91dCBkdXBsaWNhdGVzIChlbmNvdW50ZXIgb3JkZXIgcHJlc2VydmVkKVxuICogLSBBcnJheXMgKGVtcHR5KTogICAgIHJlcGxhY2Ug4oCUIHNyYyBgW11gIGNsZWFycyB0aGUgZGVzdGluYXRpb24gYXJyYXkuXG4gKiAgIFJhdGlvbmFsZTogd3JpdGluZyBgc2NvcGUudGFncyA9IFtdYCBtZWFucyBcImNsZWFyIHRhZ3NcIiwgbm90IFwiYXBwZW5kIG5vdGhpbmdcIi5cbiAqICAgV2l0aG91dCB0aGlzIHJ1bGUsIGFuIGVtcHR5LWFycmF5IHdyaXRlIHNpbGVudGx5IGJlY29tZXMgYSBuby1vcCB3aGljaCBpc1xuICogICBpbXBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGZyb20gYSBidWcuXG4gKiAtIE9iamVjdHM6IHJlY3Vyc2l2ZSBtZXJnZVxuICogLSBQcmltaXRpdmVzOiBzb3VyY2Ugd2luc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFNtYXJ0TWVyZ2UoZHN0OiBhbnksIHNyYzogYW55KTogYW55IHtcbiAgaWYgKHNyYyA9PT0gbnVsbCB8fCB0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JykgcmV0dXJuIHNyYztcblxuICBpZiAoQXJyYXkuaXNBcnJheShzcmMpKSB7XG4gICAgaWYgKHNyYy5sZW5ndGggPT09IDApIHJldHVybiBbXTsgLy8gZW1wdHkgc3JjID0gY2xlYXIsIG5vdCBuby1vcFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRzdCkpIHJldHVybiBbLi4ubmV3IFNldChbLi4uZHN0LCAuLi5zcmNdKV07XG4gICAgcmV0dXJuIFsuLi5zcmNdO1xuICB9XG5cbiAgY29uc3Qgb3V0OiBhbnkgPSB7IC4uLihkc3QgJiYgdHlwZW9mIGRzdCA9PT0gJ29iamVjdCcgPyBkc3QgOiB7fSkgfTtcbiAgLy8gT2JqZWN0LmtleXMoKSBpcyBvd24tZW51bWVyYWJsZS1vbmx5IGJ5IHNwZWMg4oCUIG5vIERFTklFRCBjaGVjayBuZWVkZWQgaGVyZS5cbiAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHNyYykpIHtcbiAgICBvdXRba10gPSBkZWVwU21hcnRNZXJnZShvdXRba10sIHNyY1trXSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSB0byBhIGJhc2Ugc3RhdGUgYnkgcmVwbGF5aW5nIG9wZXJhdGlvbnMgaW4gb3JkZXIuXG4gKiBUd28tcGhhc2U6IFVQREFURSAodW5pb24tbWVyZ2UpIHRoZW4gT1ZFUldSSVRFIChkaXJlY3Qgc2V0KS5cbiAqIEd1YXJhbnRlZXMgXCJsYXN0IHdyaXRlciB3aW5zXCIgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTbWFydE1lcmdlKFxuICBiYXNlOiBhbnksXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLFxuICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICB0cmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB9W10sXG4pOiBhbnkge1xuICBjb25zdCBvdXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gIGZvciAoY29uc3QgeyBwYXRoLCB2ZXJiIH0gb2YgdHJhY2UpIHtcbiAgICBjb25zdCBzZWdzID0gcGF0aC5zcGxpdChERUxJTSk7XG4gICAgaWYgKHZlcmIgPT09ICdzZXQnKSB7XG4gICAgICBfc2V0KG91dCwgc2Vncywgc3RydWN0dXJlZENsb25lKF9nZXQob3ZlcndyaXRlLCBzZWdzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gX2dldChvdXQsIHNlZ3MpID8/IHt9O1xuICAgICAgX3NldChvdXQsIHNlZ3MsIGRlZXBTbWFydE1lcmdlKGN1cnJlbnQsIF9nZXQodXBkYXRlcywgc2VncykpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7OztBQUVILDZDQUF1RjtBQUd2RixpRkFBaUY7QUFDcEUsUUFBQSxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBSTlCOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEtBQWMsRUFBRSxPQUE0QixFQUFFO0lBQ2pGLE9BQU87UUFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNyRCxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUxELG9EQUtDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlCLEVBQ2pCLEtBQWEsRUFDYixLQUFlLEVBQ2YsS0FBYSxFQUNiLEtBQVEsRUFDUixhQUF1QjtJQUV2QixNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRSxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksVUFBVSxDQUFDO0lBQ25DLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUMzQixJQUFJLE9BQU8sR0FBaUIsR0FBRyxDQUFDO0lBQ2hDLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLENB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Y0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFBLHNCQUFJLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQWpCRCwwQ0FpQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBIZWxwZXIgZnVuY3Rpb25zIGZvciBuZXN0ZWQgb2JqZWN0IG1hbmlwdWxhdGlvblxuICpcbiAqIFByb3ZpZGVzIGNvbnNpc3RlbnQgcGF0aCB0cmF2ZXJzYWwgYW5kIHZhbHVlIG1hbmlwdWxhdGlvbiBmb3IgdGhlIG1lbW9yeSBzeXN0ZW0uXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIEFTQ0lJIFVuaXQtU2VwYXJhdG9yIOKAlCBjYW5ub3QgYXBwZWFyIGluIEpTIGlkZW50aWZpZXJzLCBpbnZpc2libGUgaW4gbG9ncy4gKi9cbmV4cG9ydCBjb25zdCBERUxJTSA9ICdcXHUwMDFGJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFJlc29sdmVzIHJ1bi1uYW1lc3BhY2VkIGFuZCBnbG9iYWwgcGF0aHMuXG4gKiBFYWNoIGZsb3djaGFydCBleGVjdXRpb24gKHJ1bikgc3RvcmVzIGRhdGEgdW5kZXIgYHJ1bnMve2lkfS9gIHRvIHByZXZlbnQgY29sbGlzaW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkPzogc3RyaW5nLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBydW5JZCA/IFsncnVucycsIHJ1bklkLCAuLi5wYXRoXSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGgsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgcnVuSWQ6IHN0cmluZyxcbiAgX3BhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKHJ1bklkLCBfcGF0aCk7XG4gIGNvbnN0IHBhdGggPSBydW5QYXRoIHx8IGdsb2JhbFBhdGg7XG4gIGNvbnN0IHBhdGhDb3B5ID0gWy4uLnBhdGhdO1xuICBsZXQgY3VycmVudDogTmVzdGVkT2JqZWN0ID0gb2JqO1xuICB3aGlsZSAocGF0aENvcHkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGtleSA9IHBhdGhDb3B5LnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IGtleSA9PT0gcnVuSWQgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICBjdXJyZW50W2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBydW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBfcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgY29uc3QgeyBydW5QYXRoLCBnbG9iYWxQYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhydW5JZCwgX3BhdGgpO1xuICBjb25zdCBwYXRoID0gcnVuUGF0aCB8fCBnbG9iYWxQYXRoO1xuICBjb25zdCBwYXRoQ29weSA9IFsuLi5wYXRoXTtcbiAgbGV0IGN1cnJlbnQ6IE5lc3RlZE9iamVjdCA9IG9iajtcbiAgd2hpbGUgKHBhdGhDb3B5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBrZXkgPSBwYXRoQ29weS5zaGlmdCgpIGFzIHN0cmluZztcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBrZXkgPT09IHJ1bklkICYmIGRlZmF1bHRWYWx1ZXMgPyBkZWZhdWx0VmFsdWVzIDoge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgdXBkYXRlVmFsdWUoY3VycmVudCwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV07XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVkYWN0cyBzZW5zaXRpdmUgdmFsdWVzIGluIGEgcGF0Y2ggZm9yIGxvZ2dpbmcvZGVidWdnaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFNldDogU2V0PHN0cmluZz4pOiBNZW1vcnlQYXRjaCB7XG4gIGNvbnN0IG91dCA9IHN0cnVjdHVyZWRDbG9uZShwYXRjaCk7XG4gIGZvciAoY29uc3QgZmxhdCBvZiByZWRhY3RlZFNldCkge1xuICAgIGNvbnN0IHBhdGhBcnIgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBpZiAoX2hhcyhvdXQsIHBhdGhBcnIpKSB7XG4gICAgICBjb25zdCBjdXJyID0gX2dldChvdXQsIHBhdGhBcnIpO1xuICAgICAgaWYgKHR5cGVvZiBjdXJyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBfc2V0KG91dCwgcGF0aEFyciwgJ1JFREFDVEVEJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogTm9ybWFsaXNlcyBhbiBhcnJheSBwYXRoIGludG8gYSBzdGFibGUgc3RyaW5nIGtleSB1c2luZyBERUxJTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVBhdGgocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLm1hcChTdHJpbmcpLmpvaW4oREVMSU0pO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcCBlcXVhbGl0eSBmb3IgY29tbWl0dGVkLXN0YXRlIHZhbHVlcy5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlcn0gdG8gZGVjaWRlIHdoZXRoZXIgYSBzdGFnZSBhY3R1YWxseSBDSEFOR0VEXG4gKiBhIHBhdGggb3IgbWVyZWx5IHJlLXdyb3RlIC8gcmV2ZXJ0ZWQgaXQgdG8gdGhlIHZhbHVlIGl0IGFscmVhZHkgaGVsZCAoYVxuICogXCJuby1vcCB3cml0ZVwiKS4gQ29tbWl0dGVkIHN0YXRlIGlzIEpTT04tc2hhcGVkIOKAlCBpdCBtdXN0IHN1cnZpdmVcbiAqIGBzdHJ1Y3R1cmVkQ2xvbmVgIOKAlCBzbyB0aGlzIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHRoZSBzaGFwZXMgdGhhdCBjYW4gcmVhY2ggYVxuICogY29tbWl0OiBwcmltaXRpdmVzLCBhcnJheXMsIGFuZCBwbGFpbiBvYmplY3RzLlxuICpcbiAqIFNlbWFudGljczpcbiAqICAgLSByZWZlcmVuY2UgLyBpZGVudGljYWwtcHJpbWl0aXZlIHNob3J0LWNpcmN1aXRzIGZpcnN0IChjaGVhcCBmYXN0IHBhdGgpXG4gKiAgIC0gYE5hTmAgZXF1YWxzIGBOYU5gIChwcmltaXRpdmUgY29tcGFyZSBmYWxscyBiYWNrIHRvIGBPYmplY3QuaXNgKVxuICogICAtIGFycmF5czogZXF1YWwgbGVuZ3RoIEFORCBkZWVwLWVxdWFsIGVsZW1lbnQtd2lzZSAob3JkZXItc2Vuc2l0aXZlKVxuICogICAtIG9iamVjdHM6IGlkZW50aWNhbCBvd24ta2V5IHNldCBBTkQgZGVlcC1lcXVhbCBwZXIga2V5XG4gKiAgIC0gbWlzbWF0Y2hlZCBraW5kcyAoYXJyYXkgdnMgb2JqZWN0LCBvYmplY3QgdnMgbnVsbCkg4oaSIG5vdCBlcXVhbFxuICpcbiAqIENvc3QgJiBzYWZldHk6XG4gKiAgIC0gQWxsb2NhdGVzIE5PVEhJTkcgYnV0IHRyYW5zaWVudCBgT2JqZWN0LmtleXNgIGFycmF5cyDigJQgbm8gY2xvbmVzLiBJdCBpc1xuICogICAgIHN0cmljdGx5IGNoZWFwZXIgdGhhbiB0aGUgYHN0cnVjdHVyZWRDbG9uZWAgdGhlIGNvbW1pdCBhbHJlYWR5IHBlcmZvcm1zLlxuICogICAtIFByaW1pdGl2ZSBjb21wYXJpc29ucyAodGhlIGJ1bGsgb2Ygc3RhdGUpIGFyZSBPKDEpIHZpYSB0aGUgYD09PWAgL1xuICogICAgIGBPYmplY3QuaXNgIGZhc3QgcGF0aHM7IG9ubHkgbmVzdGVkIG9iamVjdHMvYXJyYXlzIGluY3VyIGEgd2FsaywgYm91bmRlZFxuICogICAgIGJ5IHRoZSB2YWx1ZSdzIG93biBzaXplLlxuICogICAtIEFzc3VtZXMgQUNZQ0xJQywgSlNPTi1zaGFwZWQgdmFsdWVzIOKAlCB0aGUgc2FtZSBjb250cmFjdCB0aGUgbWVtb3J5IGxheWVyXG4gKiAgICAgYWxyZWFkeSByZWxpZXMgb24gKGNvbW1pdHRlZCBzdGF0ZSBpcyBgc3RydWN0dXJlZENsb25lYGQgYW5kIG11c3QgYmVcbiAqICAgICBKU09OLXNlcmlhbGlzYWJsZSBmb3IgY2hlY2twb2ludHMpLiBBIGN5Y2xpYyB2YWx1ZSBpcyBvdXQgb2YgY29udHJhY3RcbiAqICAgICBoZXJlIGV4YWN0bHkgYXMgaXQgaXMgZm9yIGNoZWNrcG9pbnRpbmc7IGRldiBtb2RlIGZsYWdzIGN5Y2xlcyBhdCB3cml0ZVxuICogICAgIHRpbWUgdmlhIGBTY29wZUZhY2FkZS5zZXRWYWx1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlOyAvLyBzYW1lIHJlZmVyZW5jZSBvciBpZGVudGljYWwgcHJpbWl0aXZlXG4gIGlmICh0eXBlb2YgYSAhPT0gdHlwZW9mIGIpIHJldHVybiBmYWxzZTtcbiAgaWYgKGEgPT09IG51bGwgfHwgYiA9PT0gbnVsbCkgcmV0dXJuIGEgPT09IGI7IC8vIG9uZSBpcyBudWxsLCB0aGUgb3RoZXIgaXNuJ3RcbiAgaWYgKHR5cGVvZiBhICE9PSAnb2JqZWN0JykgcmV0dXJuIE9iamVjdC5pcyhhLCBiKTsgLy8gTmFOLXNhZmUgcHJpbWl0aXZlIGNvbXBhcmVcblxuICBjb25zdCBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gIGlmIChhSXNBcnJheSAhPT0gQXJyYXkuaXNBcnJheShiKSkgcmV0dXJuIGZhbHNlOyAvLyBhcnJheSB2cyBwbGFpbiBvYmplY3RcblxuICBpZiAoYUlzQXJyYXkpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGFLZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gIGNvbnN0IGJLZXlzID0gT2JqZWN0LmtleXMoYik7XG4gIGlmIChhS2V5cy5sZW5ndGggIT09IGJLZXlzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBvZiBhS2V5cykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEZWVwIHVuaW9uIG1lcmdlIGhlbHBlci5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiB1bmlvbiB3aXRob3V0IGR1cGxpY2F0ZXMgKGVuY291bnRlciBvcmRlciBwcmVzZXJ2ZWQpXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgcmVwbGFjZSDigJQgc3JjIGBbXWAgY2xlYXJzIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cbiAqICAgUmF0aW9uYWxlOiB3cml0aW5nIGBzY29wZS50YWdzID0gW11gIG1lYW5zIFwiY2xlYXIgdGFnc1wiLCBub3QgXCJhcHBlbmQgbm90aGluZ1wiLlxuICogICBXaXRob3V0IHRoaXMgcnVsZSwgYW4gZW1wdHktYXJyYXkgd3JpdGUgc2lsZW50bHkgYmVjb21lcyBhIG5vLW9wIHdoaWNoIGlzXG4gKiAgIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhIGJ1Zy5cbiAqIC0gT2JqZWN0czogcmVjdXJzaXZlIG1lcmdlXG4gKiAtIFByaW1pdGl2ZXM6IHNvdXJjZSB3aW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwU21hcnRNZXJnZShkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICBpZiAoc3JjID09PSBudWxsIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnKSByZXR1cm4gc3JjO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICBpZiAoc3JjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdOyAvLyBlbXB0eSBzcmMgPSBjbGVhciwgbm90IG5vLW9wXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHN0KSkgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kc3QsIC4uLnNyY10pXTtcbiAgICByZXR1cm4gWy4uLnNyY107XG4gIH1cblxuICBjb25zdCBvdXQ6IGFueSA9IHsgLi4uKGRzdCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IGRzdCA6IHt9KSB9O1xuICAvLyBPYmplY3Qua2V5cygpIGlzIG93bi1lbnVtZXJhYmxlLW9ubHkgYnkgc3BlYyDigJQgbm8gREVOSUVEIGNoZWNrIG5lZWRlZCBoZXJlLlxuICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoc3JjKSkge1xuICAgIG91dFtrXSA9IGRlZXBTbWFydE1lcmdlKG91dFtrXSwgc3JjW2tdKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBjb21taXQgYnVuZGxlIHRvIGEgYmFzZSBzdGF0ZSBieSByZXBsYXlpbmcgb3BlcmF0aW9ucyBpbiBvcmRlci5cbiAqIFR3by1waGFzZTogVVBEQVRFICh1bmlvbi1tZXJnZSkgdGhlbiBPVkVSV1JJVEUgKGRpcmVjdCBzZXQpLlxuICogR3VhcmFudGVlcyBcImxhc3Qgd3JpdGVyIHdpbnNcIiBzZW1hbnRpY3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNtYXJ0TWVyZ2UoXG4gIGJhc2U6IGFueSxcbiAgdXBkYXRlczogTWVtb3J5UGF0Y2gsXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsXG4gIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXSxcbik6IGFueSB7XG4gIGNvbnN0IG91dCA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgZm9yIChjb25zdCB7IHBhdGgsIHZlcmIgfSBvZiB0cmFjZSkge1xuICAgIGNvbnN0IHNlZ3MgPSBwYXRoLnNwbGl0KERFTElNKTtcbiAgICBpZiAodmVyYiA9PT0gJ3NldCcpIHtcbiAgICAgIF9zZXQob3V0LCBzZWdzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldChvdmVyd3JpdGUsIHNlZ3MpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBfZ2V0KG91dCwgc2VncykgPz8ge307XG4gICAgICBfc2V0KG91dCwgc2VncywgZGVlcFNtYXJ0TWVyZ2UoY3VycmVudCwgX2dldCh1cGRhdGVzLCBzZWdzKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19
|
|
@@ -23,7 +23,60 @@ export declare class TransactionBuffer {
|
|
|
23
23
|
/** Read current value at path (includes uncommitted changes). */
|
|
24
24
|
get(path: (string | number)[], defaultValue?: any): any;
|
|
25
25
|
/**
|
|
26
|
-
* Flush all staged mutations and return the commit bundle
|
|
26
|
+
* Flush all staged mutations and return the commit bundle — recording the
|
|
27
|
+
* stage's NET CHANGE, not its raw write log.
|
|
28
|
+
*
|
|
29
|
+
* ── WHY (the defect this fixes) ─────────────────────────────────────────
|
|
30
|
+
* Previously every `set`/`merge` was recorded verbatim, so the commit bundle
|
|
31
|
+
* was a log of *operations* rather than *changes*. Two operations produce no
|
|
32
|
+
* net change yet were still committed as "mutations":
|
|
33
|
+
*
|
|
34
|
+
* 1. No-op write — writing a key the value it already holds (e.g. an
|
|
35
|
+
* agent context slot re-emitting identical content every
|
|
36
|
+
* turn). base K=1, stage writes K=1.
|
|
37
|
+
* 2. Write-revert — changing then restoring a key within one stage.
|
|
38
|
+
* base K=1, stage writes K=2 then K=1.
|
|
39
|
+
*
|
|
40
|
+
* Recording these as mutations (a) bloated causal slicing / backtracking with
|
|
41
|
+
* spurious dependencies on intermediate values that never reach final state,
|
|
42
|
+
* and (b) made downstream "what changed here?" consumers light up stages that
|
|
43
|
+
* changed nothing — most visibly the lens highlight flagging every slot.
|
|
44
|
+
*
|
|
45
|
+
* ── HOW ─────────────────────────────────────────────────────────────────
|
|
46
|
+
* At commit we hold BOTH `baseSnapshot` (state when the stage began) and
|
|
47
|
+
* `workingCopy` (state after all its writes). For each path the stage touched
|
|
48
|
+
* we keep it in the bundle ONLY if its final value differs from the base
|
|
49
|
+
* value ({@link deepEqual}). No-op AND write-revert paths drop out, because
|
|
50
|
+
* both compare equal to base. This is a single net-delta diff at commit time
|
|
51
|
+
* — one deep compare per touched path, O(changed state), paid once per stage
|
|
52
|
+
* (NOT per write). A naive per-write deep-equal skip would be more expensive
|
|
53
|
+
* and would still miss write-revert (the intermediate write differs from the
|
|
54
|
+
* value present at the moment of writing).
|
|
55
|
+
*
|
|
56
|
+
* ── TWO HONEST TIERS (by design — do not "unify" them) ──────────────────
|
|
57
|
+
* • commit (here) = CHANGE-level — truthful net delta. Feeds the commit
|
|
58
|
+
* log, causal chain, narrative, and the lens highlight.
|
|
59
|
+
* • `onWrite` event = OP-level — fires on EVERY write attempt regardless of
|
|
60
|
+
* net change. Feeds metrics / behavioural observability
|
|
61
|
+
* (a debugger wants to see "wrote 2, then reverted").
|
|
62
|
+
* `onWrite` is unchanged by this method; only the COMMIT becomes change-only.
|
|
63
|
+
*
|
|
64
|
+
* ── EMPTY COMMITS ARE INTENTIONAL ───────────────────────────────────────
|
|
65
|
+
* A stage that nets no change commits an EMPTY patch — NOT nothing.
|
|
66
|
+
* {@link StageContext.commit} still records the bundle unconditionally, so
|
|
67
|
+
* every executed stage remains a time-travel cursor stop (its `runtimeStageId`
|
|
68
|
+
* marker is preserved); only its PATCH is empty. This is what keeps the
|
|
69
|
+
* commit-indexed slider stable while making the highlight truthful.
|
|
70
|
+
*
|
|
71
|
+
* ── KNOWN LIMITATIONS / FUTURE ──────────────────────────────────────────
|
|
72
|
+
* • Explicit key DELETION is still unrepresentable in MemoryPatch (a removed
|
|
73
|
+
* key cannot be expressed). Setting a key to `undefined` is treated as a
|
|
74
|
+
* change (value differs from base), not a deletion. Tracked for a future
|
|
75
|
+
* `delete` verb.
|
|
76
|
+
* • Array-merge dedup in {@link deepSmartMerge} still uses reference equality
|
|
77
|
+
* (`new Set`), so deep-equal *objects* in a merged array are not deduped.
|
|
78
|
+
* Orthogonal to this change; tracked separately.
|
|
79
|
+
*
|
|
27
80
|
* Resets the buffer to empty state after commit.
|
|
28
81
|
*/
|
|
29
82
|
commit(): {
|
|
@@ -35,4 +88,17 @@ export declare class TransactionBuffer {
|
|
|
35
88
|
verb: 'set' | 'merge';
|
|
36
89
|
}[];
|
|
37
90
|
};
|
|
91
|
+
/**
|
|
92
|
+
* Rebuild overwrite / updates / trace keeping ONLY paths whose final value
|
|
93
|
+
* differs from the base value — i.e. the stage's net change. See
|
|
94
|
+
* {@link TransactionBuffer.commit} for the rationale.
|
|
95
|
+
*
|
|
96
|
+
* Paths are compared at the exact granularity they were written (each trace
|
|
97
|
+
* entry's path), against `workingCopy` (final) vs `baseSnapshot` (start).
|
|
98
|
+
* Surviving `set` paths copy their final value from `overwritePatch`;
|
|
99
|
+
* surviving `merge` paths copy their accumulated delta from `updatePatch` —
|
|
100
|
+
* preserving the set-vs-merge verb so replay ({@link applySmartMerge}) is
|
|
101
|
+
* byte-for-byte identical to recording only the real changes.
|
|
102
|
+
*/
|
|
103
|
+
private toChangeOnlyPayload;
|
|
38
104
|
}
|
|
@@ -57,6 +57,35 @@ export declare function redactPatch(patch: MemoryPatch, redactedSet: Set<string>
|
|
|
57
57
|
* Normalises an array path into a stable string key using DELIM.
|
|
58
58
|
*/
|
|
59
59
|
export declare function normalisePath(path: (string | number)[]): string;
|
|
60
|
+
/**
|
|
61
|
+
* Structural deep equality for committed-state values.
|
|
62
|
+
*
|
|
63
|
+
* Used by {@link TransactionBuffer} to decide whether a stage actually CHANGED
|
|
64
|
+
* a path or merely re-wrote / reverted it to the value it already held (a
|
|
65
|
+
* "no-op write"). Committed state is JSON-shaped — it must survive
|
|
66
|
+
* `structuredClone` — so this only needs to handle the shapes that can reach a
|
|
67
|
+
* commit: primitives, arrays, and plain objects.
|
|
68
|
+
*
|
|
69
|
+
* Semantics:
|
|
70
|
+
* - reference / identical-primitive short-circuits first (cheap fast path)
|
|
71
|
+
* - `NaN` equals `NaN` (primitive compare falls back to `Object.is`)
|
|
72
|
+
* - arrays: equal length AND deep-equal element-wise (order-sensitive)
|
|
73
|
+
* - objects: identical own-key set AND deep-equal per key
|
|
74
|
+
* - mismatched kinds (array vs object, object vs null) → not equal
|
|
75
|
+
*
|
|
76
|
+
* Cost & safety:
|
|
77
|
+
* - Allocates NOTHING but transient `Object.keys` arrays — no clones. It is
|
|
78
|
+
* strictly cheaper than the `structuredClone` the commit already performs.
|
|
79
|
+
* - Primitive comparisons (the bulk of state) are O(1) via the `===` /
|
|
80
|
+
* `Object.is` fast paths; only nested objects/arrays incur a walk, bounded
|
|
81
|
+
* by the value's own size.
|
|
82
|
+
* - Assumes ACYCLIC, JSON-shaped values — the same contract the memory layer
|
|
83
|
+
* already relies on (committed state is `structuredClone`d and must be
|
|
84
|
+
* JSON-serialisable for checkpoints). A cyclic value is out of contract
|
|
85
|
+
* here exactly as it is for checkpointing; dev mode flags cycles at write
|
|
86
|
+
* time via `ScopeFacade.setValue`.
|
|
87
|
+
*/
|
|
88
|
+
export declare function deepEqual(a: any, b: any): boolean;
|
|
60
89
|
/**
|
|
61
90
|
* Deep union merge helper.
|
|
62
91
|
* - Arrays (non-empty): union without duplicates (encounter order preserved)
|
package/package.json
CHANGED