footprintjs 9.1.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/esm/lib/decide/decide.js +12 -1
- package/dist/esm/lib/decide/evaluator.js +28 -2
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +4 -4
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.js +54 -1
- package/dist/esm/lib/memory/TransactionBuffer.js +17 -7
- package/dist/esm/lib/recorder/CombinedRecorder.js +20 -10
- package/dist/esm/lib/runner/FlowChartExecutor.js +3 -1
- package/dist/esm/lib/scope/ScopeFacade.js +5 -1
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/lib/decide/decide.js +12 -1
- package/dist/lib/decide/evaluator.js +28 -2
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +4 -4
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/memory/StageContext.js +54 -1
- package/dist/lib/memory/TransactionBuffer.js +17 -7
- package/dist/lib/recorder/CombinedRecorder.js +20 -10
- package/dist/lib/runner/FlowChartExecutor.js +3 -1
- package/dist/lib/scope/ScopeFacade.js +5 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/types/lib/decide/decide.d.ts +11 -0
- package/dist/types/lib/decide/evaluator.d.ts +17 -0
- package/dist/types/lib/engine/narrative/types.d.ts +11 -0
- package/dist/types/lib/memory/StageContext.d.ts +39 -0
- package/dist/types/lib/memory/TransactionBuffer.d.ts +16 -6
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +15 -9
- package/dist/types/lib/scope/types.d.ts +11 -0
- package/package.json +3 -1
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.StageContext = void 0;
|
|
13
|
+
const detectCircular_js_1 = require("../scope/detectCircular.js");
|
|
13
14
|
const DiagnosticCollector_js_1 = require("./DiagnosticCollector.js");
|
|
14
15
|
const pathOps_js_1 = require("./pathOps.js");
|
|
15
16
|
const TransactionBuffer_js_1 = require("./TransactionBuffer.js");
|
|
@@ -345,6 +346,35 @@ class StageContext {
|
|
|
345
346
|
setCommitObserver(observer) {
|
|
346
347
|
this._commitObserver = observer;
|
|
347
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* Flush staged writes to shared memory and RELEASE the per-stage staging
|
|
351
|
+
* state (#13b).
|
|
352
|
+
*
|
|
353
|
+
* Commit is the stage's lifecycle end: `buffer` (2 full-state clones) and
|
|
354
|
+
* `stateView` (a reference that pins one full committed-state GENERATION —
|
|
355
|
+
* `applySmartMerge` clones + swaps the whole state per commit, so every
|
|
356
|
+
* stage's view is a distinct object) are only needed DURING execution, as
|
|
357
|
+
* the read snapshot + net-change diff base. The execution tree retains
|
|
358
|
+
* every StageContext for the lifetime of the run, so WITHOUT the release
|
|
359
|
+
* a long loop retains one state generation + two clones per executed
|
|
360
|
+
* stage — measured O(N²): 563.8MB at N=200 on an agent-style chart; a
|
|
361
|
+
* 500-iteration agent OOMed a default Node heap (backlog #18).
|
|
362
|
+
*
|
|
363
|
+
* RE-USE AFTER COMMIT stays correct because both fields re-create lazily:
|
|
364
|
+
* - a later READ re-anchors via {@link firstTouchState} on the CURRENT
|
|
365
|
+
* committed state (which includes this stage's own flushed writes);
|
|
366
|
+
* - a later WRITE constructs a fresh buffer on that re-anchored view, so a
|
|
367
|
+
* second commit diffs against post-first-commit state. The pre-release
|
|
368
|
+
* buffer behaved the same for VALUES (its `workingCopy` was reset on
|
|
369
|
+
* commit, falling reads through to live state) but kept the ORIGINAL
|
|
370
|
+
* `baseSnapshot` as diff base — unreachable in practice: every engine
|
|
371
|
+
* re-commit path (fork double-commit, subflow outputMapper double-commit)
|
|
372
|
+
* stages nothing in between, and the two real "write after commit" sites
|
|
373
|
+
* (SubflowExecutor seed → replaces the context; resume → fresh context
|
|
374
|
+
* via `leaf.createNext`) never re-use a committed context's buffer.
|
|
375
|
+
* - `_stageWrites` / `_stageReads` are NOT released — `snapshotSelf()`
|
|
376
|
+
* reads them post-run for the execution-tree snapshot.
|
|
377
|
+
*/
|
|
348
378
|
commit() {
|
|
349
379
|
if (!this.buffer) {
|
|
350
380
|
// Truly-lazy fast path (#13): no write ever constructed the buffer, so
|
|
@@ -364,6 +394,9 @@ class StageContext {
|
|
|
364
394
|
if (this._commitObserver) {
|
|
365
395
|
this._commitObserver({ ...this._stageWrites });
|
|
366
396
|
}
|
|
397
|
+
// #13b: drop the first-touch view — a read-only stage still pinned one
|
|
398
|
+
// full state generation through it.
|
|
399
|
+
this.stateView = undefined;
|
|
367
400
|
return;
|
|
368
401
|
}
|
|
369
402
|
const bundle = this.buffer.commit();
|
|
@@ -392,8 +425,22 @@ class StageContext {
|
|
|
392
425
|
if (this._commitObserver) {
|
|
393
426
|
this._commitObserver({ ...this._stageWrites });
|
|
394
427
|
}
|
|
428
|
+
// #13b: release the staging state — see the method JSDoc. Done LAST so
|
|
429
|
+
// the commit observer sees the exact same world as before the release.
|
|
430
|
+
this.buffer = undefined;
|
|
431
|
+
this.stateView = undefined;
|
|
395
432
|
}
|
|
396
433
|
// ── Tree navigation ────────────────────────────────────────────────────
|
|
434
|
+
/**
|
|
435
|
+
* Create (or return) this context's linked successor.
|
|
436
|
+
*
|
|
437
|
+
* MEMOIZED: the first call creates `this.next`; every later call returns
|
|
438
|
+
* that SAME context and IGNORES its arguments. In normal traversal each
|
|
439
|
+
* context advances exactly once, so the memo never bites — but a caller
|
|
440
|
+
* expecting a fresh context for different `stageName`/`stageId` args gets
|
|
441
|
+
* the old one silently. Dev mode (`enableDevMode()`) warns on that
|
|
442
|
+
* mismatch (backlog B4).
|
|
443
|
+
*/
|
|
397
444
|
createNext(path, stageName, stageId, isDecider = false) {
|
|
398
445
|
if (!this.next) {
|
|
399
446
|
this.next = new StageContext(path, stageName, stageId, this.sharedMemory, '', this.eventLog, isDecider);
|
|
@@ -404,6 +451,12 @@ class StageContext {
|
|
|
404
451
|
this.next.redactedSharedMemory = this.redactedSharedMemory;
|
|
405
452
|
this.next.readTracking = this.readTracking;
|
|
406
453
|
}
|
|
454
|
+
else if ((0, detectCircular_js_1.isDevMode)() && (this.next.stageId !== stageId || this.next.stageName !== stageName)) {
|
|
455
|
+
// eslint-disable-next-line no-console
|
|
456
|
+
console.warn(`[footprint] StageContext.createNext: next context already exists as "${this.next.stageName}" ` +
|
|
457
|
+
`(id: "${this.next.stageId}") — arguments "${stageName}" (id: "${stageId}") are ignored ` +
|
|
458
|
+
'and the existing context is returned.');
|
|
459
|
+
}
|
|
407
460
|
return this.next;
|
|
408
461
|
}
|
|
409
462
|
createChild(runId, branchId, stageName, stageId, isDecider = false) {
|
|
@@ -524,4 +577,4 @@ class StageContext {
|
|
|
524
577
|
}
|
|
525
578
|
}
|
|
526
579
|
exports.StageContext = StageContext;
|
|
527
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBRUgscUVBQStEO0FBRS9ELDZDQUF5QztBQUV6QyxpRUFBMkQ7QUFFM0QseUNBQWlEO0FBQ2pELHlDQUF5QztBQUV6Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxLQUFjO0lBQ3hDLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDakUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSw4QkFBbUIsQ0FBQyxFQUFFLENBQUM7SUFDbkgsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDNUYsSUFBSSxLQUFLLFlBQVksR0FBRyxJQUFJLEtBQUssWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNqRCx5RUFBeUU7UUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25FLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sRUFB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LE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLFFBQVEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUE5aUJELG9DQThpQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIFJlZmVyZW5jZSB0byBTaGFyZWRNZW1vcnkgKGFjY2Vzc2luZyBoZWFwIG1lbW9yeSlcbiAqIC0gVHJhbnNhY3Rpb25CdWZmZXIgZm9yIHN0YWdpbmcgbXV0YXRpb25zICh0cmFuc2FjdGlvbiBidWZmZXIpXG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UsIFJlYWRTdW1tYXJ5TWFya2VyLCBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBSRUFEX1BSRVZJRVdfTEVOR1RIIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyByZWRhY3RQYXRjaCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKipcbiAqIENoZWFwIHN1bW1hcnkgb2YgYSByZWFkIHZhbHVlIGZvciBgcmVhZFRyYWNraW5nOiAnc3VtbWFyeSdgICgjMTQpLlxuICpcbiAqIERlbGliZXJhdGVseSBhdm9pZHMgZXZlcnkgTyh2YWx1ZSkgb3BlcmF0aW9uOiBubyBjbG9uZSwgbm8gc2VyaWFsaXphdGlvbi5cbiAqIGBzaXplYCBpcyBhIHByb3h5IChzdHJpbmcgbGVuZ3RoIC8gYXJyYXkgbGVuZ3RoIC8gc2hhbGxvdyBrZXkgY291bnQpIGFuZFxuICogYHByZXZpZXdgIGV4aXN0cyBvbmx5IHdoZXJlIHByb2R1Y2luZyBpdCBpcyBPKHByZXZpZXcpIOKAlCBwcmltaXRpdmVzIGFuZFxuICogc3RyaW5ncy4gU2VlIHtAbGluayBSZWFkU3VtbWFyeU1hcmtlcn0gZm9yIHRoZSBob25lc3QtY29zdCBjb250cmFjdC5cbiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplUmVhZFZhbHVlKHZhbHVlOiB1bmtub3duKTogUmVhZFN1bW1hcnlNYXJrZXIge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiB7IF9fcmVhZFN1bW1hcnk6IHRydWUsIHR5cGU6ICdudWxsJyB9O1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IF9fcmVhZFN1bW1hcnk6IHRydWUsIHR5cGU6ICdzdHJpbmcnLCBzaXplOiB2YWx1ZS5sZW5ndGgsIHByZXZpZXc6IHZhbHVlLnNsaWNlKDAsIFJFQURfUFJFVklFV19MRU5HVEgpIH07XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4geyBfX3JlYWRTdW1tYXJ5OiB0cnVlLCB0eXBlOiAnYXJyYXknLCBzaXplOiB2YWx1ZS5sZW5ndGggfTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgLy8gT2JqZWN0LmtleXMoKSBvbiBhIE1hcC9TZXQgaXMgYWx3YXlzIFtdIOKAlCByZXBvcnQgdGhlIHJlYWwgZW50cnkgY291bnQuXG4gICAgcmV0dXJuIHsgX19yZWFkU3VtbWFyeTogdHJ1ZSwgdHlwZTogJ29iamVjdCcsIHNpemU6IHZhbHVlLnNpemUgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IF9fcmVhZFN1bW1hcnk6IHRydWUsIHR5cGU6ICdvYmplY3QnLCBzaXplOiBPYmplY3Qua2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikubGVuZ3RoIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgX19yZWFkU3VtbWFyeTogdHJ1ZSwgdHlwZTogJ2Z1bmN0aW9uJyB9O1xuICAvLyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgc3ltYm9sIOKAlCBTdHJpbmcoKSBpcyBPKHJlbmRlcmVkIGxlbmd0aClcbiAgcmV0dXJuIHtcbiAgICBfX3JlYWRTdW1tYXJ5OiB0cnVlLFxuICAgIHR5cGU6IHR5cGVvZiB2YWx1ZSBhcyBSZWFkU3VtbWFyeU1hcmtlclsndHlwZSddLFxuICAgIHByZXZpZXc6IFN0cmluZyh2YWx1ZSkuc2xpY2UoMCwgUkVBRF9QUkVWSUVXX0xFTkdUSCksXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFnZUNvbnRleHQge1xuICBwcml2YXRlIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5O1xuICAvKipcbiAgICogUGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIG9mIGBzaGFyZWRNZW1vcnlgLiBQb3B1bGF0ZWQgaW4gYGNvbW1pdCgpYCB3aXRoXG4gICAqIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMgKHRoZSBzYW1lIG9uZXMgZmVkIHRvIGBldmVudExvZ2ApLlxuICAgKiBQcmVzZW50ICoqb25seSoqIHdoZW4gdGhlIGV4ZWN1dG9yIGhhcyBiZWVuIHRvbGQgdG8gbWFpbnRhaW4gYSByZWRhY3RlZFxuICAgKiB2aWV3IOKAlCBpLmUuIHdoZW4gYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkLiBPdGhlcndpc2UgdW5kZWZpbmVkLFxuICAgKiB6ZXJvIGV4dHJhIHdvcmsgcGVyIGNvbW1pdC5cbiAgICpcbiAgICogVGhlIG1pcnJvciBpcyByZWFkIHZpYSBgRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAqIGFuZCBpcyB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIFwiZXhwb3J0IHRyYWNlXCIgLyBwYXN0ZS1pbnRvLXZpZXdlciBmZWF0dXJlXG4gICAqIOKAlCBjb25zdW1lcnMgc2hhcmUgdGhlIHJlZGFjdGVkIHZpZXcgZXh0ZXJuYWxseSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSVxuICAgKiB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlZGFjdGVkU2hhcmVkTWVtb3J5PzogU2hhcmVkTWVtb3J5O1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogQ29tbWl0dGVkLXN0YXRlIHZpZXcgY2FwdHVyZWQgYXQgdGhpcyBzdGFnZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIE9SXG4gICAqIGZpcnN0IHdyaXRlKSDigJQgaGVsZCBieSBSRUZFUkVOQ0UsIG5ldmVyIGNsb25lZC4gU2VlXG4gICAqIHtAbGluayBmaXJzdFRvdWNoU3RhdGV9IGZvciB0aGUgYWxnb3JpdGhtIGFuZCB0aGUgaW1tdXRhYmlsaXR5IGludmFyaWFudFxuICAgKiB0aGF0IG1ha2VzIGEgYmFyZSByZWZlcmVuY2Ugc2FmZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGVWaWV3PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHByaXZhdGUgZXZlbnRMb2c/OiBFdmVudExvZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIHB1YmxpYyBydW5JZDogc3RyaW5nO1xuICBwdWJsaWMgYnJhbmNoSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBpc0RlY2lkZXI6IGJvb2xlYW47XG4gIHB1YmxpYyBpc0Zvcms6IGJvb2xlYW47XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmcm9tIGJ1aWxkZXIgKHNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIGV4ZWN1dGlvbikuICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciAoc2V0IGJ5IHRyYXZlcnNlciB3aGVuIHRoaXMgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50KS4gKi9cbiAgcHVibGljIHN1YmZsb3dJZD86IHN0cmluZztcblxuICBwdWJsaWMgcGFyZW50PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgbmV4dD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGNoaWxkcmVuPzogU3RhZ2VDb250ZXh0W107XG5cbiAgcHVibGljIGRlYnVnOiBEaWFnbm9zdGljQ29sbGVjdG9yID0gbmV3IERpYWdub3N0aWNDb2xsZWN0b3IoKTtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgd3JpdGVzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3IGFuZCBvbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBIb3cgdHJhY2tlZCByZWFkcyBhcmUgcmVjb3JkZWQgaW50byBgX3N0YWdlUmVhZHNgICgjMTQpLiBEZWZhdWx0IGAnZnVsbCdgXG4gICAqIHByZXNlcnZlcyB0aGUgaGlzdG9yaWNhbCBwZXItcmVhZCBgc3RydWN0dXJlZENsb25lYC4gSW5oZXJpdGVkIGJ5IGV2ZXJ5XG4gICAqIGNvbnRleHQgY3JlYXRlZCB2aWEge0BsaW5rIGNyZWF0ZU5leHR9IC8ge0BsaW5rIGNyZWF0ZUNoaWxkfSAoc2FtZVxuICAgKiBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzIHRoZSByZWRhY3RlZCBtaXJyb3IpLCBhbmQgcHVzaGVkIGludG8gc3ViZmxvd1xuICAgKiByb290IGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgLiBBZmZlY3RzIE9OTFkgdGhlIHNuYXBzaG90J3NcbiAgICogYHN0YWdlUmVhZHNgIHBheWxvYWQg4oCUIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgKGFuZCB0aGVyZWZvcmUgbmFycmF0aXZlKVxuICAgKiBpcyBkaXNwYXRjaGVkIGF0IHRoZSBzY29wZSB0aWVyIGFuZCBuZXZlciBjbG9uZWQsIHNvIGl0IGlzIGlkZW50aWNhbCBpblxuICAgKiBldmVyeSBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkVHJhY2tpbmc6IFJlYWRUcmFja2luZ01vZGUgPSAnZnVsbCc7XG5cbiAgLyoqIE9ic2VydmVyIGNhbGxlZCBhZnRlciBjb21taXQoKSDigJQgdXNlZCBieSBTY29wZUZhY2FkZSB0byBmaXJlIFNjb3BlUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5zaGFyZWRNZW1vcnkgPSBzaGFyZWRNZW1vcnk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuZXZlbnRMb2cgPSBldmVudExvZztcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIHdpbGxcbiAgICogYXBwbHkgdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyB0byB0aGlzIG1pcnJvciBpbiBhZGRpdGlvblxuICAgKiB0byB0aGUgcmF3IGBzaGFyZWRNZW1vcnlgICsgYGV2ZW50TG9nYC4gQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXRcbiAgICogdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uY2UgYXQgdGhlIHJvb3QgY29udGV4dCBieSBgRXhlY3V0aW9uUnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpYC5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSA9IG1pcnJvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSByZWRhY3RlZCBtaXJyb3IgaWYgaW5zdGFsbGVkLCBlbHNlIHVuZGVmaW5lZC4gKi9cbiAgZ2V0UmVkYWN0ZWRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHJlYWQtdHJhY2tpbmcgcG9saWN5IGZvciB0aGlzIGNvbnRleHQgKCMxNCkuIENhbGxlZCBhdCB0aGUgcm9vdFxuICAgKiBieSBgRXhlY3V0aW9uUnVudGltZS51c2VSZWFkVHJhY2tpbmcoKWAgKHBsdW1iZWQgZnJvbVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgKTsgZGVzY2VuZGFudHMgaW5oZXJpdCB2aWEgYGNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAsXG4gICAqIGFuZCBgU3ViZmxvd0V4ZWN1dG9yYCBwdXNoZXMgdGhlIHBhcmVudCBjb250ZXh0J3MgbW9kZSBpbnRvIGVhY2ggc3ViZmxvd1xuICAgKiByb290IHNvIG5lc3RlZCBjaGFydHMgaW5oZXJpdCB0b28uXG4gICAqL1xuICB1c2VSZWFkVHJhY2tpbmcobW9kZTogUmVhZFRyYWNraW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMucmVhZFRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgcmVhZC10cmFja2luZyBwb2xpY3kgKHVzZWQgZm9yIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRSZWFkVHJhY2tpbmcoKTogUmVhZFRyYWNraW5nTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZFRyYWNraW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBzdGFnZSdzIEZJUlNUXG4gICAqIHRvdWNoIChmaXJzdCByZWFkIG9yIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC5cbiAgICogU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgKHtAbGluayByZWFkU3RhdGV9KVxuICAgKiBhbmQgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGRpZmYgYmFzZSAoe0BsaW5rIGdldFRyYW5zYWN0aW9uQnVmZmVyfSkuXG4gICAqXG4gICAqIFdIWSBBIEJBUkUgUkVGRVJFTkNFIElTIFNBRkUg4oCUIHRoZSBpbnZhcmlhbnQgdGhpcyByZXN0cyBvbjogY29tbWl0dGVkXG4gICAqIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwLiBgU2hhcmVkTWVtb3J5LmFwcGx5UGF0Y2hgIHJvdXRlcyB0aHJvdWdoXG4gICAqIGBhcHBseVNtYXJ0TWVyZ2VgLCB3aGljaCBgc3RydWN0dXJlZENsb25lYHMgdGhlIGN1cnJlbnQgc3RhdGUsIG11dGF0ZXNcbiAgICogb25seSB0aGUgY2xvbmUsIGFuZCBzd2FwcyBgU2hhcmVkTWVtb3J5LmNvbnRleHRgIHRvIGl0IOKAlCB0aGUgb2JqZWN0IGFcbiAgICogc3RhZ2UgY2FwdHVyZWQgaGVyZSBpcyBuZXZlciBlZGl0ZWQgYWZ0ZXJ3YXJkcy4gKGBTaGFyZWRNZW1vcnkuc2V0VmFsdWVgL1xuICAgKiBgdXBkYXRlVmFsdWVgIERPIG11dGF0ZSBpbiBwbGFjZSwgYnV0IGhhdmUgbm8gY2FsbGVycyBkdXJpbmcgdHJhdmVyc2FsO1xuICAgKiBldmVyeSBydW50aW1lIHdyaXRlIHJlYWNoZXMgc3RhdGUgdGhyb3VnaCBhIHN0YWdlIGNvbW1pdCdzIGBhcHBseVBhdGNoYC4pXG4gICAqIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpcyBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdFxuICAgKiB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy5cbiAgICpcbiAgICogV0hZIEZJUlNUIFRPVUNILCBub3QgZmlyc3Qgd3JpdGU6IHRoZSBwcmUtIzEzIGVhZ2VyIGVuZ2luZSBjbG9uZWQgdGhlXG4gICAqIHN0YXRlIGludG8gdGhlIGJ1ZmZlciBhdCB0aGUgc3RhZ2UncyBmaXJzdCBBQ0NFU1MsIGFuY2hvcmluZyBib3RoIGl0c1xuICAgKiBzbmFwc2hvdCByZWFkcyBhbmQgaXRzIGNvbW1pdCBiYXNlbGluZSAodGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlKSB0aGVyZS5cbiAgICogIzEzJ3MgZmlyc3QgY3V0IGFuY2hvcmVkIHRoZSBsYXp5IGJ1ZmZlciBhdCBmaXJzdCBXUklURSDigJQgb2JzZXJ2YWJseVxuICAgKiBkaWZmZXJlbnQgd2hlbiBzb21ldGhpbmcgZWxzZSBjb21taXRzIGluIHRoZSBnYXAgYmV0d2VlbiB0aGlzIHN0YWdlJ3NcbiAgICogZmlyc3QgcmVhZCBhbmQgaXRzIGZpcnN0IHdyaXRlLiBUaGF0IGdhcCBpcyBSRUFDSEFCTEU6IGZvcmsgc2libGluZ3MgYXJlXG4gICAqIG5hbWVzcGFjZS1pc29sYXRlZCBmb3IgcnVuLXNjb3BlZCBrZXlzIChlYWNoIGNoaWxkIHdyaXRlcyB1bmRlclxuICAgKiBgcnVucy88Y2hpbGRJZD4vYCksIGJ1dCBST09ULWxldmVsIGtleXMgYXJlIHNoYXJlZCDigJQgd3JpdHRlbiB2aWFcbiAgICogYHNldEdsb2JhbGAgZnJvbSBjb25zdW1lciBzY29wZSBjb2RlIGFuZCwgY3JpdGljYWxseSwgYnlcbiAgICogYFN1YmZsb3dJbnB1dE1hcHBlcmAncyBvdXRwdXQgbWFwcGluZyAoYHBhcmVudENvbnRleHQuc2V0R2xvYmFsYCksIHdoaWNoXG4gICAqIGlzIGV4YWN0bHkgd2hhdCBydW5zIHdoZW4gYSBzdWJmbG93IGlzIGEgZm9yayBicmFuY2guIEEgc2libGluZydzXG4gICAqIHJvb3Qta2V5IGNvbW1pdCBsYW5kaW5nIGluIHRoZSBnYXAgd291bGQgc2hpZnQgdGhpcyBzdGFnZSdzIGRpZmYgYmFzZSxcbiAgICogbWFraW5nIGl0cyBDb21taXRCdW5kbGUgcmVjb3JkIGEgcGhhbnRvbSBjaGFuZ2UgKG9yIHN3YWxsb3cgYSByZWFsIG9uZSlcbiAgICogcmVsYXRpdmUgdG8gdGhlIGVhZ2VyIGVuZ2luZS4gQW5jaG9yaW5nIHRoZSB2aWV3IGF0IGZpcnN0IHRvdWNoIHJlc3RvcmVzXG4gICAqIHRoZSBFWEFDVCBlYWdlciBzZW1hbnRpY3Mg4oCUIHNlcXVlbnRpYWwgQU5EIHBhcmFsbGVsIOKAlCBhdCB6ZXJvIGNsb25lIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlzaWJpbGl0eSBpcyB0d28tdGllciwgbWF0Y2hpbmcgZWFnZXIgYnl0ZS1mb3ItYnl0ZToga2V5cyBwcmVzZW50XG4gICAqIGluIHRoZSB2aWV3IGF0IGZpcnN0IHRvdWNoIHJlYWQgcmVwZWF0YWJseSBmcm9tIGl0OyBrZXlzIEFCU0VOVCBmcm9tIGl0XG4gICAqIGZhbGwgYmFjayB0byBMSVZFIHN0YXRlICh0aGUgZWFnZXIgZW5naW5lJ3MgZXhhY3QgZmFsbGJhY2sg4oCUIGFcbiAgICogbWlkLWZsaWdodCBzaWJsaW5nIHJvb3Qta2V5IHdyaXRlIHdhcyBhbHdheXMgdmlzaWJsZSB0byByZWFkcywgYW5kXG4gICAqIHN0YXlzIHZpc2libGU7IG9ubHkgdGhlIERJRkYgQkFTRSBpcyBwaW5uZWQpLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXJzdFRvdWNoU3RhdGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5zdGF0ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdGVWaWV3ID0gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVWaWV3O1xuICB9XG5cbiAgLyoqIExhemlseSBjcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIgb24gdGhlIHN0YWdlJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqICBSZWFkcyBORVZFUiBjb25zdHJ1Y3QgaXQ6IHJlYWQteW91ci13cml0ZXMgb25seSBtYXR0ZXJzIG9uY2UgYSBzdGFnZWRcbiAgICogIHdyaXRlIGV4aXN0cywgc28gYmVmb3JlIHRoYXQge0BsaW5rIGdldFZhbHVlfS97QGxpbmsgZ2V0VmFsdWVEaXJlY3R9XG4gICAqICBzZXJ2ZSBmcm9tIHRoZSBmaXJzdC10b3VjaCBzdGF0ZSB2aWV3IGFuZCB7QGxpbmsgY29tbWl0fSByZWNvcmRzIGFuXG4gICAqICBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICBUaGUgYnVmZmVyJ3MgYmFzZSBpcyB0aGUgRklSU1QtVE9VQ0ggdmlldywgTk9UIHRoZSBsaXZlIHN0YXRlIGF0IHdyaXRlXG4gICAqICB0aW1lOiB1bmRlciBwYXJhbGxlbCBmb3JrcyBhIHNpYmxpbmcgbWF5IGhhdmUgY29tbWl0dGVkIGJldHdlZW4gdGhpc1xuICAgKiAgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIG11c3RcbiAgICogIHN0YXkgYW5jaG9yZWQgYXQgZmlyc3QgdG91Y2ggdG8gbWF0Y2ggdGhlIGVhZ2VyIGVuZ2luZSDigJQgc2VlXG4gICAqICB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfS4gKi9cbiAgZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTogVHJhbnNhY3Rpb25CdWZmZXIge1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFRyYW5zYWN0aW9uQnVmZmVyKHRoaXMuZmlyc3RUb3VjaFN0YXRlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gIH1cblxuICAvKiogQnVpbGRzIGFuIGFic29sdXRlIHBhdGggaW5zaWRlIHRoZSBzaGFyZWQgbWVtb3J5IChydW4gbmFtZXNwYWNlKS4gKi9cbiAgcHJpdmF0ZSB3aXRoTmFtZXNwYWNlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHtcbiAgICAgIHJldHVybiBbLi4ucGF0aCwga2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIFsncnVucycsIHRoaXMucnVuSWQsIC4uLnBhdGgsIGtleV07XG4gIH1cblxuICAvLyDilIDilIAgV3JpdGUgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwYXRjaChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3QgPSBmYWxzZSkge1xuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKS5zZXQodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHZhbHVlLCBzaG91bGRSZWRhY3QpO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgbWVyZ2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKS5tZXJnZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgdmFsdWUpO1xuICB9XG5cbiAgc2V0T2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uT3ZlcnJpZGU/OiAnc2V0JyB8ICdkZWxldGUnLFxuICApIHtcbiAgICB0aGlzLnBhdGNoKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCA/PyBmYWxzZSk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXRcbiAgICBjb25zdCB1c2VyS2V5ID0gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzW3VzZXJLZXldID0ge1xuICAgICAgdmFsdWU6IHNob3VsZFJlZGFjdCA/ICdbUkVEQUNURURdJyA6IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSksXG4gICAgICBvcGVyYXRpb246IG9wZXJhdGlvbk92ZXJyaWRlID8/ICdzZXQnLFxuICAgIH07XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcsIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pIHtcbiAgICB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0XG4gICAgY29uc3QgdXNlcktleSA9IHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbiAgICB0aGlzLl9zdGFnZVdyaXRlc1t1c2VyS2V5XSA9IHtcbiAgICAgIHZhbHVlOiBzaG91bGRSZWRhY3QgPyAnW1JFREFDVEVEXScgOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxuICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgc2V0Um9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKFtdLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLnNldChba2V5XSwgdmFsdWUpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlR2xvYmFsQ29udGV4dChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkuc2V0KFtrZXldLCB2YWx1ZSk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1ZmZlci1hd2FyZSByZWFkLCBtaXJyb3JpbmcgdGhlIGVhZ2VyIGVuZ2luZSdzIHJlYWQgb3JkZXIgYnl0ZS1mb3ItYnl0ZTpcbiAgICpcbiAgICogICAgMS4gc3RhZ2VkIHdyaXRlcyArIGZpcnN0LXRvdWNoIHNuYXBzaG90IOKAlCBgYnVmZmVyLmdldGAgb3ZlciBpdHNcbiAgICogICAgICAgd29ya2luZ0NvcHkgd2hlbiB0aGUgYnVmZmVyIGV4aXN0cywgZWxzZSBgbmF0aXZlR2V0YCBvdmVyIHRoZVxuICAgKiAgICAgICB6ZXJvLWNsb25lIHN0YXRlIHZpZXcgKHRoZSBidWZmZXIncyBiYXNlIElTIHRoYXQgdmlldywgc28gdGhlIHR3b1xuICAgKiAgICAgICB0aWVycyBhZ3JlZSBvbiBjb250ZW50KTtcbiAgICogICAgMi4gTElWRSBzdGF0ZSB2aWEgYHNoYXJlZE1lbW9yeS5nZXRWYWx1ZWAgZm9yIGtleXMgYWJzZW50IGZyb20gdGhlXG4gICAqICAgICAgIHNuYXBzaG90IOKAlCBpbmNsdWRpbmcgaXRzIHJ1buKGkmdsb2JhbCBuYW1lc3BhY2UgZmFsbGJhY2suIFRoZSBlYWdlclxuICAgKiAgICAgICBlbmdpbmUgaGFkIHRoaXMgZXhhY3QgbGl2ZSBmYWxsYmFjayBmb3Igc25hcHNob3QtbWlzc2luZyBrZXlzO1xuICAgKiAgICAgICBieXRlLWlkZW50aXR5IG92ZXIgcHVyaXR5LlxuICAgKlxuICAgKiAgUmVhZHMgbmV2ZXIgY29uc3RydWN0IHRoZSBidWZmZXIgKCMxMyk6IGEgc3RhZ2UgdGhhdCBuZXZlciB3cml0ZXNcbiAgICogIHBlcmZvcm1zIHplcm8gY2xvbmVzIG9mIHRoZSBzaGFyZWQgc3RhdGUuICovXG4gIHByaXZhdGUgcmVhZFN0YXRlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGZyb21TbmFwc2hvdCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuZ2V0KG5hbWVzcGFjZWQpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIG5hbWVzcGFjZWQpO1xuICAgIGlmICh0eXBlb2YgZnJvbVNuYXBzaG90ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZyb21TbmFwc2hvdDtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5ydW5JZCwgcGF0aCwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBCT1JST1dFRCDigJQgc2VlIHRoZSBjb250cmFjdCBvblxuICAgKiBgU2NvcGVGYWNhZGUuZ2V0VmFsdWVgLiBSZWFkLXRyYWNraW5nIGNvc3QgaXMgcG9saWN5LWdhdGVkICgjMTQpOlxuICAgKiBgJ2Z1bGwnYCBjbG9uZXMgdGhlIHZhbHVlIGludG8gYF9zdGFnZVJlYWRzYCAoaGlzdG9yaWNhbCBkZWZhdWx0KSxcbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIG1hcmtlciwgYCdvZmYnYCByZWNvcmRzIG5vdGhpbmcuXG4gICAqL1xuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWFkU3RhdGUocGF0aCwga2V5KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlld1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJlYWRUcmFja2luZyAhPT0gJ29mZicpIHtcbiAgICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJlYWRUcmFja2luZyA9PT0gJ3N1bW1hcnknXG4gICAgICAgICAgPyBzdW1tYXJpemVSZWFkVmFsdWUodmFsdWUpXG4gICAgICAgICAgOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgYFtSRUFEXSAke2Rlc2NyaXB0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IHRyYWNraW5nIGluIF9zdGFnZVJlYWRzIG9yIHBheWluZyBzdHJ1Y3R1cmVkQ2xvbmUgY29zdC5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUuZ2V0VmFsdWVTaWxlbnQoKSBmb3IgYXJyYXkgcHJveHkgaW50ZXJuYWwgb3BlcmF0aW9ucy4gKi9cbiAgZ2V0VmFsdWVEaXJlY3QocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlYWRTdGF0ZShwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSh0aGlzLnJ1bklkLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRWYWx1ZSgnJywgW10sIGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFNjb3BlUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICBjb21taXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgLy8gVHJ1bHktbGF6eSBmYXN0IHBhdGggKCMxMyk6IG5vIHdyaXRlIGV2ZXIgY29uc3RydWN0ZWQgdGhlIGJ1ZmZlciwgc29cbiAgICAgIC8vIHRoZSBzdGFnZSdzIG5ldCBjaGFuZ2UgaXMgZW1wdHkgQlkgQ09OU1RSVUNUSU9OLiBTYW1lIG9ic2VydmFibGVcbiAgICAgIC8vIG91dGNvbWUgYXMgYW4gZW1wdHkgY29tbWl0IOKAlCB0aGUgKGVtcHR5KSBidW5kbGUgaXMgc3RpbGwgcmVjb3JkZWQgc29cbiAgICAgIC8vIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCDigJQgYnV0IHdpdGhcbiAgICAgIC8vIFpFUk8gY2xvbmVzOiBubyBidWZmZXIgY29uc3RydWN0aW9uLCBubyBhcHBseVBhdGNoIHJlcGxheS5cbiAgICAgIHRoaXMuZXZlbnRMb2c/LnJlY29yZCh7XG4gICAgICAgIG92ZXJ3cml0ZToge30sXG4gICAgICAgIHVwZGF0ZXM6IHt9LFxuICAgICAgICByZWRhY3RlZFBhdGhzOiBbXSxcbiAgICAgICAgdHJhY2U6IFtdLFxuICAgICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1bmRsZSA9IHRoaXMuYnVmZmVyLmNvbW1pdCgpO1xuICAgIGNvbnN0IGNvbW1pdEJ1bmRsZSA9IHtcbiAgICAgIC4uLmJ1bmRsZSxcbiAgICAgIHN0YWdlOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgIH07XG5cbiAgICB0aGlzLnNoYXJlZE1lbW9yeS5hcHBseVBhdGNoKGNvbW1pdEJ1bmRsZS5vdmVyd3JpdGUsIGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUudHJhY2UpO1xuXG4gICAgLy8gQWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIGZlZWQgdGhyZWUgY29uc3VtZXJzOlxuICAgIC8vICAgMS4gdGhlIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgZW5hYmxlZClcbiAgICAvLyAgIDIuIHRoZSBldmVudCBsb2cgKHBlcnNpc3RlZCB0cmFjZSlcbiAgICAvLyAgIDMuIChmdXR1cmUpIGFueXRoaW5nIGVsc2UgdGhhdCB3YW50cyBhIHNjcnViYmVkIHZpZXcgYXQgY29tbWl0IHRpbWVcbiAgICAvLyBDb21wdXRpbmcgb25jZSBrZWVwcyBjb3N0IGxpbmVhciBpbiB0aGUgY29tbWl0IHNpemU7IG5vIHBvc3QtcGFzcyB3YWxrLlxuICAgIGNvbnN0IHJlZGFjdGVkT3ZlcndyaXRlID0gcmVkYWN0UGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIGNvbnN0IHJlZGFjdGVkVXBkYXRlcyA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocyk7XG5cbiAgICB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5Py5hcHBseVBhdGNoKHJlZGFjdGVkT3ZlcndyaXRlLCByZWRhY3RlZFVwZGF0ZXMsIGNvbW1pdEJ1bmRsZS50cmFjZSk7XG5cbiAgICB0aGlzLmV2ZW50TG9nPy5yZWNvcmQoe1xuICAgICAgLi4uY29tbWl0QnVuZGxlLFxuICAgICAgcmVkYWN0ZWRQYXRoczogQXJyYXkuZnJvbShjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocy52YWx1ZXMoKSksXG4gICAgICBvdmVyd3JpdGU6IHJlZGFjdGVkT3ZlcndyaXRlLFxuICAgICAgdXBkYXRlczogcmVkYWN0ZWRVcGRhdGVzLFxuICAgIH0pO1xuXG4gICAgLy8gTm90aWZ5IG9ic2VydmVyIChTY29wZUZhY2FkZSkgd2l0aCB0cmFja2VkIG11dGF0aW9uc1xuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgVHJlZSBuYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGNyZWF0ZU5leHQocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRoaXMubmV4dCA9IG5ldyBTdGFnZUNvbnRleHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnNoYXJlZE1lbW9yeSwgJycsIHRoaXMuZXZlbnRMb2csIGlzRGVjaWRlcik7XG4gICAgICB0aGlzLm5leHQucGFyZW50ID0gdGhpcztcbiAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgcmVkYWN0ZWQgbWlycm9yIGRvd24gdGhlIGNvbnRleHQgdHJlZSBzbyBldmVyeSBjb21taXRcbiAgICAgIC8vIGluIHRoZSBydW4gd3JpdGVzIHRvIGJvdGggdmlld3MuXG4gICAgICBpZiAodGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSkgdGhpcy5uZXh0LnJlZGFjdGVkU2hhcmVkTWVtb3J5ID0gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgICAgIHRoaXMubmV4dC5yZWFkVHJhY2tpbmcgPSB0aGlzLnJlYWRUcmFja2luZztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV4dDtcbiAgfVxuXG4gIGNyZWF0ZUNoaWxkKHJ1bklkOiBzdHJpbmcsIGJyYW5jaElkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBuZXcgU3RhZ2VDb250ZXh0KHJ1bklkLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCBicmFuY2hJZCwgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgIGlmICh0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5KSBjaGlsZC5yZWRhY3RlZFNoYXJlZE1lbW9yeSA9IHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnk7XG4gICAgY2hpbGQucmVhZFRyYWNraW5nID0gdGhpcy5yZWFkVHJhY2tpbmc7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9zdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
|
|
580
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBRUgsa0VBQXVEO0FBQ3ZELHFFQUErRDtBQUUvRCw2Q0FBeUM7QUFFekMsaUVBQTJEO0FBRTNELHlDQUFpRDtBQUNqRCx5Q0FBeUM7QUFFekM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsa0JBQWtCLENBQUMsS0FBYztJQUN4QyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ2pFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsOEJBQW1CLENBQUMsRUFBRSxDQUFDO0lBQ25ILENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzVGLElBQUksS0FBSyxZQUFZLEdBQUcsSUFBSSxLQUFLLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDakQseUVBQXlFO1FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztR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S0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBcG1CRCxvQ0FvbUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBSZWZlcmVuY2UgdG8gU2hhcmVkTWVtb3J5IChhY2Nlc3NpbmcgaGVhcCBtZW1vcnkpXG4gKiAtIFRyYW5zYWN0aW9uQnVmZmVyIGZvciBzdGFnaW5nIG11dGF0aW9ucyAodHJhbnNhY3Rpb24gYnVmZmVyKVxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuL1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1ZmZlciB9IGZyb20gJy4vVHJhbnNhY3Rpb25CdWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q29udHJvbFR5cGUsIEZsb3dNZXNzYWdlLCBSZWFkU3VtbWFyeU1hcmtlciwgUmVhZFRyYWNraW5nTW9kZSwgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgUkVBRF9QUkVWSUVXX0xFTkdUSCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVkYWN0UGF0Y2ggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqXG4gKiBDaGVhcCBzdW1tYXJ5IG9mIGEgcmVhZCB2YWx1ZSBmb3IgYHJlYWRUcmFja2luZzogJ3N1bW1hcnknYCAoIzE0KS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgYXZvaWRzIGV2ZXJ5IE8odmFsdWUpIG9wZXJhdGlvbjogbm8gY2xvbmUsIG5vIHNlcmlhbGl6YXRpb24uXG4gKiBgc2l6ZWAgaXMgYSBwcm94eSAoc3RyaW5nIGxlbmd0aCAvIGFycmF5IGxlbmd0aCAvIHNoYWxsb3cga2V5IGNvdW50KSBhbmRcbiAqIGBwcmV2aWV3YCBleGlzdHMgb25seSB3aGVyZSBwcm9kdWNpbmcgaXQgaXMgTyhwcmV2aWV3KSDigJQgcHJpbWl0aXZlcyBhbmRcbiAqIHN0cmluZ3MuIFNlZSB7QGxpbmsgUmVhZFN1bW1hcnlNYXJrZXJ9IGZvciB0aGUgaG9uZXN0LWNvc3QgY29udHJhY3QuXG4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZVJlYWRWYWx1ZSh2YWx1ZTogdW5rbm93bik6IFJlYWRTdW1tYXJ5TWFya2VyIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4geyBfX3JlYWRTdW1tYXJ5OiB0cnVlLCB0eXBlOiAnbnVsbCcgfTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyBfX3JlYWRTdW1tYXJ5OiB0cnVlLCB0eXBlOiAnc3RyaW5nJywgc2l6ZTogdmFsdWUubGVuZ3RoLCBwcmV2aWV3OiB2YWx1ZS5zbGljZSgwLCBSRUFEX1BSRVZJRVdfTEVOR1RIKSB9O1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHsgX19yZWFkU3VtbWFyeTogdHJ1ZSwgdHlwZTogJ2FycmF5Jywgc2l6ZTogdmFsdWUubGVuZ3RoIH07XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkge1xuICAgIC8vIE9iamVjdC5rZXlzKCkgb24gYSBNYXAvU2V0IGlzIGFsd2F5cyBbXSDigJQgcmVwb3J0IHRoZSByZWFsIGVudHJ5IGNvdW50LlxuICAgIHJldHVybiB7IF9fcmVhZFN1bW1hcnk6IHRydWUsIHR5cGU6ICdvYmplY3QnLCBzaXplOiB2YWx1ZS5zaXplIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBfX3JlYWRTdW1tYXJ5OiB0cnVlLCB0eXBlOiAnb2JqZWN0Jywgc2l6ZTogT2JqZWN0LmtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxlbmd0aCB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHJldHVybiB7IF9fcmVhZFN1bW1hcnk6IHRydWUsIHR5cGU6ICdmdW5jdGlvbicgfTtcbiAgLy8gbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludCB8IHN5bWJvbCDigJQgU3RyaW5nKCkgaXMgTyhyZW5kZXJlZCBsZW5ndGgpXG4gIHJldHVybiB7XG4gICAgX19yZWFkU3VtbWFyeTogdHJ1ZSxcbiAgICB0eXBlOiB0eXBlb2YgdmFsdWUgYXMgUmVhZFN1bW1hcnlNYXJrZXJbJ3R5cGUnXSxcbiAgICBwcmV2aWV3OiBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIFJFQURfUFJFVklFV19MRU5HVEgpLFxuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgcHJpdmF0ZSBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciBvZiBgc2hhcmVkTWVtb3J5YC4gUG9wdWxhdGVkIGluIGBjb21taXQoKWAgd2l0aFxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzICh0aGUgc2FtZSBvbmVzIGZlZCB0byBgZXZlbnRMb2dgKS5cbiAgICogUHJlc2VudCAqKm9ubHkqKiB3aGVuIHRoZSBleGVjdXRvciBoYXMgYmVlbiB0b2xkIHRvIG1haW50YWluIGEgcmVkYWN0ZWRcbiAgICogdmlldyDigJQgaS5lLiB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZC4gT3RoZXJ3aXNlIHVuZGVmaW5lZCxcbiAgICogemVybyBleHRyYSB3b3JrIHBlciBjb21taXQuXG4gICAqXG4gICAqIFRoZSBtaXJyb3IgaXMgcmVhZCB2aWEgYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgKiBhbmQgaXMgdGhlIGZvdW5kYXRpb24gZm9yIHRoZSBcImV4cG9ydCB0cmFjZVwiIC8gcGFzdGUtaW50by12aWV3ZXIgZmVhdHVyZVxuICAgKiDigJQgY29uc3VtZXJzIHNoYXJlIHRoZSByZWRhY3RlZCB2aWV3IGV4dGVybmFsbHkgd2l0aG91dCBsZWFraW5nIHJhdyBQSUlcbiAgICogdGhyb3VnaCBgc2hhcmVkU3RhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWRhY3RlZFNoYXJlZE1lbW9yeT86IFNoYXJlZE1lbW9yeTtcbiAgcHJpdmF0ZSBidWZmZXI/OiBUcmFuc2FjdGlvbkJ1ZmZlcjtcbiAgLyoqXG4gICAqIENvbW1pdHRlZC1zdGF0ZSB2aWV3IGNhcHR1cmVkIGF0IHRoaXMgc3RhZ2UncyBGSVJTVCB0b3VjaCAoZmlyc3QgcmVhZCBPUlxuICAgKiBmaXJzdCB3cml0ZSkg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuIFNlZVxuICAgKiB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfSBmb3IgdGhlIGFsZ29yaXRobSBhbmQgdGhlIGltbXV0YWJpbGl0eSBpbnZhcmlhbnRcbiAgICogdGhhdCBtYWtlcyBhIGJhcmUgcmVmZXJlbmNlIHNhZmUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRlVmlldz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcml2YXRlIGV2ZW50TG9nPzogRXZlbnRMb2c7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICBwdWJsaWMgcnVuSWQ6IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCk7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCByZWFkcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VSZWFkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogSG93IHRyYWNrZWQgcmVhZHMgYXJlIHJlY29yZGVkIGludG8gYF9zdGFnZVJlYWRzYCAoIzE0KS4gRGVmYXVsdCBgJ2Z1bGwnYFxuICAgKiBwcmVzZXJ2ZXMgdGhlIGhpc3RvcmljYWwgcGVyLXJlYWQgYHN0cnVjdHVyZWRDbG9uZWAuIEluaGVyaXRlZCBieSBldmVyeVxuICAgKiBjb250ZXh0IGNyZWF0ZWQgdmlhIHtAbGluayBjcmVhdGVOZXh0fSAvIHtAbGluayBjcmVhdGVDaGlsZH0gKHNhbWVcbiAgICogcHJvcGFnYXRpb24gcGF0dGVybiBhcyB0aGUgcmVkYWN0ZWQgbWlycm9yKSwgYW5kIHB1c2hlZCBpbnRvIHN1YmZsb3dcbiAgICogcm9vdCBjb250ZXh0cyBieSBgU3ViZmxvd0V4ZWN1dG9yYC4gQWZmZWN0cyBPTkxZIHRoZSBzbmFwc2hvdCdzXG4gICAqIGBzdGFnZVJlYWRzYCBwYXlsb2FkIOKAlCBgU2NvcGVSZWNvcmRlci5vblJlYWRgIChhbmQgdGhlcmVmb3JlIG5hcnJhdGl2ZSlcbiAgICogaXMgZGlzcGF0Y2hlZCBhdCB0aGUgc2NvcGUgdGllciBhbmQgbmV2ZXIgY2xvbmVkLCBzbyBpdCBpcyBpZGVudGljYWwgaW5cbiAgICogZXZlcnkgbW9kZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFRyYWNraW5nOiBSZWFkVHJhY2tpbmdNb2RlID0gJ2Z1bGwnO1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMuc2hhcmVkTWVtb3J5ID0gc2hhcmVkTWVtb3J5O1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmV2ZW50TG9nID0gZXZlbnRMb2c7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSAhIWlzRGVjaWRlcjtcbiAgICB0aGlzLmlzRm9yayA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIFNoYXJlZE1lbW9yeSBpbnN0YW5jZSAobmVlZGVkIGJ5IHNjb3BlIGxheWVyKS4gKi9cbiAgZ2V0U2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyB3aWxsXG4gICAqIGFwcGx5IHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMgdG8gdGhpcyBtaXJyb3IgaW4gYWRkaXRpb25cbiAgICogdG8gdGhlIHJhdyBgc2hhcmVkTWVtb3J5YCArIGBldmVudExvZ2AuIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0XG4gICAqIHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbmNlIGF0IHRoZSByb290IGNvbnRleHQgYnkgYEV4ZWN1dGlvblJ1bnRpbWUuZW5hYmxlUmVkYWN0ZWRNaXJyb3IoKWAuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTQpLiBDYWxsZWQgYXQgdGhlIHJvb3RcbiAgICogYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlUmVhZFRyYWNraW5nKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdCBzbyBuZXN0ZWQgY2hhcnRzIGluaGVyaXQgdG9vLlxuICAgKi9cbiAgdXNlUmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHJlYWQtdHJhY2tpbmcgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0UmVhZFRyYWNraW5nKCk6IFJlYWRUcmFja2luZ01vZGUge1xuICAgIHJldHVybiB0aGlzLnJlYWRUcmFja2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiDilIDilIAgVGhlIGZpcnN0LXRvdWNoIHN0YXRlIHZpZXcgKCMxMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqXG4gICAqIFdIQVQ6IHJldHVybnMgdGhlIGNvbW1pdHRlZCBzaGFyZWQgc3RhdGUgYXMgaXQgd2FzIGF0IHRoaXMgc3RhZ2UncyBGSVJTVFxuICAgKiB0b3VjaCAoZmlyc3QgcmVhZCBvciBmaXJzdCB3cml0ZSksIGNhcHR1cmluZyB0aGUgcmVmZXJlbmNlIG9uIGZpcnN0IGNhbGwuXG4gICAqIFNlcnZlcyB0d28gY29uc3VtZXJzOiByZWFkcyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlICh7QGxpbmsgcmVhZFN0YXRlfSlcbiAgICogYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZFxuICAgKiBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcC4gYFNoYXJlZE1lbW9yeS5hcHBseVBhdGNoYCByb3V0ZXMgdGhyb3VnaFxuICAgKiBgYXBwbHlTbWFydE1lcmdlYCwgd2hpY2ggYHN0cnVjdHVyZWRDbG9uZWBzIHRoZSBjdXJyZW50IHN0YXRlLCBtdXRhdGVzXG4gICAqIG9ubHkgdGhlIGNsb25lLCBhbmQgc3dhcHMgYFNoYXJlZE1lbW9yeS5jb250ZXh0YCB0byBpdCDigJQgdGhlIG9iamVjdCBhXG4gICAqIHN0YWdlIGNhcHR1cmVkIGhlcmUgaXMgbmV2ZXIgZWRpdGVkIGFmdGVyd2FyZHMuIChgU2hhcmVkTWVtb3J5LnNldFZhbHVlYC9cbiAgICogYHVwZGF0ZVZhbHVlYCBETyBtdXRhdGUgaW4gcGxhY2UsIGJ1dCBoYXZlIG5vIGNhbGxlcnMgZHVyaW5nIHRyYXZlcnNhbDtcbiAgICogZXZlcnkgcnVudGltZSB3cml0ZSByZWFjaGVzIHN0YXRlIHRocm91Z2ggYSBzdGFnZSBjb21taXQncyBgYXBwbHlQYXRjaGAuKVxuICAgKiBIb2xkaW5nIHRoZSByZWZlcmVuY2UgdGhlcmVmb3JlIGdpdmVzIHRoaXMgc3RhZ2UgYSBzdGFibGUgc25hcHNob3QgYXRcbiAgICogemVybyBjb3N0IOKAlCBubyBjbG9uZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiAjMTMuXG4gICAqXG4gICAqIFdIWSBGSVJTVCBUT1VDSCwgbm90IGZpcnN0IHdyaXRlOiB0aGUgcHJlLSMxMyBlYWdlciBlbmdpbmUgY2xvbmVkIHRoZVxuICAgKiBzdGF0ZSBpbnRvIHRoZSBidWZmZXIgYXQgdGhlIHN0YWdlJ3MgZmlyc3QgQUNDRVNTLCBhbmNob3JpbmcgYm90aCBpdHNcbiAgICogc25hcHNob3QgcmVhZHMgYW5kIGl0cyBjb21taXQgYmFzZWxpbmUgKHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSkgdGhlcmUuXG4gICAqICMxMydzIGZpcnN0IGN1dCBhbmNob3JlZCB0aGUgbGF6eSBidWZmZXIgYXQgZmlyc3QgV1JJVEUg4oCUIG9ic2VydmFibHlcbiAgICogZGlmZmVyZW50IHdoZW4gc29tZXRoaW5nIGVsc2UgY29tbWl0cyBpbiB0aGUgZ2FwIGJldHdlZW4gdGhpcyBzdGFnZSdzXG4gICAqIGZpcnN0IHJlYWQgYW5kIGl0cyBmaXJzdCB3cml0ZS4gVGhhdCBnYXAgaXMgUkVBQ0hBQkxFOiBmb3JrIHNpYmxpbmdzIGFyZVxuICAgKiBuYW1lc3BhY2UtaXNvbGF0ZWQgZm9yIHJ1bi1zY29wZWQga2V5cyAoZWFjaCBjaGlsZCB3cml0ZXMgdW5kZXJcbiAgICogYHJ1bnMvPGNoaWxkSWQ+L2ApLCBidXQgUk9PVC1sZXZlbCBrZXlzIGFyZSBzaGFyZWQg4oCUIHdyaXR0ZW4gdmlhXG4gICAqIGBzZXRHbG9iYWxgIGZyb20gY29uc3VtZXIgc2NvcGUgY29kZSBhbmQsIGNyaXRpY2FsbHksIGJ5XG4gICAqIGBTdWJmbG93SW5wdXRNYXBwZXJgJ3Mgb3V0cHV0IG1hcHBpbmcgKGBwYXJlbnRDb250ZXh0LnNldEdsb2JhbGApLCB3aGljaFxuICAgKiBpcyBleGFjdGx5IHdoYXQgcnVucyB3aGVuIGEgc3ViZmxvdyBpcyBhIGZvcmsgYnJhbmNoLiBBIHNpYmxpbmcnc1xuICAgKiByb290LWtleSBjb21taXQgbGFuZGluZyBpbiB0aGUgZ2FwIHdvdWxkIHNoaWZ0IHRoaXMgc3RhZ2UncyBkaWZmIGJhc2UsXG4gICAqIG1ha2luZyBpdHMgQ29tbWl0QnVuZGxlIHJlY29yZCBhIHBoYW50b20gY2hhbmdlIChvciBzd2FsbG93IGEgcmVhbCBvbmUpXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBlYWdlciBlbmdpbmUuIEFuY2hvcmluZyB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZXN0b3Jlc1xuICAgKiB0aGUgRVhBQ1QgZWFnZXIgc2VtYW50aWNzIOKAlCBzZXF1ZW50aWFsIEFORCBwYXJhbGxlbCDigJQgYXQgemVybyBjbG9uZSBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpc2liaWxpdHkgaXMgdHdvLXRpZXIsIG1hdGNoaW5nIGVhZ2VyIGJ5dGUtZm9yLWJ5dGU6IGtleXMgcHJlc2VudFxuICAgKiBpbiB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZWFkIHJlcGVhdGFibHkgZnJvbSBpdDsga2V5cyBBQlNFTlQgZnJvbSBpdFxuICAgKiBmYWxsIGJhY2sgdG8gTElWRSBzdGF0ZSAodGhlIGVhZ2VyIGVuZ2luZSdzIGV4YWN0IGZhbGxiYWNrIOKAlCBhXG4gICAqIG1pZC1mbGlnaHQgc2libGluZyByb290LWtleSB3cml0ZSB3YXMgYWx3YXlzIHZpc2libGUgdG8gcmVhZHMsIGFuZFxuICAgKiBzdGF5cyB2aXNpYmxlOyBvbmx5IHRoZSBESUZGIEJBU0UgaXMgcGlubmVkKS5cbiAgICovXG4gIHByaXZhdGUgZmlyc3RUb3VjaFN0YXRlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuc3RhdGVWaWV3KSB7XG4gICAgICB0aGlzLnN0YXRlVmlldyA9IHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlVmlldztcbiAgfVxuXG4gIC8qKiBMYXppbHkgY3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIG9uIHRoZSBzdGFnZSdzIEZJUlNUIFdSSVRFICgjMTMpLlxuICAgKlxuICAgKiAgUmVhZHMgTkVWRVIgY29uc3RydWN0IGl0OiByZWFkLXlvdXItd3JpdGVzIG9ubHkgbWF0dGVycyBvbmNlIGEgc3RhZ2VkXG4gICAqICB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0IHtAbGluayBnZXRWYWx1ZX0ve0BsaW5rIGdldFZhbHVlRGlyZWN0fVxuICAgKiAgc2VydmUgZnJvbSB0aGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhblxuICAgKiAgZW1wdHkgYnVuZGxlIOKAlCBhbGwgd2l0aCBaRVJPIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiAgVGhlIGJ1ZmZlcidzIGJhc2UgaXMgdGhlIEZJUlNULVRPVUNIIHZpZXcsIE5PVCB0aGUgbGl2ZSBzdGF0ZSBhdCB3cml0ZVxuICAgKiAgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3MgYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXNcbiAgICogIHN0YWdlJ3MgZmlyc3QgcmVhZCBhbmQgdGhpcyB3cml0ZSwgYW5kIHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSBtdXN0XG4gICAqICBzdGF5IGFuY2hvcmVkIGF0IGZpcnN0IHRvdWNoIHRvIG1hdGNoIHRoZSBlYWdlciBlbmdpbmUg4oCUIHNlZVxuICAgKiAge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0uICovXG4gIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUcmFuc2FjdGlvbkJ1ZmZlcih0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhbiBhYnNvbHV0ZSBwYXRoIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSAocnVuIG5hbWVzcGFjZSkuICovXG4gIHByaXZhdGUgd2l0aE5hbWVzcGFjZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gWy4uLnBhdGgsIGtleV07XG4gICAgfVxuICAgIHJldHVybiBbJ3J1bnMnLCB0aGlzLnJ1bklkLCAuLi5wYXRoLCBrZXldO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyaXRlIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGF0Y2gocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkuc2V0KHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCkubWVyZ2UodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHZhbHVlKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QgPz8gZmFsc2UpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0XG4gICAgY29uc3QgdXNlcktleSA9IHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbiAgICB0aGlzLl9zdGFnZVdyaXRlc1t1c2VyS2V5XSA9IHtcbiAgICAgIHZhbHVlOiBzaG91bGRSZWRhY3QgPyAnW1JFREFDVEVEXScgOiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpLFxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0JyxcbiAgICB9O1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKSB7XG4gICAgdGhpcy5tZXJnZShwYXRoLCBrZXksIHZhbHVlKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdFxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXNbdXNlcktleV0gPSB7XG4gICAgICB2YWx1ZTogc2hvdWxkUmVkYWN0ID8gJ1tSRURBQ1RFRF0nIDogc3RydWN0dXJlZENsb25lKHZhbHVlKSxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgfTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKS5zZXQoW2tleV0sIHZhbHVlKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpLnNldChba2V5XSwgdmFsdWUpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBCdWZmZXItYXdhcmUgcmVhZCwgbWlycm9yaW5nIHRoZSBlYWdlciBlbmdpbmUncyByZWFkIG9yZGVyIGJ5dGUtZm9yLWJ5dGU6XG4gICAqXG4gICAqICAgIDEuIHN0YWdlZCB3cml0ZXMgKyBmaXJzdC10b3VjaCBzbmFwc2hvdCDigJQgYGJ1ZmZlci5nZXRgIG92ZXIgaXRzXG4gICAqICAgICAgIHdvcmtpbmdDb3B5IHdoZW4gdGhlIGJ1ZmZlciBleGlzdHMsIGVsc2UgYG5hdGl2ZUdldGAgb3ZlciB0aGVcbiAgICogICAgICAgemVyby1jbG9uZSBzdGF0ZSB2aWV3ICh0aGUgYnVmZmVyJ3MgYmFzZSBJUyB0aGF0IHZpZXcsIHNvIHRoZSB0d29cbiAgICogICAgICAgdGllcnMgYWdyZWUgb24gY29udGVudCk7XG4gICAqICAgIDIuIExJVkUgc3RhdGUgdmlhIGBzaGFyZWRNZW1vcnkuZ2V0VmFsdWVgIGZvciBrZXlzIGFic2VudCBmcm9tIHRoZVxuICAgKiAgICAgICBzbmFwc2hvdCDigJQgaW5jbHVkaW5nIGl0cyBydW7ihpJnbG9iYWwgbmFtZXNwYWNlIGZhbGxiYWNrLiBUaGUgZWFnZXJcbiAgICogICAgICAgZW5naW5lIGhhZCB0aGlzIGV4YWN0IGxpdmUgZmFsbGJhY2sgZm9yIHNuYXBzaG90LW1pc3Npbmcga2V5cztcbiAgICogICAgICAgYnl0ZS1pZGVudGl0eSBvdmVyIHB1cml0eS5cbiAgICpcbiAgICogIFJlYWRzIG5ldmVyIGNvbnN0cnVjdCB0aGUgYnVmZmVyICgjMTMpOiBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzXG4gICAqICBwZXJmb3JtcyB6ZXJvIGNsb25lcyBvZiB0aGUgc2hhcmVkIHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRTdGF0ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBmcm9tU25hcHNob3QgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChuYW1lc3BhY2VkKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCBuYW1lc3BhY2VkKTtcbiAgICBpZiAodHlwZW9mIGZyb21TbmFwc2hvdCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmcm9tU25hcHNob3Q7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMucnVuSWQsIHBhdGgsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tlZCByZWFkLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgQk9SUk9XRUQg4oCUIHNlZSB0aGUgY29udHJhY3Qgb25cbiAgICogYFNjb3BlRmFjYWRlLmdldFZhbHVlYC4gUmVhZC10cmFja2luZyBjb3N0IGlzIHBvbGljeS1nYXRlZCAoIzE0KTpcbiAgICogYCdmdWxsJ2AgY2xvbmVzIHRoZSB2YWx1ZSBpbnRvIGBfc3RhZ2VSZWFkc2AgKGhpc3RvcmljYWwgZGVmYXVsdCksXG4gICAqIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcCBtYXJrZXIsIGAnb2ZmJ2AgcmVjb3JkcyBub3RoaW5nLlxuICAgKi9cbiAgZ2V0VmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVhZFN0YXRlKHBhdGgsIGtleSk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXdcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yZWFkVHJhY2tpbmcgIT09ICdvZmYnKSB7XG4gICAgICBjb25zdCB1c2VyS2V5ID0gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xuICAgICAgdGhpcy5fc3RhZ2VSZWFkc1t1c2VyS2V5XSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZWFkVHJhY2tpbmcgPT09ICdzdW1tYXJ5J1xuICAgICAgICAgID8gc3VtbWFyaXplUmVhZFZhbHVlKHZhbHVlKVxuICAgICAgICAgIDogc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkU3RhdGUocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5ydW5JZCwgW10sIGtleSk7XG4gIH1cblxuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUoJycsIFtdLCBrZXkpO1xuICB9XG5cbiAgZ2V0U2NvcGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZ2V0UnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgZmlyZXMgYWZ0ZXIgY29tbWl0KCkgYXBwbGllcyBwYXRjaGVzLlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZSB0byBkaXNwYXRjaCBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHN0YWdlZCB3cml0ZXMgdG8gc2hhcmVkIG1lbW9yeSBhbmQgUkVMRUFTRSB0aGUgcGVyLXN0YWdlIHN0YWdpbmdcbiAgICogc3RhdGUgKCMxM2IpLlxuICAgKlxuICAgKiBDb21taXQgaXMgdGhlIHN0YWdlJ3MgbGlmZWN5Y2xlIGVuZDogYGJ1ZmZlcmAgKDIgZnVsbC1zdGF0ZSBjbG9uZXMpIGFuZFxuICAgKiBgc3RhdGVWaWV3YCAoYSByZWZlcmVuY2UgdGhhdCBwaW5zIG9uZSBmdWxsIGNvbW1pdHRlZC1zdGF0ZSBHRU5FUkFUSU9OIOKAlFxuICAgKiBgYXBwbHlTbWFydE1lcmdlYCBjbG9uZXMgKyBzd2FwcyB0aGUgd2hvbGUgc3RhdGUgcGVyIGNvbW1pdCwgc28gZXZlcnlcbiAgICogc3RhZ2UncyB2aWV3IGlzIGEgZGlzdGluY3Qgb2JqZWN0KSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbiwgYXNcbiAgICogdGhlIHJlYWQgc25hcHNob3QgKyBuZXQtY2hhbmdlIGRpZmYgYmFzZS4gVGhlIGV4ZWN1dGlvbiB0cmVlIHJldGFpbnNcbiAgICogZXZlcnkgU3RhZ2VDb250ZXh0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJ1biwgc28gV0lUSE9VVCB0aGUgcmVsZWFzZVxuICAgKiBhIGxvbmcgbG9vcCByZXRhaW5zIG9uZSBzdGF0ZSBnZW5lcmF0aW9uICsgdHdvIGNsb25lcyBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2Ug4oCUIG1lYXN1cmVkIE8oTsKyKTogNTYzLjhNQiBhdCBOPTIwMCBvbiBhbiBhZ2VudC1zdHlsZSBjaGFydDsgYVxuICAgKiA1MDAtaXRlcmF0aW9uIGFnZW50IE9PTWVkIGEgZGVmYXVsdCBOb2RlIGhlYXAgKGJhY2tsb2cgIzE4KS5cbiAgICpcbiAgICogUkUtVVNFIEFGVEVSIENPTU1JVCBzdGF5cyBjb3JyZWN0IGJlY2F1c2UgYm90aCBmaWVsZHMgcmUtY3JlYXRlIGxhemlseTpcbiAgICogLSBhIGxhdGVyIFJFQUQgcmUtYW5jaG9ycyB2aWEge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0gb24gdGhlIENVUlJFTlRcbiAgICogICBjb21taXR0ZWQgc3RhdGUgKHdoaWNoIGluY2x1ZGVzIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IGV2ZXJ5IGVuZ2luZVxuICAgKiAgIHJlLWNvbW1pdCBwYXRoIChmb3JrIGRvdWJsZS1jb21taXQsIHN1YmZsb3cgb3V0cHV0TWFwcGVyIGRvdWJsZS1jb21taXQpXG4gICAqICAgc3RhZ2VzIG5vdGhpbmcgaW4gYmV0d2VlbiwgYW5kIHRoZSB0d28gcmVhbCBcIndyaXRlIGFmdGVyIGNvbW1pdFwiIHNpdGVzXG4gICAqICAgKFN1YmZsb3dFeGVjdXRvciBzZWVkIOKGkiByZXBsYWNlcyB0aGUgY29udGV4dDsgcmVzdW1lIOKGkiBmcmVzaCBjb250ZXh0XG4gICAqICAgdmlhIGBsZWFmLmNyZWF0ZU5leHRgKSBuZXZlciByZS11c2UgYSBjb21taXR0ZWQgY29udGV4dCdzIGJ1ZmZlci5cbiAgICogLSBgX3N0YWdlV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2AgYXJlIE5PVCByZWxlYXNlZCDigJQgYHNuYXBzaG90U2VsZigpYFxuICAgKiAgIHJlYWRzIHRoZW0gcG9zdC1ydW4gZm9yIHRoZSBleGVjdXRpb24tdHJlZSBzbmFwc2hvdC5cbiAgICovXG4gIGNvbW1pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBUcnVseS1sYXp5IGZhc3QgcGF0aCAoIzEzKTogbm8gd3JpdGUgZXZlciBjb25zdHJ1Y3RlZCB0aGUgYnVmZmVyLCBzb1xuICAgICAgLy8gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZSBpcyBlbXB0eSBCWSBDT05TVFJVQ1RJT04uIFNhbWUgb2JzZXJ2YWJsZVxuICAgICAgLy8gb3V0Y29tZSBhcyBhbiBlbXB0eSBjb21taXQg4oCUIHRoZSAoZW1wdHkpIGJ1bmRsZSBpcyBzdGlsbCByZWNvcmRlZCBzb1xuICAgICAgLy8gZXZlcnkgZXhlY3V0ZWQgc3RhZ2UgcmVtYWlucyBhIHRpbWUtdHJhdmVsIGN1cnNvciBzdG9wIOKAlCBidXQgd2l0aFxuICAgICAgLy8gWkVSTyBjbG9uZXM6IG5vIGJ1ZmZlciBjb25zdHJ1Y3Rpb24sIG5vIGFwcGx5UGF0Y2ggcmVwbGF5LlxuICAgICAgdGhpcy5ldmVudExvZz8ucmVjb3JkKHtcbiAgICAgICAgb3ZlcndyaXRlOiB7fSxcbiAgICAgICAgdXBkYXRlczoge30sXG4gICAgICAgIHJlZGFjdGVkUGF0aHM6IFtdLFxuICAgICAgICB0cmFjZTogW10sXG4gICAgICAgIHN0YWdlOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyKHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfSk7XG4gICAgICB9XG4gICAgICAvLyAjMTNiOiBkcm9wIHRoZSBmaXJzdC10b3VjaCB2aWV3IOKAlCBhIHJlYWQtb25seSBzdGFnZSBzdGlsbCBwaW5uZWQgb25lXG4gICAgICAvLyBmdWxsIHN0YXRlIGdlbmVyYXRpb24gdGhyb3VnaCBpdC5cbiAgICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1bmRsZSA9IHRoaXMuYnVmZmVyLmNvbW1pdCgpO1xuICAgIGNvbnN0IGNvbW1pdEJ1bmRsZSA9IHtcbiAgICAgIC4uLmJ1bmRsZSxcbiAgICAgIHN0YWdlOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgIH07XG5cbiAgICB0aGlzLnNoYXJlZE1lbW9yeS5hcHBseVBhdGNoKGNvbW1pdEJ1bmRsZS5vdmVyd3JpdGUsIGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUudHJhY2UpO1xuXG4gICAgLy8gQWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIGZlZWQgdGhyZWUgY29uc3VtZXJzOlxuICAgIC8vICAgMS4gdGhlIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgZW5hYmxlZClcbiAgICAvLyAgIDIuIHRoZSBldmVudCBsb2cgKHBlcnNpc3RlZCB0cmFjZSlcbiAgICAvLyAgIDMuIChmdXR1cmUpIGFueXRoaW5nIGVsc2UgdGhhdCB3YW50cyBhIHNjcnViYmVkIHZpZXcgYXQgY29tbWl0IHRpbWVcbiAgICAvLyBDb21wdXRpbmcgb25jZSBrZWVwcyBjb3N0IGxpbmVhciBpbiB0aGUgY29tbWl0IHNpemU7IG5vIHBvc3QtcGFzcyB3YWxrLlxuICAgIGNvbnN0IHJlZGFjdGVkT3ZlcndyaXRlID0gcmVkYWN0UGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIGNvbnN0IHJlZGFjdGVkVXBkYXRlcyA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocyk7XG5cbiAgICB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5Py5hcHBseVBhdGNoKHJlZGFjdGVkT3ZlcndyaXRlLCByZWRhY3RlZFVwZGF0ZXMsIGNvbW1pdEJ1bmRsZS50cmFjZSk7XG5cbiAgICB0aGlzLmV2ZW50TG9nPy5yZWNvcmQoe1xuICAgICAgLi4uY29tbWl0QnVuZGxlLFxuICAgICAgcmVkYWN0ZWRQYXRoczogQXJyYXkuZnJvbShjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocy52YWx1ZXMoKSksXG4gICAgICBvdmVyd3JpdGU6IHJlZGFjdGVkT3ZlcndyaXRlLFxuICAgICAgdXBkYXRlczogcmVkYWN0ZWRVcGRhdGVzLFxuICAgIH0pO1xuXG4gICAgLy8gTm90aWZ5IG9ic2VydmVyIChTY29wZUZhY2FkZSkgd2l0aCB0cmFja2VkIG11dGF0aW9uc1xuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG5cbiAgICAvLyAjMTNiOiByZWxlYXNlIHRoZSBzdGFnaW5nIHN0YXRlIOKAlCBzZWUgdGhlIG1ldGhvZCBKU0RvYy4gRG9uZSBMQVNUIHNvXG4gICAgLy8gdGhlIGNvbW1pdCBvYnNlcnZlciBzZWVzIHRoZSBleGFjdCBzYW1lIHdvcmxkIGFzIGJlZm9yZSB0aGUgcmVsZWFzZS5cbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0YXRlVmlldyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENyZWF0ZSAob3IgcmV0dXJuKSB0aGlzIGNvbnRleHQncyBsaW5rZWQgc3VjY2Vzc29yLlxuICAgKlxuICAgKiBNRU1PSVpFRDogdGhlIGZpcnN0IGNhbGwgY3JlYXRlcyBgdGhpcy5uZXh0YDsgZXZlcnkgbGF0ZXIgY2FsbCByZXR1cm5zXG4gICAqIHRoYXQgU0FNRSBjb250ZXh0IGFuZCBJR05PUkVTIGl0cyBhcmd1bWVudHMuIEluIG5vcm1hbCB0cmF2ZXJzYWwgZWFjaFxuICAgKiBjb250ZXh0IGFkdmFuY2VzIGV4YWN0bHkgb25jZSwgc28gdGhlIG1lbW8gbmV2ZXIgYml0ZXMg4oCUIGJ1dCBhIGNhbGxlclxuICAgKiBleHBlY3RpbmcgYSBmcmVzaCBjb250ZXh0IGZvciBkaWZmZXJlbnQgYHN0YWdlTmFtZWAvYHN0YWdlSWRgIGFyZ3MgZ2V0c1xuICAgKiB0aGUgb2xkIG9uZSBzaWxlbnRseS4gRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSB3YXJucyBvbiB0aGF0XG4gICAqIG1pc21hdGNoIChiYWNrbG9nIEI0KS5cbiAgICovXG4gIGNyZWF0ZU5leHQocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRoaXMubmV4dCA9IG5ldyBTdGFnZUNvbnRleHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnNoYXJlZE1lbW9yeSwgJycsIHRoaXMuZXZlbnRMb2csIGlzRGVjaWRlcik7XG4gICAgICB0aGlzLm5leHQucGFyZW50ID0gdGhpcztcbiAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgcmVkYWN0ZWQgbWlycm9yIGRvd24gdGhlIGNvbnRleHQgdHJlZSBzbyBldmVyeSBjb21taXRcbiAgICAgIC8vIGluIHRoZSBydW4gd3JpdGVzIHRvIGJvdGggdmlld3MuXG4gICAgICBpZiAodGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSkgdGhpcy5uZXh0LnJlZGFjdGVkU2hhcmVkTWVtb3J5ID0gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgICAgIHRoaXMubmV4dC5yZWFkVHJhY2tpbmcgPSB0aGlzLnJlYWRUcmFja2luZztcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksIGJyYW5jaElkLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgaWYgKHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkpIGNoaWxkLnJlZGFjdGVkU2hhcmVkTWVtb3J5ID0gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgICBjaGlsZC5yZWFkVHJhY2tpbmcgPSB0aGlzLnJlYWRUcmFja2luZztcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICAvLyBJdGVyYXRpdmUgd2FsayAoZXhwbGljaXQgd29yayBzdGFjayksIE5PVCByZWN1cnNpb246IHRoZSBleGVjdXRpb25cbiAgICAvLyB0cmVlIGRlZXBlbnMgYnkgb25lIGxldmVsIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBgbmV4dGAgY2hhaW5zLCBhbmRcbiAgICAvLyB0aGUgdHJhbXBvbGluZWQgdHJhdmVyc2VyIGFsbG93cyBjaGFpbnMvbG9vcHMgb2YgdGVucyBvZiB0aG91c2FuZHMgb2ZcbiAgICAvLyBzdGFnZXMg4oCUIGZhciBkZWVwZXIgdGhhbiBhIHJlY3Vyc2l2ZSBzZXJpYWxpemVyIGNhbiB3YWxrIGJlZm9yZVxuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgICBjb25zdCByb290ID0gdGhpcy5zbmFwc2hvdFNlbGYoKTtcbiAgICBjb25zdCB3b3JrOiBBcnJheTx7IGN0eDogU3RhZ2VDb250ZXh0OyBzbmFwOiBTdGFnZVNuYXBzaG90IH0+ID0gW3sgY3R4OiB0aGlzLCBzbmFwOiByb290IH1dO1xuICAgIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgY3R4LCBzbmFwIH0gPSB3b3JrLnBvcCgpITtcbiAgICAgIGlmIChjdHgubmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0U25hcCA9IGN0eC5uZXh0LnNuYXBzaG90U2VsZigpO1xuICAgICAgICBzbmFwLm5leHQgPSBuZXh0U25hcDtcbiAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjdHgubmV4dCwgc25hcDogbmV4dFNuYXAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY3R4LmNoaWxkcmVuKSB7XG4gICAgICAgIHNuYXAuY2hpbGRyZW4gPSBjdHguY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkU25hcCA9IGNoaWxkLnNuYXBzaG90U2VsZigpO1xuICAgICAgICAgIHdvcmsucHVzaCh7IGN0eDogY2hpbGQsIHNuYXA6IGNoaWxkU25hcCB9KTtcbiAgICAgICAgICByZXR1cm4gY2hpbGRTbmFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKiogU25hcHNob3Qgb2YgVEhJUyBjb250ZXh0J3Mgb3duIGZpZWxkcyDigJQgYG5leHRgL2BjaGlsZHJlbmAgYXJlIGZpbGxlZFxuICAgKiAgaW4gYnkgdGhlIGl0ZXJhdGl2ZSB3YWxrIGluIGBnZXRTbmFwc2hvdGAuICovXG4gIHByaXZhdGUgc25hcHNob3RTZWxmKCk6IFN0YWdlU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBTdGFnZVNuYXBzaG90ID0ge1xuICAgICAgaWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgaXNEZWNpZGVyOiB0aGlzLmlzRGVjaWRlcixcbiAgICAgIGlzRm9yazogdGhpcy5pc0ZvcmssXG4gICAgICBsb2dzOiB0aGlzLmRlYnVnLmxvZ0NvbnRleHQsXG4gICAgICBlcnJvcnM6IHRoaXMuZGVidWcuZXJyb3JDb250ZXh0LFxuICAgICAgbWV0cmljczogdGhpcy5kZWJ1Zy5tZXRyaWNDb250ZXh0LFxuICAgICAgZXZhbHM6IHRoaXMuZGVidWcuZXZhbENvbnRleHQsXG4gICAgfTtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc3RhZ2VXcml0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIG9ubHkgZm9yIHRoZSBzbmFwc2hvdCAoc3RyaXAgb3BlcmF0aW9uIG1ldGFkYXRhKVxuICAgICAgY29uc3Qgd3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaywgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3N0YWdlV3JpdGVzKSkge1xuICAgICAgICB3cml0ZXNba10gPSBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90LnN0YWdlV3JpdGVzID0gd3JpdGVzO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3Quc3RhZ2VSZWFkcyA9IHRoaXMuX3N0YWdlUmVhZHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBzbmFwc2hvdC5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YmZsb3dJZCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd0lkID0gdGhpcy5zdWJmbG93SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5mbG93TWVzc2FnZXMgPSB0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG59XG4iXX0=
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* TransactionBuffer —
|
|
3
|
+
* TransactionBuffer — Per-stage STAGING buffer for state mutations
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
5
|
+
* What it IS: a staging buffer with read-your-writes and net-change commits.
|
|
6
|
+
* - Changes are staged here during stage execution and flushed to
|
|
7
|
+
* SharedMemory in ONE batch per stage (`commit()`) — other stages and
|
|
8
|
+
* parallel siblings never observe a stage's half-finished writes.
|
|
9
|
+
* - Read-after-write consistency within a stage — a stage sees its own
|
|
10
|
+
* staged writes immediately.
|
|
11
|
+
* - `commit()` records the stage's NET change (see {@link commit}), plus an
|
|
12
|
+
* operation trace for deterministic replay.
|
|
13
|
+
*
|
|
14
|
+
* What it is NOT: a rollback mechanism. Despite the name, there is no
|
|
15
|
+
* abort/rollback path — when a stage THROWS, the engine still commits
|
|
16
|
+
* everything staged so far before re-throwing (commit-on-error in
|
|
17
|
+
* `FlowchartTraverser`). That is deliberate: the audit trail must record
|
|
18
|
+
* what the failing stage changed. Do not rely on "stage failed → its
|
|
19
|
+
* writes vanished".
|
|
10
20
|
*/
|
|
11
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
22
|
exports.TransactionBuffer = void 0;
|
|
@@ -150,4 +160,4 @@ class TransactionBuffer {
|
|
|
150
160
|
}
|
|
151
161
|
}
|
|
152
162
|
exports.TransactionBuffer = TransactionBuffer;
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7OztBQUVILDZDQUFvRTtBQUVwRSx5Q0FBNkU7QUFFN0UsTUFBYSxpQkFBaUI7SUFDWCxZQUFZLENBQU07SUFDM0IsV0FBVyxDQUFNO0lBRWpCLGNBQWMsR0FBZ0IsRUFBRSxDQUFDO0lBQ2pDLFdBQVcsR0FBZ0IsRUFBRSxDQUFDO0lBQzlCLE9BQU8sR0FBOEMsRUFBRSxDQUFDO0lBQ3hELGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTFDLFlBQVksSUFBUztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEdBQUcsQ0FBQyxJQUF5QixFQUFFLEtBQVUsRUFBRSxZQUFZLEdBQUcsS0FBSztRQUM3RCxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUEsd0JBQWEsRUFBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxF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dEIsSUFBQSxzQkFBSSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBQSxzQkFBSSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBNUpELDhDQTRKQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFRyYW5zYWN0aW9uYWwgd3JpdGUgYnVmZmVyIGZvciBzdGFnZSBtdXRhdGlvbnNcbiAqXG4gKiBDb2xsZWN0cyB3cml0ZXMgZHVyaW5nIGV4ZWN1dGlvbiBhbmQgY29tbWl0cyB0aGVtIGF0b21pY2FsbHkuXG4gKiBMaWtlIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24gYnVmZmVyOlxuICogLSBDaGFuZ2VzIHN0YWdlZCBoZXJlIGJlZm9yZSBiZWluZyBjb21taXR0ZWQgdG8gU2hhcmVkTWVtb3J5XG4gKiAtIEVuYWJsZXMgcmVhZC1hZnRlci13cml0ZSBjb25zaXN0ZW5jeSB3aXRoaW4gYSBzdGFnZVxuICogLSBSZWNvcmRzIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXlcbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBkZWVwU21hcnRNZXJnZSwgREVMSU0sIG5vcm1hbGlzZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoYmFzZTogYW55KSB7XG4gICAgdGhpcy5iYXNlU25hcHNob3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgfVxuXG4gIC8qKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgc3RydWN0dXJlZENsb25lKHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnc2V0JyB9KTtcbiAgfVxuXG4gIC8qKiBEZWVwIHVuaW9uIG1lcmdlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoLCBkZWVwU21hcnRNZXJnZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgpID8/IHt9LCB2YWx1ZSkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChwYXRoKSk7XG4gICAgfVxuICAgIHRoaXMub3BUcmFjZS5wdXNoKHsgcGF0aDogbm9ybWFsaXNlUGF0aChwYXRoKSwgdmVyYjogJ21lcmdlJyB9KTtcbiAgfVxuXG4gIC8qKiBSZWFkIGN1cnJlbnQgdmFsdWUgYXQgcGF0aCAoaW5jbHVkZXMgdW5jb21taXR0ZWQgY2hhbmdlcykuICovXG4gIGdldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpIHtcbiAgICByZXR1cm4gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiBpcyBzdGlsbCB1bnJlcHJlc2VudGFibGUgaW4gTWVtb3J5UGF0Y2ggKGEgcmVtb3ZlZFxuICAgKiAgICAga2V5IGNhbm5vdCBiZSBleHByZXNzZWQpLiBTZXR0aW5nIGEga2V5IHRvIGB1bmRlZmluZWRgIGlzIHRyZWF0ZWQgYXMgYVxuICAgKiAgICAgY2hhbmdlICh2YWx1ZSBkaWZmZXJzIGZyb20gYmFzZSksIG5vdCBhIGRlbGV0aW9uLiBUcmFja2VkIGZvciBhIGZ1dHVyZVxuICAgKiAgICAgYGRlbGV0ZWAgdmVyYi5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG5cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkIG92ZXJ3cml0ZSAvIHVwZGF0ZXMgLyB0cmFjZSBrZWVwaW5nIE9OTFkgcGF0aHMgd2hvc2UgZmluYWwgdmFsdWVcbiAgICogZGlmZmVycyBmcm9tIHRoZSBiYXNlIHZhbHVlIOKAlCBpLmUuIHRoZSBzdGFnZSdzIG5ldCBjaGFuZ2UuIFNlZVxuICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXIuY29tbWl0fSBmb3IgdGhlIHJhdGlvbmFsZS5cbiAgICpcbiAgICogUGF0aHMgYXJlIGNvbXBhcmVkIGF0IHRoZSBleGFjdCBncmFudWxhcml0eSB0aGV5IHdlcmUgd3JpdHRlbiAoZWFjaCB0cmFjZVxuICAgKiBlbnRyeSdzIHBhdGgpLCBhZ2FpbnN0IGB3b3JraW5nQ29weWAgKGZpbmFsKSB2cyBgYmFzZVNuYXBzaG90YCAoc3RhcnQpLlxuICAgKiBTdXJ2aXZpbmcgYHNldGAgcGF0aHMgY29weSB0aGVpciBmaW5hbCB2YWx1ZSBmcm9tIGBvdmVyd3JpdGVQYXRjaGA7XG4gICAqIHN1cnZpdmluZyBgbWVyZ2VgIHBhdGhzIGNvcHkgdGhlaXIgYWNjdW11bGF0ZWQgZGVsdGEgZnJvbSBgdXBkYXRlUGF0Y2hgIOKAlFxuICAgKiBwcmVzZXJ2aW5nIHRoZSBzZXQtdnMtbWVyZ2UgdmVyYiBzbyByZXBsYXkgKHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9KSBpc1xuICAgKiBieXRlLWZvci1ieXRlIGlkZW50aWNhbCB0byByZWNvcmRpbmcgb25seSB0aGUgcmVhbCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3Qgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXM6IE1lbW9yeVBhdGNoID0ge307XG4gICAgY29uc3QgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdID0gW107XG4gICAgY29uc3Qgc3Vydml2aW5nUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIGlmIChkZWVwRXF1YWwoYmVmb3JlLCBhZnRlcikpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKG9wKTtcbiAgICAgIHN1cnZpdmluZ1BhdGhzLmFkZChvcC5wYXRoKTtcbiAgICAgIGlmIChvcC52ZXJiID09PSAnc2V0Jykge1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQoWy4uLnRoaXMucmVkYWN0ZWRQYXRoc10uZmlsdGVyKChwYXRoKSA9PiBzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpKTtcbiAgICByZXR1cm4geyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlIH07XG4gIH1cbn1cbiJdfQ==
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRzs7O0FBRUgsNkNBQW9FO0FBRXBFLHlDQUE2RTtBQUU3RSxNQUFhLGlCQUFpQjtJQUNYLFlBQVksQ0FBTTtJQUMzQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUE4QyxFQUFFLENBQUM7SUFDeEQsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFMUMsWUFBWSxJQUFTO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCw0Q0FBNEM7SUFDNUMsR0FBRyxDQUFDLElBQXlCLEVBQUUsS0FBVSxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQzdELElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFBLHdCQUFhLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxFQUFFLElBQUks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RSxDQUFDO2dCQUN0QixJQUFBLHNCQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFBLHNCQUFJLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUE1SkQsOENBNEpDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmFuc2FjdGlvbkJ1ZmZlciDigJQgUGVyLXN0YWdlIFNUQUdJTkcgYnVmZmVyIGZvciBzdGF0ZSBtdXRhdGlvbnNcbiAqXG4gKiBXaGF0IGl0IElTOiBhIHN0YWdpbmcgYnVmZmVyIHdpdGggcmVhZC15b3VyLXdyaXRlcyBhbmQgbmV0LWNoYW5nZSBjb21taXRzLlxuICogLSBDaGFuZ2VzIGFyZSBzdGFnZWQgaGVyZSBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uIGFuZCBmbHVzaGVkIHRvXG4gKiAgIFNoYXJlZE1lbW9yeSBpbiBPTkUgYmF0Y2ggcGVyIHN0YWdlIChgY29tbWl0KClgKSDigJQgb3RoZXIgc3RhZ2VzIGFuZFxuICogICBwYXJhbGxlbCBzaWJsaW5ncyBuZXZlciBvYnNlcnZlIGEgc3RhZ2UncyBoYWxmLWZpbmlzaGVkIHdyaXRlcy5cbiAqIC0gUmVhZC1hZnRlci13cml0ZSBjb25zaXN0ZW5jeSB3aXRoaW4gYSBzdGFnZSDigJQgYSBzdGFnZSBzZWVzIGl0cyBvd25cbiAqICAgc3RhZ2VkIHdyaXRlcyBpbW1lZGlhdGVseS5cbiAqIC0gYGNvbW1pdCgpYCByZWNvcmRzIHRoZSBzdGFnZSdzIE5FVCBjaGFuZ2UgKHNlZSB7QGxpbmsgY29tbWl0fSksIHBsdXMgYW5cbiAqICAgb3BlcmF0aW9uIHRyYWNlIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS5cbiAqXG4gKiBXaGF0IGl0IGlzIE5PVDogYSByb2xsYmFjayBtZWNoYW5pc20uIERlc3BpdGUgdGhlIG5hbWUsIHRoZXJlIGlzIG5vXG4gKiBhYm9ydC9yb2xsYmFjayBwYXRoIOKAlCB3aGVuIGEgc3RhZ2UgVEhST1dTLCB0aGUgZW5naW5lIHN0aWxsIGNvbW1pdHNcbiAqIGV2ZXJ5dGhpbmcgc3RhZ2VkIHNvIGZhciBiZWZvcmUgcmUtdGhyb3dpbmcgKGNvbW1pdC1vbi1lcnJvciBpblxuICogYEZsb3djaGFydFRyYXZlcnNlcmApLiBUaGF0IGlzIGRlbGliZXJhdGU6IHRoZSBhdWRpdCB0cmFpbCBtdXN0IHJlY29yZFxuICogd2hhdCB0aGUgZmFpbGluZyBzdGFnZSBjaGFuZ2VkLiBEbyBub3QgcmVseSBvbiBcInN0YWdlIGZhaWxlZCDihpIgaXRzXG4gKiB3cml0ZXMgdmFuaXNoZWRcIi5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlU2V0IGFzIF9zZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBkZWVwU21hcnRNZXJnZSwgREVMSU0sIG5vcm1hbGlzZVBhdGggfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoYmFzZTogYW55KSB7XG4gICAgdGhpcy5iYXNlU25hcHNob3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHN0cnVjdHVyZWRDbG9uZShiYXNlKTtcbiAgfVxuXG4gIC8qKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguICovXG4gIHNldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IHZvaWQge1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdmFsdWUpO1xuICAgIF9zZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgcGF0aCwgc3RydWN0dXJlZENsb25lKHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChub3JtYWxpc2VQYXRoKHBhdGgpKTtcbiAgICB9XG4gICAgdGhpcy5vcFRyYWNlLnB1c2goeyBwYXRoOiBub3JtYWxpc2VQYXRoKHBhdGgpLCB2ZXJiOiAnc2V0JyB9KTtcbiAgfVxuXG4gIC8qKiBEZWVwIHVuaW9uIG1lcmdlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4gKi9cbiAgbWVyZ2UocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCkgPz8ge307XG4gICAgY29uc3QgbWVyZ2VkID0gZGVlcFNtYXJ0TWVyZ2UoZXhpc3RpbmcsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIG1lcmdlZCk7XG4gICAgX3NldCh0aGlzLnVwZGF0ZVBhdGNoLCBwYXRoLCBkZWVwU21hcnRNZXJnZShfZ2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgpID8/IHt9LCB2YWx1ZSkpO1xuICAgIGlmIChzaG91bGRSZWRhY3QpIHtcbiAgICAgIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChwYXRoKSk7XG4gICAgfVxuICAgIHRoaXMub3BUcmFjZS5wdXNoKHsgcGF0aDogbm9ybWFsaXNlUGF0aChwYXRoKSwgdmVyYjogJ21lcmdlJyB9KTtcbiAgfVxuXG4gIC8qKiBSZWFkIGN1cnJlbnQgdmFsdWUgYXQgcGF0aCAoaW5jbHVkZXMgdW5jb21taXR0ZWQgY2hhbmdlcykuICovXG4gIGdldChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBkZWZhdWx0VmFsdWU/OiBhbnkpIHtcbiAgICByZXR1cm4gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCBkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiBpcyBzdGlsbCB1bnJlcHJlc2VudGFibGUgaW4gTWVtb3J5UGF0Y2ggKGEgcmVtb3ZlZFxuICAgKiAgICAga2V5IGNhbm5vdCBiZSBleHByZXNzZWQpLiBTZXR0aW5nIGEga2V5IHRvIGB1bmRlZmluZWRgIGlzIHRyZWF0ZWQgYXMgYVxuICAgKiAgICAgY2hhbmdlICh2YWx1ZSBkaWZmZXJzIGZyb20gYmFzZSksIG5vdCBhIGRlbGV0aW9uLiBUcmFja2VkIGZvciBhIGZ1dHVyZVxuICAgKiAgICAgYGRlbGV0ZWAgdmVyYi5cbiAgICogICDigKIgQXJyYXktbWVyZ2UgZGVkdXAgaW4ge0BsaW5rIGRlZXBTbWFydE1lcmdlfSBzdGlsbCB1c2VzIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgKiAgICAgKGBuZXcgU2V0YCksIHNvIGRlZXAtZXF1YWwgKm9iamVjdHMqIGluIGEgbWVyZ2VkIGFycmF5IGFyZSBub3QgZGVkdXBlZC5cbiAgICogICAgIE9ydGhvZ29uYWwgdG8gdGhpcyBjaGFuZ2U7IHRyYWNrZWQgc2VwYXJhdGVseS5cbiAgICpcbiAgICogUmVzZXRzIHRoZSBidWZmZXIgdG8gZW1wdHkgc3RhdGUgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgY29tbWl0KCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMudG9DaGFuZ2VPbmx5UGF5bG9hZCgpO1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtpbmdDb3B5ID0ge307XG5cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkIG92ZXJ3cml0ZSAvIHVwZGF0ZXMgLyB0cmFjZSBrZWVwaW5nIE9OTFkgcGF0aHMgd2hvc2UgZmluYWwgdmFsdWVcbiAgICogZGlmZmVycyBmcm9tIHRoZSBiYXNlIHZhbHVlIOKAlCBpLmUuIHRoZSBzdGFnZSdzIG5ldCBjaGFuZ2UuIFNlZVxuICAgKiB7QGxpbmsgVHJhbnNhY3Rpb25CdWZmZXIuY29tbWl0fSBmb3IgdGhlIHJhdGlvbmFsZS5cbiAgICpcbiAgICogUGF0aHMgYXJlIGNvbXBhcmVkIGF0IHRoZSBleGFjdCBncmFudWxhcml0eSB0aGV5IHdlcmUgd3JpdHRlbiAoZWFjaCB0cmFjZVxuICAgKiBlbnRyeSdzIHBhdGgpLCBhZ2FpbnN0IGB3b3JraW5nQ29weWAgKGZpbmFsKSB2cyBgYmFzZVNuYXBzaG90YCAoc3RhcnQpLlxuICAgKiBTdXJ2aXZpbmcgYHNldGAgcGF0aHMgY29weSB0aGVpciBmaW5hbCB2YWx1ZSBmcm9tIGBvdmVyd3JpdGVQYXRjaGA7XG4gICAqIHN1cnZpdmluZyBgbWVyZ2VgIHBhdGhzIGNvcHkgdGhlaXIgYWNjdW11bGF0ZWQgZGVsdGEgZnJvbSBgdXBkYXRlUGF0Y2hgIOKAlFxuICAgKiBwcmVzZXJ2aW5nIHRoZSBzZXQtdnMtbWVyZ2UgdmVyYiBzbyByZXBsYXkgKHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9KSBpc1xuICAgKiBieXRlLWZvci1ieXRlIGlkZW50aWNhbCB0byByZWNvcmRpbmcgb25seSB0aGUgcmVhbCBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IHtcbiAgICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoO1xuICAgIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAgIHJlZGFjdGVkUGF0aHM6IFNldDxzdHJpbmc+O1xuICAgIHRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIH1bXTtcbiAgfSB7XG4gICAgY29uc3Qgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCA9IHt9O1xuICAgIGNvbnN0IHVwZGF0ZXM6IE1lbW9yeVBhdGNoID0ge307XG4gICAgY29uc3QgdHJhY2U6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfVtdID0gW107XG4gICAgY29uc3Qgc3Vydml2aW5nUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3Qgb3Agb2YgdGhpcy5vcFRyYWNlKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IG9wLnBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgc2VnbWVudHMpO1xuICAgICAgY29uc3QgYWZ0ZXIgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHNlZ21lbnRzKTtcbiAgICAgIGlmIChkZWVwRXF1YWwoYmVmb3JlLCBhZnRlcikpIGNvbnRpbnVlOyAvLyBuby1vcCBvciB3cml0ZS10aGVuLXJldmVydCDihpIgbm8gbmV0IGNoYW5nZVxuXG4gICAgICB0cmFjZS5wdXNoKG9wKTtcbiAgICAgIHN1cnZpdmluZ1BhdGhzLmFkZChvcC5wYXRoKTtcbiAgICAgIGlmIChvcC52ZXJiID09PSAnc2V0Jykge1xuICAgICAgICBfc2V0KG92ZXJ3cml0ZSwgc2VnbWVudHMsIHN0cnVjdHVyZWRDbG9uZShfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkYWN0ZWRQYXRocyA9IG5ldyBTZXQoWy4uLnRoaXMucmVkYWN0ZWRQYXRoc10uZmlsdGVyKChwYXRoKSA9PiBzdXJ2aXZpbmdQYXRocy5oYXMocGF0aCkpKTtcbiAgICByZXR1cm4geyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHJlZGFjdGVkUGF0aHMsIHRyYWNlIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -64,12 +64,17 @@ exports.hasEmitRecorderMethods = exports.hasFlowRecorderMethods = exports.hasRec
|
|
|
64
64
|
*
|
|
65
65
|
* ## How it discriminates
|
|
66
66
|
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* `
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
67
|
+
* 1. **Explicit `channel` field first** (backlog B3): every engine-dispatched
|
|
68
|
+
* shared-method event is stamped `channel: 'flow'` (control-flow) or
|
|
69
|
+
* `channel: 'scope'` (data-flow) at construction. This is the positive,
|
|
70
|
+
* schema-robust signal — it survives wrappers that add/strip fields.
|
|
71
|
+
* 2. **Legacy fallback** for unstamped events (consumer-fabricated tests,
|
|
72
|
+
* persisted traces from <9.2): scope-channel events extend
|
|
73
|
+
* `RecorderContext`, which carries `pipelineId`; flow-channel events do
|
|
74
|
+
* not. The flow variant is detected by the ABSENCE of `pipelineId` —
|
|
75
|
+
* schema-stable as long as scope events continue to extend
|
|
76
|
+
* `RecorderContext`, but fragile against field-stripping wrappers, which
|
|
77
|
+
* is why the explicit discriminant now exists.
|
|
73
78
|
*
|
|
74
79
|
* @example
|
|
75
80
|
* ```ts
|
|
@@ -85,7 +90,12 @@ exports.hasEmitRecorderMethods = exports.hasFlowRecorderMethods = exports.hasRec
|
|
|
85
90
|
function isFlowEvent(event) {
|
|
86
91
|
if (typeof event !== 'object' || event === null)
|
|
87
92
|
return false;
|
|
88
|
-
|
|
93
|
+
const e = event;
|
|
94
|
+
if (e.channel === 'flow')
|
|
95
|
+
return true;
|
|
96
|
+
if (e.channel === 'scope')
|
|
97
|
+
return false;
|
|
98
|
+
return e.pipelineId === undefined;
|
|
89
99
|
}
|
|
90
100
|
exports.isFlowEvent = isFlowEvent;
|
|
91
101
|
/**
|
|
@@ -111,8 +121,8 @@ const RECORDER_EVENT_METHODS = [
|
|
|
111
121
|
* NOTE: the `onError`, `onPause`, `onResume` methods exist on BOTH interfaces
|
|
112
122
|
* with DIFFERENT event payload shapes. A `CombinedRecorder` that implements
|
|
113
123
|
* any of these receives both variants (one from each channel). Consumers who
|
|
114
|
-
* care about the distinction
|
|
115
|
-
* `
|
|
124
|
+
* care about the distinction discriminate with `isFlowEvent()` (explicit
|
|
125
|
+
* `channel` discriminant, legacy pipelineId-absence fallback).
|
|
116
126
|
*/
|
|
117
127
|
const FLOW_RECORDER_EVENT_METHODS = [
|
|
118
128
|
'onStageExecuted',
|
|
@@ -222,4 +232,4 @@ function hasEmitRecorderMethods(r) {
|
|
|
222
232
|
return EMIT_RECORDER_EVENT_METHODS.some((m) => hasOwnOrClassMethod(r, m));
|
|
223
233
|
}
|
|
224
234
|
exports.hasEmitRecorderMethods = hasEmitRecorderMethods;
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1REc7OztBQW1GSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFJLEtBQVE7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxPQUFRLEtBQWlDLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQztBQUNyRSxDQUFDO0FBSEQsa0NBR0M7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRztJQUNsQyxpQkFBaUI7SUFDakIsUUFBUTtJQUNSLFlBQVk7SUFDWixRQUFRO0lBQ1IsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0lBQ1Ysc0VBQXNFO0lBQ3RFLDREQUE0RDtJQUM1RCx1RUFBdUU7SUFDdkUscUVBQXFFO0lBQ3JFLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtDQUNMLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLFFBQVEsQ0FBVSxDQUFDO0FBRXhEOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxDQUFVLEVBQUUsQ0FBUztJQUNoRCxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sT0FBUSxDQUE2QixDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQVksTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxPQUFPLE9BQVEsS0FBaUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7UUFDckUsQ0FBQztRQUNELEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxDQUFtQjtJQUNwRCxPQUFPLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUZELGdEQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsQ0FBbUI7SUFDeEQsT0FBTywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFGRCx3REFFQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxDQUFtQjtJQUN4RCxPQUFPLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUZELHdEQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21iaW5lZFJlY29yZGVyIOKAlCBhIHNpbmdsZSBvYnNlcnZlciB0aGF0IGNhbiBob29rIGludG8gTVVMVElQTEUgZXZlbnRcbiAqIHN0cmVhbXMgKGN1cnJlbnRseTogc2NvcGUgZGF0YS1mbG93ICsgY29udHJvbC1mbG93KS4gT25lIG9iamVjdCwgb25lIGBpZGAsXG4gKiBvbmUgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBleGVjdXRpb24uXG4gKlxuICogIyMgV2h5IHRoaXMgZXhpc3RzXG4gKlxuICogQmVmb3JlIGBDb21iaW5lZFJlY29yZGVyYCwgYSBjb25zdW1lciB3aG8gd2FudGVkIHRvIG9ic2VydmUgYm90aCBzdHJlYW1zXG4gKiBoYWQgdG86XG4gKiAgIDEuIEltcGxlbWVudCBib3RoIGBTY29wZVJlY29yZGVyYCAoOCBtZXRob2RzKSBhbmQgYEZsb3dSZWNvcmRlcmAgKDEyIG1ldGhvZHMpXG4gKiAgICAgIGZ1bGx5IOKAlCBzdHViYmluZyBldmVyeSBldmVudCB0aGV5IGRpZG4ndCBjYXJlIGFib3V0LlxuICogICAyLiBSZW1lbWJlciB0byBjYWxsIEJPVEggYGF0dGFjaFNjb3BlUmVjb3JkZXIocilgIEFORCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYC5cbiAqICAgICAgRm9yZ2V0dGluZyB0aGUgc2Vjb25kIGNhbGwgc2lsZW50bHkgZHJvcHBlZCBoYWxmIHRoZWlyIGV2ZW50cyDigJQgbm9cbiAqICAgICAgd2FybmluZywgbm8gcnVudGltZSBlcnJvci5cbiAqICAgMy4gUmUtaW1wbGVtZW50IGNvb3JkaW5hdGlvbiBsb2dpYyAoYnVmZmVyaW5nLCBvcmRlcmluZykgdGhlbXNlbHZlcy5cbiAqXG4gKiBgQ29tYmluZWRSZWNvcmRlcmAgY29sbGFwc2VzIHRoYXQgaW50byBhIHNpbmdsZSB0eXBlIGFuZCBhIHNpbmdsZSBhdHRhY2hcbiAqIGNhbGwgKGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCksIHdpdGggdGhlIGxpYnJhcnkgaGFuZGxpbmcgdGhlXG4gKiByb3V0aW5nIGludGVybmFsbHkuIENvbnN1bWVycyBpbXBsZW1lbnQgb25seSB0aGUgZXZlbnRzIHRoZXkgY2FyZSBhYm91dFxuICogKGBQYXJ0aWFsPC4uLj5gKSBhbmQgdGhlIGF0dGFjaCBtZXRob2QgZHVjay10eXBlcyBhdCBydW50aW1lIHRvIGRpc3BhdGNoXG4gKiB0byB0aGUgcmVsZXZhbnQgY2hhbm5lbHMuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgaXMgYWRkZWQgKGUuZy4gYW4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZVxuICogYENvbWJpbmVkUmVjb3JkZXJgIHR5cGUgZ2FpbnMgYW4gYCYgUGFydGlhbDxPcGVyYXRpb25SZWNvcmRlcj5gIGNsYXVzZSBhbmRcbiAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCBnYWlucyBvbmUgbW9yZSBydW50aW1lIGJyYW5jaCBpbiBpdHMgZGlzcGF0Y2guXG4gKiBDb25zdW1lcnMgd3JpdGluZyBhIGBDb21iaW5lZFJlY29yZGVyYCB0b2RheSBhcmUgTk9UIGFmZmVjdGVkIOKAlCB0aGVpclxuICogY29kZSBrZWVwcyBjb21waWxpbmcgYW5kIGF0dGFjaGluZyBjb3JyZWN0bHksIGJlY2F1c2UgZXZlcnkgbmV3IGxheWVyIGlzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMnO1xuICpcbiAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICogICBpZDogJ2F1ZGl0JyxcbiAqICAgb25Xcml0ZTogKGUpID0+IGxvZ1dyaXRlKGUua2V5LCBlLnZhbHVlKSwgICAgICAgIC8vIFNjb3BlUmVjb3JkZXIgbWV0aG9kXG4gKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2dEZWNpc2lvbihlLmNob3NlbiksICAgICAgICAvLyBGbG93UmVjb3JkZXIgbWV0aG9kXG4gKiB9O1xuICpcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICogLy8gXiBpbnRlcm5hbGx5OiBkZXRlY3RzIGJvdGggc2V0cyBvZiBtZXRob2RzLCByb3V0ZXMgdG8gYm90aCBjaGFubmVscy5cbiAqIGBgYFxuICpcbiAqICMjIENvbnRyYWN0IHdpdGggZXhpc3RpbmcgQVBJc1xuICpcbiAqIC0gYGF0dGFjaFNjb3BlUmVjb3JkZXIocilgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYCByZW1haW4gdW5jaGFuZ2VkLlxuICogICBDb25zdW1lcnMgd2hvIHdhbnQgb25seSBPTkUgY2hhbm5lbCBrZWVwIHVzaW5nIHRoZW0g4oCUIGV4cGxpY2l0IGlzIGdvb2QuXG4gKiAtIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCBpcyB0aGUgT05MWSB3YXkgdG8gZ3VhcmFudGVlIGFuIG9iamVjdCBpc1xuICogICBob29rZWQgaW50byBldmVyeSBzdHJlYW0gaXQgaGFzIG1ldGhvZHMgZm9yLCB3aXRob3V0IG1haW50YWluaW5nIHR3b1xuICogICBhdHRhY2ggY2FsbHMgYXQgdGhlIGNhbGwgc2l0ZS5cbiAqIC0gSWRlbXBvdGVuY3kgYnkgYGlkYCBpcyBwcmVzZXJ2ZWQgYWNyb3NzIGNoYW5uZWxzOiByZS1hdHRhY2hpbmcgd2l0aCB0aGVcbiAqICAgc2FtZSBgaWRgIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvbiBCT1RIIGNoYW5uZWxzLCBub3QganVzdCBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93RXJyb3JFdmVudCwgRmxvd1BhdXNlRXZlbnQsIEZsb3dSZWNvcmRlciwgRmxvd1Jlc3VtZUV2ZW50IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlc3VtZUV2ZW50LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFbWl0UmVjb3JkZXIgfSBmcm9tICcuL0VtaXRSZWNvcmRlci5qcyc7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIHRoYXQgYXBwZWFyIG9uIEJPVEggYFNjb3BlUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCBidXQgd2l0aFxuICogZGlmZmVyZW50IGV2ZW50IHBheWxvYWQgdHlwZXMuIEZvciB0aGVzZSwgYSBgQ29tYmluZWRSZWNvcmRlcmAgZGVjbGFyZXNcbiAqIE9ORSBoYW5kbGVyIHRoYXQgcmVjZWl2ZXMgdGhlIHVuaW9uIG9mIGJvdGggcGF5bG9hZHMg4oCUIGNvbnN1bWVyc1xuICogZGlzY3JpbWluYXRlIG9uIGB0cmF2ZXJzYWxDb250ZXh0YCwgd2hpY2ggb25seSBjb250cm9sLWZsb3cgZXZlbnRzIGNhcnJ5LlxuICovXG50eXBlIFNoYXJlZExpZmVjeWNsZU92ZXJsYXAgPSAnb25FcnJvcicgfCAnb25QYXVzZScgfCAnb25SZXN1bWUnO1xuXG4vKiogTGlmZWN5Y2xlIGhvb2tzIChub3QgZXZlbnQtc3BlY2lmaWMpIHRoYXQgYm90aCBpbnRlcmZhY2VzIHNoYXJlIGlkZW50aWNhbGx5LiAqL1xudHlwZSBTaGFyZWRMaWZlY3ljbGUgPSAnaWQnIHwgJ2NsZWFyJyB8ICd0b1NuYXBzaG90JztcblxuLyoqXG4gKiBBIHJlY29yZGVyIHRoYXQgTUFZIG9ic2VydmUgYW55IGNvbWJpbmF0aW9uIG9mIHN1cHBvcnRlZCBldmVudCBzdHJlYW1zLlxuICpcbiAqIFRvZGF5J3Mgc3RyZWFtczpcbiAqICAgLSBTY29wZSBkYXRhLWZsb3cgKGBTY29wZVJlY29yZGVyYDogb25SZWFkL29uV3JpdGUvb25Db21taXQvb25TdGFnZVN0YXJ0L+KApilcbiAqICAgLSBDb250cm9sLWZsb3cgKGBGbG93UmVjb3JkZXJgOiBvbkRlY2lzaW9uL29uU3ViZmxvd0VudHJ5L29uTG9vcC/igKYpXG4gKlxuICogQWxsIGV2ZW50IGhhbmRsZXJzIGFyZSBvcHRpb25hbCDigJQgaW1wbGVtZW50IG9ubHkgd2hhdCB5b3UgY2FyZSBhYm91dC5cbiAqIGBpZGAgaXMgcmVxdWlyZWQgc28gdGhlIGxpYnJhcnkgY2FuIGRlZHVwbGljYXRlIHJlLWF0dGFjaGVzLlxuICpcbiAqICMjIFNoYXJlZCBtZXRob2QgbmFtZXMgKG9uRXJyb3IgLyBvblBhdXNlIC8gb25SZXN1bWUpXG4gKlxuICogQm90aCBgU2NvcGVSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgIGRlY2xhcmUgdGhlc2Ugd2l0aCBESUZGRVJFTlQgcGF5bG9hZFxuICogc2hhcGVzLiBJbiBhIGNvbWJpbmVkIHJlY29yZGVyLCBlYWNoIHN1Y2ggaGFuZGxlciBpcyBjYWxsZWQgYnkgQk9USFxuICogY2hhbm5lbHMgd2l0aCBpdHMgb3duIHZhcmlhbnQuIFRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBhIHVuaW9uIOKAlCBjb25zdW1lcnNcbiAqIGNhbiBlaXRoZXIgaGFuZGxlIGJvdGggdmFyaWFudHMgdW5pZm9ybWx5LCBvciBkaXNjcmltaW5hdGUgKGNvbnRyb2wtZmxvd1xuICogdmFyaWFudHMgY2FycnkgYSBgdHJhdmVyc2FsQ29udGV4dGAgZmllbGQgdGhhdCBkYXRhLWZsb3cgdmFyaWFudHMgbGFjaykuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgc2hpcHMgKGUuZy4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZSB0eXBlXG4gKiBnYWlucyBhbm90aGVyIGAmIFBhcnRpYWw84oCmPmAgY2xhdXNlLiBCZWNhdXNlIGV2ZXJ5IGNsYXVzZSBpcyBgUGFydGlhbGAsXG4gKiBleGlzdGluZyBgQ29tYmluZWRSZWNvcmRlcmAgaW1wbGVtZW50YXRpb25zIHJlbWFpbiB0eXBlLXZhbGlkLlxuICovXG5leHBvcnQgdHlwZSBDb21iaW5lZFJlY29yZGVyID0gUGFydGlhbDxPbWl0PFNjb3BlUmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZU92ZXJsYXAgfCBTaGFyZWRMaWZlY3ljbGU+PiAmXG4gIFBhcnRpYWw8T21pdDxGbG93UmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZU92ZXJsYXAgfCBTaGFyZWRMaWZlY3ljbGU+PiAmXG4gIC8vIEVtaXQgY2hhbm5lbCDigJQgbmV3IHRoaXJkIHN0cmVhbSAoUGhhc2UgMykuIE5vIG1ldGhvZC1uYW1lIG92ZXJsYXAgd2l0aFxuICAvLyB0aGUgb3RoZXIgdHdvIGludGVyZmFjZXMsIHNvIGEgcGxhaW4gaW50ZXJzZWN0aW9uIGlzIHNvdW5kIOKAlCBub1xuICAvLyB1bmlvbi1wYXlsb2FkIGRpc2NyaW1pbmF0b3IgbmVlZGVkLlxuICBQYXJ0aWFsPE9taXQ8RW1pdFJlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGU+PiAmIHtcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gICAgLy8gU2hhcmVkIGxpZmVjeWNsZSBob29rcyDigJQgc2FtZSBvbiBib3RoIGludGVyZmFjZXMsIHNoYXBlIGNvbXBhdGlibGUuXG4gICAgY2xlYXI/KCk6IHZvaWQ7XG4gICAgdG9TbmFwc2hvdD8oKToge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICAgICAgZGF0YTogdW5rbm93bjtcbiAgICB9O1xuXG4gICAgLy8gU2hhcmVkIGV2ZW50IG1ldGhvZCBuYW1lcyB3aXRoIERJVkVSR0VOVCBwYXlsb2FkcyDigJQgZGVjbGFyZWQgYXMgdW5pb25zLlxuICAgIC8vIENvbnN1bWVycyBlaXRoZXIgaGFuZGxlIGJvdGggdmFyaWFudHMsIG9yIGRpc2NyaW1pbmF0ZSB1c2luZyB0aGVcbiAgICAvLyBleHBvcnRlZCBoZWxwZXIgYGlzRmxvd0V2ZW50KClgICh3aGljaCBjaGVja3MgZm9yIHRoZVxuICAgIC8vIGB0cmF2ZXJzYWxDb250ZXh0YCBmaWVsZCDigJQgcHJlc2VudCBvbmx5IG9uIGNvbnRyb2wtZmxvdyB2YXJpYW50cykuXG4gICAgLy9cbiAgICAvLyBAZXhhbXBsZVxuICAgIC8vIGBgYHRzXG4gICAgLy8gY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gICAgLy8gICBpZDogJ2F1ZGl0JyxcbiAgICAvLyAgIG9uRXJyb3I6IChlKSA9PiB7XG4gICAgLy8gICAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICAgIC8vICAgICAgIC8vIGUgaXMgRmxvd0Vycm9yRXZlbnQg4oCUIGhhcyBzdGFnZU5hbWUsIG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvclxuICAgIC8vICAgICAgIGxvZygnZmxvdyBlcnJvciBpbiBzdGFnZScsIGUuc3RhZ2VOYW1lKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAvLyBlIGlzIEVycm9yRXZlbnQg4oCUIGhhcyBlcnJvciwgb3BlcmF0aW9uLCBrZXk/XG4gICAgLy8gICAgICAgbG9nKCdzY29wZSBlcnJvciBkdXJpbmcnLCBlLm9wZXJhdGlvbiwgZS5lcnJvci5tZXNzYWdlKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSxcbiAgICAvLyB9O1xuICAgIC8vIGBgYFxuICAgIG9uRXJyb3I/KGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkO1xuICAgIG9uUGF1c2U/KGV2ZW50OiBQYXVzZUV2ZW50IHwgRmxvd1BhdXNlRXZlbnQpOiB2b2lkO1xuICAgIG9uUmVzdW1lPyhldmVudDogUmVzdW1lRXZlbnQgfCBGbG93UmVzdW1lRXZlbnQpOiB2b2lkO1xuICB9O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0b3IgZm9yIHRoZSB1bmlvbiBwYXlsb2FkIHR5cGVzIG9uIGBDb21iaW5lZFJlY29yZGVyYCdzIHNoYXJlZFxuICogbWV0aG9kcyAoYG9uRXJyb3JgLCBgb25QYXVzZWAsIGBvblJlc3VtZWApLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXZlbnRcbiAqIHdhcyBlbWl0dGVkIGZyb20gdGhlIGNvbnRyb2wtZmxvdyBjaGFubmVsIChGbG93UmVjb3JkZXIpLlxuICpcbiAqICMjIEhvdyBpdCBkaXNjcmltaW5hdGVzXG4gKlxuICogU2NvcGUtY2hhbm5lbCBldmVudHMgZXh0ZW5kIGBSZWNvcmRlckNvbnRleHRgLCB3aGljaCBjYXJyaWVzIGBwaXBlbGluZUlkYC5cbiAqIEZsb3ctY2hhbm5lbCBldmVudHMgZG8gbm90IGNhcnJ5IGBwaXBlbGluZUlkYCAodGhleSBjYXJyeSBhbiBvcHRpb25hbFxuICogYHRyYXZlcnNhbENvbnRleHRgIGluc3RlYWQsIGJ1dCB0aGF0IGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBjYW5ub3QgYmVcbiAqIHJlbGllZCBvbiBhcyBhIHBvc2l0aXZlIHNpZ25hbCkuIFdlIGRldGVjdCB0aGUgZmxvdyB2YXJpYW50IGJ5IHRoZVxuICogQUJTRU5DRSBvZiBgcGlwZWxpbmVJZGAg4oCUIHRoaXMgaXMgc2NoZW1hLXN0YWJsZSBhcyBsb25nIGFzIHNjb3BlIGV2ZW50c1xuICogY29udGludWUgdG8gZXh0ZW5kIGBSZWNvcmRlckNvbnRleHRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogb25FcnJvcjogKGUpID0+IHtcbiAqICAgaWYgKGlzRmxvd0V2ZW50KGUpKSB7XG4gKiAgICAgLy8gTmFycm93ZWQgdG8gRmxvd0Vycm9yRXZlbnQ6IGhhcyBzdGFnZU5hbWUsIG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvclxuICogICB9IGVsc2Uge1xuICogICAgIC8vIE5hcnJvd2VkIHRvIEVycm9yRXZlbnQ6IGhhcyBlcnJvciwgb3BlcmF0aW9uLCBrZXk/XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGbG93RXZlbnQ8VD4oZXZlbnQ6IFQpOiBldmVudCBpcyBFeGNsdWRlPFQsIHsgcGlwZWxpbmVJZDogc3RyaW5nIH0+IHtcbiAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ29iamVjdCcgfHwgZXZlbnQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIChldmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGlwZWxpbmVJZCA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBTY29wZVJlY29yZGVyYCAoZGF0YS1mbG93KSBpbnRlcmZhY2UuXG4gKiBLZXB0IGFzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBzbyB0aGUgcnVudGltZSBkdWNrLXR5cGUgZGV0ZWN0b3Igc3RheXNcbiAqIGluIHN5bmMgd2l0aCB0aGUgaW50ZXJmYWNlLiBJZiBhIG1ldGhvZCBpcyBhZGRlZCB0byBgU2NvcGVSZWNvcmRlcmAsIGFkZGluZyBpdFxuICogaGVyZSBpcyB0aGUgT05MWSBjaGFuZ2UgcmVxdWlyZWQgdG8gcm91dGUgY29tYmluZWQtcmVjb3JkZXJzIGNvcnJlY3RseS5cbiAqL1xuY29uc3QgUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uUmVhZCcsXG4gICdvbldyaXRlJyxcbiAgJ29uQ29tbWl0JyxcbiAgJ29uRXJyb3InLFxuICAnb25TdGFnZVN0YXJ0JyxcbiAgJ29uU3RhZ2VFbmQnLFxuICAnb25QYXVzZScsXG4gICdvblJlc3VtZScsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBGbG93UmVjb3JkZXJgIChjb250cm9sLWZsb3cpIGludGVyZmFjZS5cbiAqIFNlZSB0aGUgbm90ZSBvbiBgUkVDT1JERVJfRVZFTlRfTUVUSE9EU2AuXG4gKlxuICogTk9URTogdGhlIGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgIG1ldGhvZHMgZXhpc3Qgb24gQk9USCBpbnRlcmZhY2VzXG4gKiB3aXRoIERJRkZFUkVOVCBldmVudCBwYXlsb2FkIHNoYXBlcy4gQSBgQ29tYmluZWRSZWNvcmRlcmAgdGhhdCBpbXBsZW1lbnRzXG4gKiBhbnkgb2YgdGhlc2UgcmVjZWl2ZXMgYm90aCB2YXJpYW50cyAob25lIGZyb20gZWFjaCBjaGFubmVsKS4gQ29uc3VtZXJzIHdob1xuICogY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24gY2FuIGRpc2NyaW1pbmF0ZSBvbiB0aGUgcHJlc2VuY2Ugb2ZcbiAqIGB0cmF2ZXJzYWxDb250ZXh0YCAod2hpY2ggb25seSBjb250cm9sLWZsb3cgZXZlbnRzIGNhcnJ5KS5cbiAqL1xuY29uc3QgRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gW1xuICAnb25TdGFnZUV4ZWN1dGVkJyxcbiAgJ29uTmV4dCcsXG4gICdvbkRlY2lzaW9uJyxcbiAgJ29uRm9yaycsXG4gICdvblNlbGVjdGVkJyxcbiAgJ29uU3ViZmxvd0VudHJ5JyxcbiAgJ29uU3ViZmxvd0V4aXQnLFxuICAnb25TdWJmbG93UmVnaXN0ZXJlZCcsXG4gICdvbkxvb3AnLFxuICAnb25CcmVhaycsXG4gICdvbkVycm9yJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuICAvLyBSdW4tYm91bmRhcnkgbWV0aG9kcyDigJQgaW5jbHVkZWQgc28gYSByZWNvcmRlciB3aG9zZSBPTkxZIGV2ZW50IGhvb2tcbiAgLy8gaXMgYSBydW4gYm91bmRhcnkgKGUuZy4gYW4gZXJyb3IgYnJpZGdlIGltcGxlbWVudGluZyBqdXN0XG4gIC8vIGBvblJ1bkZhaWxlZGApIGlzIHN0aWxsIGRldGVjdGVkIGFzIGEgRmxvd1JlY29yZGVyIGFuZCByb3V0ZWQgdG8gdGhlXG4gIC8vIGZsb3cgY2hhbm5lbC4gUHJldmlvdXNseSBhIHJ1bi1vbmx5IHJlY29yZGVyIHdhcyBzaWxlbnRseSBkcm9wcGVkLlxuICAnb25SdW5TdGFydCcsXG4gICdvblJ1bkVuZCcsXG4gICdvblJ1bkZhaWxlZCcsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBFbWl0UmVjb3JkZXJgICh1c2VyLWVtaXR0ZWQgZXZlbnRzKVxuICogaW50ZXJmYWNlLiBTYW1lIGNvbnZlbnRpb24gYXMgdGhlIG90aGVyIHR3byBhcnJheXMgYWJvdmUg4oCUIGtlcHQgYXNcbiAqIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBkdWNrLXR5cGUgZGV0ZWN0aW9uLlxuICovXG5jb25zdCBFTUlUX1JFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbJ29uRW1pdCddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBkZWNsYXJlcyBhIG1ldGhvZCBuYW1lZCBgbWAgZWl0aGVyIGFzIGFuIG93blxuICogcHJvcGVydHkgT1Igb24gaXRzIGNsYXNzLXByb3RvdHlwZSBjaGFpbiDigJQgYnV0IE5PVCBpbmhlcml0ZWQgZnJvbVxuICogYE9iamVjdC5wcm90b3R5cGVgLlxuICpcbiAqICMjIFdoeSB0aGlzIGxheWVyZWQgY2hlY2tcbiAqXG4gKiBBIGBDb21iaW5lZFJlY29yZGVyYCBjYW4gYmUgZWl0aGVyIGEgcGxhaW4gb2JqZWN0IGxpdGVyYWwgKGhhbmRsZXJzIGFzXG4gKiBvd24gcHJvcGVydGllcykgT1IgYSBjbGFzcyBpbnN0YW5jZSAoaGFuZGxlcnMgYXMgY2xhc3MtcHJvdG90eXBlXG4gKiBtZXRob2RzKS4gQm90aCBhcmUgbGVnaXRpbWF0ZSBjb25zdW1lciBwYXR0ZXJucyBhbmQgYm90aCBNVVNUIGF0dGFjaC5cbiAqXG4gKiBCdXQgaGFuZGxlcnMgaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFyZSBBTFdBWVMgYWNjaWRlbnRhbCBvclxuICogbWFsaWNpb3VzIChub2JvZHkgbGVnaXRpbWF0ZWx5IGF0dGFjaGVzIHJlY29yZGVyIG1ldGhvZHMgdGhlcmUpLiBTbyB3ZVxuICogd2FsayB0aGUgcHJvdG90eXBlIGNoYWluLCBTVE9QUElORyBiZWZvcmUgYE9iamVjdC5wcm90b3R5cGVgLiBUaGlzXG4gKiBhY2NlcHRzIGNsYXNzIG1ldGhvZHMgd2hpbGUgc3RpbGwgYmxvY2tpbmcgYE9iamVjdC5wcm90b3R5cGVgXG4gKiBwb2xsdXRpb24gYXR0YWNrcy5cbiAqL1xuZnVuY3Rpb24gaGFzT3duT3JDbGFzc01ldGhvZChyOiB1bmtub3duLCBtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHIgPT09IG51bGwgfHwgdHlwZW9mIHIgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbSkpIHtcbiAgICByZXR1cm4gdHlwZW9mIChyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuICBsZXQgcHJvdG86IHVua25vd24gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIG0pKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIChwcm90byBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbV0gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGRhdGEtZmxvdyBldmVudCBtZXRob2QuXG4gKiBVc2VkIGJ5IGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0byBkZWNpZGUgd2hldGhlciB0byBob29rIGludG9cbiAqIHRoZSBzY29wZSBkYXRhLWZsb3cgY2hhbm5lbC5cbiAqXG4gKiAjIyBEZXRlY3Rpb24gcnVsZVxuICpcbiAqIEFjY2VwdHMgYm90aCBvYmplY3QtbGl0ZXJhbCByZWNvcmRlcnMgKG93bi1wcm9wZXJ0eSBoYW5kbGVycykgQU5EIGNsYXNzXG4gKiBpbnN0YW5jZXMgKGhhbmRsZXJzIGRlY2xhcmVkIG9uIHRoZSBjbGFzcyBwcm90b3R5cGUpLiBSZWplY3RzIGhhbmRsZXJzXG4gKiBpbmhlcml0ZWQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAg4oCUIHRoYXQncyBhbHdheXMgYWNjaWRlbnRhbCBvclxuICogbWFsaWNpb3VzIHBvbGx1dGlvbiwgbmV2ZXIgYSBsZWdpdGltYXRlIHJlY29yZGVyLlxuICpcbiAqICMjIExpZmVjeWNsZSBleGNsdXNpb25zXG4gKlxuICogYGNsZWFyYCBhbmQgYHRvU25hcHNob3RgIGFyZSBOT1QgY291bnRlZCBhcyBldmVudCBtZXRob2RzIOKAlCBhIHJlY29yZGVyXG4gKiB0aGF0IG9ubHkgaW1wbGVtZW50cyB0aG9zZSBoYXMgbm90aGluZyB0byBvYnNlcnZlIGFuZCB3b3VsZCBiZSBhIG5vLW9wXG4gKiBvbiBlaXRoZXIgY2hhbm5lbC5cbiAqXG4gKiAjIyBSZXR1cm4gdHlwZVxuICpcbiAqIFJldHVybnMgcGxhaW4gYGJvb2xlYW5gIChub3QgYSB0eXBlIHByZWRpY2F0ZSkuIFRoZSBmdWxsIGBTY29wZVJlY29yZGVyYFxuICogaW50ZXJmYWNlIGhhcyBwYXlsb2FkIHR5cGVzIHRoYXQgZGl2ZXJnZSBmcm9tIGBDb21iaW5lZFJlY29yZGVyYCdzIHVuaW9uXG4gKiB2YXJpYW50cyBmb3Igc2hhcmVkIG1ldGhvZHMsIHNvIGEgbmFycm93aW5nIHByZWRpY2F0ZSB3b3VsZCBiZSB1bnNvdW5kLlxuICogQ2FsbGVycyB0aGF0IG5lZWQgdG8gdHJlYXQgdGhlIHJlY29yZGVyIGFzIGEgYFNjb3BlUmVjb3JkZXJgIGRvIHNvIGV4cGxpY2l0bHlcbiAqIGF0IHRoZSBhdHRhY2ggc2l0ZSDigJQgdGhlIGNhc3QgaXMgdGhlIGNvbnRyYWN0IHRoYXQgZWFjaCBjaGFubmVsIHBhc3Nlc1xuICogaXRzIG93biBwYXlsb2FkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgY29udHJvbC1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBlbWl0LWNoYW5uZWwgZXZlbnQgbWV0aG9kLlxuICogU2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgIGZvciB0aGUgb3duZXJzaGlwLWRldGVjdGlvbiBydWxlcyAob3duIG9yXG4gKiBjbGFzcy1wcm90b3R5cGUgbWV0aG9kcyBjb3VudDsgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBkb2VzIG5vdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cbiJdfQ==
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1REc7OztBQXFGSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxTQUFnQixXQUFXLENBQUksS0FBUTtJQUNyQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELE1BQU0sQ0FBQyxHQUFHLEtBQWdDLENBQUM7SUFDM0MsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsS0FBSyxTQUFTLENBQUM7QUFDcEMsQ0FBQztBQU5ELGtDQU1DO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHO0lBQzdCLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFNBQVM7SUFDVCxjQUFjO0lBQ2QsWUFBWTtJQUNaLFNBQVM7SUFDVCxVQUFVO0NBQ0YsQ0FBQztBQUVYOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sMkJBQTJCLEdBQUc7SUFDbEMsaUJBQWlCO0lBQ2pCLFFBQVE7SUFDUixZQUFZO0lBQ1osUUFBUTtJQUNSLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLHFCQUFxQjtJQUNyQixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLHNFQUFzRTtJQUN0RSw0REFBNEQ7SUFDNUQsdUVBQXVFO0lBQ3ZFLHFFQUFxRTtJQUNyRSxZQUFZO0lBQ1osVUFBVTtJQUNWLGFBQWE7Q0FDTCxDQUFDO0FBRVg7Ozs7R0FJRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxRQUFRLENBQVUsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsbUJBQW1CLENBQUMsQ0FBVSxFQUFFLENBQVM7SUFDaEQsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE9BQVEsQ0FBNkIsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUM7SUFDakUsQ0FBQztJQUNELElBQUksS0FBSyxHQUFZLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxPQUFRLEtBQWlDLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO1FBQ3JFLENBQUM7UUFDRCxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsQ0FBbUI7SUFDcEQsT0FBTyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFGRCxnREFFQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRkQsd0RBRUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsQ0FBbUI7SUFDeEQsT0FBTywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFGRCx3REFFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tYmluZWRSZWNvcmRlciDigJQgYSBzaW5nbGUgb2JzZXJ2ZXIgdGhhdCBjYW4gaG9vayBpbnRvIE1VTFRJUExFIGV2ZW50XG4gKiBzdHJlYW1zIChjdXJyZW50bHk6IHNjb3BlIGRhdGEtZmxvdyArIGNvbnRyb2wtZmxvdykuIE9uZSBvYmplY3QsIG9uZSBgaWRgLFxuICogb25lIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZXhlY3V0aW9uLlxuICpcbiAqICMjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIEJlZm9yZSBgQ29tYmluZWRSZWNvcmRlcmAsIGEgY29uc3VtZXIgd2hvIHdhbnRlZCB0byBvYnNlcnZlIGJvdGggc3RyZWFtc1xuICogaGFkIHRvOlxuICogICAxLiBJbXBsZW1lbnQgYm90aCBgU2NvcGVSZWNvcmRlcmAgKDggbWV0aG9kcykgYW5kIGBGbG93UmVjb3JkZXJgICgxMiBtZXRob2RzKVxuICogICAgICBmdWxseSDigJQgc3R1YmJpbmcgZXZlcnkgZXZlbnQgdGhleSBkaWRuJ3QgY2FyZSBhYm91dC5cbiAqICAgMi4gUmVtZW1iZXIgdG8gY2FsbCBCT1RIIGBhdHRhY2hTY29wZVJlY29yZGVyKHIpYCBBTkQgYGF0dGFjaEZsb3dSZWNvcmRlcihyKWAuXG4gKiAgICAgIEZvcmdldHRpbmcgdGhlIHNlY29uZCBjYWxsIHNpbGVudGx5IGRyb3BwZWQgaGFsZiB0aGVpciBldmVudHMg4oCUIG5vXG4gKiAgICAgIHdhcm5pbmcsIG5vIHJ1bnRpbWUgZXJyb3IuXG4gKiAgIDMuIFJlLWltcGxlbWVudCBjb29yZGluYXRpb24gbG9naWMgKGJ1ZmZlcmluZywgb3JkZXJpbmcpIHRoZW1zZWx2ZXMuXG4gKlxuICogYENvbWJpbmVkUmVjb3JkZXJgIGNvbGxhcHNlcyB0aGF0IGludG8gYSBzaW5nbGUgdHlwZSBhbmQgYSBzaW5nbGUgYXR0YWNoXG4gKiBjYWxsIChgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWApLCB3aXRoIHRoZSBsaWJyYXJ5IGhhbmRsaW5nIHRoZVxuICogcm91dGluZyBpbnRlcm5hbGx5LiBDb25zdW1lcnMgaW1wbGVtZW50IG9ubHkgdGhlIGV2ZW50cyB0aGV5IGNhcmUgYWJvdXRcbiAqIChgUGFydGlhbDwuLi4+YCkgYW5kIHRoZSBhdHRhY2ggbWV0aG9kIGR1Y2stdHlwZXMgYXQgcnVudGltZSB0byBkaXNwYXRjaFxuICogdG8gdGhlIHJlbGV2YW50IGNoYW5uZWxzLlxuICpcbiAqICMjIEZvcndhcmQgY29tcGF0aWJpbGl0eVxuICpcbiAqIFdoZW4gYSB0aGlyZCBvYnNlcnZlciB0eXBlIGlzIGFkZGVkIChlLmcuIGFuIGBPcGVyYXRpb25SZWNvcmRlcmApLCB0aGVcbiAqIGBDb21iaW5lZFJlY29yZGVyYCB0eXBlIGdhaW5zIGFuIGAmIFBhcnRpYWw8T3BlcmF0aW9uUmVjb3JkZXI+YCBjbGF1c2UgYW5kXG4gKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgZ2FpbnMgb25lIG1vcmUgcnVudGltZSBicmFuY2ggaW4gaXRzIGRpc3BhdGNoLlxuICogQ29uc3VtZXJzIHdyaXRpbmcgYSBgQ29tYmluZWRSZWNvcmRlcmAgdG9kYXkgYXJlIE5PVCBhZmZlY3RlZCDigJQgdGhlaXJcbiAqIGNvZGUga2VlcHMgY29tcGlsaW5nIGFuZCBhdHRhY2hpbmcgY29ycmVjdGx5LCBiZWNhdXNlIGV2ZXJ5IG5ldyBsYXllciBpc1xuICogb3B0aW9uYWwuXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAqICAgaWQ6ICdhdWRpdCcsXG4gKiAgIG9uV3JpdGU6IChlKSA9PiBsb2dXcml0ZShlLmtleSwgZS52YWx1ZSksICAgICAgICAvLyBTY29wZVJlY29yZGVyIG1ldGhvZFxuICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nRGVjaXNpb24oZS5jaG9zZW4pLCAgICAgICAgLy8gRmxvd1JlY29yZGVyIG1ldGhvZFxuICogfTtcbiAqXG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGF1ZGl0KTtcbiAqIC8vIF4gaW50ZXJuYWxseTogZGV0ZWN0cyBib3RoIHNldHMgb2YgbWV0aG9kcywgcm91dGVzIHRvIGJvdGggY2hhbm5lbHMuXG4gKiBgYGBcbiAqXG4gKiAjIyBDb250cmFjdCB3aXRoIGV4aXN0aW5nIEFQSXNcbiAqXG4gKiAtIGBhdHRhY2hTY29wZVJlY29yZGVyKHIpYCBhbmQgYGF0dGFjaEZsb3dSZWNvcmRlcihyKWAgcmVtYWluIHVuY2hhbmdlZC5cbiAqICAgQ29uc3VtZXJzIHdobyB3YW50IG9ubHkgT05FIGNoYW5uZWwga2VlcCB1c2luZyB0aGVtIOKAlCBleHBsaWNpdCBpcyBnb29kLlxuICogLSBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWAgaXMgdGhlIE9OTFkgd2F5IHRvIGd1YXJhbnRlZSBhbiBvYmplY3QgaXNcbiAqICAgaG9va2VkIGludG8gZXZlcnkgc3RyZWFtIGl0IGhhcyBtZXRob2RzIGZvciwgd2l0aG91dCBtYWludGFpbmluZyB0d29cbiAqICAgYXR0YWNoIGNhbGxzIGF0IHRoZSBjYWxsIHNpdGUuXG4gKiAtIElkZW1wb3RlbmN5IGJ5IGBpZGAgaXMgcHJlc2VydmVkIGFjcm9zcyBjaGFubmVsczogcmUtYXR0YWNoaW5nIHdpdGggdGhlXG4gKiAgIHNhbWUgYGlkYCByZXBsYWNlcyB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb24gQk9USCBjaGFubmVscywgbm90IGp1c3Qgb25lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0Vycm9yRXZlbnQsIEZsb3dQYXVzZUV2ZW50LCBGbG93UmVjb3JkZXIsIEZsb3dSZXN1bWVFdmVudCB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBFcnJvckV2ZW50LCBQYXVzZUV2ZW50LCBSZXN1bWVFdmVudCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9FbWl0UmVjb3JkZXIuanMnO1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyB0aGF0IGFwcGVhciBvbiBCT1RIIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgYnV0IHdpdGhcbiAqIGRpZmZlcmVudCBldmVudCBwYXlsb2FkIHR5cGVzLiBGb3IgdGhlc2UsIGEgYENvbWJpbmVkUmVjb3JkZXJgIGRlY2xhcmVzXG4gKiBPTkUgaGFuZGxlciB0aGF0IHJlY2VpdmVzIHRoZSB1bmlvbiBvZiBib3RoIHBheWxvYWRzIOKAlCBjb25zdW1lcnNcbiAqIGRpc2NyaW1pbmF0ZSB3aXRoIHRoZSBleHBvcnRlZCBgaXNGbG93RXZlbnQoKWAgaGVscGVyIChleHBsaWNpdCBgY2hhbm5lbGBcbiAqIGRpc2NyaW1pbmFudCwgd2l0aCBhIGxlZ2FjeSBwaXBlbGluZUlkLWFic2VuY2UgZmFsbGJhY2spLlxuICovXG50eXBlIFNoYXJlZExpZmVjeWNsZU92ZXJsYXAgPSAnb25FcnJvcicgfCAnb25QYXVzZScgfCAnb25SZXN1bWUnO1xuXG4vKiogTGlmZWN5Y2xlIGhvb2tzIChub3QgZXZlbnQtc3BlY2lmaWMpIHRoYXQgYm90aCBpbnRlcmZhY2VzIHNoYXJlIGlkZW50aWNhbGx5LiAqL1xudHlwZSBTaGFyZWRMaWZlY3ljbGUgPSAnaWQnIHwgJ2NsZWFyJyB8ICd0b1NuYXBzaG90JztcblxuLyoqXG4gKiBBIHJlY29yZGVyIHRoYXQgTUFZIG9ic2VydmUgYW55IGNvbWJpbmF0aW9uIG9mIHN1cHBvcnRlZCBldmVudCBzdHJlYW1zLlxuICpcbiAqIFRvZGF5J3Mgc3RyZWFtczpcbiAqICAgLSBTY29wZSBkYXRhLWZsb3cgKGBTY29wZVJlY29yZGVyYDogb25SZWFkL29uV3JpdGUvb25Db21taXQvb25TdGFnZVN0YXJ0L+KApilcbiAqICAgLSBDb250cm9sLWZsb3cgKGBGbG93UmVjb3JkZXJgOiBvbkRlY2lzaW9uL29uU3ViZmxvd0VudHJ5L29uTG9vcC/igKYpXG4gKlxuICogQWxsIGV2ZW50IGhhbmRsZXJzIGFyZSBvcHRpb25hbCDigJQgaW1wbGVtZW50IG9ubHkgd2hhdCB5b3UgY2FyZSBhYm91dC5cbiAqIGBpZGAgaXMgcmVxdWlyZWQgc28gdGhlIGxpYnJhcnkgY2FuIGRlZHVwbGljYXRlIHJlLWF0dGFjaGVzLlxuICpcbiAqICMjIFNoYXJlZCBtZXRob2QgbmFtZXMgKG9uRXJyb3IgLyBvblBhdXNlIC8gb25SZXN1bWUpXG4gKlxuICogQm90aCBgU2NvcGVSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgIGRlY2xhcmUgdGhlc2Ugd2l0aCBESUZGRVJFTlQgcGF5bG9hZFxuICogc2hhcGVzLiBJbiBhIGNvbWJpbmVkIHJlY29yZGVyLCBlYWNoIHN1Y2ggaGFuZGxlciBpcyBjYWxsZWQgYnkgQk9USFxuICogY2hhbm5lbHMgd2l0aCBpdHMgb3duIHZhcmlhbnQuIFRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBhIHVuaW9uIOKAlCBjb25zdW1lcnNcbiAqIGNhbiBlaXRoZXIgaGFuZGxlIGJvdGggdmFyaWFudHMgdW5pZm9ybWx5LCBvciBkaXNjcmltaW5hdGUgd2l0aFxuICogYGlzRmxvd0V2ZW50KClgIChleHBsaWNpdCBgY2hhbm5lbGAgZGlzY3JpbWluYW50IHN0YW1wZWQgYnkgdGhlIGVuZ2luZSkuXG4gKlxuICogIyMgRm9yd2FyZCBjb21wYXRpYmlsaXR5XG4gKlxuICogV2hlbiBhIHRoaXJkIG9ic2VydmVyIHR5cGUgc2hpcHMgKGUuZy4gYE9wZXJhdGlvblJlY29yZGVyYCksIHRoZSB0eXBlXG4gKiBnYWlucyBhbm90aGVyIGAmIFBhcnRpYWw84oCmPmAgY2xhdXNlLiBCZWNhdXNlIGV2ZXJ5IGNsYXVzZSBpcyBgUGFydGlhbGAsXG4gKiBleGlzdGluZyBgQ29tYmluZWRSZWNvcmRlcmAgaW1wbGVtZW50YXRpb25zIHJlbWFpbiB0eXBlLXZhbGlkLlxuICovXG5leHBvcnQgdHlwZSBDb21iaW5lZFJlY29yZGVyID0gUGFydGlhbDxPbWl0PFNjb3BlUmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZU92ZXJsYXAgfCBTaGFyZWRMaWZlY3ljbGU+PiAmXG4gIFBhcnRpYWw8T21pdDxGbG93UmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZU92ZXJsYXAgfCBTaGFyZWRMaWZlY3ljbGU+PiAmXG4gIC8vIEVtaXQgY2hhbm5lbCDigJQgbmV3IHRoaXJkIHN0cmVhbSAoUGhhc2UgMykuIE5vIG1ldGhvZC1uYW1lIG92ZXJsYXAgd2l0aFxuICAvLyB0aGUgb3RoZXIgdHdvIGludGVyZmFjZXMsIHNvIGEgcGxhaW4gaW50ZXJzZWN0aW9uIGlzIHNvdW5kIOKAlCBub1xuICAvLyB1bmlvbi1wYXlsb2FkIGRpc2NyaW1pbmF0b3IgbmVlZGVkLlxuICBQYXJ0aWFsPE9taXQ8RW1pdFJlY29yZGVyLCBTaGFyZWRMaWZlY3ljbGU+PiAmIHtcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gICAgLy8gU2hhcmVkIGxpZmVjeWNsZSBob29rcyDigJQgc2FtZSBvbiBib3RoIGludGVyZmFjZXMsIHNoYXBlIGNvbXBhdGlibGUuXG4gICAgY2xlYXI/KCk6IHZvaWQ7XG4gICAgdG9TbmFwc2hvdD8oKToge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICAgICAgZGF0YTogdW5rbm93bjtcbiAgICB9O1xuXG4gICAgLy8gU2hhcmVkIGV2ZW50IG1ldGhvZCBuYW1lcyB3aXRoIERJVkVSR0VOVCBwYXlsb2FkcyDigJQgZGVjbGFyZWQgYXMgdW5pb25zLlxuICAgIC8vIENvbnN1bWVycyBlaXRoZXIgaGFuZGxlIGJvdGggdmFyaWFudHMsIG9yIGRpc2NyaW1pbmF0ZSB1c2luZyB0aGVcbiAgICAvLyBleHBvcnRlZCBoZWxwZXIgYGlzRmxvd0V2ZW50KClgICh3aGljaCBjaGVja3MgdGhlIGV4cGxpY2l0IGBjaGFubmVsYFxuICAgIC8vIGRpc2NyaW1pbmFudCBzdGFtcGVkIGJ5IHRoZSBlbmdpbmUsIGZhbGxpbmcgYmFjayB0byBwaXBlbGluZUlkXG4gICAgLy8gYWJzZW5jZSBmb3IgdW5zdGFtcGVkIGV2ZW50cykuXG4gICAgLy9cbiAgICAvLyBAZXhhbXBsZVxuICAgIC8vIGBgYHRzXG4gICAgLy8gY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gICAgLy8gICBpZDogJ2F1ZGl0JyxcbiAgICAvLyAgIG9uRXJyb3I6IChlKSA9PiB7XG4gICAgLy8gICAgIGlmIChpc0Zsb3dFdmVudChlKSkge1xuICAgIC8vICAgICAgIC8vIGUgaXMgRmxvd0Vycm9yRXZlbnQg4oCUIGhhcyBzdGFnZU5hbWUsIG1lc3NhZ2UsIHN0cnVjdHVyZWRFcnJvclxuICAgIC8vICAgICAgIGxvZygnZmxvdyBlcnJvciBpbiBzdGFnZScsIGUuc3RhZ2VOYW1lKTtcbiAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAvLyAgICAgICAvLyBlIGlzIEVycm9yRXZlbnQg4oCUIGhhcyBlcnJvciwgb3BlcmF0aW9uLCBrZXk/XG4gICAgLy8gICAgICAgbG9nKCdzY29wZSBlcnJvciBkdXJpbmcnLCBlLm9wZXJhdGlvbiwgZS5lcnJvci5tZXNzYWdlKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSxcbiAgICAvLyB9O1xuICAgIC8vIGBgYFxuICAgIG9uRXJyb3I/KGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkO1xuICAgIG9uUGF1c2U/KGV2ZW50OiBQYXVzZUV2ZW50IHwgRmxvd1BhdXNlRXZlbnQpOiB2b2lkO1xuICAgIG9uUmVzdW1lPyhldmVudDogUmVzdW1lRXZlbnQgfCBGbG93UmVzdW1lRXZlbnQpOiB2b2lkO1xuICB9O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0b3IgZm9yIHRoZSB1bmlvbiBwYXlsb2FkIHR5cGVzIG9uIGBDb21iaW5lZFJlY29yZGVyYCdzIHNoYXJlZFxuICogbWV0aG9kcyAoYG9uRXJyb3JgLCBgb25QYXVzZWAsIGBvblJlc3VtZWApLiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXZlbnRcbiAqIHdhcyBlbWl0dGVkIGZyb20gdGhlIGNvbnRyb2wtZmxvdyBjaGFubmVsIChGbG93UmVjb3JkZXIpLlxuICpcbiAqICMjIEhvdyBpdCBkaXNjcmltaW5hdGVzXG4gKlxuICogMS4gKipFeHBsaWNpdCBgY2hhbm5lbGAgZmllbGQgZmlyc3QqKiAoYmFja2xvZyBCMyk6IGV2ZXJ5IGVuZ2luZS1kaXNwYXRjaGVkXG4gKiAgICBzaGFyZWQtbWV0aG9kIGV2ZW50IGlzIHN0YW1wZWQgYGNoYW5uZWw6ICdmbG93J2AgKGNvbnRyb2wtZmxvdykgb3JcbiAqICAgIGBjaGFubmVsOiAnc2NvcGUnYCAoZGF0YS1mbG93KSBhdCBjb25zdHJ1Y3Rpb24uIFRoaXMgaXMgdGhlIHBvc2l0aXZlLFxuICogICAgc2NoZW1hLXJvYnVzdCBzaWduYWwg4oCUIGl0IHN1cnZpdmVzIHdyYXBwZXJzIHRoYXQgYWRkL3N0cmlwIGZpZWxkcy5cbiAqIDIuICoqTGVnYWN5IGZhbGxiYWNrKiogZm9yIHVuc3RhbXBlZCBldmVudHMgKGNvbnN1bWVyLWZhYnJpY2F0ZWQgdGVzdHMsXG4gKiAgICBwZXJzaXN0ZWQgdHJhY2VzIGZyb20gPDkuMik6IHNjb3BlLWNoYW5uZWwgZXZlbnRzIGV4dGVuZFxuICogICAgYFJlY29yZGVyQ29udGV4dGAsIHdoaWNoIGNhcnJpZXMgYHBpcGVsaW5lSWRgOyBmbG93LWNoYW5uZWwgZXZlbnRzIGRvXG4gKiAgICBub3QuIFRoZSBmbG93IHZhcmlhbnQgaXMgZGV0ZWN0ZWQgYnkgdGhlIEFCU0VOQ0Ugb2YgYHBpcGVsaW5lSWRgIOKAlFxuICogICAgc2NoZW1hLXN0YWJsZSBhcyBsb25nIGFzIHNjb3BlIGV2ZW50cyBjb250aW51ZSB0byBleHRlbmRcbiAqICAgIGBSZWNvcmRlckNvbnRleHRgLCBidXQgZnJhZ2lsZSBhZ2FpbnN0IGZpZWxkLXN0cmlwcGluZyB3cmFwcGVycywgd2hpY2hcbiAqICAgIGlzIHdoeSB0aGUgZXhwbGljaXQgZGlzY3JpbWluYW50IG5vdyBleGlzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBvbkVycm9yOiAoZSkgPT4ge1xuICogICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBGbG93RXJyb3JFdmVudDogaGFzIHN0YWdlTmFtZSwgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yXG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgLy8gTmFycm93ZWQgdG8gRXJyb3JFdmVudDogaGFzIGVycm9yLCBvcGVyYXRpb24sIGtleT9cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dFdmVudDxUPihldmVudDogVCk6IGV2ZW50IGlzIEV4Y2x1ZGU8VCwgeyBwaXBlbGluZUlkOiBzdHJpbmcgfT4ge1xuICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fCBldmVudCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlID0gZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChlLmNoYW5uZWwgPT09ICdmbG93JykgcmV0dXJuIHRydWU7XG4gIGlmIChlLmNoYW5uZWwgPT09ICdzY29wZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGUucGlwZWxpbmVJZCA9PT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBTY29wZVJlY29yZGVyYCAoZGF0YS1mbG93KSBpbnRlcmZhY2UuXG4gKiBLZXB0IGFzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBzbyB0aGUgcnVudGltZSBkdWNrLXR5cGUgZGV0ZWN0b3Igc3RheXNcbiAqIGluIHN5bmMgd2l0aCB0aGUgaW50ZXJmYWNlLiBJZiBhIG1ldGhvZCBpcyBhZGRlZCB0byBgU2NvcGVSZWNvcmRlcmAsIGFkZGluZyBpdFxuICogaGVyZSBpcyB0aGUgT05MWSBjaGFuZ2UgcmVxdWlyZWQgdG8gcm91dGUgY29tYmluZWQtcmVjb3JkZXJzIGNvcnJlY3RseS5cbiAqL1xuY29uc3QgUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uUmVhZCcsXG4gICdvbldyaXRlJyxcbiAgJ29uQ29tbWl0JyxcbiAgJ29uRXJyb3InLFxuICAnb25TdGFnZVN0YXJ0JyxcbiAgJ29uU3RhZ2VFbmQnLFxuICAnb25QYXVzZScsXG4gICdvblJlc3VtZScsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBGbG93UmVjb3JkZXJgIChjb250cm9sLWZsb3cpIGludGVyZmFjZS5cbiAqIFNlZSB0aGUgbm90ZSBvbiBgUkVDT1JERVJfRVZFTlRfTUVUSE9EU2AuXG4gKlxuICogTk9URTogdGhlIGBvbkVycm9yYCwgYG9uUGF1c2VgLCBgb25SZXN1bWVgIG1ldGhvZHMgZXhpc3Qgb24gQk9USCBpbnRlcmZhY2VzXG4gKiB3aXRoIERJRkZFUkVOVCBldmVudCBwYXlsb2FkIHNoYXBlcy4gQSBgQ29tYmluZWRSZWNvcmRlcmAgdGhhdCBpbXBsZW1lbnRzXG4gKiBhbnkgb2YgdGhlc2UgcmVjZWl2ZXMgYm90aCB2YXJpYW50cyAob25lIGZyb20gZWFjaCBjaGFubmVsKS4gQ29uc3VtZXJzIHdob1xuICogY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24gZGlzY3JpbWluYXRlIHdpdGggYGlzRmxvd0V2ZW50KClgIChleHBsaWNpdFxuICogYGNoYW5uZWxgIGRpc2NyaW1pbmFudCwgbGVnYWN5IHBpcGVsaW5lSWQtYWJzZW5jZSBmYWxsYmFjaykuXG4gKi9cbmNvbnN0IEZMT1dfUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uU3RhZ2VFeGVjdXRlZCcsXG4gICdvbk5leHQnLFxuICAnb25EZWNpc2lvbicsXG4gICdvbkZvcmsnLFxuICAnb25TZWxlY3RlZCcsXG4gICdvblN1YmZsb3dFbnRyeScsXG4gICdvblN1YmZsb3dFeGl0JyxcbiAgJ29uU3ViZmxvd1JlZ2lzdGVyZWQnLFxuICAnb25Mb29wJyxcbiAgJ29uQnJlYWsnLFxuICAnb25FcnJvcicsXG4gICdvblBhdXNlJyxcbiAgJ29uUmVzdW1lJyxcbiAgLy8gUnVuLWJvdW5kYXJ5IG1ldGhvZHMg4oCUIGluY2x1ZGVkIHNvIGEgcmVjb3JkZXIgd2hvc2UgT05MWSBldmVudCBob29rXG4gIC8vIGlzIGEgcnVuIGJvdW5kYXJ5IChlLmcuIGFuIGVycm9yIGJyaWRnZSBpbXBsZW1lbnRpbmcganVzdFxuICAvLyBgb25SdW5GYWlsZWRgKSBpcyBzdGlsbCBkZXRlY3RlZCBhcyBhIEZsb3dSZWNvcmRlciBhbmQgcm91dGVkIHRvIHRoZVxuICAvLyBmbG93IGNoYW5uZWwuIFByZXZpb3VzbHkgYSBydW4tb25seSByZWNvcmRlciB3YXMgc2lsZW50bHkgZHJvcHBlZC5cbiAgJ29uUnVuU3RhcnQnLFxuICAnb25SdW5FbmQnLFxuICAnb25SdW5GYWlsZWQnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgRW1pdFJlY29yZGVyYCAodXNlci1lbWl0dGVkIGV2ZW50cylcbiAqIGludGVyZmFjZS4gU2FtZSBjb252ZW50aW9uIGFzIHRoZSBvdGhlciB0d28gYXJyYXlzIGFib3ZlIOKAlCBrZXB0IGFzXG4gKiB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZHVjay10eXBlIGRldGVjdGlvbi5cbiAqL1xuY29uc3QgRU1JVF9SRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gWydvbkVtaXQnXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgZGVjbGFyZXMgYSBtZXRob2QgbmFtZWQgYG1gIGVpdGhlciBhcyBhbiBvd25cbiAqIHByb3BlcnR5IE9SIG9uIGl0cyBjbGFzcy1wcm90b3R5cGUgY2hhaW4g4oCUIGJ1dCBOT1QgaW5oZXJpdGVkIGZyb21cbiAqIGBPYmplY3QucHJvdG90eXBlYC5cbiAqXG4gKiAjIyBXaHkgdGhpcyBsYXllcmVkIGNoZWNrXG4gKlxuICogQSBgQ29tYmluZWRSZWNvcmRlcmAgY2FuIGJlIGVpdGhlciBhIHBsYWluIG9iamVjdCBsaXRlcmFsIChoYW5kbGVycyBhc1xuICogb3duIHByb3BlcnRpZXMpIE9SIGEgY2xhc3MgaW5zdGFuY2UgKGhhbmRsZXJzIGFzIGNsYXNzLXByb3RvdHlwZVxuICogbWV0aG9kcykuIEJvdGggYXJlIGxlZ2l0aW1hdGUgY29uc3VtZXIgcGF0dGVybnMgYW5kIGJvdGggTVVTVCBhdHRhY2guXG4gKlxuICogQnV0IGhhbmRsZXJzIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhcmUgQUxXQVlTIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyAobm9ib2R5IGxlZ2l0aW1hdGVseSBhdHRhY2hlcyByZWNvcmRlciBtZXRob2RzIHRoZXJlKS4gU28gd2VcbiAqIHdhbGsgdGhlIHByb3RvdHlwZSBjaGFpbiwgU1RPUFBJTkcgYmVmb3JlIGBPYmplY3QucHJvdG90eXBlYC4gVGhpc1xuICogYWNjZXB0cyBjbGFzcyBtZXRob2RzIHdoaWxlIHN0aWxsIGJsb2NraW5nIGBPYmplY3QucHJvdG90eXBlYFxuICogcG9sbHV0aW9uIGF0dGFja3MuXG4gKi9cbmZ1bmN0aW9uIGhhc093bk9yQ2xhc3NNZXRob2QocjogdW5rbm93biwgbTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChyID09PSBudWxsIHx8IHR5cGVvZiByICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG0pKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAociBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbV0gPT09ICdmdW5jdGlvbic7XG4gIH1cbiAgbGV0IHByb3RvOiB1bmtub3duID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO1xuICB3aGlsZSAocHJvdG8gIT09IG51bGwgJiYgcHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCBtKSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiAocHJvdG8gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nO1xuICAgIH1cbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBkYXRhLWZsb3cgZXZlbnQgbWV0aG9kLlxuICogVXNlZCBieSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaG9vayBpbnRvXG4gKiB0aGUgc2NvcGUgZGF0YS1mbG93IGNoYW5uZWwuXG4gKlxuICogIyMgRGV0ZWN0aW9uIHJ1bGVcbiAqXG4gKiBBY2NlcHRzIGJvdGggb2JqZWN0LWxpdGVyYWwgcmVjb3JkZXJzIChvd24tcHJvcGVydHkgaGFuZGxlcnMpIEFORCBjbGFzc1xuICogaW5zdGFuY2VzIChoYW5kbGVycyBkZWNsYXJlZCBvbiB0aGUgY2xhc3MgcHJvdG90eXBlKS4gUmVqZWN0cyBoYW5kbGVyc1xuICogaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIOKAlCB0aGF0J3MgYWx3YXlzIGFjY2lkZW50YWwgb3JcbiAqIG1hbGljaW91cyBwb2xsdXRpb24sIG5ldmVyIGEgbGVnaXRpbWF0ZSByZWNvcmRlci5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgZXhjbHVzaW9uc1xuICpcbiAqIGBjbGVhcmAgYW5kIGB0b1NuYXBzaG90YCBhcmUgTk9UIGNvdW50ZWQgYXMgZXZlbnQgbWV0aG9kcyDigJQgYSByZWNvcmRlclxuICogdGhhdCBvbmx5IGltcGxlbWVudHMgdGhvc2UgaGFzIG5vdGhpbmcgdG8gb2JzZXJ2ZSBhbmQgd291bGQgYmUgYSBuby1vcFxuICogb24gZWl0aGVyIGNoYW5uZWwuXG4gKlxuICogIyMgUmV0dXJuIHR5cGVcbiAqXG4gKiBSZXR1cm5zIHBsYWluIGBib29sZWFuYCAobm90IGEgdHlwZSBwcmVkaWNhdGUpLiBUaGUgZnVsbCBgU2NvcGVSZWNvcmRlcmBcbiAqIGludGVyZmFjZSBoYXMgcGF5bG9hZCB0eXBlcyB0aGF0IGRpdmVyZ2UgZnJvbSBgQ29tYmluZWRSZWNvcmRlcmAncyB1bmlvblxuICogdmFyaWFudHMgZm9yIHNoYXJlZCBtZXRob2RzLCBzbyBhIG5hcnJvd2luZyBwcmVkaWNhdGUgd291bGQgYmUgdW5zb3VuZC5cbiAqIENhbGxlcnMgdGhhdCBuZWVkIHRvIHRyZWF0IHRoZSByZWNvcmRlciBhcyBhIGBTY29wZVJlY29yZGVyYCBkbyBzbyBleHBsaWNpdGx5XG4gKiBhdCB0aGUgYXR0YWNoIHNpdGUg4oCUIHRoZSBjYXN0IGlzIHRoZSBjb250cmFjdCB0aGF0IGVhY2ggY2hhbm5lbCBwYXNzZXNcbiAqIGl0cyBvd24gcGF5bG9hZCB2YXJpYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGNvbnRyb2wtZmxvdyBldmVudCBtZXRob2QuXG4gKiBTZWUgYGhhc1JlY29yZGVyTWV0aG9kc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEZMT1dfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZW1pdC1jaGFubmVsIGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYCBmb3IgdGhlIG93bmVyc2hpcC1kZXRlY3Rpb24gcnVsZXMgKG93biBvclxuICogY2xhc3MtcHJvdG90eXBlIG1ldGhvZHMgY291bnQ7IGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gZG9lcyBub3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyOiBDb21iaW5lZFJlY29yZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTUlUX1JFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG4iXX0=
|