footprintjs 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/lib/engine/narrative/CombinedNarrativeBuilder.js +43 -14
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +267 -0
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +25 -1
- package/dist/esm/lib/engine/narrative/index.js +2 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +33 -16
- package/dist/esm/lib/scope/recorders/NarrativeRecorder.js +6 -1
- package/dist/esm/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +15 -2
- package/dist/esm/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +63 -0
- package/dist/esm/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +11 -0
- package/dist/esm/types/lib/engine/narrative/index.d.ts +2 -0
- package/dist/esm/types/lib/runner/FlowChartExecutor.d.ts +8 -1
- package/dist/esm/types/lib/scope/recorders/NarrativeRecorder.d.ts +5 -0
- package/dist/lib/engine/narrative/CombinedNarrativeBuilder.js +43 -14
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +271 -0
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +25 -1
- package/dist/lib/engine/narrative/index.js +4 -2
- package/dist/lib/runner/FlowChartExecutor.js +33 -16
- package/dist/lib/scope/recorders/NarrativeRecorder.js +6 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeBuilder.d.ts +15 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +63 -0
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +11 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +8 -1
- package/dist/types/lib/scope/recorders/NarrativeRecorder.d.ts +5 -0
- package/package.json +1 -1
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
* Stage 1: "Receive Application"
|
|
9
9
|
* Step 1: Write applicantName = 'Bob'
|
|
10
10
|
* [Condition]: risk tier is high → chose "Reject Application"
|
|
11
|
+
*
|
|
12
|
+
* @deprecated Since 0.9.x — Superseded by {@link CombinedNarrativeRecorder} which builds the
|
|
13
|
+
* combined narrative inline during traversal (no post-processing). This class is retained for
|
|
14
|
+
* backward compatibility with consumers that use CombinedNarrativeBuilder directly.
|
|
15
|
+
* Will be removed in v1.0.
|
|
11
16
|
*/
|
|
12
17
|
// ---------------------------------------------------------------------------
|
|
13
18
|
// Builder
|
|
@@ -21,23 +26,35 @@ export class CombinedNarrativeBuilder {
|
|
|
21
26
|
indent: (_c = options === null || options === void 0 ? void 0 : options.indent) !== null && _c !== void 0 ? _c : ' ',
|
|
22
27
|
};
|
|
23
28
|
}
|
|
24
|
-
|
|
29
|
+
/**
|
|
30
|
+
* @param flowSentences Sentences from the flow recorder (NarrativeFlowRecorder.getSentences()).
|
|
31
|
+
* @param recorder Data-level recorder with per-stage read/write operations.
|
|
32
|
+
* @param sentenceStageNames Optional parallel array of actual stage names for each sentence
|
|
33
|
+
* (from NarrativeFlowRecorder.getSentenceStageNames()). When provided,
|
|
34
|
+
* enables direct lookup instead of fragile regex-based matching.
|
|
35
|
+
* @deprecated Use {@link CombinedNarrativeRecorder} instead, which builds entries inline during traversal.
|
|
36
|
+
*/
|
|
37
|
+
buildEntries(flowSentences, recorder, sentenceStageNames) {
|
|
38
|
+
var _a;
|
|
25
39
|
const entries = [];
|
|
26
40
|
const stageData = recorder.getStageData();
|
|
27
41
|
const usedStages = new Set();
|
|
28
42
|
let stageCounter = 0;
|
|
29
|
-
for (
|
|
43
|
+
for (let i = 0; i < flowSentences.length; i++) {
|
|
44
|
+
const sentence = flowSentences[i];
|
|
30
45
|
const parsed = this.parseSentence(sentence);
|
|
46
|
+
// Prefer the actual stage name from the recorder over regex-parsed description text
|
|
47
|
+
const resolvedStageName = (_a = sentenceStageNames === null || sentenceStageNames === void 0 ? void 0 : sentenceStageNames[i]) !== null && _a !== void 0 ? _a : parsed.stageName;
|
|
31
48
|
if (parsed.type === 'stage') {
|
|
32
49
|
stageCounter++;
|
|
33
50
|
entries.push({
|
|
34
51
|
type: 'stage',
|
|
35
52
|
text: `Stage ${stageCounter}: ${sentence}`,
|
|
36
53
|
depth: 0,
|
|
37
|
-
stageName:
|
|
54
|
+
stageName: resolvedStageName,
|
|
38
55
|
});
|
|
39
|
-
if (
|
|
40
|
-
const data = this.findStageData(
|
|
56
|
+
if (resolvedStageName) {
|
|
57
|
+
const data = this.findStageData(resolvedStageName, stageData);
|
|
41
58
|
if (data) {
|
|
42
59
|
usedStages.add(data.stageName);
|
|
43
60
|
this.addStepEntries(entries, data);
|
|
@@ -45,7 +62,8 @@ export class CombinedNarrativeBuilder {
|
|
|
45
62
|
}
|
|
46
63
|
}
|
|
47
64
|
else if (parsed.type === 'condition') {
|
|
48
|
-
entries.push({ type: 'condition', text: `[Condition]: ${sentence}`, depth: 0 });
|
|
65
|
+
entries.push({ type: 'condition', text: `[Condition]: ${sentence}`, depth: 0, stageName: resolvedStageName });
|
|
66
|
+
// For conditions, also look up the chosen branch's data
|
|
49
67
|
if (parsed.stageName) {
|
|
50
68
|
const data = this.findStageData(parsed.stageName, stageData);
|
|
51
69
|
if (data) {
|
|
@@ -53,6 +71,17 @@ export class CombinedNarrativeBuilder {
|
|
|
53
71
|
this.addStepEntries(entries, data);
|
|
54
72
|
}
|
|
55
73
|
}
|
|
74
|
+
// Also mark the decider stage itself as used (the resolvedStageName)
|
|
75
|
+
if (resolvedStageName) {
|
|
76
|
+
const data = this.findStageData(resolvedStageName, stageData);
|
|
77
|
+
if (data) {
|
|
78
|
+
usedStages.add(data.stageName);
|
|
79
|
+
// Only add step entries if the chosen branch didn't already cover it
|
|
80
|
+
if (!parsed.stageName || parsed.stageName !== resolvedStageName) {
|
|
81
|
+
this.addStepEntries(entries, data);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
56
85
|
}
|
|
57
86
|
else if (parsed.type === 'fork') {
|
|
58
87
|
entries.push({ type: 'fork', text: `[Parallel]: ${sentence}`, depth: 0 });
|
|
@@ -80,8 +109,8 @@ export class CombinedNarrativeBuilder {
|
|
|
80
109
|
}
|
|
81
110
|
return entries;
|
|
82
111
|
}
|
|
83
|
-
build(flowSentences, recorder) {
|
|
84
|
-
return this.buildEntries(flowSentences, recorder).map((entry) => {
|
|
112
|
+
build(flowSentences, recorder, sentenceStageNames) {
|
|
113
|
+
return this.buildEntries(flowSentences, recorder, sentenceStageNames).map((entry) => {
|
|
85
114
|
const indent = this.options.indent.repeat(entry.depth);
|
|
86
115
|
return `${indent}${entry.text}`;
|
|
87
116
|
});
|
|
@@ -125,22 +154,22 @@ export class CombinedNarrativeBuilder {
|
|
|
125
154
|
return undefined;
|
|
126
155
|
}
|
|
127
156
|
parseSentence(sentence) {
|
|
128
|
-
var _a, _b, _c, _d;
|
|
157
|
+
var _a, _b, _c, _d, _e, _f;
|
|
129
158
|
if (sentence.startsWith('The process began')) {
|
|
130
159
|
const match = sentence.match(/The process began(?:: (.+)| with (.+))\./);
|
|
131
|
-
return { type: 'stage', stageName: (_a = match === null || match === void 0 ? void 0 : match[2]) === null ||
|
|
160
|
+
return { type: 'stage', stageName: (_b = ((_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : match === null || match === void 0 ? void 0 : match[2])) === null || _b === void 0 ? void 0 : _b.trim() };
|
|
132
161
|
}
|
|
133
162
|
if (sentence.startsWith('Next')) {
|
|
134
163
|
const match = sentence.match(/Next(?:,? it moved on to (.+)| step: (.+))\./);
|
|
135
|
-
return { type: 'stage', stageName: (
|
|
164
|
+
return { type: 'stage', stageName: (_d = ((_c = match === null || match === void 0 ? void 0 : match[1]) !== null && _c !== void 0 ? _c : match === null || match === void 0 ? void 0 : match[2])) === null || _d === void 0 ? void 0 : _d.trim() };
|
|
136
165
|
}
|
|
137
166
|
if (sentence.includes('decision was made') || sentence.includes('it chose') || sentence.includes('so it chose')) {
|
|
138
167
|
const match = sentence.match(/chose (.+)\./);
|
|
139
|
-
return { type: 'condition', stageName: (
|
|
168
|
+
return { type: 'condition', stageName: (_e = match === null || match === void 0 ? void 0 : match[1]) === null || _e === void 0 ? void 0 : _e.trim() };
|
|
140
169
|
}
|
|
141
170
|
if (sentence.startsWith('It ') && sentence.includes('chose')) {
|
|
142
171
|
const match = sentence.match(/chose (.+)\./);
|
|
143
|
-
return { type: 'condition', stageName: (
|
|
172
|
+
return { type: 'condition', stageName: (_f = match === null || match === void 0 ? void 0 : match[1]) === null || _f === void 0 ? void 0 : _f.trim() };
|
|
144
173
|
}
|
|
145
174
|
if (sentence.includes('paths were executed in parallel') || sentence.includes('paths were selected'))
|
|
146
175
|
return { type: 'fork' };
|
|
@@ -155,4 +184,4 @@ export class CombinedNarrativeBuilder {
|
|
|
155
184
|
return { type: 'stage' };
|
|
156
185
|
}
|
|
157
186
|
}
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBc0JILDhFQUE4RTtBQUM5RSxVQUFVO0FBQ1YsOEVBQThFO0FBRTlFLE1BQU0sT0FBTyx3QkFBd0I7SUFHbkMsWUFBWSxPQUFrQzs7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGtCQUFrQixFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGtCQUFrQixtQ0FBSSxJQUFJO1lBQ3ZELGFBQWEsRUFBRSxNQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxhQUFhLG1DQUFJLElBQUk7WUFDN0MsTUFBTSxFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sbUNBQUksSUFBSTtTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxhQUF1QixFQUFFLFFBQTJCO1FBQy9ELE1BQU0sT0FBTyxHQUE2QixFQUFFLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLEtBQUssTUFBTSxRQUFRLElBQUksYUFBYSxFQUFFLENBQUM7WUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU1QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzVCLFlBQVksRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ1gsSUFBSSxFQUFFLE9BQU87b0JBQ2IsSUFBSSxFQUFFLFNBQVMsWUFBWSxLQUFLLFFBQVEsRUFBRTtvQkFDMUMsS0FBSyxFQUFFLENBQUM7b0JBQ1IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2lCQUM1QixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDN0QsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDVCxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3JDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUM3RCxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNULFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDckMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxlQUFlLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7aUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxDQUFDO1FBQ0gsQ0FBQztRQUVELHVFQUF1RTtRQUN2RSxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxVQUFVLENB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QyxTQUFTLENBQUM7WUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzVELElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkUsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyIOKAlCBNZXJnZXMgZmxvdy1sZXZlbCBuYXJyYXRpdmUgd2l0aCBkYXRhLWxldmVsIG9wZXJhdGlvbnMuXG4gKlxuICogQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IgY2FwdHVyZXMgRkxPVyDigJQgd2hhdCBzdGFnZXMgcmFuLCB3aGljaCBicmFuY2hlcyB3ZXJlIHRha2VuLlxuICogTmFycmF0aXZlUmVjb3JkZXIgKHNjb3BlLykgY2FwdHVyZXMgREFUQSDigJQgd2hhdCB2YWx1ZXMgd2VyZSByZWFkLCB3cml0dGVuLCB1cGRhdGVkLlxuICpcbiAqIFRoaXMgYnVpbGRlciB3ZWF2ZXMgYm90aCBpbnRvIGEgc2luZ2xlIHVuaWZpZWQgbmFycmF0aXZlOlxuICogICBTdGFnZSAxOiBcIlJlY2VpdmUgQXBwbGljYXRpb25cIlxuICogICAgIFN0ZXAgMTogV3JpdGUgYXBwbGljYW50TmFtZSA9ICdCb2InXG4gKiAgIFtDb25kaXRpb25dOiByaXNrIHRpZXIgaXMgaGlnaCDihpIgY2hvc2UgXCJSZWplY3QgQXBwbGljYXRpb25cIlxuICovXG5cbmltcG9ydCB0eXBlIHsgTmFycmF0aXZlUmVjb3JkZXIsIFN0YWdlTmFycmF0aXZlRGF0YSB9IGZyb20gJy4uLy4uL3Njb3BlL3JlY29yZGVycy9OYXJyYXRpdmVSZWNvcmRlcic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVHlwZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkTmFycmF0aXZlRW50cnkge1xuICB0eXBlOiAnc3RhZ2UnIHwgJ3N0ZXAnIHwgJ2NvbmRpdGlvbicgfCAnZm9yaycgfCAnc3ViZmxvdycgfCAnbG9vcCcgfCAnYnJlYWsnIHwgJ2Vycm9yJztcbiAgdGV4dDogc3RyaW5nO1xuICBkZXB0aDogbnVtYmVyO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIHN0ZXBOdW1iZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tYmluZWROYXJyYXRpdmVPcHRpb25zIHtcbiAgaW5jbHVkZVN0ZXBOdW1iZXJzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVZhbHVlcz86IGJvb2xlYW47XG4gIGluZGVudD86IHN0cmluZztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCdWlsZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNsYXNzIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciB7XG4gIHByaXZhdGUgb3B0aW9uczogUmVxdWlyZWQ8Q29tYmluZWROYXJyYXRpdmVPcHRpb25zPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgaW5jbHVkZVN0ZXBOdW1iZXJzOiBvcHRpb25zPy5pbmNsdWRlU3RlcE51bWJlcnMgPz8gdHJ1ZSxcbiAgICAgIGluY2x1ZGVWYWx1ZXM6IG9wdGlvbnM/LmluY2x1ZGVWYWx1ZXMgPz8gdHJ1ZSxcbiAgICAgIGluZGVudDogb3B0aW9ucz8uaW5kZW50ID8/ICcgICcsXG4gICAgfTtcbiAgfVxuXG4gIGJ1aWxkRW50cmllcyhmbG93U2VudGVuY2VzOiBzdHJpbmdbXSwgcmVjb3JkZXI6IE5hcnJhdGl2ZVJlY29yZGVyKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBjb25zdCBlbnRyaWVzOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBzdGFnZURhdGEgPSByZWNvcmRlci5nZXRTdGFnZURhdGEoKTtcbiAgICBjb25zdCB1c2VkU3RhZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IHN0YWdlQ291bnRlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHNlbnRlbmNlIG9mIGZsb3dTZW50ZW5jZXMpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VTZW50ZW5jZShzZW50ZW5jZSk7XG5cbiAgICAgIGlmIChwYXJzZWQudHlwZSA9PT0gJ3N0YWdlJykge1xuICAgICAgICBzdGFnZUNvdW50ZXIrKztcbiAgICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICAgIHRleHQ6IGBTdGFnZSAke3N0YWdlQ291bnRlcn06ICR7c2VudGVuY2V9YCxcbiAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICBzdGFnZU5hbWU6IHBhcnNlZC5zdGFnZU5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocGFyc2VkLnN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocGFyc2VkLnN0YWdlTmFtZSwgc3RhZ2VEYXRhKTtcbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdXNlZFN0YWdlcy5hZGQoZGF0YS5zdGFnZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hZGRTdGVwRW50cmllcyhlbnRyaWVzLCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdjb25kaXRpb24nKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IHR5cGU6ICdjb25kaXRpb24nLCB0ZXh0OiBgW0NvbmRpdGlvbl06ICR7c2VudGVuY2V9YCwgZGVwdGg6IDAgfSk7XG4gICAgICAgIGlmIChwYXJzZWQuc3RhZ2VOYW1lKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmluZFN0YWdlRGF0YShwYXJzZWQuc3RhZ2VOYW1lLCBzdGFnZURhdGEpO1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB1c2VkU3RhZ2VzLmFkZChkYXRhLnN0YWdlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFkZFN0ZXBFbnRyaWVzKGVudHJpZXMsIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJzZWQudHlwZSA9PT0gJ2ZvcmsnKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IHR5cGU6ICdmb3JrJywgdGV4dDogYFtQYXJhbGxlbF06ICR7c2VudGVuY2V9YCwgZGVwdGg6IDAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnc3ViZmxvdycpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ3N1YmZsb3cnLCB0ZXh0OiBzZW50ZW5jZSwgZGVwdGg6IDAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnbG9vcCcpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2xvb3AnLCB0ZXh0OiBzZW50ZW5jZSwgZGVwdGg6IDAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnYnJlYWsnKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IHR5cGU6ICdicmVhaycsIHRleHQ6IHNlbnRlbmNlLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2Vycm9yJywgdGV4dDogYFtFcnJvcl06ICR7c2VudGVuY2V9YCwgZGVwdGg6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHN0YWdlcyB3aXRoIG9wZXJhdGlvbnMgdGhhdCB3ZXJlbid0IHJlZmVyZW5jZWQgaW4gZmxvdyBzZW50ZW5jZXNcbiAgICBmb3IgKGNvbnN0IFtzdGFnZU5hbWUsIGRhdGFdIG9mIEFycmF5LmZyb20oc3RhZ2VEYXRhLmVudHJpZXMoKSkpIHtcbiAgICAgIGlmICghdXNlZFN0YWdlcy5oYXMoc3RhZ2VOYW1lKSAmJiBkYXRhLm9wZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGFnZUNvdW50ZXIrKztcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ3N0YWdlJywgdGV4dDogYFN0YWdlICR7c3RhZ2VDb3VudGVyfTogJHtzdGFnZU5hbWV9YCwgZGVwdGg6IDAsIHN0YWdlTmFtZSB9KTtcbiAgICAgICAgdGhpcy5hZGRTdGVwRW50cmllcyhlbnRyaWVzLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIGJ1aWxkKGZsb3dTZW50ZW5jZXM6IHN0cmluZ1tdLCByZWNvcmRlcjogTmFycmF0aXZlUmVjb3JkZXIpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRFbnRyaWVzKGZsb3dTZW50ZW5jZXMsIHJlY29yZGVyKS5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBpbmRlbnQgPSB0aGlzLm9wdGlvbnMuaW5kZW50LnJlcGVhdChlbnRyeS5kZXB0aCk7XG4gICAgICByZXR1cm4gYCR7aW5kZW50fSR7ZW50cnkudGV4dH1gO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFByaXZhdGUgaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIGFkZFN0ZXBFbnRyaWVzKGVudHJpZXM6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSwgZGF0YTogU3RhZ2VOYXJyYXRpdmVEYXRhKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvcCBvZiBkYXRhLm9wZXJhdGlvbnMpIHtcbiAgICAgIGNvbnN0IHN0ZXBQcmVmaXggPSB0aGlzLm9wdGlvbnMuaW5jbHVkZVN0ZXBOdW1iZXJzICYmIG9wLnN0ZXBOdW1iZXIgPyBgU3RlcCAke29wLnN0ZXBOdW1iZXJ9OiBgIDogJyc7XG5cbiAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICBpZiAob3AudHlwZSA9PT0gJ3JlYWQnKSB7XG4gICAgICAgIHRleHQgPVxuICAgICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlVmFsdWVzICYmIG9wLnZhbHVlU3VtbWFyeVxuICAgICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVJlYWQgJHtvcC5rZXl9ID0gJHtvcC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICAgICAgOiBgJHtzdGVwUHJlZml4fVJlYWQgJHtvcC5rZXl9YDtcbiAgICAgIH0gZWxzZSBpZiAob3Aub3BlcmF0aW9uID09PSAnZGVsZXRlJykge1xuICAgICAgICB0ZXh0ID0gYCR7c3RlcFByZWZpeH1EZWxldGUgJHtvcC5rZXl9YDtcbiAgICAgIH0gZWxzZSBpZiAob3Aub3BlcmF0aW9uID09PSAndXBkYXRlJykge1xuICAgICAgICB0ZXh0ID0gdGhpcy5vcHRpb25zLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gdGhpcy5vcHRpb25zLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtvcC5rZXl9ID0gJHtvcC52YWx1ZVN1bW1hcnl9YFxuICAgICAgICAgIDogYCR7c3RlcFByZWZpeH1Xcml0ZSAke29wLmtleX1gO1xuICAgICAgfVxuXG4gICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnc3RlcCcsIHRleHQsIGRlcHRoOiAxLCBzdGFnZU5hbWU6IGRhdGEuc3RhZ2VOYW1lLCBzdGVwTnVtYmVyOiBvcC5zdGVwTnVtYmVyIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZFN0YWdlRGF0YShuYW1lOiBzdHJpbmcsIHN0YWdlRGF0YTogTWFwPHN0cmluZywgU3RhZ2VOYXJyYXRpdmVEYXRhPik6IFN0YWdlTmFycmF0aXZlRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHN0YWdlRGF0YS5oYXMobmFtZSkpIHJldHVybiBzdGFnZURhdGEuZ2V0KG5hbWUpO1xuICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgZGF0YV0gb2YgQXJyYXkuZnJvbShzdGFnZURhdGEuZW50cmllcygpKSkge1xuICAgICAgaWYgKFxuICAgICAgICBzdGFnZU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuYW1lLnRvTG93ZXJDYXNlKCkpIHx8XG4gICAgICAgIG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdGFnZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTZW50ZW5jZShzZW50ZW5jZTogc3RyaW5nKTogeyB0eXBlOiBzdHJpbmc7IHN0YWdlTmFtZT86IHN0cmluZyB9IHtcbiAgICBpZiAoc2VudGVuY2Uuc3RhcnRzV2l0aCgnVGhlIHByb2Nlc3MgYmVnYW4nKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzZW50ZW5jZS5tYXRjaCgvVGhlIHByb2Nlc3MgYmVnYW4oPzo6ICguKyl8IHdpdGggKC4rKSlcXC4vKTtcbiAgICAgIHJldHVybiB7IHR5cGU6ICdzdGFnZScsIHN0YWdlTmFtZTogbWF0Y2g/LlsyXT8udHJpbSgpIH07XG4gICAgfVxuICAgIGlmIChzZW50ZW5jZS5zdGFydHNXaXRoKCdOZXh0JykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VudGVuY2UubWF0Y2goL05leHQoPzosPyBpdCBtb3ZlZCBvbiB0byAoLispfCBzdGVwOiAoLispKVxcLi8pO1xuICAgICAgcmV0dXJuIHsgdHlwZTogJ3N0YWdlJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdkZWNpc2lvbiB3YXMgbWFkZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdpdCBjaG9zZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdzbyBpdCBjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0l0ICcpICYmIHNlbnRlbmNlLmluY2x1ZGVzKCdjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdwYXRocyB3ZXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsJykgfHwgc2VudGVuY2UuaW5jbHVkZXMoJ3BhdGhzIHdlcmUgc2VsZWN0ZWQnKSlcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmb3JrJyB9O1xuICAgIGlmIChzZW50ZW5jZS5zdGFydHNXaXRoKCdFbnRlcmluZycpIHx8IHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4aXRpbmcnKSkgcmV0dXJuIHsgdHlwZTogJ3N1YmZsb3cnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ09uIHBhc3MnKSkgcmV0dXJuIHsgdHlwZTogJ2xvb3AnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4ZWN1dGlvbiBzdG9wcGVkJykpIHJldHVybiB7IHR5cGU6ICdicmVhaycgfTtcbiAgICBpZiAoc2VudGVuY2Uuc3RhcnRzV2l0aCgnQW4gZXJyb3Igb2NjdXJyZWQnKSkgcmV0dXJuIHsgdHlwZTogJ2Vycm9yJyB9O1xuICAgIHJldHVybiB7IHR5cGU6ICdzdGFnZScgfTtcbiAgfVxufVxuIl19
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFzQkgsOEVBQThFO0FBQzlFLFVBQVU7QUFDViw4RUFBOEU7QUFFOUUsTUFBTSxPQUFPLHdCQUF3QjtJQUduQyxZQUFZLE9BQWtDOztRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2Isa0JBQWtCLEVBQUUsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsa0JBQWtCLG1DQUFJLElBQUk7WUFDdkQsYUFBYSxFQUFFLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGFBQWEsbUNBQUksSUFBSTtZQUM3QyxNQUFNLEVBQUUsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsTUFBTSxtQ0FBSSxJQUFJO1NBQ2hDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFlBQVksQ0FDVixhQUF1QixFQUN2QixRQUEyQixFQUMzQixrQkFBMkM7O1FBRTNDLE1BQU0sT0FBTyxHQUE2QixFQUFFLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDckMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FB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O1FBQ3ZFLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciDigJQgTWVyZ2VzIGZsb3ctbGV2ZWwgbmFycmF0aXZlIHdpdGggZGF0YS1sZXZlbCBvcGVyYXRpb25zLlxuICpcbiAqIENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yIGNhcHR1cmVzIEZMT1cg4oCUIHdoYXQgc3RhZ2VzIHJhbiwgd2hpY2ggYnJhbmNoZXMgd2VyZSB0YWtlbi5cbiAqIE5hcnJhdGl2ZVJlY29yZGVyIChzY29wZS8pIGNhcHR1cmVzIERBVEEg4oCUIHdoYXQgdmFsdWVzIHdlcmUgcmVhZCwgd3JpdHRlbiwgdXBkYXRlZC5cbiAqXG4gKiBUaGlzIGJ1aWxkZXIgd2VhdmVzIGJvdGggaW50byBhIHNpbmdsZSB1bmlmaWVkIG5hcnJhdGl2ZTpcbiAqICAgU3RhZ2UgMTogXCJSZWNlaXZlIEFwcGxpY2F0aW9uXCJcbiAqICAgICBTdGVwIDE6IFdyaXRlIGFwcGxpY2FudE5hbWUgPSAnQm9iJ1xuICogICBbQ29uZGl0aW9uXTogcmlzayB0aWVyIGlzIGhpZ2gg4oaSIGNob3NlIFwiUmVqZWN0IEFwcGxpY2F0aW9uXCJcbiAqXG4gKiBAZGVwcmVjYXRlZCBTaW5jZSAwLjkueCDigJQgU3VwZXJzZWRlZCBieSB7QGxpbmsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlcn0gd2hpY2ggYnVpbGRzIHRoZVxuICogY29tYmluZWQgbmFycmF0aXZlIGlubGluZSBkdXJpbmcgdHJhdmVyc2FsIChubyBwb3N0LXByb2Nlc3NpbmcpLiBUaGlzIGNsYXNzIGlzIHJldGFpbmVkIGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvbnN1bWVycyB0aGF0IHVzZSBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIgZGlyZWN0bHkuXG4gKiBXaWxsIGJlIHJlbW92ZWQgaW4gdjEuMC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE5hcnJhdGl2ZVJlY29yZGVyLCBTdGFnZU5hcnJhdGl2ZURhdGEgfSBmcm9tICcuLi8uLi9zY29wZS9yZWNvcmRlcnMvTmFycmF0aXZlUmVjb3JkZXInO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFR5cGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IHtcbiAgdHlwZTogJ3N0YWdlJyB8ICdzdGVwJyB8ICdjb25kaXRpb24nIHwgJ2ZvcmsnIHwgJ3N1YmZsb3cnIHwgJ2xvb3AnIHwgJ2JyZWFrJyB8ICdlcnJvcic7XG4gIHRleHQ6IHN0cmluZztcbiAgZGVwdGg6IG51bWJlcjtcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBzdGVwTnVtYmVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVkTmFycmF0aXZlT3B0aW9ucyB7XG4gIGluY2x1ZGVTdGVwTnVtYmVycz86IGJvb2xlYW47XG4gIGluY2x1ZGVWYWx1ZXM/OiBib29sZWFuO1xuICBpbmRlbnQ/OiBzdHJpbmc7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQnVpbGRlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjbGFzcyBDb21iaW5lZE5hcnJhdGl2ZUJ1aWxkZXIge1xuICBwcml2YXRlIG9wdGlvbnM6IFJlcXVpcmVkPENvbWJpbmVkTmFycmF0aXZlT3B0aW9ucz47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGluY2x1ZGVTdGVwTnVtYmVyczogb3B0aW9ucz8uaW5jbHVkZVN0ZXBOdW1iZXJzID8/IHRydWUsXG4gICAgICBpbmNsdWRlVmFsdWVzOiBvcHRpb25zPy5pbmNsdWRlVmFsdWVzID8/IHRydWUsXG4gICAgICBpbmRlbnQ6IG9wdGlvbnM/LmluZGVudCA/PyAnICAnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZsb3dTZW50ZW5jZXMgIFNlbnRlbmNlcyBmcm9tIHRoZSBmbG93IHJlY29yZGVyIChOYXJyYXRpdmVGbG93UmVjb3JkZXIuZ2V0U2VudGVuY2VzKCkpLlxuICAgKiBAcGFyYW0gcmVjb3JkZXIgICAgICAgRGF0YS1sZXZlbCByZWNvcmRlciB3aXRoIHBlci1zdGFnZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSBzZW50ZW5jZVN0YWdlTmFtZXMgIE9wdGlvbmFsIHBhcmFsbGVsIGFycmF5IG9mIGFjdHVhbCBzdGFnZSBuYW1lcyBmb3IgZWFjaCBzZW50ZW5jZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBOYXJyYXRpdmVGbG93UmVjb3JkZXIuZ2V0U2VudGVuY2VTdGFnZU5hbWVzKCkpLiBXaGVuIHByb3ZpZGVkLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVzIGRpcmVjdCBsb29rdXAgaW5zdGVhZCBvZiBmcmFnaWxlIHJlZ2V4LWJhc2VkIG1hdGNoaW5nLlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJ9IGluc3RlYWQsIHdoaWNoIGJ1aWxkcyBlbnRyaWVzIGlubGluZSBkdXJpbmcgdHJhdmVyc2FsLlxuICAgKi9cbiAgYnVpbGRFbnRyaWVzKFxuICAgIGZsb3dTZW50ZW5jZXM6IHN0cmluZ1tdLFxuICAgIHJlY29yZGVyOiBOYXJyYXRpdmVSZWNvcmRlcixcbiAgICBzZW50ZW5jZVN0YWdlTmFtZXM/OiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdLFxuICApOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGNvbnN0IGVudHJpZXM6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IHN0YWdlRGF0YSA9IHJlY29yZGVyLmdldFN0YWdlRGF0YSgpO1xuICAgIGNvbnN0IHVzZWRTdGFnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgc3RhZ2VDb3VudGVyID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxvd1NlbnRlbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2VudGVuY2UgPSBmbG93U2VudGVuY2VzW2ldO1xuICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVNlbnRlbmNlKHNlbnRlbmNlKTtcbiAgICAgIC8vIFByZWZlciB0aGUgYWN0dWFsIHN0YWdlIG5hbWUgZnJvbSB0aGUgcmVjb3JkZXIgb3ZlciByZWdleC1wYXJzZWQgZGVzY3JpcHRpb24gdGV4dFxuICAgICAgY29uc3QgcmVzb2x2ZWRTdGFnZU5hbWUgPSBzZW50ZW5jZVN0YWdlTmFtZXM/LltpXSA/PyBwYXJzZWQuc3RhZ2VOYW1lO1xuXG4gICAgICBpZiAocGFyc2VkLnR5cGUgPT09ICdzdGFnZScpIHtcbiAgICAgICAgc3RhZ2VDb3VudGVyKys7XG4gICAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgICAgICB0ZXh0OiBgU3RhZ2UgJHtzdGFnZUNvdW50ZXJ9OiAke3NlbnRlbmNlfWAsXG4gICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgc3RhZ2VOYW1lOiByZXNvbHZlZFN0YWdlTmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXNvbHZlZFN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocmVzb2x2ZWRTdGFnZU5hbWUsIHN0YWdlRGF0YSk7XG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHVzZWRTdGFnZXMuYWRkKGRhdGEuc3RhZ2VOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuYWRkU3RlcEVudHJpZXMoZW50cmllcywgZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnY29uZGl0aW9uJykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnY29uZGl0aW9uJywgdGV4dDogYFtDb25kaXRpb25dOiAke3NlbnRlbmNlfWAsIGRlcHRoOiAwLCBzdGFnZU5hbWU6IHJlc29sdmVkU3RhZ2VOYW1lIH0pO1xuICAgICAgICAvLyBGb3IgY29uZGl0aW9ucywgYWxzbyBsb29rIHVwIHRoZSBjaG9zZW4gYnJhbmNoJ3MgZGF0YVxuICAgICAgICBpZiAocGFyc2VkLnN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocGFyc2VkLnN0YWdlTmFtZSwgc3RhZ2VEYXRhKTtcbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdXNlZFN0YWdlcy5hZGQoZGF0YS5zdGFnZU5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hZGRTdGVwRW50cmllcyhlbnRyaWVzLCBkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBtYXJrIHRoZSBkZWNpZGVyIHN0YWdlIGl0c2VsZiBhcyB1c2VkICh0aGUgcmVzb2x2ZWRTdGFnZU5hbWUpXG4gICAgICAgIGlmIChyZXNvbHZlZFN0YWdlTmFtZSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpbmRTdGFnZURhdGEocmVzb2x2ZWRTdGFnZU5hbWUsIHN0YWdlRGF0YSk7XG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHVzZWRTdGFnZXMuYWRkKGRhdGEuc3RhZ2VOYW1lKTtcbiAgICAgICAgICAgIC8vIE9ubHkgYWRkIHN0ZXAgZW50cmllcyBpZiB0aGUgY2hvc2VuIGJyYW5jaCBkaWRuJ3QgYWxyZWFkeSBjb3ZlciBpdFxuICAgICAgICAgICAgaWYgKCFwYXJzZWQuc3RhZ2VOYW1lIHx8IHBhcnNlZC5zdGFnZU5hbWUgIT09IHJlc29sdmVkU3RhZ2VOYW1lKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkU3RlcEVudHJpZXMoZW50cmllcywgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlZC50eXBlID09PSAnZm9yaycpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2ZvcmsnLCB0ZXh0OiBgW1BhcmFsbGVsXTogJHtzZW50ZW5jZX1gLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdzdWJmbG93Jykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnc3ViZmxvdycsIHRleHQ6IHNlbnRlbmNlLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdsb29wJykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnbG9vcCcsIHRleHQ6IHNlbnRlbmNlLCBkZXB0aDogMCB9KTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VkLnR5cGUgPT09ICdicmVhaycpIHtcbiAgICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ2JyZWFrJywgdGV4dDogc2VudGVuY2UsIGRlcHRoOiAwIH0pO1xuICAgICAgfSBlbHNlIGlmIChwYXJzZWQudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnZXJyb3InLCB0ZXh0OiBgW0Vycm9yXTogJHtzZW50ZW5jZX1gLCBkZXB0aDogMCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgc3RhZ2VzIHdpdGggb3BlcmF0aW9ucyB0aGF0IHdlcmVuJ3QgcmVmZXJlbmNlZCBpbiBmbG93IHNlbnRlbmNlc1xuICAgIGZvciAoY29uc3QgW3N0YWdlTmFtZSwgZGF0YV0gb2YgQXJyYXkuZnJvbShzdGFnZURhdGEuZW50cmllcygpKSkge1xuICAgICAgaWYgKCF1c2VkU3RhZ2VzLmhhcyhzdGFnZU5hbWUpICYmIGRhdGEub3BlcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YWdlQ291bnRlcisrO1xuICAgICAgICBlbnRyaWVzLnB1c2goeyB0eXBlOiAnc3RhZ2UnLCB0ZXh0OiBgU3RhZ2UgJHtzdGFnZUNvdW50ZXJ9OiAke3N0YWdlTmFtZX1gLCBkZXB0aDogMCwgc3RhZ2VOYW1lIH0pO1xuICAgICAgICB0aGlzLmFkZFN0ZXBFbnRyaWVzKGVudHJpZXMsIGRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgYnVpbGQoZmxvd1NlbnRlbmNlczogc3RyaW5nW10sIHJlY29yZGVyOiBOYXJyYXRpdmVSZWNvcmRlciwgc2VudGVuY2VTdGFnZU5hbWVzPzogKHN0cmluZyB8IHVuZGVmaW5lZClbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZEVudHJpZXMoZmxvd1NlbnRlbmNlcywgcmVjb3JkZXIsIHNlbnRlbmNlU3RhZ2VOYW1lcykubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgaW5kZW50ID0gdGhpcy5vcHRpb25zLmluZGVudC5yZXBlYXQoZW50cnkuZGVwdGgpO1xuICAgICAgcmV0dXJuIGAke2luZGVudH0ke2VudHJ5LnRleHR9YDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSAXG5cbiAgcHJpdmF0ZSBhZGRTdGVwRW50cmllcyhlbnRyaWVzOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sIGRhdGE6IFN0YWdlTmFycmF0aXZlRGF0YSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgZGF0YS5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBzdGVwUHJlZml4ID0gdGhpcy5vcHRpb25zLmluY2x1ZGVTdGVwTnVtYmVycyAmJiBvcC5zdGVwTnVtYmVyID8gYFN0ZXAgJHtvcC5zdGVwTnVtYmVyfTogYCA6ICcnO1xuXG4gICAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgICAgaWYgKG9wLnR5cGUgPT09ICdyZWFkJykge1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICB0aGlzLm9wdGlvbnMuaW5jbHVkZVZhbHVlcyAmJiBvcC52YWx1ZVN1bW1hcnlcbiAgICAgICAgICAgID8gYCR7c3RlcFByZWZpeH1SZWFkICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICAgIDogYCR7c3RlcFByZWZpeH1SZWFkICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2UgaWYgKG9wLm9wZXJhdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgdGV4dCA9IGAke3N0ZXBQcmVmaXh9RGVsZXRlICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2UgaWYgKG9wLm9wZXJhdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgdGV4dCA9IHRoaXMub3B0aW9ucy5pbmNsdWRlVmFsdWVzXG4gICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke29wLmtleX0gPSAke29wLnZhbHVlU3VtbWFyeX1gXG4gICAgICAgICAgOiBgJHtzdGVwUHJlZml4fVVwZGF0ZSAke29wLmtleX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCA9IHRoaXMub3B0aW9ucy5pbmNsdWRlVmFsdWVzXG4gICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVdyaXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtvcC5rZXl9YDtcbiAgICAgIH1cblxuICAgICAgZW50cmllcy5wdXNoKHsgdHlwZTogJ3N0ZXAnLCB0ZXh0LCBkZXB0aDogMSwgc3RhZ2VOYW1lOiBkYXRhLnN0YWdlTmFtZSwgc3RlcE51bWJlcjogb3Auc3RlcE51bWJlciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRTdGFnZURhdGEobmFtZTogc3RyaW5nLCBzdGFnZURhdGE6IE1hcDxzdHJpbmcsIFN0YWdlTmFycmF0aXZlRGF0YT4pOiBTdGFnZU5hcnJhdGl2ZURhdGEgfCB1bmRlZmluZWQge1xuICAgIGlmIChzdGFnZURhdGEuaGFzKG5hbWUpKSByZXR1cm4gc3RhZ2VEYXRhLmdldChuYW1lKTtcbiAgICBmb3IgKGNvbnN0IFtzdGFnZU5hbWUsIGRhdGFdIG9mIEFycmF5LmZyb20oc3RhZ2VEYXRhLmVudHJpZXMoKSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgc3RhZ2VOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobmFtZS50b0xvd2VyQ2FzZSgpKSB8fFxuICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3RhZ2VOYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2VudGVuY2Uoc2VudGVuY2U6IHN0cmluZyk6IHsgdHlwZTogc3RyaW5nOyBzdGFnZU5hbWU/OiBzdHJpbmcgfSB7XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ1RoZSBwcm9jZXNzIGJlZ2FuJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VudGVuY2UubWF0Y2goL1RoZSBwcm9jZXNzIGJlZ2FuKD86OiAoLispfCB3aXRoICguKykpXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnc3RhZ2UnLCBzdGFnZU5hbWU6IChtYXRjaD8uWzFdID8/IG1hdGNoPy5bMl0pPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ05leHQnKSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSBzZW50ZW5jZS5tYXRjaCgvTmV4dCg/Oiw/IGl0IG1vdmVkIG9uIHRvICguKyl8IHN0ZXA6ICguKykpXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnc3RhZ2UnLCBzdGFnZU5hbWU6IChtYXRjaD8uWzFdID8/IG1hdGNoPy5bMl0pPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdkZWNpc2lvbiB3YXMgbWFkZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdpdCBjaG9zZScpIHx8IHNlbnRlbmNlLmluY2x1ZGVzKCdzbyBpdCBjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0l0ICcpICYmIHNlbnRlbmNlLmluY2x1ZGVzKCdjaG9zZScpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHNlbnRlbmNlLm1hdGNoKC9jaG9zZSAoLispXFwuLyk7XG4gICAgICByZXR1cm4geyB0eXBlOiAnY29uZGl0aW9uJywgc3RhZ2VOYW1lOiBtYXRjaD8uWzFdPy50cmltKCkgfTtcbiAgICB9XG4gICAgaWYgKHNlbnRlbmNlLmluY2x1ZGVzKCdwYXRocyB3ZXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsJykgfHwgc2VudGVuY2UuaW5jbHVkZXMoJ3BhdGhzIHdlcmUgc2VsZWN0ZWQnKSlcbiAgICAgIHJldHVybiB7IHR5cGU6ICdmb3JrJyB9O1xuICAgIGlmIChzZW50ZW5jZS5zdGFydHNXaXRoKCdFbnRlcmluZycpIHx8IHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4aXRpbmcnKSkgcmV0dXJuIHsgdHlwZTogJ3N1YmZsb3cnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ09uIHBhc3MnKSkgcmV0dXJuIHsgdHlwZTogJ2xvb3AnIH07XG4gICAgaWYgKHNlbnRlbmNlLnN0YXJ0c1dpdGgoJ0V4ZWN1dGlvbiBzdG9wcGVkJykpIHJldHVybiB7IHR5cGU6ICdicmVhaycgfTtcbiAgICBpZiAoc2VudGVuY2Uuc3RhcnRzV2l0aCgnQW4gZXJyb3Igb2NjdXJyZWQnKSkgcmV0dXJuIHsgdHlwZTogJ2Vycm9yJyB9O1xuICAgIHJldHVybiB7IHR5cGU6ICdzdGFnZScgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CombinedNarrativeRecorder — Inline narrative builder that merges flow + data during traversal.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the post-processing CombinedNarrativeBuilder by implementing BOTH
|
|
5
|
+
* FlowRecorder (control-flow events) and Recorder (scope data events).
|
|
6
|
+
*
|
|
7
|
+
* Event ordering guarantees this works:
|
|
8
|
+
* 1. Scope events (onRead, onWrite) fire DURING stage execution
|
|
9
|
+
* 2. Flow events (onStageExecuted, onDecision) fire AFTER stage execution
|
|
10
|
+
* 3. Both carry the same `stageName` — no matching ambiguity
|
|
11
|
+
*
|
|
12
|
+
* So we buffer scope ops per-stage, then when the flow event arrives,
|
|
13
|
+
* emit the stage entry + flush the buffered ops in one pass.
|
|
14
|
+
*/
|
|
15
|
+
// ── Recorder ───────────────────────────────────────────────────────────────
|
|
16
|
+
export class CombinedNarrativeRecorder {
|
|
17
|
+
constructor(options) {
|
|
18
|
+
var _a, _b, _c, _d;
|
|
19
|
+
this.entries = [];
|
|
20
|
+
this.pendingOps = new Map();
|
|
21
|
+
this.stageCounter = 0;
|
|
22
|
+
this.isFirstStage = true;
|
|
23
|
+
this.id = (_a = options === null || options === void 0 ? void 0 : options.id) !== null && _a !== void 0 ? _a : 'combined-narrative';
|
|
24
|
+
this.includeStepNumbers = (_b = options === null || options === void 0 ? void 0 : options.includeStepNumbers) !== null && _b !== void 0 ? _b : true;
|
|
25
|
+
this.includeValues = (_c = options === null || options === void 0 ? void 0 : options.includeValues) !== null && _c !== void 0 ? _c : true;
|
|
26
|
+
this.maxValueLength = (_d = options === null || options === void 0 ? void 0 : options.maxValueLength) !== null && _d !== void 0 ? _d : 80;
|
|
27
|
+
}
|
|
28
|
+
// ── Scope channel (fires first, during stage execution) ───────────────
|
|
29
|
+
onRead(event) {
|
|
30
|
+
if (!event.key)
|
|
31
|
+
return;
|
|
32
|
+
this.bufferOp(event.stageName, {
|
|
33
|
+
type: 'read',
|
|
34
|
+
key: event.key,
|
|
35
|
+
valueSummary: summarizeValue(event.value, this.maxValueLength),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
onWrite(event) {
|
|
39
|
+
this.bufferOp(event.stageName, {
|
|
40
|
+
type: 'write',
|
|
41
|
+
key: event.key,
|
|
42
|
+
valueSummary: summarizeValue(event.value, this.maxValueLength),
|
|
43
|
+
operation: event.operation,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// ── Flow channel (fires after stage execution) ────────────────────────
|
|
47
|
+
onStageExecuted(event) {
|
|
48
|
+
this.stageCounter++;
|
|
49
|
+
const text = this.isFirstStage
|
|
50
|
+
? event.description
|
|
51
|
+
? `The process began: ${event.description}.`
|
|
52
|
+
: `The process began with ${event.stageName}.`
|
|
53
|
+
: event.description
|
|
54
|
+
? `Next step: ${event.description}.`
|
|
55
|
+
: `Next, it moved on to ${event.stageName}.`;
|
|
56
|
+
this.isFirstStage = false;
|
|
57
|
+
this.entries.push({
|
|
58
|
+
type: 'stage',
|
|
59
|
+
text: `Stage ${this.stageCounter}: ${text}`,
|
|
60
|
+
depth: 0,
|
|
61
|
+
stageName: event.stageName,
|
|
62
|
+
});
|
|
63
|
+
this.flushOps(event.stageName);
|
|
64
|
+
}
|
|
65
|
+
onDecision(event) {
|
|
66
|
+
// Emit the decider stage entry (deciders don't fire onStageExecuted)
|
|
67
|
+
this.stageCounter++;
|
|
68
|
+
const stageText = this.isFirstStage
|
|
69
|
+
? event.description
|
|
70
|
+
? `The process began: ${event.description}.`
|
|
71
|
+
: `The process began with ${event.decider}.`
|
|
72
|
+
: event.description
|
|
73
|
+
? `Next step: ${event.description}.`
|
|
74
|
+
: `Next, it moved on to ${event.decider}.`;
|
|
75
|
+
this.isFirstStage = false;
|
|
76
|
+
this.entries.push({
|
|
77
|
+
type: 'stage',
|
|
78
|
+
text: `Stage ${this.stageCounter}: ${stageText}`,
|
|
79
|
+
depth: 0,
|
|
80
|
+
stageName: event.decider,
|
|
81
|
+
});
|
|
82
|
+
this.flushOps(event.decider);
|
|
83
|
+
// Emit the condition entry
|
|
84
|
+
const branchName = event.chosen;
|
|
85
|
+
let conditionText;
|
|
86
|
+
if (event.description && event.rationale) {
|
|
87
|
+
conditionText = `It ${event.description}: ${event.rationale}, so it chose ${branchName}.`;
|
|
88
|
+
}
|
|
89
|
+
else if (event.description) {
|
|
90
|
+
conditionText = `It ${event.description} and chose ${branchName}.`;
|
|
91
|
+
}
|
|
92
|
+
else if (event.rationale) {
|
|
93
|
+
conditionText = `A decision was made: ${event.rationale}, so the path taken was ${branchName}.`;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
conditionText = `A decision was made, and the path taken was ${branchName}.`;
|
|
97
|
+
}
|
|
98
|
+
this.entries.push({
|
|
99
|
+
type: 'condition',
|
|
100
|
+
text: `[Condition]: ${conditionText}`,
|
|
101
|
+
depth: 0,
|
|
102
|
+
stageName: event.decider,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
onNext() {
|
|
106
|
+
// No-op. onStageExecuted already has the description for the next stage.
|
|
107
|
+
// For deciders (no onStageExecuted), onDecision handles the announcement.
|
|
108
|
+
}
|
|
109
|
+
onFork(event) {
|
|
110
|
+
const names = event.children.join(', ');
|
|
111
|
+
this.entries.push({
|
|
112
|
+
type: 'fork',
|
|
113
|
+
text: `[Parallel]: ${event.children.length} paths were executed in parallel: ${names}.`,
|
|
114
|
+
depth: 0,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
onSelected(event) {
|
|
118
|
+
const names = event.selected.join(', ');
|
|
119
|
+
this.entries.push({
|
|
120
|
+
type: 'fork',
|
|
121
|
+
text: `[Selected]: ${event.selected.length} of ${event.total} paths were selected: ${names}.`,
|
|
122
|
+
depth: 0,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
onSubflowEntry(event) {
|
|
126
|
+
const text = event.description
|
|
127
|
+
? `Entering the ${event.name} subflow: ${event.description}.`
|
|
128
|
+
: `Entering the ${event.name} subflow.`;
|
|
129
|
+
this.entries.push({ type: 'subflow', text, depth: 0 });
|
|
130
|
+
}
|
|
131
|
+
onSubflowExit(event) {
|
|
132
|
+
this.entries.push({
|
|
133
|
+
type: 'subflow',
|
|
134
|
+
text: `Exiting the ${event.name} subflow.`,
|
|
135
|
+
depth: 0,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
onLoop(event) {
|
|
139
|
+
const text = event.description
|
|
140
|
+
? `On pass ${event.iteration}: ${event.description} again.`
|
|
141
|
+
: `On pass ${event.iteration} through ${event.target}.`;
|
|
142
|
+
this.entries.push({ type: 'loop', text, depth: 0 });
|
|
143
|
+
}
|
|
144
|
+
onBreak(event) {
|
|
145
|
+
this.entries.push({
|
|
146
|
+
type: 'break',
|
|
147
|
+
text: `Execution stopped at ${event.stageName}.`,
|
|
148
|
+
depth: 0,
|
|
149
|
+
stageName: event.stageName,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Handles errors from both channels:
|
|
154
|
+
* - FlowRecorder.onError (FlowErrorEvent with message + structuredError)
|
|
155
|
+
* - Recorder.onError (ErrorEvent from scope system — ignored for narrative)
|
|
156
|
+
*/
|
|
157
|
+
onError(event) {
|
|
158
|
+
var _a, _b;
|
|
159
|
+
// Only handle flow errors (which have `message` and `structuredError`)
|
|
160
|
+
if (typeof event.message !== 'string')
|
|
161
|
+
return;
|
|
162
|
+
const flowEvent = event;
|
|
163
|
+
let text = `An error occurred at ${flowEvent.stageName}: ${flowEvent.message}.`;
|
|
164
|
+
if ((_b = (_a = flowEvent.structuredError) === null || _a === void 0 ? void 0 : _a.issues) === null || _b === void 0 ? void 0 : _b.length) {
|
|
165
|
+
const details = flowEvent.structuredError.issues
|
|
166
|
+
.map((issue) => {
|
|
167
|
+
const path = issue.path.length > 0 ? issue.path.join('.') : '(root)';
|
|
168
|
+
return `${path}: ${issue.message}`;
|
|
169
|
+
})
|
|
170
|
+
.join('; ');
|
|
171
|
+
text += ` Validation issues: ${details}.`;
|
|
172
|
+
}
|
|
173
|
+
this.entries.push({
|
|
174
|
+
type: 'error',
|
|
175
|
+
text: `[Error]: ${text}`,
|
|
176
|
+
depth: 0,
|
|
177
|
+
stageName: flowEvent.stageName,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// ── Output ────────────────────────────────────────────────────────────
|
|
181
|
+
/** Returns structured entries for programmatic consumption. */
|
|
182
|
+
getEntries() {
|
|
183
|
+
return [...this.entries];
|
|
184
|
+
}
|
|
185
|
+
/** Returns formatted narrative lines (same output as CombinedNarrativeBuilder.build). */
|
|
186
|
+
getNarrative(indent = ' ') {
|
|
187
|
+
return this.entries.map((entry) => `${indent.repeat(entry.depth)}${entry.text}`);
|
|
188
|
+
}
|
|
189
|
+
/** Clears all state. Called automatically before each run. */
|
|
190
|
+
clear() {
|
|
191
|
+
this.entries = [];
|
|
192
|
+
this.pendingOps.clear();
|
|
193
|
+
this.stageCounter = 0;
|
|
194
|
+
this.isFirstStage = true;
|
|
195
|
+
}
|
|
196
|
+
// ── Private helpers ───────────────────────────────────────────────────
|
|
197
|
+
bufferOp(stageName, op) {
|
|
198
|
+
let ops = this.pendingOps.get(stageName);
|
|
199
|
+
if (!ops) {
|
|
200
|
+
ops = [];
|
|
201
|
+
this.pendingOps.set(stageName, ops);
|
|
202
|
+
}
|
|
203
|
+
ops.push({ ...op, stepNumber: ops.length + 1 });
|
|
204
|
+
}
|
|
205
|
+
flushOps(stageName) {
|
|
206
|
+
const ops = this.pendingOps.get(stageName);
|
|
207
|
+
if (!ops || ops.length === 0)
|
|
208
|
+
return;
|
|
209
|
+
for (const op of ops) {
|
|
210
|
+
const stepPrefix = this.includeStepNumbers ? `Step ${op.stepNumber}: ` : '';
|
|
211
|
+
let text;
|
|
212
|
+
if (op.type === 'read') {
|
|
213
|
+
text =
|
|
214
|
+
this.includeValues && op.valueSummary
|
|
215
|
+
? `${stepPrefix}Read ${op.key} = ${op.valueSummary}`
|
|
216
|
+
: `${stepPrefix}Read ${op.key}`;
|
|
217
|
+
}
|
|
218
|
+
else if (op.operation === 'delete') {
|
|
219
|
+
text = `${stepPrefix}Delete ${op.key}`;
|
|
220
|
+
}
|
|
221
|
+
else if (op.operation === 'update') {
|
|
222
|
+
text = this.includeValues
|
|
223
|
+
? `${stepPrefix}Update ${op.key} = ${op.valueSummary}`
|
|
224
|
+
: `${stepPrefix}Update ${op.key}`;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
text = this.includeValues
|
|
228
|
+
? `${stepPrefix}Write ${op.key} = ${op.valueSummary}`
|
|
229
|
+
: `${stepPrefix}Write ${op.key}`;
|
|
230
|
+
}
|
|
231
|
+
this.entries.push({
|
|
232
|
+
type: 'step',
|
|
233
|
+
text,
|
|
234
|
+
depth: 1,
|
|
235
|
+
stageName,
|
|
236
|
+
stepNumber: op.stepNumber,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
this.pendingOps.delete(stageName);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// ── Value summarizer (same logic as NarrativeRecorder) ─────────────────────
|
|
243
|
+
function summarizeValue(value, maxLen) {
|
|
244
|
+
if (value === undefined)
|
|
245
|
+
return 'undefined';
|
|
246
|
+
if (value === null)
|
|
247
|
+
return 'null';
|
|
248
|
+
if (typeof value === 'string') {
|
|
249
|
+
return value.length <= maxLen ? `"${value}"` : `"${value.slice(0, maxLen - 3)}..."`;
|
|
250
|
+
}
|
|
251
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
252
|
+
return String(value);
|
|
253
|
+
if (Array.isArray(value)) {
|
|
254
|
+
return value.length === 0 ? '[]' : `(${value.length} item${value.length > 1 ? 's' : ''})`;
|
|
255
|
+
}
|
|
256
|
+
if (typeof value === 'object') {
|
|
257
|
+
const keys = Object.keys(value);
|
|
258
|
+
if (keys.length === 0)
|
|
259
|
+
return '{}';
|
|
260
|
+
const preview = keys.slice(0, 4).join(', ');
|
|
261
|
+
const suffix = keys.length > 4 ? `, ... (${keys.length} keys)` : '';
|
|
262
|
+
const result = `{${preview}${suffix}}`;
|
|
263
|
+
return result.length <= maxLen ? result : `{${keys.length} keys}`;
|
|
264
|
+
}
|
|
265
|
+
return String(value);
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFnQ0gsOEVBQThFO0FBRTlFLE1BQU0sT0FBTyx5QkFBeUI7SUFZcEMsWUFBWSxPQUE0RDs7UUFUaEUsWUFBTyxHQUE2QixFQUFFLENBQUM7UUFDdkMsZUFBVSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQzdDLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBTzFCLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsRUFBRSxtQ0FBSSxvQkFBb0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsa0JBQWtCLG1DQUFJLElBQUksQ0FBQztRQUM5RCxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLGFBQWEsbUNBQUksSUFBSSxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsY0FBYyxtQ0FBSSxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDN0IsSUFBSSxFQUFFLE1BQU07WUFDWixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxZQUFZLEVB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QUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztJQUM1RixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQWdDLENBQUMsQ0FBQztRQUMzRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQztRQUN2QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDO0lBQ3BFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIOKAlCBJbmxpbmUgbmFycmF0aXZlIGJ1aWxkZXIgdGhhdCBtZXJnZXMgZmxvdyArIGRhdGEgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBSZXBsYWNlcyB0aGUgcG9zdC1wcm9jZXNzaW5nIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlciBieSBpbXBsZW1lbnRpbmcgQk9USFxuICogRmxvd1JlY29yZGVyIChjb250cm9sLWZsb3cgZXZlbnRzKSBhbmQgUmVjb3JkZXIgKHNjb3BlIGRhdGEgZXZlbnRzKS5cbiAqXG4gKiBFdmVudCBvcmRlcmluZyBndWFyYW50ZWVzIHRoaXMgd29ya3M6XG4gKiAgIDEuIFNjb3BlIGV2ZW50cyAob25SZWFkLCBvbldyaXRlKSBmaXJlIERVUklORyBzdGFnZSBleGVjdXRpb25cbiAqICAgMi4gRmxvdyBldmVudHMgKG9uU3RhZ2VFeGVjdXRlZCwgb25EZWNpc2lvbikgZmlyZSBBRlRFUiBzdGFnZSBleGVjdXRpb25cbiAqICAgMy4gQm90aCBjYXJyeSB0aGUgc2FtZSBgc3RhZ2VOYW1lYCDigJQgbm8gbWF0Y2hpbmcgYW1iaWd1aXR5XG4gKlxuICogU28gd2UgYnVmZmVyIHNjb3BlIG9wcyBwZXItc3RhZ2UsIHRoZW4gd2hlbiB0aGUgZmxvdyBldmVudCBhcnJpdmVzLFxuICogZW1pdCB0aGUgc3RhZ2UgZW50cnkgKyBmbHVzaCB0aGUgYnVmZmVyZWQgb3BzIGluIG9uZSBwYXNzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBSZWNvcmRlciwgV3JpdGVFdmVudCB9IGZyb20gJy4uLy4uL3Njb3BlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4vQ29tYmluZWROYXJyYXRpdmVCdWlsZGVyJztcbmltcG9ydCB0eXBlIHtcbiAgRmxvd0JyZWFrRXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG4gIEZsb3dTdWJmbG93RXZlbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vLyDilIDilIAgVHlwZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmludGVyZmFjZSBCdWZmZXJlZE9wIHtcbiAgdHlwZTogJ3JlYWQnIHwgJ3dyaXRlJztcbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlU3VtbWFyeTogc3RyaW5nO1xuICBvcGVyYXRpb24/OiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZSc7XG4gIHN0ZXBOdW1iZXI6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB7XG4gIGluY2x1ZGVTdGVwTnVtYmVycz86IGJvb2xlYW47XG4gIGluY2x1ZGVWYWx1ZXM/OiBib29sZWFuO1xuICBtYXhWYWx1ZUxlbmd0aD86IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFJlY29yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY2xhc3MgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciwgUmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIHByaXZhdGUgZW50cmllczogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdID0gW107XG4gIHByaXZhdGUgcGVuZGluZ09wcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXJlZE9wW10+KCk7XG4gIHByaXZhdGUgc3RhZ2VDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBpc0ZpcnN0U3RhZ2UgPSB0cnVlO1xuXG4gIHByaXZhdGUgaW5jbHVkZVN0ZXBOdW1iZXJzOiBib29sZWFuO1xuICBwcml2YXRlIGluY2x1ZGVWYWx1ZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4VmFsdWVMZW5ndGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMgJiB7IGlkPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgPz8gJ2NvbWJpbmVkLW5hcnJhdGl2ZSc7XG4gICAgdGhpcy5pbmNsdWRlU3RlcE51bWJlcnMgPSBvcHRpb25zPy5pbmNsdWRlU3RlcE51bWJlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLmluY2x1ZGVWYWx1ZXMgPSBvcHRpb25zPy5pbmNsdWRlVmFsdWVzID8/IHRydWU7XG4gICAgdGhpcy5tYXhWYWx1ZUxlbmd0aCA9IG9wdGlvbnM/Lm1heFZhbHVlTGVuZ3RoID8/IDgwO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlIGNoYW5uZWwgKGZpcmVzIGZpcnN0LCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQua2V5KSByZXR1cm47XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5zdGFnZU5hbWUsIHtcbiAgICAgIHR5cGU6ICdyZWFkJyxcbiAgICAgIGtleTogZXZlbnQua2V5LFxuICAgICAgdmFsdWVTdW1tYXJ5OiBzdW1tYXJpemVWYWx1ZShldmVudC52YWx1ZSwgdGhpcy5tYXhWYWx1ZUxlbmd0aCksXG4gICAgfSk7XG4gIH1cblxuICBvbldyaXRlKGV2ZW50OiBXcml0ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJPcChldmVudC5zdGFnZU5hbWUsIHtcbiAgICAgIHR5cGU6ICd3cml0ZScsXG4gICAgICBrZXk6IGV2ZW50LmtleSxcbiAgICAgIHZhbHVlU3VtbWFyeTogc3VtbWFyaXplVmFsdWUoZXZlbnQudmFsdWUsIHRoaXMubWF4VmFsdWVMZW5ndGgpLFxuICAgICAgb3BlcmF0aW9uOiBldmVudC5vcGVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRmxvdyBjaGFubmVsIChmaXJlcyBhZnRlciBzdGFnZSBleGVjdXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnN0YWdlQ291bnRlcisrO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmlzRmlyc3RTdGFnZVxuICAgICAgPyBldmVudC5kZXNjcmlwdGlvblxuICAgICAgICA/IGBUaGUgcHJvY2VzcyBiZWdhbjogJHtldmVudC5kZXNjcmlwdGlvbn0uYFxuICAgICAgICA6IGBUaGUgcHJvY2VzcyBiZWdhbiB3aXRoICR7ZXZlbnQuc3RhZ2VOYW1lfS5gXG4gICAgICA6IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBOZXh0IHN0ZXA6ICR7ZXZlbnQuZGVzY3JpcHRpb259LmBcbiAgICAgIDogYE5leHQsIGl0IG1vdmVkIG9uIHRvICR7ZXZlbnQuc3RhZ2VOYW1lfS5gO1xuICAgIHRoaXMuaXNGaXJzdFN0YWdlID0gZmFsc2U7XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaCh7XG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgdGV4dDogYFN0YWdlICR7dGhpcy5zdGFnZUNvdW50ZXJ9OiAke3RleHR9YCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5mbHVzaE9wcyhldmVudC5zdGFnZU5hbWUpO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBFbWl0IHRoZSBkZWNpZGVyIHN0YWdlIGVudHJ5IChkZWNpZGVycyBkb24ndCBmaXJlIG9uU3RhZ2VFeGVjdXRlZClcbiAgICB0aGlzLnN0YWdlQ291bnRlcisrO1xuICAgIGNvbnN0IHN0YWdlVGV4dCA9IHRoaXMuaXNGaXJzdFN0YWdlXG4gICAgICA/IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICAgID8gYFRoZSBwcm9jZXNzIGJlZ2FuOiAke2V2ZW50LmRlc2NyaXB0aW9ufS5gXG4gICAgICAgIDogYFRoZSBwcm9jZXNzIGJlZ2FuIHdpdGggJHtldmVudC5kZWNpZGVyfS5gXG4gICAgICA6IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBOZXh0IHN0ZXA6ICR7ZXZlbnQuZGVzY3JpcHRpb259LmBcbiAgICAgIDogYE5leHQsIGl0IG1vdmVkIG9uIHRvICR7ZXZlbnQuZGVjaWRlcn0uYDtcbiAgICB0aGlzLmlzRmlyc3RTdGFnZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIHRleHQ6IGBTdGFnZSAke3RoaXMuc3RhZ2VDb3VudGVyfTogJHtzdGFnZVRleHR9YCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBldmVudC5kZWNpZGVyLFxuICAgIH0pO1xuICAgIHRoaXMuZmx1c2hPcHMoZXZlbnQuZGVjaWRlcik7XG5cbiAgICAvLyBFbWl0IHRoZSBjb25kaXRpb24gZW50cnlcbiAgICBjb25zdCBicmFuY2hOYW1lID0gZXZlbnQuY2hvc2VuO1xuICAgIGxldCBjb25kaXRpb25UZXh0OiBzdHJpbmc7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uICYmIGV2ZW50LnJhdGlvbmFsZSkge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCAke2V2ZW50LmRlc2NyaXB0aW9ufTogJHtldmVudC5yYXRpb25hbGV9LCBzbyBpdCBjaG9zZSAke2JyYW5jaE5hbWV9LmA7XG4gICAgfSBlbHNlIGlmIChldmVudC5kZXNjcmlwdGlvbikge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBJdCAke2V2ZW50LmRlc2NyaXB0aW9ufSBhbmQgY2hvc2UgJHticmFuY2hOYW1lfS5gO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQucmF0aW9uYWxlKSB7XG4gICAgICBjb25kaXRpb25UZXh0ID0gYEEgZGVjaXNpb24gd2FzIG1hZGU6ICR7ZXZlbnQucmF0aW9uYWxlfSwgc28gdGhlIHBhdGggdGFrZW4gd2FzICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9uVGV4dCA9IGBBIGRlY2lzaW9uIHdhcyBtYWRlLCBhbmQgdGhlIHBhdGggdGFrZW4gd2FzICR7YnJhbmNoTmFtZX0uYDtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ2NvbmRpdGlvbicsXG4gICAgICB0ZXh0OiBgW0NvbmRpdGlvbl06ICR7Y29uZGl0aW9uVGV4dH1gLFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBzdGFnZU5hbWU6IGV2ZW50LmRlY2lkZXIsXG4gICAgfSk7XG4gIH1cblxuICBvbk5leHQoKTogdm9pZCB7XG4gICAgLy8gTm8tb3AuIG9uU3RhZ2VFeGVjdXRlZCBhbHJlYWR5IGhhcyB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXh0IHN0YWdlLlxuICAgIC8vIEZvciBkZWNpZGVycyAobm8gb25TdGFnZUV4ZWN1dGVkKSwgb25EZWNpc2lvbiBoYW5kbGVzIHRoZSBhbm5vdW5jZW1lbnQuXG4gIH1cblxuICBvbkZvcmsoZXZlbnQ6IEZsb3dGb3JrRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lcyA9IGV2ZW50LmNoaWxkcmVuLmpvaW4oJywgJyk7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ2ZvcmsnLFxuICAgICAgdGV4dDogYFtQYXJhbGxlbF06ICR7ZXZlbnQuY2hpbGRyZW4ubGVuZ3RofSBwYXRocyB3ZXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsOiAke25hbWVzfS5gLFxuICAgICAgZGVwdGg6IDAsXG4gICAgfSk7XG4gIH1cblxuICBvblNlbGVjdGVkKGV2ZW50OiBGbG93U2VsZWN0ZWRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5hbWVzID0gZXZlbnQuc2VsZWN0ZWQuam9pbignLCAnKTtcbiAgICB0aGlzLmVudHJpZXMucHVzaCh7XG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICB0ZXh0OiBgW1NlbGVjdGVkXTogJHtldmVudC5zZWxlY3RlZC5sZW5ndGh9IG9mICR7ZXZlbnQudG90YWx9IHBhdGhzIHdlcmUgc2VsZWN0ZWQ6ICR7bmFtZXN9LmAsXG4gICAgICBkZXB0aDogMCxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBFbnRlcmluZyB0aGUgJHtldmVudC5uYW1lfSBzdWJmbG93OiAke2V2ZW50LmRlc2NyaXB0aW9ufS5gXG4gICAgICA6IGBFbnRlcmluZyB0aGUgJHtldmVudC5uYW1lfSBzdWJmbG93LmA7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goeyB0eXBlOiAnc3ViZmxvdycsIHRleHQsIGRlcHRoOiAwIH0pO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdzdWJmbG93JyxcbiAgICAgIHRleHQ6IGBFeGl0aW5nIHRoZSAke2V2ZW50Lm5hbWV9IHN1YmZsb3cuYCxcbiAgICAgIGRlcHRoOiAwLFxuICAgIH0pO1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IGV2ZW50LmRlc2NyaXB0aW9uXG4gICAgICA/IGBPbiBwYXNzICR7ZXZlbnQuaXRlcmF0aW9ufTogJHtldmVudC5kZXNjcmlwdGlvbn0gYWdhaW4uYFxuICAgICAgOiBgT24gcGFzcyAke2V2ZW50Lml0ZXJhdGlvbn0gdGhyb3VnaCAke2V2ZW50LnRhcmdldH0uYDtcbiAgICB0aGlzLmVudHJpZXMucHVzaCh7IHR5cGU6ICdsb29wJywgdGV4dCwgZGVwdGg6IDAgfSk7XG4gIH1cblxuICBvbkJyZWFrKGV2ZW50OiBGbG93QnJlYWtFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIHR5cGU6ICdicmVhaycsXG4gICAgICB0ZXh0OiBgRXhlY3V0aW9uIHN0b3BwZWQgYXQgJHtldmVudC5zdGFnZU5hbWV9LmAsXG4gICAgICBkZXB0aDogMCxcbiAgICAgIHN0YWdlTmFtZTogZXZlbnQuc3RhZ2VOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgZXJyb3JzIGZyb20gYm90aCBjaGFubmVsczpcbiAgICogLSBGbG93UmVjb3JkZXIub25FcnJvciAoRmxvd0Vycm9yRXZlbnQgd2l0aCBtZXNzYWdlICsgc3RydWN0dXJlZEVycm9yKVxuICAgKiAtIFJlY29yZGVyLm9uRXJyb3IgKEVycm9yRXZlbnQgZnJvbSBzY29wZSBzeXN0ZW0g4oCUIGlnbm9yZWQgZm9yIG5hcnJhdGl2ZSlcbiAgICovXG4gIG9uRXJyb3IoZXZlbnQ6IEZsb3dFcnJvckV2ZW50IHwgeyBzdGFnZU5hbWU/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIE9ubHkgaGFuZGxlIGZsb3cgZXJyb3JzICh3aGljaCBoYXZlIGBtZXNzYWdlYCBhbmQgYHN0cnVjdHVyZWRFcnJvcmApXG4gICAgaWYgKHR5cGVvZiAoZXZlbnQgYXMgRmxvd0Vycm9yRXZlbnQpLm1lc3NhZ2UgIT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgY29uc3QgZmxvd0V2ZW50ID0gZXZlbnQgYXMgRmxvd0Vycm9yRXZlbnQ7XG5cbiAgICBsZXQgdGV4dCA9IGBBbiBlcnJvciBvY2N1cnJlZCBhdCAke2Zsb3dFdmVudC5zdGFnZU5hbWV9OiAke2Zsb3dFdmVudC5tZXNzYWdlfS5gO1xuICAgIGlmIChmbG93RXZlbnQuc3RydWN0dXJlZEVycm9yPy5pc3N1ZXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgZGV0YWlscyA9IGZsb3dFdmVudC5zdHJ1Y3R1cmVkRXJyb3IuaXNzdWVzXG4gICAgICAgIC5tYXAoKGlzc3VlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGlzc3VlLnBhdGguam9pbignLicpIDogJyhyb290KSc7XG4gICAgICAgICAgcmV0dXJuIGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICB0ZXh0ICs9IGAgVmFsaWRhdGlvbiBpc3N1ZXM6ICR7ZGV0YWlsc30uYDtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgIHRleHQ6IGBbRXJyb3JdOiAke3RleHR9YCxcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgc3RhZ2VOYW1lOiBmbG93RXZlbnQuc3RhZ2VOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmV0dXJucyBzdHJ1Y3R1cmVkIGVudHJpZXMgZm9yIHByb2dyYW1tYXRpYyBjb25zdW1wdGlvbi4gKi9cbiAgZ2V0RW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIHJldHVybiBbLi4udGhpcy5lbnRyaWVzXTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGZvcm1hdHRlZCBuYXJyYXRpdmUgbGluZXMgKHNhbWUgb3V0cHV0IGFzIENvbWJpbmVkTmFycmF0aXZlQnVpbGRlci5idWlsZCkuICovXG4gIGdldE5hcnJhdGl2ZShpbmRlbnQgPSAnICAnKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMubWFwKChlbnRyeSkgPT4gYCR7aW5kZW50LnJlcGVhdChlbnRyeS5kZXB0aCl9JHtlbnRyeS50ZXh0fWApO1xuICB9XG5cbiAgLyoqIENsZWFycyBhbGwgc3RhdGUuIENhbGxlZCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBlYWNoIHJ1bi4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5lbnRyaWVzID0gW107XG4gICAgdGhpcy5wZW5kaW5nT3BzLmNsZWFyKCk7XG4gICAgdGhpcy5zdGFnZUNvdW50ZXIgPSAwO1xuICAgIHRoaXMuaXNGaXJzdFN0YWdlID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBidWZmZXJPcChzdGFnZU5hbWU6IHN0cmluZywgb3A6IE9taXQ8QnVmZmVyZWRPcCwgJ3N0ZXBOdW1iZXInPik6IHZvaWQge1xuICAgIGxldCBvcHMgPSB0aGlzLnBlbmRpbmdPcHMuZ2V0KHN0YWdlTmFtZSk7XG4gICAgaWYgKCFvcHMpIHtcbiAgICAgIG9wcyA9IFtdO1xuICAgICAgdGhpcy5wZW5kaW5nT3BzLnNldChzdGFnZU5hbWUsIG9wcyk7XG4gICAgfVxuICAgIG9wcy5wdXNoKHsgLi4ub3AsIHN0ZXBOdW1iZXI6IG9wcy5sZW5ndGggKyAxIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaE9wcyhzdGFnZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9wcyA9IHRoaXMucGVuZGluZ09wcy5nZXQoc3RhZ2VOYW1lKTtcbiAgICBpZiAoIW9wcyB8fCBvcHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgY29uc3Qgc3RlcFByZWZpeCA9IHRoaXMuaW5jbHVkZVN0ZXBOdW1iZXJzID8gYFN0ZXAgJHtvcC5zdGVwTnVtYmVyfTogYCA6ICcnO1xuXG4gICAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgICAgaWYgKG9wLnR5cGUgPT09ICdyZWFkJykge1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICB0aGlzLmluY2x1ZGVWYWx1ZXMgJiYgb3AudmFsdWVTdW1tYXJ5XG4gICAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9UmVhZCAke29wLmtleX0gPSAke29wLnZhbHVlU3VtbWFyeX1gXG4gICAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9UmVhZCAke29wLmtleX1gO1xuICAgICAgfSBlbHNlIGlmIChvcC5vcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gICAgICAgIHRleHQgPSBgJHtzdGVwUHJlZml4fURlbGV0ZSAke29wLmtleX1gO1xuICAgICAgfSBlbHNlIGlmIChvcC5vcGVyYXRpb24gPT09ICd1cGRhdGUnKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmluY2x1ZGVWYWx1ZXNcbiAgICAgICAgICA/IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9VXBkYXRlICR7b3Aua2V5fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0ID0gdGhpcy5pbmNsdWRlVmFsdWVzXG4gICAgICAgICAgPyBgJHtzdGVwUHJlZml4fVdyaXRlICR7b3Aua2V5fSA9ICR7b3AudmFsdWVTdW1tYXJ5fWBcbiAgICAgICAgICA6IGAke3N0ZXBQcmVmaXh9V3JpdGUgJHtvcC5rZXl9YDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgICB0eXBlOiAnc3RlcCcsXG4gICAgICAgIHRleHQsXG4gICAgICAgIGRlcHRoOiAxLFxuICAgICAgICBzdGFnZU5hbWUsXG4gICAgICAgIHN0ZXBOdW1iZXI6IG9wLnN0ZXBOdW1iZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdPcHMuZGVsZXRlKHN0YWdlTmFtZSk7XG4gIH1cbn1cblxuLy8g4pSA4pSAIFZhbHVlIHN1bW1hcml6ZXIgKHNhbWUgbG9naWMgYXMgTmFycmF0aXZlUmVjb3JkZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBzdW1tYXJpemVWYWx1ZSh2YWx1ZTogdW5rbm93biwgbWF4TGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuICd1bmRlZmluZWQnO1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAnbnVsbCc7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA8PSBtYXhMZW4gPyBgXCIke3ZhbHVlfVwiYCA6IGBcIiR7dmFsdWUuc2xpY2UoMCwgbWF4TGVuIC0gMyl9Li4uXCJgO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMCA/ICdbXScgOiBgKCR7dmFsdWUubGVuZ3RofSBpdGVtJHt2YWx1ZS5sZW5ndGggPiAxID8gJ3MnIDogJyd9KWA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICd7fSc7XG4gICAgY29uc3QgcHJldmlldyA9IGtleXMuc2xpY2UoMCwgNCkuam9pbignLCAnKTtcbiAgICBjb25zdCBzdWZmaXggPSBrZXlzLmxlbmd0aCA+IDQgPyBgLCAuLi4gKCR7a2V5cy5sZW5ndGh9IGtleXMpYCA6ICcnO1xuICAgIGNvbnN0IHJlc3VsdCA9IGB7JHtwcmV2aWV3fSR7c3VmZml4fX1gO1xuICAgIHJldHVybiByZXN1bHQubGVuZ3RoIDw9IG1heExlbiA/IHJlc3VsdCA6IGB7JHtrZXlzLmxlbmd0aH0ga2V5c31gO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuIl19
|