footprintjs 10.4.0 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/lib/capture/historyData.d.ts +6 -2
  3. package/dist/esm/lib/capture/historyData.js +18 -1
  4. package/dist/esm/lib/capture/historyNote.d.ts +2 -2
  5. package/dist/esm/lib/capture/historyNote.js +11 -6
  6. package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
  7. package/dist/esm/lib/capture/historyTypes.js +1 -1
  8. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  9. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  10. package/dist/esm/lib/capture/readSources.d.ts +7 -1
  11. package/dist/esm/lib/capture/readSources.js +32 -11
  12. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  13. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  14. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  15. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  16. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  17. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  18. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +3 -0
  19. package/dist/esm/lib/capture/storedReadSourceCounts.js +78 -0
  20. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  21. package/dist/esm/lib/capture/storedReadSources.js +104 -0
  22. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
  23. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  24. package/dist/esm/lib/engine/types.d.ts +2 -1
  25. package/dist/esm/lib/engine/types.js +1 -1
  26. package/dist/esm/lib/memory/StageContext.d.ts +1 -0
  27. package/dist/esm/lib/memory/StageContext.js +14 -2
  28. package/dist/esm/lib/memory/frameTypes.d.ts +3 -0
  29. package/dist/esm/lib/memory/frameTypes.js +1 -1
  30. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  31. package/dist/esm/lib/memory/logAddress.js +7 -0
  32. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
  33. package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
  34. package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
  35. package/dist/esm/lib/runner/captureHistory.js +16 -10
  36. package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
  37. package/dist/esm/lib/runner/readStoredCapture.js +3 -3
  38. package/dist/esm/lib/runner/recordSink.js +2 -10
  39. package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
  40. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  41. package/dist/lib/capture/historyData.js +21 -2
  42. package/dist/lib/capture/historyNote.js +9 -4
  43. package/dist/lib/capture/historyTypes.js +1 -1
  44. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  45. package/dist/lib/capture/readSources.js +35 -12
  46. package/dist/lib/capture/sinkSettlement.js +14 -0
  47. package/dist/lib/capture/sourceReadCounts.js +31 -0
  48. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  49. package/dist/lib/capture/storedReadSourceCounts.js +82 -0
  50. package/dist/lib/capture/storedReadSources.js +108 -0
  51. package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
  52. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  53. package/dist/lib/engine/types.js +1 -1
  54. package/dist/lib/memory/StageContext.js +14 -2
  55. package/dist/lib/memory/frameTypes.js +1 -1
  56. package/dist/lib/memory/logAddress.js +11 -0
  57. package/dist/lib/runner/ExecutionRuntime.js +65 -8
  58. package/dist/lib/runner/FlowChartExecutor.js +4 -2
  59. package/dist/lib/runner/captureHistory.js +15 -9
  60. package/dist/lib/runner/readStoredCapture.js +2 -2
  61. package/dist/lib/runner/recordSink.js +6 -14
  62. package/dist/lib/runner/storedCaptureAdmission.js +9 -7
  63. package/dist/lib/scope/ScopeFacade.js +2 -2
  64. package/dist/types/lib/capture/historyData.d.ts +6 -2
  65. package/dist/types/lib/capture/historyNote.d.ts +2 -2
  66. package/dist/types/lib/capture/historyTypes.d.ts +1 -1
  67. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  68. package/dist/types/lib/capture/readSources.d.ts +7 -1
  69. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  70. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  71. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  72. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +3 -0
  73. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  74. package/dist/types/lib/engine/types.d.ts +2 -1
  75. package/dist/types/lib/memory/StageContext.d.ts +1 -0
  76. package/dist/types/lib/memory/frameTypes.d.ts +3 -0
  77. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  78. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
  79. package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
  80. package/package.json +1 -1
@@ -0,0 +1,21 @@
1
+ import { HistoryDataError } from './historyData.js';
2
+ /** Conservative work cap before each distinct public value query, including shared-root replay/cloning. */
3
+ export class SourceReferenceBudget {
4
+ rows = 0;
5
+ bytes = 0;
6
+ queryRows;
7
+ queryBytes;
8
+ constructor(commitLog, initialState) {
9
+ this.queryRows = 1 + commitLog.length + commitLog.reduce((count, bundle) => count + bundle.trace.length, 0);
10
+ this.queryBytes = new TextEncoder().encode(JSON.stringify({ commitLog, initialState })).length;
11
+ }
12
+ spend() {
13
+ // The entire admitted basis is an upper estimate for each query; repeat (commit,key) hits spend nothing.
14
+ // Refuse before calling the reader, never after doing unaccounted work or silently cutting evidence.
15
+ if (this.queryRows > 1_000_000 - this.rows || this.queryBytes > 64 * 1024 * 1024 - this.bytes)
16
+ throw new HistoryDataError('source-validation-limit');
17
+ this.rows += this.queryRows;
18
+ this.bytes += this.queryBytes;
19
+ }
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlUmVmZXJlbmNlQnVkZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3NvdXJjZVJlZmVyZW5jZUJ1ZGdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCwyR0FBMkc7QUFDM0csTUFBTSxPQUFPLHFCQUFxQjtJQUN4QixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ1QsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNELFNBQVMsQ0FBUztJQUNsQixVQUFVLENBQVM7SUFFcEMsWUFBWSxTQUFrQyxFQUFFLFlBQXNDO1FBQ3BGLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRyxDQUFDO0lBRUQsS0FBSztRQUNILHlHQUF5RztRQUN6RyxxR0FBcUc7UUFDckcsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUs7WUFDM0YsTUFBTSxJQUFJLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IEhpc3RvcnlEYXRhRXJyb3IgfSBmcm9tICcuL2hpc3RvcnlEYXRhLmpzJztcblxuLyoqIENvbnNlcnZhdGl2ZSB3b3JrIGNhcCBiZWZvcmUgZWFjaCBkaXN0aW5jdCBwdWJsaWMgdmFsdWUgcXVlcnksIGluY2x1ZGluZyBzaGFyZWQtcm9vdCByZXBsYXkvY2xvbmluZy4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VSZWZlcmVuY2VCdWRnZXQge1xuICBwcml2YXRlIHJvd3MgPSAwO1xuICBwcml2YXRlIGJ5dGVzID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyeVJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWVyeUJ5dGVzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICB0aGlzLnF1ZXJ5Um93cyA9IDEgKyBjb21taXRMb2cubGVuZ3RoICsgY29tbWl0TG9nLnJlZHVjZSgoY291bnQsIGJ1bmRsZSkgPT4gY291bnQgKyBidW5kbGUudHJhY2UubGVuZ3RoLCAwKTtcbiAgICB0aGlzLnF1ZXJ5Qnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyBjb21taXRMb2csIGluaXRpYWxTdGF0ZSB9KSkubGVuZ3RoO1xuICB9XG5cbiAgc3BlbmQoKTogdm9pZCB7XG4gICAgLy8gVGhlIGVudGlyZSBhZG1pdHRlZCBiYXNpcyBpcyBhbiB1cHBlciBlc3RpbWF0ZSBmb3IgZWFjaCBxdWVyeTsgcmVwZWF0IChjb21taXQsa2V5KSBoaXRzIHNwZW5kIG5vdGhpbmcuXG4gICAgLy8gUmVmdXNlIGJlZm9yZSBjYWxsaW5nIHRoZSByZWFkZXIsIG5ldmVyIGFmdGVyIGRvaW5nIHVuYWNjb3VudGVkIHdvcmsgb3Igc2lsZW50bHkgY3V0dGluZyBldmlkZW5jZS5cbiAgICBpZiAodGhpcy5xdWVyeVJvd3MgPiAxXzAwMF8wMDAgLSB0aGlzLnJvd3MgfHwgdGhpcy5xdWVyeUJ5dGVzID4gNjQgKiAxMDI0ICogMTAyNCAtIHRoaXMuYnl0ZXMpXG4gICAgICB0aHJvdyBuZXcgSGlzdG9yeURhdGFFcnJvcignc291cmNlLXZhbGlkYXRpb24tbGltaXQnKTtcbiAgICB0aGlzLnJvd3MgKz0gdGhpcy5xdWVyeVJvd3M7XG4gICAgdGhpcy5ieXRlcyArPSB0aGlzLnF1ZXJ5Qnl0ZXM7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import type { ReadSourceSnapshot } from 'foottrace/write';
2
+ /** Already inert, byte-bounded evidence. Check native counts; never reconstruct read occurrences. */
3
+ export declare function storedReadSourceCounts(record: ReadSourceSnapshot, executionTree: unknown, committedOwners: ReadonlyMap<string, number>): boolean;
@@ -0,0 +1,78 @@
1
+ import { EMPTY_SOURCE_READ_COUNTS } from './sourceReadCounts.js';
2
+ const KINDS = Object.keys(EMPTY_SOURCE_READ_COUNTS.kinds);
3
+ function countsOf(value) {
4
+ if (!value || typeof value !== 'object' || Array.isArray(value))
5
+ return undefined;
6
+ const counts = value;
7
+ if (Object.keys(value).length !== 3 ||
8
+ !Number.isSafeInteger(counts.observed) ||
9
+ !Number.isSafeInteger(counts.retained) ||
10
+ counts.observed < 0 ||
11
+ counts.retained < 0 ||
12
+ counts.retained > counts.observed)
13
+ return undefined;
14
+ if (!counts.kinds || typeof counts.kinds !== 'object' || Array.isArray(counts.kinds))
15
+ return undefined;
16
+ if (Object.keys(counts.kinds).length !== KINDS.length)
17
+ return undefined;
18
+ let sum = 0;
19
+ for (const kind of KINDS) {
20
+ const count = counts.kinds[kind];
21
+ if (!Number.isSafeInteger(count) || count < 0)
22
+ return undefined;
23
+ sum += count;
24
+ if (sum > counts.retained)
25
+ return undefined;
26
+ }
27
+ if (sum !== counts.retained)
28
+ return undefined;
29
+ return counts;
30
+ }
31
+ /** Already inert, byte-bounded evidence. Check native counts; never reconstruct read occurrences. */
32
+ export function storedReadSourceCounts(record, executionTree, committedOwners) {
33
+ const owners = new Map();
34
+ const pending = [executionTree];
35
+ let visited = 0;
36
+ while (pending.length) {
37
+ if (++visited > 100_000)
38
+ return false;
39
+ const value = pending.pop();
40
+ if (!value || typeof value !== 'object' || Array.isArray(value))
41
+ return false;
42
+ const node = value;
43
+ const id = node.runtimeStageId;
44
+ if (Object.hasOwn(node, 'readSourceCounts')) {
45
+ const counts = countsOf(node.readSourceCounts);
46
+ if (!counts || (record.status === 'captured' && counts.observed !== counts.retained))
47
+ return false;
48
+ if (typeof id !== 'string' || !id) {
49
+ if (counts.observed || counts.retained)
50
+ return false;
51
+ }
52
+ else {
53
+ if (owners.has(id))
54
+ return false;
55
+ owners.set(id, counts);
56
+ }
57
+ }
58
+ else if (typeof id === 'string' && committedOwners.has(id))
59
+ return false;
60
+ if (Object.hasOwn(node, 'next'))
61
+ pending.push(node.next);
62
+ if (Object.hasOwn(node, 'children')) {
63
+ if (!Array.isArray(node.children) || node.children.length > 100_000 - visited - pending.length)
64
+ return false;
65
+ for (const child of node.children)
66
+ pending.push(child);
67
+ }
68
+ }
69
+ const remaining = new Map([...owners].map(([id, counts]) => [id, { ...counts.kinds }]));
70
+ for (const row of record.occurrences) {
71
+ const counts = remaining.get(row.runtimeStageId);
72
+ if (!counts || counts[row.source.kind] === 0)
73
+ return false;
74
+ counts[row.source.kind]--;
75
+ }
76
+ return [...remaining.values()].every((counts) => KINDS.every((kind) => counts[kind] === 0));
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkUmVhZFNvdXJjZUNvdW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9zdG9yZWRSZWFkU291cmNlQ291bnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUF3QyxDQUFDO0FBRWpHLFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsRixNQUFNLE1BQU0sR0FBRyxLQUF5QixDQUFDO0lBQ3pDLElBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUMvQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUM7UUFDbkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVE7UUFFakMsT0FBTyxTQUFTLENBQUM7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN2RyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFD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RyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0csS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzNELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVhZFNvdXJjZVNuYXBzaG90IH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHR5cGUgeyBTb3VyY2VSZWFkQ291bnRzIH0gZnJvbSAnLi9zb3VyY2VSZWFkQ291bnRzLmpzJztcbmltcG9ydCB7IEVNUFRZX1NPVVJDRV9SRUFEX0NPVU5UUyB9IGZyb20gJy4vc291cmNlUmVhZENvdW50cy5qcyc7XG5cbmNvbnN0IEtJTkRTID0gT2JqZWN0LmtleXMoRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTLmtpbmRzKSBhcyAoa2V5b2YgU291cmNlUmVhZENvdW50c1sna2luZHMnXSlbXTtcblxuZnVuY3Rpb24gY291bnRzT2YodmFsdWU6IHVua25vd24pOiBTb3VyY2VSZWFkQ291bnRzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb3VudHMgPSB2YWx1ZSBhcyBTb3VyY2VSZWFkQ291bnRzO1xuICBpZiAoXG4gICAgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCAhPT0gMyB8fFxuICAgICFOdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudHMub2JzZXJ2ZWQpIHx8XG4gICAgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50cy5yZXRhaW5lZCkgfHxcbiAgICBjb3VudHMub2JzZXJ2ZWQgPCAwIHx8XG4gICAgY291bnRzLnJldGFpbmVkIDwgMCB8fFxuICAgIGNvdW50cy5yZXRhaW5lZCA+IGNvdW50cy5vYnNlcnZlZFxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjb3VudHMua2luZHMgfHwgdHlwZW9mIGNvdW50cy5raW5kcyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShjb3VudHMua2luZHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoT2JqZWN0LmtleXMoY291bnRzLmtpbmRzKS5sZW5ndGggIT09IEtJTkRTLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAoY29uc3Qga2luZCBvZiBLSU5EUykge1xuICAgIGNvbnN0IGNvdW50ID0gY291bnRzLmtpbmRzW2tpbmRdO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpIHx8IGNvdW50IDwgMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdW0gKz0gY291bnQ7XG4gICAgaWYgKHN1bSA+IGNvdW50cy5yZXRhaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoc3VtICE9PSBjb3VudHMucmV0YWluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb3VudHM7XG59XG5cbi8qKiBBbHJlYWR5IGluZXJ0LCBieXRlLWJvdW5kZWQgZXZpZGVuY2UuIENoZWNrIG5hdGl2ZSBjb3VudHM7IG5ldmVyIHJlY29uc3RydWN0IHJlYWQgb2NjdXJyZW5jZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkUmVhZFNvdXJjZUNvdW50cyhcbiAgcmVjb3JkOiBSZWFkU291cmNlU25hcHNob3QsXG4gIGV4ZWN1dGlvblRyZWU6IHVua25vd24sXG4gIGNvbW1pdHRlZE93bmVyczogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG93bmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VSZWFkQ291bnRzPigpO1xuICBjb25zdCBwZW5kaW5nID0gW2V4ZWN1dGlvblRyZWVdO1xuICBsZXQgdmlzaXRlZCA9IDA7XG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCkge1xuICAgIGlmICgrK3Zpc2l0ZWQgPiAxMDBfMDAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdmFsdWUgPSBwZW5kaW5nLnBvcCgpO1xuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IG5vZGUgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBpZCA9IG5vZGUucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKE9iamVjdC5oYXNPd24obm9kZSwgJ3JlYWRTb3VyY2VDb3VudHMnKSkge1xuICAgICAgY29uc3QgY291bnRzID0gY291bnRzT2Yobm9kZS5yZWFkU291cmNlQ291bnRzKTtcbiAgICAgIGlmICghY291bnRzIHx8IChyZWNvcmQuc3RhdHVzID09PSAnY2FwdHVyZWQnICYmIGNvdW50cy5vYnNlcnZlZCAhPT0gY291bnRzLnJldGFpbmVkKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgfHwgIWlkKSB7XG4gICAgICAgIGlmIChjb3VudHMub2JzZXJ2ZWQgfHwgY291bnRzLnJldGFpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3duZXJzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgb3duZXJzLnNldChpZCwgY291bnRzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgY29tbWl0dGVkT3duZXJzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihub2RlLCAnbmV4dCcpKSBwZW5kaW5nLnB1c2gobm9kZS5uZXh0KTtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihub2RlLCAnY2hpbGRyZW4nKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUuY2hpbGRyZW4pIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMTAwXzAwMCAtIHZpc2l0ZWQgLSBwZW5kaW5nLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSBwZW5kaW5nLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICBjb25zdCByZW1haW5pbmcgPSBuZXcgTWFwKFsuLi5vd25lcnNdLm1hcCgoW2lkLCBjb3VudHNdKSA9PiBbaWQsIHsgLi4uY291bnRzLmtpbmRzIH1dKSk7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJlY29yZC5vY2N1cnJlbmNlcykge1xuICAgIGNvbnN0IGNvdW50cyA9IHJlbWFpbmluZy5nZXQocm93LnJ1bnRpbWVTdGFnZUlkKTtcbiAgICBpZiAoIWNvdW50cyB8fCBjb3VudHNbcm93LnNvdXJjZS5raW5kXSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvdW50c1tyb3cuc291cmNlLmtpbmRdLS07XG4gIH1cbiAgcmV0dXJuIFsuLi5yZW1haW5pbmcudmFsdWVzKCldLmV2ZXJ5KChjb3VudHMpID0+IEtJTkRTLmV2ZXJ5KChraW5kKSA9PiBjb3VudHNba2luZF0gPT09IDApKTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { CommitBundle } from 'foottrace';
2
+ import type { EngineReadSources, NativeReadCaptureNote } from './readSources.js';
3
+ /** After inert JSON admission: the record's codec owns descriptors; the engine binds its root observation. */
4
+ export declare function storedReadSources(value: unknown, capture: NativeReadCaptureNote, commitLog: readonly CommitBundle[], initialState?: Record<string, unknown>, executionTree?: unknown): EngineReadSources | undefined;
@@ -0,0 +1,104 @@
1
+ import { commitValueAtWithBasis } from 'foottrace';
2
+ import { nativeGet, nativeHas, normaliseStateKey } from 'foottrace/paths';
3
+ import { decodeReadSourceSnapshot } from 'foottrace/write';
4
+ import { readSourceStatus, SOURCE_LIMITATIONS } from './readSources.js';
5
+ import { SourceReferenceBudget } from './sourceReferenceBudget.js';
6
+ import { storedReadSourceCounts } from './storedReadSourceCounts.js';
7
+ function scalar(value) {
8
+ return value === null || typeof value === 'string' || typeof value === 'boolean' || typeof value === 'number';
9
+ }
10
+ /** Refuse unrecognized stored fields rather than silently dropping them through a projecting codec. */
11
+ function sameData(input, decoded) {
12
+ if (Object.is(input, decoded))
13
+ return true;
14
+ if (!input || !decoded || typeof input !== 'object' || typeof decoded !== 'object')
15
+ return false;
16
+ const keys = Object.keys(input);
17
+ return (keys.length === Object.keys(decoded).length &&
18
+ keys.every((key) => Object.hasOwn(decoded, key) &&
19
+ sameData(Object.getOwnPropertyDescriptor(input, key)?.value, Object.getOwnPropertyDescriptor(decoded, key)?.value)));
20
+ }
21
+ /** Bounded row references, not causal reconstruction or validation of application computation. */
22
+ function referencesMatch(record, commits, firstCommits, initialState) {
23
+ const paths = new Map();
24
+ const scalarSources = new Map();
25
+ const budget = new SourceReferenceBudget(commits, initialState);
26
+ for (const row of record.occurrences) {
27
+ const path = [...row.stateAddress, row.key];
28
+ if (row.source.kind === 'base' &&
29
+ (!initialState || !nativeHas(initialState, path) || !scalar(nativeGet(initialState, path))))
30
+ return false;
31
+ if (row.source.kind !== 'committed')
32
+ continue;
33
+ const index = row.source.commitIdx;
34
+ const bundle = commits[index];
35
+ const readerCommit = firstCommits.get(row.runtimeStageId);
36
+ // A later continuation must not loosen the boundary for earlier reads. Reused raw contexts stay unknown.
37
+ if (!bundle || readerCommit === undefined || index >= readerCommit)
38
+ return false;
39
+ let written = paths.get(index);
40
+ if (!written) {
41
+ written = new Set(bundle.trace.map((entry) => entry.path));
42
+ paths.set(index, written);
43
+ }
44
+ const key = normaliseStateKey(path);
45
+ if (!written.has(key))
46
+ return false;
47
+ let values = scalarSources.get(index);
48
+ if (!values)
49
+ scalarSources.set(index, (values = new Map()));
50
+ let confirmed = values.get(key);
51
+ if (confirmed === undefined) {
52
+ budget.spend();
53
+ // The public record reader owns set/merge/delta value semantics; no second replay/value rule here.
54
+ const result = commitValueAtWithBasis(commits, index, key, { initialState });
55
+ confirmed = scalar(result.value) && !result.basis.includes('redacted');
56
+ values.set(key, confirmed);
57
+ }
58
+ if (!confirmed)
59
+ return false;
60
+ }
61
+ return true;
62
+ }
63
+ /** After inert JSON admission: the record's codec owns descriptors; the engine binds its root observation. */
64
+ export function storedReadSources(value, capture, commitLog, initialState, executionTree) {
65
+ if (!value || typeof value !== 'object')
66
+ return undefined;
67
+ const source = value;
68
+ if (source.version !== 1 ||
69
+ source.runId !== capture.runId ||
70
+ source.persistence !== 'memory-only' ||
71
+ !sameData(source.commits, capture.commits) ||
72
+ !Array.isArray(source.limitations) ||
73
+ source.limitations.length > SOURCE_LIMITATIONS.length ||
74
+ new Set(source.limitations).size !== source.limitations.length ||
75
+ !source.limitations.every((gap) => SOURCE_LIMITATIONS.includes(gap)) ||
76
+ Object.keys(source).some((key) => !['version', 'runId', 'persistence', 'commits', 'status', 'limitations', 'record'].includes(key)))
77
+ return undefined;
78
+ const record = source.record === undefined ? undefined : decodeReadSourceSnapshot(source.record);
79
+ if (source.record !== undefined && (!record || !sameData(source.record, record)))
80
+ return undefined;
81
+ const firstCommits = new Map();
82
+ commitLog.forEach((bundle, index) => {
83
+ if (!firstCommits.has(bundle.runtimeStageId))
84
+ firstCommits.set(bundle.runtimeStageId, index);
85
+ });
86
+ if (record &&
87
+ (!sameData(record.address, capture.logAddress) ||
88
+ !storedReadSourceCounts(record, executionTree, firstCommits) ||
89
+ !referencesMatch(record, commitLog, firstCommits, initialState)))
90
+ return undefined;
91
+ if (source.status !== readSourceStatus(record, source.limitations.length) ||
92
+ capture.channels.readSources !== source.status)
93
+ return undefined;
94
+ return Object.freeze({
95
+ version: 1,
96
+ runId: source.runId,
97
+ persistence: 'memory-only',
98
+ commits: capture.commits,
99
+ status: source.status,
100
+ limitations: Object.freeze([...source.limitations]),
101
+ ...(record && { record }),
102
+ });
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkUmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvc3RvcmVkUmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsU0FBUyxNQUFNLENBQUMsS0FBYztJQUM1QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDaEgsQ0FBQztBQUVELHVHQUF1RztBQUN2RyxTQUFTLFFBQVEsQ0FBQyxLQUFjLEVBQUUsT0FBZ0I7SUFDaEQsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDakcsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxPQUFPLENBQ0wsSUFBSSxDQUFDLE1BQU0s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QUFhLEVBQUUsWUFBWSxDQUFDO1lBQzVELENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxFLE9BQU8sU0FBUyxDQUFDO0lBQ25CLElBQ0UsTUFBTSxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDckUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLE1BQU07UUFFOUMsT0FBTyxTQUFTLENBQUM7SUFDbkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ25CLE9BQU8sRUFBRSxDQUFDO1FBQ1YsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1FBQ25CLFdBQVcsRUFBRSxhQUFhO1FBQzFCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7S0FDMUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5vcm1hbGlzZVN0YXRlS2V5IH0gZnJvbSAnZm9vdHRyYWNlL3BhdGhzJztcbmltcG9ydCB0eXBlIHsgUmVhZFNvdXJjZVNuYXBzaG90IH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcbmltcG9ydCB7IGRlY29kZVJlYWRTb3VyY2VTbmFwc2hvdCB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgRW5naW5lUmVhZFNvdXJjZXMsIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSwgU291cmNlTGltaXRhdGlvbiB9IGZyb20gJy4vcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgcmVhZFNvdXJjZVN0YXR1cywgU09VUkNFX0xJTUlUQVRJT05TIH0gZnJvbSAnLi9yZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgeyBTb3VyY2VSZWZlcmVuY2VCdWRnZXQgfSBmcm9tICcuL3NvdXJjZVJlZmVyZW5jZUJ1ZGdldC5qcyc7XG5pbXBvcnQgeyBzdG9yZWRSZWFkU291cmNlQ291bnRzIH0gZnJvbSAnLi9zdG9yZWRSZWFkU291cmNlQ291bnRzLmpzJztcblxuZnVuY3Rpb24gc2NhbGFyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKiBSZWZ1c2UgdW5yZWNvZ25pemVkIHN0b3JlZCBmaWVsZHMgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgdGhlbSB0aHJvdWdoIGEgcHJvamVjdGluZyBjb2RlYy4gKi9cbmZ1bmN0aW9uIHNhbWVEYXRhKGlucHV0OiB1bmtub3duLCBkZWNvZGVkOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoaW5wdXQsIGRlY29kZWQpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFpbnB1dCB8fCAhZGVjb2RlZCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBkZWNvZGVkICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5wdXQpO1xuICByZXR1cm4gKFxuICAgIGtleXMubGVuZ3RoID09PSBPYmplY3Qua2V5cyhkZWNvZGVkKS5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgT2JqZWN0Lmhhc093bihkZWNvZGVkLCBrZXkpICYmXG4gICAgICAgIHNhbWVEYXRhKFxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5wdXQsIGtleSk/LnZhbHVlLFxuICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVjb2RlZCwga2V5KT8udmFsdWUsXG4gICAgICAgICksXG4gICAgKVxuICApO1xufVxuXG4vKiogQm91bmRlZCByb3cgcmVmZXJlbmNlcywgbm90IGNhdXNhbCByZWNvbnN0cnVjdGlvbiBvciB2YWxpZGF0aW9uIG9mIGFwcGxpY2F0aW9uIGNvbXB1dGF0aW9uLiAqL1xuZnVuY3Rpb24gcmVmZXJlbmNlc01hdGNoKFxuICByZWNvcmQ6IFJlYWRTb3VyY2VTbmFwc2hvdCxcbiAgY29tbWl0czogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sXG4gIGZpcnN0Q29tbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+LFxuICBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRocyA9IG5ldyBNYXA8bnVtYmVyLCBTZXQ8c3RyaW5nPj4oKTtcbiAgY29uc3Qgc2NhbGFyU291cmNlcyA9IG5ldyBNYXA8bnVtYmVyLCBNYXA8c3RyaW5nLCBib29sZWFuPj4oKTtcbiAgY29uc3QgYnVkZ2V0ID0gbmV3IFNvdXJjZVJlZmVyZW5jZUJ1ZGdldChjb21taXRzLCBpbml0aWFsU3RhdGUpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiByZWNvcmQub2NjdXJyZW5jZXMpIHtcbiAgICBjb25zdCBwYXRoID0gWy4uLnJvdy5zdGF0ZUFkZHJlc3MsIHJvdy5rZXldO1xuICAgIGlmIChcbiAgICAgIHJvdy5zb3VyY2Uua2luZCA9PT0gJ2Jhc2UnICYmXG4gICAgICAoIWluaXRpYWxTdGF0ZSB8fCAhbmF0aXZlSGFzKGluaXRpYWxTdGF0ZSwgcGF0aCkgfHwgIXNjYWxhcihuYXRpdmVHZXQoaW5pdGlhbFN0YXRlLCBwYXRoKSkpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyb3cuc291cmNlLmtpbmQgIT09ICdjb21taXR0ZWQnKSBjb250aW51ZTtcbiAgICBjb25zdCBpbmRleCA9IHJvdy5zb3VyY2UuY29tbWl0SWR4O1xuICAgIGNvbnN0IGJ1bmRsZSA9IGNvbW1pdHNbaW5kZXhdO1xuICAgIGNvbnN0IHJlYWRlckNvbW1pdCA9IGZpcnN0Q29tbWl0cy5nZXQocm93LnJ1bnRpbWVTdGFnZUlkKTtcbiAgICAvLyBBIGxhdGVyIGNvbnRpbnVhdGlvbiBtdXN0IG5vdCBsb29zZW4gdGhlIGJvdW5kYXJ5IGZvciBlYXJsaWVyIHJlYWRzLiBSZXVzZWQgcmF3IGNvbnRleHRzIHN0YXkgdW5rbm93bi5cbiAgICBpZiAoIWJ1bmRsZSB8fCByZWFkZXJDb21taXQgPT09IHVuZGVmaW5lZCB8fCBpbmRleCA+PSByZWFkZXJDb21taXQpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgd3JpdHRlbiA9IHBhdGhzLmdldChpbmRleCk7XG4gICAgaWYgKCF3cml0dGVuKSB7XG4gICAgICB3cml0dGVuID0gbmV3IFNldChidW5kbGUudHJhY2UubWFwKChlbnRyeSkgPT4gZW50cnkucGF0aCkpO1xuICAgICAgcGF0aHMuc2V0KGluZGV4LCB3cml0dGVuKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkocGF0aCk7XG4gICAgaWYgKCF3cml0dGVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHZhbHVlcyA9IHNjYWxhclNvdXJjZXMuZ2V0KGluZGV4KTtcbiAgICBpZiAoIXZhbHVlcykgc2NhbGFyU291cmNlcy5zZXQoaW5kZXgsICh2YWx1ZXMgPSBuZXcgTWFwKCkpKTtcbiAgICBsZXQgY29uZmlybWVkID0gdmFsdWVzLmdldChrZXkpO1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYnVkZ2V0LnNwZW5kKCk7XG4gICAgICAvLyBUaGUgcHVibGljIHJlY29yZCByZWFkZXIgb3ducyBzZXQvbWVyZ2UvZGVsdGEgdmFsdWUgc2VtYW50aWNzOyBubyBzZWNvbmQgcmVwbGF5L3ZhbHVlIHJ1bGUgaGVyZS5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoY29tbWl0cyBhcyBDb21taXRCdW5kbGVbXSwgaW5kZXgsIGtleSwgeyBpbml0aWFsU3RhdGUgfSk7XG4gICAgICBjb25maXJtZWQgPSBzY2FsYXIocmVzdWx0LnZhbHVlKSAmJiAhcmVzdWx0LmJhc2lzLmluY2x1ZGVzKCdyZWRhY3RlZCcpO1xuICAgICAgdmFsdWVzLnNldChrZXksIGNvbmZpcm1lZCk7XG4gICAgfVxuICAgIGlmICghY29uZmlybWVkKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBBZnRlciBpbmVydCBKU09OIGFkbWlzc2lvbjogdGhlIHJlY29yZCdzIGNvZGVjIG93bnMgZGVzY3JpcHRvcnM7IHRoZSBlbmdpbmUgYmluZHMgaXRzIHJvb3Qgb2JzZXJ2YXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkUmVhZFNvdXJjZXMoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjYXB0dXJlOiBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUsXG4gIGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sXG4gIGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBleGVjdXRpb25UcmVlPzogdW5rbm93bixcbik6IEVuZ2luZVJlYWRTb3VyY2VzIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZSBhcyBFbmdpbmVSZWFkU291cmNlcztcbiAgaWYgKFxuICAgIHNvdXJjZS52ZXJzaW9uICE9PSAxIHx8XG4gICAgc291cmNlLnJ1bklkICE9PSBjYXB0dXJlLnJ1bklkIHx8XG4gICAgc291cmNlLnBlcnNpc3RlbmNlICE9PSAnbWVtb3J5LW9ubHknIHx8XG4gICAgIXNhbWVEYXRhKHNvdXJjZS5jb21taXRzLCBjYXB0dXJlLmNvbW1pdHMpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoc291cmNlLmxpbWl0YXRpb25zKSB8fFxuICAgIHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGggPiBTT1VSQ0VfTElNSVRBVElPTlMubGVuZ3RoIHx8XG4gICAgbmV3IFNldChzb3VyY2UubGltaXRhdGlvbnMpLnNpemUgIT09IHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGggfHxcbiAgICAhc291cmNlLmxpbWl0YXRpb25zLmV2ZXJ5KChnYXApID0+IFNPVVJDRV9MSU1JVEFUSU9OUy5pbmNsdWRlcyhnYXAgYXMgU291cmNlTGltaXRhdGlvbikpIHx8XG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5zb21lKFxuICAgICAgKGtleSkgPT4gIVsndmVyc2lvbicsICdydW5JZCcsICdwZXJzaXN0ZW5jZScsICdjb21taXRzJywgJ3N0YXR1cycsICdsaW1pdGF0aW9ucycsICdyZWNvcmQnXS5pbmNsdWRlcyhrZXkpLFxuICAgIClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlY29yZCA9IHNvdXJjZS5yZWNvcmQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRlY29kZVJlYWRTb3VyY2VTbmFwc2hvdChzb3VyY2UucmVjb3JkKTtcbiAgaWYgKHNvdXJjZS5yZWNvcmQgIT09IHVuZGVmaW5lZCAmJiAoIXJlY29yZCB8fCAhc2FtZURhdGEoc291cmNlLnJlY29yZCwgcmVjb3JkKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0Q29tbWl0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGNvbW1pdExvZy5mb3JFYWNoKChidW5kbGUsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFmaXJzdENvbW1pdHMuaGFzKGJ1bmRsZS5ydW50aW1lU3RhZ2VJZCkpIGZpcnN0Q29tbWl0cy5zZXQoYnVuZGxlLnJ1bnRpbWVTdGFnZUlkLCBpbmRleCk7XG4gIH0pO1xuICBpZiAoXG4gICAgcmVjb3JkICYmXG4gICAgKCFzYW1lRGF0YShyZWNvcmQuYWRkcmVzcywgY2FwdHVyZS5sb2dBZGRyZXNzKSB8fFxuICAgICAgIXN0b3JlZFJlYWRTb3VyY2VDb3VudHMocmVjb3JkLCBleGVjdXRpb25UcmVlLCBmaXJzdENvbW1pdHMpIHx8XG4gICAgICAhcmVmZXJlbmNlc01hdGNoKHJlY29yZCwgY29tbWl0TG9nLCBmaXJzdENvbW1pdHMsIGluaXRpYWxTdGF0ZSkpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgc291cmNlLnN0YXR1cyAhPT0gcmVhZFNvdXJjZVN0YXR1cyhyZWNvcmQsIHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGgpIHx8XG4gICAgY2FwdHVyZS5jaGFubmVscy5yZWFkU291cmNlcyAhPT0gc291cmNlLnN0YXR1c1xuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIHZlcnNpb246IDEsXG4gICAgcnVuSWQ6IHNvdXJjZS5ydW5JZCxcbiAgICBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JyxcbiAgICBjb21taXRzOiBjYXB0dXJlLmNvbW1pdHMsXG4gICAgc3RhdHVzOiBzb3VyY2Uuc3RhdHVzLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKFsuLi5zb3VyY2UubGltaXRhdGlvbnNdKSxcbiAgICAuLi4ocmVjb3JkICYmIHsgcmVjb3JkIH0pLFxuICB9KTtcbn1cbiJdfQ==
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import { LOG_PLACEHOLDER } from 'foottrace/write';
16
16
  import { thrownText } from '../../errors/errorInfo.js';
17
+ import { childLogAddress } from '../../memory/logAddress.js';
17
18
  import { isPauseSignal } from '../../pause/types.js';
18
19
  import { commitStageWrites } from './commitStage.js';
19
20
  import { rememberRedactedSubflowState } from './servedSubflowResults.js';
@@ -164,11 +165,19 @@ export class SubflowExecutor {
164
165
  // parent log's address plus this mount's runtimeStageId — opened here, its seed and every commit as they land,
165
166
  // closed at the mount's exit (or its pause, or its failure). Without a sink: undefined, the plain log.
166
167
  const mountRuntimeStageId = parentTraversalContext?.runtimeStageId;
168
+ const parentLogAddress = this.deps.executionRuntime.executionHistory.address;
169
+ // Identity follows the same native log address as storage, even for an in-memory child.
170
+ // A missing native parent/mount identity cannot be replaced with a path/name guess.
171
+ const sourceAddress = policy.readSources ? childLogAddress(parentLogAddress, mountRuntimeStageId) : undefined;
167
172
  const record = mountRuntimeStageId === undefined
168
173
  ? undefined
169
174
  : this.deps.executionRuntime.recordFor?.(mountRuntimeStageId, { subflowId });
170
175
  const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy, record, parentTraversalContext?.runId
171
- ? { runId: parentTraversalContext.runId, unavailable: 'child-source-ownership' }
176
+ ? {
177
+ runId: parentTraversalContext.runId,
178
+ ...(sourceAddress ? { address: sourceAddress } : { unavailable: 'child-source-ownership' }),
179
+ ...(isResumeForThisSubflow && { historyOmitted: true }),
180
+ }
172
181
  : undefined);
173
182
  // Seed GlobalStore with the right shape for the path:
174
183
  // • Resume into THIS subflow → seed from the captured pre-pause
@@ -419,4 +428,4 @@ export class SubflowExecutor {
419
428
  return subflowOutput;
420
429
  }
421
430
  }
422
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELElBQUksR0FBd0MsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUNuQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLFNBQVMsWUFBWSxDQUFDLEtBQWM7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QUN4RixpR0FBaUc7UUFDakcscURBQXFEO1FBQ3JELElBQUksbUJBQW1CLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0QsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFdBQVcsV0FBVyxVQUFVLEVBQUU7WUFDN0UsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUV0RywyRUFBMkU7UUFDM0Usc0VBQXNFO1FBQ3RFLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBRUQsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV2RCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1YmZsb3dFeGVjdXRvciDigJQgSXNvbGF0aW9uIGJvdW5kYXJ5IGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgaXNvbGF0ZWQgRXhlY3V0aW9uUnVudGltZSBmb3IgZWFjaCBzdWJmbG93XG4gKiAtIEFwcGx5IGlucHV0L291dHB1dCBtYXBwaW5nIHZpYSBTdWJmbG93SW5wdXRNYXBwZXJcbiAqIC0gRGVsZWdhdGUgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICogLSBUcmFjayBzdWJmbG93IHJlc3VsdHMgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gKlxuICogRWFjaCBzdWJmbG93IGdldHMgaXRzIG93biBHbG9iYWxTdG9yZSBmb3IgaXNvbGF0aW9uLlxuICogVHJhdmVyc2FsIHVzZXMgdGhlIFNBTUUgNy1waGFzZSBhbGdvcml0aG0gYXMgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzZXJcbiAqICh2aWEgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkpLCBzbyBkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgbGF6eSBzdWJmbG93cyxcbiAqIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IHRocm93blRleHQgfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgU3ViZmxvd1Jlc3VsdCxcbiAgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnksXG4gIFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlIH0gZnJvbSAnLi9zZXJ2ZWRTdWJmbG93UmVzdWx0cy5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgYXBwbHlPdXRwdXRNYXBwaW5nLCBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUgfSBmcm9tICcuL1N1YmZsb3dJbnB1dE1hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBtYXBwZWQgaW5wdXQsIGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCdzIHN0YXRlIE9OQ0UgcGVyIG1vdW50IChEMSxcbiAqIDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuXG4gKlxuICogVGhlIGlucHV0TWFwcGVyIHJlYWRzIHRoZSBwYXJlbnQncyBMSVZFIHN0YXRlIChgZ2V0U2NvcGUoKWApLCBzbyBhIHZhbHVlIGl0XG4gKiBwYXNzZXMgdGhyb3VnaCAoYChwKSA9PiAoeyBjZmc6IHAuY2ZnIH0pYCkgaXMgdGhlIHBhcmVudCdzIGNvbW1pdHRlZFxuICogb2JqZWN0IOKAlCBhbmQgdGhlIHN1YmZsb3cncyBhcmdzIGFyZSBkZWVwLUZST1pFTiBpbiBwbGFjZVxuICogKGByZWFkb25seUlucHV0IMK3IGNyZWF0ZUZyb3plbkFyZ3NgKS4gVGhlIHR5cGVkIHNjb3BlIGRvZXMgbm90IHByb3h5IGFcbiAqIGZyb3plbiB2YWx1ZSAoYGFsbG93bGlzdCDCtyBzaG91bGRXcmFwV2l0aFByb3h5YCksIHNvIGEgbGF0ZXJcbiAqIGBzY29wZS5jZmcueCA9IDFgIGluIHRoZSBwYXJlbnQgbWV0IHRoZSByYXcgZnJvemVuIG9iamVjdDogYSBUeXBlRXJyb3IgaW5cbiAqIHN0cmljdCBjb2RlLiBCZWZvcmUgOS4yOS4wIHRoZSBwYXJlbnQncyBuZXh0IHdob2xlLXN0YXRlIGNsb25lIHJlcGxhY2VkIHRoZVxuICogZnJvemVuIG9iamVjdCAoYSBtb3VudCB0aGF0IGNvbW1pdHRlZCBub3RoaW5nIGxlZnQgaXQgaW4gcGxhY2Ug4oCUIHRoZSBidWdcbiAqIGV4aXN0ZWQsIGl0IHdhcyBvbmx5IHNob3J0LWxpdmVkKTsgdW5kZXIgY29weS1vbi13cml0ZSBub3RoaW5nIHJlLWNsb25lcyxcbiAqIHNvIHRoZSBmcmVlemUgd291bGQgbGFzdCB1bnRpbCB0aGUga2V5IGlzIHJld3JpdHRlbi4gQSBtb3VudCBtdXN0IG5ldmVyXG4gKiBlZGl0IOKAlCBvciBmcmVlemUg4oCUIHRoZSBwYXJlbnQncyBjb21taXR0ZWQgb2JqZWN0czogZXZlcnkgcGxhaW4gb2JqZWN0LFxuICogYXJyYXksIGBEYXRlYCwgYE1hcGAgYW5kIGBTZXRgIHRoZSBtYXBwZXIgcmV0dXJucyBpcyBjbG9uZWQgaGVyZSwgYmVmb3JlIGl0XG4gKiBiZWNvbWVzIHRoZSBhcmdzLiBBIGNsYXNzIGluc3RhbmNlIHBhc3NlcyBieSByZWZlcmVuY2UsIGFzIGJlZm9yZSAoaXRcbiAqIGNhbm5vdCBjb21lIGZyb20gY29tbWl0dGVkIHN0YXRlLCBhbmQgYSBjbG9uZSB3b3VsZCBkcm9wIGl0cyBwcm90b3R5cGUpLlxuICogVGhlIHNlZWQgaXMgY2xvbmVkIGFnYWluIGF0IGl0cyBjb21taXQsIHNvIHRoZSBzdWJmbG93J3Mgc3RhdGUgaXNcbiAqIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZGV0YWNoTWFwcGVkSW5wdXQoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKCFpc0RldGFjaGFibGUodmFsdWUpKSBjb250aW51ZTtcbiAgICAob3V0ID8/PSB7IC4uLmlucHV0IH0pW2tleV0gPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG4gIHJldHVybiBvdXQgPz8gaW5wdXQ7XG59XG5cbi8qKiBBIHZhbHVlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlcHJvZHVjZXMgd2l0aCBpdHMgb3duIHR5cGU6IHBsYWluIG9iamVjdCwgYXJyYXksIGBEYXRlYCwgYE1hcGAsIGBTZXRgLiAqL1xuZnVuY3Rpb24gaXNEZXRhY2hhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYGRlcHMucmVzdW1lYCkuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbFxuICAgKiBydW4uIEFza2VkIG9uY2UgcGVyIHN1YmZsb3cgZW50cnkg4oCUIHNlZSB7QGxpbmsgUmVzdW1lRW50cnl9LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXN1bWU6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgdHJhdmVyc2VyRmFjdG9yeTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPixcbiAgKSB7XG4gICAgdGhpcy5yZXN1bWUgPSBkZXBzLnJlc3VtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc3ViZmxvdyB3aXRoIGlzb2xhdGVkIGNvbnRleHQuXG4gICAqXG4gICAqIDEuIENyZWF0ZXMgYSBmcmVzaCBFeGVjdXRpb25SdW50aW1lIGZvciB0aGUgc3ViZmxvd1xuICAgKiAyLiBBcHBsaWVzIGlucHV0IG1hcHBpbmcgdG8gc2VlZCB0aGUgc3ViZmxvdydzIEdsb2JhbFN0b3JlXG4gICAqIDMuIERlbGVnYXRlcyB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gICAqIDQuIEFwcGxpZXMgb3V0cHV0IG1hcHBpbmcgdG8gd3JpdGUgcmVzdWx0cyBiYWNrIHRvIHBhcmVudCBzY29wZVxuICAgKiA1LiBTdG9yZXMgZXhlY3V0aW9uIGRhdGEgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gICAqL1xuICBhc3luYyBleGVjdXRlU3ViZmxvdyhcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBwYXJlbnRDb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1YmZsb3dSZXN1bHRzTWFwOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZCE7XG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBub2RlLnN1YmZsb3dOYW1lID8/IG5vZGUubmFtZTtcblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFbnRlcmluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcblxuICAgIC8vIOKUgOKUgOKUgCBSZXN1bWUgcmUtZW50cnkgKG9uZS1zaG90KSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFdoZW4gdGhpcyBlbnRyeSBpcyB0aGUgcmVzdW1lJ3Mgd2F5IGJhY2sgaW50byBhIHBhdXNlZCBzdWJmbG93LCB0aGVcbiAgICAvLyBob3AgbmFtZXMgd2hlcmUgdGhlIHN1YmZsb3cncyB0cmF2ZXJzYWwgc3RhcnRzICh0aGUgbmV4dCBtb3VudCBvbiB0aGVcbiAgICAvLyBwYXVzZSBwYXRoLCBvciB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4pLCBjYXJyaWVzIHRoZSBzdWJmbG93J3NcbiAgICAvLyBjYXB0dXJlZCBwcmUtcGF1c2Ugc3RhdGUsIGFuZCBhbnkgc2libGluZyBwYXVzZXMgd2FpdGluZyBpbiBpdC4gVGFrZW5cbiAgICAvLyBPTkNFOiBhbnkgbGF0ZXIgZW50cnkgaW50byB0aGlzIHN1YmZsb3cg4oCUIGEgbG9vcCBwYXNzaW5nIGl0cyBtb3VudFxuICAgIC8vIGFnYWluIOKAlCBnZXRzIGB1bmRlZmluZWRgIGFuZCBydW5zIHRoZSByZWFsIHN1YmZsb3cgZnJvbSBpdHMgcmVhbCByb290LFxuICAgIC8vIGlucHV0TWFwcGVyIGFuZCBhbGwuXG4gICAgY29uc3QgcmVzdW1lSG9wID0gdGhpcy5yZXN1bWU/LmVudGVyU3ViZmxvdyhzdWJmbG93SWQpO1xuXG4gICAgLy8g4pSA4pSA4pSAIElucHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBUaGUgbWFwcGVyIHJ1bnMgb24gRVZFUlkgZW50cnk6IGl0cyByZXN1bHQgaXMgdGhlIHN0YWdlcycgcmVhZC1vbmx5XG4gICAgLy8gYXJncyAoYCRnZXRBcmdzKClgKSwgYW5kIGEgcmUtZW50ZXJlZCBzdWJmbG93J3Mgc3RhZ2VzIHJlYWQgdGhlIHNhbWVcbiAgICAvLyBhcmdzIHRoZXkgcmVhZCBiZWZvcmUgdGhlIHBhdXNlICh0aGUgcGFyZW50J3MgdmlldyBpcyB0aGUgc2FtZSBvbmUg4oCUXG4gICAgLy8gaXQgd2FzIGJsb2NrZWQgaW4gdGhpcyBtb3VudCkuIFdoYXQgYSByZXN1bWUgY2hhbmdlcyBpcyBvbmx5IHRoZSBTRUVEOlxuICAgIC8vIHdoZW4gdGhlIGhvcCBjYXJyaWVzIGEgY2FwdHVyZSwgdGhlIG5lc3RlZCBtZW1vcnkgaXMgc2VlZGVkIGZyb20gdGhlXG4gICAgLy8gY2FwdHVyZSwgbm90IGZyb20gdGhlIG1hcHBlciDigJQgdGhlIGNhcHR1cmUgaXMgdGhlIHBvc3QtaW5wdXQgcHJlLXBhdXNlXG4gICAgLy8gbWVtb3J5LCBhbmQgc2VlZGluZyB0aGUgbWFwcGVyJ3MgdmFsdWVzIHdvdWxkIGNsb2JiZXIgcG9zdC1pbnB1dFxuICAgIC8vIHdyaXRlcyAoaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLikgd2l0aCB0aGUgc3RhcnQtb2Ytc3ViZmxvdyB2aWV3LlxuICAgIGNvbnN0IG1vdW50T3B0aW9ucyA9IG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICBsZXQgbWFwcGVkSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgY29uc3QgcmVzdW1lQ2FwdHVyZSA9IHJlc3VtZUhvcD8uc2VlZDtcbiAgICBjb25zdCBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID0gcmVzdW1lQ2FwdHVyZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gVGhlIHJ1bidzIHBvbGljeSAoRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yXG4gICAgLy8gZmxhZyDigJQgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBmcmFtZSwgd2hpY2ggaG9sZHMgaXQgYnkgcmVmZXJlbmNlLlxuICAgIC8vIFRoZSBuZXN0ZWQgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCBXSVRIIGl0LCBzbyB0aGUgc2VlZCBjb21taXQgYmVsb3dcbiAgICAvLyAoYGhpc3RvcnlbMF1gKSBhbmQgZXZlcnkgbGF0ZXIgY29tbWl0IG9mIHRoZSBzdWJmbG93IHJ1biB1bmRlciB0aGUgc2FtZVxuICAgIC8vIG9iamVjdCwgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBrZWVwcyBhIG1pcnJvciBvZiBpdHMgb3duIGV4YWN0bHkgd2hlblxuICAgIC8vIHRoZSBydW4gZG9lcyAoaXRzIFNFUlZFRCBzdGF0ZSBpcyB0aGVuIHRoZSBmb2xkIG9mIGl0cyBvd24gc2NydWJiZWRcbiAgICAvLyBsb2csIG5ldmVyIGEgc2Vjb25kIHNjcnViKS5cbiAgICBjb25zdCBwb2xpY3k6IFJ1blBvbGljeSA9IHBhcmVudENvbnRleHQuZ2V0UG9saWN5KCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBvbGljeS5yZWRhY3Rpb247XG5cbiAgICBpZiAobW91bnRPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gVGhlIHJ1bGUgcmlkZXMgYWxvbmc6IGEga2V5IHRoZSBtYXBwZXIgY29waWVzIGEgc2VsZWN0ZWQgdmFsdWUgaW50b1xuICAgICAgICAvLyBpbmhlcml0cyBpdHMgcmVkYWN0aW9uIGJlZm9yZSB0aGUgc2VlZCBpcyB3cml0dGVuICh0aGUgdGFpbnQgcnVsZSkuXG4gICAgICAgIG1hcHBlZElucHV0ID0gZGV0YWNoTWFwcGVkSW5wdXQoZ2V0SW5pdGlhbFNjb3BlVmFsdWVzKHBhcmVudFNjb3BlLCBtb3VudE9wdGlvbnMsIHJlZGFjdGlvblJ1bGUpKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gbWFwcGVkSW5wdXQgaXMgY2FwdHVyZWQgaW4gU3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dCBmb3IgZGVidWdnaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignaW5wdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlIHJlY2VpdmVzIHRoZSBSRVRBSU5FRCBmb3JtIG9mIHRoZSBtYXBwZWQgaW5wdXQg4oCUIGFuXG4gICAgLy8gaW5wdXRNYXBwZXIgbWF5IGluamVjdCB2YWx1ZXMgZnJvbSBhbnl3aGVyZSwgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICAvLyB1bmRlciB0aGUgcG9saWN5IGJlZm9yZSBhbnkgcmVjb3JkZXIgc2VlcyBpdC4gU2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nXG4gICAgLy8gaW4gaXQgaXMgcmVkYWN0ZWQgKHRoZSBuby1wb2xpY3kgcGF0aCBhbGxvY2F0ZXMgbm90aGluZykuXG4gICAgY29uc3QgbmFycmF0aXZlSW5wdXQgPSByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydCkuXG4gICAgLy8gSXRzIHJvb3QgY29udGV4dCBpcyB0aGUgZmlyc3Qgc3RhZ2UgdGhlIHN1YmZsb3cgdHJhdmVyc2FsIHJ1bnMg4oCUIHRoZVxuICAgIC8vIHJlc3VtZSBob3AncyBlbnRyeSBvbiBhIHJlLWVudHJ5LCB0aGUgc3ViZmxvdydzIHJvb3Qgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyA9IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLmNvbnN0cnVjdG9yIGFzIG5ldyAoXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBpZDogc3RyaW5nLFxuICAgICAgZGVmYXVsdFZhbHVlczogdW5kZWZpbmVkLFxuICAgICAgaW5pdGlhbFN0YXRlOiB1bmRlZmluZWQsXG4gICAgICBwb2xpY3k6IFJ1blBvbGljeSxcbiAgICAgIHJlY29yZD86IHVua25vd24sXG4gICAgICBzb3VyY2U/OiB7IHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7IHJlYWRvbmx5IHVuYXZhaWxhYmxlOiAnY2hpbGQtc291cmNlLW93bmVyc2hpcCcgfSxcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHJlc3VtZUhvcD8uZW50cnkgPz8gbm9kZTtcbiAgICAvLyBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogd2hlbiB0aGUgcnVuIHdyaXRlcyB0byBhIHNpbmssIHRoZSBtb3VudCdzIG93biBsb2cgZG9lcyB0b28sIGF0IHRoZVxuICAgIC8vIHBhcmVudCBsb2cncyBhZGRyZXNzIHBsdXMgdGhpcyBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBvcGVuZWQgaGVyZSwgaXRzIHNlZWQgYW5kIGV2ZXJ5IGNvbW1pdCBhcyB0aGV5IGxhbmQsXG4gICAgLy8gY2xvc2VkIGF0IHRoZSBtb3VudCdzIGV4aXQgKG9yIGl0cyBwYXVzZSwgb3IgaXRzIGZhaWx1cmUpLiBXaXRob3V0IGEgc2luazogdW5kZWZpbmVkLCB0aGUgcGxhaW4gbG9nLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCByZWNvcmQgPVxuICAgICAgbW91bnRSdW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUucmVjb3JkRm9yPy4obW91bnRSdW50aW1lU3RhZ2VJZCwgeyBzdWJmbG93SWQgfSk7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoXG4gICAgICBmaXJzdE5vZGUubmFtZSxcbiAgICAgIGZpcnN0Tm9kZS5pZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bklkXG4gICAgICAgID8geyBydW5JZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dC5ydW5JZCwgdW5hdmFpbGFibGU6ICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICk7XG5cbiAgICAvLyBTZWVkIEdsb2JhbFN0b3JlIHdpdGggdGhlIHJpZ2h0IHNoYXBlIGZvciB0aGUgcGF0aDpcbiAgICAvLyAgIOKAoiBSZXN1bWUgaW50byBUSElTIHN1YmZsb3cg4oaSIHNlZWQgZnJvbSB0aGUgY2FwdHVyZWQgcHJlLXBhdXNlXG4gICAgLy8gICAgIHNjb3BlIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLlxuICAgIC8vICAgICAoYG1hcHBlZElucHV0YCBzdGlsbCByZWFjaGVzIHRoZSBzdGFnZXMsIGFzIHRoZWlyIHJlYWQtb25seSBhcmdzLilcbiAgICAvLyAgIOKAoiBOb3JtYWwgZW50cnkg4oaSIHNlZWQgZnJvbSB0aGUgaW5wdXRNYXBwZXIncyBtYXBwZWRJbnB1dC5cbiAgICBjb25zdCBzZWVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPyByZXN1bWVDYXB0dXJlISA6IG1hcHBlZElucHV0O1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWVkVmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAgICAgIC8vIGNvbnRleHQsIG5vdCBieSBhIGZhY2FkZSDigJQgdGhhdCBmcmFtZSBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyBwb2xpY3lcbiAgICAgIC8vICh0aGUgcnVudGltZSB3YXMgY29uc3RydWN0ZWQgd2l0aCBpdCksIHNvIHRoZSBzZWVkIHJldGFpbnMgdW5kZXIgdGhlXG4gICAgICAvLyBydWxlLCBsYW5kcyBpbiB0aGUgbWlycm9yIGFzIHRoZSBwbGFjZWhvbGRlciwgYW5kIGNvbW1pdHMgdW5kZXIgdGhlXG4gICAgICAvLyBydW4ncyBkaWFscyBsaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIChDLUY1OiB1bmRlciBgd3JpdGVQcm92ZW5hbmNlOlxuICAgICAgLy8gJ3JlYWRzLXByZWZpeCdgIGl0cyByb3dzIGNhcnJ5IGByZWFkS2V5czogW11gKS5cbiAgICAgIC8vIFRoZSBzZWVkIGlzIHRoZSBtb3VudCdzIGFjdCB0b286IGl0cyBidW5kbGUg4oCUIGBoaXN0b3J5WzBdYCBvZiB0aGVcbiAgICAgIC8vIHN1YmZsb3cncyBvd24gbG9nIOKAlCBjYXJyaWVzIHRoZSBtb3VudCdzIHN0YWdlLCBzdGFnZUlkIGFuZFxuICAgICAgLy8gcnVudGltZVN0YWdlSWQgKFIxMzsgdGhyb3VnaCA5LjMzLjAgaXQgY2FycmllZCBydW50aW1lU3RhZ2VJZCAnJyBhbmRcbiAgICAgIC8vIHRoZSBmaXJzdCBzdGFnZSdzIG5hbWVzLCB3aGljaCBvbiBhIHJlc3VtZSB3YXMgdGhlIHJlLWVudHJ5IHBvaW50KS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUobmVzdGVkUnVudGltZSwgc2VlZFZhbHVlcywgcGFyZW50Q29udGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBUaGUgbW91bnQncyBvd24gbG9nIG9wZW5lZCBhYm92ZTogYSBzZWVkIHRoYXQgZmFpbHMgY2xvc2VzIGl0LCBuZXZlciBsZWF2ZXMgaXQgbG9va2luZyBjcmFzaGVkLlxuICAgICAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oJ2ZhaWxlZCcpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIFJlZnJlc2ggcm9vdFN0YWdlQ29udGV4dCBzbyBXcml0ZUJ1ZmZlciBzZWVzIGNvbW1pdHRlZCBkYXRhLiBOYW1lZFxuICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IG5vZGUgYWdhaW4g4oCUIHRoZSBzZWVkIGNvbnRleHQgbm93IGNhcnJpZXMgdGhlIG1vdW50J3NcbiAgICAgIC8vIG5hbWVzIChSMTMpLCB3aGljaCBiZWxvbmcgdG8gdGhlIHNlZWQgYnVuZGxlIG9ubHkuIGBuZXdSb290YCBnaXZlcyBpdFxuICAgICAgLy8gdGhlIHNhbWUgcG9saWN5IGFuZCBtaXJyb3IuXG4gICAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLm5ld1Jvb3QoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCk7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBzdWJmbG93IHJvb3Qgbm9kZSDigJQgc3RyaXAgaXNTdWJmbG93Um9vdCB0byBwcmV2ZW50IHJlLWRlbGVnYXRpb24uXG4gICAgLy9cbiAgICAvLyBQUkVTRVJWRSBgbmV4dGAuIEVhcmxpZXIgcmV2aXNpb25zIHN0cmlwcGVkIGBuZXh0YCB3aGVuZXZlciB0aGVcbiAgICAvLyBzdWJmbG93IHJvb3QgaGFkIGNoaWxkcmVuLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGBuZXh0YCB3YXNcbiAgICAvLyBhbHdheXMgdGhlIE9VVEVSIG1vdW50J3MgY29udGludWF0aW9uIGxlYWtpbmcgaW50byB0aGUgaW5uZXJcbiAgICAvLyB0cmVlLiBUaGF0IGFzc3VtcHRpb24gd2FzIHdyb25nOiB0aGUgcmVzb2x2ZWQgc3ViZmxvdyByb290J3NcbiAgICAvLyBgbmV4dGAgaXMgdGhlIElOTkVSIGpvaW4gc3RhZ2UgKGUuZy4sIFBhcmFsbGVsJ3MgTWVyZ2UgYWZ0ZXIgYVxuICAgIC8vIGZhbi1vdXQsIFRvVCdzIFBydW5lcikuIFN0cmlwcGluZyBpdCBicm9rZSBjb21wb3NpdGUgc3ViZmxvd3Mg4oCUXG4gICAgLy8gdGhlIGpvaW4gc3RhZ2UgbmV2ZXIgcmFuLCBzbyB0aGUgc3ViZmxvdyByZXR1cm5lZCBwYXJ0aWFsIHN0YXRlLlxuICAgIC8vXG4gICAgLy8gVGhlIG91dGVyIG1vdW50J3MgcG9zdC1zdWJmbG93IGNvbnRpbnVhdGlvbiBpcyBoYW5kbGVkIHNlcGFyYXRlbHlcbiAgICAvLyBieSB0aGUgcGFyZW50IHRyYXZlcnNlciB2aWEgYHBhcmVudENvbnRleHQubmV4dE5vZGVgIGFuZCBpcyBuZXZlclxuICAgIC8vIGNvbmZsYXRlZCB3aXRoIHRoZSBpbm5lciBzdWJmbG93J3MgYG5leHRgIGNoYWluLlxuICAgIGNvbnN0IHN1YmZsb3dOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIC4uLm5vZGUsXG4gICAgICBpc1N1YmZsb3dSb290OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIEV4ZWN1dGUgdmlhIGZhY3RvcnkgdHJhdmVyc2VyIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBmYWN0b3J5IGNyZWF0ZXMgYSBmdWxsIEZsb3djaGFydFRyYXZlcnNlciB3aXRoIHRoZSBzYW1lIDctcGhhc2UgYWxnb3JpdGhtLFxuICAgIC8vIHNoYXJpbmcgdGhlIHBhcmVudCdzIHN0YWdlTWFwLCBzdWJmbG93cyBkaWN0LCBhbmQgbmFycmF0aXZlIGdlbmVyYXRvci5cbiAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgIC8vIEJveGVkOiBhIHN0YWdlIG1heSB0aHJvdyBBTlkgdmFsdWUsIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgaW5jbHVkZWQg4oCUXG4gICAgLy8gYSBmYWxzeSB0aHJvd24gdmFsdWUgbXVzdCBzdGlsbCBmYWlsIHRoZSBtb3VudC5cbiAgICBsZXQgc3ViZmxvd0Vycm9yOiB7IGVycm9yOiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIC8vIFRoZSBSRUFMIHN1YmZsb3cgZ3JhcGgg4oCUIGV2ZXJ5IGlkIGluc2lkZSB0aGUgc3ViZmxvdyAobG9vcCB0YXJnZXRzLFxuICAgICAgICAvLyBhIHJlLXZpc2l0IG9mIHRoZSBwYXVzZWQgc3RhZ2UpIHJlc29sdmVzIGFnYWluc3QgaXQsIHJlLWVudHJ5IG9yIG5vdC5cbiAgICAgICAgcm9vdDogc3ViZmxvd05vZGUsXG4gICAgICAgIC8vIFdoZXJlIHRoaXMgdHJhdmVyc2FsIHN0YXJ0cyBvbiBhIHJlc3VtZSByZS1lbnRyeTsgdmlzaXRlZCBvbmNlIOKAlFxuICAgICAgICAvLyBhbmQgdGhlIHNpYmxpbmcgcGF1c2VzIGl0IHJhaXNlcyBvbmNlIHRoYXQgZW50cnkncyBjaGFpbiBlbmRzLlxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5lbnRyeSAmJiB7IGVudHJ5OiByZXN1bWVIb3AuZW50cnkgfSksXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiByZXN1bWVIb3AucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogbmVzdGVkUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN1YmZsb3cgcm9vdFxuICAgICAgICAvLyBzdGFnZSdzIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBtb3VudC5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICB9KTtcblxuICAgICAgc3ViZmxvd091dHB1dCA9IGF3YWl0IHRyYXZlcnNlckhhbmRsZS5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gUGF1c2VTaWduYWwgaXMgbm90IGFuIGVycm9yIOKAlCBwcmVwZW5kIHN1YmZsb3cgSUQgYW5kIHJlLXRocm93XG4gICAgICAvLyBpbW1lZGlhdGVseS4gTm8gZXJyb3IgbG9nZ2luZywgbm8gc3ViZmxvd1Jlc3VsdCByZWNvcmRpbmcg4oCUXG4gICAgICAvLyB0aGUgcGF1c2UgaXMgY29udHJvbCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIEJFRk9SRSByZS10aHJvdywgY2FwdHVyZSB0aGUgbmVzdGVkIHJ1bnRpbWUncyBzdGF0ZSBvbnRvIHRoZVxuICAgICAgLy8gc2lnbmFsLiBUaGlzIGlzIHRoZSBvbmx5IGNoYW5jZSDigJQgb25jZSB3ZSByZS10aHJvdywgdGhlIG91dGVyXG4gICAgICAvLyB0cmF2ZXJzZXIgdW53aW5kcyBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGlzIEdDJ2QuIE9uIHJlc3VtZSwgd2UnbGxcbiAgICAgIC8vIHJlLXNlZWQgYSBmcmVzaCBuZXN0ZWQgcnVudGltZSBmcm9tIHRoaXMgY2FwdHVyZSBzbyByZXN1bWUgaGFuZGxlcnNcbiAgICAgIC8vIGNhbiByZWFkIHRoZSBwcmUtcGF1c2Ugc3ViZmxvdyBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgU1RBVEUgb25seSDigJQgdGhlIHN1YmZsb3cncyB3b3JraW5nIG1lbW9yeSBhdCBwYXVzZSB0aW1lIChldmVyeVxuICAgICAgLy8gY29tbWl0dGVkIHdyaXRlIHVwIHRvIHRoZSBwYXVzZSksIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBzdG9yZS4gTm9cbiAgICAgIC8vIHNuYXBzaG90IGlzIGJ1aWx0OiBhIHNuYXBzaG90IHdvdWxkIGFsc28gYnVpbGQgdGhlIHN1YmZsb3cnc1xuICAgICAgLy8gZXhlY3V0aW9uIHRyZWUgYW5kIGNvcHkgaXRzIGNvbW1pdCBsb2cg4oCUIHdvcmsgcHJvcG9ydGlvbmFsIHRvIGhvd1xuICAgICAgLy8gbG9uZyB0aGUgc3ViZmxvdyByYW4g4oCUIHRoYXQgdGhlIGxlYW4gY2hlY2twb2ludCBuZXZlciBjYXJyaWVzXG4gICAgICAvLyAoYHJ1bm5lci9jaGVja3BvaW50LnRzYCkuXG4gICAgICAvL1xuICAgICAgLy8gQ2FwdHVyZSBpcyBrZXllZCBieSB0aGUgU0FNRSBwYXRoLXByZWZpeGVkIGBzdWJmbG93SWRgIHVzZWQgaW5cbiAgICAgIC8vIGBzdWJmbG93UGF0aGAsIHNvIHJlc3VtZSBjYW4gbG9vayB1cCBcInNjb3BlIGZvciBzZi1mb29cIiBieSBpZC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBlcnJvci5jYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZCwgbmVzdGVkUnVudGltZS5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgZXJyb3IucHJlcGVuZFN1YmZsb3coc3ViZmxvd0lkKTtcbiAgICAgICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKCdwYXVzZWQnKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBzdWJmbG93RXJyb3IgPSB7IGVycm9yIH07XG4gICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdzdWJmbG93RXJyb3InLCB0aHJvd25UZXh0KGVycm9yKSk7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvcikgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG1vdW50J3Mgb3duIGxvZyBlbmRlZCDigJQgYmVmb3JlIHRoZSBtZXJnZS1iYWNrLCB3aGljaCBjb21taXRzIG9uIHRoZSBQQVJFTlQncyBsb2cuXG4gICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKHN1YmZsb3dFcnJvciA/ICdmYWlsZWQnIDogJ29rJyk7XG5cbiAgICAvLyBBbHdheXMgbWVyZ2UgbmVzdGVkIHN1YmZsb3cgcmVzdWx0cyAoZXZlbiBvbiBlcnJvciDigJQgcGFydGlhbCByZXN1bHRzIGFpZCBkZWJ1Z2dpbmcpXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhdmVyc2VySGFuZGxlLmdldFN1YmZsb3dSZXN1bHRzKCkpIHtcbiAgICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBCcmVhayBwcm9wYWdhdGlvbiAob3B0LWluIHZpYSBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrKSDilIDilIBcbiAgICAvL1xuICAgIC8vIElmIHRoZSBzdWJmbG93J3MgaW5uZXIgdHJhdmVyc2FsIGJyb2tlIChiZWNhdXNlIGEgc3RhZ2UgY2FsbGVkXG4gICAgLy8gYHNjb3BlLiRicmVhayhyZWFzb24pYCkgQU5EIHRoZSBtb3VudCBkZWNsYXJlZCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLFxuICAgIC8vIGZvcndhcmQgdGhlIGJyZWFrIHN0YXRlIHRvIHRoZSBQQVJFTlQncyBicmVha0ZsYWcuIFRoZSBwYXJlbnRcbiAgICAvLyB0cmF2ZXJzZXIgd2lsbCBzZWUgYHNob3VsZEJyZWFrYCBvbiBpdHMgbmV4dCBzdGVwIGFuZCBzdG9wLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBpbm5lciBicmVha3MgYXJlIGxvY2FsbHkgc2NvcGVkIHRvIHRoZSBzdWJmbG93IOKAlCB0aGVcbiAgICAvLyBwYXJlbnQgY29udGludWVzIGFzIGlmIHRoZSBzdWJmbG93IHJldHVybmVkIG5vcm1hbGx5LlxuICAgIC8vXG4gICAgLy8gSU1QT1JUQU5UOiB0aGlzIHJ1bnMgQkVGT1JFIGBvdXRwdXRNYXBwaW5nYCBiZWxvdywgaW50ZW50aW9uYWxseS4gVGhlXG4gICAgLy8gb3V0cHV0TWFwcGVyIHN0aWxsIGV4ZWN1dGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgcmVzdWx0IHN0aWxsXG4gICAgLy8gbGFuZHMgaW4gdGhlIHBhcmVudCBzY29wZS4gQ29uc3VtZXJzIHdobyBuZWVkIHRvIHN1cHByZXNzIG91dHB1dCBvblxuICAgIC8vIGJyZWFrIGNoZWNrIHRoZSBicmVhayBzdGF0ZSBpbnNpZGUgdGhlaXIgb3V0cHV0TWFwcGVyIGFuZCBlYXJseS1yZXR1cm4uXG4gICAgLy8gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYCBKU0RvYyBmb3IgcmF0aW9uYWxlLlxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUgJiYgbW91bnRPcHRpb25zPy5wcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaW5uZXJCcmVhayA9IHRyYXZlcnNlckhhbmRsZS5nZXRCcmVha1N0YXRlKCk7XG4gICAgICBpZiAoaW5uZXJCcmVhay5zaG91bGRCcmVhaykge1xuICAgICAgICBicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICBpZiAoaW5uZXJCcmVhay5yZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVha0ZsYWcucmVhc29uID0gaW5uZXJCcmVhay5yZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmFpc2UgYSBwYXJlbnQtbGV2ZWwgb25CcmVhayBldmVudCBzbyByZWNvcmRlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAgIC8vIHRoZSBpbm5lciBvcmlnaW5hdGluZyBicmVhayAoZmlyZWQgaW5zaWRlIHRoZSBzdWJmbG93KSBmcm9tIHRoaXNcbiAgICAgICAgLy8gcHJvcGFnYXRlZCBvbmUgKGZpcmVkIGF0IHRoZSBtb3VudCBsZXZlbCBvbiB0aGUgcGFyZW50KS5cbiAgICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKHN1YmZsb3dOYW1lLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBpbm5lckJyZWFrLnJlYXNvbiwgc3ViZmxvd0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93VHJlZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG5cbiAgICAvLyDilIDilIDilIAgT3V0cHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgaWYgKCFzdWJmbG93RXJyb3IgJiYgbW91bnRPcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBtZXJnZS1iYWNrIGlzIHRoZSBNT1VOVCdzIGFjdCwgc28gdGhlIG1vdW50J3MgZnJhbWUgc3RhZ2VzIGFuZFxuICAgICAgICAvLyBjb21taXRzIGl0IOKAlCBpdHMgYnVuZGxlIGNhcnJpZXMgdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgKFIxMykuXG4gICAgICAgIC8vIEEgYnJhbmNoIG9yIGZvcmstY2hpbGQgbW91bnQgc3RpbGwgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHNcbiAgICAgICAgLy8gcGFyZW50IHdyaXRlcyAodGhlIHBhcmVudCdzIHJ1biBuYW1lc3BhY2UpLCBhcyBiZWZvcmU7IHVudGlsIDkuMzMuMFxuICAgICAgICAvLyBpdCBjb21taXR0ZWQgT04gdGhlIHBhcmVudCdzIGZyYW1lLCBzbyB0aGUgYnVuZGxlIG5hbWVkIHRoZSBzdGFnZVxuICAgICAgICAvLyBiZWZvcmUgdGhlIG1vdW50LCBvciB0aGUgYnJhbmNoaW5nIGRlY2lkZXIuXG4gICAgICAgIGNvbnN0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQudXNlQWRkcmVzc09mKHBhcmVudENvbnRleHQucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKFxuICAgICAgICAgIGVmZmVjdGl2ZU91dHB1dCxcbiAgICAgICAgICBwYXJlbnRTY29wZSxcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LFxuICAgICAgICAgIG1vdW50T3B0aW9ucyxcbiAgICAgICAgICByZWRhY3Rpb25SdWxlLFxuICAgICAgICApO1xuXG4gICAgICAgIG91dHB1dENvbnRleHQuY29tbWl0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIEEgbWVyZ2UtYmFjayB0aGF0IGZhaWxlZCB0byBjb21taXQgKGFuIHVuY2xvbmVhYmxlIHZhbHVlKSBsZWF2ZXMgaXRzXG4gICAgICAgIC8vIHdyaXRlcyBzdGFnZWQgb24gdGhlIG1vdW50J3MgZnJhbWU7IHRoZSBtb3VudCdzIGV4aXQgY29tbWl0IGJlbG93XG4gICAgICAgIC8vIHdvdWxkIHRocm93IHRoZW0gYWdhaW4sIG91dHNpZGUgdGhpcyBjYXRjaC4gVGhyb3VnaCA5LjMzLjAgdGhleVxuICAgICAgICAvLyB3ZXJlIHN0YWdlZCBvbiB0aGUgcGFyZW50J3MgZnJhbWUsIHdoaWNoIHdhcyBub3QgY29tbWl0dGVkIGFnYWluLFxuICAgICAgICAvLyBzbyB0aGUgcnVuIHdlbnQgb24g4oCUIGRyb3AgdGhlbSwgYXMgaXQgZGlkLiBBIGxpbmVhciBtb3VudCdzIGZyYW1lXG4gICAgICAgIC8vIGlzIGxlZnQgYXMgaXQgYWx3YXlzIHdhcy5cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHBhcmVudENvbnRleHQuZGlzY2FyZFN0YWdlZCgpO1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdvdXRwdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHtcbiAgICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKHBhcmVudENvbnRleHQsIGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgICAuLi4oc3ViZmxvd1RyZWVDb250ZXh0LnJlYWRTb3VyY2VzICYmIHsgcmVhZFNvdXJjZXM6IHN1YmZsb3dUcmVlQ29udGV4dC5yZWFkU291cmNlcyB9KSxcbiAgICAgICAgLi4uKHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbG9nQWRkcmVzczogc3ViZmxvd1RyZWVDb250ZXh0LmxvZ0FkZHJlc3MgfSksXG4gICAgICAgIC8vIFRoZSBzdWJmbG93J3Mgb3duIGZvbGQgYmFzZSB0cmF2ZWxzIHdpdGggaXRzIG93biBsb2cg4oCUIHNhbWVcbiAgICAgICAgLy8gY29udHJhY3QgYXMgdGhlIHJ1bi1sZXZlbCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAuXG4gICAgICAgIGluaXRpYWxTdGF0ZTogc3ViZmxvd1RyZWVDb250ZXh0LmluaXRpYWxTdGF0ZSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkOiBwYXJlbnRDb250ZXh0LmdldFN0YWdlSWQoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3ViZmxvd0RlZiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF07XG4gICAgaWYgKHN1YmZsb3dEZWYgJiYgKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmUpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHQucGlwZWxpbmVTdHJ1Y3R1cmUgPSAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2VydmVkIHN0YXRlICg5LjIwLjApOiB0aGUgbmVzdGVkIG1pcnJvcidzIGZpbmFsIHN0YXRlLCByZW1lbWJlcmVkXG4gICAgLy8gQkVTSURFIHRoZSByZXN1bHQg4oCUIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBzdGF5cyB0aGUgbGl2ZSBoZWFwIGZvclxuICAgIC8vIHRoZSBwbGFpbiBzbmFwc2hvdCBhbmQgdGhlIGNoZWNrcG9pbnQ7IGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWBcbiAgICAvLyBzdWJzdGl0dXRlcyB0aGUgbWlycm9yIHRocm91Z2ggYHNlcnZlZFN1YmZsb3dSZXN1bHRzYC4gQWJzZW50IHdpdGhvdXRcbiAgICAvLyBhIHBvbGljeS4gVGhlIGV4aXQgZXZlbnQgYmVsb3cgY2FycmllcyB0aGUgc2FtZSBzZXJ2ZWQgdmlldzsgd2l0aG91dCBhXG4gICAgLy8gbWlycm9yIGl0IGNhcnJpZXMgdGhlIGhlYXAgcmV0YWluZWQgdW5kZXIgdGhlIHJ1bGUgKHBlci1jYWxsIG1hcmtzXG4gICAgLy8gYWxvbmUga2VlcCBubyBtaXJyb3IpIOKAlCB0aGUgc2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nIGlzIHJlZGFjdGVkLlxuICAgIGNvbnN0IHJhd1N0YXRlID0gc3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0O1xuICAgIGNvbnN0IG1pcnJvclN0YXRlID0gbmVzdGVkUnVudGltZS5yZWRhY3RlZFN0b3JlPy5nZXRTdGF0ZSgpO1xuICAgIGlmIChtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkKSByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHN1YmZsb3dSZXN1bHQsIG1pcnJvclN0YXRlKTtcbiAgICAvLyBIYW5kZWQgb3V0IHdob2xlLCBzbyBpdCBpcyBhIGJvdW5kYXJ5IHJlY29yZDogbmVzdGVkIHBvbGljeSBrZXlzIGFyZSBzY3J1YmJlZCB0b29cbiAgICAvLyAodGhlIG1pcnJvcidzIG93biBwbGFjZWhvbGRlciwgc28gaXRzIHRvcCBrZXlzIGtlZXAgdGhlaXIgYnl0ZXMpLlxuICAgIGNvbnN0IGV4aXRTdGF0ZSA9ICFyZWRhY3Rpb25SdWxlXG4gICAgICA/IG1pcnJvclN0YXRlID8/IHJhd1N0YXRlXG4gICAgICA6IG1pcnJvclN0YXRlICE9PSB1bmRlZmluZWRcbiAgICAgID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShtaXJyb3JTdGF0ZSwgTE9HX1BMQUNFSE9MREVSKVxuICAgICAgOiByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KHJhd1N0YXRlKTtcblxuICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChzdWJmbG93SWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIC8vIEFkZGl0aXZlIHBlci1leGVjdXRpb24ga2V5IChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpLiBBIExPT1BJTkdcbiAgICAvLyBzdWJmbG93IHJlLWVudGVycyB3aXRoIHRoZSBTQU1FIHN1YmZsb3dJZCwgc28gdGhlIHBhdGgga2V5IGFib3ZlIGlzIE9WRVJXUklUVEVOIGVhY2hcbiAgICAvLyBpdGVyYXRpb24gKGJhY2stY29tcGF0OiBpdCBob2xkcyB0aGUgTEFTVCBpdGVyYXRpb24g4oCUIHdoYXQgZ2V0U3VidHJlZVNuYXBzaG90L2xpc3RTdWJmbG93UGF0aHNcbiAgICAvLyBhbmQgdGhlIGV1aSBmYWxsYmFjayBzZWUsIHVuY2hhbmdlZCkuIEFMU08ga2V5IGJ5IHRoZSBtb3VudCdzIFVOSVFVRSBydW50aW1lU3RhZ2VJZCBzbyBFVkVSWVxuICAgIC8vIGl0ZXJhdGlvbidzIHJlc3VsdCBpcyByZXRhaW5lZCBhbmQgYWRkcmVzc2FibGUgKGV1aSBwZXItbG9vcCBkcmlsbC1kb3duLCBwZXItc2NvcGUgbG9jYWxpemF0aW9uKS5cbiAgICAvLyBydW50aW1lU3RhZ2VJZCBhbHdheXMgY29udGFpbnMgJyMnOyBzdWJmbG93SWQgbmV2ZXIgZG9lcyDigJQgc28gdGhleSBuZXZlciBjb2xsaWRlLCBhbmRcbiAgICAvLyBsaXN0U3ViZmxvd1BhdGhzIGZpbHRlcnMgJyMnIGtleXMgdG8ga2VlcCBpdHMgcGF0aC1vbmx5IGNvbnRyYWN0LiBUaGUgcGF1c2UgY2hlY2twb2ludCBmaWx0ZXJzXG4gICAgLy8gdGhlc2Ugb3V0IChidWlsZFBhdXNlQ2hlY2twb2ludCkgc28gaXQgc3RheXMgbGVhbi5cbiAgICBpZiAobW91bnRSdW50aW1lU3RhZ2VJZCAmJiBtb3VudFJ1bnRpbWVTdGFnZUlkICE9PSBzdWJmbG93SWQpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChtb3VudFJ1bnRpbWVTdGFnZUlkLCBzdWJmbG93UmVzdWx0KTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRXhpdGluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0V4aXQoc3ViZmxvd05hbWUsIHN1YmZsb3dJZCwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgZXhpdFN0YXRlKTtcblxuICAgIC8vIFRoZSBtb3VudCdzIEVYSVQg4oCUIGEgY29udGludWF0aW9uIG9mIHRoZSBtb3VudCdzIGV4ZWN1dGlvbiwgbmFtZWQgYXMgb25lXG4gICAgLy8gb24gdGhlIHJlY29yZCAoOS4zOS4wKSBzbyBubyByZWFkZXIgaW5mZXJzIGl0IGZyb20gdGhlIGxvZydzIHNoYXBlLlxuICAgIGNvbW1pdFN0YWdlV3JpdGVzKHBhcmVudENvbnRleHQsICdleGl0Jyk7XG5cbiAgICBpZiAoc3ViZmxvd0Vycm9yKSB7XG4gICAgICBwYXJlbnRDb250ZXh0LmZhaWx1cmVTdGF0ZS5hZG9wdChuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLCBzdWJmbG93RXJyb3IuZXJyb3IpO1xuICAgICAgdGhyb3cgc3ViZmxvd0Vycm9yLmVycm9yO1xuICAgIH1cblxuICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dC5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcblxuICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICB9XG59XG4iXX0=
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHNUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUE4QjtJQUN2RCxJQUFJLEdBQXdDLENBQUM7SUFDN0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVM7UUFDbkMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDdEIs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Q0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRyxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDM0IsQ0FBQztRQUVELGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdkQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93RXhlY3V0b3Ig4oCUIElzb2xhdGlvbiBib3VuZGFyeSBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGlzb2xhdGVkIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIGVhY2ggc3ViZmxvd1xuICogLSBBcHBseSBpbnB1dC9vdXRwdXQgbWFwcGluZyB2aWEgU3ViZmxvd0lucHV0TWFwcGVyXG4gKiAtIERlbGVnYXRlIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAqIC0gVHJhY2sgc3ViZmxvdyByZXN1bHRzIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICpcbiAqIEVhY2ggc3ViZmxvdyBnZXRzIGl0cyBvd24gR2xvYmFsU3RvcmUgZm9yIGlzb2xhdGlvbi5cbiAqIFRyYXZlcnNhbCB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyXG4gKiAodmlhIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KSwgc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsXG4gKiBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgTE9HX1BMQUNFSE9MREVSIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgY2hpbGRMb2dBZGRyZXNzIH0gZnJvbSAnLi4vLi4vbWVtb3J5L2xvZ0FkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi8uLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBhcHBseU91dHB1dE1hcHBpbmcsIGdldEluaXRpYWxTY29wZVZhbHVlcywgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSB9IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIG1hcHBlZCBpbnB1dCwgZGV0YWNoZWQgZnJvbSB0aGUgcGFyZW50J3Mgc3RhdGUgT05DRSBwZXIgbW91bnQgKEQxLFxuICogOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS5cbiAqXG4gKiBUaGUgaW5wdXRNYXBwZXIgcmVhZHMgdGhlIHBhcmVudCdzIExJVkUgc3RhdGUgKGBnZXRTY29wZSgpYCksIHNvIGEgdmFsdWUgaXRcbiAqIHBhc3NlcyB0aHJvdWdoIChgKHApID0+ICh7IGNmZzogcC5jZmcgfSlgKSBpcyB0aGUgcGFyZW50J3MgY29tbWl0dGVkXG4gKiBvYmplY3Qg4oCUIGFuZCB0aGUgc3ViZmxvdydzIGFyZ3MgYXJlIGRlZXAtRlJPWkVOIGluIHBsYWNlXG4gKiAoYHJlYWRvbmx5SW5wdXQgwrcgY3JlYXRlRnJvemVuQXJnc2ApLiBUaGUgdHlwZWQgc2NvcGUgZG9lcyBub3QgcHJveHkgYVxuICogZnJvemVuIHZhbHVlIChgYWxsb3dsaXN0IMK3IHNob3VsZFdyYXBXaXRoUHJveHlgKSwgc28gYSBsYXRlclxuICogYHNjb3BlLmNmZy54ID0gMWAgaW4gdGhlIHBhcmVudCBtZXQgdGhlIHJhdyBmcm96ZW4gb2JqZWN0OiBhIFR5cGVFcnJvciBpblxuICogc3RyaWN0IGNvZGUuIEJlZm9yZSA5LjI5LjAgdGhlIHBhcmVudCdzIG5leHQgd2hvbGUtc3RhdGUgY2xvbmUgcmVwbGFjZWQgdGhlXG4gKiBmcm96ZW4gb2JqZWN0IChhIG1vdW50IHRoYXQgY29tbWl0dGVkIG5vdGhpbmcgbGVmdCBpdCBpbiBwbGFjZSDigJQgdGhlIGJ1Z1xuICogZXhpc3RlZCwgaXQgd2FzIG9ubHkgc2hvcnQtbGl2ZWQpOyB1bmRlciBjb3B5LW9uLXdyaXRlIG5vdGhpbmcgcmUtY2xvbmVzLFxuICogc28gdGhlIGZyZWV6ZSB3b3VsZCBsYXN0IHVudGlsIHRoZSBrZXkgaXMgcmV3cml0dGVuLiBBIG1vdW50IG11c3QgbmV2ZXJcbiAqIGVkaXQg4oCUIG9yIGZyZWV6ZSDigJQgdGhlIHBhcmVudCdzIGNvbW1pdHRlZCBvYmplY3RzOiBldmVyeSBwbGFpbiBvYmplY3QsXG4gKiBhcnJheSwgYERhdGVgLCBgTWFwYCBhbmQgYFNldGAgdGhlIG1hcHBlciByZXR1cm5zIGlzIGNsb25lZCBoZXJlLCBiZWZvcmUgaXRcbiAqIGJlY29tZXMgdGhlIGFyZ3MuIEEgY2xhc3MgaW5zdGFuY2UgcGFzc2VzIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlIChpdFxuICogY2Fubm90IGNvbWUgZnJvbSBjb21taXR0ZWQgc3RhdGUsIGFuZCBhIGNsb25lIHdvdWxkIGRyb3AgaXRzIHByb3RvdHlwZSkuXG4gKiBUaGUgc2VlZCBpcyBjbG9uZWQgYWdhaW4gYXQgaXRzIGNvbW1pdCwgc28gdGhlIHN1YmZsb3cncyBzdGF0ZSBpc1xuICogdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBkZXRhY2hNYXBwZWRJbnB1dChpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAoIWlzRGV0YWNoYWJsZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIChvdXQgPz89IHsgLi4uaW5wdXQgfSlba2V5XSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBpbnB1dDtcbn1cblxuLyoqIEEgdmFsdWUgYHN0cnVjdHVyZWRDbG9uZWAgcmVwcm9kdWNlcyB3aXRoIGl0cyBvd24gdHlwZTogcGxhaW4gb2JqZWN0LCBhcnJheSwgYERhdGVgLCBgTWFwYCwgYFNldGAuICovXG5mdW5jdGlvbiBpc0RldGFjaGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgU3ViZmxvd0V4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgZGVwcy5yZXN1bWVgKS4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9IGRlcHMucmVzdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3JcbiAgICAvLyBmbGFnIOKAlCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGZyYW1lLCB3aGljaCBob2xkcyBpdCBieSByZWZlcmVuY2UuXG4gICAgLy8gVGhlIG5lc3RlZCBydW50aW1lIGlzIGNvbnN0cnVjdGVkIFdJVEggaXQsIHNvIHRoZSBzZWVkIGNvbW1pdCBiZWxvd1xuICAgIC8vIChgaGlzdG9yeVswXWApIGFuZCBldmVyeSBsYXRlciBjb21taXQgb2YgdGhlIHN1YmZsb3cgcnVuIHVuZGVyIHRoZSBzYW1lXG4gICAgLy8gb2JqZWN0LCBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24gZXhhY3RseSB3aGVuXG4gICAgLy8gdGhlIHJ1biBkb2VzIChpdHMgU0VSVkVEIHN0YXRlIGlzIHRoZW4gdGhlIGZvbGQgb2YgaXRzIG93biBzY3J1YmJlZFxuICAgIC8vIGxvZywgbmV2ZXIgYSBzZWNvbmQgc2NydWIpLlxuICAgIGNvbnN0IHBvbGljeTogUnVuUG9saWN5ID0gcGFyZW50Q29udGV4dC5nZXRQb2xpY3koKTtcbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcG9saWN5LnJlZGFjdGlvbjtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBUaGUgcnVsZSByaWRlcyBhbG9uZzogYSBrZXkgdGhlIG1hcHBlciBjb3BpZXMgYSBzZWxlY3RlZCB2YWx1ZSBpbnRvXG4gICAgICAgIC8vIGluaGVyaXRzIGl0cyByZWRhY3Rpb24gYmVmb3JlIHRoZSBzZWVkIGlzIHdyaXR0ZW4gKHRoZSB0YWludCBydWxlKS5cbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucywgcmVkYWN0aW9uUnVsZSkpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBpbnB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBkZWZhdWx0VmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeTogUnVuUG9saWN5LFxuICAgICAgcmVjb3JkPzogdW5rbm93bixcbiAgICAgIHNvdXJjZT86IHtcbiAgICAgICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgYWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gICAgICAgIHJlYWRvbmx5IHVuYXZhaWxhYmxlPzogJ2NoaWxkLXNvdXJjZS1vd25lcnNoaXAnO1xuICAgICAgICByZWFkb25seSBoaXN0b3J5T21pdHRlZD86IGJvb2xlYW47XG4gICAgICB9LFxuICAgICkgPT4gSUV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgZmlyc3ROb2RlID0gcmVzdW1lSG9wPy5lbnRyeSA/PyBub2RlO1xuICAgIC8vIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSwgUDYpOiB3aGVuIHRoZSBydW4gd3JpdGVzIHRvIGEgc2luaywgdGhlIG1vdW50J3Mgb3duIGxvZyBkb2VzIHRvbywgYXQgdGhlXG4gICAgLy8gcGFyZW50IGxvZydzIGFkZHJlc3MgcGx1cyB0aGlzIG1vdW50J3MgcnVudGltZVN0YWdlSWQg4oCUIG9wZW5lZCBoZXJlLCBpdHMgc2VlZCBhbmQgZXZlcnkgY29tbWl0IGFzIHRoZXkgbGFuZCxcbiAgICAvLyBjbG9zZWQgYXQgdGhlIG1vdW50J3MgZXhpdCAob3IgaXRzIHBhdXNlLCBvciBpdHMgZmFpbHVyZSkuIFdpdGhvdXQgYSBzaW5rOiB1bmRlZmluZWQsIHRoZSBwbGFpbiBsb2cuXG4gICAgY29uc3QgbW91bnRSdW50aW1lU3RhZ2VJZCA9IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHBhcmVudExvZ0FkZHJlc3MgPSB0aGlzLmRlcHMuZXhlY3V0aW9uUnVudGltZS5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3M7XG4gICAgLy8gSWRlbnRpdHkgZm9sbG93cyB0aGUgc2FtZSBuYXRpdmUgbG9nIGFkZHJlc3MgYXMgc3RvcmFnZSwgZXZlbiBmb3IgYW4gaW4tbWVtb3J5IGNoaWxkLlxuICAgIC8vIEEgbWlzc2luZyBuYXRpdmUgcGFyZW50L21vdW50IGlkZW50aXR5IGNhbm5vdCBiZSByZXBsYWNlZCB3aXRoIGEgcGF0aC9uYW1lIGd1ZXNzLlxuICAgIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSBwb2xpY3kucmVhZFNvdXJjZXMgPyBjaGlsZExvZ0FkZHJlc3MocGFyZW50TG9nQWRkcmVzcywgbW91bnRSdW50aW1lU3RhZ2VJZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkID1cbiAgICAgIG1vdW50UnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLnJlY29yZEZvcj8uKG1vdW50UnVudGltZVN0YWdlSWQsIHsgc3ViZmxvd0lkIH0pO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKFxuICAgICAgZmlyc3ROb2RlLm5hbWUsXG4gICAgICBmaXJzdE5vZGUuaWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBwb2xpY3ksXG4gICAgICByZWNvcmQsXG4gICAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW5JZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJ1bklkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LnJ1bklkLFxuICAgICAgICAgICAgLi4uKHNvdXJjZUFkZHJlc3MgPyB7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSA6IHsgdW5hdmFpbGFibGU6ICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyBhcyBjb25zdCB9KSxcbiAgICAgICAgICAgIC4uLihpc1Jlc3VtZUZvclRoaXNTdWJmbG93ICYmIHsgaGlzdG9yeU9taXR0ZWQ6IHRydWUgfSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICApO1xuXG4gICAgLy8gU2VlZCBHbG9iYWxTdG9yZSB3aXRoIHRoZSByaWdodCBzaGFwZSBmb3IgdGhlIHBhdGg6XG4gICAgLy8gICDigKIgUmVzdW1lIGludG8gVEhJUyBzdWJmbG93IOKGkiBzZWVkIGZyb20gdGhlIGNhcHR1cmVkIHByZS1wYXVzZVxuICAgIC8vICAgICBzY29wZSBzbyByZXN1bWUgaGFuZGxlcnMgc2VlIGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy5cbiAgICAvLyAgICAgKGBtYXBwZWRJbnB1dGAgc3RpbGwgcmVhY2hlcyB0aGUgc3RhZ2VzLCBhcyB0aGVpciByZWFkLW9ubHkgYXJncy4pXG4gICAgLy8gICDigKIgTm9ybWFsIGVudHJ5IOKGkiBzZWVkIGZyb20gdGhlIGlucHV0TWFwcGVyJ3MgbWFwcGVkSW5wdXQuXG4gICAgY29uc3Qgc2VlZFZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID8gcmVzdW1lQ2FwdHVyZSEgOiBtYXBwZWRJbnB1dDtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VlZFZhbHVlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIHNlZWQgaXMgY29tbWl0dGVkIGFzIHRoZSBzdWJmbG93J3MgYGhpc3RvcnlbMF1gIGJ5IGl0cyByb290XG4gICAgICAvLyBjb250ZXh0LCBub3QgYnkgYSBmYWNhZGUg4oCUIHRoYXQgZnJhbWUgYWxyZWFkeSBob2xkcyB0aGUgcnVuJ3MgcG9saWN5XG4gICAgICAvLyAodGhlIHJ1bnRpbWUgd2FzIGNvbnN0cnVjdGVkIHdpdGggaXQpLCBzbyB0aGUgc2VlZCByZXRhaW5zIHVuZGVyIHRoZVxuICAgICAgLy8gcnVsZSwgbGFuZHMgaW4gdGhlIG1pcnJvciBhcyB0aGUgcGxhY2Vob2xkZXIsIGFuZCBjb21taXRzIHVuZGVyIHRoZVxuICAgICAgLy8gcnVuJ3MgZGlhbHMgbGlrZSBldmVyeSBvdGhlciB3cml0ZSAoQy1GNTogdW5kZXIgYHdyaXRlUHJvdmVuYW5jZTpcbiAgICAgIC8vICdyZWFkcy1wcmVmaXgnYCBpdHMgcm93cyBjYXJyeSBgcmVhZEtleXM6IFtdYCkuXG4gICAgICAvLyBUaGUgc2VlZCBpcyB0aGUgbW91bnQncyBhY3QgdG9vOiBpdHMgYnVuZGxlIOKAlCBgaGlzdG9yeVswXWAgb2YgdGhlXG4gICAgICAvLyBzdWJmbG93J3Mgb3duIGxvZyDigJQgY2FycmllcyB0aGUgbW91bnQncyBzdGFnZSwgc3RhZ2VJZCBhbmRcbiAgICAgIC8vIHJ1bnRpbWVTdGFnZUlkIChSMTM7IHRocm91Z2ggOS4zMy4wIGl0IGNhcnJpZWQgcnVudGltZVN0YWdlSWQgJycgYW5kXG4gICAgICAvLyB0aGUgZmlyc3Qgc3RhZ2UncyBuYW1lcywgd2hpY2ggb24gYSByZXN1bWUgd2FzIHRoZSByZS1lbnRyeSBwb2ludCkuXG4gICAgICB0cnkge1xuICAgICAgICBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlKG5lc3RlZFJ1bnRpbWUsIHNlZWRWYWx1ZXMsIHBhcmVudENvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gVGhlIG1vdW50J3Mgb3duIGxvZyBvcGVuZWQgYWJvdmU6IGEgc2VlZCB0aGF0IGZhaWxzIGNsb3NlcyBpdCwgbmV2ZXIgbGVhdmVzIGl0IGxvb2tpbmcgY3Jhc2hlZC5cbiAgICAgICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKCdmYWlsZWQnKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICAvLyBSZWZyZXNoIHJvb3RTdGFnZUNvbnRleHQgc28gV3JpdGVCdWZmZXIgc2VlcyBjb21taXR0ZWQgZGF0YS4gTmFtZWRcbiAgICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBub2RlIGFnYWluIOKAlCB0aGUgc2VlZCBjb250ZXh0IG5vdyBjYXJyaWVzIHRoZSBtb3VudCdzXG4gICAgICAvLyBuYW1lcyAoUjEzKSwgd2hpY2ggYmVsb25nIHRvIHRoZSBzZWVkIGJ1bmRsZSBvbmx5LiBgbmV3Um9vdGAgZ2l2ZXMgaXRcbiAgICAgIC8vIHRoZSBzYW1lIHBvbGljeSBhbmQgbWlycm9yLlxuICAgICAgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbmVzdGVkUnVudGltZS5uZXdSb290KGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQpO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgc3ViZmxvdyByb290IG5vZGUg4oCUIHN0cmlwIGlzU3ViZmxvd1Jvb3QgdG8gcHJldmVudCByZS1kZWxlZ2F0aW9uLlxuICAgIC8vXG4gICAgLy8gUFJFU0VSVkUgYG5leHRgLiBFYXJsaWVyIHJldmlzaW9ucyBzdHJpcHBlZCBgbmV4dGAgd2hlbmV2ZXIgdGhlXG4gICAgLy8gc3ViZmxvdyByb290IGhhZCBjaGlsZHJlbiwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBgbmV4dGAgd2FzXG4gICAgLy8gYWx3YXlzIHRoZSBPVVRFUiBtb3VudCdzIGNvbnRpbnVhdGlvbiBsZWFraW5nIGludG8gdGhlIGlubmVyXG4gICAgLy8gdHJlZS4gVGhhdCBhc3N1bXB0aW9uIHdhcyB3cm9uZzogdGhlIHJlc29sdmVkIHN1YmZsb3cgcm9vdCdzXG4gICAgLy8gYG5leHRgIGlzIHRoZSBJTk5FUiBqb2luIHN0YWdlIChlLmcuLCBQYXJhbGxlbCdzIE1lcmdlIGFmdGVyIGFcbiAgICAvLyBmYW4tb3V0LCBUb1QncyBQcnVuZXIpLiBTdHJpcHBpbmcgaXQgYnJva2UgY29tcG9zaXRlIHN1YmZsb3dzIOKAlFxuICAgIC8vIHRoZSBqb2luIHN0YWdlIG5ldmVyIHJhbiwgc28gdGhlIHN1YmZsb3cgcmV0dXJuZWQgcGFydGlhbCBzdGF0ZS5cbiAgICAvL1xuICAgIC8vIFRoZSBvdXRlciBtb3VudCdzIHBvc3Qtc3ViZmxvdyBjb250aW51YXRpb24gaXMgaGFuZGxlZCBzZXBhcmF0ZWx5XG4gICAgLy8gYnkgdGhlIHBhcmVudCB0cmF2ZXJzZXIgdmlhIGBwYXJlbnRDb250ZXh0Lm5leHROb2RlYCBhbmQgaXMgbmV2ZXJcbiAgICAvLyBjb25mbGF0ZWQgd2l0aCB0aGUgaW5uZXIgc3ViZmxvdydzIGBuZXh0YCBjaGFpbi5cbiAgICBjb25zdCBzdWJmbG93Tm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICAuLi5ub2RlLFxuICAgICAgaXNTdWJmbG93Um9vdDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIOKUgOKUgOKUgCBFeGVjdXRlIHZpYSBmYWN0b3J5IHRyYXZlcnNlciDilIDilIDilIBcbiAgICAvLyBUaGUgZmFjdG9yeSBjcmVhdGVzIGEgZnVsbCBGbG93Y2hhcnRUcmF2ZXJzZXIgd2l0aCB0aGUgc2FtZSA3LXBoYXNlIGFsZ29yaXRobSxcbiAgICAvLyBzaGFyaW5nIHRoZSBwYXJlbnQncyBzdGFnZU1hcCwgc3ViZmxvd3MgZGljdCwgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0b3IuXG4gICAgbGV0IHN1YmZsb3dPdXRwdXQ6IGFueTtcbiAgICAvLyBCb3hlZDogYSBzdGFnZSBtYXkgdGhyb3cgQU5ZIHZhbHVlLCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGluY2x1ZGVkIOKAlFxuICAgIC8vIGEgZmFsc3kgdGhyb3duIHZhbHVlIG11c3Qgc3RpbGwgZmFpbCB0aGUgbW91bnQuXG4gICAgbGV0IHN1YmZsb3dFcnJvcjogeyBlcnJvcjogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCB0cmF2ZXJzZXJIYW5kbGU6IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICB0cmF2ZXJzZXJIYW5kbGUgPSB0aGlzLnRyYXZlcnNlckZhY3Rvcnkoe1xuICAgICAgICAvLyBUaGUgUkVBTCBzdWJmbG93IGdyYXBoIOKAlCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgKGxvb3AgdGFyZ2V0cyxcbiAgICAgICAgLy8gYSByZS12aXNpdCBvZiB0aGUgcGF1c2VkIHN0YWdlKSByZXNvbHZlcyBhZ2FpbnN0IGl0LCByZS1lbnRyeSBvciBub3QuXG4gICAgICAgIHJvb3Q6IHN1YmZsb3dOb2RlLFxuICAgICAgICAvLyBXaGVyZSB0aGlzIHRyYXZlcnNhbCBzdGFydHMgb24gYSByZXN1bWUgcmUtZW50cnk7IHZpc2l0ZWQgb25jZSDigJRcbiAgICAgICAgLy8gYW5kIHRoZSBzaWJsaW5nIHBhdXNlcyBpdCByYWlzZXMgb25jZSB0aGF0IGVudHJ5J3MgY2hhaW4gZW5kcy5cbiAgICAgICAgLi4uKHJlc3VtZUhvcD8uZW50cnkgJiYgeyBlbnRyeTogcmVzdW1lSG9wLmVudHJ5IH0pLFxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogcmVzdW1lSG9wLnBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IG5lc3RlZFJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogbWFwcGVkSW5wdXQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgLy8gUkZDLTAwMyBEMTogdGhlIG1vdW50IHN0YWdlJ3MgcnVudGltZVN0YWdlSWQg4oCUIHRoZSBzdWJmbG93IHJvb3RcbiAgICAgICAgLy8gc3RhZ2UncyBgcGFyZW50UnVudGltZVN0YWdlSWRgIHNvIGFuY2VzdG9yIGNoYWlucyBjcm9zcyB0aGUgbW91bnQuXG4gICAgICAgIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ6IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgfSk7XG5cbiAgICAgIHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0cmF2ZXJzZXJIYW5kbGUuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIG5vdCBhbiBlcnJvciDigJQgcHJlcGVuZCBzdWJmbG93IElEIGFuZCByZS10aHJvd1xuICAgICAgLy8gaW1tZWRpYXRlbHkuIE5vIGVycm9yIGxvZ2dpbmcsIG5vIHN1YmZsb3dSZXN1bHQgcmVjb3JkaW5nIOKAlFxuICAgICAgLy8gdGhlIHBhdXNlIGlzIGNvbnRyb2wgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBCRUZPUkUgcmUtdGhyb3csIGNhcHR1cmUgdGhlIG5lc3RlZCBydW50aW1lJ3Mgc3RhdGUgb250byB0aGVcbiAgICAgIC8vIHNpZ25hbC4gVGhpcyBpcyB0aGUgb25seSBjaGFuY2Ug4oCUIG9uY2Ugd2UgcmUtdGhyb3csIHRoZSBvdXRlclxuICAgICAgLy8gdHJhdmVyc2VyIHVud2luZHMgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBpcyBHQydkLiBPbiByZXN1bWUsIHdlJ2xsXG4gICAgICAvLyByZS1zZWVkIGEgZnJlc2ggbmVzdGVkIHJ1bnRpbWUgZnJvbSB0aGlzIGNhcHR1cmUgc28gcmVzdW1lIGhhbmRsZXJzXG4gICAgICAvLyBjYW4gcmVhZCB0aGUgcHJlLXBhdXNlIHN1YmZsb3cgc2NvcGUuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIFNUQVRFIG9ubHkg4oCUIHRoZSBzdWJmbG93J3Mgd29ya2luZyBtZW1vcnkgYXQgcGF1c2UgdGltZSAoZXZlcnlcbiAgICAgIC8vIGNvbW1pdHRlZCB3cml0ZSB1cCB0byB0aGUgcGF1c2UpLCByZWFkIHN0cmFpZ2h0IG9mZiBpdHMgc3RvcmUuIE5vXG4gICAgICAvLyBzbmFwc2hvdCBpcyBidWlsdDogYSBzbmFwc2hvdCB3b3VsZCBhbHNvIGJ1aWxkIHRoZSBzdWJmbG93J3NcbiAgICAgIC8vIGV4ZWN1dGlvbiB0cmVlIGFuZCBjb3B5IGl0cyBjb21taXQgbG9nIOKAlCB3b3JrIHByb3BvcnRpb25hbCB0byBob3dcbiAgICAgIC8vIGxvbmcgdGhlIHN1YmZsb3cgcmFuIOKAlCB0aGF0IHRoZSBsZWFuIGNoZWNrcG9pbnQgbmV2ZXIgY2Fycmllc1xuICAgICAgLy8gKGBydW5uZXIvY2hlY2twb2ludC50c2ApLlxuICAgICAgLy9cbiAgICAgIC8vIENhcHR1cmUgaXMga2V5ZWQgYnkgdGhlIFNBTUUgcGF0aC1wcmVmaXhlZCBgc3ViZmxvd0lkYCB1c2VkIGluXG4gICAgICAvLyBgc3ViZmxvd1BhdGhgLCBzbyByZXN1bWUgY2FuIGxvb2sgdXAgXCJzY29wZSBmb3Igc2YtZm9vXCIgYnkgaWQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3IuY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQsIG5lc3RlZFJ1bnRpbWUuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgIGVycm9yLnByZXBlbmRTdWJmbG93KHN1YmZsb3dJZCk7XG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LigncGF1c2VkJyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgc3ViZmxvd0Vycm9yID0geyBlcnJvciB9O1xuICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignc3ViZmxvd0Vycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSBtb3VudCdzIG93biBsb2cgZW5kZWQg4oCUIGJlZm9yZSB0aGUgbWVyZ2UtYmFjaywgd2hpY2ggY29tbWl0cyBvbiB0aGUgUEFSRU5UJ3MgbG9nLlxuICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LihzdWJmbG93RXJyb3IgPyAnZmFpbGVkJyA6ICdvaycpO1xuXG4gICAgLy8gQWx3YXlzIG1lcmdlIG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGV2ZW4gb24gZXJyb3Ig4oCUIHBhcnRpYWwgcmVzdWx0cyBhaWQgZGVidWdnaW5nKVxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYXZlcnNlckhhbmRsZS5nZXRTdWJmbG93UmVzdWx0cygpKSB7XG4gICAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgQnJlYWsgcHJvcGFnYXRpb24gKG9wdC1pbiB2aWEgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVhaykg4pSA4pSAXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgc3ViZmxvdydzIGlubmVyIHRyYXZlcnNhbCBicm9rZSAoYmVjYXVzZSBhIHN0YWdlIGNhbGxlZFxuICAgIC8vIGBzY29wZS4kYnJlYWsocmVhc29uKWApIEFORCB0aGUgbW91bnQgZGVjbGFyZWQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCxcbiAgICAvLyBmb3J3YXJkIHRoZSBicmVhayBzdGF0ZSB0byB0aGUgUEFSRU5UJ3MgYnJlYWtGbGFnLiBUaGUgcGFyZW50XG4gICAgLy8gdHJhdmVyc2VyIHdpbGwgc2VlIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgc3RvcC5cbiAgICAvL1xuICAgIC8vIFdpdGhvdXQgdGhpcywgaW5uZXIgYnJlYWtzIGFyZSBsb2NhbGx5IHNjb3BlZCB0byB0aGUgc3ViZmxvdyDigJQgdGhlXG4gICAgLy8gcGFyZW50IGNvbnRpbnVlcyBhcyBpZiB0aGUgc3ViZmxvdyByZXR1cm5lZCBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vIElNUE9SVEFOVDogdGhpcyBydW5zIEJFRk9SRSBgb3V0cHV0TWFwcGluZ2AgYmVsb3csIGludGVudGlvbmFsbHkuIFRoZVxuICAgIC8vIG91dHB1dE1hcHBlciBzdGlsbCBleGVjdXRlcywgc28gdGhlIHN1YmZsb3cncyBwYXJ0aWFsIHJlc3VsdCBzdGlsbFxuICAgIC8vIGxhbmRzIGluIHRoZSBwYXJlbnQgc2NvcGUuIENvbnN1bWVycyB3aG8gbmVlZCB0byBzdXBwcmVzcyBvdXRwdXQgb25cbiAgICAvLyBicmVhayBjaGVjayB0aGUgYnJlYWsgc3RhdGUgaW5zaWRlIHRoZWlyIG91dHB1dE1hcHBlciBhbmQgZWFybHktcmV0dXJuLlxuICAgIC8vIFNlZSBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2AgSlNEb2MgZm9yIHJhdGlvbmFsZS5cbiAgICBpZiAodHJhdmVyc2VySGFuZGxlICYmIG1vdW50T3B0aW9ucz8ucHJvcGFnYXRlQnJlYWsgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGlubmVyQnJlYWsgPSB0cmF2ZXJzZXJIYW5kbGUuZ2V0QnJlYWtTdGF0ZSgpO1xuICAgICAgaWYgKGlubmVyQnJlYWsuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlubmVyQnJlYWsucmVhc29uICE9PSB1bmRlZmluZWQgJiYgYnJlYWtGbGFnLnJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWtGbGFnLnJlYXNvbiA9IGlubmVyQnJlYWsucmVhc29uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhaXNlIGEgcGFyZW50LWxldmVsIG9uQnJlYWsgZXZlbnQgc28gcmVjb3JkZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgICAvLyB0aGUgaW5uZXIgb3JpZ2luYXRpbmcgYnJlYWsgKGZpcmVkIGluc2lkZSB0aGUgc3ViZmxvdykgZnJvbSB0aGlzXG4gICAgICAgIC8vIHByb3BhZ2F0ZWQgb25lIChmaXJlZCBhdCB0aGUgbW91bnQgbGV2ZWwgb24gdGhlIHBhcmVudCkuXG4gICAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhzdWJmbG93TmFtZSwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgaW5uZXJCcmVhay5yZWFzb24sIHN1YmZsb3dJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1RyZWVDb250ZXh0ID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuXG4gICAgLy8g4pSA4pSA4pSAIE91dHB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIGlmICghc3ViZmxvd0Vycm9yICYmIG1vdW50T3B0aW9ucz8ub3V0cHV0TWFwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgbWVyZ2UtYmFjayBpcyB0aGUgTU9VTlQncyBhY3QsIHNvIHRoZSBtb3VudCdzIGZyYW1lIHN0YWdlcyBhbmRcbiAgICAgICAgLy8gY29tbWl0cyBpdCDigJQgaXRzIGJ1bmRsZSBjYXJyaWVzIHRoZSBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIChSMTMpLlxuICAgICAgICAvLyBBIGJyYW5jaCBvciBmb3JrLWNoaWxkIG1vdW50IHN0aWxsIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzXG4gICAgICAgIC8vIHBhcmVudCB3cml0ZXMgKHRoZSBwYXJlbnQncyBydW4gbmFtZXNwYWNlKSwgYXMgYmVmb3JlOyB1bnRpbCA5LjMzLjBcbiAgICAgICAgLy8gaXQgY29tbWl0dGVkIE9OIHRoZSBwYXJlbnQncyBmcmFtZSwgc28gdGhlIGJ1bmRsZSBuYW1lZCB0aGUgc3RhZ2VcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBtb3VudCwgb3IgdGhlIGJyYW5jaGluZyBkZWNpZGVyLlxuICAgICAgICBjb25zdCBvdXRwdXRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHtcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LnVzZUFkZHJlc3NPZihwYXJlbnRDb250ZXh0LnBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IG91dHB1dENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gRm9yIFR5cGVkU2NvcGUgc3ViZmxvd3MsIHN0YWdlIGZ1bmN0aW9ucyByZXR1cm4gdm9pZCDigJQgZmFsbCBiYWNrIHRvIGEgc2hhbGxvdyBjbG9uZVxuICAgICAgICAvLyBvZiB0aGUgc3ViZmxvdydzIHNoYXJlZCBzdGF0ZSBzbyBvdXRwdXRNYXBwZXIgY2FuIGFjY2VzcyBhbGwgc2NvcGUgdmFsdWVzIHdyaXR0ZW5cbiAgICAgICAgLy8gZHVyaW5nIHRoZSBzdWJmbG93LiBXZSBzaGFsbG93LWNsb25lIHRvIGF2b2lkIGFsaWFzaW5nIHRoZSBsaXZlIFNoYXJlZE1lbW9yeSBjb250ZXh0LlxuICAgICAgICAvLyBOT1RFOiB0aGUgZnVsbCBzY29wZSBpcyBwYXNzZWQgKG5vdCBqdXN0IGRlY2xhcmVkIG91dHB1dHMpIOKAlCBvdXRwdXRNYXBwZXIgbXVzdFxuICAgICAgICAvLyBleHBsaWNpdGx5IHNlbGVjdCB3aGF0IHRvIHByb3BhZ2F0ZSB0byB0aGUgcGFyZW50LlxuICAgICAgICAvLyBSZWRhY3Rpb246IGBhcHBseU91dHB1dE1hcHBpbmdgIHdyaXRlcyB0aHJvdWdoIGBvdXRwdXRDb250ZXh0YCAoYVxuICAgICAgICAvLyBTdGFnZUNvbnRleHQsIG5vdCBhIGZhY2FkZSkuIFRoZSBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGFza3MgdGhlXG4gICAgICAgIC8vIHJ1bidzIHJlZGFjdGlvbiBydWxlIOKAlCBzaGFyZWQgd2l0aCB0aGUgc3ViZmxvdydzIGNvbnRleHRzLCBzbyBhIGtleVxuICAgICAgICAvLyB0aGUgcG9saWN5IG5hbWVzIE9SIGEga2V5IG1hcmtlZCBwZXItY2FsbCBpbnNpZGUgdGhlIHN1YmZsb3cgaXNcbiAgICAgICAgLy8gc2NydWJiZWQgaW4gdGhlIFBBUkVOVCdzIGxvZyBhbmQgbWlycm9yIHRvbyAoOS4xOS4wOyBiZWZvcmUsIHRoaXNcbiAgICAgICAgLy8gbWVyZ2UtYmFjayByZXRhaW5lZCBwbGFpbnRleHQpLlxuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXQgPSBzdWJmbG93T3V0cHV0ID8/IHsgLi4uc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlIH07XG4gICAgICAgIGNvbnN0IG1hcHBlZE91dHB1dCA9IGFwcGx5T3V0cHV0TWFwcGluZyhcbiAgICAgICAgICBlZmZlY3RpdmVPdXRwdXQsXG4gICAgICAgICAgcGFyZW50U2NvcGUsXG4gICAgICAgICAgb3V0cHV0Q29udGV4dCxcbiAgICAgICAgICBtb3VudE9wdGlvbnMsXG4gICAgICAgICAgcmVkYWN0aW9uUnVsZSxcbiAgICAgICAgKTtcblxuICAgICAgICBvdXRwdXRDb250ZXh0LmNvbW1pdCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBBIG1lcmdlLWJhY2sgdGhhdCBmYWlsZWQgdG8gY29tbWl0IChhbiB1bmNsb25lYWJsZSB2YWx1ZSkgbGVhdmVzIGl0c1xuICAgICAgICAvLyB3cml0ZXMgc3RhZ2VkIG9uIHRoZSBtb3VudCdzIGZyYW1lOyB0aGUgbW91bnQncyBleGl0IGNvbW1pdCBiZWxvd1xuICAgICAgICAvLyB3b3VsZCB0aHJvdyB0aGVtIGFnYWluLCBvdXRzaWRlIHRoaXMgY2F0Y2guIFRocm91Z2ggOS4zMy4wIHRoZXlcbiAgICAgICAgLy8gd2VyZSBzdGFnZWQgb24gdGhlIHBhcmVudCdzIGZyYW1lLCB3aGljaCB3YXMgbm90IGNvbW1pdHRlZCBhZ2FpbixcbiAgICAgICAgLy8gc28gdGhlIHJ1biB3ZW50IG9uIOKAlCBkcm9wIHRoZW0sIGFzIGl0IGRpZC4gQSBsaW5lYXIgbW91bnQncyBmcmFtZVxuICAgICAgICAvLyBpcyBsZWZ0IGFzIGl0IGFsd2F5cyB3YXMuXG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSBwYXJlbnRDb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignb3V0cHV0TWFwcGVyRXJyb3InLCB0aHJvd25UZXh0KGVycm9yKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIG91dHB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dSZXN1bHQ6IFN1YmZsb3dSZXN1bHQgPSB7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogc3ViZmxvd1RyZWVDb250ZXh0LmV4ZWN1dGlvblRyZWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogc3ViZmxvd1RyZWVDb250ZXh0LmNvbW1pdExvZyxcbiAgICAgICAgLi4uKHN1YmZsb3dUcmVlQ29udGV4dC5yZWFkU291cmNlcyAmJiB7IHJlYWRTb3VyY2VzOiBzdWJmbG93VHJlZUNvbnRleHQucmVhZFNvdXJjZXMgfSksXG4gICAgICAgIC4uLihzdWJmbG93VHJlZUNvbnRleHQubG9nQWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzIH0pLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgLy8gSGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgYSBib3VuZGFyeSByZWNvcmQ6IG5lc3RlZCBwb2xpY3kga2V5cyBhcmUgc2NydWJiZWQgdG9vXG4gICAgLy8gKHRoZSBtaXJyb3IncyBvd24gcGxhY2Vob2xkZXIsIHNvIGl0cyB0b3Aga2V5cyBrZWVwIHRoZWlyIGJ5dGVzKS5cbiAgICBjb25zdCBleGl0U3RhdGUgPSAhcmVkYWN0aW9uUnVsZVxuICAgICAgPyBtaXJyb3JTdGF0ZSA/PyByYXdTdGF0ZVxuICAgICAgOiBtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkobWlycm9yU3RhdGUsIExPR19QTEFDRUhPTERFUilcbiAgICAgIDogcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShyYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICAvLyBUaGUgbW91bnQncyBFWElUIOKAlCBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgbW91bnQncyBleGVjdXRpb24sIG5hbWVkIGFzIG9uZVxuICAgIC8vIG9uIHRoZSByZWNvcmQgKDkuMzkuMCkgc28gbm8gcmVhZGVyIGluZmVycyBpdCBmcm9tIHRoZSBsb2cncyBzaGFwZS5cbiAgICBjb21taXRTdGFnZVdyaXRlcyhwYXJlbnRDb250ZXh0LCAnZXhpdCcpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgcGFyZW50Q29udGV4dC5mYWlsdXJlU3RhdGUuYWRvcHQobmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSwgc3ViZmxvd0Vycm9yLmVycm9yKTtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvci5lcnJvcjtcbiAgICB9XG5cbiAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
@@ -17,6 +17,7 @@
17
17
  * key and the `#n` twin of one mount point at ONE raw result and are served
18
18
  * as ONE substituted result.
19
19
  */
20
+ import { redactReadSources } from '../../capture/readSources.js';
20
21
  /** The nested mirror's final state, keyed by the raw result it belongs to. */
21
22
  const redactedStates = new WeakMap();
22
23
  /** Remember the served (mirror) state of a subflow result. Absent without a policy. */
@@ -39,12 +40,22 @@ export function servedSubflowResults(results, redact) {
39
40
  let entry = servedByRaw.get(result);
40
41
  if (entry === undefined) {
41
42
  const mirror = redactedStates.get(result);
43
+ const sources = result.treeContext.readSources;
42
44
  entry =
43
- mirror === undefined ? result : { ...result, treeContext: { ...result.treeContext, globalContext: mirror } };
45
+ mirror === undefined && sources === undefined
46
+ ? result
47
+ : {
48
+ ...result,
49
+ treeContext: {
50
+ ...result.treeContext,
51
+ ...(mirror !== undefined && { globalContext: mirror }),
52
+ ...(sources && { readSources: redactReadSources(sources) }),
53
+ },
54
+ };
44
55
  servedByRaw.set(result, entry);
45
56
  }
46
57
  served[key] = entry;
47
58
  }
48
59
  return served;
49
60
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkU3ViZmxvd1Jlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBSUgsOEVBQThFO0FBQzlFLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxFQUEwQyxDQUFDO0FBRTdFLHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsNEJBQTRCLENBQUMsTUFBcUIsRUFBRSxLQUE4QjtJQUNoRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQyxFQUMzQyxNQUFlO0lBRWYsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztJQUNqRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLEtBQUs7Z0JBQ0gsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMvRyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2VydmVkU3ViZmxvd1Jlc3VsdHMg4oCUIHRoZSBPTkUgcGxhY2UgdGhhdCBkZWNpZGVzIHdoaWNoIHN0YXRlIGEgc3ViZmxvdydzXG4gKiByZXN1bHQgc2VydmVzIHVuZGVyIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgKDkuMjAuMCkuXG4gKlxuICogQSBgU3ViZmxvd1Jlc3VsdGAgaXMgYnVpbHQgb25jZSBieSBgU3ViZmxvd0V4ZWN1dG9yYCB3aXRoIHRoZSBzdWJmbG93J3MgcmF3XG4gKiBoZWFwIGFzIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCDigJQgdGhlIGxpdmUgdmlldyB0aGUgcGxhaW4gc25hcHNob3RcbiAqIGtlZXBzICh0aGUgcGF1c2UgY2hlY2twb2ludCBrZWVwcyBubyBzdWJmbG93IHJlc3VsdDogZm9ybWF0IDIpLiBXaGVuIHRoZVxuICogcnVuIGtlZXBzIGEgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbmVzdGVkXG4gKiBydW50aW1lIGtlZXBzIG9uZSB0b28gKGVuYWJsZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdGhlIHdheSB0aGUgcm9vdCBkb2VzKSxcbiAqIGFuZCBpdHMgZmluYWwgc3RhdGUgaXMgUkVNRU1CRVJFRCBoZXJlIGJlc2lkZSB0aGUgcmVzdWx0IOKAlCBuZXZlciB3cml0dGVuXG4gKiBpbnRvIHRoZSByZXN1bHQsIHNvIHRoZSBwbGFpbiBzbmFwc2hvdCBzdGF5cyBieXRlLWlkZW50aWNhbCwgYW5kIG5ldmVyXG4gKiBzY3J1YmJlZCBhIHNlY29uZCB0aW1lOiB0aGUgbWlycm9yIGFscmVhZHkgaG9sZHMgZXhhY3RseSB3aGF0IHRoZSBzdWJmbG93J3NcbiAqIGxvZyBob2xkcyAoYHN0YXRlQXRgIG92ZXIgYHRyZWVDb250ZXh0Lmhpc3RvcnlgIGZvbGRzIHRvIGl0KS5cbiAqXG4gKiBUaGUgYXNzb2NpYXRpb24gaXMgYnkgb2JqZWN0IGlkZW50aXR5LCBzbyBpdCBzdXJ2aXZlcyB0aGUgdXB3YXJkIG1lcmdlIG9mXG4gKiBuZXN0ZWQgdHJhdmVyc2VycycgcmVzdWx0IG1hcHMgYW5kIGtlZXBzIHRoZSBkdWFsIGtleWluZyBob25lc3Q6IHRoZSBwYXRoXG4gKiBrZXkgYW5kIHRoZSBgI25gIHR3aW4gb2Ygb25lIG1vdW50IHBvaW50IGF0IE9ORSByYXcgcmVzdWx0IGFuZCBhcmUgc2VydmVkXG4gKiBhcyBPTkUgc3Vic3RpdHV0ZWQgcmVzdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3ViZmxvd1Jlc3VsdCB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuLyoqIFRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIGtleWVkIGJ5IHRoZSByYXcgcmVzdWx0IGl0IGJlbG9uZ3MgdG8uICovXG5jb25zdCByZWRhY3RlZFN0YXRlcyA9IG5ldyBXZWFrTWFwPFN1YmZsb3dSZXN1bHQsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuXG4vKiogUmVtZW1iZXIgdGhlIHNlcnZlZCAobWlycm9yKSBzdGF0ZSBvZiBhIHN1YmZsb3cgcmVzdWx0LiBBYnNlbnQgd2l0aG91dCBhIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHJlc3VsdDogU3ViZmxvd1Jlc3VsdCwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIHJlZGFjdGVkU3RhdGVzLnNldChyZXN1bHQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBUaGUgYHN1YmZsb3dSZXN1bHRzYCByZWNvcmQgYSBzbmFwc2hvdCBzZXJ2ZXMuIFBsYWluOiB0aGUgdHJhdmVyc2VyJ3Mgb3duXG4gKiByZWNvcmRzLCBhcyB0aGV5IGFyZS4gUmVkYWN0ZWQ6IGVhY2ggcmVzdWx0IHRoYXQgcmVtZW1iZXJzIGEgbWlycm9yIGlzXG4gKiBzZXJ2ZWQgYXMgYSBjb3B5IHdob3NlIGBnbG9iYWxDb250ZXh0YCBJUyB0aGF0IG1pcnJvciDigJQgb25lIGNvcHkgcGVyIHJhd1xuICogcmVzdWx0LCBzbyBhIG1vdW50J3MgdHdvIGtleXMgc3RpbGwgcG9pbnQgYXQgb25lIG9iamVjdCDigJQgYW5kIGEgcmVzdWx0XG4gKiB3aXRob3V0IGEgbWlycm9yIChubyBwb2xpY3kpIGlzIHNlcnZlZCBhcyBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhcbiAgcmVzdWx0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgcmVkYWN0OiBib29sZWFuLFxuKTogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICBpZiAoIXJlZGFjdCkgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgY29uc3Qgc2VydmVkQnlSYXcgPSBuZXcgTWFwPFN1YmZsb3dSZXN1bHQsIFN1YmZsb3dSZXN1bHQ+KCk7XG4gIGNvbnN0IHNlcnZlZDogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCByZXN1bHRdIG9mIHJlc3VsdHMpIHtcbiAgICBsZXQgZW50cnkgPSBzZXJ2ZWRCeVJhdy5nZXQocmVzdWx0KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWlycm9yID0gcmVkYWN0ZWRTdGF0ZXMuZ2V0KHJlc3VsdCk7XG4gICAgICBlbnRyeSA9XG4gICAgICAgIG1pcnJvciA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogeyAuLi5yZXN1bHQsIHRyZWVDb250ZXh0OiB7IC4uLnJlc3VsdC50cmVlQ29udGV4dCwgZ2xvYmFsQ29udGV4dDogbWlycm9yIH0gfTtcbiAgICAgIHNlcnZlZEJ5UmF3LnNldChyZXN1bHQsIGVudHJ5KTtcbiAgICB9XG4gICAgc2VydmVkW2tleV0gPSBlbnRyeTtcbiAgfVxuICByZXR1cm4gc2VydmVkO1xufVxuIl19
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkU3ViZmxvd1Jlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHakUsOEVBQThFO0FBQzlFLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxFQUEwQyxDQUFDO0FBRTdFLHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsNEJBQTRCLENBQUMsTUFBcUIsRUFBRSxLQUE4QjtJQUNoRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQyxFQUMzQyxNQUFlO0lBRWYsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztJQUNqRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO1lBQy9DLEtBQUs7Z0JBQ0gsTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFDM0MsQ0FBQyxDQUFDLE1BQU07b0JBQ1IsQ0FBQyxDQUFDO3dCQUNFLEdBQUcsTUFBTTt3QkFDVCxXQUFXLEVBQUU7NEJBQ1gsR0FBRyxNQUFNLENBQUMsV0FBVzs0QkFDckIsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7NEJBQ3RELEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt5QkFDNUQ7cUJBQ0YsQ0FBQztZQUNSLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyDigJQgdGhlIE9ORSBwbGFjZSB0aGF0IGRlY2lkZXMgd2hpY2ggc3RhdGUgYSBzdWJmbG93J3NcbiAqIHJlc3VsdCBzZXJ2ZXMgdW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCAoOS4yMC4wKS5cbiAqXG4gKiBBIGBTdWJmbG93UmVzdWx0YCBpcyBidWlsdCBvbmNlIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHdpdGggdGhlIHN1YmZsb3cncyByYXdcbiAqIGhlYXAgYXMgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIOKAlCB0aGUgbGl2ZSB2aWV3IHRoZSBwbGFpbiBzbmFwc2hvdFxuICoga2VlcHMgKHRoZSBwYXVzZSBjaGVja3BvaW50IGtlZXBzIG5vIHN1YmZsb3cgcmVzdWx0OiBmb3JtYXQgMikuIFdoZW4gdGhlXG4gKiBydW4ga2VlcHMgYSByZWRhY3RlZCBtaXJyb3IsIHRoZSBuZXN0ZWRcbiAqIHJ1bnRpbWUga2VlcHMgb25lIHRvbyAoZW5hYmxlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGUgd2F5IHRoZSByb290IGRvZXMpLFxuICogYW5kIGl0cyBmaW5hbCBzdGF0ZSBpcyBSRU1FTUJFUkVEIGhlcmUgYmVzaWRlIHRoZSByZXN1bHQg4oCUIG5ldmVyIHdyaXR0ZW5cbiAqIGludG8gdGhlIHJlc3VsdCwgc28gdGhlIHBsYWluIHNuYXBzaG90IHN0YXlzIGJ5dGUtaWRlbnRpY2FsLCBhbmQgbmV2ZXJcbiAqIHNjcnViYmVkIGEgc2Vjb25kIHRpbWU6IHRoZSBtaXJyb3IgYWxyZWFkeSBob2xkcyBleGFjdGx5IHdoYXQgdGhlIHN1YmZsb3cnc1xuICogbG9nIGhvbGRzIChgc3RhdGVBdGAgb3ZlciBgdHJlZUNvbnRleHQuaGlzdG9yeWAgZm9sZHMgdG8gaXQpLlxuICpcbiAqIFRoZSBhc3NvY2lhdGlvbiBpcyBieSBvYmplY3QgaWRlbnRpdHksIHNvIGl0IHN1cnZpdmVzIHRoZSB1cHdhcmQgbWVyZ2Ugb2ZcbiAqIG5lc3RlZCB0cmF2ZXJzZXJzJyByZXN1bHQgbWFwcyBhbmQga2VlcHMgdGhlIGR1YWwga2V5aW5nIGhvbmVzdDogdGhlIHBhdGhcbiAqIGtleSBhbmQgdGhlIGAjbmAgdHdpbiBvZiBvbmUgbW91bnQgcG9pbnQgYXQgT05FIHJhdyByZXN1bHQgYW5kIGFyZSBzZXJ2ZWRcbiAqIGFzIE9ORSBzdWJzdGl0dXRlZCByZXN1bHQuXG4gKi9cblxuaW1wb3J0IHsgcmVkYWN0UmVhZFNvdXJjZXMgfSBmcm9tICcuLi8uLi9jYXB0dXJlL3JlYWRTb3VyY2VzLmpzJztcbmltcG9ydCB0eXBlIHsgU3ViZmxvd1Jlc3VsdCB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuLyoqIFRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIGtleWVkIGJ5IHRoZSByYXcgcmVzdWx0IGl0IGJlbG9uZ3MgdG8uICovXG5jb25zdCByZWRhY3RlZFN0YXRlcyA9IG5ldyBXZWFrTWFwPFN1YmZsb3dSZXN1bHQsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuXG4vKiogUmVtZW1iZXIgdGhlIHNlcnZlZCAobWlycm9yKSBzdGF0ZSBvZiBhIHN1YmZsb3cgcmVzdWx0LiBBYnNlbnQgd2l0aG91dCBhIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHJlc3VsdDogU3ViZmxvd1Jlc3VsdCwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIHJlZGFjdGVkU3RhdGVzLnNldChyZXN1bHQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBUaGUgYHN1YmZsb3dSZXN1bHRzYCByZWNvcmQgYSBzbmFwc2hvdCBzZXJ2ZXMuIFBsYWluOiB0aGUgdHJhdmVyc2VyJ3Mgb3duXG4gKiByZWNvcmRzLCBhcyB0aGV5IGFyZS4gUmVkYWN0ZWQ6IGVhY2ggcmVzdWx0IHRoYXQgcmVtZW1iZXJzIGEgbWlycm9yIGlzXG4gKiBzZXJ2ZWQgYXMgYSBjb3B5IHdob3NlIGBnbG9iYWxDb250ZXh0YCBJUyB0aGF0IG1pcnJvciDigJQgb25lIGNvcHkgcGVyIHJhd1xuICogcmVzdWx0LCBzbyBhIG1vdW50J3MgdHdvIGtleXMgc3RpbGwgcG9pbnQgYXQgb25lIG9iamVjdCDigJQgYW5kIGEgcmVzdWx0XG4gKiB3aXRob3V0IGEgbWlycm9yIChubyBwb2xpY3kpIGlzIHNlcnZlZCBhcyBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhcbiAgcmVzdWx0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgcmVkYWN0OiBib29sZWFuLFxuKTogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICBpZiAoIXJlZGFjdCkgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgY29uc3Qgc2VydmVkQnlSYXcgPSBuZXcgTWFwPFN1YmZsb3dSZXN1bHQsIFN1YmZsb3dSZXN1bHQ+KCk7XG4gIGNvbnN0IHNlcnZlZDogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCByZXN1bHRdIG9mIHJlc3VsdHMpIHtcbiAgICBsZXQgZW50cnkgPSBzZXJ2ZWRCeVJhdy5nZXQocmVzdWx0KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWlycm9yID0gcmVkYWN0ZWRTdGF0ZXMuZ2V0KHJlc3VsdCk7XG4gICAgICBjb25zdCBzb3VyY2VzID0gcmVzdWx0LnRyZWVDb250ZXh0LnJlYWRTb3VyY2VzO1xuICAgICAgZW50cnkgPVxuICAgICAgICBtaXJyb3IgPT09IHVuZGVmaW5lZCAmJiBzb3VyY2VzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHJlc3VsdFxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgLi4ucmVzdWx0LnRyZWVDb250ZXh0LFxuICAgICAgICAgICAgICAgIC4uLihtaXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7IGdsb2JhbENvbnRleHQ6IG1pcnJvciB9KSxcbiAgICAgICAgICAgICAgICAuLi4oc291cmNlcyAmJiB7IHJlYWRTb3VyY2VzOiByZWRhY3RSZWFkU291cmNlcyhzb3VyY2VzKSB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICBzZXJ2ZWRCeVJhdy5zZXQocmVzdWx0LCBlbnRyeSk7XG4gICAgfVxuICAgIHNlcnZlZFtrZXldID0gZW50cnk7XG4gIH1cbiAgcmV0dXJuIHNlcnZlZDtcbn1cbiJdfQ==
@@ -261,7 +261,7 @@ export interface SubflowResult {
261
261
  globalContext: Record<string, unknown>;
262
262
  stageContexts: Record<string, unknown>;
263
263
  history: unknown[];
264
- /** Unknown until each child invocation has its own source ownership protocol. */
264
+ /** Native source book for this invocation's own log. Memory observation only; no parent receipt applies. */
265
265
  readonly readSources?: import('../capture/readSources.js').EngineReadSources;
266
266
  /** Identity of the local history, not its parent's log. */
267
267
  readonly logAddress?: LogAddress;
@@ -363,6 +363,7 @@ export interface IExecutionRuntime {
363
363
  rootStageContext: StageContext;
364
364
  executionHistory: {
365
365
  list(): unknown[];
366
+ readonly address?: LogAddress;
366
367
  };
367
368
  /**
368
369
  * A fresh root frame on this runtime — its store, its log, the run's policy