footprintjs 4.0.5 → 4.2.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/CLAUDE.md +7 -0
- package/dist/esm/index.js +6 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +13 -8
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +8 -7
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +8 -5
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +28 -246
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +232 -139
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +64 -22
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.js +36 -9
- package/dist/esm/lib/reactive/createTypedScope.js +9 -6
- package/dist/esm/lib/reactive/types.js +1 -1
- package/dist/esm/lib/recorder/CompositeRecorder.js +172 -0
- package/dist/esm/lib/recorder/index.js +2 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +33 -3
- package/dist/esm/lib/scope/ScopeFacade.js +52 -4
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +18 -2
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +51 -4
- package/dist/esm/recorders.js +6 -5
- package/dist/index.js +21 -15
- package/dist/lib/builder/FlowChartBuilder.js +13 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/handlers/DeciderHandler.js +8 -7
- package/dist/lib/engine/handlers/SelectorHandler.js +8 -5
- package/dist/lib/engine/handlers/SubflowExecutor.js +27 -245
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +232 -139
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +64 -22
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +36 -9
- package/dist/lib/reactive/createTypedScope.js +9 -6
- package/dist/lib/reactive/types.js +1 -1
- package/dist/lib/recorder/CompositeRecorder.js +176 -0
- package/dist/lib/recorder/index.js +6 -0
- package/dist/lib/runner/FlowChartExecutor.js +33 -3
- package/dist/lib/scope/ScopeFacade.js +52 -4
- package/dist/lib/scope/recorders/DebugRecorder.js +18 -2
- package/dist/lib/scope/recorders/MetricRecorder.js +51 -4
- package/dist/recorders.js +8 -6
- package/dist/types/index.d.ts +4 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +4 -0
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +10 -29
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +18 -1
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +92 -0
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +20 -8
- package/dist/types/lib/engine/types.d.ts +51 -0
- package/dist/types/lib/memory/StageContext.d.ts +14 -3
- package/dist/types/lib/reactive/types.d.ts +2 -0
- package/dist/types/lib/recorder/CompositeRecorder.d.ts +95 -0
- package/dist/types/lib/recorder/index.d.ts +2 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +27 -1
- package/dist/types/lib/scope/ScopeFacade.d.ts +11 -0
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +16 -0
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +47 -2
- package/dist/types/recorders.d.ts +9 -4
- package/package.json +1 -1
|
@@ -53,4 +53,4 @@ exports.EXECUTOR_INTERNAL_METHODS = new Set([
|
|
|
53
53
|
'useSharedRedactedKeys', // FlowChartExecutor.createTraverser() — redaction wrapping
|
|
54
54
|
'useRedactionPolicy', // FlowChartExecutor.createTraverser() — redaction wrapping
|
|
55
55
|
]);
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBK0hILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFMUQsUUFBQSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUNoRCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixhQUFhO0lBQ2IsUUFBUTtJQUNSLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSCwrRUFBK0U7QUFDL0UsZ0VBQWdFO0FBQ2hFLHFFQUFxRTtBQUV4RCxRQUFBLFlBQVksR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUVsRSwrRUFBK0U7QUFDL0UsNkVBQTZFO0FBQzdFLCtDQUErQztBQUVsQyxRQUFBLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFN0QsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQyxrQkFBa0IsRUFBRSw0QkFBNEI7SUFDaEQsZ0JBQWdCLEVBQUUsNEJBQTRCO0lBQzlDLGdCQUFnQixFQUFFLG1FQUFtRTtJQUNyRixnQkFBZ0IsRUFBRSxxQ0FBcUM7SUFDdkQsY0FBYyxFQUFFLG1DQUFtQztJQUNuRCx1QkFBdUIsRUFBRSwyREFBMkQ7SUFDcEYsb0JBQW9CLEVBQUUsMkRBQTJEO0NBQ2xGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvdHlwZXMgLS0gVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFR5cGVkU2NvcGU8VD4gcmVhY3RpdmUgcHJveHkgc3lzdGVtLlxuICpcbiAqIFR5cGVkU2NvcGU8VD4gd3JhcHMgYSBSZWFjdGl2ZVRhcmdldCAoU2NvcGVGYWNhZGUpIGluIGEgUHJveHkgdGhhdCBwcm92aWRlc1xuICogdHlwZWQgcHJvcGVydHkgYWNjZXNzLiBBbGwgc2NvcGUgaW5mcmFzdHJ1Y3R1cmUgbWV0aG9kcyBhcmUgJC1wcmVmaXhlZCB0b1xuICogYXZvaWQgY29sbGlzaW9ucyB3aXRoIHVzZXIgc3RhdGUga2V5cy5cbiAqXG4gKiBEZXBlbmRlbmN5OiB0eXBlLW9ubHkgaW1wb3J0cyBmcm9tIGVuZ2luZS8gYW5kIHNjb3BlLyAoemVybyBydW50aW1lIGNvc3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5cbi8vIC0tIFJlYWN0aXZlVGFyZ2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pbmltdW0gcHJvdG9jb2wgcmVxdWlyZWQgYnkgVHlwZWRTY29wZSAtLSBhIGN1cmF0ZWQgc3Vic2V0IG9mIFNjb3BlRmFjYWRlJ3Ncbi8vIHB1YmxpYyBBUEkuIE5vdCBhIGZ1bGwgbWlycm9yOiBleGNsdWRlcyBpbnRlcm5hbC9yZWRhY3Rpb24gbWV0aG9kcyB0aGF0IGFyZVxuLy8gaGFuZGxlZCBhdCB0aGUgZXhlY3V0b3IgbGV2ZWwgKHVzZVJlZGFjdGlvblBvbGljeSwgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzLCBldGMuKVxuLy8gYW5kIGluZnJhc3RydWN0dXJlIG1ldGhvZHMgKGdldFBpcGVsaW5lSWQsIHNldEdsb2JhbCwgZ2V0R2xvYmFsLCBldGMuKS5cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZVRhcmdldCB7XG4gIC8vIFN0YXRlIGFjY2VzcyAodHJhY2tlZCBieSByZWNvcmRlcnMpXG4gIGdldFZhbHVlKGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcblxuICAvLyBOb24tdHJhY2tpbmcgc3RhdGUgaW5zcGVjdGlvbiAoZm9yIHByb3h5IGludGVybmFscyDigJQgbm8gcmVjb3JkZXIgZGlzcGF0Y2gpXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzPygpOiBzdHJpbmdbXTtcbiAgLyoqIENoZWNrIGtleSBleGlzdGVuY2Ugd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGhhcyB0cmFwLiAqL1xuICBoYXNLZXk/KGtleTogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvLyBJbnB1dCAmIGVudmlyb25tZW50IChyZWFkb25seSwgTk9UIHRyYWNrZWQpXG4gIGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUO1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvLyBSZWNvcmRlciBtYW5hZ2VtZW50XG4gIGF0dGFjaFJlY29yZGVyKHJlY29yZGVyOiBSZWNvcmRlcik6IHZvaWQ7XG4gIGRldGFjaFJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQ7XG4gIGdldFJlY29yZGVycygpOiBSZWNvcmRlcltdO1xuXG4gIC8vIERpYWdub3N0aWNzXG4gIGFkZERlYnVnSW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGREZWJ1Z01lc3NhZ2UodmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGRFcnJvckluZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkTWV0cmljKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGRFdmFsKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xufVxuXG4vLyAtLSBTY29wZU1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAkLXByZWZpeGVkIGVzY2FwZSBoYXRjaGVzLiBOb24tZW51bWVyYWJsZSBvbiB0aGUgcHJveHkgLS0gZG9uJ3QgYXBwZWFyIGluXG4vLyBPYmplY3Qua2V5cygpLCBkZXN0cnVjdHVyaW5nLCBvciBmb3IuLi5pbi4gT25seSBzdGF0ZSBrZXlzIGFyZSB2aXNpYmxlLlxuXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlTWV0aG9kcyB7XG4gIC8vIFN0YXRlICh1bnR5cGVkIGVzY2FwZSBoYXRjaCAtLSBmb3IgZHluYW1pYyBrZXlzLCByZWRhY3Rpb24sIGRlc2NyaXB0aW9uKVxuICAkZ2V0VmFsdWUoa2V5OiBzdHJpbmcpOiB1bmtub3duO1xuICAkc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gICR1cGRhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gICRkZWxldGUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFByb3h5LXN5bnRoZXNpemVkOiBjYWxscyBnZXRWYWx1ZShyb290S2V5KSB0aGVuIGxvZGFzaC5nZXQgZm9yIG5lc3RlZCBwYXRoLiBOb3QgYSBkaXJlY3QgZGVsZWdhdGlvbi4gKi9cbiAgJHJlYWQoZG90UGF0aDogc3RyaW5nKTogdW5rbm93bjtcblxuICAvLyBJbnB1dCAmIGVudmlyb25tZW50IChyZWFkb25seSlcbiAgJGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUO1xuICAkZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICAkZGVidWcoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGxvZyh2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRlcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkbWV0cmljKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkZXZhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcblxuICAvLyBSZWNvcmRlciBtYW5hZ2VtZW50XG4gICRhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkO1xuICAkZGV0YWNoUmVjb3JkZXIocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZDtcbiAgJGdldFJlY29yZGVycygpOiBSZWNvcmRlcltdO1xuXG4gIC8qKlxuICAgKiBCYXRjaC1tdXRhdGUgYW4gYXJyYXkga2V5IGluIGEgc2luZ2xlIGNsb25lK3dyaXRlIGN5Y2xlLlxuICAgKlxuICAgKiBFdmVyeSBgc2NvcGUuaXRlbXMucHVzaCh4KWAgY2xvbmVzIHRoZSBlbnRpcmUgYXJyYXkgYW5kIGNvbW1pdHMgaXQg4oCUIE8oTikgcGVyIGNhbGwuXG4gICAqIEZvciBOIG11dGF0aW9ucyBvbiBhbiBNLWxlbmd0aCBhcnJheSB0aGF0IGlzIE8oTsOXTSkuIFVzZSBgJGJhdGNoQXJyYXlgIHRvIGNsb25lIG9uY2UsXG4gICAqIGFwcGx5IGFsbCBtdXRhdGlvbnMgaW5zaWRlIGBmbmAsIHRoZW4gY29tbWl0IG9uY2Ug4oCUIE8oTSkgdG90YWwuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQmVmb3JlOiAxMDAwIGNsb25lcyDDlyBncm93aW5nIGFycmF5ID0gTyhOwrIpXG4gICAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBzY29wZS5pdGVtcy5wdXNoKGkpO1xuICAgKlxuICAgKiAvLyBBZnRlcjogMSBjbG9uZSArIDEgY29tbWl0ID0gTyhOKVxuICAgKiBzY29wZS4kYmF0Y2hBcnJheSgnaXRlbXMnLCAoYXJyKSA9PiB7XG4gICAqICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIGFyci5wdXNoKGkpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIGBmbmAgcmVjZWl2ZXMgYSBwbGFpbiAobm9uLXByb3h5KSBtdXRhYmxlICoqc2hhbGxvdyBjb3B5Kiogb2YgdGhlIGN1cnJlbnQgYXJyYXkuXG4gICAqIFRoZSBhcnJheSBpdHNlbGYgaXMgYSBuZXcgaW5zdGFuY2UsIGJ1dCBvYmplY3QgcmVmZXJlbmNlcyBpbnNpZGUgaXQgYXJlIHNoYXJlZCB3aXRoXG4gICAqIHRoZSBvcmlnaW5hbCBzdGF0ZSDigJQgbXV0YXRpb25zIHRvIG5lc3RlZCBvYmplY3RzIGluc2lkZSBgZm5gIGFmZmVjdCB0aG9zZSBvcmlnaW5hbHMuXG4gICAqIE9ubHkgcHVzaC9wb3Avc29ydC9zcGxpY2UgYW5kIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBjaGFuZ2UgdGhlIGFycmF5J3Mgb3duIHNsb3RzIGFyZVxuICAgKiBzYWZlbHkgaXNvbGF0ZWQuXG4gICAqXG4gICAqIE11dGF0aW9ucyBpbnNpZGUgYGZuYCBhcmUgTk9UIHRyYWNrZWQgaW5kaXZpZHVhbGx5IOKAlCBvbmx5IHRoZSBmaW5hbCBjb21taXR0ZWQgYXJyYXlcbiAgICogYXBwZWFycyBpbiB0aGUgbmFycmF0aXZlIGFzIGEgc2luZ2xlIHdyaXRlLiBJZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhblxuICAgKiBhcnJheSwgYGZuYCByZWNlaXZlcyBhbiBlbXB0eSBhcnJheSBhbmQgdGhlIHJlc3VsdCBpcyBjb21taXR0ZWQgYXMgdGhlIG5ldyB2YWx1ZS5cbiAgICpcbiAgICogSWYgYGZuYCB0aHJvd3MsIGBzZXRWYWx1ZWAgaXMgbmV2ZXIgY2FsbGVkIGFuZCBzdGF0ZSByZW1haW5zIHVuY2hhbmdlZCAoYXRvbWljIG9uXG4gICAqIGVycm9yKS4gVGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVzIHRvIHRoZSBjYWxsZXIuXG4gICAqXG4gICAqIGBrZXlgIGlzIHVudHlwZWQgKGBzdHJpbmdgKSDigJQgVHlwZVNjcmlwdCB3aWxsIG5vdCBjYXRjaCB0eXBvcy4gYGFycmAgaXMgdHlwZWQgYXNcbiAgICogYHVua25vd25bXWAgYmVjYXVzZSBgU2NvcGVNZXRob2RzYCBpcyBub3QgcGFyYW1ldGVyaXplZCBieSBgVGA7IGNhc3QgaW5zaWRlIGBmbmBcbiAgICogd2hlbiBlbGVtZW50IHR5cGVzIGFyZSBrbm93bjogYChhcnIgYXMgc3RyaW5nW10pLnB1c2goeClgLlxuICAgKi9cbiAgJGJhdGNoQXJyYXkoa2V5OiBzdHJpbmcsIGZuOiAoYXJyOiB1bmtub3duW10pID0+IHZvaWQpOiB2b2lkO1xuXG4gIC8vIFBpcGVsaW5lIGNvbnRyb2xcbiAgJGJyZWFrKCk6IHZvaWQ7XG5cbiAgLy8gRXNjYXBlIGhhdGNoIC0tIHVud3JhcCB0byB1bmRlcmx5aW5nIFJlYWN0aXZlVGFyZ2V0XG4gICR0b1JhdygpOiBSZWFjdGl2ZVRhcmdldDtcbn1cblxuLy8gLS0gVHlwZWRTY29wZTxUPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIGNvbnN1bWVyLWZhY2luZyB0eXBlLiBUIGlzIHRoZSB1c2VyJ3Mgc3RhdGUgaW50ZXJmYWNlLlxuLy8gUHJvcGVydHkgYWNjZXNzIGlzIHR5cGVkOyAkLW1ldGhvZHMgcHJvdmlkZSBlc2NhcGUgaGF0Y2hlcy5cblxuZXhwb3J0IHR5cGUgVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0gVCAmIFNjb3BlTWV0aG9kcztcblxuLy8gLS0gUmVhY3RpdmVPcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uZmlndXJhdGlvbiBwYXNzZWQgdG8gY3JlYXRlVHlwZWRTY29wZS5cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZU9wdGlvbnMge1xuICAvKiogUGlwZWxpbmUgYnJlYWsgZnVuY3Rpb24gLS0gaW5qZWN0ZWQgYnkgU3RhZ2VSdW5uZXIgYWZ0ZXIgc2NvcGUgY3JlYXRpb24uICovXG4gIGJyZWFrUGlwZWxpbmU/OiAoKSA9PiB2b2lkO1xufVxuXG4vLyAtLSBJbnRlcm5hbDogJC1tZXRob2QgbmFtZSBzZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVc2VkIGJ5IHRoZSBQcm94eSBnZXQgdHJhcCB0byBkaXN0aW5ndWlzaCAkLW1ldGhvZHMgZnJvbSBzdGF0ZSBrZXlzLlxuXG5leHBvcnQgY29uc3QgU0NPUEVfTUVUSE9EX05BTUVTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJyRnZXRWYWx1ZScsXG4gICckc2V0VmFsdWUnLFxuICAnJHVwZGF0ZScsXG4gICckZGVsZXRlJyxcbiAgJyRyZWFkJyxcbiAgJyRnZXRBcmdzJyxcbiAgJyRnZXRFbnYnLFxuICAnJGRlYnVnJyxcbiAgJyRsb2cnLFxuICAnJGVycm9yJyxcbiAgJyRtZXRyaWMnLFxuICAnJGV2YWwnLFxuICAnJGF0dGFjaFJlY29yZGVyJyxcbiAgJyRkZXRhY2hSZWNvcmRlcicsXG4gICckZ2V0UmVjb3JkZXJzJyxcbiAgJyRiYXRjaEFycmF5JyxcbiAgJyRicmVhaycsXG4gICckdG9SYXcnLFxuXSk7XG5cbi8vIC0tIEludGVybmFsOiBTeW1ib2wgZm9yIGRlZmVycmVkIGJyZWFrIGluamVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0YWdlUnVubmVyIHNldHMgdGhpcyBhZnRlciBzY29wZSBjcmVhdGlvbiBzbyAkYnJlYWsoKSB3b3Jrcy5cbi8vIFByaXZhdGUgU3ltYm9sIChub3QgU3ltYm9sLmZvcikgdG8gcHJldmVudCBjcm9zcy1tb2R1bGUgdGFtcGVyaW5nLlxuXG5leHBvcnQgY29uc3QgQlJFQUtfU0VUVEVSID0gU3ltYm9sKCdmb290cHJpbnQ6cmVhY3RpdmU6c2V0QnJlYWsnKTtcblxuLy8gLS0gSW50ZXJuYWw6IFN5bWJvbCBmb3IgVHlwZWRTY29wZSBkZXRlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXNlZCBieSBTdGFnZVJ1bm5lciB0byBza2lwIGNyZWF0ZVByb3RlY3RlZFNjb3BlIGZvciBUeXBlZFNjb3BlIGluc3RhbmNlcy5cbi8vIFByaXZhdGUgU3ltYm9sIHByZXZlbnRzIHN0cmluZy10YWcgc3Bvb2ZpbmcuXG5cbmV4cG9ydCBjb25zdCBJU19UWVBFRF9TQ09QRSA9IFN5bWJvbCgnZm9vdHByaW50OnJlYWN0aXZlOmlzVHlwZWRTY29wZScpO1xuXG4vLyAtLSBJbnRlcm5hbDogZXhlY3V0b3IgbWV0aG9kIGFsbG93bGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTY29wZUZhY2FkZSBtZXRob2RzIGNhbGxlZCBieSBGbG93Q2hhcnRFeGVjdXRvciB3cmFwcGluZyBjb2RlIGFuZCBTdGFnZVJ1bm5lclxuLy8gVEhST1VHSCBhIFR5cGVkU2NvcGUgcHJveHkuIE9ubHkgYWRkIG1ldGhvZHMgd2l0aCBjb25maXJtZWQgY2FsbCBzaXRlcy5cbi8vIFNoYXJlZCBiZXR3ZWVuIGNyZWF0ZVR5cGVkU2NvcGUudHMgYW5kIFN0YWdlUnVubmVyLnRzIHRvIHByZXZlbnQgZHJpZnQuXG5cbmV4cG9ydCBjb25zdCBFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTID0gbmV3IFNldChbXG4gICdub3RpZnlTdGFnZVN0YXJ0JywgLy8gU3RhZ2VSdW5uZXIucnVuKCkgbGluZSA1OVxuICAnbm90aWZ5U3RhZ2VFbmQnLCAvLyBTdGFnZVJ1bm5lci5ydW4oKSBsaW5lIDc5XG4gICdhdHRhY2hSZWNvcmRlcicsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCBuYXJyYXRpdmUgKyB1c2VyIHJlY29yZGVyc1xuICAnZGV0YWNoUmVjb3JkZXInLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5kZXRhY2hSZWNvcmRlcigpXG4gICdnZXRSZWNvcmRlcnMnLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5nZXRSZWNvcmRlcnMoKVxuICAndXNlU2hhcmVkUmVkYWN0ZWRLZXlzJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIHJlZGFjdGlvbiB3cmFwcGluZ1xuICAndXNlUmVkYWN0aW9uUG9saWN5JywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIHJlZGFjdGlvbiB3cmFwcGluZ1xuXSk7XG4iXX0=
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBaUlILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFMUQsUUFBQSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUNoRCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixhQUFhO0lBQ2IsUUFBUTtJQUNSLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSCwrRUFBK0U7QUFDL0UsZ0VBQWdFO0FBQ2hFLHFFQUFxRTtBQUV4RCxRQUFBLFlBQVksR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUVsRSwrRUFBK0U7QUFDL0UsNkVBQTZFO0FBQzdFLCtDQUErQztBQUVsQyxRQUFBLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFN0QsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQyxrQkFBa0IsRUFBRSw0QkFBNEI7SUFDaEQsZ0JBQWdCLEVBQUUsNEJBQTRCO0lBQzlDLGdCQUFnQixFQUFFLG1FQUFtRTtJQUNyRixnQkFBZ0IsRUFBRSxxQ0FBcUM7SUFDdkQsY0FBYyxFQUFFLG1DQUFtQztJQUNuRCx1QkFBdUIsRUFBRSwyREFBMkQ7SUFDcEYsb0JBQW9CLEVBQUUsMkRBQTJEO0NBQ2xGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVhY3RpdmUvdHlwZXMgLS0gVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFR5cGVkU2NvcGU8VD4gcmVhY3RpdmUgcHJveHkgc3lzdGVtLlxuICpcbiAqIFR5cGVkU2NvcGU8VD4gd3JhcHMgYSBSZWFjdGl2ZVRhcmdldCAoU2NvcGVGYWNhZGUpIGluIGEgUHJveHkgdGhhdCBwcm92aWRlc1xuICogdHlwZWQgcHJvcGVydHkgYWNjZXNzLiBBbGwgc2NvcGUgaW5mcmFzdHJ1Y3R1cmUgbWV0aG9kcyBhcmUgJC1wcmVmaXhlZCB0b1xuICogYXZvaWQgY29sbGlzaW9ucyB3aXRoIHVzZXIgc3RhdGUga2V5cy5cbiAqXG4gKiBEZXBlbmRlbmN5OiB0eXBlLW9ubHkgaW1wb3J0cyBmcm9tIGVuZ2luZS8gYW5kIHNjb3BlLyAoemVybyBydW50aW1lIGNvc3QpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uRW52IH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5cbi8vIC0tIFJlYWN0aXZlVGFyZ2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pbmltdW0gcHJvdG9jb2wgcmVxdWlyZWQgYnkgVHlwZWRTY29wZSAtLSBhIGN1cmF0ZWQgc3Vic2V0IG9mIFNjb3BlRmFjYWRlJ3Ncbi8vIHB1YmxpYyBBUEkuIE5vdCBhIGZ1bGwgbWlycm9yOiBleGNsdWRlcyBpbnRlcm5hbC9yZWRhY3Rpb24gbWV0aG9kcyB0aGF0IGFyZVxuLy8gaGFuZGxlZCBhdCB0aGUgZXhlY3V0b3IgbGV2ZWwgKHVzZVJlZGFjdGlvblBvbGljeSwgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzLCBldGMuKVxuLy8gYW5kIGluZnJhc3RydWN0dXJlIG1ldGhvZHMgKGdldFBpcGVsaW5lSWQsIHNldEdsb2JhbCwgZ2V0R2xvYmFsLCBldGMuKS5cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZVRhcmdldCB7XG4gIC8vIFN0YXRlIGFjY2VzcyAodHJhY2tlZCBieSByZWNvcmRlcnMpXG4gIGdldFZhbHVlKGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcblxuICAvLyBOb24tdHJhY2tpbmcgc3RhdGUgaW5zcGVjdGlvbiAoZm9yIHByb3h5IGludGVybmFscyDigJQgbm8gcmVjb3JkZXIgZGlzcGF0Y2gpXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzPygpOiBzdHJpbmdbXTtcbiAgLyoqIENoZWNrIGtleSBleGlzdGVuY2Ugd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGhhcyB0cmFwLiAqL1xuICBoYXNLZXk/KGtleTogc3RyaW5nKTogYm9vbGVhbjtcbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKS4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQ/KGtleT86IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHksIE5PVCB0cmFja2VkKVxuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgLy8gUmVjb3JkZXIgbWFuYWdlbWVudFxuICBhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkO1xuICBkZXRhY2hSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkO1xuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXTtcblxuICAvLyBEaWFnbm9zdGljc1xuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXJyb3JJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZE1ldHJpYyhuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXZhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbn1cblxuLy8gLS0gU2NvcGVNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlcy4gTm9uLWVudW1lcmFibGUgb24gdGhlIHByb3h5IC0tIGRvbid0IGFwcGVhciBpblxuLy8gT2JqZWN0LmtleXMoKSwgZGVzdHJ1Y3R1cmluZywgb3IgZm9yLi4uaW4uIE9ubHkgc3RhdGUga2V5cyBhcmUgdmlzaWJsZS5cblxuZXhwb3J0IGludGVyZmFjZSBTY29wZU1ldGhvZHMge1xuICAvLyBTdGF0ZSAodW50eXBlZCBlc2NhcGUgaGF0Y2ggLS0gZm9yIGR5bmFtaWMga2V5cywgcmVkYWN0aW9uLCBkZXNjcmlwdGlvbilcbiAgJGdldFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93bjtcbiAgJHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkdXBkYXRlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkZGVsZXRlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBQcm94eS1zeW50aGVzaXplZDogY2FsbHMgZ2V0VmFsdWUocm9vdEtleSkgdGhlbiBsb2Rhc2guZ2V0IGZvciBuZXN0ZWQgcGF0aC4gTm90IGEgZGlyZWN0IGRlbGVnYXRpb24uICovXG4gICRyZWFkKGRvdFBhdGg6IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHkpXG4gICRnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgJGdldEVudigpOiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8vIE9ic2VydmFiaWxpdHlcbiAgJGRlYnVnKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRsb2codmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkZXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJG1ldHJpYyhuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGV2YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cbiAgLy8gUmVjb3JkZXIgbWFuYWdlbWVudFxuICAkYXR0YWNoUmVjb3JkZXIocmVjb3JkZXI6IFJlY29yZGVyKTogdm9pZDtcbiAgJGRldGFjaFJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQ7XG4gICRnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXTtcblxuICAvKipcbiAgICogQmF0Y2gtbXV0YXRlIGFuIGFycmF5IGtleSBpbiBhIHNpbmdsZSBjbG9uZSt3cml0ZSBjeWNsZS5cbiAgICpcbiAgICogRXZlcnkgYHNjb3BlLml0ZW1zLnB1c2goeClgIGNsb25lcyB0aGUgZW50aXJlIGFycmF5IGFuZCBjb21taXRzIGl0IOKAlCBPKE4pIHBlciBjYWxsLlxuICAgKiBGb3IgTiBtdXRhdGlvbnMgb24gYW4gTS1sZW5ndGggYXJyYXkgdGhhdCBpcyBPKE7Dl00pLiBVc2UgYCRiYXRjaEFycmF5YCB0byBjbG9uZSBvbmNlLFxuICAgKiBhcHBseSBhbGwgbXV0YXRpb25zIGluc2lkZSBgZm5gLCB0aGVuIGNvbW1pdCBvbmNlIOKAlCBPKE0pIHRvdGFsLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEJlZm9yZTogMTAwMCBjbG9uZXMgw5cgZ3Jvd2luZyBhcnJheSA9IE8oTsKyKVxuICAgKiBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgc2NvcGUuaXRlbXMucHVzaChpKTtcbiAgICpcbiAgICogLy8gQWZ0ZXI6IDEgY2xvbmUgKyAxIGNvbW1pdCA9IE8oTilcbiAgICogc2NvcGUuJGJhdGNoQXJyYXkoJ2l0ZW1zJywgKGFycikgPT4ge1xuICAgKiAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBhcnIucHVzaChpKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBgZm5gIHJlY2VpdmVzIGEgcGxhaW4gKG5vbi1wcm94eSkgbXV0YWJsZSAqKnNoYWxsb3cgY29weSoqIG9mIHRoZSBjdXJyZW50IGFycmF5LlxuICAgKiBUaGUgYXJyYXkgaXRzZWxmIGlzIGEgbmV3IGluc3RhbmNlLCBidXQgb2JqZWN0IHJlZmVyZW5jZXMgaW5zaWRlIGl0IGFyZSBzaGFyZWQgd2l0aFxuICAgKiB0aGUgb3JpZ2luYWwgc3RhdGUg4oCUIG11dGF0aW9ucyB0byBuZXN0ZWQgb2JqZWN0cyBpbnNpZGUgYGZuYCBhZmZlY3QgdGhvc2Ugb3JpZ2luYWxzLlxuICAgKiBPbmx5IHB1c2gvcG9wL3NvcnQvc3BsaWNlIGFuZCBvdGhlciBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBhcnJheSdzIG93biBzbG90cyBhcmVcbiAgICogc2FmZWx5IGlzb2xhdGVkLlxuICAgKlxuICAgKiBNdXRhdGlvbnMgaW5zaWRlIGBmbmAgYXJlIE5PVCB0cmFja2VkIGluZGl2aWR1YWxseSDigJQgb25seSB0aGUgZmluYWwgY29tbWl0dGVkIGFycmF5XG4gICAqIGFwcGVhcnMgaW4gdGhlIG5hcnJhdGl2ZSBhcyBhIHNpbmdsZSB3cml0ZS4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYW5cbiAgICogYXJyYXksIGBmbmAgcmVjZWl2ZXMgYW4gZW1wdHkgYXJyYXkgYW5kIHRoZSByZXN1bHQgaXMgY29tbWl0dGVkIGFzIHRoZSBuZXcgdmFsdWUuXG4gICAqXG4gICAqIElmIGBmbmAgdGhyb3dzLCBgc2V0VmFsdWVgIGlzIG5ldmVyIGNhbGxlZCBhbmQgc3RhdGUgcmVtYWlucyB1bmNoYW5nZWQgKGF0b21pYyBvblxuICAgKiBlcnJvcikuIFRoZSBleGNlcHRpb24gcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyLlxuICAgKlxuICAgKiBga2V5YCBpcyB1bnR5cGVkIChgc3RyaW5nYCkg4oCUIFR5cGVTY3JpcHQgd2lsbCBub3QgY2F0Y2ggdHlwb3MuIGBhcnJgIGlzIHR5cGVkIGFzXG4gICAqIGB1bmtub3duW11gIGJlY2F1c2UgYFNjb3BlTWV0aG9kc2AgaXMgbm90IHBhcmFtZXRlcml6ZWQgYnkgYFRgOyBjYXN0IGluc2lkZSBgZm5gXG4gICAqIHdoZW4gZWxlbWVudCB0eXBlcyBhcmUga25vd246IGAoYXJyIGFzIHN0cmluZ1tdKS5wdXNoKHgpYC5cbiAgICovXG4gICRiYXRjaEFycmF5KGtleTogc3RyaW5nLCBmbjogKGFycjogdW5rbm93bltdKSA9PiB2b2lkKTogdm9pZDtcblxuICAvLyBQaXBlbGluZSBjb250cm9sXG4gICRicmVhaygpOiB2b2lkO1xuXG4gIC8vIEVzY2FwZSBoYXRjaCAtLSB1bndyYXAgdG8gdW5kZXJseWluZyBSZWFjdGl2ZVRhcmdldFxuICAkdG9SYXcoKTogUmVhY3RpdmVUYXJnZXQ7XG59XG5cbi8vIC0tIFR5cGVkU2NvcGU8VD4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBjb25zdW1lci1mYWNpbmcgdHlwZS4gVCBpcyB0aGUgdXNlcidzIHN0YXRlIGludGVyZmFjZS5cbi8vIFByb3BlcnR5IGFjY2VzcyBpcyB0eXBlZDsgJC1tZXRob2RzIHByb3ZpZGUgZXNjYXBlIGhhdGNoZXMuXG5cbmV4cG9ydCB0eXBlIFR5cGVkU2NvcGU8VCBleHRlbmRzIG9iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IFQgJiBTY29wZU1ldGhvZHM7XG5cbi8vIC0tIFJlYWN0aXZlT3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGNyZWF0ZVR5cGVkU2NvcGUuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVPcHRpb25zIHtcbiAgLyoqIFBpcGVsaW5lIGJyZWFrIGZ1bmN0aW9uIC0tIGluamVjdGVkIGJ5IFN0YWdlUnVubmVyIGFmdGVyIHNjb3BlIGNyZWF0aW9uLiAqL1xuICBicmVha1BpcGVsaW5lPzogKCkgPT4gdm9pZDtcbn1cblxuLy8gLS0gSW50ZXJuYWw6ICQtbWV0aG9kIG5hbWUgc2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXNlZCBieSB0aGUgUHJveHkgZ2V0IHRyYXAgdG8gZGlzdGluZ3Vpc2ggJC1tZXRob2RzIGZyb20gc3RhdGUga2V5cy5cblxuZXhwb3J0IGNvbnN0IFNDT1BFX01FVEhPRF9OQU1FUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICckZ2V0VmFsdWUnLFxuICAnJHNldFZhbHVlJyxcbiAgJyR1cGRhdGUnLFxuICAnJGRlbGV0ZScsXG4gICckcmVhZCcsXG4gICckZ2V0QXJncycsXG4gICckZ2V0RW52JyxcbiAgJyRkZWJ1ZycsXG4gICckbG9nJyxcbiAgJyRlcnJvcicsXG4gICckbWV0cmljJyxcbiAgJyRldmFsJyxcbiAgJyRhdHRhY2hSZWNvcmRlcicsXG4gICckZGV0YWNoUmVjb3JkZXInLFxuICAnJGdldFJlY29yZGVycycsXG4gICckYmF0Y2hBcnJheScsXG4gICckYnJlYWsnLFxuICAnJHRvUmF3Jyxcbl0pO1xuXG4vLyAtLSBJbnRlcm5hbDogU3ltYm9sIGZvciBkZWZlcnJlZCBicmVhayBpbmplY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGFnZVJ1bm5lciBzZXRzIHRoaXMgYWZ0ZXIgc2NvcGUgY3JlYXRpb24gc28gJGJyZWFrKCkgd29ya3MuXG4vLyBQcml2YXRlIFN5bWJvbCAobm90IFN5bWJvbC5mb3IpIHRvIHByZXZlbnQgY3Jvc3MtbW9kdWxlIHRhbXBlcmluZy5cblxuZXhwb3J0IGNvbnN0IEJSRUFLX1NFVFRFUiA9IFN5bWJvbCgnZm9vdHByaW50OnJlYWN0aXZlOnNldEJyZWFrJyk7XG5cbi8vIC0tIEludGVybmFsOiBTeW1ib2wgZm9yIFR5cGVkU2NvcGUgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVzZWQgYnkgU3RhZ2VSdW5uZXIgdG8gc2tpcCBjcmVhdGVQcm90ZWN0ZWRTY29wZSBmb3IgVHlwZWRTY29wZSBpbnN0YW5jZXMuXG4vLyBQcml2YXRlIFN5bWJvbCBwcmV2ZW50cyBzdHJpbmctdGFnIHNwb29maW5nLlxuXG5leHBvcnQgY29uc3QgSVNfVFlQRURfU0NPUEUgPSBTeW1ib2woJ2Zvb3RwcmludDpyZWFjdGl2ZTppc1R5cGVkU2NvcGUnKTtcblxuLy8gLS0gSW50ZXJuYWw6IGV4ZWN1dG9yIG1ldGhvZCBhbGxvd2xpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2NvcGVGYWNhZGUgbWV0aG9kcyBjYWxsZWQgYnkgRmxvd0NoYXJ0RXhlY3V0b3Igd3JhcHBpbmcgY29kZSBhbmQgU3RhZ2VSdW5uZXJcbi8vIFRIUk9VR0ggYSBUeXBlZFNjb3BlIHByb3h5LiBPbmx5IGFkZCBtZXRob2RzIHdpdGggY29uZmlybWVkIGNhbGwgc2l0ZXMuXG4vLyBTaGFyZWQgYmV0d2VlbiBjcmVhdGVUeXBlZFNjb3BlLnRzIGFuZCBTdGFnZVJ1bm5lci50cyB0byBwcmV2ZW50IGRyaWZ0LlxuXG5leHBvcnQgY29uc3QgRVhFQ1VUT1JfSU5URVJOQUxfTUVUSE9EUyA9IG5ldyBTZXQoW1xuICAnbm90aWZ5U3RhZ2VTdGFydCcsIC8vIFN0YWdlUnVubmVyLnJ1bigpIGxpbmUgNTlcbiAgJ25vdGlmeVN0YWdlRW5kJywgLy8gU3RhZ2VSdW5uZXIucnVuKCkgbGluZSA3OVxuICAnYXR0YWNoUmVjb3JkZXInLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5jcmVhdGVUcmF2ZXJzZXIoKSDigJQgbmFycmF0aXZlICsgdXNlciByZWNvcmRlcnNcbiAgJ2RldGFjaFJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuZGV0YWNoUmVjb3JkZXIoKVxuICAnZ2V0UmVjb3JkZXJzJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0UmVjb3JkZXJzKClcbiAgJ3VzZVNoYXJlZFJlZGFjdGVkS2V5cycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbiAgJ3VzZVJlZGFjdGlvblBvbGljeScsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbl0pO1xuIl19
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CompositeRecorder — fan-out a single recorder attachment to multiple child recorders.
|
|
4
|
+
*
|
|
5
|
+
* Implements both Recorder (scope data ops) and FlowRecorder (control flow events)
|
|
6
|
+
* so it works with both `executor.attachRecorder()` and `executor.attachFlowRecorder()`.
|
|
7
|
+
*
|
|
8
|
+
* The composite has a single ID for idempotent attach/detach. Child recorders
|
|
9
|
+
* keep their own IDs internally but are not individually visible to the executor.
|
|
10
|
+
*
|
|
11
|
+
* Domain libraries (e.g., agentfootprint) use this to bundle multiple recorders
|
|
12
|
+
* into a single preset — the consumer calls one function, gets full observability.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { CompositeRecorder, MetricRecorder, DebugRecorder } from 'footprintjs';
|
|
17
|
+
*
|
|
18
|
+
* // Bundle metrics + debug into a single recorder
|
|
19
|
+
* const observability = new CompositeRecorder('observability', [
|
|
20
|
+
* new MetricRecorder({ stageFilter: (name) => name === 'CallLLM' }),
|
|
21
|
+
* new DebugRecorder({ verbosity: 'minimal' }),
|
|
22
|
+
* ]);
|
|
23
|
+
*
|
|
24
|
+
* executor.attachRecorder(observability);
|
|
25
|
+
*
|
|
26
|
+
* // Access child recorders by type
|
|
27
|
+
* const metrics = observability.get(MetricRecorder);
|
|
28
|
+
* metrics?.getMetrics(); // timing data
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* // Domain library preset (e.g., agentfootprint)
|
|
34
|
+
* export function agentObservability(options?: AgentObservabilityOptions) {
|
|
35
|
+
* return new CompositeRecorder('agent-observability', [
|
|
36
|
+
* new MetricRecorder(options?.stageFilter ? { stageFilter: options.stageFilter } : undefined),
|
|
37
|
+
* new TokenRecorder(),
|
|
38
|
+
* new ToolUsageRecorder(),
|
|
39
|
+
* ]);
|
|
40
|
+
* }
|
|
41
|
+
*
|
|
42
|
+
* // Consumer
|
|
43
|
+
* executor.attachRecorder(agentObservability());
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.CompositeRecorder = void 0;
|
|
48
|
+
class CompositeRecorder {
|
|
49
|
+
constructor(id, children) {
|
|
50
|
+
this.id = id;
|
|
51
|
+
this.children = [...children];
|
|
52
|
+
}
|
|
53
|
+
// ── Child access ──────────────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* Get a child recorder by class type.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const metrics = composite.get(MetricRecorder);
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
get(type) {
|
|
63
|
+
return this.children.find((c) => c instanceof type);
|
|
64
|
+
}
|
|
65
|
+
/** Get all child recorders. */
|
|
66
|
+
getChildren() {
|
|
67
|
+
return this.children;
|
|
68
|
+
}
|
|
69
|
+
// ── Scope Recorder hooks (fan-out to children that implement Recorder) ─
|
|
70
|
+
onRead(event) {
|
|
71
|
+
for (const c of this.children)
|
|
72
|
+
if (c.onRead)
|
|
73
|
+
c.onRead(event);
|
|
74
|
+
}
|
|
75
|
+
onWrite(event) {
|
|
76
|
+
for (const c of this.children)
|
|
77
|
+
if (c.onWrite)
|
|
78
|
+
c.onWrite(event);
|
|
79
|
+
}
|
|
80
|
+
onCommit(event) {
|
|
81
|
+
for (const c of this.children)
|
|
82
|
+
if (c.onCommit)
|
|
83
|
+
c.onCommit(event);
|
|
84
|
+
}
|
|
85
|
+
onError(event) {
|
|
86
|
+
for (const c of this.children)
|
|
87
|
+
if (c.onError)
|
|
88
|
+
c.onError(event);
|
|
89
|
+
}
|
|
90
|
+
onStageStart(event) {
|
|
91
|
+
for (const c of this.children)
|
|
92
|
+
if (c.onStageStart)
|
|
93
|
+
c.onStageStart(event);
|
|
94
|
+
}
|
|
95
|
+
onStageEnd(event) {
|
|
96
|
+
for (const c of this.children)
|
|
97
|
+
if (c.onStageEnd)
|
|
98
|
+
c.onStageEnd(event);
|
|
99
|
+
}
|
|
100
|
+
// ── FlowRecorder hooks (fan-out to children that implement FlowRecorder) ─
|
|
101
|
+
onStageExecuted(event) {
|
|
102
|
+
for (const c of this.children)
|
|
103
|
+
if (c.onStageExecuted)
|
|
104
|
+
c.onStageExecuted(event);
|
|
105
|
+
}
|
|
106
|
+
onNext(event) {
|
|
107
|
+
for (const c of this.children)
|
|
108
|
+
if (c.onNext)
|
|
109
|
+
c.onNext(event);
|
|
110
|
+
}
|
|
111
|
+
onDecision(event) {
|
|
112
|
+
for (const c of this.children)
|
|
113
|
+
if (c.onDecision)
|
|
114
|
+
c.onDecision(event);
|
|
115
|
+
}
|
|
116
|
+
onFork(event) {
|
|
117
|
+
for (const c of this.children)
|
|
118
|
+
if (c.onFork)
|
|
119
|
+
c.onFork(event);
|
|
120
|
+
}
|
|
121
|
+
onSelected(event) {
|
|
122
|
+
for (const c of this.children)
|
|
123
|
+
if (c.onSelected)
|
|
124
|
+
c.onSelected(event);
|
|
125
|
+
}
|
|
126
|
+
onSubflowEntry(event) {
|
|
127
|
+
for (const c of this.children)
|
|
128
|
+
if (c.onSubflowEntry)
|
|
129
|
+
c.onSubflowEntry(event);
|
|
130
|
+
}
|
|
131
|
+
onSubflowExit(event) {
|
|
132
|
+
for (const c of this.children)
|
|
133
|
+
if (c.onSubflowExit)
|
|
134
|
+
c.onSubflowExit(event);
|
|
135
|
+
}
|
|
136
|
+
onSubflowRegistered(event) {
|
|
137
|
+
for (const c of this.children)
|
|
138
|
+
if (c.onSubflowRegistered)
|
|
139
|
+
c.onSubflowRegistered(event);
|
|
140
|
+
}
|
|
141
|
+
onLoop(event) {
|
|
142
|
+
for (const c of this.children)
|
|
143
|
+
if (c.onLoop)
|
|
144
|
+
c.onLoop(event);
|
|
145
|
+
}
|
|
146
|
+
onBreak(event) {
|
|
147
|
+
for (const c of this.children)
|
|
148
|
+
if (c.onBreak)
|
|
149
|
+
c.onBreak(event);
|
|
150
|
+
}
|
|
151
|
+
// ── Lifecycle ─────────────────────────────────────────────────────────
|
|
152
|
+
clear() {
|
|
153
|
+
for (const c of this.children)
|
|
154
|
+
if (c.clear)
|
|
155
|
+
c.clear();
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Snapshot merges all child snapshots into a single composite entry.
|
|
159
|
+
* Each child's snapshot is preserved with its own id/name/data.
|
|
160
|
+
*/
|
|
161
|
+
toSnapshot() {
|
|
162
|
+
const childSnapshots = [];
|
|
163
|
+
for (const c of this.children) {
|
|
164
|
+
if (c.toSnapshot) {
|
|
165
|
+
const { name, data } = c.toSnapshot();
|
|
166
|
+
childSnapshots.push({ id: c.id, name, data });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
name: 'Composite',
|
|
171
|
+
data: { children: childSnapshots },
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.CompositeRecorder = CompositeRecorder;
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9zaXRlUmVjb3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0NvbXBvc2l0ZVJlY29yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRzs7O0FBeUJILE1BQWEsaUJBQWlCO0lBSTVCLFlBQVksRUFBVSxFQUFFLFFBQXdDO1FBQzlELElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELHlFQUF5RTtJQUV6RTs7Ozs7OztPQU9HO0lBQ0gsR0FBRyxDQUFJLElBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxJQUFJLENBQWtCLENBQUM7SUFDdkUsQ0FBQztJQUVELCtCQUErQjtJQUMvQixXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwwRUFBMEU7SUFFMUUsTUFBTSxDQUFDLEtBQWdCO1FBQ3JCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFLLENBQWMsQ0FBQyxNQUFNO2dCQUFHLENBQWMsQ0FBQyxNQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFpQjtRQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSyxDQUFjLENBQUMsT0FBTztnQkFBRyxDQUFjLENBQUMsT0FBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBa0I7UUFDekIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJ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T0FBTyxDQUFDLEtBQXFCO1FBQzNCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFLLENBQWtCLENBQUMsT0FBTztnQkFBRyxDQUFrQixDQUFDLE9BQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQseUVBQXlFO0lBRXpFLEtBQUs7UUFDSCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLENBQUMsS0FBSztnQkFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixNQUFNLGNBQWMsR0FBdUQsRUFBRSxDQUFDO1FBQzlFLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqQixNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdEMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTztZQUNMLElBQUksRUFBRSxXQUFXO1lBQ2pCLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7U0FDbkMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXhIRCw4Q0F3SEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBvc2l0ZVJlY29yZGVyIOKAlCBmYW4tb3V0IGEgc2luZ2xlIHJlY29yZGVyIGF0dGFjaG1lbnQgdG8gbXVsdGlwbGUgY2hpbGQgcmVjb3JkZXJzLlxuICpcbiAqIEltcGxlbWVudHMgYm90aCBSZWNvcmRlciAoc2NvcGUgZGF0YSBvcHMpIGFuZCBGbG93UmVjb3JkZXIgKGNvbnRyb2wgZmxvdyBldmVudHMpXG4gKiBzbyBpdCB3b3JrcyB3aXRoIGJvdGggYGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKClgIGFuZCBgZXhlY3V0b3IuYXR0YWNoRmxvd1JlY29yZGVyKClgLlxuICpcbiAqIFRoZSBjb21wb3NpdGUgaGFzIGEgc2luZ2xlIElEIGZvciBpZGVtcG90ZW50IGF0dGFjaC9kZXRhY2guIENoaWxkIHJlY29yZGVyc1xuICoga2VlcCB0aGVpciBvd24gSURzIGludGVybmFsbHkgYnV0IGFyZSBub3QgaW5kaXZpZHVhbGx5IHZpc2libGUgdG8gdGhlIGV4ZWN1dG9yLlxuICpcbiAqIERvbWFpbiBsaWJyYXJpZXMgKGUuZy4sIGFnZW50Zm9vdHByaW50KSB1c2UgdGhpcyB0byBidW5kbGUgbXVsdGlwbGUgcmVjb3JkZXJzXG4gKiBpbnRvIGEgc2luZ2xlIHByZXNldCDigJQgdGhlIGNvbnN1bWVyIGNhbGxzIG9uZSBmdW5jdGlvbiwgZ2V0cyBmdWxsIG9ic2VydmFiaWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyLCBNZXRyaWNSZWNvcmRlciwgRGVidWdSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiAvLyBCdW5kbGUgbWV0cmljcyArIGRlYnVnIGludG8gYSBzaW5nbGUgcmVjb3JkZXJcbiAqIGNvbnN0IG9ic2VydmFiaWxpdHkgPSBuZXcgQ29tcG9zaXRlUmVjb3JkZXIoJ29ic2VydmFiaWxpdHknLCBbXG4gKiAgIG5ldyBNZXRyaWNSZWNvcmRlcih7IHN0YWdlRmlsdGVyOiAobmFtZSkgPT4gbmFtZSA9PT0gJ0NhbGxMTE0nIH0pLFxuICogICBuZXcgRGVidWdSZWNvcmRlcih7IHZlcmJvc2l0eTogJ21pbmltYWwnIH0pLFxuICogXSk7XG4gKlxuICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIob2JzZXJ2YWJpbGl0eSk7XG4gKlxuICogLy8gQWNjZXNzIGNoaWxkIHJlY29yZGVycyBieSB0eXBlXG4gKiBjb25zdCBtZXRyaWNzID0gb2JzZXJ2YWJpbGl0eS5nZXQoTWV0cmljUmVjb3JkZXIpO1xuICogbWV0cmljcz8uZ2V0TWV0cmljcygpOyAvLyB0aW1pbmcgZGF0YVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIERvbWFpbiBsaWJyYXJ5IHByZXNldCAoZS5nLiwgYWdlbnRmb290cHJpbnQpXG4gKiBleHBvcnQgZnVuY3Rpb24gYWdlbnRPYnNlcnZhYmlsaXR5KG9wdGlvbnM/OiBBZ2VudE9ic2VydmFiaWxpdHlPcHRpb25zKSB7XG4gKiAgIHJldHVybiBuZXcgQ29tcG9zaXRlUmVjb3JkZXIoJ2FnZW50LW9ic2VydmFiaWxpdHknLCBbXG4gKiAgICAgbmV3IE1ldHJpY1JlY29yZGVyKG9wdGlvbnM/LnN0YWdlRmlsdGVyID8geyBzdGFnZUZpbHRlcjogb3B0aW9ucy5zdGFnZUZpbHRlciB9IDogdW5kZWZpbmVkKSxcbiAqICAgICBuZXcgVG9rZW5SZWNvcmRlcigpLFxuICogICAgIG5ldyBUb29sVXNhZ2VSZWNvcmRlcigpLFxuICogICBdKTtcbiAqIH1cbiAqXG4gKiAvLyBDb25zdW1lclxuICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIoYWdlbnRPYnNlcnZhYmlsaXR5KCkpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGbG93QnJlYWtFdmVudCxcbiAgRmxvd0RlY2lzaW9uRXZlbnQsXG4gIEZsb3dFcnJvckV2ZW50LFxuICBGbG93Rm9ya0V2ZW50LFxuICBGbG93TG9vcEV2ZW50LFxuICBGbG93TmV4dEV2ZW50LFxuICBGbG93UmVjb3JkZXIsXG4gIEZsb3dTZWxlY3RlZEV2ZW50LFxuICBGbG93U3RhZ2VFdmVudCxcbiAgRmxvd1N1YmZsb3dFdmVudCxcbiAgRmxvd1N1YmZsb3dSZWdpc3RlcmVkRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRFdmVudCwgRXJyb3JFdmVudCwgUmVhZEV2ZW50LCBSZWNvcmRlciwgU3RhZ2VFdmVudCwgV3JpdGVFdmVudCB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcblxuLyoqIFNuYXBzaG90IGZvcm1hdCBmb3IgY29tcG9zaXRlIHJlY29yZGVycyDigJQgd3JhcHMgY2hpbGQgc25hcHNob3RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb3NpdGVTbmFwc2hvdCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGF0YToge1xuICAgIGNoaWxkcmVuOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9PjtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZVJlY29yZGVyIGltcGxlbWVudHMgUmVjb3JkZXIsIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IEFycmF5PFJlY29yZGVyIHwgRmxvd1JlY29yZGVyPjtcblxuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBjaGlsZHJlbjogQXJyYXk8UmVjb3JkZXIgfCBGbG93UmVjb3JkZXI+KSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW5dO1xuICB9XG5cbiAgLy8g4pSA4pSAIENoaWxkIGFjY2VzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogR2V0IGEgY2hpbGQgcmVjb3JkZXIgYnkgY2xhc3MgdHlwZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBtZXRyaWNzID0gY29tcG9zaXRlLmdldChNZXRyaWNSZWNvcmRlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0PFQ+KHR5cGU6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5maW5kKChjKSA9PiBjIGluc3RhbmNlb2YgdHlwZSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBHZXQgYWxsIGNoaWxkIHJlY29yZGVycy4gKi9cbiAgZ2V0Q2hpbGRyZW4oKTogUmVhZG9ubHlBcnJheTxSZWNvcmRlciB8IEZsb3dSZWNvcmRlcj4ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlIFJlY29yZGVyIGhvb2tzIChmYW4tb3V0IHRvIGNoaWxkcmVuIHRoYXQgaW1wbGVtZW50IFJlY29yZGVyKSDilIBcblxuICBvblJlYWQoZXZlbnQ6IFJlYWRFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uUmVhZCkgKGMgYXMgUmVjb3JkZXIpLm9uUmVhZCEoZXZlbnQpO1xuICB9XG5cbiAgb25Xcml0ZShldmVudDogV3JpdGVFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uV3JpdGUpIChjIGFzIFJlY29yZGVyKS5vbldyaXRlIShldmVudCk7XG4gIH1cblxuICBvbkNvbW1pdChldmVudDogQ29tbWl0RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIFJlY29yZGVyKS5vbkNvbW1pdCkgKGMgYXMgUmVjb3JkZXIpLm9uQ29tbWl0IShldmVudCk7XG4gIH1cblxuICBvbkVycm9yKGV2ZW50OiBFcnJvckV2ZW50IHwgRmxvd0Vycm9yRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIFJlY29yZGVyKS5vbkVycm9yKSAoYyBhcyBSZWNvcmRlcikub25FcnJvciEoZXZlbnQgYXMgYW55KTtcbiAgfVxuXG4gIG9uU3RhZ2VTdGFydChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uU3RhZ2VTdGFydCkgKGMgYXMgUmVjb3JkZXIpLm9uU3RhZ2VTdGFydCEoZXZlbnQpO1xuICB9XG5cbiAgb25TdGFnZUVuZChldmVudDogU3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgUmVjb3JkZXIpLm9uU3RhZ2VFbmQpIChjIGFzIFJlY29yZGVyKS5vblN0YWdlRW5kIShldmVudCk7XG4gIH1cblxuICAvLyDilIDilIAgRmxvd1JlY29yZGVyIGhvb2tzIChmYW4tb3V0IHRvIGNoaWxkcmVuIHRoYXQgaW1wbGVtZW50IEZsb3dSZWNvcmRlcikg4pSAXG5cbiAgb25TdGFnZUV4ZWN1dGVkKGV2ZW50OiBGbG93U3RhZ2VFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN0YWdlRXhlY3V0ZWQpIChjIGFzIEZsb3dSZWNvcmRlcikub25TdGFnZUV4ZWN1dGVkIShldmVudCk7XG4gIH1cblxuICBvbk5leHQoZXZlbnQ6IEZsb3dOZXh0RXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25OZXh0KSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uTmV4dCEoZXZlbnQpO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25EZWNpc2lvbikgKGMgYXMgRmxvd1JlY29yZGVyKS5vbkRlY2lzaW9uIShldmVudCk7XG4gIH1cblxuICBvbkZvcmsoZXZlbnQ6IEZsb3dGb3JrRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25Gb3JrKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uRm9yayEoZXZlbnQpO1xuICB9XG5cbiAgb25TZWxlY3RlZChldmVudDogRmxvd1NlbGVjdGVkRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGMgb2YgdGhpcy5jaGlsZHJlbikgaWYgKChjIGFzIEZsb3dSZWNvcmRlcikub25TZWxlY3RlZCkgKGMgYXMgRmxvd1JlY29yZGVyKS5vblNlbGVjdGVkIShldmVudCk7XG4gIH1cblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dFbnRyeSkgKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dFbnRyeSEoZXZlbnQpO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dFeGl0KSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uU3ViZmxvd0V4aXQhKGV2ZW50KTtcbiAgfVxuXG4gIG9uU3ViZmxvd1JlZ2lzdGVyZWQoZXZlbnQ6IEZsb3dTdWJmbG93UmVnaXN0ZXJlZEV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pXG4gICAgICBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vblN1YmZsb3dSZWdpc3RlcmVkKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uU3ViZmxvd1JlZ2lzdGVyZWQhKGV2ZW50KTtcbiAgfVxuXG4gIG9uTG9vcChldmVudDogRmxvd0xvb3BFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vbkxvb3ApIChjIGFzIEZsb3dSZWNvcmRlcikub25Mb29wIShldmVudCk7XG4gIH1cblxuICBvbkJyZWFrKGV2ZW50OiBGbG93QnJlYWtFdmVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSBpZiAoKGMgYXMgRmxvd1JlY29yZGVyKS5vbkJyZWFrKSAoYyBhcyBGbG93UmVjb3JkZXIpLm9uQnJlYWshKGV2ZW50KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjIG9mIHRoaXMuY2hpbGRyZW4pIGlmIChjLmNsZWFyKSBjLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3QgbWVyZ2VzIGFsbCBjaGlsZCBzbmFwc2hvdHMgaW50byBhIHNpbmdsZSBjb21wb3NpdGUgZW50cnkuXG4gICAqIEVhY2ggY2hpbGQncyBzbmFwc2hvdCBpcyBwcmVzZXJ2ZWQgd2l0aCBpdHMgb3duIGlkL25hbWUvZGF0YS5cbiAgICovXG4gIHRvU25hcHNob3QoKTogQ29tcG9zaXRlU25hcHNob3Qge1xuICAgIGNvbnN0IGNoaWxkU25hcHNob3RzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9PiA9IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoYy50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgZGF0YSB9ID0gYy50b1NuYXBzaG90KCk7XG4gICAgICAgIGNoaWxkU25hcHNob3RzLnB1c2goeyBpZDogYy5pZCwgbmFtZSwgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdDb21wb3NpdGUnLFxuICAgICAgZGF0YTogeyBjaGlsZHJlbjogY2hpbGRTbmFwc2hvdHMgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CompositeRecorder = void 0;
|
|
4
|
+
var CompositeRecorder_js_1 = require("./CompositeRecorder.js");
|
|
5
|
+
Object.defineProperty(exports, "CompositeRecorder", { enumerable: true, get: function () { return CompositeRecorder_js_1.CompositeRecorder; } });
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtEQUEyRDtBQUFsRCx5SEFBQSxpQkFBaUIsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgQ29tcG9zaXRlU25hcHNob3QgfSBmcm9tICcuL0NvbXBvc2l0ZVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IENvbXBvc2l0ZVJlY29yZGVyIH0gZnJvbSAnLi9Db21wb3NpdGVSZWNvcmRlci5qcyc7XG4iXX0=
|
|
@@ -101,7 +101,7 @@ class FlowChartExecutor {
|
|
|
101
101
|
// then create ONE factory that applies them in a loop. Replaces the
|
|
102
102
|
// previous 4-deep closure nesting with a flat, debuggable composition.
|
|
103
103
|
if (narrativeFlag) {
|
|
104
|
-
this.combinedRecorder = new CombinedNarrativeRecorder_js_1.CombinedNarrativeRecorder();
|
|
104
|
+
this.combinedRecorder = new CombinedNarrativeRecorder_js_1.CombinedNarrativeRecorder(this.narrativeOptions);
|
|
105
105
|
}
|
|
106
106
|
else {
|
|
107
107
|
this.combinedRecorder = undefined;
|
|
@@ -182,8 +182,10 @@ class FlowChartExecutor {
|
|
|
182
182
|
...(maxDepth !== undefined && { maxDepth }),
|
|
183
183
|
});
|
|
184
184
|
}
|
|
185
|
-
enableNarrative() {
|
|
185
|
+
enableNarrative(options) {
|
|
186
186
|
this.narrativeEnabled = true;
|
|
187
|
+
if (options)
|
|
188
|
+
this.narrativeOptions = options;
|
|
187
189
|
}
|
|
188
190
|
/**
|
|
189
191
|
* Set a declarative redaction policy that applies to all stages.
|
|
@@ -213,8 +215,32 @@ class FlowChartExecutor {
|
|
|
213
215
|
* Attach a scope Recorder to observe data operations (reads, writes, commits).
|
|
214
216
|
* Automatically attached to every ScopeFacade created during traversal.
|
|
215
217
|
* Must be called before run().
|
|
218
|
+
*
|
|
219
|
+
* **Idempotent by ID:** If a recorder with the same `id` is already attached,
|
|
220
|
+
* it is replaced (not duplicated). This prevents double-counting when both
|
|
221
|
+
* a framework and the user attach the same recorder type.
|
|
222
|
+
*
|
|
223
|
+
* Built-in recorders use auto-increment IDs (`metrics-1`, `debug-1`, ...) by
|
|
224
|
+
* default, so multiple instances with different configs coexist. To override
|
|
225
|
+
* a framework-attached recorder, pass the same well-known ID.
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* // Multiple recorders with different configs — each gets a unique ID
|
|
230
|
+
* executor.attachRecorder(new MetricRecorder());
|
|
231
|
+
* executor.attachRecorder(new DebugRecorder({ verbosity: 'minimal' }));
|
|
232
|
+
*
|
|
233
|
+
* // Override a framework-attached recorder by passing its well-known ID
|
|
234
|
+
* executor.attachRecorder(new MetricRecorder('metrics'));
|
|
235
|
+
*
|
|
236
|
+
* // Attaching twice with same ID replaces (no double-counting)
|
|
237
|
+
* executor.attachRecorder(new MetricRecorder('my-metrics'));
|
|
238
|
+
* executor.attachRecorder(new MetricRecorder('my-metrics')); // replaces previous
|
|
239
|
+
* ```
|
|
216
240
|
*/
|
|
217
241
|
attachRecorder(recorder) {
|
|
242
|
+
// Replace existing recorder with same ID (idempotent — prevents double-counting)
|
|
243
|
+
this.scopeRecorders = this.scopeRecorders.filter((r) => r.id !== recorder.id);
|
|
218
244
|
this.scopeRecorders.push(recorder);
|
|
219
245
|
}
|
|
220
246
|
/** Detach all scope Recorders with the given ID. */
|
|
@@ -230,8 +256,12 @@ class FlowChartExecutor {
|
|
|
230
256
|
* Attach a FlowRecorder to observe control flow events.
|
|
231
257
|
* Automatically enables narrative if not already enabled.
|
|
232
258
|
* Must be called before run() — recorders are passed to the traverser at creation time.
|
|
259
|
+
*
|
|
260
|
+
* **Idempotent by ID:** replaces existing recorder with same `id`.
|
|
233
261
|
*/
|
|
234
262
|
attachFlowRecorder(recorder) {
|
|
263
|
+
// Replace existing recorder with same ID (idempotent — prevents double-counting)
|
|
264
|
+
this.flowRecorders = this.flowRecorders.filter((r) => r.id !== recorder.id);
|
|
235
265
|
this.flowRecorders.push(recorder);
|
|
236
266
|
this.narrativeEnabled = true;
|
|
237
267
|
}
|
|
@@ -407,4 +437,4 @@ class FlowChartExecutor {
|
|
|
407
437
|
}
|
|
408
438
|
}
|
|
409
439
|
exports.FlowChartExecutor = FlowChartExecutor;
|
|
410
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFFSCxtR0FBNkY7QUFDN0YsMkZBQXFGO0FBR3JGLG1HQUE2RjtBQUU3RixxRkFBK0U7QUFDL0UsaURBVzRCO0FBRTVCLDREQUFzRDtBQUV0RCwrREFBc0c7QUFDdEcseURBQW1EO0FBRW5ELDBFQUEwRTtBQUMxRSxNQUFNLG1CQUFtQixHQUFpQixDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQzFFLElBQUksNEJBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQWlFakQsTUFBYSxpQkFBaUI7SUF5QjVCOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILFlBQ0UsU0FBa0MsRUFDbEMsZ0JBQTBFOztRQXpDcEUscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxtQkFBYyxHQUFlLEVBQUUsQ0FBQztRQUVoQyx1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3ZDLDhCQUF5QixHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBcUNqRSw2Q0FBNkM7UUFDN0MsSUFBSSxZQUE4QyxDQUFDO1FBQ25ELElBQUksdUJBQWdDLENBQUM7UUFDckMsSUFBSSxjQUF1QixDQUFDO1FBQzVCLElBQUksZUFBd0IsQ0FBQztRQUM3QixJQUFJLHNCQUFpRSxDQUFDO1FBQ3RFLElBQUksY0FBMEMsQ0FBQztRQUMvQyxJQUFJLG1CQUFvRCxDQUFDO1FBQ3pELElBQUksZUFBb0MsQ0FBQztRQUV6QyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDM0MsMkRBQTJEO1lBQzNELFlBQVksR0FBRyxnQkFBZ0IsQ0FBQztRQUNsQyxDQUFDO2FBQU0sSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQyw0RkFBNEY7WUFDNUYsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7WUFDOUIsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDakMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ3ZELGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3JDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3ZDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUNyRCxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDL0MsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsU0FBUztZQUNULFlBQVksRUFBRSxNQUFBLFlBQVksYUFBWixZQUFZLGNBQVosWUFBWSxHQUFJLFNBQVMsQ0FBQyxZQUFZLG1DQUFLLG1CQUE0QztZQUNyRyx1QkFBdUI7WUFDdkIsY0FBYztZQUNkLGVBQWU7WUFDZixzQkFBc0I7WUFDdEIsY0FBYztZQUNkLG1CQUFtQjtZQUNuQixlQUFlO1NBQ2hCLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sZUFBZSxDQUNyQixNQUFvQixFQUNwQix1QkFBaUMsRUFDakMsR0FBNEMsRUFDNUMsUUFBaUI7O1FBRWpCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxNQUFBLEVBQUUsQ0FBQyxlQUFlLG1DQUFJLEtBQUssQ0FBQyxDQUFDO1FBRTdFLHNFQUFzRTtRQUN0RSx5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLHVFQUF1RTtRQUV2RSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHdEQUF5QixFQUFFLENBQUM7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUM1QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFJaEUsTUFBTSxTQUFTLEdBQW9CLEVBQUUsQ0FBQztRQUV0QyxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDdkMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2QixJQUFJLE9BQU8sS0FBSyxDQUFDLGNBQWMsS0FBSyxVQUFVO29CQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakYsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN0QyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksT0FBTyxLQUFLLENBQUMsY0FBYyxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUMvQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVM7d0JBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELDhEQUE4RDtRQUM5RCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3BDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDdkIsSUFBSSxPQUFPLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDbkQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCw4REFBOEQ7WUFDOUQsMkRBQTJEO1lBQzNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsc0RBQXNEO1FBQ3RELGdGQUFnRjtRQUNoRixzRkFBc0Y7UUFDdEYsbUZBQW1GO1FBQ25GLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdEMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDbkQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxTQUFpQixFQUFFLFFBQWtCLEVBQUUsTUFBWSxFQUFFLEVBQUU7WUFDdEYsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVELHFDQUFxQztZQUNyQyxJQUFJLE9BQVEsS0FBYSxDQUFDLHFCQUFxQixLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUM5RCxLQUFhLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsMkJBQTJCO1lBQzNCLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUztnQkFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQXlCLENBQUM7UUFFM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxzQ0FBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWxILE9BQU8sSUFBSSwwQ0FBa0IsQ0FBZTtZQUMxQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7WUFDYixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7WUFDckIsWUFBWTtZQUNaLGdCQUFnQixFQUFFLE9BQU87WUFDekIsZUFBZSxFQUFFLHVCQUF1QixhQUF2Qix1QkFBdUIsY0FBdkIsdUJBQXVCLEdBQUksSUFBSSxDQUFDLGVBQWU7WUFDaEUsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQjtZQUNuRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTO1lBQ3ZCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7WUFDN0MsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO1lBQ3JCLGVBQWUsRUFBRSxNQUFBLElBQUksQ0FBQyxlQUFlLG1DQUFJLEVBQUUsQ0FBQyxlQUFlO1lBQzNELGdCQUFnQixFQUFFLGFBQWE7WUFDL0Isa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGtCQUFrQjtZQUN6QyxNQUFNLEVBQUUsTUFBQSxFQUFFLENBQUMsTUFBTSxtQ0FBSSx3QkFBYTtZQUNsQyxNQUFNO1lBQ04sWUFBWSxFQUFFLEdBQUc7WUFDakIsYUFBYSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUM1QyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQUMsTUFBdUI7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjs7UUFDaEIsTUFBTSxlQUFlLEdBQTZCLEVBQUUsQ0FBQztRQUNyRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDM0QsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsT0FBTztZQUNMLFlBQVksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQzFDLGVBQWU7WUFDZixRQUFRLEVBQUUsQ0FBQyxNQUFBLE1BQUEsSUFBSSxDQUFDLGVBQWUsMENBQUUsUUFBUSxtQ0FBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDdEUsQ0FBQztJQUNKLENBQUM7SUFFRCw4QkFBOEI7SUFFOUI7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxRQUFrQjtRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELGNBQWMsQ0FBQyxFQUFVO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxZQUFZO1FBQ1YsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrQ0FBa0M7SUFFbEM7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLFFBQXNCO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxrQkFBa0IsQ0FBQyxFQUFVO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELDBEQUEwRDtJQUMxRCxnQkFBZ0I7UUFDZCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxZQUFZO1FBQ1YsZ0ZBQWdGO1FBQ2hGLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUMsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEQsT0FBTyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssc0JBQXNCO1FBQzVCLE1BQU0sU0FBUyxHQUFtQixFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RDLDJFQUEyRTtZQUMzRSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksZ0RBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFvQjs7UUFDNUIsSUFBSSxNQUFNLEdBQUcsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLE1BQU0sQ0FBQztRQUM3QixJQUFJLFNBQW9ELENBQUM7UUFFekQsbURBQW1EO1FBQ25ELElBQUksQ0FBQSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsU0FBUyxLQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN6QyxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUMzQixTQUFTLEdBQUcsVUFBVSxDQUNwQixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLDZCQUE2QixPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUNyRixPQUFPLENBQUMsU0FBUyxDQUNsQixDQUFDO1FBQ0osQ0FBQztRQUVELHlEQUF5RDtRQUN6RCxJQUFJLGNBQWMsR0FBRyxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsS0FBSyxDQUFDO1FBQ3BDLElBQUksY0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9ELGNBQWMsR0FBRyxJQUFBLGdDQUFhLEVBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7UUFFRCw4RkFBOEY7UUFDOUYsOEZBQThGO1FBQzlGLG9HQUFvRztRQUNwRyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQyxNQUFBLENBQUMsQ0FBQyxLQUFLLGlEQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEMsTUFBQSxDQUFDLENBQUMsS0FBSyxpREFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxHQUFHLEVBQUUsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksU0FBUyxLQUFLLFNBQVM7Z0JBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO0lBRXhCLFdBQVc7UUFDVCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBcUIsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDckQsSUFBSSxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLE1BQU0saUJBQWlCLEdBQXVCLEVBQUUsQ0FBQztRQUNqRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3RDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFXLENBQUM7SUFDdkQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjs7UUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSw4Q0FBb0IsQ0FFcEUsQ0FBQztRQUNkLE9BQU8sTUFBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsV0FBVyxFQUFFLG1DQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksOENBQW9CLENBRXBFLENBQUM7UUFDZCxPQUFPLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBOWJELDhDQThiQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTmFycmF0aXZlRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9OYXJyYXRpdmVGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4dHJhY3RvckVycm9yLFxuICB0eXBlIEZsb3dDaGFydCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTY29wZUZhY2FkZSB9IGZyb20gJy4uL3Njb3BlL1Njb3BlRmFjYWRlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVjb3JkZXIsIFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0IH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWNvcmRlclNuYXBzaG90LCB0eXBlIFJ1bnRpbWVTbmFwc2hvdCwgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUlucHV0IH0gZnJvbSAnLi92YWxpZGF0ZUlucHV0LmpzJztcblxuLyoqIERlZmF1bHQgc2NvcGUgZmFjdG9yeSDigJQgY3JlYXRlcyBhIHBsYWluIFNjb3BlRmFjYWRlIGZvciBlYWNoIHN0YWdlLiAqL1xuY29uc3QgZGVmYXVsdFNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5ID0gKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KSA9PlxuICBuZXcgU2NvcGVGYWNhZGUoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpO1xuXG4vKipcbiAqIE9wdGlvbnMgb2JqZWN0IGZvciBgRmxvd0NoYXJ0RXhlY3V0b3JgIOKAlCBwcmVmZXJyZWQgb3ZlciBwb3NpdGlvbmFsIHBhcmFtcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleCA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwge1xuICogICBzY29wZUZhY3Rvcnk6IG15RmFjdG9yeSxcbiAqICAgZW5yaWNoU25hcHNob3RzOiB0cnVlLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAqKlN5bmMgbm90ZSBmb3IgbWFpbnRhaW5lcnM6KiogRXZlcnkgZmllbGQgYWRkZWQgaGVyZSBtdXN0IGFsc28gYXBwZWFyIGluIHRoZVxuICogYGZsb3dDaGFydEFyZ3NgIHByaXZhdGUgZmllbGQgdHlwZSBhbmQgaW4gdGhlIGNvbnN0cnVjdG9yJ3Mgb3B0aW9ucy1yZXNvbHV0aW9uXG4gKiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2ggdGhhdCByZWFkcyBmcm9tIGBvcHRzYCkuIE1pc3NpbmcgYW55IG9uZSBvZiB0aGVcbiAqIHRocmVlIGNhdXNlcyBzaWxlbnQgb21pc3Npb24g4oCUIHRoZSBvcHRpb24gaXMgYWNjZXB0ZWQgYnV0IG5ldmVyIGFwcGxpZWQuXG4gKlxuICogKipUU2NvcGUgaW5mZXJlbmNlIG5vdGU6KiogV2hlbiB1c2luZyB0aGUgb3B0aW9ucy1vYmplY3QgZm9ybSB3aXRoIGEgY3VzdG9tIHNjb3BlLFxuICogVHlwZVNjcmlwdCBjYW5ub3QgaW5mZXIgYFRTY29wZWAgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QuIFBhc3MgdGhlIHR5cGVcbiAqIGV4cGxpY2l0bHk6IGBuZXcgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCwgTXlTY29wZT4oY2hhcnQsIHsgc2NvcGVGYWN0b3J5IH0pYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlID0gYW55PiB7XG4gIC8vIOKUgOKUgCBDb21tb24gb3B0aW9ucyAobW9zdCBjYWxsZXJzIG5lZWQgb25seSB0aGVzZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEN1c3RvbSBzY29wZSBmYWN0b3J5LiBEZWZhdWx0cyB0byBUeXBlZFNjb3BlIG9yIFNjb3BlRmFjYWRlIGF1dG8tZGV0ZWN0aW9uLiAqL1xuICBzY29wZUZhY3Rvcnk/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgLyoqXG4gICAqIEF0dGFjaCBhIHBlci1zdGFnZSBzY29wZSBzbmFwc2hvdCB0byBlYWNoIGV4dHJhY3RvciByZXN1bHQuIFdoZW4gYHRydWVgLCB0aGVcbiAgICogZXh0cmFjdGlvbiBjYWxsYmFjayByZWNlaXZlcyB0aGUgZnVsbCBzaGFyZWQgc3RhdGUgYXQgdGhlIHBvaW50IHRoYXQgc3RhZ2VcbiAgICogY29tbWl0dGVkIOKAlCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBtdWx0aS1zdGFnZSBzdGF0ZSB0cmFuc2l0aW9ucy4gRGVmYXVsdHMgdG9cbiAgICogYGZhbHNlYCAobm8gc2NvcGUgc25hcHNob3QgYXR0YWNoZWQpLiBDYW4gYWxzbyBiZSBzZXQgb24gdGhlIGNoYXJ0IHZpYVxuICAgKiBgZmxvd0NoYXJ0KC4uLikuZW5yaWNoU25hcHNob3RzKHRydWUpYC5cbiAgICovXG4gIGVucmljaFNuYXBzaG90cz86IGJvb2xlYW47XG5cbiAgLy8g4pSA4pSAIENvbnRleHQgb3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgcHJlLXBvcHVsYXRlZCBpbnRvIHRoZSBzaGFyZWQgY29udGV4dCBiZWZvcmUgKiplYWNoKiogc3RhZ2VcbiAgICogKHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UsIGFjdGluZyBhcyBiYXNlbGluZSBkZWZhdWx0cykuXG4gICAqL1xuICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gIC8qKlxuICAgKiBJbml0aWFsIGNvbnRleHQgdmFsdWVzIG1lcmdlZCBpbnRvIHRoZSBzaGFyZWQgY29udGV4dCAqKm9uY2UqKiBhdCBzdGFydHVwXG4gICAqIChhcHBsaWVkIGJlZm9yZSB0aGUgZmlyc3Qgc3RhZ2UsIG5vdCByZXBlYXRlZCBvbiBzdWJzZXF1ZW50IHN0YWdlcykuXG4gICAqIERpc3RpbmN0IGZyb20gYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgcmUtYXBwbGllZCBldmVyeSBzdGFnZS5cbiAgICovXG4gIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFJlYWQtb25seSBpbnB1dCBhY2Nlc3NpYmxlIHZpYSBgc2NvcGUuZ2V0QXJncygpYCDigJQgbmV2ZXIgdHJhY2tlZCBvciB3cml0dGVuLiAqL1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuXG4gIC8vIOKUgOKUgCBBZHZhbmNlZCAvIGVzY2FwZS1oYXRjaCBvcHRpb25zIChtb3N0IGNhbGxlcnMgZG8gbm90IG5lZWQgdGhlc2UpIOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDdXN0b20gZXJyb3IgY2xhc3NpZmllciBmb3IgdGhyb3R0bGluZyBkZXRlY3Rpb24uIFJldHVybiBgdHJ1ZWAgaWYgdGhlXG4gICAqIGVycm9yIHJlcHJlc2VudHMgYSByYXRlLWxpbWl0IG9yIGJhY2twcmVzc3VyZSBjb25kaXRpb24gKHRoZSBleGVjdXRvciB3aWxsXG4gICAqIHRyZWF0IGl0IGRpZmZlcmVudGx5IGZyb20gaGFyZCBmYWlsdXJlcykuIERlZmF1bHRzIHRvIG5vIHRocm90dGxpbmcgY2xhc3NpZmljYXRpb24uXG4gICAqL1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICAvKiogSGFuZGxlcnMgZm9yIHN0cmVhbWluZyBzdGFnZSBsaWZlY3ljbGUgZXZlbnRzIChzZWUgYGFkZFN0cmVhbWluZ0Z1bmN0aW9uYCkuICovXG4gIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gIC8qKiBTY29wZSBwcm90ZWN0aW9uIG1vZGUgZm9yIFR5cGVkU2NvcGUgZGlyZWN0LWFzc2lnbm1lbnQgZGV0ZWN0aW9uLiAqL1xuICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBwcml2YXRlIHRyYXZlcnNlcjogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgbmFycmF0aXZlRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIGNvbWJpbmVkUmVjb3JkZXI6IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmxvd1JlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzY29wZVJlY29yZGVyczogUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgLy8gU1lOQyBSRVFVSVJFRDogZXZlcnkgb3B0aW9uYWwgZmllbGQgaGVyZSBtdXN0IG1pcnJvciBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNcbiAgLy8gQU5EIGJlIGFzc2lnbmVkIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvbiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2gpLlxuICAvLyBBZGRpbmcgYSBmaWVsZCB0byBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGxhY2VzIGNhdXNlcyBzaWxlbnQgb21pc3Npb24uXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgIGVucmljaFNuYXBzaG90cz86IGJvb2xlYW47XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICAvLyBEZXRlY3Qgb3B0aW9ucy1vYmplY3QgZm9ybSB2cyBmYWN0b3J5IGZvcm1cbiAgICBsZXQgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IGluaXRpYWxDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCByZWFkT25seUNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHRocm90dGxpbmdFcnJvckNoZWNrZXI6ICgoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVucmljaFNuYXBzaG90czogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeU9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gMi1wYXJhbSBmb3JtOiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICAgIHNjb3BlRmFjdG9yeSA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChmYWN0b3J5T3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9wdGlvbnMgb2JqZWN0IGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGVucmljaFNuYXBzaG90cywgLi4uIH0pXG4gICAgICBjb25zdCBvcHRzID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICAgIHNjb3BlRmFjdG9yeSA9IG9wdHMuc2NvcGVGYWN0b3J5O1xuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgPSBvcHRzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0O1xuICAgICAgaW5pdGlhbENvbnRleHQgPSBvcHRzLmluaXRpYWxDb250ZXh0O1xuICAgICAgcmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyID0gb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyO1xuICAgICAgc3RyZWFtSGFuZGxlcnMgPSBvcHRzLnN0cmVhbUhhbmRsZXJzO1xuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSA9IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICAgIGVucmljaFNuYXBzaG90cyA9IG9wdHMuZW5yaWNoU25hcHNob3RzO1xuICAgIH1cbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MgPSB7XG4gICAgICBmbG93Q2hhcnQsXG4gICAgICBzY29wZUZhY3Rvcnk6IHNjb3BlRmFjdG9yeSA/PyBmbG93Q2hhcnQuc2NvcGVGYWN0b3J5ID8/IChkZWZhdWx0U2NvcGVGYWN0b3J5IGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+KSxcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgaW5pdGlhbENvbnRleHQsXG4gICAgICByZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgZW5yaWNoU25hcHNob3RzLFxuICAgIH07XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGU/OiB1bmtub3duLFxuICAgIGVudj86IGltcG9ydCgnLi4vZW5naW5lL3R5cGVzJykuRXhlY3V0aW9uRW52LFxuICAgIG1heERlcHRoPzogbnVtYmVyLFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgQ29tcG9zZWQgc2NvcGUgZmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDb2xsZWN0IGFsbCBzY29wZSBtb2RpZmllcnMgKHJlY29yZGVycywgcmVkYWN0aW9uKSBpbnRvIGEgc2luZ2xlIGxpc3QsXG4gICAgLy8gdGhlbiBjcmVhdGUgT05FIGZhY3RvcnkgdGhhdCBhcHBsaWVzIHRoZW0gaW4gYSBsb29wLiBSZXBsYWNlcyB0aGVcbiAgICAvLyBwcmV2aW91cyA0LWRlZXAgY2xvc3VyZSBuZXN0aW5nIHdpdGggYSBmbGF0LCBkZWJ1Z2dhYmxlIGNvbXBvc2l0aW9uLlxuXG4gICAgaWYgKG5hcnJhdGl2ZUZsYWcpIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IG5ldyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgIC8vIEJ1aWxkIG1vZGlmaWVyIGxpc3Qg4oCUIGVhY2ggbW9kaWZpZXIgcmVjZWl2ZXMgdGhlIHNjb3BlIGFmdGVyIGNyZWF0aW9uXG4gICAgdHlwZSBTY29wZU1vZGlmaWVyID0gKHNjb3BlOiBhbnkpID0+IHZvaWQ7XG4gICAgY29uc3QgbW9kaWZpZXJzOiBTY29wZU1vZGlmaWVyW10gPSBbXTtcblxuICAgIC8vIDEuIE5hcnJhdGl2ZSByZWNvcmRlciAoaWYgZW5hYmxlZClcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuY29tYmluZWRSZWNvcmRlcjtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFJlY29yZGVyID09PSAnZnVuY3Rpb24nKSBzY29wZS5hdHRhY2hSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiBVc2VyLXByb3ZpZGVkIHNjb3BlIHJlY29yZGVyc1xuICAgIGlmICh0aGlzLnNjb3BlUmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnM7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRlcnMpIHNjb3BlLmF0dGFjaFJlY29yZGVyKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWRhY3Rpb24gcG9saWN5IChjb25kaXRpb25hbCDigJQgb25seSB3aGVuIHBvbGljeSBpcyBzZXQpXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB0aGlzLnJlZGFjdGlvblBvbGljeTtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeShwb2xpY3kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIFByZS1wb3B1bGF0ZSBleGVjdXRvci1sZXZlbCBmaWVsZCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgICAvLyBzbyBnZXRSZWRhY3Rpb25SZXBvcnQoKSBpbmNsdWRlcyBmaWVsZC1sZXZlbCByZWRhY3Rpb25zLlxuICAgICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wb3NlOiBiYXNlIGZhY3RvcnkgKyBtb2RpZmllcnMgaW4gYSBzaW5nbGUgcGFzcy5cbiAgICAvLyBTaGFyZWQgcmVkYWN0ZWQga2V5cyBhcmUgQUxXQVlTIHdpcmVkIHVwICh1bmNvbmRpdGlvbmFsIOKAlCBlbnN1cmVzIGNyb3NzLXN0YWdlXG4gICAgLy8gcHJvcGFnYXRpb24gZXZlbiB3aXRob3V0IGEgcG9saWN5LCBiZWNhdXNlIHN0YWdlcyBjYW4gY2FsbCBzZXRWYWx1ZShrZXksIHZhbCwgdHJ1ZSlcbiAgICAvLyBmb3IgcGVyLWNhbGwgcmVkYWN0aW9uKS4gT3B0aW9uYWwgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHBvbGljeSkgYXJlIGluIHRoZSBsaXN0LlxuICAgIGNvbnN0IGJhc2VGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgY29uc3Qgc2hhcmVkUmVkYWN0ZWRLZXlzID0gdGhpcy5zaGFyZWRSZWRhY3RlZEtleXM7XG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93biwgZW52QXJnPzogYW55KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGJhc2VGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52QXJnKTtcbiAgICAgIC8vIEFsd2F5cyB3aXJlIHNoYXJlZCByZWRhY3Rpb24gc3RhdGVcbiAgICAgIGlmICh0eXBlb2YgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRSZWRhY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgbW9kaWZpZXJzXG4gICAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2RpZmllcnMpIG1vZChzY29wZSk7XG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgICBjb25zdCBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoZmMucm9vdC5uYW1lLCBmYy5yb290LmlkLCBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LCBhcmdzLmluaXRpYWxDb250ZXh0KTtcblxuICAgIHJldHVybiBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgcm9vdDogZmMucm9vdCxcbiAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICBleHRyYWN0b3I6IGZjLmV4dHJhY3RvcixcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IGFyZ3Muc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICAgIGVucmljaFNuYXBzaG90czogYXJncy5lbnJpY2hTbmFwc2hvdHMgPz8gZmMuZW5yaWNoU25hcHNob3RzLFxuICAgICAgbmFycmF0aXZlRW5hYmxlZDogbmFycmF0aXZlRmxhZyxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogZmMuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgbG9nZ2VyOiBmYy5sb2dnZXIgPz8gZGVmYXVsdExvZ2dlcixcbiAgICAgIHNpZ25hbCxcbiAgICAgIGV4ZWN1dGlvbkVudjogZW52LFxuICAgICAgZmxvd1JlY29yZGVyczogdGhpcy5idWlsZEZsb3dSZWNvcmRlcnNMaXN0KCksXG4gICAgICAuLi4obWF4RGVwdGggIT09IHVuZGVmaW5lZCAmJiB7IG1heERlcHRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKCk6IHZvaWQge1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkgZnJvbSB0aGVcbiAgICogbW9zdCByZWNlbnQgcnVuLiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5KSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnNba2V5XSA9IFsuLi5maWVsZHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVkYWN0ZWRLZXlzOiBbLi4udGhpcy5zaGFyZWRSZWRhY3RlZEtleXNdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLnJlZGFjdGlvblBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIAgUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgc2NvcGUgUmVjb3JkZXIgdG8gb2JzZXJ2ZSBkYXRhIG9wZXJhdGlvbnMgKHJlYWRzLCB3cml0ZXMsIGNvbW1pdHMpLlxuICAgKiBBdXRvbWF0aWNhbGx5IGF0dGFjaGVkIHRvIGV2ZXJ5IFNjb3BlRmFjYWRlIGNyZWF0ZWQgZHVyaW5nIHRyYXZlcnNhbC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgYXR0YWNoUmVjb3JkZXIocmVjb3JkZXI6IFJlY29yZGVyKTogdm9pZCB7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIHNjb3BlIFJlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRC4gKi9cbiAgZGV0YWNoUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBzY29wZSBSZWNvcmRlcnMuICovXG4gIGdldFJlY29yZGVycygpOiBSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVSZWNvcmRlcnNdO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEZsb3dSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLlxuICAgKiBBdXRvbWF0aWNhbGx5IGVuYWJsZXMgbmFycmF0aXZlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKSDigJQgcmVjb3JkZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHRyYXZlcnNlciBhdCBjcmVhdGlvbiB0aW1lLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmxvd1JlY29yZGVyc107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIG5hcnJhdGl2ZS5cbiAgICpcbiAgICogV2hlbiB1c2luZyBTY29wZUZhY2FkZS1iYXNlZCBzY29wZXMsIHJldHVybnMgYSBjb21iaW5lZCBuYXJyYXRpdmUgdGhhdFxuICAgKiBpbnRlcmxlYXZlcyBmbG93IGV2ZW50cyAoc3RhZ2VzLCBkZWNpc2lvbnMsIGZvcmtzKSB3aXRoIGRhdGEgb3BlcmF0aW9uc1xuICAgKiAocmVhZHMsIHdyaXRlcywgdXBkYXRlcykuIEZvciBwbGFpbiBzY29wZXMgd2l0aG91dCBhdHRhY2hSZWNvcmRlciBzdXBwb3J0LFxuICAgKiByZXR1cm5zIGZsb3ctb25seSBuYXJyYXRpdmUgc2VudGVuY2VzLlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICAvLyBDb21iaW5lZCByZWNvcmRlciBidWlsZHMgdGhlIG5hcnJhdGl2ZSBpbmxpbmUgZHVyaW5nIHRyYXZlcnNhbCDigJQganVzdCByZWFkIGl0XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRSZWNvcmRlci5nZXROYXJyYXRpdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc3RydWN0dXJlZCBuYXJyYXRpdmUgZW50cmllcyBmb3IgcHJvZ3JhbW1hdGljIGNvbnN1bXB0aW9uLlxuICAgKiBFYWNoIGVudHJ5IGhhcyBhIHR5cGUgKHN0YWdlLCBzdGVwLCBjb25kaXRpb24sIGZvcmssIGV0Yy4pLCB0ZXh0LCBhbmQgZGVwdGguXG4gICAqL1xuICBnZXROYXJyYXRpdmVFbnRyaWVzKCk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZWRSZWNvcmRlci5nZXRFbnRyaWVzKCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dTZW50ZW5jZXMgPSB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb21iaW5lZCBGbG93UmVjb3JkZXJzIGxpc3QuIFdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQsIGluY2x1ZGVzOlxuICAgKiAtIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgKGJ1aWxkcyBtZXJnZWQgZmxvdytkYXRhIG5hcnJhdGl2ZSBpbmxpbmUpXG4gICAqIC0gTmFycmF0aXZlRmxvd1JlY29yZGVyIChrZWVwcyBmbG93LW9ubHkgc2VudGVuY2VzIGZvciBnZXRGbG93TmFycmF0aXZlKCkpXG4gICAqIFBsdXMgYW55IHVzZXItYXR0YWNoZWQgcmVjb3JkZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEZsb3dSZWNvcmRlcnNMaXN0KCk6IEZsb3dSZWNvcmRlcltdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlcnM6IEZsb3dSZWNvcmRlcltdID0gW107XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmVjb3JkZXJzLnB1c2godGhpcy5jb21iaW5lZFJlY29yZGVyKTtcbiAgICAgIC8vIEtlZXAgdGhlIGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyIHNvIGdldEZsb3dOYXJyYXRpdmUoKSBzdGlsbCB3b3Jrc1xuICAgICAgcmVjb3JkZXJzLnB1c2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICB9XG4gICAgcmVjb3JkZXJzLnB1c2goLi4udGhpcy5mbG93UmVjb3JkZXJzKTtcbiAgICByZXR1cm4gcmVjb3JkZXJzLmxlbmd0aCA+IDAgPyByZWNvcmRlcnMgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmbG93LW9ubHkgbmFycmF0aXZlIHNlbnRlbmNlcyAod2l0aG91dCBkYXRhIG9wZXJhdGlvbnMpLlxuICAgKiBVc2UgdGhpcyB3aGVuIHlvdSBvbmx5IHdhbnQgY29udHJvbCBmbG93IGRlc2NyaXB0aW9ucy5cbiAgICpcbiAgICogU2VudGVuY2VzIGNvbWUgZnJvbSBgTmFycmF0aXZlRmxvd1JlY29yZGVyYCAoYSBkZWRpY2F0ZWQgZmxvdy1vbmx5IHJlY29yZGVyIGF1dG9tYXRpY2FsbHlcbiAgICogYXR0YWNoZWQgd2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCkuIEl0IGVtaXRzIGJvdGggYG9uU3RhZ2VFeGVjdXRlZGAgc2VudGVuY2VzIChvbmUgcGVyXG4gICAqIHN0YWdlKSBBTkQgYG9uTmV4dGAgdHJhbnNpdGlvbiBzZW50ZW5jZXMgKG9uZSBwZXIgc3RhZ2UtdG8tc3RhZ2UgdHJhbnNpdGlvbiksIHNvIGZvciBhXG4gICAqIGNoYXJ0IHdpdGggTiBzdGFnZXMgeW91IHdpbGwgdHlwaWNhbGx5IGdldCBtb3JlIGVudHJpZXMgaGVyZSB0aGFuIGZyb20gYGdldE5hcnJhdGl2ZSgpYC5cbiAgICovXG4gIGdldEZsb3dOYXJyYXRpdmUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgfVxuXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8VHJhdmVyc2FsUmVzdWx0PiB7XG4gICAgbGV0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBsZXQgdGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICAgIC8vIENyZWF0ZSBhbiBpbnRlcm5hbCBBYm9ydENvbnRyb2xsZXIgZm9yIHRpbWVvdXRNc1xuICAgIGlmIChvcHRpb25zPy50aW1lb3V0TXMgJiYgIXNpZ25hbCkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gY29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoYEV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHtvcHRpb25zLnRpbWVvdXRNc31tc2ApKSxcbiAgICAgICAgb3B0aW9ucy50aW1lb3V0TXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGlucHV0IGFnYWluc3QgaW5wdXRTY2hlbWEgaWYgYm90aCBhcmUgcHJlc2VudFxuICAgIGxldCB2YWxpZGF0ZWRJbnB1dCA9IG9wdGlvbnM/LmlucHV0O1xuICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICB2YWxpZGF0ZWRJbnB1dCA9IHZhbGlkYXRlSW5wdXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSwgdmFsaWRhdGVkSW5wdXQpO1xuICAgIH1cblxuICAgIC8vIFVzZXItYXR0YWNoZWQgcmVjb3JkZXJzIChmbG93UmVjb3JkZXJzICsgc2NvcGVSZWNvcmRlcnMpIGFyZSBjbGVhcmVkIHZpYSBjbGVhcigpIHRvIHByZXZlbnRcbiAgICAvLyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uLiBUaGUgY29tYmluZWRSZWNvcmRlciBpcyBOT1QgY2xlYXJlZCBoZXJlIOKAlCBjcmVhdGVUcmF2ZXJzZXIoKSBhbHdheXNcbiAgICAvLyBjcmVhdGVzIGEgZnJlc2ggQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciBpbnN0YW5jZSBvbiBlYWNoIHJ1biwgc28gc3RhbGUgc3RhdGUgaXMgbmV2ZXIgYW4gaXNzdWUuXG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykge1xuICAgICAgci5jbGVhcj8uKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKHNpZ25hbCwgdmFsaWRhdGVkSW5wdXQsIG9wdGlvbnM/LmVudiwgb3B0aW9ucz8ubWF4RGVwdGgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGltZW91dElkICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIGdldFNuYXBzaG90KCk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdCgpIGFzIFJ1bnRpbWVTbmFwc2hvdDtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGlmIChzZlJlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzID0gT2JqZWN0LmZyb21FbnRyaWVzKHNmUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBzbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKVxuICAgIGNvbnN0IHJlY29yZGVyU25hcHNob3RzOiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIGRhdGEgfSA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHsgaWQ6IHIuaWQsIG5hbWUsIGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBkYXRhIH0gPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgcmVjb3JkZXJTbmFwc2hvdHMucHVzaCh7IGlkOiByLmlkLCBuYW1lLCBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkZXJTbmFwc2hvdHMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdCA9IHVua25vd24+KCk6IE1hcDxzdHJpbmcsIFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0RXh0cmFjdGVkUmVzdWx0czxUUmVzdWx0PigpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRFeHRyYWN0b3JFcnJvcnMoKTogRXh0cmFjdG9yRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RvckVycm9ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
|
|
440
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFHSCxtR0FBNkY7QUFDN0YsMkZBQXFGO0FBR3JGLG1HQUE2RjtBQUU3RixxRkFBK0U7QUFDL0UsaURBVzRCO0FBRTVCLDREQUFzRDtBQUV0RCwrREFBc0c7QUFDdEcseURBQW1EO0FBRW5ELDBFQUEwRTtBQUMxRSxNQUFNLG1CQUFtQixHQUFpQixDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQzFFLElBQUksNEJBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQWlFakQsTUFBYSxpQkFBaUI7SUEwQjVCOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILFlBQ0UsU0FBa0MsRUFDbEMsZ0JBQTBFOztRQTFDcEUscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBR3pCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxtQkFBYyxHQUFlLEVBQUUsQ0FBQztRQUVoQyx1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3ZDLDhCQUF5QixHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBcUNqRSw2Q0FBNkM7UUFDN0MsSUFBSSxZQUE4QyxDQUFDO1FBQ25ELElBQUksdUJBQWdDLENBQUM7UUFDckMsSUFBSSxjQUF1QixDQUFDO1FBQzVCLElBQUksZUFBd0IsQ0FBQztRQUM3QixJQUFJLHNCQUFpRSxDQUFDO1FBQ3RFLElBQUksY0FBMEMsQ0FBQztRQUMvQyxJQUFJLG1CQUFvRCxDQUFDO1FBQ3pELElBQUksZUFBb0MsQ0FBQztRQUV6QyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxFQUFFLENBQUM7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QyxtQkFBbUIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixFQUFXLENBQUM7SUFDdkQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjs7UUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSw4Q0FBb0IsQ0FFcEUsQ0FBQztRQUNkLE9BQU8sTUFBQSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsV0FBVyxFQUFFLG1DQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksOENBQW9CLENBRXBFLENBQUM7UUFDZCxPQUFPLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBNWRELDhDQTRkQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL05hcnJhdGl2ZUZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRXh0cmFjdG9yRXJyb3IsXG4gIHR5cGUgRmxvd0NoYXJ0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3RyZWFtSGFuZGxlcnMsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgdHlwZSBUcmF2ZXJzYWxSZXN1bHQsXG4gIGRlZmF1bHRMb2dnZXIsXG59IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB7IFNjb3BlRmFjYWRlIH0gZnJvbSAnLi4vc2NvcGUvU2NvcGVGYWNhZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRlciwgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlY29yZGVyU25hcHNob3QsIHR5cGUgUnVudGltZVNuYXBzaG90LCBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5wdXQgfSBmcm9tICcuL3ZhbGlkYXRlSW5wdXQuanMnO1xuXG4vKiogRGVmYXVsdCBzY29wZSBmYWN0b3J5IOKAlCBjcmVhdGVzIGEgcGxhaW4gU2NvcGVGYWNhZGUgZm9yIGVhY2ggc3RhZ2UuICovXG5jb25zdCBkZWZhdWx0U2NvcGVGYWN0b3J5OiBTY29wZUZhY3RvcnkgPSAoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpID0+XG4gIG5ldyBTY29wZUZhY2FkZShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudik7XG5cbi8qKlxuICogT3B0aW9ucyBvYmplY3QgZm9yIGBGbG93Q2hhcnRFeGVjdXRvcmAg4oCUIHByZWZlcnJlZCBvdmVyIHBvc2l0aW9uYWwgcGFyYW1zLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGV4ID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7XG4gKiAgIHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LFxuICogICBlbnJpY2hTbmFwc2hvdHM6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICoqU3luYyBub3RlIGZvciBtYWludGFpbmVyczoqKiBFdmVyeSBmaWVsZCBhZGRlZCBoZXJlIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlXG4gKiBgZmxvd0NoYXJ0QXJnc2AgcHJpdmF0ZSBmaWVsZCB0eXBlIGFuZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb25cbiAqIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCB0aGF0IHJlYWRzIGZyb20gYG9wdHNgKS4gTWlzc2luZyBhbnkgb25lIG9mIHRoZVxuICogdGhyZWUgY2F1c2VzIHNpbGVudCBvbWlzc2lvbiDigJQgdGhlIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgbmV2ZXIgYXBwbGllZC5cbiAqXG4gKiAqKlRTY29wZSBpbmZlcmVuY2Ugbm90ZToqKiBXaGVuIHVzaW5nIHRoZSBvcHRpb25zLW9iamVjdCBmb3JtIHdpdGggYSBjdXN0b20gc2NvcGUsXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBpbmZlciBgVFNjb3BlYCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdC4gUGFzcyB0aGUgdHlwZVxuICogZXhwbGljaXRseTogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0LCBNeVNjb3BlPihjaGFydCwgeyBzY29wZUZhY3RvcnkgfSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGUgPSBhbnk+IHtcbiAgLy8g4pSA4pSAIENvbW1vbiBvcHRpb25zIChtb3N0IGNhbGxlcnMgbmVlZCBvbmx5IHRoZXNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VzdG9tIHNjb3BlIGZhY3RvcnkuIERlZmF1bHRzIHRvIFR5cGVkU2NvcGUgb3IgU2NvcGVGYWNhZGUgYXV0by1kZXRlY3Rpb24uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICAvKipcbiAgICogQXR0YWNoIGEgcGVyLXN0YWdlIHNjb3BlIHNuYXBzaG90IHRvIGVhY2ggZXh0cmFjdG9yIHJlc3VsdC4gV2hlbiBgdHJ1ZWAsIHRoZVxuICAgKiBleHRyYWN0aW9uIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmdWxsIHNoYXJlZCBzdGF0ZSBhdCB0aGUgcG9pbnQgdGhhdCBzdGFnZVxuICAgKiBjb21taXR0ZWQg4oCUIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG11bHRpLXN0YWdlIHN0YXRlIHRyYW5zaXRpb25zLiBEZWZhdWx0cyB0b1xuICAgKiBgZmFsc2VgIChubyBzY29wZSBzbmFwc2hvdCBhdHRhY2hlZCkuIENhbiBhbHNvIGJlIHNldCBvbiB0aGUgY2hhcnQgdmlhXG4gICAqIGBmbG93Q2hhcnQoLi4uKS5lbnJpY2hTbmFwc2hvdHModHJ1ZSlgLlxuICAgKi9cbiAgZW5yaWNoU25hcHNob3RzPzogYm9vbGVhbjtcblxuICAvLyDilIDilIAgQ29udGV4dCBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBwcmUtcG9wdWxhdGVkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0IGJlZm9yZSAqKmVhY2gqKiBzdGFnZVxuICAgKiAocmUtYXBwbGllZCBldmVyeSBzdGFnZSwgYWN0aW5nIGFzIGJhc2VsaW5lIGRlZmF1bHRzKS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEluaXRpYWwgY29udGV4dCB2YWx1ZXMgbWVyZ2VkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0ICoqb25jZSoqIGF0IHN0YXJ0dXBcbiAgICogKGFwcGxpZWQgYmVmb3JlIHRoZSBmaXJzdCBzdGFnZSwgbm90IHJlcGVhdGVkIG9uIHN1YnNlcXVlbnQgc3RhZ2VzKS5cbiAgICogRGlzdGluY3QgZnJvbSBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyByZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLlxuICAgKi9cbiAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAvKiogUmVhZC1vbmx5IGlucHV0IGFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRBcmdzKClgIOKAlCBuZXZlciB0cmFja2VkIG9yIHdyaXR0ZW4uICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG5cbiAgLy8g4pSA4pSAIEFkdmFuY2VkIC8gZXNjYXBlLWhhdGNoIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBkbyBub3QgbmVlZCB0aGVzZSkg4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBjbGFzc2lmaWVyIGZvciB0aHJvdHRsaW5nIGRldGVjdGlvbi4gUmV0dXJuIGB0cnVlYCBpZiB0aGVcbiAgICogZXJyb3IgcmVwcmVzZW50cyBhIHJhdGUtbGltaXQgb3IgYmFja3ByZXNzdXJlIGNvbmRpdGlvbiAodGhlIGV4ZWN1dG9yIHdpbGxcbiAgICogdHJlYXQgaXQgZGlmZmVyZW50bHkgZnJvbSBoYXJkIGZhaWx1cmVzKS4gRGVmYXVsdHMgdG8gbm8gdGhyb3R0bGluZyBjbGFzc2lmaWNhdGlvbi5cbiAgICovXG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIC8qKiBIYW5kbGVycyBmb3Igc3RyZWFtaW5nIHN0YWdlIGxpZmVjeWNsZSBldmVudHMgKHNlZSBgYWRkU3RyZWFtaW5nRnVuY3Rpb25gKS4gKi9cbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgLyoqIFNjb3BlIHByb3RlY3Rpb24gbW9kZSBmb3IgVHlwZWRTY29wZSBkaXJlY3QtYXNzaWdubWVudCBkZXRlY3Rpb24uICovXG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVFbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbmFycmF0aXZlT3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zO1xuICBwcml2YXRlIGNvbWJpbmVkUmVjb3JkZXI6IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmxvd1JlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzY29wZVJlY29yZGVyczogUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgLy8gU1lOQyBSRVFVSVJFRDogZXZlcnkgb3B0aW9uYWwgZmllbGQgaGVyZSBtdXN0IG1pcnJvciBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNcbiAgLy8gQU5EIGJlIGFzc2lnbmVkIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvbiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2gpLlxuICAvLyBBZGRpbmcgYSBmaWVsZCB0byBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGxhY2VzIGNhdXNlcyBzaWxlbnQgb21pc3Npb24uXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgIGVucmljaFNuYXBzaG90cz86IGJvb2xlYW47XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICAvLyBEZXRlY3Qgb3B0aW9ucy1vYmplY3QgZm9ybSB2cyBmYWN0b3J5IGZvcm1cbiAgICBsZXQgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IGluaXRpYWxDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCByZWFkT25seUNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHRocm90dGxpbmdFcnJvckNoZWNrZXI6ICgoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVucmljaFNuYXBzaG90czogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeU9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gMi1wYXJhbSBmb3JtOiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICAgIHNjb3BlRmFjdG9yeSA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChmYWN0b3J5T3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9wdGlvbnMgb2JqZWN0IGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGVucmljaFNuYXBzaG90cywgLi4uIH0pXG4gICAgICBjb25zdCBvcHRzID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICAgIHNjb3BlRmFjdG9yeSA9IG9wdHMuc2NvcGVGYWN0b3J5O1xuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgPSBvcHRzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0O1xuICAgICAgaW5pdGlhbENvbnRleHQgPSBvcHRzLmluaXRpYWxDb250ZXh0O1xuICAgICAgcmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyID0gb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyO1xuICAgICAgc3RyZWFtSGFuZGxlcnMgPSBvcHRzLnN0cmVhbUhhbmRsZXJzO1xuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSA9IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICAgIGVucmljaFNuYXBzaG90cyA9IG9wdHMuZW5yaWNoU25hcHNob3RzO1xuICAgIH1cbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MgPSB7XG4gICAgICBmbG93Q2hhcnQsXG4gICAgICBzY29wZUZhY3Rvcnk6IHNjb3BlRmFjdG9yeSA/PyBmbG93Q2hhcnQuc2NvcGVGYWN0b3J5ID8/IChkZWZhdWx0U2NvcGVGYWN0b3J5IGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+KSxcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgaW5pdGlhbENvbnRleHQsXG4gICAgICByZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgZW5yaWNoU25hcHNob3RzLFxuICAgIH07XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGU/OiB1bmtub3duLFxuICAgIGVudj86IGltcG9ydCgnLi4vZW5naW5lL3R5cGVzJykuRXhlY3V0aW9uRW52LFxuICAgIG1heERlcHRoPzogbnVtYmVyLFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgQ29tcG9zZWQgc2NvcGUgZmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDb2xsZWN0IGFsbCBzY29wZSBtb2RpZmllcnMgKHJlY29yZGVycywgcmVkYWN0aW9uKSBpbnRvIGEgc2luZ2xlIGxpc3QsXG4gICAgLy8gdGhlbiBjcmVhdGUgT05FIGZhY3RvcnkgdGhhdCBhcHBsaWVzIHRoZW0gaW4gYSBsb29wLiBSZXBsYWNlcyB0aGVcbiAgICAvLyBwcmV2aW91cyA0LWRlZXAgY2xvc3VyZSBuZXN0aW5nIHdpdGggYSBmbGF0LCBkZWJ1Z2dhYmxlIGNvbXBvc2l0aW9uLlxuXG4gICAgaWYgKG5hcnJhdGl2ZUZsYWcpIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IG5ldyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyKHRoaXMubmFycmF0aXZlT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgIC8vIEJ1aWxkIG1vZGlmaWVyIGxpc3Qg4oCUIGVhY2ggbW9kaWZpZXIgcmVjZWl2ZXMgdGhlIHNjb3BlIGFmdGVyIGNyZWF0aW9uXG4gICAgdHlwZSBTY29wZU1vZGlmaWVyID0gKHNjb3BlOiBhbnkpID0+IHZvaWQ7XG4gICAgY29uc3QgbW9kaWZpZXJzOiBTY29wZU1vZGlmaWVyW10gPSBbXTtcblxuICAgIC8vIDEuIE5hcnJhdGl2ZSByZWNvcmRlciAoaWYgZW5hYmxlZClcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuY29tYmluZWRSZWNvcmRlcjtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFJlY29yZGVyID09PSAnZnVuY3Rpb24nKSBzY29wZS5hdHRhY2hSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiBVc2VyLXByb3ZpZGVkIHNjb3BlIHJlY29yZGVyc1xuICAgIGlmICh0aGlzLnNjb3BlUmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnM7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRlcnMpIHNjb3BlLmF0dGFjaFJlY29yZGVyKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWRhY3Rpb24gcG9saWN5IChjb25kaXRpb25hbCDigJQgb25seSB3aGVuIHBvbGljeSBpcyBzZXQpXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB0aGlzLnJlZGFjdGlvblBvbGljeTtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeShwb2xpY3kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIFByZS1wb3B1bGF0ZSBleGVjdXRvci1sZXZlbCBmaWVsZCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgICAvLyBzbyBnZXRSZWRhY3Rpb25SZXBvcnQoKSBpbmNsdWRlcyBmaWVsZC1sZXZlbCByZWRhY3Rpb25zLlxuICAgICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wb3NlOiBiYXNlIGZhY3RvcnkgKyBtb2RpZmllcnMgaW4gYSBzaW5nbGUgcGFzcy5cbiAgICAvLyBTaGFyZWQgcmVkYWN0ZWQga2V5cyBhcmUgQUxXQVlTIHdpcmVkIHVwICh1bmNvbmRpdGlvbmFsIOKAlCBlbnN1cmVzIGNyb3NzLXN0YWdlXG4gICAgLy8gcHJvcGFnYXRpb24gZXZlbiB3aXRob3V0IGEgcG9saWN5LCBiZWNhdXNlIHN0YWdlcyBjYW4gY2FsbCBzZXRWYWx1ZShrZXksIHZhbCwgdHJ1ZSlcbiAgICAvLyBmb3IgcGVyLWNhbGwgcmVkYWN0aW9uKS4gT3B0aW9uYWwgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHBvbGljeSkgYXJlIGluIHRoZSBsaXN0LlxuICAgIGNvbnN0IGJhc2VGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgY29uc3Qgc2hhcmVkUmVkYWN0ZWRLZXlzID0gdGhpcy5zaGFyZWRSZWRhY3RlZEtleXM7XG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93biwgZW52QXJnPzogYW55KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGJhc2VGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52QXJnKTtcbiAgICAgIC8vIEFsd2F5cyB3aXJlIHNoYXJlZCByZWRhY3Rpb24gc3RhdGVcbiAgICAgIGlmICh0eXBlb2YgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRSZWRhY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgbW9kaWZpZXJzXG4gICAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2RpZmllcnMpIG1vZChzY29wZSk7XG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgICBjb25zdCBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoZmMucm9vdC5uYW1lLCBmYy5yb290LmlkLCBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LCBhcmdzLmluaXRpYWxDb250ZXh0KTtcblxuICAgIHJldHVybiBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgcm9vdDogZmMucm9vdCxcbiAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICBleHRyYWN0b3I6IGZjLmV4dHJhY3RvcixcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IGFyZ3Muc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICAgIGVucmljaFNuYXBzaG90czogYXJncy5lbnJpY2hTbmFwc2hvdHMgPz8gZmMuZW5yaWNoU25hcHNob3RzLFxuICAgICAgbmFycmF0aXZlRW5hYmxlZDogbmFycmF0aXZlRmxhZyxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogZmMuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgbG9nZ2VyOiBmYy5sb2dnZXIgPz8gZGVmYXVsdExvZ2dlcixcbiAgICAgIHNpZ25hbCxcbiAgICAgIGV4ZWN1dGlvbkVudjogZW52LFxuICAgICAgZmxvd1JlY29yZGVyczogdGhpcy5idWlsZEZsb3dSZWNvcmRlcnNMaXN0KCksXG4gICAgICAuLi4obWF4RGVwdGggIT09IHVuZGVmaW5lZCAmJiB7IG1heERlcHRoIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKG9wdGlvbnMpIHRoaXMubmFycmF0aXZlT3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkgZnJvbSB0aGVcbiAgICogbW9zdCByZWNlbnQgcnVuLiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5KSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnNba2V5XSA9IFsuLi5maWVsZHNdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVkYWN0ZWRLZXlzOiBbLi4udGhpcy5zaGFyZWRSZWRhY3RlZEtleXNdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLnJlZGFjdGlvblBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIAgUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgc2NvcGUgUmVjb3JkZXIgdG8gb2JzZXJ2ZSBkYXRhIG9wZXJhdGlvbnMgKHJlYWRzLCB3cml0ZXMsIGNvbW1pdHMpLlxuICAgKiBBdXRvbWF0aWNhbGx5IGF0dGFjaGVkIHRvIGV2ZXJ5IFNjb3BlRmFjYWRlIGNyZWF0ZWQgZHVyaW5nIHRyYXZlcnNhbC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgSUQ6KiogSWYgYSByZWNvcmRlciB3aXRoIHRoZSBzYW1lIGBpZGAgaXMgYWxyZWFkeSBhdHRhY2hlZCxcbiAgICogaXQgaXMgcmVwbGFjZWQgKG5vdCBkdXBsaWNhdGVkKS4gVGhpcyBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcgd2hlbiBib3RoXG4gICAqIGEgZnJhbWV3b3JrIGFuZCB0aGUgdXNlciBhdHRhY2ggdGhlIHNhbWUgcmVjb3JkZXIgdHlwZS5cbiAgICpcbiAgICogQnVpbHQtaW4gcmVjb3JkZXJzIHVzZSBhdXRvLWluY3JlbWVudCBJRHMgKGBtZXRyaWNzLTFgLCBgZGVidWctMWAsIC4uLikgYnlcbiAgICogZGVmYXVsdCwgc28gbXVsdGlwbGUgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3MgY29leGlzdC4gVG8gb3ZlcnJpZGVcbiAgICogYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIsIHBhc3MgdGhlIHNhbWUgd2VsbC1rbm93biBJRC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBNdWx0aXBsZSByZWNvcmRlcnMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyDigJQgZWFjaCBnZXRzIGEgdW5pcXVlIElEXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcigpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IERlYnVnUmVjb3JkZXIoeyB2ZXJib3NpdHk6ICdtaW5pbWFsJyB9KSk7XG4gICAqXG4gICAqIC8vIE92ZXJyaWRlIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyIGJ5IHBhc3NpbmcgaXRzIHdlbGwta25vd24gSURcbiAgICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdtZXRyaWNzJykpO1xuICAgKlxuICAgKiAvLyBBdHRhY2hpbmcgdHdpY2Ugd2l0aCBzYW1lIElEIHJlcGxhY2VzIChubyBkb3VibGUtY291bnRpbmcpXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpOyAvLyByZXBsYWNlcyBwcmV2aW91c1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaFJlY29yZGVyKHJlY29yZGVyOiBSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIHNjb3BlIFJlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRC4gKi9cbiAgZGV0YWNoUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBzY29wZSBSZWNvcmRlcnMuICovXG4gIGdldFJlY29yZGVycygpOiBSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVSZWNvcmRlcnNdO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEZsb3dSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLlxuICAgKiBBdXRvbWF0aWNhbGx5IGVuYWJsZXMgbmFycmF0aXZlIGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKSDigJQgcmVjb3JkZXJzIGFyZSBwYXNzZWQgdG8gdGhlIHRyYXZlcnNlciBhdCBjcmVhdGlvbiB0aW1lLlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgSUQ6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqL1xuICBhdHRhY2hGbG93UmVjb3JkZXIocmVjb3JkZXI6IEZsb3dSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuZmxvd1JlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgRmxvd1JlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRC4gKi9cbiAgZGV0YWNoRmxvd1JlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSBpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMuICovXG4gIGdldEZsb3dSZWNvcmRlcnMoKTogRmxvd1JlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5mbG93UmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGVjdXRpb24gbmFycmF0aXZlLlxuICAgKlxuICAgKiBXaGVuIHVzaW5nIFNjb3BlRmFjYWRlLWJhc2VkIHNjb3BlcywgcmV0dXJucyBhIGNvbWJpbmVkIG5hcnJhdGl2ZSB0aGF0XG4gICAqIGludGVybGVhdmVzIGZsb3cgZXZlbnRzIChzdGFnZXMsIGRlY2lzaW9ucywgZm9ya3MpIHdpdGggZGF0YSBvcGVyYXRpb25zXG4gICAqIChyZWFkcywgd3JpdGVzLCB1cGRhdGVzKS4gRm9yIHBsYWluIHNjb3BlcyB3aXRob3V0IGF0dGFjaFJlY29yZGVyIHN1cHBvcnQsXG4gICAqIHJldHVybnMgZmxvdy1vbmx5IG5hcnJhdGl2ZSBzZW50ZW5jZXMuXG4gICAqL1xuICBnZXROYXJyYXRpdmUoKTogc3RyaW5nW10ge1xuICAgIC8vIENvbWJpbmVkIHJlY29yZGVyIGJ1aWxkcyB0aGUgbmFycmF0aXZlIGlubGluZSBkdXJpbmcgdHJhdmVyc2FsIOKAlCBqdXN0IHJlYWQgaXRcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZFJlY29yZGVyLmdldE5hcnJhdGl2ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIGZvciBwcm9ncmFtbWF0aWMgY29uc3VtcHRpb24uXG4gICAqIEVhY2ggZW50cnkgaGFzIGEgdHlwZSAoc3RhZ2UsIHN0ZXAsIGNvbmRpdGlvbiwgZm9yaywgZXRjLiksIHRleHQsIGFuZCBkZXB0aC5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZFJlY29yZGVyLmdldEVudHJpZXMoKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1NlbnRlbmNlcyA9IHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICAgIHJldHVybiBmbG93U2VudGVuY2VzLm1hcCgodGV4dCkgPT4gKHsgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCwgdGV4dCwgZGVwdGg6IDAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbWJpbmVkIEZsb3dSZWNvcmRlcnMgbGlzdC4gV2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCwgaW5jbHVkZXM6XG4gICAqIC0gQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciAoYnVpbGRzIG1lcmdlZCBmbG93K2RhdGEgbmFycmF0aXZlIGlubGluZSlcbiAgICogLSBOYXJyYXRpdmVGbG93UmVjb3JkZXIgKGtlZXBzIGZsb3ctb25seSBzZW50ZW5jZXMgZm9yIGdldEZsb3dOYXJyYXRpdmUoKSlcbiAgICogUGx1cyBhbnkgdXNlci1hdHRhY2hlZCByZWNvcmRlcnMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKTogRmxvd1JlY29yZGVyW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZWNvcmRlcnMucHVzaCh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpO1xuICAgICAgLy8gS2VlcCB0aGUgZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgc28gZ2V0Rmxvd05hcnJhdGl2ZSgpIHN0aWxsIHdvcmtzXG4gICAgICByZWNvcmRlcnMucHVzaChuZXcgTmFycmF0aXZlRmxvd1JlY29yZGVyKCkpO1xuICAgIH1cbiAgICByZWNvcmRlcnMucHVzaCguLi50aGlzLmZsb3dSZWNvcmRlcnMpO1xuICAgIHJldHVybiByZWNvcmRlcnMubGVuZ3RoID4gMCA/IHJlY29yZGVycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZsb3ctb25seSBuYXJyYXRpdmUgc2VudGVuY2VzICh3aXRob3V0IGRhdGEgb3BlcmF0aW9ucykuXG4gICAqIFVzZSB0aGlzIHdoZW4geW91IG9ubHkgd2FudCBjb250cm9sIGZsb3cgZGVzY3JpcHRpb25zLlxuICAgKlxuICAgKiBTZW50ZW5jZXMgY29tZSBmcm9tIGBOYXJyYXRpdmVGbG93UmVjb3JkZXJgIChhIGRlZGljYXRlZCBmbG93LW9ubHkgcmVjb3JkZXIgYXV0b21hdGljYWxseVxuICAgKiBhdHRhY2hlZCB3aGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkKS4gSXQgZW1pdHMgYm90aCBgb25TdGFnZUV4ZWN1dGVkYCBzZW50ZW5jZXMgKG9uZSBwZXJcbiAgICogc3RhZ2UpIEFORCBgb25OZXh0YCB0cmFuc2l0aW9uIHNlbnRlbmNlcyAob25lIHBlciBzdGFnZS10by1zdGFnZSB0cmFuc2l0aW9uKSwgc28gZm9yIGFcbiAgICogY2hhcnQgd2l0aCBOIHN0YWdlcyB5b3Ugd2lsbCB0eXBpY2FsbHkgZ2V0IG1vcmUgZW50cmllcyBoZXJlIHRoYW4gZnJvbSBgZ2V0TmFycmF0aXZlKClgLlxuICAgKi9cbiAgZ2V0Rmxvd05hcnJhdGl2ZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxUcmF2ZXJzYWxSZXN1bHQ+IHtcbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50XG4gICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gVXNlci1hdHRhY2hlZCByZWNvcmRlcnMgKGZsb3dSZWNvcmRlcnMgKyBzY29wZVJlY29yZGVycykgYXJlIGNsZWFyZWQgdmlhIGNsZWFyKCkgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb24uIFRoZSBjb21iaW5lZFJlY29yZGVyIGlzIE5PVCBjbGVhcmVkIGhlcmUg4oCUIGNyZWF0ZVRyYXZlcnNlcigpIGFsd2F5c1xuICAgIC8vIGNyZWF0ZXMgYSBmcmVzaCBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGluc3RhbmNlIG9uIGVhY2ggcnVuLCBzbyBzdGFsZSBzdGF0ZSBpcyBuZXZlciBhbiBpc3N1ZS5cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cblxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoc2lnbmFsLCB2YWxpZGF0ZWRJbnB1dCwgb3B0aW9ucz8uZW52LCBvcHRpb25zPy5tYXhEZXB0aCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludHJvc3BlY3Rpb24g4pSA4pSA4pSAXG5cbiAgZ2V0U25hcHNob3QoKTogUnVudGltZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KCkgYXMgUnVudGltZVNuYXBzaG90O1xuICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgaWYgKHNmUmVzdWx0cy5zaXplID4gMCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMgPSBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IHNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpXG4gICAgY29uc3QgcmVjb3JkZXJTbmFwc2hvdHM6IFJlY29yZGVyU25hcHNob3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSB7XG4gICAgICBpZiAoci50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgZGF0YSB9ID0gci50b1NuYXBzaG90KCk7XG4gICAgICAgIHJlY29yZGVyU25hcHNob3RzLnB1c2goeyBpZDogci5pZCwgbmFtZSwgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCB7IG5hbWUsIGRhdGEgfSA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHsgaWQ6IHIuaWQsIG5hbWUsIGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5yZWNvcmRlcnMgPSByZWNvcmRlclNuYXBzaG90cztcbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy50cmF2ZXJzZXIuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0QnJhbmNoSWRzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRCcmFuY2hJZHMoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVJvb3QoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lU3RydWN0dXJlKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0RXh0cmFjdGVkUmVzdWx0czxUUmVzdWx0ID0gdW5rbm93bj4oKTogTWFwPHN0cmluZywgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRFeHRyYWN0ZWRSZXN1bHRzPFRSZXN1bHQ+KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEV4dHJhY3RvckVycm9ycygpOiBFeHRyYWN0b3JFcnJvcltdIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0RXh0cmFjdG9yRXJyb3JzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViZmxvdyBtYW5pZmVzdCBmcm9tIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyLlxuICAgKiBSZXR1cm5zIGVtcHR5IGFycmF5IGlmIG5vIE1hbmlmZXN0Rmxvd1JlY29yZGVyIGlzIGF0dGFjaGVkLlxuICAgKi9cbiAgZ2V0U3ViZmxvd01hbmlmZXN0KCk6IE1hbmlmZXN0RW50cnlbXSB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRNYW5pZmVzdCgpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bGwgc3BlYyBmb3IgYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIHN1YmZsb3cuXG4gICAqIFJlcXVpcmVzIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyIHRoYXQgb2JzZXJ2ZWQgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGdldFN1YmZsb3dTcGVjKHN1YmZsb3dJZDogc3RyaW5nKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cbiJdfQ==
|