footprintjs 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -32
- package/dist/esm/lib/builder/FlowChartBuilder.js +54 -91
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +5 -5
- package/dist/esm/lib/engine/handlers/ContinuationResolver.js +6 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +4 -4
- package/dist/esm/lib/engine/handlers/NodeResolver.js +1 -2
- package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +1 -2
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -6
- package/dist/esm/lib/engine/narrative/ControlFlowNarrativeGenerator.js +13 -18
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +10 -11
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/esm/types/lib/builder/FlowChartBuilder.d.ts +8 -10
- package/dist/esm/types/lib/builder/types.d.ts +0 -6
- package/dist/esm/types/lib/engine/graph/StageNode.d.ts +0 -2
- package/dist/esm/types/lib/engine/narrative/ControlFlowNarrativeGenerator.d.ts +6 -6
- package/dist/esm/types/lib/engine/narrative/types.d.ts +6 -6
- package/dist/esm/types/lib/engine/types.d.ts +0 -1
- package/dist/esm/types/lib/runner/ExecutionRuntime.d.ts +0 -1
- package/dist/lib/builder/FlowChartBuilder.js +54 -91
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +5 -5
- package/dist/lib/engine/handlers/ContinuationResolver.js +6 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +4 -4
- package/dist/lib/engine/handlers/NodeResolver.js +1 -2
- package/dist/lib/engine/handlers/RuntimeStructureManager.js +1 -2
- package/dist/lib/engine/handlers/SelectorHandler.js +6 -6
- package/dist/lib/engine/narrative/ControlFlowNarrativeGenerator.js +13 -18
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +10 -11
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +8 -10
- package/dist/types/lib/builder/types.d.ts +0 -6
- package/dist/types/lib/engine/graph/StageNode.d.ts +0 -2
- package/dist/types/lib/engine/narrative/ControlFlowNarrativeGenerator.d.ts +6 -6
- package/dist/types/lib/engine/narrative/types.d.ts +6 -6
- package/dist/types/lib/engine/types.d.ts +0 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +0 -1
- package/package.json +1 -1
|
@@ -36,15 +36,13 @@ export class DeciderList {
|
|
|
36
36
|
this.reservedStepNumber = reservedStepNumber;
|
|
37
37
|
this.deciderDescription = deciderDescription;
|
|
38
38
|
}
|
|
39
|
-
addFunctionBranch(id, name, fn,
|
|
39
|
+
addFunctionBranch(id, name, fn, description) {
|
|
40
40
|
if (this.branchIds.has(id))
|
|
41
41
|
fail(`duplicate decider branch id '${id}' under '${this.curNode.name}'`);
|
|
42
42
|
this.branchIds.add(id);
|
|
43
43
|
const node = { name: name !== null && name !== void 0 ? name : id };
|
|
44
44
|
if (id)
|
|
45
45
|
node.id = id;
|
|
46
|
-
if (displayName)
|
|
47
|
-
node.displayName = displayName;
|
|
48
46
|
if (description)
|
|
49
47
|
node.description = description;
|
|
50
48
|
if (fn) {
|
|
@@ -54,8 +52,6 @@ export class DeciderList {
|
|
|
54
52
|
let spec = { name: name !== null && name !== void 0 ? name : id, type: 'stage' };
|
|
55
53
|
if (id)
|
|
56
54
|
spec.id = id;
|
|
57
|
-
if (displayName)
|
|
58
|
-
spec.displayName = displayName;
|
|
59
55
|
if (description)
|
|
60
56
|
spec.description = description;
|
|
61
57
|
spec = this.b._applyExtractorToNode(spec);
|
|
@@ -63,35 +59,34 @@ export class DeciderList {
|
|
|
63
59
|
this.curNode.children.push(node);
|
|
64
60
|
this.curSpec.children = this.curSpec.children || [];
|
|
65
61
|
this.curSpec.children.push(spec);
|
|
66
|
-
this.branchDescInfo.push({ id,
|
|
62
|
+
this.branchDescInfo.push({ id, description });
|
|
67
63
|
return this;
|
|
68
64
|
}
|
|
69
65
|
addSubFlowChartBranch(id, subflow, mountName, options) {
|
|
70
66
|
if (this.branchIds.has(id))
|
|
71
67
|
fail(`duplicate decider branch id '${id}' under '${this.curNode.name}'`);
|
|
72
68
|
this.branchIds.add(id);
|
|
73
|
-
const
|
|
69
|
+
const subflowName = mountName || id;
|
|
74
70
|
const prefixedRoot = this.b._prefixNodeTree(subflow.root, id);
|
|
75
71
|
if (!this.b._subflowDefs.has(id)) {
|
|
76
72
|
this.b._subflowDefs.set(id, { root: prefixedRoot });
|
|
77
73
|
}
|
|
78
74
|
const node = {
|
|
79
|
-
name:
|
|
75
|
+
name: subflowName,
|
|
80
76
|
id,
|
|
81
77
|
isSubflowRoot: true,
|
|
82
78
|
subflowId: id,
|
|
83
|
-
subflowName
|
|
79
|
+
subflowName,
|
|
84
80
|
};
|
|
85
81
|
if (options)
|
|
86
82
|
node.subflowMountOptions = options;
|
|
87
83
|
const spec = {
|
|
88
|
-
name:
|
|
84
|
+
name: subflowName,
|
|
89
85
|
type: 'stage',
|
|
90
86
|
id,
|
|
91
|
-
displayName,
|
|
92
87
|
isSubflowRoot: true,
|
|
93
88
|
subflowId: id,
|
|
94
|
-
subflowName
|
|
89
|
+
subflowName,
|
|
95
90
|
subflowStructure: subflow.buildTimeStructure,
|
|
96
91
|
};
|
|
97
92
|
this.curNode.children = this.curNode.children || [];
|
|
@@ -103,8 +98,8 @@ export class DeciderList {
|
|
|
103
98
|
return this;
|
|
104
99
|
}
|
|
105
100
|
addBranchList(branches) {
|
|
106
|
-
for (const { id, name, fn
|
|
107
|
-
this.addFunctionBranch(id, name, fn
|
|
101
|
+
for (const { id, name, fn } of branches) {
|
|
102
|
+
this.addFunctionBranch(id, name, fn);
|
|
108
103
|
}
|
|
109
104
|
return this;
|
|
110
105
|
}
|
|
@@ -129,7 +124,7 @@ export class DeciderList {
|
|
|
129
124
|
.filter((id) => typeof id === 'string' && id.length > 0);
|
|
130
125
|
this.curSpec.type = 'decider';
|
|
131
126
|
if (this.reservedStepNumber > 0) {
|
|
132
|
-
const deciderLabel = this.curNode.
|
|
127
|
+
const deciderLabel = this.curNode.name;
|
|
133
128
|
const branchIdList = this.branchDescInfo.map((b) => b.id).join(', ');
|
|
134
129
|
const mainLine = this.deciderDescription
|
|
135
130
|
? `${this.reservedStepNumber}. ${deciderLabel} — ${this.deciderDescription}`
|
|
@@ -139,7 +134,7 @@ export class DeciderList {
|
|
|
139
134
|
this.parentStageDescriptions.set(this.curNode.name, this.deciderDescription);
|
|
140
135
|
}
|
|
141
136
|
for (const branch of this.branchDescInfo) {
|
|
142
|
-
const branchText = branch.description
|
|
137
|
+
const branchText = branch.description;
|
|
143
138
|
if (branchText) {
|
|
144
139
|
this.parentDescriptionParts.push(` → ${branch.id}: ${branchText}`);
|
|
145
140
|
}
|
|
@@ -166,15 +161,13 @@ export class SelectorFnList {
|
|
|
166
161
|
this.reservedStepNumber = reservedStepNumber;
|
|
167
162
|
this.selectorDescription = selectorDescription;
|
|
168
163
|
}
|
|
169
|
-
addFunctionBranch(id, name, fn,
|
|
164
|
+
addFunctionBranch(id, name, fn, description) {
|
|
170
165
|
if (this.branchIds.has(id))
|
|
171
166
|
fail(`duplicate selector branch id '${id}' under '${this.curNode.name}'`);
|
|
172
167
|
this.branchIds.add(id);
|
|
173
168
|
const node = { name: name !== null && name !== void 0 ? name : id };
|
|
174
169
|
if (id)
|
|
175
170
|
node.id = id;
|
|
176
|
-
if (displayName)
|
|
177
|
-
node.displayName = displayName;
|
|
178
171
|
if (description)
|
|
179
172
|
node.description = description;
|
|
180
173
|
if (fn) {
|
|
@@ -184,8 +177,6 @@ export class SelectorFnList {
|
|
|
184
177
|
let spec = { name: name !== null && name !== void 0 ? name : id, type: 'stage' };
|
|
185
178
|
if (id)
|
|
186
179
|
spec.id = id;
|
|
187
|
-
if (displayName)
|
|
188
|
-
spec.displayName = displayName;
|
|
189
180
|
if (description)
|
|
190
181
|
spec.description = description;
|
|
191
182
|
spec = this.b._applyExtractorToNode(spec);
|
|
@@ -193,35 +184,34 @@ export class SelectorFnList {
|
|
|
193
184
|
this.curNode.children.push(node);
|
|
194
185
|
this.curSpec.children = this.curSpec.children || [];
|
|
195
186
|
this.curSpec.children.push(spec);
|
|
196
|
-
this.branchDescInfo.push({ id,
|
|
187
|
+
this.branchDescInfo.push({ id, description });
|
|
197
188
|
return this;
|
|
198
189
|
}
|
|
199
190
|
addSubFlowChartBranch(id, subflow, mountName, options) {
|
|
200
191
|
if (this.branchIds.has(id))
|
|
201
192
|
fail(`duplicate selector branch id '${id}' under '${this.curNode.name}'`);
|
|
202
193
|
this.branchIds.add(id);
|
|
203
|
-
const
|
|
194
|
+
const subflowName = mountName || id;
|
|
204
195
|
const prefixedRoot = this.b._prefixNodeTree(subflow.root, id);
|
|
205
196
|
if (!this.b._subflowDefs.has(id)) {
|
|
206
197
|
this.b._subflowDefs.set(id, { root: prefixedRoot });
|
|
207
198
|
}
|
|
208
199
|
const node = {
|
|
209
|
-
name:
|
|
200
|
+
name: subflowName,
|
|
210
201
|
id,
|
|
211
202
|
isSubflowRoot: true,
|
|
212
203
|
subflowId: id,
|
|
213
|
-
subflowName
|
|
204
|
+
subflowName,
|
|
214
205
|
};
|
|
215
206
|
if (options)
|
|
216
207
|
node.subflowMountOptions = options;
|
|
217
208
|
const spec = {
|
|
218
|
-
name:
|
|
209
|
+
name: subflowName,
|
|
219
210
|
type: 'stage',
|
|
220
211
|
id,
|
|
221
|
-
displayName,
|
|
222
212
|
isSubflowRoot: true,
|
|
223
213
|
subflowId: id,
|
|
224
|
-
subflowName
|
|
214
|
+
subflowName,
|
|
225
215
|
subflowStructure: subflow.buildTimeStructure,
|
|
226
216
|
};
|
|
227
217
|
this.curNode.children = this.curNode.children || [];
|
|
@@ -233,8 +223,8 @@ export class SelectorFnList {
|
|
|
233
223
|
return this;
|
|
234
224
|
}
|
|
235
225
|
addBranchList(branches) {
|
|
236
|
-
for (const { id, name, fn
|
|
237
|
-
this.addFunctionBranch(id, name, fn
|
|
226
|
+
for (const { id, name, fn } of branches) {
|
|
227
|
+
this.addFunctionBranch(id, name, fn);
|
|
238
228
|
}
|
|
239
229
|
return this;
|
|
240
230
|
}
|
|
@@ -250,7 +240,7 @@ export class SelectorFnList {
|
|
|
250
240
|
this.curSpec.type = 'decider';
|
|
251
241
|
this.curSpec.hasSelector = true;
|
|
252
242
|
if (this.reservedStepNumber > 0) {
|
|
253
|
-
const selectorLabel = this.curNode.
|
|
243
|
+
const selectorLabel = this.curNode.name;
|
|
254
244
|
const branchIdList = this.branchDescInfo.map((b) => b.id).join(', ');
|
|
255
245
|
const mainLine = this.selectorDescription
|
|
256
246
|
? `${this.reservedStepNumber}. ${selectorLabel} — ${this.selectorDescription}`
|
|
@@ -260,7 +250,7 @@ export class SelectorFnList {
|
|
|
260
250
|
this.parentStageDescriptions.set(this.curNode.name, this.selectorDescription);
|
|
261
251
|
}
|
|
262
252
|
for (const branch of this.branchDescInfo) {
|
|
263
|
-
const branchText = branch.description
|
|
253
|
+
const branchText = branch.description;
|
|
264
254
|
if (branchText)
|
|
265
255
|
this.parentDescriptionParts.push(` → ${branch.id}: ${branchText}`);
|
|
266
256
|
if (branch.description)
|
|
@@ -289,21 +279,20 @@ export class FlowChartBuilder {
|
|
|
289
279
|
}
|
|
290
280
|
}
|
|
291
281
|
// ── Description helpers ──
|
|
292
|
-
_appendDescriptionLine(
|
|
282
|
+
_appendDescriptionLine(name, description) {
|
|
293
283
|
this._stepCounter++;
|
|
294
284
|
this._stageStepMap.set(name, this._stepCounter);
|
|
295
|
-
const
|
|
296
|
-
const line = description ? `${this._stepCounter}. ${label} — ${description}` : `${this._stepCounter}. ${label}`;
|
|
285
|
+
const line = description ? `${this._stepCounter}. ${name} — ${description}` : `${this._stepCounter}. ${name}`;
|
|
297
286
|
this._descriptionParts.push(line);
|
|
298
287
|
if (description) {
|
|
299
288
|
this._stageDescriptions.set(name, description);
|
|
300
289
|
}
|
|
301
290
|
}
|
|
302
|
-
_appendSubflowDescription(id,
|
|
291
|
+
_appendSubflowDescription(id, name, subflow) {
|
|
303
292
|
this._stepCounter++;
|
|
304
293
|
this._stageStepMap.set(id, this._stepCounter);
|
|
305
294
|
if (subflow.description) {
|
|
306
|
-
this._descriptionParts.push(`${this._stepCounter}. [Sub-Execution: ${
|
|
295
|
+
this._descriptionParts.push(`${this._stepCounter}. [Sub-Execution: ${name}] — ${subflow.description}`);
|
|
307
296
|
const lines = subflow.description.split('\n');
|
|
308
297
|
const stepsIdx = lines.findIndex((l) => l.startsWith('Steps:'));
|
|
309
298
|
if (stepsIdx >= 0) {
|
|
@@ -314,7 +303,7 @@ export class FlowChartBuilder {
|
|
|
314
303
|
}
|
|
315
304
|
}
|
|
316
305
|
else {
|
|
317
|
-
this._descriptionParts.push(`${this._stepCounter}. [Sub-Execution: ${
|
|
306
|
+
this._descriptionParts.push(`${this._stepCounter}. [Sub-Execution: ${name}]`);
|
|
318
307
|
}
|
|
319
308
|
}
|
|
320
309
|
// ── Configuration ──
|
|
@@ -327,14 +316,12 @@ export class FlowChartBuilder {
|
|
|
327
316
|
return this;
|
|
328
317
|
}
|
|
329
318
|
// ── Linear Chaining ──
|
|
330
|
-
start(name, fn, id,
|
|
319
|
+
start(name, fn, id, description) {
|
|
331
320
|
if (this._root)
|
|
332
321
|
fail('root already defined; create a new builder');
|
|
333
322
|
const node = { name };
|
|
334
323
|
if (id)
|
|
335
324
|
node.id = id;
|
|
336
|
-
if (displayName)
|
|
337
|
-
node.displayName = displayName;
|
|
338
325
|
if (description)
|
|
339
326
|
node.description = description;
|
|
340
327
|
if (fn) {
|
|
@@ -344,8 +331,6 @@ export class FlowChartBuilder {
|
|
|
344
331
|
let spec = { name, type: 'stage' };
|
|
345
332
|
if (id)
|
|
346
333
|
spec.id = id;
|
|
347
|
-
if (displayName)
|
|
348
|
-
spec.displayName = displayName;
|
|
349
334
|
if (description)
|
|
350
335
|
spec.description = description;
|
|
351
336
|
spec = this._applyExtractorToNode(spec);
|
|
@@ -353,17 +338,15 @@ export class FlowChartBuilder {
|
|
|
353
338
|
this._rootSpec = spec;
|
|
354
339
|
this._cursor = node;
|
|
355
340
|
this._cursorSpec = spec;
|
|
356
|
-
this._appendDescriptionLine(
|
|
341
|
+
this._appendDescriptionLine(name, description);
|
|
357
342
|
return this;
|
|
358
343
|
}
|
|
359
|
-
addFunction(name, fn, id,
|
|
344
|
+
addFunction(name, fn, id, description) {
|
|
360
345
|
const cur = this._needCursor();
|
|
361
346
|
const curSpec = this._needCursorSpec();
|
|
362
347
|
const node = { name };
|
|
363
348
|
if (id)
|
|
364
349
|
node.id = id;
|
|
365
|
-
if (displayName)
|
|
366
|
-
node.displayName = displayName;
|
|
367
350
|
if (description)
|
|
368
351
|
node.description = description;
|
|
369
352
|
if (fn) {
|
|
@@ -373,8 +356,6 @@ export class FlowChartBuilder {
|
|
|
373
356
|
let spec = { name, type: 'stage' };
|
|
374
357
|
if (id)
|
|
375
358
|
spec.id = id;
|
|
376
|
-
if (displayName)
|
|
377
|
-
spec.displayName = displayName;
|
|
378
359
|
if (description)
|
|
379
360
|
spec.description = description;
|
|
380
361
|
spec = this._applyExtractorToNode(spec);
|
|
@@ -382,10 +363,10 @@ export class FlowChartBuilder {
|
|
|
382
363
|
curSpec.next = spec;
|
|
383
364
|
this._cursor = node;
|
|
384
365
|
this._cursorSpec = spec;
|
|
385
|
-
this._appendDescriptionLine(
|
|
366
|
+
this._appendDescriptionLine(name, description);
|
|
386
367
|
return this;
|
|
387
368
|
}
|
|
388
|
-
addStreamingFunction(name, streamId, fn, id,
|
|
369
|
+
addStreamingFunction(name, streamId, fn, id, description) {
|
|
389
370
|
const cur = this._needCursor();
|
|
390
371
|
const curSpec = this._needCursorSpec();
|
|
391
372
|
const node = {
|
|
@@ -395,8 +376,6 @@ export class FlowChartBuilder {
|
|
|
395
376
|
};
|
|
396
377
|
if (id)
|
|
397
378
|
node.id = id;
|
|
398
|
-
if (displayName)
|
|
399
|
-
node.displayName = displayName;
|
|
400
379
|
if (description)
|
|
401
380
|
node.description = description;
|
|
402
381
|
if (fn) {
|
|
@@ -411,8 +390,6 @@ export class FlowChartBuilder {
|
|
|
411
390
|
};
|
|
412
391
|
if (id)
|
|
413
392
|
spec.id = id;
|
|
414
|
-
if (displayName)
|
|
415
|
-
spec.displayName = displayName;
|
|
416
393
|
if (description)
|
|
417
394
|
spec.description = description;
|
|
418
395
|
spec = this._applyExtractorToNode(spec);
|
|
@@ -420,11 +397,11 @@ export class FlowChartBuilder {
|
|
|
420
397
|
curSpec.next = spec;
|
|
421
398
|
this._cursor = node;
|
|
422
399
|
this._cursorSpec = spec;
|
|
423
|
-
this._appendDescriptionLine(
|
|
400
|
+
this._appendDescriptionLine(name, description);
|
|
424
401
|
return this;
|
|
425
402
|
}
|
|
426
403
|
// ── Branching ──
|
|
427
|
-
addDeciderFunction(name, fn, id,
|
|
404
|
+
addDeciderFunction(name, fn, id, description) {
|
|
428
405
|
const cur = this._needCursor();
|
|
429
406
|
const curSpec = this._needCursorSpec();
|
|
430
407
|
if (cur.deciderFn)
|
|
@@ -432,8 +409,6 @@ export class FlowChartBuilder {
|
|
|
432
409
|
const node = { name };
|
|
433
410
|
if (id)
|
|
434
411
|
node.id = id;
|
|
435
|
-
if (displayName)
|
|
436
|
-
node.displayName = displayName;
|
|
437
412
|
if (description)
|
|
438
413
|
node.description = description;
|
|
439
414
|
node.fn = fn;
|
|
@@ -441,8 +416,6 @@ export class FlowChartBuilder {
|
|
|
441
416
|
let spec = { name, type: 'stage', hasDecider: true };
|
|
442
417
|
if (id)
|
|
443
418
|
spec.id = id;
|
|
444
|
-
if (displayName)
|
|
445
|
-
spec.displayName = displayName;
|
|
446
419
|
if (description)
|
|
447
420
|
spec.description = description;
|
|
448
421
|
spec = this._applyExtractorToNode(spec);
|
|
@@ -454,7 +427,7 @@ export class FlowChartBuilder {
|
|
|
454
427
|
this._stageStepMap.set(name, this._stepCounter);
|
|
455
428
|
return new DeciderList(this, node, spec, this._descriptionParts, this._stageDescriptions, this._stepCounter, description);
|
|
456
429
|
}
|
|
457
|
-
addSelectorFunction(name, fn, id,
|
|
430
|
+
addSelectorFunction(name, fn, id, description) {
|
|
458
431
|
const cur = this._needCursor();
|
|
459
432
|
const curSpec = this._needCursorSpec();
|
|
460
433
|
if (cur.selectorFn)
|
|
@@ -464,8 +437,6 @@ export class FlowChartBuilder {
|
|
|
464
437
|
const node = { name };
|
|
465
438
|
if (id)
|
|
466
439
|
node.id = id;
|
|
467
|
-
if (displayName)
|
|
468
|
-
node.displayName = displayName;
|
|
469
440
|
if (description)
|
|
470
441
|
node.description = description;
|
|
471
442
|
node.fn = fn;
|
|
@@ -473,8 +444,6 @@ export class FlowChartBuilder {
|
|
|
473
444
|
let spec = { name, type: 'stage', hasSelector: true };
|
|
474
445
|
if (id)
|
|
475
446
|
spec.id = id;
|
|
476
|
-
if (displayName)
|
|
477
|
-
spec.displayName = displayName;
|
|
478
447
|
if (description)
|
|
479
448
|
spec.description = description;
|
|
480
449
|
spec = this._applyExtractorToNode(spec);
|
|
@@ -495,7 +464,7 @@ export class FlowChartBuilder {
|
|
|
495
464
|
curSpec.type = 'fork';
|
|
496
465
|
if (options === null || options === void 0 ? void 0 : options.failFast)
|
|
497
466
|
cur.failFast = true;
|
|
498
|
-
for (const { id, name,
|
|
467
|
+
for (const { id, name, fn } of children) {
|
|
499
468
|
if (!id)
|
|
500
469
|
fail(`child id required under '${cur.name}'`);
|
|
501
470
|
if ((_b = cur.children) === null || _b === void 0 ? void 0 : _b.some((c) => c.id === id)) {
|
|
@@ -504,8 +473,6 @@ export class FlowChartBuilder {
|
|
|
504
473
|
const node = { name: name !== null && name !== void 0 ? name : id };
|
|
505
474
|
if (id)
|
|
506
475
|
node.id = id;
|
|
507
|
-
if (displayName)
|
|
508
|
-
node.displayName = displayName;
|
|
509
476
|
if (fn) {
|
|
510
477
|
node.fn = fn;
|
|
511
478
|
this._addToMap(name, fn);
|
|
@@ -518,15 +485,13 @@ export class FlowChartBuilder {
|
|
|
518
485
|
};
|
|
519
486
|
if (id)
|
|
520
487
|
spec.id = id;
|
|
521
|
-
if (displayName)
|
|
522
|
-
spec.displayName = displayName;
|
|
523
488
|
spec = this._applyExtractorToNode(spec);
|
|
524
489
|
cur.children = cur.children || [];
|
|
525
490
|
cur.children.push(node);
|
|
526
491
|
curSpec.children = curSpec.children || [];
|
|
527
492
|
curSpec.children.push(spec);
|
|
528
493
|
}
|
|
529
|
-
const childNames = children.map((c) => c.
|
|
494
|
+
const childNames = children.map((c) => c.name || c.id).join(', ');
|
|
530
495
|
this._stepCounter++;
|
|
531
496
|
this._descriptionParts.push(`${this._stepCounter}. Runs in parallel: ${childNames}`);
|
|
532
497
|
return this;
|
|
@@ -539,29 +504,28 @@ export class FlowChartBuilder {
|
|
|
539
504
|
if ((_a = cur.children) === null || _a === void 0 ? void 0 : _a.some((c) => c.id === id)) {
|
|
540
505
|
fail(`duplicate child id '${id}' under '${cur.name}'`);
|
|
541
506
|
}
|
|
542
|
-
const
|
|
507
|
+
const subflowName = mountName || id;
|
|
543
508
|
const forkId = (_b = cur.id) !== null && _b !== void 0 ? _b : cur.name;
|
|
544
509
|
const prefixedRoot = this._prefixNodeTree(subflow.root, id);
|
|
545
510
|
if (!this._subflowDefs.has(id)) {
|
|
546
511
|
this._subflowDefs.set(id, { root: prefixedRoot });
|
|
547
512
|
}
|
|
548
513
|
const node = {
|
|
549
|
-
name:
|
|
514
|
+
name: subflowName,
|
|
550
515
|
id,
|
|
551
516
|
isSubflowRoot: true,
|
|
552
517
|
subflowId: id,
|
|
553
|
-
subflowName
|
|
518
|
+
subflowName,
|
|
554
519
|
};
|
|
555
520
|
if (options)
|
|
556
521
|
node.subflowMountOptions = options;
|
|
557
522
|
let spec = {
|
|
558
|
-
name:
|
|
523
|
+
name: subflowName,
|
|
559
524
|
type: 'stage',
|
|
560
525
|
id,
|
|
561
|
-
displayName,
|
|
562
526
|
isSubflowRoot: true,
|
|
563
527
|
subflowId: id,
|
|
564
|
-
subflowName
|
|
528
|
+
subflowName,
|
|
565
529
|
isParallelChild: true,
|
|
566
530
|
parallelGroupId: forkId,
|
|
567
531
|
subflowStructure: subflow.buildTimeStructure,
|
|
@@ -574,7 +538,7 @@ export class FlowChartBuilder {
|
|
|
574
538
|
curSpec.children.push(spec);
|
|
575
539
|
this._mergeStageMap(subflow.stageMap, id);
|
|
576
540
|
this._mergeSubflows(subflow.subflows, id);
|
|
577
|
-
this._appendSubflowDescription(id,
|
|
541
|
+
this._appendSubflowDescription(id, subflowName, subflow);
|
|
578
542
|
return this;
|
|
579
543
|
}
|
|
580
544
|
addSubFlowChartNext(id, subflow, mountName, options) {
|
|
@@ -583,28 +547,27 @@ export class FlowChartBuilder {
|
|
|
583
547
|
if (cur.next) {
|
|
584
548
|
fail(`cannot add subflow as next when next is already defined at '${cur.name}'`);
|
|
585
549
|
}
|
|
586
|
-
const
|
|
550
|
+
const subflowName = mountName || id;
|
|
587
551
|
const prefixedRoot = this._prefixNodeTree(subflow.root, id);
|
|
588
552
|
if (!this._subflowDefs.has(id)) {
|
|
589
553
|
this._subflowDefs.set(id, { root: prefixedRoot });
|
|
590
554
|
}
|
|
591
555
|
const node = {
|
|
592
|
-
name:
|
|
556
|
+
name: subflowName,
|
|
593
557
|
id,
|
|
594
558
|
isSubflowRoot: true,
|
|
595
559
|
subflowId: id,
|
|
596
|
-
subflowName
|
|
560
|
+
subflowName,
|
|
597
561
|
};
|
|
598
562
|
if (options)
|
|
599
563
|
node.subflowMountOptions = options;
|
|
600
564
|
let attachedSpec = {
|
|
601
|
-
name:
|
|
565
|
+
name: subflowName,
|
|
602
566
|
type: 'stage',
|
|
603
567
|
id,
|
|
604
|
-
displayName,
|
|
605
568
|
isSubflowRoot: true,
|
|
606
569
|
subflowId: id,
|
|
607
|
-
subflowName
|
|
570
|
+
subflowName,
|
|
608
571
|
subflowStructure: subflow.buildTimeStructure,
|
|
609
572
|
};
|
|
610
573
|
attachedSpec = this._applyExtractorToNode(attachedSpec);
|
|
@@ -614,7 +577,7 @@ export class FlowChartBuilder {
|
|
|
614
577
|
this._cursorSpec = attachedSpec;
|
|
615
578
|
this._mergeStageMap(subflow.stageMap, id);
|
|
616
579
|
this._mergeSubflows(subflow.subflows, id);
|
|
617
|
-
this._appendSubflowDescription(id,
|
|
580
|
+
this._appendSubflowDescription(id, subflowName, subflow);
|
|
618
581
|
return this;
|
|
619
582
|
}
|
|
620
583
|
// ── Loop ──
|
|
@@ -664,14 +627,14 @@ export class FlowChartBuilder {
|
|
|
664
627
|
}
|
|
665
628
|
// ── Output ──
|
|
666
629
|
build() {
|
|
667
|
-
var _a, _b, _c, _d
|
|
630
|
+
var _a, _b, _c, _d;
|
|
668
631
|
const root = (_a = this._root) !== null && _a !== void 0 ? _a : fail('empty tree; call start() first');
|
|
669
632
|
const rootSpec = (_b = this._rootSpec) !== null && _b !== void 0 ? _b : fail('empty spec; call start() first');
|
|
670
633
|
const subflows = {};
|
|
671
634
|
for (const [key, def] of this._subflowDefs) {
|
|
672
635
|
subflows[key] = def;
|
|
673
636
|
}
|
|
674
|
-
const rootName = (
|
|
637
|
+
const rootName = (_d = (_c = this._root) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : 'FlowChart';
|
|
675
638
|
const description = this._descriptionParts.length > 0 ? `FlowChart: ${rootName}\nSteps:\n${this._descriptionParts.join('\n')}` : '';
|
|
676
639
|
return {
|
|
677
640
|
root,
|
|
@@ -788,8 +751,8 @@ export class FlowChartBuilder {
|
|
|
788
751
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
789
752
|
// Factory Function
|
|
790
753
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
791
|
-
export function flowChart(name, fn, id,
|
|
792
|
-
return new FlowChartBuilder(buildTimeExtractor).start(name, fn, id,
|
|
754
|
+
export function flowChart(name, fn, id, buildTimeExtractor, description) {
|
|
755
|
+
return new FlowChartBuilder(buildTimeExtractor).start(name, fn, id, description);
|
|
793
756
|
}
|
|
794
757
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
795
758
|
// Spec to StageNode Converter
|
|
@@ -806,4 +769,4 @@ export function specToStageNode(spec) {
|
|
|
806
769
|
};
|
|
807
770
|
return inflate(spec);
|
|
808
771
|
}
|
|
809
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQWtCSCxnRkFBZ0Y7QUFDaEYsbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUVoRixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBUyxFQUFFO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLGNBQWM7QUFDZCxnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFhdEIsWUFDRSxPQUF1QyxFQUN2QyxPQUFnQyxFQUNoQyxPQUFvQyxFQUNwQyx5QkFBbUMsRUFBRSxFQUNyQywwQkFBK0MsSUFBSSxHQUFHLEVBQUUsRUFDeEQsa0JBQWtCLEdBQUcsQ0FBQyxFQUN0QixrQkFBMkI7UUFoQlosY0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFPOUIsbUJBQWMsR0FBc0UsRUFBRSxDQUFDO1FBV3RHLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUMvQyxDQUFDO0lBRUQsaUJBQWlCLENBQ2YsRUFBVSxFQUNWLElBQVksRUFDWixFQUF3QyxFQUN4QyxXQUFv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dGVudCI6WyIvKipcbiAqIEZsb3dDaGFydEJ1aWxkZXIg4oCUIEZsdWVudCBBUEkgZm9yIGNvbnN0cnVjdGluZyBmbG93Y2hhcnQgZXhlY3V0aW9uIGdyYXBocy5cbiAqXG4gKiBCdWlsZHMgU3RhZ2VOb2RlIHRyZWVzIGFuZCBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgKEpTT04pIGluIHRhbmRlbS5cbiAqIFplcm8gZGVwZW5kZW5jaWVzIG9uIG9sZCBjb2RlIOKAlCBvbmx5IGltcG9ydHMgZnJvbSBsb2NhbCB0eXBlcy5cbiAqXG4gKiBUaGUgYnVpbGRlciBjcmVhdGVzIHR3byBwYXJhbGxlbCBzdHJ1Y3R1cmVzOlxuICogMS4gU3RhZ2VOb2RlIHRyZWUg4oCUIHJ1bnRpbWUgZ3JhcGggd2l0aCBlbWJlZGRlZCBmdW5jdGlvbnNcbiAqIDIuIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSDigJQgSlNPTi1zYWZlIHN0cnVjdHVyZSBmb3IgdmlzdWFsaXphdGlvblxuICpcbiAqIFRoZSBleGVjdXRlKCkgY29udmVuaWVuY2UgbWV0aG9kIGlzIGludGVudGlvbmFsbHkgb21pdHRlZCDigJRcbiAqIGl0IGJlbG9uZ3MgaW4gdGhlIHJ1bm5lciBsYXllciAoUGhhc2UgNSkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZFRpbWVFeHRyYWN0b3IsXG4gIEZsb3dDaGFydCxcbiAgRmxvd0NoYXJ0U3BlYyxcbiAgSUxvZ2dlcixcbiAgUGlwZWxpbmVTdGFnZUZ1bmN0aW9uLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFNpbXBsaWZpZWRQYXJhbGxlbFNwZWMsXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIsXG4gIFN0cmVhbVRva2VuSGFuZGxlcixcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgVHJhdmVyc2FsRXh0cmFjdG9yLFxufSBmcm9tICcuL3R5cGVzJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBJbnRlcm5hbCBoZWxwZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgZmFpbCA9IChtc2c6IHN0cmluZyk6IG5ldmVyID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKGBbRmxvd0NoYXJ0QnVpbGRlcl0gJHttc2d9YCk7XG59O1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIERlY2lkZXJMaXN0XG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBGbHVlbnQgaGVscGVyIHJldHVybmVkIGJ5IGFkZERlY2lkZXJGdW5jdGlvbiB0byBhZGQgYnJhbmNoZXMuXG4gKiBgZW5kKClgIHNldHMgYGRlY2lkZXJGbiA9IHRydWVgIOKAlCB0aGUgZm4gSVMgdGhlIGRlY2lkZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNpZGVyTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBiOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGRlZmF1bHRJZD86IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc2VydmVkU3RlcE51bWJlcjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY2lkZXJEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hEZXNjSW5mbzogQXJyYXk8eyBpZDogc3RyaW5nOyBkaXNwbGF5TmFtZT86IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWlsZGVyOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW10sXG4gICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCksXG4gICAgcmVzZXJ2ZWRTdGVwTnVtYmVyID0gMCxcbiAgICBkZWNpZGVyRGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMuYiA9IGJ1aWxkZXI7XG4gICAgdGhpcy5jdXJOb2RlID0gY3VyTm9kZTtcbiAgICB0aGlzLmN1clNwZWMgPSBjdXJTcGVjO1xuICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cyA9IHBhcmVudERlc2NyaXB0aW9uUGFydHM7XG4gICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucyA9IHBhcmVudFN0YWdlRGVzY3JpcHRpb25zO1xuICAgIHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID0gcmVzZXJ2ZWRTdGVwTnVtYmVyO1xuICAgIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uID0gZGVjaWRlckRlc2NyaXB0aW9uO1xuICB9XG5cbiAgYWRkRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBkZWNpZGVyIGJyYW5jaCBpZCAnJHtpZH0nIHVuZGVyICcke3RoaXMuY3VyTm9kZS5uYW1lfSdgKTtcbiAgICB0aGlzLmJyYW5jaElkcy5hZGQoaWQpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQgfTtcbiAgICBpZiAoaWQpIG5vZGUuaWQgPSBpZDtcbiAgICBpZiAoZGlzcGxheU5hbWUpIG5vZGUuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgIHRoaXMuYi5fYWRkVG9NYXAobmFtZSwgZm4pO1xuICAgIH1cblxuICAgIGxldCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWU6IG5hbWUgPz8gaWQsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoaWQpIHNwZWMuaWQgPSBpZDtcbiAgICBpZiAoZGlzcGxheU5hbWUpIHNwZWMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBzcGVjID0gdGhpcy5iLl9hcHBseUV4dHJhY3RvclRvTm9kZShzcGVjKTtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG5cbiAgICB0aGlzLmJyYW5jaERlc2NJbmZvLnB1c2goeyBpZCwgZGlzcGxheU5hbWUsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIGRlY2lkZXIgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmIuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLmIuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuYi5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBkaXNwbGF5TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogZGlzcGxheU5hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcblxuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4gPSB0aGlzLmN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuLnB1c2goc3BlYyk7XG5cbiAgICB0aGlzLmIuX21lcmdlU3RhZ2VNYXAoc3ViZmxvdy5zdGFnZU1hcCwgaWQpO1xuICAgIHRoaXMuYi5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJyYW5jaExpc3QoXG4gICAgYnJhbmNoZXM6IEFycmF5PHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmbj86IFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgICAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgfT4sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSwgZm4sIGRpc3BsYXlOYW1lIH0gb2YgYnJhbmNoZXMpIHtcbiAgICAgIHRoaXMuYWRkRnVuY3Rpb25CcmFuY2goaWQsIG5hbWUsIGZuLCBkaXNwbGF5TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0RGVmYXVsdChpZDogc3RyaW5nKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgdGhpcy5kZWZhdWx0SWQgPSBpZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVuZCgpOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuO1xuICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSBkZWNpZGVyIGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIHRoaXMuY3VyTm9kZS5kZWNpZGVyRm4gPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZGVmYXVsdElkKSB7XG4gICAgICBjb25zdCBkZWZhdWx0Q2hpbGQgPSBjaGlsZHJlbi5maW5kKChjKSA9PiBjLmlkID09PSB0aGlzLmRlZmF1bHRJZCk7XG4gICAgICBpZiAoZGVmYXVsdENoaWxkKSB7XG4gICAgICAgIGNoaWxkcmVuLnB1c2goeyAuLi5kZWZhdWx0Q2hpbGQsIGlkOiAnZGVmYXVsdCcgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdXJTcGVjLmJyYW5jaElkcyA9IGNoaWxkcmVuXG4gICAgICAubWFwKChjKSA9PiBjLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmN1clNwZWMudHlwZSA9ICdkZWNpZGVyJztcblxuICAgIGlmICh0aGlzLnJlc2VydmVkU3RlcE51bWJlciA+IDApIHtcbiAgICAgIGNvbnN0IGRlY2lkZXJMYWJlbCA9IHRoaXMuY3VyTm9kZS5kaXNwbGF5TmFtZSB8fCB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPSB0aGlzLmRlY2lkZXJEZXNjcmlwdGlvblxuICAgICAgICA/IGAke3RoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyfS4gJHtkZWNpZGVyTGFiZWx9IOKAlCAke3RoaXMuZGVjaWRlckRlc2NyaXB0aW9ufWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7ZGVjaWRlckxhYmVsfSDigJQgRGVjaWRlcyBiZXR3ZWVuOiAke2JyYW5jaElkTGlzdH1gO1xuICAgICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2gobWFpbkxpbmUpO1xuXG4gICAgICBpZiAodGhpcy5kZWNpZGVyRGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQodGhpcy5jdXJOb2RlLm5hbWUsIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uIHx8IGJyYW5jaC5kaXNwbGF5TmFtZTtcbiAgICAgICAgaWYgKGJyYW5jaFRleHQpIHtcbiAgICAgICAgICB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMucHVzaChgICAg4oaSICR7YnJhbmNoLmlkfTogJHticmFuY2hUZXh0fWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFuY2guZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldChicmFuY2guaWQsIGJyYW5jaC5kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VsZWN0b3JGbkxpc3QgKHNjb3BlLWJhc2VkIHNlbGVjdG9yIOKAlCBtaXJyb3JzIERlY2lkZXJMaXN0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RvckZuTGlzdDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBiOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzZXJ2ZWRTdGVwTnVtYmVyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0b3JEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBicmFuY2hEZXNjSW5mbzogQXJyYXk8eyBpZDogc3RyaW5nOyBkaXNwbGF5TmFtZT86IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmcgfT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWlsZGVyOiBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY3VyU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICAgIHBhcmVudERlc2NyaXB0aW9uUGFydHM6IHN0cmluZ1tdID0gW10sXG4gICAgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCksXG4gICAgcmVzZXJ2ZWRTdGVwTnVtYmVyID0gMCxcbiAgICBzZWxlY3RvckRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLmIgPSBidWlsZGVyO1xuICAgIHRoaXMuY3VyTm9kZSA9IGN1ck5vZGU7XG4gICAgdGhpcy5jdXJTcGVjID0gY3VyU3BlYztcbiAgICB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMgPSBwYXJlbnREZXNjcmlwdGlvblBhcnRzO1xuICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMgPSBwYXJlbnRTdGFnZURlc2NyaXB0aW9ucztcbiAgICB0aGlzLnJlc2VydmVkU3RlcE51bWJlciA9IHJlc2VydmVkU3RlcE51bWJlcjtcbiAgICB0aGlzLnNlbGVjdG9yRGVzY3JpcHRpb24gPSBzZWxlY3RvckRlc2NyaXB0aW9uO1xuICB9XG5cbiAgYWRkRnVuY3Rpb25CcmFuY2goXG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkIH07XG4gICAgaWYgKGlkKSBub2RlLmlkID0gaWQ7XG4gICAgaWYgKGRpc3BsYXlOYW1lKSBub2RlLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgICB0aGlzLmIuX2FkZFRvTWFwKG5hbWUsIGZuKTtcbiAgICB9XG5cbiAgICBsZXQgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlkKSBzcGVjLmlkID0gaWQ7XG4gICAgaWYgKGRpc3BsYXlOYW1lKSBzcGVjLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgc3BlYyA9IHRoaXMuYi5fYXBwbHlFeHRyYWN0b3JUb05vZGUoc3BlYyk7XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuXG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMuYi5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICBpZiAoIXRoaXMuYi5fc3ViZmxvd0RlZnMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5iLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdDogcHJlZml4ZWRSb290IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogZGlzcGxheU5hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWU6IGRpc3BsYXlOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZTogZGlzcGxheU5hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcblxuICAgIHRoaXMuYi5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5iLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQnJhbmNoTGlzdChcbiAgICBicmFuY2hlczogQXJyYXk8e1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZuPzogUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gICAgICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiwgZGlzcGxheU5hbWUgfSBvZiBicmFuY2hlcykge1xuICAgICAgdGhpcy5hZGRGdW5jdGlvbkJyYW5jaChpZCwgbmFtZSwgZm4sIGRpc3BsYXlOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlbmQoKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbRmxvd0NoYXJ0QnVpbGRlcl0gc2VsZWN0b3IgYXQgJyR7dGhpcy5jdXJOb2RlLm5hbWV9JyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYnJhbmNoYCk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJOb2RlLnNlbGVjdG9yRm4gPSB0cnVlO1xuXG4gICAgdGhpcy5jdXJTcGVjLmJyYW5jaElkcyA9IGNoaWxkcmVuXG4gICAgICAubWFwKChjKSA9PiBjLmlkKVxuICAgICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmN1clNwZWMudHlwZSA9ICdkZWNpZGVyJztcbiAgICB0aGlzLmN1clNwZWMuaGFzU2VsZWN0b3IgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyID4gMCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3JMYWJlbCA9IHRoaXMuY3VyTm9kZS5kaXNwbGF5TmFtZSB8fCB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPSB0aGlzLnNlbGVjdG9yRGVzY3JpcHRpb25cbiAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUICR7dGhpcy5zZWxlY3RvckRlc2NyaXB0aW9ufWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUIFNlbGVjdHMgZnJvbTogJHticmFuY2hJZExpc3R9YDtcbiAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKG1haW5MaW5lKTtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldCh0aGlzLmN1ck5vZGUubmFtZSwgdGhpcy5zZWxlY3RvckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uIHx8IGJyYW5jaC5kaXNwbGF5TmFtZTtcbiAgICAgICAgaWYgKGJyYW5jaFRleHQpIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICDihpIgJHticmFuY2guaWR9OiAke2JyYW5jaFRleHR9YCk7XG4gICAgICAgIGlmIChicmFuY2guZGVzY3JpcHRpb24pIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KGJyYW5jaC5pZCwgYnJhbmNoLmRlc2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iO1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmxvd0NoYXJ0QnVpbGRlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIF9yb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgX3Jvb3RTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9jdXJzb3I/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfY3Vyc29yU3BlYz86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgcHJpdmF0ZSBfc3RhZ2VNYXAgPSBuZXcgTWFwPHN0cmluZywgUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+KCk7XG4gIF9zdWJmbG93RGVmcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+KCk7XG4gIHByaXZhdGUgX3N0cmVhbUhhbmRsZXJzOiBTdHJlYW1IYW5kbGVycyA9IHt9O1xuICBwcml2YXRlIF9leHRyYWN0b3I/OiBUcmF2ZXJzYWxFeHRyYWN0b3I7XG4gIHByaXZhdGUgX2J1aWxkVGltZUV4dHJhY3Rvcj86IEJ1aWxkVGltZUV4dHJhY3Rvcjxhbnk+O1xuICBwcml2YXRlIF9idWlsZFRpbWVFeHRyYWN0b3JFcnJvcnM6IEFycmF5PHsgbWVzc2FnZTogc3RyaW5nOyBlcnJvcjogdW5rbm93biB9PiA9IFtdO1xuICBwcml2YXRlIF9lbmFibGVOYXJyYXRpdmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfbG9nZ2VyPzogSUxvZ2dlcjtcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBfc3RlcENvdW50ZXIgPSAwO1xuICBwcml2YXRlIF9zdGFnZURlc2NyaXB0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgX3N0YWdlU3RlcE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgY29uc3RydWN0b3IoYnVpbGRUaW1lRXh0cmFjdG9yPzogQnVpbGRUaW1lRXh0cmFjdG9yPGFueT4pIHtcbiAgICBpZiAoYnVpbGRUaW1lRXh0cmFjdG9yKSB7XG4gICAgICB0aGlzLl9idWlsZFRpbWVFeHRyYWN0b3IgPSBidWlsZFRpbWVFeHRyYWN0b3I7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERlc2NyaXB0aW9uIGhlbHBlcnMg4pSA4pSAXG5cbiAgcHJpdmF0ZSBfYXBwZW5kRGVzY3JpcHRpb25MaW5lKGRpc3BsYXlOYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQobmFtZSwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGNvbnN0IGxhYmVsID0gZGlzcGxheU5hbWUgfHwgbmFtZTtcbiAgICBjb25zdCBsaW5lID0gZGVzY3JpcHRpb24gPyBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bGFiZWx9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bGFiZWx9YDtcbiAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2gobGluZSk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucy5zZXQobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FwcGVuZFN1YmZsb3dEZXNjcmlwdGlvbihpZDogc3RyaW5nLCBkaXNwbGF5TmFtZTogc3RyaW5nLCBzdWJmbG93OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPik6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChpZCwgdGhpcy5fc3RlcENvdW50ZXIpO1xuICAgIGlmIChzdWJmbG93LmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLnB1c2goYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiBbU3ViLUV4ZWN1dGlvbjogJHtkaXNwbGF5TmFtZX1dIOKAlCAke3N1YmZsb3cuZGVzY3JpcHRpb259YCk7XG4gICAgICBjb25zdCBsaW5lcyA9IHN1YmZsb3cuZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3Qgc3RlcHNJZHggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3RhcnRzV2l0aCgnU3RlcHM6JykpO1xuICAgICAgaWYgKHN0ZXBzSWR4ID49IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzSWR4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSkgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICAke2xpbmVzW2ldfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtTdWItRXhlY3V0aW9uOiAke2Rpc3BsYXlOYW1lfV1gKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgQ29uZmlndXJhdGlvbiDilIDilIBcblxuICBzZXRFbmFibGVOYXJyYXRpdmUoKTogdGhpcyB7XG4gICAgdGhpcy5fZW5hYmxlTmFycmF0aXZlID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldExvZ2dlcihsb2dnZXI6IElMb2dnZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBsb2dnZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgTGluZWFyIENoYWluaW5nIOKUgOKUgFxuXG4gIHN0YXJ0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbj86IFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGlkPzogc3RyaW5nLFxuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiB0aGlzIHtcbiAgICBpZiAodGhpcy5fcm9vdCkgZmFpbCgncm9vdCBhbHJlYWR5IGRlZmluZWQ7IGNyZWF0ZSBhIG5ldyBidWlsZGVyJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSB9O1xuICAgIGlmIChpZCkgbm9kZS5pZCA9IGlkO1xuICAgIGlmIChkaXNwbGF5TmFtZSkgbm9kZS5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChmbikge1xuICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgdGhpcy5fYWRkVG9NYXAobmFtZSwgZm4pO1xuICAgIH1cblxuICAgIGxldCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoaWQpIHNwZWMuaWQgPSBpZDtcbiAgICBpZiAoZGlzcGxheU5hbWUpIHNwZWMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBzcGVjID0gdGhpcy5fYXBwbHlFeHRyYWN0b3JUb05vZGUoc3BlYyk7XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gc3BlYztcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShkaXNwbGF5TmFtZSB8fCBuYW1lLCBuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm4/OiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBpZD86IHN0cmluZyxcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUgfTtcbiAgICBpZiAoaWQpIG5vZGUuaWQgPSBpZDtcbiAgICBpZiAoZGlzcGxheU5hbWUpIG5vZGUuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgIHRoaXMuX2FkZFRvTWFwKG5hbWUsIGZuKTtcbiAgICB9XG5cbiAgICBsZXQgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlkKSBzcGVjLmlkID0gaWQ7XG4gICAgaWYgKGRpc3BsYXlOYW1lKSBzcGVjLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgc3BlYyA9IHRoaXMuX2FwcGx5RXh0cmFjdG9yVG9Ob2RlKHNwZWMpO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gc3BlYztcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShkaXNwbGF5TmFtZSB8fCBuYW1lLCBuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdHJlYW1pbmdGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RyZWFtSWQ/OiBzdHJpbmcsXG4gICAgZm4/OiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBpZD86IHN0cmluZyxcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChpZCkgbm9kZS5pZCA9IGlkO1xuICAgIGlmIChkaXNwbGF5TmFtZSkgbm9kZS5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChmbikge1xuICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgdGhpcy5fYWRkVG9NYXAobmFtZSwgZm4pO1xuICAgIH1cblxuICAgIGxldCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogJ3N0cmVhbWluZycsXG4gICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgIHN0cmVhbUlkOiBzdHJlYW1JZCA/PyBuYW1lLFxuICAgIH07XG4gICAgaWYgKGlkKSBzcGVjLmlkID0gaWQ7XG4gICAgaWYgKGRpc3BsYXlOYW1lKSBzcGVjLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgc3BlYyA9IHRoaXMuX2FwcGx5RXh0cmFjdG9yVG9Ob2RlKHNwZWMpO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gc3BlYztcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShkaXNwbGF5TmFtZSB8fCBuYW1lLCBuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgQnJhbmNoaW5nIOKUgOKUgFxuXG4gIGFkZERlY2lkZXJGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGlkPzogc3RyaW5nLFxuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLmRlY2lkZXJGbikgZmFpbChgZGVjaWRlciBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUgfTtcbiAgICBpZiAoaWQpIG5vZGUuaWQgPSBpZDtcbiAgICBpZiAoZGlzcGxheU5hbWUpIG5vZGUuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBub2RlLmZuID0gZm47XG4gICAgdGhpcy5fYWRkVG9NYXAobmFtZSwgZm4pO1xuXG4gICAgbGV0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgdHlwZTogJ3N0YWdlJywgaGFzRGVjaWRlcjogdHJ1ZSB9O1xuICAgIGlmIChpZCkgc3BlYy5pZCA9IGlkO1xuICAgIGlmIChkaXNwbGF5TmFtZSkgc3BlYy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHNwZWMgPSB0aGlzLl9hcHBseUV4dHJhY3RvclRvTm9kZShzcGVjKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fY3Vyc29yU3BlYyA9IHNwZWM7XG5cbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQobmFtZSwgdGhpcy5fc3RlcENvdW50ZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+KFxuICAgICAgdGhpcyxcbiAgICAgIG5vZGUsXG4gICAgICBzcGVjLFxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cyxcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLFxuICAgICAgdGhpcy5fc3RlcENvdW50ZXIsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICApO1xuICB9XG5cbiAgYWRkU2VsZWN0b3JGdW5jdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZm46IFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICAgIGlkPzogc3RyaW5nLFxuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApOiBTZWxlY3RvckZuTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLnNlbGVjdG9yRm4pIGZhaWwoYHNlbGVjdG9yIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5kZWNpZGVyRm4pIGZhaWwoYGRlY2lkZXIgYW5kIHNlbGVjdG9yIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWUgfTtcbiAgICBpZiAoaWQpIG5vZGUuaWQgPSBpZDtcbiAgICBpZiAoZGlzcGxheU5hbWUpIG5vZGUuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBub2RlLmZuID0gZm47XG4gICAgdGhpcy5fYWRkVG9NYXAobmFtZSwgZm4pO1xuXG4gICAgbGV0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgdHlwZTogJ3N0YWdlJywgaGFzU2VsZWN0b3I6IHRydWUgfTtcbiAgICBpZiAoaWQpIHNwZWMuaWQgPSBpZDtcbiAgICBpZiAoZGlzcGxheU5hbWUpIHNwZWMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBzcGVjID0gdGhpcy5fYXBwbHlFeHRyYWN0b3JUb05vZGUoc3BlYyk7XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2N1cnNvclNwZWMgPSBzcGVjO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQYXJhbGxlbCAoRm9yaykg4pSA4pSAXG5cbiAgYWRkTGlzdE9mRnVuY3Rpb24oY2hpbGRyZW46IFNpbXBsaWZpZWRQYXJhbGxlbFNwZWM8VE91dCwgVFNjb3BlPltdLCBvcHRpb25zPzogeyBmYWlsRmFzdD86IGJvb2xlYW4gfSk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcbiAgICBjb25zdCBmb3JrSWQgPSBjdXIuaWQgPz8gY3VyLm5hbWU7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgaWYgKG9wdGlvbnM/LmZhaWxGYXN0KSBjdXIuZmFpbEZhc3QgPSB0cnVlO1xuXG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBkaXNwbGF5TmFtZSwgZm4gfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQgfTtcbiAgICAgIGlmIChpZCkgbm9kZS5pZCA9IGlkO1xuICAgICAgaWYgKGRpc3BsYXlOYW1lKSBub2RlLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgICB0aGlzLl9hZGRUb01hcChuYW1lLCBmbik7XG4gICAgICB9XG5cbiAgICAgIGxldCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICAgIG5hbWU6IG5hbWUgPz8gaWQsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgICAgcGFyYWxsZWxHcm91cElkOiBmb3JrSWQsXG4gICAgICB9O1xuICAgICAgaWYgKGlkKSBzcGVjLmlkID0gaWQ7XG4gICAgICBpZiAoZGlzcGxheU5hbWUpIHNwZWMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICAgIHNwZWMgPSB0aGlzLl9hcHBseUV4dHJhY3RvclRvTm9kZShzcGVjKTtcblxuICAgICAgY3VyLmNoaWxkcmVuID0gY3VyLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICBjdXJTcGVjLmNoaWxkcmVuID0gY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZE5hbWVzID0gY2hpbGRyZW4ubWFwKChjKSA9PiBjLmRpc3BsYXlOYW1lIHx8IGMubmFtZSB8fCBjLmlkKS5qb2luKCcsICcpO1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gUnVucyBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3ViZmxvdyBNb3VudGluZyDilIDilIBcblxuICBhZGRTdWJGbG93Q2hhcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZCA/PyBjdXIubmFtZTtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLl9wcmVmaXhOb2RlVHJlZShzdWJmbG93LnJvb3QsIGlkKTtcblxuICAgIGlmICghdGhpcy5fc3ViZmxvd0RlZnMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBkaXNwbGF5TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgbGV0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIGlzUGFyYWxsZWxDaGlsZDogdHJ1ZSxcbiAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcbiAgICBzcGVjID0gdGhpcy5fYXBwbHlFeHRyYWN0b3JUb05vZGUoc3BlYyk7XG5cbiAgICBjdXJTcGVjLnR5cGUgPSAnZm9yayc7XG4gICAgY3VyLmNoaWxkcmVuID0gY3VyLmNoaWxkcmVuIHx8IFtdO1xuICAgIGN1ci5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIGN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcblxuICAgIHRoaXMuX21lcmdlU3RhZ2VNYXAoc3ViZmxvdy5zdGFnZU1hcCwgaWQpO1xuICAgIHRoaXMuX21lcmdlU3ViZmxvd3Moc3ViZmxvdy5zdWJmbG93cywgaWQpO1xuICAgIHRoaXMuX2FwcGVuZFN1YmZsb3dEZXNjcmlwdGlvbihpZCwgZGlzcGxheU5hbWUsIHN1YmZsb3cpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRTdWJGbG93Q2hhcnROZXh0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG5cbiAgICBpZiAoY3VyLm5leHQpIHtcbiAgICAgIGZhaWwoYGNhbm5vdCBhZGQgc3ViZmxvdyBhcyBuZXh0IHdoZW4gbmV4dCBpcyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdDogcHJlZml4ZWRSb290IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogZGlzcGxheU5hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWU6IGRpc3BsYXlOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBsZXQgYXR0YWNoZWRTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZTogZGlzcGxheU5hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuICAgIGF0dGFjaGVkU3BlYyA9IHRoaXMuX2FwcGx5RXh0cmFjdG9yVG9Ob2RlKGF0dGFjaGVkU3BlYyk7XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gYXR0YWNoZWRTcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fY3Vyc29yU3BlYyA9IGF0dGFjaGVkU3BlYztcblxuICAgIHRoaXMuX21lcmdlU3RhZ2VNYXAoc3ViZmxvdy5zdGFnZU1hcCwgaWQpO1xuICAgIHRoaXMuX21lcmdlU3ViZmxvd3Moc3ViZmxvdy5zdWJmbG93cywgaWQpO1xuICAgIHRoaXMuX2FwcGVuZFN1YmZsb3dEZXNjcmlwdGlvbihpZCwgZGlzcGxheU5hbWUsIHN1YmZsb3cpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgTG9vcCDilIDilIBcblxuICBsb29wVG8oc3RhZ2VJZDogc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1clNwZWMubG9vcFRhcmdldCkgZmFpbChgbG9vcFRvIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgaWYgKGN1ci5uZXh0KSBmYWlsKGBjYW5ub3Qgc2V0IGxvb3BUbyB3aGVuIG5leHQgaXMgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGN1ci5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCB9O1xuICAgIGN1clNwZWMubG9vcFRhcmdldCA9IHN0YWdlSWQ7XG4gICAgY3VyU3BlYy5uZXh0ID0geyBuYW1lOiBzdGFnZUlkLCBpZDogc3RhZ2VJZCwgdHlwZTogJ3N0YWdlJyB9O1xuXG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IHRoaXMuX3N0YWdlU3RlcE1hcC5nZXQoc3RhZ2VJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byBzdGVwICR7dGFyZ2V0U3RlcH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGDihpIgbG9vcHMgYmFjayB0byAke3N0YWdlSWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3RyZWFtaW5nIOKUgOKUgFxuXG4gIG9uU3RyZWFtKGhhbmRsZXI6IFN0cmVhbVRva2VuSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uVG9rZW4gPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1TdGFydChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25TdGFydCA9IGhhbmRsZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvblN0cmVhbUVuZChoYW5kbGVyOiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RyZWFtSGFuZGxlcnMub25FbmQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIEV4dHJhY3RvcnMg4pSA4pSAXG5cbiAgYWRkVHJhdmVyc2FsRXh0cmFjdG9yPFRSZXN1bHQgPSB1bmtub3duPihleHRyYWN0b3I6IFRyYXZlcnNhbEV4dHJhY3RvcjxUUmVzdWx0Pik6IHRoaXMge1xuICAgIHRoaXMuX2V4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZEJ1aWxkVGltZUV4dHJhY3RvcjxUUmVzdWx0ID0gRmxvd0NoYXJ0U3BlYz4oZXh0cmFjdG9yOiBCdWlsZFRpbWVFeHRyYWN0b3I8VFJlc3VsdD4pOiB0aGlzIHtcbiAgICB0aGlzLl9idWlsZFRpbWVFeHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXRCdWlsZFRpbWVFeHRyYWN0b3JFcnJvcnMoKTogQXJyYXk8eyBtZXNzYWdlOiBzdHJpbmc7IGVycm9yOiB1bmtub3duIH0+IHtcbiAgICByZXR1cm4gdGhpcy5fYnVpbGRUaW1lRXh0cmFjdG9yRXJyb3JzO1xuICB9XG5cbiAgLy8g4pSA4pSAIE91dHB1dCDilIDilIBcblxuICBidWlsZCgpOiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuX3Jvb3QgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgY29uc3Qgcm9vdFNwZWMgPSB0aGlzLl9yb290U3BlYyA/PyBmYWlsKCdlbXB0eSBzcGVjOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIHRoaXMuX3N1YmZsb3dEZWZzKSB7XG4gICAgICBzdWJmbG93c1trZXldID0gZGVmO1xuICAgIH1cblxuICAgIGNvbnN0IHJvb3ROYW1lID0gdGhpcy5fcm9vdD8uZGlzcGxheU5hbWUgPz8gdGhpcy5fcm9vdD8ubmFtZSA/PyAnRmxvd0NoYXJ0JztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLmxlbmd0aCA+IDAgPyBgRmxvd0NoYXJ0OiAke3Jvb3ROYW1lfVxcblN0ZXBzOlxcbiR7dGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5qb2luKCdcXG4nKX1gIDogJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcm9vdCxcbiAgICAgIHN0YWdlTWFwOiB0aGlzLl9zdGFnZU1hcCxcbiAgICAgIGV4dHJhY3RvcjogdGhpcy5fZXh0cmFjdG9yLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiByb290U3BlYyxcbiAgICAgIC4uLihPYmplY3Qua2V5cyhzdWJmbG93cykubGVuZ3RoID4gMCA/IHsgc3ViZmxvd3MgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9lbmFibGVOYXJyYXRpdmUgPyB7IGVuYWJsZU5hcnJhdGl2ZTogdHJ1ZSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuX2xvZ2dlciA/IHsgbG9nZ2VyOiB0aGlzLl9sb2dnZXIgfSA6IHt9KSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgc3RhZ2VEZXNjcmlwdGlvbnM6IG5ldyBNYXAodGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMpLFxuICAgIH07XG4gIH1cblxuICB0b1NwZWM8VFJlc3VsdCA9IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZT4oKTogVFJlc3VsdCB7XG4gICAgY29uc3Qgcm9vdFNwZWMgPSB0aGlzLl9yb290U3BlYyA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgICByZXR1cm4gcm9vdFNwZWMgYXMgVFJlc3VsdDtcbiAgfVxuXG4gIHRvTWVybWFpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFsnZmxvd2NoYXJ0IFREJ107XG4gICAgY29uc3QgaWRPZiA9IChrOiBzdHJpbmcpID0+IChrIHx8ICcnKS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csICdfJykgfHwgJ18nO1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuXG4gICAgY29uc3Qgd2FsayA9IChuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPikgPT4ge1xuICAgICAgY29uc3QgbmlkID0gaWRPZihuLmlkID8/IG4ubmFtZSk7XG4gICAgICBsaW5lcy5wdXNoKGAke25pZH1bXCIke24ubmFtZX1cIl1gKTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBuLmNoaWxkcmVuIHx8IFtdKSB7XG4gICAgICAgIGNvbnN0IGNpZCA9IGlkT2YoYy5pZCA/PyBjLm5hbWUpO1xuICAgICAgICBsaW5lcy5wdXNoKGAke25pZH0gLS0+ICR7Y2lkfWApO1xuICAgICAgICB3YWxrKGMpO1xuICAgICAgfVxuICAgICAgaWYgKG4ubmV4dCkge1xuICAgICAgICBjb25zdCBtaWQgPSBpZE9mKG4ubmV4dC5pZCA/PyBuLm5leHQubmFtZSk7XG4gICAgICAgIGxpbmVzLnB1c2goYCR7bmlkfSAtLT4gJHttaWR9YCk7XG4gICAgICAgIHdhbGsobi5uZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsocm9vdCk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFscyAoZXhwb3NlZCBmb3IgaGVscGVyIGNsYXNzZXMpIOKUgOKUgFxuXG4gIHByaXZhdGUgX25lZWRDdXJzb3IoKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB0aGlzLl9jdXJzb3IgPz8gZmFpbCgnY3Vyc29yIHVuZGVmaW5lZDsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gIH1cblxuICBwcml2YXRlIF9uZWVkQ3Vyc29yU3BlYygpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUge1xuICAgIHJldHVybiB0aGlzLl9jdXJzb3JTcGVjID8/IGZhaWwoJ2N1cnNvciB1bmRlZmluZWQ7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICB9XG5cbiAgX2FwcGx5RXh0cmFjdG9yVG9Ob2RlKHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gICAgaWYgKCF0aGlzLl9idWlsZFRpbWVFeHRyYWN0b3IpIHJldHVybiBzcGVjO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fYnVpbGRUaW1lRXh0cmFjdG9yKHNwZWMgYXMgYW55KSBhcyBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5fYnVpbGRUaW1lRXh0cmFjdG9yRXJyb3JzLnB1c2goe1xuICAgICAgICBtZXNzYWdlOiBlcnJvcj8ubWVzc2FnZSA/PyBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNwZWM7XG4gICAgfVxuICB9XG5cbiAgX2FkZFRvTWFwKG5hbWU6IHN0cmluZywgZm46IFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+KSB7XG4gICAgaWYgKHRoaXMuX3N0YWdlTWFwLmhhcyhuYW1lKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLl9zdGFnZU1hcC5nZXQobmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcgIT09IGZuKSBmYWlsKGBzdGFnZU1hcCBjb2xsaXNpb24gZm9yICcke25hbWV9J2ApO1xuICAgIH1cbiAgICB0aGlzLl9zdGFnZU1hcC5zZXQobmFtZSwgZm4pO1xuICB9XG5cbiAgX21lcmdlU3RhZ2VNYXAob3RoZXI6IE1hcDxzdHJpbmcsIFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PiwgcHJlZml4Pzogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2Ygb3RoZXIpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0vJHtrfWAgOiBrO1xuICAgICAgaWYgKHRoaXMuX3N0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fc3RhZ2VNYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmIChleGlzdGluZyAhPT0gdikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIHdoaWxlIG1vdW50aW5nIGZsb3djaGFydCBhdCAnJHtrZXl9J2ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhZ2VNYXAuc2V0KGtleSwgdik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3ByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAoIW5vZGUpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IGNsb25lOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ubm9kZSB9O1xuICAgIGNsb25lLm5hbWUgPSBgJHtwcmVmaXh9LyR7bm9kZS5uYW1lfWA7XG4gICAgaWYgKGNsb25lLnN1YmZsb3dJZCkgY2xvbmUuc3ViZmxvd0lkID0gYCR7cHJlZml4fS8ke2Nsb25lLnN1YmZsb3dJZH1gO1xuICAgIGlmIChjbG9uZS5uZXh0KSBjbG9uZS5uZXh0ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoY2xvbmUubmV4dCwgcHJlZml4KTtcbiAgICBpZiAoY2xvbmUuY2hpbGRyZW4pIHtcbiAgICAgIGNsb25lLmNoaWxkcmVuID0gY2xvbmUuY2hpbGRyZW4ubWFwKChjKSA9PiB0aGlzLl9wcmVmaXhOb2RlVHJlZShjLCBwcmVmaXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgX21lcmdlU3ViZmxvd3Moc3ViZmxvd3M6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4gfCB1bmRlZmluZWQsIHByZWZpeDogc3RyaW5nKSB7XG4gICAgaWYgKCFzdWJmbG93cykgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93cykpIHtcbiAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gYCR7cHJlZml4fS8ke2tleX1gO1xuICAgICAgaWYgKCF0aGlzLl9zdWJmbG93RGVmcy5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChwcmVmaXhlZEtleSwge1xuICAgICAgICAgIHJvb3Q6IHRoaXMuX3ByZWZpeE5vZGVUcmVlKGRlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGYWN0b3J5IEZ1bmN0aW9uXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGZ1bmN0aW9uIGZsb3dDaGFydDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+KFxuICBuYW1lOiBzdHJpbmcsXG4gIGZuPzogUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gIGlkPzogc3RyaW5nLFxuICBkaXNwbGF5TmFtZT86IHN0cmluZyxcbiAgYnVpbGRUaW1lRXh0cmFjdG9yPzogQnVpbGRUaW1lRXh0cmFjdG9yPGFueT4sXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oYnVpbGRUaW1lRXh0cmFjdG9yKS5zdGFydChuYW1lLCBmbiwgaWQsIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbik7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU3BlYyB0byBTdGFnZU5vZGUgQ29udmVydGVyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGZ1bmN0aW9uIHNwZWNUb1N0YWdlTm9kZShzcGVjOiBGbG93Q2hhcnRTcGVjKTogU3RhZ2VOb2RlPGFueSwgYW55PiB7XG4gIGNvbnN0IGluZmxhdGUgPSAoczogRmxvd0NoYXJ0U3BlYyk6IFN0YWdlTm9kZTxhbnksIGFueT4gPT4gKHtcbiAgICBuYW1lOiBzLm5hbWUsXG4gICAgaWQ6IHMuaWQsXG4gICAgY2hpbGRyZW46IHMuY2hpbGRyZW4/Lmxlbmd0aCA/IHMuY2hpbGRyZW4ubWFwKGluZmxhdGUpIDogdW5kZWZpbmVkLFxuICAgIG5leHQ6IHMubmV4dCA/IGluZmxhdGUocy5uZXh0KSA6IHVuZGVmaW5lZCxcbiAgfSk7XG4gIHJldHVybiBpbmZsYXRlKHNwZWMpO1xufVxuIl19
|
|
772
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0QnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvYnVpbGRlci9GbG93Q2hhcnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQWtCSCxnRkFBZ0Y7QUFDaEYsbUJBQW1CO0FBQ25CLGdGQUFnRjtBQUVoRixNQUFNLElBQUksR0FBRyxDQUFDLEdBQVcsRUFBUyxFQUFFO0lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLGNBQWM7QUFDZCxnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFhdEIsWUFDRSxPQUF1QyxFQUN2QyxPQUFnQyxFQUNoQyxPQUFvQyxFQUNwQyx5QkFBbUMsRUFBRSxFQUNyQywwQkFBK0MsSUFBSSxHQUFHLEVBQUUsRUFDeEQsa0JBQWtCLEdBQUcsQ0FBQyxFQUN0QixrQkFBMkI7UUFoQlosY0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFPOUIsbUJBQWMsR0FBZ0QsRUFBRSxDQUFDO1FBV2hGLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztJQUMvQyxDQUFDO0lBRUQsaUJBQWlCLENBQ2YsRUFBVSxFQUNWLElBQVksRUFDWixFQUF3QyxFQUN4QyxXQUFv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LENBQWdCLEVBQXVCLEVBQUU7O1FBQUMsT0FBQSxDQUFDO1lBQzFELElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtZQUNaLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLFFBQVEsRUFBRSxDQUFBLE1BQUEsQ0FBQyxDQUFDLFFBQVEsMENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNsRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUMzQyxDQUFDLENBQUE7S0FBQSxDQUFDO0lBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0QnVpbGRlciDigJQgRmx1ZW50IEFQSSBmb3IgY29uc3RydWN0aW5nIGZsb3djaGFydCBleGVjdXRpb24gZ3JhcGhzLlxuICpcbiAqIEJ1aWxkcyBTdGFnZU5vZGUgdHJlZXMgYW5kIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSAoSlNPTikgaW4gdGFuZGVtLlxuICogWmVybyBkZXBlbmRlbmNpZXMgb24gb2xkIGNvZGUg4oCUIG9ubHkgaW1wb3J0cyBmcm9tIGxvY2FsIHR5cGVzLlxuICpcbiAqIFRoZSBidWlsZGVyIGNyZWF0ZXMgdHdvIHBhcmFsbGVsIHN0cnVjdHVyZXM6XG4gKiAxLiBTdGFnZU5vZGUgdHJlZSDigJQgcnVudGltZSBncmFwaCB3aXRoIGVtYmVkZGVkIGZ1bmN0aW9uc1xuICogMi4gU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIOKAlCBKU09OLXNhZmUgc3RydWN0dXJlIGZvciB2aXN1YWxpemF0aW9uXG4gKlxuICogVGhlIGV4ZWN1dGUoKSBjb252ZW5pZW5jZSBtZXRob2QgaXMgaW50ZW50aW9uYWxseSBvbWl0dGVkIOKAlFxuICogaXQgYmVsb25ncyBpbiB0aGUgcnVubmVyIGxheWVyIChQaGFzZSA1KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEJ1aWxkVGltZUV4dHJhY3RvcixcbiAgRmxvd0NoYXJ0LFxuICBGbG93Q2hhcnRTcGVjLFxuICBJTG9nZ2VyLFxuICBQaXBlbGluZVN0YWdlRnVuY3Rpb24sXG4gIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgU2ltcGxpZmllZFBhcmFsbGVsU3BlYyxcbiAgU3RhZ2VOb2RlLFxuICBTdHJlYW1IYW5kbGVycyxcbiAgU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcixcbiAgU3RyZWFtVG9rZW5IYW5kbGVyLFxuICBTdWJmbG93TW91bnRPcHRpb25zLFxuICBUcmF2ZXJzYWxFeHRyYWN0b3IsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEludGVybmFsIGhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBmYWlsID0gKG1zZzogc3RyaW5nKTogbmV2ZXIgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYFtGbG93Q2hhcnRCdWlsZGVyXSAke21zZ31gKTtcbn07XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGVjaWRlckxpc3Rcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEZsdWVudCBoZWxwZXIgcmV0dXJuZWQgYnkgYWRkRGVjaWRlckZ1bmN0aW9uIHRvIGFkZCBicmFuY2hlcy5cbiAqIGBlbmQoKWAgc2V0cyBgZGVjaWRlckZuID0gdHJ1ZWAg4oCUIHRoZSBmbiBJUyB0aGUgZGVjaWRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2lkZXJMaXN0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgZGVmYXVsdElkPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50RGVzY3JpcHRpb25QYXJ0czogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzZXJ2ZWRTdGVwTnVtYmVyOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaWRlckRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaERlc2NJbmZvOiBBcnJheTx7IGlkOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVpbGRlcjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+LFxuICAgIGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHBhcmVudFN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpLFxuICAgIHJlc2VydmVkU3RlcE51bWJlciA9IDAsXG4gICAgZGVjaWRlckRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLmIgPSBidWlsZGVyO1xuICAgIHRoaXMuY3VyTm9kZSA9IGN1ck5vZGU7XG4gICAgdGhpcy5jdXJTcGVjID0gY3VyU3BlYztcbiAgICB0aGlzLnBhcmVudERlc2NyaXB0aW9uUGFydHMgPSBwYXJlbnREZXNjcmlwdGlvblBhcnRzO1xuICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMgPSBwYXJlbnRTdGFnZURlc2NyaXB0aW9ucztcbiAgICB0aGlzLnJlc2VydmVkU3RlcE51bWJlciA9IHJlc2VydmVkU3RlcE51bWJlcjtcbiAgICB0aGlzLmRlY2lkZXJEZXNjcmlwdGlvbiA9IGRlY2lkZXJEZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGFkZEZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuPzogUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgZGVjaWRlciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lOiBuYW1lID8/IGlkIH07XG4gICAgaWYgKGlkKSBub2RlLmlkID0gaWQ7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgICB0aGlzLmIuX2FkZFRvTWFwKG5hbWUsIGZuKTtcbiAgICB9XG5cbiAgICBsZXQgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0geyBuYW1lOiBuYW1lID8/IGlkLCB0eXBlOiAnc3RhZ2UnIH07XG4gICAgaWYgKGlkKSBzcGVjLmlkID0gaWQ7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgc3BlYyA9IHRoaXMuYi5fYXBwbHlFeHRyYWN0b3JUb05vZGUoc3BlYyk7XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuXG4gICAgdGhpcy5icmFuY2hEZXNjSW5mby5wdXNoKHsgaWQsIGRlc2NyaXB0aW9uIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3ViZmxvdzogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgbW91bnROYW1lPzogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBTdWJmbG93TW91bnRPcHRpb25zLFxuICApOiBEZWNpZGVyTGlzdDxUT3V0LCBUU2NvcGU+IHtcbiAgICBpZiAodGhpcy5icmFuY2hJZHMuaGFzKGlkKSkgZmFpbChgZHVwbGljYXRlIGRlY2lkZXIgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG1vdW50TmFtZSB8fCBpZDtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLmIuX3ByZWZpeE5vZGVUcmVlKHN1YmZsb3cucm9vdCwgaWQpO1xuXG4gICAgaWYgKCF0aGlzLmIuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuYi5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcblxuICAgIHRoaXMuYi5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5iLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkQnJhbmNoTGlzdChcbiAgICBicmFuY2hlczogQXJyYXk8e1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZuPzogUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gICAgfT4sXG4gICk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSwgZm4gfSBvZiBicmFuY2hlcykge1xuICAgICAgdGhpcy5hZGRGdW5jdGlvbkJyYW5jaChpZCwgbmFtZSwgZm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERlZmF1bHQoaWQ6IHN0cmluZyk6IERlY2lkZXJMaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIHRoaXMuZGVmYXVsdElkID0gaWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBlbmQoKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY3VyTm9kZS5jaGlsZHJlbjtcbiAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBbRmxvd0NoYXJ0QnVpbGRlcl0gZGVjaWRlciBhdCAnJHt0aGlzLmN1ck5vZGUubmFtZX0nIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBicmFuY2hgKTtcbiAgICB9XG5cbiAgICB0aGlzLmN1ck5vZGUuZGVjaWRlckZuID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLmRlZmF1bHRJZCkge1xuICAgICAgY29uc3QgZGVmYXVsdENoaWxkID0gY2hpbGRyZW4uZmluZCgoYykgPT4gYy5pZCA9PT0gdGhpcy5kZWZhdWx0SWQpO1xuICAgICAgaWYgKGRlZmF1bHRDaGlsZCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKHsgLi4uZGVmYXVsdENoaWxkLCBpZDogJ2RlZmF1bHQnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3VyU3BlYy5icmFuY2hJZHMgPSBjaGlsZHJlblxuICAgICAgLm1hcCgoYykgPT4gYy5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jdXJTcGVjLnR5cGUgPSAnZGVjaWRlcic7XG5cbiAgICBpZiAodGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXIgPiAwKSB7XG4gICAgICBjb25zdCBkZWNpZGVyTGFiZWwgPSB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPSB0aGlzLmRlY2lkZXJEZXNjcmlwdGlvblxuICAgICAgICA/IGAke3RoaXMucmVzZXJ2ZWRTdGVwTnVtYmVyfS4gJHtkZWNpZGVyTGFiZWx9IOKAlCAke3RoaXMuZGVjaWRlckRlc2NyaXB0aW9ufWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7ZGVjaWRlckxhYmVsfSDigJQgRGVjaWRlcyBiZXR3ZWVuOiAke2JyYW5jaElkTGlzdH1gO1xuICAgICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2gobWFpbkxpbmUpO1xuXG4gICAgICBpZiAodGhpcy5kZWNpZGVyRGVzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQodGhpcy5jdXJOb2RlLm5hbWUsIHRoaXMuZGVjaWRlckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoYnJhbmNoVGV4dCkge1xuICAgICAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICDihpIgJHticmFuY2guaWR9OiAke2JyYW5jaFRleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgIHRoaXMucGFyZW50U3RhZ2VEZXNjcmlwdGlvbnMuc2V0KGJyYW5jaC5pZCwgYnJhbmNoLmRlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmI7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTZWxlY3RvckZuTGlzdCAoc2NvcGUtYmFzZWQgc2VsZWN0b3Ig4oCUIG1pcnJvcnMgRGVjaWRlckxpc3QpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRm5MaXN0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGI6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJTcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdGFnZURlc2NyaXB0aW9uczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNlcnZlZFN0ZXBOdW1iZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaERlc2NJbmZvOiBBcnJheTx7IGlkOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH0+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYnVpbGRlcjogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+LFxuICAgIGN1ck5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGN1clNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgICBwYXJlbnREZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHBhcmVudFN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpLFxuICAgIHJlc2VydmVkU3RlcE51bWJlciA9IDAsXG4gICAgc2VsZWN0b3JEZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5iID0gYnVpbGRlcjtcbiAgICB0aGlzLmN1ck5vZGUgPSBjdXJOb2RlO1xuICAgIHRoaXMuY3VyU3BlYyA9IGN1clNwZWM7XG4gICAgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzID0gcGFyZW50RGVzY3JpcHRpb25QYXJ0cztcbiAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zID0gcGFyZW50U3RhZ2VEZXNjcmlwdGlvbnM7XG4gICAgdGhpcy5yZXNlcnZlZFN0ZXBOdW1iZXIgPSByZXNlcnZlZFN0ZXBOdW1iZXI7XG4gICAgdGhpcy5zZWxlY3RvckRlc2NyaXB0aW9uID0gc2VsZWN0b3JEZXNjcmlwdGlvbjtcbiAgfVxuXG4gIGFkZEZ1bmN0aW9uQnJhbmNoKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuPzogUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4ge1xuICAgIGlmICh0aGlzLmJyYW5jaElkcy5oYXMoaWQpKSBmYWlsKGBkdXBsaWNhdGUgc2VsZWN0b3IgYnJhbmNoIGlkICcke2lkfScgdW5kZXIgJyR7dGhpcy5jdXJOb2RlLm5hbWV9J2ApO1xuICAgIHRoaXMuYnJhbmNoSWRzLmFkZChpZCk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZTogbmFtZSA/PyBpZCB9O1xuICAgIGlmIChpZCkgbm9kZS5pZCA9IGlkO1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChmbikge1xuICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgdGhpcy5iLl9hZGRUb01hcChuYW1lLCBmbik7XG4gICAgfVxuXG4gICAgbGV0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZTogbmFtZSA/PyBpZCwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChpZCkgc3BlYy5pZCA9IGlkO1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHNwZWMgPSB0aGlzLmIuX2FwcGx5RXh0cmFjdG9yVG9Ob2RlKHNwZWMpO1xuXG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuID0gdGhpcy5jdXJOb2RlLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyTm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbiA9IHRoaXMuY3VyU3BlYy5jaGlsZHJlbiB8fCBbXTtcbiAgICB0aGlzLmN1clNwZWMuY2hpbGRyZW4ucHVzaChzcGVjKTtcblxuICAgIHRoaXMuYnJhbmNoRGVzY0luZm8ucHVzaCh7IGlkLCBkZXNjcmlwdGlvbiB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydEJyYW5jaChcbiAgICBpZDogc3RyaW5nLFxuICAgIHN1YmZsb3c6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIG1vdW50TmFtZT86IHN0cmluZyxcbiAgICBvcHRpb25zPzogU3ViZmxvd01vdW50T3B0aW9ucyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKHRoaXMuYnJhbmNoSWRzLmhhcyhpZCkpIGZhaWwoYGR1cGxpY2F0ZSBzZWxlY3RvciBicmFuY2ggaWQgJyR7aWR9JyB1bmRlciAnJHt0aGlzLmN1ck5vZGUubmFtZX0nYCk7XG4gICAgdGhpcy5icmFuY2hJZHMuYWRkKGlkKTtcblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IHByZWZpeGVkUm9vdCA9IHRoaXMuYi5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICBpZiAoIXRoaXMuYi5fc3ViZmxvd0RlZnMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5iLl9zdWJmbG93RGVmcy5zZXQoaWQsIHsgcm9vdDogcHJlZml4ZWRSb290IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICBpZCxcbiAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICBzdWJmbG93SWQ6IGlkLFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucykgbm9kZS5zdWJmbG93TW91bnRPcHRpb25zID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgdHlwZTogJ3N0YWdlJyxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dTdHJ1Y3R1cmU6IHN1YmZsb3cuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgIH07XG5cbiAgICB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW4gfHwgW107XG4gICAgdGhpcy5jdXJOb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgdGhpcy5jdXJTcGVjLmNoaWxkcmVuID0gdGhpcy5jdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgIHRoaXMuY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuXG4gICAgdGhpcy5iLl9tZXJnZVN0YWdlTWFwKHN1YmZsb3cuc3RhZ2VNYXAsIGlkKTtcbiAgICB0aGlzLmIuX21lcmdlU3ViZmxvd3Moc3ViZmxvdy5zdWJmbG93cywgaWQpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRCcmFuY2hMaXN0KFxuICAgIGJyYW5jaGVzOiBBcnJheTx7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZm4/OiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPjtcbiAgICB9PixcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgZm9yIChjb25zdCB7IGlkLCBuYW1lLCBmbiB9IG9mIGJyYW5jaGVzKSB7XG4gICAgICB0aGlzLmFkZEZ1bmN0aW9uQnJhbmNoKGlkLCBuYW1lLCBmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZW5kKCk6IEZsb3dDaGFydEJ1aWxkZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmN1ck5vZGUuY2hpbGRyZW47XG4gICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0Zsb3dDaGFydEJ1aWxkZXJdIHNlbGVjdG9yIGF0ICcke3RoaXMuY3VyTm9kZS5uYW1lfScgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGJyYW5jaGApO1xuICAgIH1cblxuICAgIHRoaXMuY3VyTm9kZS5zZWxlY3RvckZuID0gdHJ1ZTtcblxuICAgIHRoaXMuY3VyU3BlYy5icmFuY2hJZHMgPSBjaGlsZHJlblxuICAgICAgLm1hcCgoYykgPT4gYy5pZClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jdXJTcGVjLnR5cGUgPSAnZGVjaWRlcic7XG4gICAgdGhpcy5jdXJTcGVjLmhhc1NlbGVjdG9yID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnJlc2VydmVkU3RlcE51bWJlciA+IDApIHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yTGFiZWwgPSB0aGlzLmN1ck5vZGUubmFtZTtcbiAgICAgIGNvbnN0IGJyYW5jaElkTGlzdCA9IHRoaXMuYnJhbmNoRGVzY0luZm8ubWFwKChiKSA9PiBiLmlkKS5qb2luKCcsICcpO1xuICAgICAgY29uc3QgbWFpbkxpbmUgPSB0aGlzLnNlbGVjdG9yRGVzY3JpcHRpb25cbiAgICAgICAgPyBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUICR7dGhpcy5zZWxlY3RvckRlc2NyaXB0aW9ufWBcbiAgICAgICAgOiBgJHt0aGlzLnJlc2VydmVkU3RlcE51bWJlcn0uICR7c2VsZWN0b3JMYWJlbH0g4oCUIFNlbGVjdHMgZnJvbTogJHticmFuY2hJZExpc3R9YDtcbiAgICAgIHRoaXMucGFyZW50RGVzY3JpcHRpb25QYXJ0cy5wdXNoKG1haW5MaW5lKTtcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0b3JEZXNjcmlwdGlvbikge1xuICAgICAgICB0aGlzLnBhcmVudFN0YWdlRGVzY3JpcHRpb25zLnNldCh0aGlzLmN1ck5vZGUubmFtZSwgdGhpcy5zZWxlY3RvckRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2YgdGhpcy5icmFuY2hEZXNjSW5mbykge1xuICAgICAgICBjb25zdCBicmFuY2hUZXh0ID0gYnJhbmNoLmRlc2NyaXB0aW9uO1xuICAgICAgICBpZiAoYnJhbmNoVGV4dCkgdGhpcy5wYXJlbnREZXNjcmlwdGlvblBhcnRzLnB1c2goYCAgIOKGkiAke2JyYW5jaC5pZH06ICR7YnJhbmNoVGV4dH1gKTtcbiAgICAgICAgaWYgKGJyYW5jaC5kZXNjcmlwdGlvbikgdGhpcy5wYXJlbnRTdGFnZURlc2NyaXB0aW9ucy5zZXQoYnJhbmNoLmlkLCBicmFuY2guZGVzY3JpcHRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmI7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGbG93Q2hhcnRCdWlsZGVyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEJ1aWxkZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgX3Jvb3Q/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBfcm9vdFNwZWM/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIHByaXZhdGUgX2N1cnNvcj86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIF9jdXJzb3JTcGVjPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBwcml2YXRlIF9zdGFnZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj4oKTtcbiAgX3N1YmZsb3dEZWZzID0gbmV3IE1hcDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4oKTtcbiAgcHJpdmF0ZSBfc3RyZWFtSGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzID0ge307XG4gIHByaXZhdGUgX2V4dHJhY3Rvcj86IFRyYXZlcnNhbEV4dHJhY3RvcjtcbiAgcHJpdmF0ZSBfYnVpbGRUaW1lRXh0cmFjdG9yPzogQnVpbGRUaW1lRXh0cmFjdG9yPGFueT47XG4gIHByaXZhdGUgX2J1aWxkVGltZUV4dHJhY3RvckVycm9yczogQXJyYXk8eyBtZXNzYWdlOiBzdHJpbmc7IGVycm9yOiB1bmtub3duIH0+ID0gW107XG4gIHByaXZhdGUgX2VuYWJsZU5hcnJhdGl2ZSA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2dnZXI/OiBJTG9nZ2VyO1xuICBwcml2YXRlIF9kZXNjcmlwdGlvblBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIF9zdGVwQ291bnRlciA9IDA7XG4gIHByaXZhdGUgX3N0YWdlRGVzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBfc3RhZ2VTdGVwTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3RvcihidWlsZFRpbWVFeHRyYWN0b3I/OiBCdWlsZFRpbWVFeHRyYWN0b3I8YW55Pikge1xuICAgIGlmIChidWlsZFRpbWVFeHRyYWN0b3IpIHtcbiAgICAgIHRoaXMuX2J1aWxkVGltZUV4dHJhY3RvciA9IGJ1aWxkVGltZUV4dHJhY3RvcjtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRGVzY3JpcHRpb24gaGVscGVycyDilIDilIBcblxuICBwcml2YXRlIF9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG4gICAgY29uc3QgbGluZSA9IGRlc2NyaXB0aW9uID8gYCR7dGhpcy5fc3RlcENvdW50ZXJ9LiAke25hbWV9IOKAlCAke2Rlc2NyaXB0aW9ufWAgOiBgJHt0aGlzLl9zdGVwQ291bnRlcn0uICR7bmFtZX1gO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChsaW5lKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zLnNldChuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3ViZmxvdzogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4pOiB2b2lkIHtcbiAgICB0aGlzLl9zdGVwQ291bnRlcisrO1xuICAgIHRoaXMuX3N0YWdlU3RlcE1hcC5zZXQoaWQsIHRoaXMuX3N0ZXBDb3VudGVyKTtcbiAgICBpZiAoc3ViZmxvdy5kZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gW1N1Yi1FeGVjdXRpb246ICR7bmFtZX1dIOKAlCAke3N1YmZsb3cuZGVzY3JpcHRpb259YCk7XG4gICAgICBjb25zdCBsaW5lcyA9IHN1YmZsb3cuZGVzY3JpcHRpb24uc3BsaXQoJ1xcbicpO1xuICAgICAgY29uc3Qgc3RlcHNJZHggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3RhcnRzV2l0aCgnU3RlcHM6JykpO1xuICAgICAgaWYgKHN0ZXBzSWR4ID49IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0ZXBzSWR4ICsgMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGxpbmVzW2ldLnRyaW0oKSkgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAgICAke2xpbmVzW2ldfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChgJHt0aGlzLl9zdGVwQ291bnRlcn0uIFtTdWItRXhlY3V0aW9uOiAke25hbWV9XWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBDb25maWd1cmF0aW9uIOKUgOKUgFxuXG4gIHNldEVuYWJsZU5hcnJhdGl2ZSgpOiB0aGlzIHtcbiAgICB0aGlzLl9lbmFibGVOYXJyYXRpdmUgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TG9nZ2VyKGxvZ2dlcjogSUxvZ2dlcik6IHRoaXMge1xuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaW5lYXIgQ2hhaW5pbmcg4pSA4pSAXG5cbiAgc3RhcnQobmFtZTogc3RyaW5nLCBmbj86IFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LCBpZD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAodGhpcy5fcm9vdCkgZmFpbCgncm9vdCBhbHJlYWR5IGRlZmluZWQ7IGNyZWF0ZSBhIG5ldyBidWlsZGVyJyk7XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgbmFtZSB9O1xuICAgIGlmIChpZCkgbm9kZS5pZCA9IGlkO1xuICAgIGlmIChkZXNjcmlwdGlvbikgbm9kZS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIGlmIChmbikge1xuICAgICAgbm9kZS5mbiA9IGZuO1xuICAgICAgdGhpcy5fYWRkVG9NYXAobmFtZSwgZm4pO1xuICAgIH1cblxuICAgIGxldCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIHR5cGU6ICdzdGFnZScgfTtcbiAgICBpZiAoaWQpIHNwZWMuaWQgPSBpZDtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBzcGVjID0gdGhpcy5fYXBwbHlFeHRyYWN0b3JUb05vZGUoc3BlYyk7XG5cbiAgICB0aGlzLl9yb290ID0gbm9kZTtcbiAgICB0aGlzLl9yb290U3BlYyA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gc3BlYztcblxuICAgIHRoaXMuX2FwcGVuZERlc2NyaXB0aW9uTGluZShuYW1lLCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRGdW5jdGlvbihuYW1lOiBzdHJpbmcsIGZuPzogUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sIGlkPzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lIH07XG4gICAgaWYgKGlkKSBub2RlLmlkID0gaWQ7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgaWYgKGZuKSB7XG4gICAgICBub2RlLmZuID0gZm47XG4gICAgICB0aGlzLl9hZGRUb01hcChuYW1lLCBmbik7XG4gICAgfVxuXG4gICAgbGV0IHNwZWM6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IHsgbmFtZSwgdHlwZTogJ3N0YWdlJyB9O1xuICAgIGlmIChpZCkgc3BlYy5pZCA9IGlkO1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHNwZWMgPSB0aGlzLl9hcHBseUV4dHJhY3RvclRvTm9kZShzcGVjKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fY3Vyc29yU3BlYyA9IHNwZWM7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkU3RyZWFtaW5nRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmVhbUlkPzogc3RyaW5nLFxuICAgIGZuPzogUGlwZWxpbmVTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGlzU3RyZWFtaW5nOiB0cnVlLFxuICAgICAgc3RyZWFtSWQ6IHN0cmVhbUlkID8/IG5hbWUsXG4gICAgfTtcbiAgICBpZiAoaWQpIG5vZGUuaWQgPSBpZDtcbiAgICBpZiAoZGVzY3JpcHRpb24pIG5vZGUuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgIHRoaXMuX2FkZFRvTWFwKG5hbWUsIGZuKTtcbiAgICB9XG5cbiAgICBsZXQgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6ICdzdHJlYW1pbmcnLFxuICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICBzdHJlYW1JZDogc3RyZWFtSWQgPz8gbmFtZSxcbiAgICB9O1xuICAgIGlmIChpZCkgc3BlYy5pZCA9IGlkO1xuICAgIGlmIChkZXNjcmlwdGlvbikgc3BlYy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgIHNwZWMgPSB0aGlzLl9hcHBseUV4dHJhY3RvclRvTm9kZShzcGVjKTtcblxuICAgIGN1ci5uZXh0ID0gbm9kZTtcbiAgICBjdXJTcGVjLm5leHQgPSBzcGVjO1xuICAgIHRoaXMuX2N1cnNvciA9IG5vZGU7XG4gICAgdGhpcy5fY3Vyc29yU3BlYyA9IHNwZWM7XG5cbiAgICB0aGlzLl9hcHBlbmREZXNjcmlwdGlvbkxpbmUobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIEJyYW5jaGluZyDilIDilIBcblxuICBhZGREZWNpZGVyRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBpZD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5kZWNpZGVyRm4pIGZhaWwoYGRlY2lkZXIgYWxyZWFkeSBkZWZpbmVkIGF0ICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lIH07XG4gICAgaWYgKGlkKSBub2RlLmlkID0gaWQ7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgbm9kZS5mbiA9IGZuO1xuICAgIHRoaXMuX2FkZFRvTWFwKG5hbWUsIGZuKTtcblxuICAgIGxldCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIHR5cGU6ICdzdGFnZScsIGhhc0RlY2lkZXI6IHRydWUgfTtcbiAgICBpZiAoaWQpIHNwZWMuaWQgPSBpZDtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHNwZWMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICBzcGVjID0gdGhpcy5fYXBwbHlFeHRyYWN0b3JUb05vZGUoc3BlYyk7XG5cbiAgICBjdXIubmV4dCA9IG5vZGU7XG4gICAgY3VyU3BlYy5uZXh0ID0gc3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2N1cnNvclNwZWMgPSBzcGVjO1xuXG4gICAgdGhpcy5fc3RlcENvdW50ZXIrKztcbiAgICB0aGlzLl9zdGFnZVN0ZXBNYXAuc2V0KG5hbWUsIHRoaXMuX3N0ZXBDb3VudGVyKTtcblxuICAgIHJldHVybiBuZXcgRGVjaWRlckxpc3Q8VE91dCwgVFNjb3BlPihcbiAgICAgIHRoaXMsXG4gICAgICBub2RlLFxuICAgICAgc3BlYyxcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMsXG4gICAgICB0aGlzLl9zdGFnZURlc2NyaXB0aW9ucyxcbiAgICAgIHRoaXMuX3N0ZXBDb3VudGVyLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGFkZFNlbGVjdG9yRnVuY3Rpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBpZD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgKTogU2VsZWN0b3JGbkxpc3Q8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5fbmVlZEN1cnNvcigpO1xuICAgIGNvbnN0IGN1clNwZWMgPSB0aGlzLl9uZWVkQ3Vyc29yU3BlYygpO1xuXG4gICAgaWYgKGN1ci5zZWxlY3RvckZuKSBmYWlsKGBzZWxlY3RvciBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChjdXIuZGVjaWRlckZuKSBmYWlsKGBkZWNpZGVyIGFuZCBzZWxlY3RvciBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGF0ICcke2N1ci5uYW1lfSdgKTtcblxuICAgIGNvbnN0IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyBuYW1lIH07XG4gICAgaWYgKGlkKSBub2RlLmlkID0gaWQ7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBub2RlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgbm9kZS5mbiA9IGZuO1xuICAgIHRoaXMuX2FkZFRvTWFwKG5hbWUsIGZuKTtcblxuICAgIGxldCBzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgPSB7IG5hbWUsIHR5cGU6ICdzdGFnZScsIGhhc1NlbGVjdG9yOiB0cnVlIH07XG4gICAgaWYgKGlkKSBzcGVjLmlkID0gaWQ7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSBzcGVjLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgc3BlYyA9IHRoaXMuX2FwcGx5RXh0cmFjdG9yVG9Ob2RlKHNwZWMpO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IHNwZWM7XG4gICAgdGhpcy5fY3Vyc29yID0gbm9kZTtcbiAgICB0aGlzLl9jdXJzb3JTcGVjID0gc3BlYztcblxuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fc3RhZ2VTdGVwTWFwLnNldChuYW1lLCB0aGlzLl9zdGVwQ291bnRlcik7XG5cbiAgICByZXR1cm4gbmV3IFNlbGVjdG9yRm5MaXN0PFRPdXQsIFRTY29wZT4oXG4gICAgICB0aGlzLFxuICAgICAgbm9kZSxcbiAgICAgIHNwZWMsXG4gICAgICB0aGlzLl9kZXNjcmlwdGlvblBhcnRzLFxuICAgICAgdGhpcy5fc3RhZ2VEZXNjcmlwdGlvbnMsXG4gICAgICB0aGlzLl9zdGVwQ291bnRlcixcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgUGFyYWxsZWwgKEZvcmspIOKUgOKUgFxuXG4gIGFkZExpc3RPZkZ1bmN0aW9uKGNoaWxkcmVuOiBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjPFRPdXQsIFRTY29wZT5bXSwgb3B0aW9ucz86IHsgZmFpbEZhc3Q/OiBib29sZWFuIH0pOiB0aGlzIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLl9uZWVkQ3Vyc29yKCk7XG4gICAgY29uc3QgY3VyU3BlYyA9IHRoaXMuX25lZWRDdXJzb3JTcGVjKCk7XG4gICAgY29uc3QgZm9ya0lkID0gY3VyLmlkID8/IGN1ci5uYW1lO1xuXG4gICAgY3VyU3BlYy50eXBlID0gJ2ZvcmsnO1xuICAgIGlmIChvcHRpb25zPy5mYWlsRmFzdCkgY3VyLmZhaWxGYXN0ID0gdHJ1ZTtcblxuICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSwgZm4gfSBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFpZCkgZmFpbChgY2hpbGQgaWQgcmVxdWlyZWQgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgICAgaWYgKGN1ci5jaGlsZHJlbj8uc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpKSB7XG4gICAgICAgIGZhaWwoYGR1cGxpY2F0ZSBjaGlsZCBpZCAnJHtpZH0nIHVuZGVyICcke2N1ci5uYW1lfSdgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IG5hbWU6IG5hbWUgPz8gaWQgfTtcbiAgICAgIGlmIChpZCkgbm9kZS5pZCA9IGlkO1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIG5vZGUuZm4gPSBmbjtcbiAgICAgICAgdGhpcy5fYWRkVG9NYXAobmFtZSwgZm4pO1xuICAgICAgfVxuXG4gICAgICBsZXQgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgICBuYW1lOiBuYW1lID8/IGlkLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgICBpc1BhcmFsbGVsQ2hpbGQ6IHRydWUsXG4gICAgICAgIHBhcmFsbGVsR3JvdXBJZDogZm9ya0lkLFxuICAgICAgfTtcbiAgICAgIGlmIChpZCkgc3BlYy5pZCA9IGlkO1xuICAgICAgc3BlYyA9IHRoaXMuX2FwcGx5RXh0cmFjdG9yVG9Ob2RlKHNwZWMpO1xuXG4gICAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgICBjdXIuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIGN1clNwZWMuY2hpbGRyZW4gPSBjdXJTcGVjLmNoaWxkcmVuIHx8IFtdO1xuICAgICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkTmFtZXMgPSBjaGlsZHJlbi5tYXAoKGMpID0+IGMubmFtZSB8fCBjLmlkKS5qb2luKCcsICcpO1xuICAgIHRoaXMuX3N0ZXBDb3VudGVyKys7XG4gICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5wdXNoKGAke3RoaXMuX3N0ZXBDb3VudGVyfS4gUnVucyBpbiBwYXJhbGxlbDogJHtjaGlsZE5hbWVzfWApO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgU3ViZmxvdyBNb3VudGluZyDilIDilIBcblxuICBhZGRTdWJGbG93Q2hhcnQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIuY2hpbGRyZW4/LnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSkge1xuICAgICAgZmFpbChgZHVwbGljYXRlIGNoaWxkIGlkICcke2lkfScgdW5kZXIgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gbW91bnROYW1lIHx8IGlkO1xuICAgIGNvbnN0IGZvcmtJZCA9IGN1ci5pZCA/PyBjdXIubmFtZTtcbiAgICBjb25zdCBwcmVmaXhlZFJvb3QgPSB0aGlzLl9wcmVmaXhOb2RlVHJlZShzdWJmbG93LnJvb3QsIGlkKTtcblxuICAgIGlmICghdGhpcy5fc3ViZmxvd0RlZnMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5fc3ViZmxvd0RlZnMuc2V0KGlkLCB7IHJvb3Q6IHByZWZpeGVkUm9vdCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHN1YmZsb3dOYW1lLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMpIG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBsZXQgc3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgaXNQYXJhbGxlbENoaWxkOiB0cnVlLFxuICAgICAgcGFyYWxsZWxHcm91cElkOiBmb3JrSWQsXG4gICAgICBzdWJmbG93U3RydWN0dXJlOiBzdWJmbG93LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICB9O1xuICAgIHNwZWMgPSB0aGlzLl9hcHBseUV4dHJhY3RvclRvTm9kZShzcGVjKTtcblxuICAgIGN1clNwZWMudHlwZSA9ICdmb3JrJztcbiAgICBjdXIuY2hpbGRyZW4gPSBjdXIuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgY3VyU3BlYy5jaGlsZHJlbiA9IGN1clNwZWMuY2hpbGRyZW4gfHwgW107XG4gICAgY3VyU3BlYy5jaGlsZHJlbi5wdXNoKHNwZWMpO1xuXG4gICAgdGhpcy5fbWVyZ2VTdGFnZU1hcChzdWJmbG93LnN0YWdlTWFwLCBpZCk7XG4gICAgdGhpcy5fbWVyZ2VTdWJmbG93cyhzdWJmbG93LnN1YmZsb3dzLCBpZCk7XG4gICAgdGhpcy5fYXBwZW5kU3ViZmxvd0Rlc2NyaXB0aW9uKGlkLCBzdWJmbG93TmFtZSwgc3ViZmxvdyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZFN1YkZsb3dDaGFydE5leHQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdWJmbG93OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBtb3VudE5hbWU/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXIubmV4dCkge1xuICAgICAgZmFpbChgY2Fubm90IGFkZCBzdWJmbG93IGFzIG5leHQgd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBtb3VudE5hbWUgfHwgaWQ7XG4gICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5fcHJlZml4Tm9kZVRyZWUoc3ViZmxvdy5yb290LCBpZCk7XG5cbiAgICBpZiAoIXRoaXMuX3N1YmZsb3dEZWZzLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMuX3N1YmZsb3dEZWZzLnNldChpZCwgeyByb290OiBwcmVmaXhlZFJvb3QgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICBuYW1lOiBzdWJmbG93TmFtZSxcbiAgICAgIGlkLFxuICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgIHN1YmZsb3dJZDogaWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICB9O1xuICAgIGlmIChvcHRpb25zKSBub2RlLnN1YmZsb3dNb3VudE9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgbGV0IGF0dGFjaGVkU3BlYzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0ge1xuICAgICAgbmFtZTogc3ViZmxvd05hbWUsXG4gICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgaWQsXG4gICAgICBpc1N1YmZsb3dSb290OiB0cnVlLFxuICAgICAgc3ViZmxvd0lkOiBpZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgc3ViZmxvd1N0cnVjdHVyZTogc3ViZmxvdy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgfTtcbiAgICBhdHRhY2hlZFNwZWMgPSB0aGlzLl9hcHBseUV4dHJhY3RvclRvTm9kZShhdHRhY2hlZFNwZWMpO1xuXG4gICAgY3VyLm5leHQgPSBub2RlO1xuICAgIGN1clNwZWMubmV4dCA9IGF0dGFjaGVkU3BlYztcbiAgICB0aGlzLl9jdXJzb3IgPSBub2RlO1xuICAgIHRoaXMuX2N1cnNvclNwZWMgPSBhdHRhY2hlZFNwZWM7XG5cbiAgICB0aGlzLl9tZXJnZVN0YWdlTWFwKHN1YmZsb3cuc3RhZ2VNYXAsIGlkKTtcbiAgICB0aGlzLl9tZXJnZVN1YmZsb3dzKHN1YmZsb3cuc3ViZmxvd3MsIGlkKTtcbiAgICB0aGlzLl9hcHBlbmRTdWJmbG93RGVzY3JpcHRpb24oaWQsIHN1YmZsb3dOYW1lLCBzdWJmbG93KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIExvb3Ag4pSA4pSAXG5cbiAgbG9vcFRvKHN0YWdlSWQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuX25lZWRDdXJzb3IoKTtcbiAgICBjb25zdCBjdXJTcGVjID0gdGhpcy5fbmVlZEN1cnNvclNwZWMoKTtcblxuICAgIGlmIChjdXJTcGVjLmxvb3BUYXJnZXQpIGZhaWwoYGxvb3BUbyBhbHJlYWR5IGRlZmluZWQgYXQgJyR7Y3VyLm5hbWV9J2ApO1xuICAgIGlmIChjdXIubmV4dCkgZmFpbChgY2Fubm90IHNldCBsb29wVG8gd2hlbiBuZXh0IGlzIGFscmVhZHkgZGVmaW5lZCBhdCAnJHtjdXIubmFtZX0nYCk7XG5cbiAgICBjdXIubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQgfTtcbiAgICBjdXJTcGVjLmxvb3BUYXJnZXQgPSBzdGFnZUlkO1xuICAgIGN1clNwZWMubmV4dCA9IHsgbmFtZTogc3RhZ2VJZCwgaWQ6IHN0YWdlSWQsIHR5cGU6ICdzdGFnZScgfTtcblxuICAgIGNvbnN0IHRhcmdldFN0ZXAgPSB0aGlzLl9zdGFnZVN0ZXBNYXAuZ2V0KHN0YWdlSWQpO1xuICAgIGlmICh0YXJnZXRTdGVwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChg4oaSIGxvb3BzIGJhY2sgdG8gc3RlcCAke3RhcmdldFN0ZXB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uUGFydHMucHVzaChg4oaSIGxvb3BzIGJhY2sgdG8gJHtzdGFnZUlkfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIFN0cmVhbWluZyDilIDilIBcblxuICBvblN0cmVhbShoYW5kbGVyOiBTdHJlYW1Ub2tlbkhhbmRsZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9zdHJlYW1IYW5kbGVycy5vblRva2VuID0gaGFuZGxlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9uU3RyZWFtU3RhcnQoaGFuZGxlcjogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uU3RhcnQgPSBoYW5kbGVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25TdHJlYW1FbmQoaGFuZGxlcjogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0cmVhbUhhbmRsZXJzLm9uRW5kID0gaGFuZGxlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBFeHRyYWN0b3JzIOKUgOKUgFxuXG4gIGFkZFRyYXZlcnNhbEV4dHJhY3RvcjxUUmVzdWx0ID0gdW5rbm93bj4oZXh0cmFjdG9yOiBUcmF2ZXJzYWxFeHRyYWN0b3I8VFJlc3VsdD4pOiB0aGlzIHtcbiAgICB0aGlzLl9leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRCdWlsZFRpbWVFeHRyYWN0b3I8VFJlc3VsdCA9IEZsb3dDaGFydFNwZWM+KGV4dHJhY3RvcjogQnVpbGRUaW1lRXh0cmFjdG9yPFRSZXN1bHQ+KTogdGhpcyB7XG4gICAgdGhpcy5fYnVpbGRUaW1lRXh0cmFjdG9yID0gZXh0cmFjdG9yO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0QnVpbGRUaW1lRXh0cmFjdG9yRXJyb3JzKCk6IEFycmF5PHsgbWVzc2FnZTogc3RyaW5nOyBlcnJvcjogdW5rbm93biB9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkVGltZUV4dHJhY3RvckVycm9ycztcbiAgfVxuXG4gIC8vIOKUgOKUgCBPdXRwdXQg4pSA4pSAXG5cbiAgYnVpbGQoKTogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLl9yb290ID8/IGZhaWwoJ2VtcHR5IHRyZWU7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgc3BlYzsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG5cbiAgICBjb25zdCBzdWJmbG93czogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiB0aGlzLl9zdWJmbG93RGVmcykge1xuICAgICAgc3ViZmxvd3Nba2V5XSA9IGRlZjtcbiAgICB9XG5cbiAgICBjb25zdCByb290TmFtZSA9IHRoaXMuX3Jvb3Q/Lm5hbWUgPz8gJ0Zsb3dDaGFydCc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgdGhpcy5fZGVzY3JpcHRpb25QYXJ0cy5sZW5ndGggPiAwID8gYEZsb3dDaGFydDogJHtyb290TmFtZX1cXG5TdGVwczpcXG4ke3RoaXMuX2Rlc2NyaXB0aW9uUGFydHMuam9pbignXFxuJyl9YCA6ICcnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvb3QsXG4gICAgICBzdGFnZU1hcDogdGhpcy5fc3RhZ2VNYXAsXG4gICAgICBleHRyYWN0b3I6IHRoaXMuX2V4dHJhY3RvcixcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogcm9vdFNwZWMsXG4gICAgICAuLi4oT2JqZWN0LmtleXMoc3ViZmxvd3MpLmxlbmd0aCA+IDAgPyB7IHN1YmZsb3dzIH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5fZW5hYmxlTmFycmF0aXZlID8geyBlbmFibGVOYXJyYXRpdmU6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLl9sb2dnZXIgPyB7IGxvZ2dlcjogdGhpcy5fbG9nZ2VyIH0gOiB7fSksXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHN0YWdlRGVzY3JpcHRpb25zOiBuZXcgTWFwKHRoaXMuX3N0YWdlRGVzY3JpcHRpb25zKSxcbiAgICB9O1xuICB9XG5cbiAgdG9TcGVjPFRSZXN1bHQgPSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU+KCk6IFRSZXN1bHQge1xuICAgIGNvbnN0IHJvb3RTcGVjID0gdGhpcy5fcm9vdFNwZWMgPz8gZmFpbCgnZW1wdHkgdHJlZTsgY2FsbCBzdGFydCgpIGZpcnN0Jyk7XG4gICAgcmV0dXJuIHJvb3RTcGVjIGFzIFRSZXN1bHQ7XG4gIH1cblxuICB0b01lcm1haWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJ2Zsb3djaGFydCBURCddO1xuICAgIGNvbnN0IGlkT2YgPSAoazogc3RyaW5nKSA9PiAoayB8fCAnJykucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCAnXycpIHx8ICdfJztcbiAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdCA/PyBmYWlsKCdlbXB0eSB0cmVlOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcblxuICAgIGNvbnN0IHdhbGsgPSAobjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pID0+IHtcbiAgICAgIGNvbnN0IG5pZCA9IGlkT2Yobi5pZCA/PyBuLm5hbWUpO1xuICAgICAgbGluZXMucHVzaChgJHtuaWR9W1wiJHtuLm5hbWV9XCJdYCk7XG4gICAgICBmb3IgKGNvbnN0IGMgb2Ygbi5jaGlsZHJlbiB8fCBbXSkge1xuICAgICAgICBjb25zdCBjaWQgPSBpZE9mKGMuaWQgPz8gYy5uYW1lKTtcbiAgICAgICAgbGluZXMucHVzaChgJHtuaWR9IC0tPiAke2NpZH1gKTtcbiAgICAgICAgd2FsayhjKTtcbiAgICAgIH1cbiAgICAgIGlmIChuLm5leHQpIHtcbiAgICAgICAgY29uc3QgbWlkID0gaWRPZihuLm5leHQuaWQgPz8gbi5uZXh0Lm5hbWUpO1xuICAgICAgICBsaW5lcy5wdXNoKGAke25pZH0gLS0+ICR7bWlkfWApO1xuICAgICAgICB3YWxrKG4ubmV4dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHJvb3QpO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbHMgKGV4cG9zZWQgZm9yIGhlbHBlciBjbGFzc2VzKSDilIDilIBcblxuICBwcml2YXRlIF9uZWVkQ3Vyc29yKCk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY3Vyc29yID8/IGZhaWwoJ2N1cnNvciB1bmRlZmluZWQ7IGNhbGwgc3RhcnQoKSBmaXJzdCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbmVlZEN1cnNvclNwZWMoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHtcbiAgICByZXR1cm4gdGhpcy5fY3Vyc29yU3BlYyA/PyBmYWlsKCdjdXJzb3IgdW5kZWZpbmVkOyBjYWxsIHN0YXJ0KCkgZmlyc3QnKTtcbiAgfVxuXG4gIF9hcHBseUV4dHJhY3RvclRvTm9kZShzcGVjOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUge1xuICAgIGlmICghdGhpcy5fYnVpbGRUaW1lRXh0cmFjdG9yKSByZXR1cm4gc3BlYztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2J1aWxkVGltZUV4dHJhY3RvcihzcGVjIGFzIGFueSkgYXMgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIHRoaXMuX2J1aWxkVGltZUV4dHJhY3RvckVycm9ycy5wdXNoKHtcbiAgICAgICAgbWVzc2FnZTogZXJyb3I/Lm1lc3NhZ2UgPz8gU3RyaW5nKGVycm9yKSxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIF9hZGRUb01hcChuYW1lOiBzdHJpbmcsIGZuOiBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPikge1xuICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMobmFtZSkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fc3RhZ2VNYXAuZ2V0KG5hbWUpO1xuICAgICAgaWYgKGV4aXN0aW5nICE9PSBmbikgZmFpbChgc3RhZ2VNYXAgY29sbGlzaW9uIGZvciAnJHtuYW1lfSdgKTtcbiAgICB9XG4gICAgdGhpcy5fc3RhZ2VNYXAuc2V0KG5hbWUsIGZuKTtcbiAgfVxuXG4gIF9tZXJnZVN0YWdlTWFwKG90aGVyOiBNYXA8c3RyaW5nLCBQaXBlbGluZVN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj4sIHByZWZpeD86IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG90aGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LyR7a31gIDogaztcbiAgICAgIGlmICh0aGlzLl9zdGFnZU1hcC5oYXMoa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX3N0YWdlTWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgIT09IHYpIGZhaWwoYHN0YWdlTWFwIGNvbGxpc2lvbiB3aGlsZSBtb3VudGluZyBmbG93Y2hhcnQgYXQgJyR7a2V5fSdgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YWdlTWFwLnNldChrZXksIHYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9wcmVmaXhOb2RlVHJlZShub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4OiBzdHJpbmcpOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgaWYgKCFub2RlKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBjbG9uZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IC4uLm5vZGUgfTtcbiAgICBjbG9uZS5uYW1lID0gYCR7cHJlZml4fS8ke25vZGUubmFtZX1gO1xuICAgIGlmIChjbG9uZS5zdWJmbG93SWQpIGNsb25lLnN1YmZsb3dJZCA9IGAke3ByZWZpeH0vJHtjbG9uZS5zdWJmbG93SWR9YDtcbiAgICBpZiAoY2xvbmUubmV4dCkgY2xvbmUubmV4dCA9IHRoaXMuX3ByZWZpeE5vZGVUcmVlKGNsb25lLm5leHQsIHByZWZpeCk7XG4gICAgaWYgKGNsb25lLmNoaWxkcmVuKSB7XG4gICAgICBjbG9uZS5jaGlsZHJlbiA9IGNsb25lLmNoaWxkcmVuLm1hcCgoYykgPT4gdGhpcy5fcHJlZml4Tm9kZVRyZWUoYywgcHJlZml4KSk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIF9tZXJnZVN1YmZsb3dzKHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkLCBwcmVmaXg6IHN0cmluZykge1xuICAgIGlmICghc3ViZmxvd3MpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3ViZmxvd3MpKSB7XG4gICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGAke3ByZWZpeH0vJHtrZXl9YDtcbiAgICAgIGlmICghdGhpcy5fc3ViZmxvd0RlZnMuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICB0aGlzLl9zdWJmbG93RGVmcy5zZXQocHJlZml4ZWRLZXksIHtcbiAgICAgICAgICByb290OiB0aGlzLl9wcmVmaXhOb2RlVHJlZShkZWYucm9vdCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgcHJlZml4KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmFjdG9yeSBGdW5jdGlvblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG93Q2hhcnQ8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PihcbiAgbmFtZTogc3RyaW5nLFxuICBmbj86IFBpcGVsaW5lU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+LFxuICBpZD86IHN0cmluZyxcbiAgYnVpbGRUaW1lRXh0cmFjdG9yPzogQnVpbGRUaW1lRXh0cmFjdG9yPGFueT4sXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuKTogRmxvd0NoYXJ0QnVpbGRlcjxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIG5ldyBGbG93Q2hhcnRCdWlsZGVyPFRPdXQsIFRTY29wZT4oYnVpbGRUaW1lRXh0cmFjdG9yKS5zdGFydChuYW1lLCBmbiwgaWQsIGRlc2NyaXB0aW9uKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTcGVjIHRvIFN0YWdlTm9kZSBDb252ZXJ0ZXJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgZnVuY3Rpb24gc3BlY1RvU3RhZ2VOb2RlKHNwZWM6IEZsb3dDaGFydFNwZWMpOiBTdGFnZU5vZGU8YW55LCBhbnk+IHtcbiAgY29uc3QgaW5mbGF0ZSA9IChzOiBGbG93Q2hhcnRTcGVjKTogU3RhZ2VOb2RlPGFueSwgYW55PiA9PiAoe1xuICAgIG5hbWU6IHMubmFtZSxcbiAgICBpZDogcy5pZCxcbiAgICBjaGlsZHJlbjogcy5jaGlsZHJlbj8ubGVuZ3RoID8gcy5jaGlsZHJlbi5tYXAoaW5mbGF0ZSkgOiB1bmRlZmluZWQsXG4gICAgbmV4dDogcy5uZXh0ID8gaW5mbGF0ZShzLm5leHQpIDogdW5kZWZpbmVkLFxuICB9KTtcbiAgcmV0dXJuIGluZmxhdGUoc3BlYyk7XG59XG4iXX0=
|