@workflow/core 5.0.0-beta.47 → 5.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +13 -3
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +16 -1
- package/dist/private.d.ts +2 -4
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +1 -1
- package/dist/runtime/constants.d.ts +9 -7
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +10 -8
- package/dist/runtime/helpers.d.ts +13 -0
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +14 -1
- package/dist/runtime/quickjs-serde.d.ts.map +1 -1
- package/dist/runtime/quickjs-serde.js +62 -1
- package/dist/runtime/run.d.ts +42 -0
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +102 -17
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +8 -4
- package/dist/runtime/start.d.ts +31 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +38 -6
- package/dist/runtime/suspension-handler.d.ts +54 -1
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +83 -20
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +174 -61
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -1
- package/dist/serialization/reducers/common-vm.js +38 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +26 -2
- package/dist/serialization/types.d.ts +7 -0
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +1 -1
- package/dist/serialization.d.ts +46 -2
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +249 -75
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +3 -6
- package/dist/workflow.js +6 -6
- package/docs/foundations/streaming.mdx +28 -0
- package/docs/how-it-works/understanding-directives.mdx +1 -1
- package/package.json +10 -10
package/dist/runtime/helpers.js
CHANGED
|
@@ -461,6 +461,19 @@ export async function loadWorkflowRunEvents(runId, afterCursor) {
|
|
|
461
461
|
return { events: loadedEvents, cursor };
|
|
462
462
|
});
|
|
463
463
|
}
|
|
464
|
+
/**
|
|
465
|
+
* Extend a loaded log with a page that continues it — a listed page, or the
|
|
466
|
+
* inline delta a write handed back — and move its read position with it.
|
|
467
|
+
*
|
|
468
|
+
* The cursor is only advanced when the page carries one, so a source with no
|
|
469
|
+
* position of its own (a skipped-slot report) cannot walk the read position
|
|
470
|
+
* past events it did not carry. Appending does not re-sort; see
|
|
471
|
+
* {@link appendUniqueEvents} for why receipt order is the order to keep.
|
|
472
|
+
*/
|
|
473
|
+
export function appendEventLog(log, appended) {
|
|
474
|
+
appendUniqueEvents(log.events, appended.events);
|
|
475
|
+
log.cursor = appended.cursor ?? log.cursor;
|
|
476
|
+
}
|
|
464
477
|
/**
|
|
465
478
|
* Whether a replay refuses to run over a log with a hole in it (see
|
|
466
479
|
* {@link findEventSlotGap}). **On by default**; set
|
|
@@ -882,4 +895,4 @@ export function memoizeEncryptionKey(world, runOrId) {
|
|
|
882
895
|
return cached;
|
|
883
896
|
};
|
|
884
897
|
}
|
|
885
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFXMUIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxJQUFJLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCx3REFBd0Q7QUFDeEQsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUM7QUFFNUM7Ozs7R0FJRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsc0JBQXNCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsWUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxD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QyxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsS0FBWSxFQUNaLE9BQTZCO0lBRTdCLElBQUksTUFBbUQsQ0FBQztJQUN4RCxPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVFdmVudFBhcmFtcyxcbiAgQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhlYWx0aENoZWNrUGF5bG9hZCxcbiAgVmFsaWRRdWV1ZU5hbWUsXG4gIFdvcmtmbG93UnVuLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEZJUlNUX0VWRU5UX1NMT1QsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIEhlYWx0aENoZWNrUGF5bG9hZFNjaGVtYSxcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgcmVxdWlyZUV2ZW50U2xvdCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX0xFR0FDWSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgYnl0ZXNUb0Jhc2U2NCwgZGVyaXZlUnVuS2V5UGFpciB9IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0U3BhbktpbmQsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5cbi8qKiBEZWZhdWx0IHRpbWVvdXQgZm9yIGhlYWx0aCBjaGVja3MgaW4gbWlsbGlzZWNvbmRzICovXG5jb25zdCBERUZBVUxUX0hFQUxUSF9DSEVDS19USU1FT1VUID0gMzBfMDAwO1xuXG4vKipcbiAqIFBhdHRlcm4gZm9yIHNhZmUgd29ya2Zsb3cgbmFtZXMuIE9ubHkgYWxsb3dzIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLFxuICogdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcyAoZm9yIG5hbWVzcGFjZWQgd29ya2Zsb3dzKSxcbiAqIGFuZCBhdCBzaWducyAoZm9yIHNjb3BlZCBwYWNrYWdlcykuXG4gKi9cbmNvbnN0IFNBRkVfV09SS0ZMT1dfTkFNRV9QQVRURVJOID0gL15bYS16QS1aMC05X1xcLS4vQF0rJC87XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgd29ya2Zsb3cgbmFtZSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBxdWV1ZSBuYW1lLlxuICogRW5zdXJlcyB0aGUgd29ya2Zsb3cgbmFtZSBvbmx5IGNvbnRhaW5zIHNhZmUgY2hhcmFjdGVycyBiZWZvcmVcbiAqIGludGVycG9sYXRpbmcgaXQgaW50byB0aGUgcXVldWUgbmFtZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1F1ZXVlTmFtZShcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmcsXG4gIG5hbWVzcGFjZT86IHN0cmluZ1xuKTogVmFsaWRRdWV1ZU5hbWUge1xuICBpZiAoIVNBRkVfV09SS0ZMT1dfTkFNRV9QQVRURVJOLnRlc3Qod29ya2Zsb3dOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHdvcmtmbG93IG5hbWUgXCIke3dvcmtmbG93TmFtZX1cIjogbXVzdCBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBkb3RzLCBmb3J3YXJkIHNsYXNoZXMsIG9yIGF0IHNpZ25zYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJlZml4ID0gZ2V0UXVldWVUb3BpY1ByZWZpeChcbiAgICAnd29ya2Zsb3cnLFxuICAgIHJlc29sdmVRdWV1ZU5hbWVzcGFjZShuYW1lc3BhY2UpXG4gICk7XG4gIHJldHVybiBgJHtwcmVmaXh9JHt3b3JrZmxvd05hbWV9YCBhcyBWYWxpZFF1ZXVlTmFtZTtcbn1cblxuY29uc3QgZ2VuZXJhdGVJZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHJlYW0gbmFtZSBmb3IgYSBoZWFsdGggY2hlY2sgd2l0aCB0aGUgZ2l2ZW4gY29ycmVsYXRpb24gSUQuXG4gKi9cbmZ1bmN0aW9uIGdldEhlYWx0aENoZWNrU3RyZWFtTmFtZShjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYF9faGVhbHRoX2NoZWNrX18ke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBoZWFsdGggY2hlY2sgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzdWx0IHtcbiAgaGVhbHRoeTogYm9vbGVhbjtcbiAgLyoqIEVycm9yIG1lc3NhZ2UgaWYgaGVhbHRoIGNoZWNrIGZhaWxlZCAqL1xuICBlcnJvcj86IHN0cmluZztcbiAgLyoqIExhdGVuY3kgaWYgdGhlIGhlYWx0aCBjaGVjayB3YXMgc3VjY2Vzc2Z1bCAqL1xuICBsYXRlbmN5TXM/OiBudW1iZXI7XG4gIC8qKiBTcGVjIHZlcnNpb24gb2YgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCAqL1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbiBvZiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50LCB1c2VkIGZvclxuICAgKiBjYXBhYmlsaXR5IGRldGVjdGlvbiAoc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgKS4gT21pdHRlZCB3aGVuIHRoZVxuICAgKiByZXNwb25kaW5nIGRlcGxveW1lbnQgZGlkIG5vdCBwcm92aWRlIHRoZSBmaWVsZCBhcyBhIHN0cmluZzpcbiAgICogZm9yIGV4YW1wbGUsIGFuIG9sZGVyIGBAd29ya2Zsb3cvY29yZWAgdGhhdCBwcmVkYXRlcyB0aGlzIGZpZWxkLFxuICAgKiBvciBhIG5vbi1KU09OIHBsYWluLXRleHQgaGVhbHRoIHJlc3BvbnNlLlxuICAgKi9cbiAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgcnVuJ3MgWDI1NTE5IHB1YmxpYyBrZXkgKGJhc2U2NCksIHJldHVybmVkIG9ubHkgd2hlbiB0aGUgcHJvYmVcbiAgICogY2FycmllZCBhIGBydW5JZGAgYW5kIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgaGFzIGVuY3J5cHRpb24gZW5hYmxlZC5cbiAgICpcbiAgICogTGV0cyBhIGNyb3NzLWRlcGxveW1lbnQgYHN0YXJ0KClgIHNlYWwgdGhlIHdvcmtmbG93IGFyZ3VtZW50cyB1c2luZyBhXG4gICAqIHJlc3BvbnNlIGl0IHdhcyBhbHJlYWR5IHdhaXRpbmcgb24sIGluc3RlYWQgb2YgbWFraW5nIGEgc2VwYXJhdGVcbiAgICoga2V5LWxvb2t1cCByZXF1ZXN0LlxuICAgKi9cbiAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQncyBgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTmA6IHRoZSBwcm90b2NvbFxuICAgKiB2ZXJzaW9uIGF0IHdoaWNoIHRoZSAqY29uc3VtZXIqIChxdWV1ZS1tZXNzYWdlIHRhcmdldCkgbWF0ZXJpYWxpemVzIHRoZVxuICAgKiBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSBgaG9va0lucHV0YCBvbiByZXBsYXkuIEEgY3Jvc3MtZGVwbG95bWVudFxuICAgKiBgc3RhcnQoKWAgc3RhbXBzIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIChub3QgdGhlIGNhbGxlcidzKSBpbnRvIHRoZSBuZXdcbiAgICogcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHQuaG9va1Jlc3VtZUlucHV0VmVyc2lvbmAuIEN1cnJlbnQgcHJvZHVjZXJzIHdyaXRlXG4gICAqIHRoZSBldmVudCBkdXJhYmx5IGJlZm9yZSBwdWJsaXNoaW5nIHRoZSB3YWtlIGFuZCBkbyBub3QgcmVhZCB0aGUgbWFya2VyO1xuICAgKiBPTERFUiBwcm9kdWNlcnMgc3RpbGwgZ2F0ZSB0aGVpciBsYXp5IHBhdGggb24gaXQsIHNvIGl0IGtlZXBzIGJlaW5nXG4gICAqIHN0YW1wZWQuIE9taXR0ZWQgd2hlbiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50IHByZWRhdGVzIHRoaXMgZmllbGQsXG4gICAqIHdoaWNoIGZhaWxzIHRoYXQgZ2F0ZSBjbG9zZWQuXG4gICAqL1xuICBob29rUmVzdW1lSW5wdXRWZXJzaW9uPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSBpcyBhIGhlYWx0aCBjaGVjayBwYXlsb2FkLlxuICogSWYgc28sIHJldHVybnMgdGhlIHBhcnNlZCBwYXlsb2FkLiBPdGhlcndpc2UgcmV0dXJucyB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChcbiAgbWVzc2FnZTogdW5rbm93blxuKTogSGVhbHRoQ2hlY2tQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzdWx0ID0gSGVhbHRoQ2hlY2tQYXlsb2FkU2NoZW1hLnNhZmVQYXJzZShtZXNzYWdlKTtcbiAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgZGV0ZXJtaW5pc3RpYyBmYWtlIHJ1bklkIGZvciBoZWFsdGggY2hlY2sgc3RyZWFtcy5cbiAqIEJvdGggdGhlIHdyaXRlciAoaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKSBhbmQgcmVhZGVyIChoZWFsdGhDaGVjaykgZGVyaXZlXG4gKiB0aGUgc2FtZSBydW5JZCBmcm9tIHRoZSBjb3JyZWxhdGlvbklkIHNvIHRoYXQgaW1wbGVtZW50YXRpb25zIHRoYXQgc2NvcGVcbiAqIHN0cmVhbSByZWFkcyBieSBydW5JZCBzdGlsbCB3b3JrIGNvcnJlY3RseS5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd3J1bl9oY18ke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2UgYnkgd3JpdGluZyB0aGUgcmVzdWx0IHRvIHRoZSB3b3JsZCdzIHN0cmVhbS5cbiAqIFRoZSBjYWxsZXIgY2FuIGxpc3RlbiB0byB0aGlzIHN0cmVhbSB0byBnZXQgdGhlIGhlYWx0aCBjaGVjayByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0gaGVhbHRoQ2hlY2sgLSBUaGUgcGFyc2VkIGhlYWx0aCBjaGVjayBwYXlsb2FkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gIGhlYWx0aENoZWNrOiBIZWFsdGhDaGVja1BheWxvYWQsXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQpO1xuXG4gIC8vIFdoZW4gdGhlIHByb2JlIG5hbWVzIGEgcnVuIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gY3JlYXRlLCBwdWJsaXNoIHRoYXRcbiAgLy8gcnVuJ3MgcHVibGljIGtleS4gV2UgYXJlIGV4ZWN1dGluZyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50LCBzbyBpdHNcbiAgLy8ga2V5IG1hdGVyaWFsIGlzIGF2YWlsYWJsZSBsb2NhbGx5IChubyBBUEkgY2FsbCksIGFuZCB0aGUgY2FsbGVyIGNhbiB0aGVuXG4gIC8vIHNlYWwgdGhlIHdvcmtmbG93IGFyZ3VtZW50cyBzdHJhaWdodCBmcm9tIHRoaXMgcmVzcG9uc2UgcmF0aGVyIHRoYW5cbiAgLy8gbWFraW5nIGEgc2VwYXJhdGUga2V5LWxvb2t1cCByZXF1ZXN0LlxuICAvL1xuICAvLyBPbmx5IGEgKnB1YmxpYyoga2V5IG1heSB0cmF2ZWwgdGhpcyB3YXk6IHRoZSBwcm9iZSByZXNwb25zZSBzdHJlYW0gaXNcbiAgLy8gZGVsaWJlcmF0ZWx5IHVuYXV0aGVudGljYXRlZCwgc28gYW55dGhpbmcgc2VjcmV0IHdvdWxkIGJlIGV4cG9zZWQuXG4gIC8vIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaGVyZSBtdXN0IG5vdCBmYWlsIHRoZSBoZWFsdGggY2hlY2sgaXRzZWxmLCB3aGljaFxuICAvLyBjYWxsZXJzIGFsc28gcmVseSBvbiBmb3IgcGxhaW4gY2FwYWJpbGl0eSBkZXRlY3Rpb24uXG4gIGxldCBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChoZWFsdGhDaGVjay5ydW5JZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaGVhbHRoQ2hlY2sucnVuSWQpO1xuICAgICAgaWYgKHJhd0tleSkge1xuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gYnl0ZXNUb0Jhc2U2NChcbiAgICAgICAgICAoYXdhaXQgZGVyaXZlUnVuS2V5UGFpcihyYXdLZXkpKS5wdWJsaWNLZXlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ0hlYWx0aCBjaGVjayBjb3VsZCBub3QgZGVyaXZlIGEgcnVuIHB1YmxpYyBrZXk7IHRoZSBjYWxsZXIgd2lsbCBmYWxsIGJhY2sgdG8gYSBrZXkgbG9va3VwJyxcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBoZWFsdGh5OiB0cnVlLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQsXG4gICAgc3BlY1ZlcnNpb246IHdvcmxkU3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAvLyBXZSBhcmUgZXhlY3V0aW5nIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQsIHNvIHRoaXMgY29uc3RhbnQgcmVmbGVjdHNcbiAgICAvLyB0aGUgKmNvbnN1bWVyJ3MqIGhvb2stcmVzdW1lIHByb3RvY29sIHZlcnNpb24sIGV4YWN0bHkgd2hhdCBhXG4gICAgLy8gY3Jvc3MtZGVwbG95bWVudCBjYWxsZXIgbmVlZHMgdG8gZ2F0ZSBpdHMgcGFyYWxsZWwgcmVzdW1lIHBhdGggb24uXG4gICAgaG9va1Jlc3VtZUlucHV0VmVyc2lvbjogSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgICAuLi4oZW5jcnlwdGlvblB1YmxpY0tleSA/IHsgZW5jcnlwdGlvblB1YmxpY0tleSB9IDoge30pLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgfSk7XG4gIC8vIFVzZSBhIGRldGVybWluaXN0aWMgZmFrZSBydW5JZCBkZXJpdmVkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdFxuICAvLyB0aGUgcmVhZGVyIHNpZGUgcHJvZHVjZXMgdGhlIHNhbWUgdmFsdWUuXG4gIGNvbnN0IGZha2VSdW5JZCA9IGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUsIHJlc3BvbnNlKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrT3B0aW9ucyB7XG4gIC8qKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBoZWFsdGggY2hlY2sgcmVzcG9uc2UuIERlZmF1bHQ6IDMwMDAwICgzMHMpICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBEZXBsb3ltZW50IElEIHRvIHNlbmQgdGhlIGhlYWx0aCBjaGVjayB0by4gRmFsbHMgYmFjayB0byBwcm9jZXNzLmVudi5WRVJDRUxfREVQTE9ZTUVOVF9JRC4gKi9cbiAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBpZCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGNyZWF0ZS4gV2hlbiBzZXQsIHRoZSByZXNwb25kaW5nXG4gICAqIGRlcGxveW1lbnQgZGVyaXZlcyB0aGF0IHJ1bidzIHB1YmxpYyBrZXkgbG9jYWxseSBhbmQgcmV0dXJucyBpdCBhc1xuICAgKiBgZW5jcnlwdGlvblB1YmxpY0tleWAsIGxldHRpbmcgYSBjcm9zcy1kZXBsb3ltZW50IGBzdGFydCgpYCBzZWFsIHRoZVxuICAgKiB3b3JrZmxvdyBhcmd1bWVudHMgd2l0aG91dCBhIHNlcGFyYXRlIGtleSBsb29rdXAuXG4gICAqL1xuICBydW5JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgdGFyZ2V0IGRlcGxveW1lbnQgKGUuZy4gYCdldmUnYCBmb3IgdG9waWNzIGxpa2VcbiAgICogYF9fZXZlX3drZl93b3JrZmxvd18qYCkuIEZhbGxzIGJhY2sgdG8gYFdPUktGTE9XX1FVRVVFX05BTUVTUEFDRWAgaW4gdGhlXG4gICAqIGNhbGxpbmcgcHJvY2Vzcy4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5XG4gICAqIGRhc2hib2FyZCkgbXVzdCBwYXNzIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIG5hbWVzcGFjZSBleHBsaWNpdGx5OlxuICAgKiB0aGUgZW52IGZhbGxiYWNrIHJlc29sdmVzIGluIHRoZSBjYWxsZXIncyBwcm9jZXNzLCBhbmQgYSBtZXNzYWdlXG4gICAqIHB1Ymxpc2hlZCB0byBhIG1pc21hdGNoZWQgdG9waWMgaGFzIG5vIGNvbnN1bWVyLCBzbyB0aGUgY2hlY2sgd291bGRcbiAgICogYWx3YXlzIHRpbWUgb3V0LlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgaGVhbHRoIGNoZWNrIGJ5IHNlbmRpbmcgYSBtZXNzYWdlIHRocm91Z2ggdGhlIHF1ZXVlIHBpcGVsaW5lXG4gKiBhbmQgdmVyaWZ5aW5nIGl0IGlzIHByb2Nlc3NlZCBieSB0aGUgY29tYmluZWQgd29ya2Zsb3cgZW5kcG9pbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBEZXBsb3ltZW50IFByb3RlY3Rpb24gb24gVmVyY2VsIGJlY2F1c2UgaXQgZ29lc1xuICogdGhyb3VnaCB0aGUgcXVldWUgaW5mcmFzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gZGlyZWN0IEhUVFAuXG4gKlxuICogQHBhcmFtIHdvcmxkIC0gVGhlIFdvcmxkIGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIGhlYWx0aCBjaGVja1xuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBoZWFsdGggY2hlY2sgcmVzdWx0XG4gKi9cbi8vIFBvbGwgaW50ZXJ2YWwgZm9yIGhlYWx0aCBjaGVjayByZXRyaWVzIChtcylcbmNvbnN0IEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMID0gMTAwO1xuLy8gUGVyLXJlYWQgdGltZW91dCB0byBwcmV2ZW50IGJsb2NraW5nIGZvcmV2ZXIgb24gbG9jYWwgd29ybGQncyBFdmVudEVtaXR0ZXJcbi8vICh3aGljaCBkb2Vzbid0IHdvcmsgYWNyb3NzIHByb2Nlc3NlcylcbmNvbnN0IEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVQgPSA1MDA7XG5cbi8qKlxuICogUmVhZCBjaHVua3MgZnJvbSBhIHN0cmVhbSB3aXRoIGEgdGltZW91dCBwZXIgcmVhZCBvcGVyYXRpb24uXG4gKiBSZXR1cm5zIHsgY2h1bmtzLCB0aW1lZE91dCB9IHdoZXJlIHRpbWVkT3V0IGluZGljYXRlcyBpZiBhIHJlYWQgdGltZWQgb3V0LlxuICovXG4vKipcbiAqIFJhY2UgYSBwcm9taXNlIGFnYWluc3QgYSBkZWFkbGluZS4gUmVqZWN0cyB3aXRoIGEgdGltZW91dCBlcnJvciB3aGVuIHRoZVxuICogZGVhZGxpbmUgZWxhcHNlcyBmaXJzdC4gVXNlZCB0byBib3VuZCBgd29ybGQuc3RyZWFtcy5nZXQoKWAgaW5zaWRlIHRoZVxuICogaGVhbHRoLWNoZWNrIHBvbGwgbG9vcDogc29tZSB3b3JsZHMgaG9sZCB0aGF0IHJlcXVlc3Qgb3BlbiB1bnRpbCB0aGVcbiAqIHN0cmVhbSBoYXMgZGF0YSAoZS5nLiB3b3JrZmxvdy1zZXJ2ZXIgaG9sZHMgdW53cml0dGVuIHN0cmVhbXMgb3BlbiBmb3JcbiAqIH4yIG1pbnV0ZXMpLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmxvdyB0aHJvdWdoIHRoZSBjb25maWd1cmVkIGhlYWx0aFxuICogY2hlY2sgdGltZW91dCwgc2luY2UgdGhlIGB3aGlsZWAgY29uZGl0aW9uIGlzIG9ubHkgcmUtY2hlY2tlZCBiZXR3ZWVuXG4gKiBpdGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiB3aXRoRGVhZGxpbmU8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgbXM6IG51bWJlcik6IFByb21pc2U8VD4ge1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcbiAgICBwcm9taXNlLFxuICAgIG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PiB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IHJlamVjdChuZXcgRXJyb3IoYE9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHttc31tc2ApKSxcbiAgICAgICAgbXNcbiAgICAgICk7XG4gICAgfSksXG4gIF0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW1XaXRoVGltZW91dChcbiAgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT4sXG4gIHJlYWRUaW1lb3V0OiBudW1iZXJcbik6IFByb21pc2U8eyBjaHVua3M6IFVpbnQ4QXJyYXlbXTsgdGltZWRPdXQ6IGJvb2xlYW4gfT4ge1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICBsZXQgdGltZWRPdXQgPSBmYWxzZTtcblxuICB3aGlsZSAoIWRvbmUgJiYgIXRpbWVkT3V0KSB7XG4gICAgY29uc3QgcmVhZFByb21pc2UgPSByZWFkZXIucmVhZCgpO1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8eyBkb25lOiB0cnVlOyB2YWx1ZTogdW5kZWZpbmVkIH0+KFxuICAgICAgKHJlc29sdmUpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSwgcmVhZFRpbWVvdXQpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbcmVhZFByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgZG9uZSA9IHJlc3VsdC5kb25lO1xuICAgIGlmIChyZXN1bHQudmFsdWUpIGNodW5rcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gIH1cblxuICByZXR1cm4geyBjaHVua3MsIHRpbWVkT3V0IH07XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHZhbGlkYXRlIGEgaGVhbHRoIGNoZWNrIHJlc3BvbnNlIGZyb20gc3RyZWFtIGNodW5rcy5cbiAqIFJldHVybnMgdGhlIHBhcnNlZCByZXNwb25zZSBvciBudWxsIGlmIGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3M6IFVpbnQ4QXJyYXlbXSk6IHtcbiAgaGVhbHRoeTogYm9vbGVhbjtcbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gIHdvcmtmbG93Q29yZVZlcnNpb24/OiBzdHJpbmc7XG4gIGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmc7XG59IHwgbnVsbCB7XG4gIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0b3RhbExlbmd0aCA9IGNodW5rcy5yZWR1Y2UoKHN1bSwgY2h1bmspID0+IHN1bSArIGNodW5rLmxlbmd0aCwgMCk7XG4gIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBjb21iaW5lZC5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuICBjb25zdCByZXNwb25zZVRleHQgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29tYmluZWQpO1xuXG4gIGxldCByZXNwb25zZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gT2xkIGRlcGxveW1lbnRzIChzcGVjVmVyc2lvbiA8IDMpIHJldHVybiBwbGFpbiB0ZXh0IGxpa2VcbiAgICAvLyAnV29ya2Zsb3cgU0RLIFwiLi4uXCIgZW5kcG9pbnQgaXMgaGVhbHRoeScuIFRyZWF0IGFueSBub24tZW1wdHlcbiAgICAvLyB0ZXh0IHJlc3BvbnNlIGFzIGEgaGVhbHRoeSBkZXBsb3ltZW50IHdpdGggdW5rbm93biBzcGVjVmVyc2lvbi5cbiAgICBpZiAocmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IGhlYWx0aHk6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fFxuICAgIHJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgISgnaGVhbHRoeScgaW4gcmVzcG9uc2UpIHx8XG4gICAgdHlwZW9mIChyZXNwb25zZSBhcyB7IGhlYWx0aHk6IHVua25vd24gfSkuaGVhbHRoeSAhPT0gJ2Jvb2xlYW4nXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgciA9IHJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBwYXJzZWQ6IHtcbiAgICBoZWFsdGh5OiBib29sZWFuO1xuICAgIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAgIHdvcmtmbG93Q29yZVZlcnNpb24/OiBzdHJpbmc7XG4gICAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uPzogbnVtYmVyO1xuICB9ID0ge1xuICAgIGhlYWx0aHk6IHIuaGVhbHRoeSBhcyBib29sZWFuLFxuICB9O1xuICBpZiAodHlwZW9mIHIuc3BlY1ZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgcGFyc2VkLnNwZWNWZXJzaW9uID0gci5zcGVjVmVyc2lvbjtcbiAgfVxuICBpZiAodHlwZW9mIHIud29ya2Zsb3dDb3JlVmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJzZWQud29ya2Zsb3dDb3JlVmVyc2lvbiA9IHIud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgfVxuICBpZiAodHlwZW9mIHIuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJzZWQuZW5jcnlwdGlvblB1YmxpY0tleSA9IHIuZW5jcnlwdGlvblB1YmxpY0tleTtcbiAgfVxuICBpZiAodHlwZW9mIHIuaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJzZWQuaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHIuaG9va1Jlc3VtZUlucHV0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGVhbHRoQ2hlY2soXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0aW9ucz86IEhlYWx0aENoZWNrT3B0aW9uc1xuKTogUHJvbWlzZTxIZWFsdGhDaGVja1Jlc3VsdD4ge1xuICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/PyBERUZBVUxUX0hFQUxUSF9DSEVDS19USU1FT1VUO1xuICAvLyBVc2UgdGhlIHdvcmxkJ3MgSUQgZ2VuZXJhdG9yIHdoZW4gYXZhaWxhYmxlIHNvIHRoZSBjb3JyZWxhdGlvbklkIGlzIGFcbiAgLy8gcmVnaW9uLXRhZ2dlZCBVTElELiBUaGUgaGVhbHRoLWNoZWNrIHJlc3BvbnNlIGlzIGRlbGl2ZXJlZCBvdmVyIGEgc3RyZWFtXG4gIC8vIHdob3NlIG5hbWUgZW1iZWRzIHRoaXMgY29ycmVsYXRpb25JZDsgdW5kZXIgcGxhdGZvcm0tZGlyZWN0ZWQgcm91dGluZyB0aGVcbiAgLy8gcmVhZGVyIGFuZCB0aGUgcmVzcG9uZGluZyBlbmRwb2ludCBjYW4gYmUgc2VydmVkIGZyb20gZGlmZmVyZW50IHBoeXNpY2FsXG4gIC8vIHJlZ2lvbnMsIHNvIHRoZSByZWdpb24gbXVzdCBiZSBlbmNvZGVkIGluIHRoZSBJRCBpdHNlbGYgZm9yIGJvdGggc2lkZXMgdG9cbiAgLy8gcmVzb2x2ZSB0aGUgc2FtZSAocmVnaW9uLXBpbm5lZCkgYmFja2VuZC4gRmFsbHMgYmFjayB0byBhIHBsYWluIFVMSUQgZm9yXG4gIC8vIHdvcmxkcyB0aGF0IGRvbid0IHRhZyBJRHMgKGUuZy4gbG9jYWwpLCB3aGljaCByZXNvbHZlIHRvIHRoZSBkZWZhdWx0XG4gIC8vIHJlZ2lvbiBvbiBib3RoIHNpZGVzLlxuICBjb25zdCBjb3JyZWxhdGlvbklkID0gd29ybGQuY3JlYXRlUnVuSWQ/LigpID8/IGdlbmVyYXRlSWQoKTtcbiAgY29uc3Qgc3RyZWFtTmFtZSA9IGdldEhlYWx0aENoZWNrU3RyZWFtTmFtZShjb3JyZWxhdGlvbklkKTtcblxuICBjb25zdCBxdWV1ZU5hbWUgPVxuICAgIGAke2dldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG9wdGlvbnM/Lm5hbWVzcGFjZSkpfWhlYWx0aF9jaGVja2AgYXMgVmFsaWRRdWV1ZU5hbWU7XG5cbiAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdvcmxkLnF1ZXVlKFxuICAgICAgcXVldWVOYW1lLFxuICAgICAge1xuICAgICAgICBfX2hlYWx0aENoZWNrOiB0cnVlLFxuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICAuLi4ob3B0aW9ucz8ucnVuSWQgPyB7IHJ1bklkOiBvcHRpb25zLnJ1bklkIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBVc2UgSlNPTiB0cmFuc3BvcnQgc28gdGhlIGhlYWx0aCBjaGVjayB3b3JrcyBhZ2FpbnN0IGJvdGhcbiAgICAgICAgLy8gb2xkIChKU09OLW9ubHkpIGFuZCBuZXcgKGR1YWwpIGRlcGxveW1lbnRzLlxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgZGVwbG95bWVudElkOiBvcHRpb25zPy5kZXBsb3ltZW50SWQsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nTXMgPSB0aW1lb3V0IC0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3aXRoRGVhZGxpbmUoXG4gICAgICAgICAgd29ybGQuc3RyZWFtcy5nZXQoXG4gICAgICAgICAgICBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZCksXG4gICAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZW1haW5pbmdNc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHsgY2h1bmtzLCB0aW1lZE91dCB9ID0gYXdhaXQgcmVhZFN0cmVhbVdpdGhUaW1lb3V0KFxuICAgICAgICAgIHJlYWRlcixcbiAgICAgICAgICBIRUFMVEhfQ0hFQ0tfUkVBRF9USU1FT1VUXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRpbWVkT3V0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBjYW5jZWwgZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBwYXJzZUhlYWx0aENoZWNrUmVzcG9uc2UoY2h1bmtzKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgICAgICAgbGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBoZWFsdGh5OiBmYWxzZSxcbiAgICAgIGVycm9yOiBgSGVhbHRoIGNoZWNrIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXNgLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZ1xuKTogV29ya2Zsb3dXb3JsZEVycm9yIHtcbiAgcmV0dXJuIG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgYEV2ZW50IHBhZ2luYXRpb24gJHttZXNzYWdlfSBmb3Igd29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIi5gLFxuICAgIHsgY29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkUmVxdWVzdGVkRXZlbnRDdXJzb3IoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgcmVxdWVzdGVkQ3Vyc29yczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoIWN1cnNvcikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocmVxdWVzdGVkQ3Vyc29ycy5oYXMoY3Vyc29yKSkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IocnVuSWQsICdkaWQgbm90IGFkdmFuY2UnKTtcbiAgfVxuICByZXF1ZXN0ZWRDdXJzb3JzLmFkZChjdXJzb3IpO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgZXZlbnRzIHdob3NlIElEcyBhcmUgbm90IGFscmVhZHkgcHJlc2VudCBpbiBgdGFyZ2V0YC5cbiAqXG4gKiBQYXNzIHRoZSBJRHMgY3VycmVudGx5IHByZXNlbnQgaW4gYHRhcmdldGAgd2hlbiBhcHBlbmRpbmcgcmVwZWF0ZWRseSB0byB0aGVcbiAqIHNhbWUgYXJyYXkuIFRoZSBzZXQgaXMgdXBkYXRlZCBhbG9uZ3NpZGUgYHRhcmdldGAuXG4gKlxuICogRXZlbnRzIGFyZSBhcHBlbmRlZCBpbiB0aGUgb3JkZXIgdGhlIFdvcmxkIHJldHVybmVkIHRoZW0sIGFuZCBhcmUgbm90XG4gKiByZS1zb3J0ZWQuIEV2ZXJ5IGFwcGVuZCBzb3VyY2UgaXMgYWxyZWFkeSBpbiBjYW5vbmljYWwgb3JkZXIgcmVsYXRpdmUgdG8gdGhlXG4gKiB0YWlsIChhIGN1cnNvci1kZWxpbWl0ZWQgcGFnZSwgb3IgYSB3cml0ZS1yZXNwb25zZSBkZWx0YSksIHNvIHJlY2VpcHQgb3JkZXIgaXNcbiAqIHRoZSBvcmRlciB0byBrZWVwLCBhbmQgcmUtc29ydGluZyBoZXJlIHdvdWxkIG9ubHkgY29zdCBhIHBhc3Mgb3ZlciB0aGUgbG9nLlxuICogTm90aGluZyBkb3duc3RyZWFtIG1heSBhc3N1bWUgdGhlIHRhaWwgaXMgdGhlIG5ld2VzdCBldmVudC4gU2VlXG4gKiB7QGxpbmsgbWF4RXZlbnRTbG90fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFVuaXF1ZUV2ZW50cyhcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W10sXG4gIHRhcmdldElkcz86IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpZHMgPSB0YXJnZXRJZHMgPz8gbmV3IFNldCh0YXJnZXQubWFwKChldmVudCkgPT4gZXZlbnQuZXZlbnRJZCkpO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChpZHMuaGFzKGV2ZW50LmV2ZW50SWQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWRzLmFkZChldmVudC5ldmVudElkKTtcbiAgICB0YXJnZXQucHVzaChldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnNlcnRzIGBldmVudGAgaW50byBgdGFyZ2V0YCBhdCB0aGUgcG9zaXRpb24gdGhhdCBrZWVwcyBgdGFyZ2V0YCBvcmRlcmVkIGJ5XG4gKiBhc2NlbmRpbmcgYGV2ZW50SWRgLCBvciBuby1vcHMgaWYgYW4gZXZlbnQgd2l0aCB0aGUgc2FtZSBgZXZlbnRJZGAgaXMgYWxyZWFkeVxuICogcHJlc2VudCAoaWRlbXBvdGVudCkuXG4gKlxuICogYHByZWxvYWRlZEV2ZW50c2AgaXMgbG9hZGVkIGBzb3J0T3JkZXI6ICdhc2MnYCBhbmQgaXMgbmV2ZXIgcmUtc29ydGVkXG4gKiBjbGllbnQtc2lkZSwgc28gYSBgaG9va19yZWNlaXZlZGAgc3BsaWNlZCBpbiBieSB0aGUgbGF6eS1yZXN1bWUgY29uc3VtZXIgbXVzdFxuICogbGFuZCBpbiBgZXZlbnRJZGAgb3JkZXI6IGEgcGxhaW4gYHB1c2hgIHdvdWxkIHBsYWNlIGEgbGF0ZS1jb21taXR0aW5nXG4gKiBlYXJsaWVyIGV2ZW50IGFmdGVyIGV2ZW50cyB0aGF0IHNvcnQgYmVmb3JlIGl0LCBjb3JydXB0aW5nIHJlcGxheS5cbiAqXG4gKiBMZXhpY29ncmFwaGljIHN0cmluZyBvcmRlciBpcyB0aGUgbG9nJ3Mgb3JkZXI6IGEgc2xvdCBpZCBpcyBhIGZpeGVkLXdpZHRoXG4gKiB6ZXJvLXBhZGRlZCBwb3NpdGlvbiwgc28gY29tcGFyaW5nIHRoZSBzdHJpbmdzIGNvbXBhcmVzIHRoZSBwb3NpdGlvbnMuIFRoaXNcbiAqIG5lZWRzIG5vIHBhcnNlIG9mIGl0cyBvd24gZm9yIHRoYXQgcmVhc29uLCBhbmQgdGhlIGNvbXBhcmlzb24gaXMgZXhhY3QgcmF0aGVyXG4gKiB0aGFuIGEgcmVjb25zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRFdmVudEJ5RXZlbnRJZCh0YXJnZXQ6IEV2ZW50W10sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAvLyBMaW5lYXIgc2NhbiBmcm9tIHRoZSBlbmQ6IHRoZSBzcGxpY2VkIGV2ZW50IGlzIGFsbW9zdCBhbHdheXMgdGhlIG5ld2VzdFxuICAvLyAoaXQgc29ydHMgYXQgb3IgbmVhciB0aGUgdGFpbCksIHNvIHRoaXMgZmluZHMgdGhlIHNsb3QgaW4gTygxKeKAk08oaykgZm9yIHRoZVxuICAvLyBjb21tb24gY2FzZSB3aGlsZSBzdGlsbCBoYW5kbGluZyBhbiBvdXQtb2Ytb3JkZXIgbGF0ZSBhcnJpdmFsIGNvcnJlY3RseS5cbiAgbGV0IGkgPSB0YXJnZXQubGVuZ3RoO1xuICB3aGlsZSAoaSA+IDApIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRhcmdldFtpIC0gMV07XG4gICAgaWYgKGV4aXN0aW5nLmV2ZW50SWQgPT09IGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIC8vIEFscmVhZHkgcHJlc2VudDoga2VlcCB0aGUgc3BsaWNlIGlkZW1wb3RlbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleGlzdGluZy5ldmVudElkIDwgZXZlbnQuZXZlbnRJZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGktLTtcbiAgfVxuICB0YXJnZXQuc3BsaWNlKGksIDAsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhhc01vcmU6IGJvb2xlYW4sXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgcmVxdWVzdGVkQ3Vyc29yczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoIWhhc01vcmUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnNvciA9PT0gbnVsbCkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IoXG4gICAgICBydW5JZCxcbiAgICAgICdyZXR1cm5lZCBtb3JlIHBhZ2VzIHdpdGhvdXQgYSBjdXJzb3InXG4gICAgKTtcbiAgfVxuICBpZiAocmVxdWVzdGVkQ3Vyc29ycy5oYXMoY3Vyc29yKSkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IocnVuSWQsICdyZXBlYXRlZCBhIGN1cnNvcicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJldHJ5V2l0aG91dEV2ZW50Q3Vyc29yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICBhbHJlYWR5UmV0cmllZDogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY3Vyc29yICE9PSBudWxsICYmXG4gICAgIWFscmVhZHlSZXRyaWVkICYmXG4gICAgV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycm9yKSAmJlxuICAgIGVycm9yLnN0YXR1cyA9PT0gNDAwXG4gICk7XG59XG5cbi8qKlxuICogTG9hZHMgd29ya2Zsb3cgcnVuIGV2ZW50cyBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgcGFnZXMgb2YgcGFnaW5hdGVkXG4gKiByZXN1bHRzLiBFdmVudHMgYXJlIHJldHVybmVkIGluIGNocm9ub2xvZ2ljYWwgKGFzY2VuZGluZykgb3JkZXIgZm9yXG4gKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IHJlcGxheS5cbiAqXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElELlxuICogQHBhcmFtIGFmdGVyQ3Vyc29yIC0gSWYgcHJvdmlkZWQsIG9ubHkgZXZlbnRzIGFmdGVyIHRoaXMgY3Vyc29yIGFyZVxuICogICByZXR1cm5lZCAoaW5jcmVtZW50YWwgbG9hZCkuIElmIG9taXR0ZWQsIGFsbCBldmVudHMgYXJlIHJldHVybmVkLlxuICogICBUaGUgcmV0dXJuZWQgY3Vyc29yIGNhbiBiZSBwYXNzZWQgYmFjayBpbiBvbiBhIHN1YnNlcXVlbnQgY2FsbCBmb3JcbiAqICAgaW5jcmVtZW50YWwgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgYWZ0ZXJDdXJzb3I/OiBzdHJpbmdcbik6IFByb21pc2U8TG9hZGVkRXZlbnRMb2c+IHtcbiAgY29uc3QgaW5jcmVtZW50YWwgPSBhZnRlckN1cnNvciAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJhY2UoJ3dvcmtmbG93LnJlcGxheS5sb2FkJywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JlcGxheUxvYWRTb3VyY2UoXG4gICAgICAgIGluY3JlbWVudGFsID8gJ2V2ZW50c19saXN0X2luY3JlbWVudGFsJyA6ICdldmVudHNfbGlzdCdcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2FkZWRFdmVudHM6IEV2ZW50W10gPSBbXTtcbiAgICBjb25zdCBsb2FkZWRFdmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gYWZ0ZXJDdXJzb3IgPz8gbnVsbDtcbiAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgbGV0IHBhZ2VzTG9hZGVkID0gMDtcbiAgICBsZXQgcmV0cmllZFdpdGhvdXRDdXJzb3IgPSBmYWxzZTtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgIGNvbnN0IGxvYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIC8vIFRPRE86IHdlJ3JlIGN1cnJlbnRseSBsb2FkaW5nIGFsbCB0aGUgZGF0YSB3aXRoIHJlc29sdmVSZWYgYmVoYXZpb3IuIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXNcbiAgICAgIC8vIHRvIGxhenlsb2FkIHRoZSBkYXRhIGZyb20gdGhlIHdvcmxkIGluc3RlYWQgc28gdGhhdCB3ZSBjYW4gb3B0aW1pemUgYW5kIG1ha2UgdGhlIGV2ZW50IGxvZyBsb2FkaW5nXG4gICAgICAvLyBtdWNoIGZhc3RlciBhbmQgbWVtb3J5IGVmZmljaWVudFxuICAgICAgY29uc3QgcGFnZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvciA9IGN1cnNvcjtcbiAgICAgIHJlY29yZFJlcXVlc3RlZEV2ZW50Q3Vyc29yKHJ1bklkLCByZXF1ZXN0ZWRDdXJzb3IsIHJlcXVlc3RlZEN1cnNvcnMpO1xuXG4gICAgICBsZXQgcmVzcG9uc2U6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2Ygd29ybGQuZXZlbnRzLmxpc3Q+PjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgICBjdXJzb3I6IHJlcXVlc3RlZEN1cnNvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2hvdWxkUmV0cnlXaXRob3V0RXZlbnRDdXJzb3IoXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIHJlcXVlc3RlZEN1cnNvcixcbiAgICAgICAgICAgIHJldHJpZWRXaXRob3V0Q3Vyc29yXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnRXZlbnQgY3Vyc29yIHdhcyByZWplY3RlZDsgcmV0cnlpbmcgd2l0aCBhIGZ1bGwgZXZlbnQgcmVsb2FkLicsXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGxvYWRlZEV2ZW50cy5sZW5ndGggPSAwO1xuICAgICAgICAgIGxvYWRlZEV2ZW50SWRzLmNsZWFyKCk7XG4gICAgICAgICAgcmVxdWVzdGVkQ3Vyc29ycy5jbGVhcigpO1xuICAgICAgICAgIGN1cnNvciA9IG51bGw7XG4gICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3IgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBhcHBlbmRVbmlxdWVFdmVudHMobG9hZGVkRXZlbnRzLCByZXNwb25zZS5kYXRhLCBsb2FkZWRFdmVudElkcyk7XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuaGFzTW9yZTtcbiAgICAgIGFzc2VydEV2ZW50UGFnaW5hdGlvblByb2dyZXNzKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgcmVzcG9uc2UuY3Vyc29yLFxuICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzXG4gICAgICApO1xuICAgICAgLy8gUHJlc2VydmUgdGhlIGxhc3Qgbm9uLW51bGwgY3Vyc29yIGFjcm9zcyBwYWdlcy4gQSBXb3JsZCBtYXlcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSByZXR1cm4gYHsgZGF0YTogW10sIGN1cnNvcjogbnVsbCwgaGFzTW9yZTogZmFsc2UgfWBcbiAgICAgIC8vIG9uIGEgdHJhaWxpbmcgZW1wdHkgcGFnZSwgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcHJldmlvdXMgcGFnZSdzXG4gICAgICAvLyB1bmRlcmx5aW5nIERCIHF1ZXJ5IGhpdCB0aGUgbGltaXQgZXhhY3RseSBhbmQgcmV0dXJuZWQgYVxuICAgICAgLy8gcHJlY2F1dGlvbmFyeSBgTGFzdEV2YWx1YXRlZEtleWAuIE92ZXJ3cml0aW5nIHdpdGggdGhhdCBudWxsXG4gICAgICAvLyB3b3VsZCBsb3NlIHRoZSBwb3NpdGlvbiBwYXN0IHRoZSBsYXN0IHJlYWwgZXZlbnQgd2UgbG9hZGVkIGFuZFxuICAgICAgLy8gZm9yY2UgdGhlIHJ1bnRpbWUgaW50byB0aGUgXCJubyBjdXJzb3IgYWZ0ZXIgaW5pdGlhbCBsb2FkXCIgZnVsbC1cbiAgICAgIC8vIHJlbG9hZCBmYWxsYmFjayBvbiBldmVyeSBzdWJzZXF1ZW50IHJlcGxheSBpdGVyYXRpb24uXG4gICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3IgPz8gY3Vyc29yO1xuICAgICAgcGFnZXNMb2FkZWQrKztcblxuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnTG9hZGVkIGV2ZW50IHBhZ2UnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBpbmNyZW1lbnRhbCxcbiAgICAgICAgcGFnZTogcGFnZXNMb2FkZWQsXG4gICAgICAgIHBhZ2VFdmVudHM6IHJlc3BvbnNlLmRhdGEubGVuZ3RoLFxuICAgICAgICB0b3RhbEV2ZW50czogbG9hZGVkRXZlbnRzLmxlbmd0aCxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgcGFnZU1zOiBEYXRlLm5vdygpIC0gcGFnZVN0YXJ0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRXZlbnQgbG9hZCBjb21wbGV0ZScsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgaW5jcmVtZW50YWwsXG4gICAgICB0b3RhbEV2ZW50czogbG9hZGVkRXZlbnRzLmxlbmd0aCxcbiAgICAgIHBhZ2VzTG9hZGVkLFxuICAgICAgdG90YWxNczogRGF0ZS5ub3coKSAtIGxvYWRTdGFydCxcbiAgICB9KTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQobG9hZGVkRXZlbnRzLmxlbmd0aCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNQYWdlc0xvYWRlZChwYWdlc0xvYWRlZCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBldmVudHM6IGxvYWRlZEV2ZW50cywgY3Vyc29yIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBydW50aW1lJ3MgbG9hZGVkIGV2ZW50LWxvZyBzbmFwc2hvdDogdGhlIGV2ZW50cyByZXBsYXllZCBzbyBmYXIgYW5kIHRoZVxuICogY3Vyc29yIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlbS4gSGFuZGVkIHRvIGhlbHBlcnMgdGhhdCBkZXJpdmUgdGhlIHByZWNvbmRpdGlvblxuICogc25hcHNob3QgZnJvbSBpdDsgdGhleSBkbyBub3QgbXV0YXRlIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZEV2ZW50TG9nIHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogV2hldGhlciBhIHJlcGxheSByZWZ1c2VzIHRvIHJ1biBvdmVyIGEgbG9nIHdpdGggYSBob2xlIGluIGl0IChzZWVcbiAqIHtAbGluayBmaW5kRXZlbnRTbG90R2FwfSkuICoqT24gYnkgZGVmYXVsdCoqOyBzZXRcbiAqIGBXT1JLRkxPV19TTE9UX0dBUF9DSEVDSz0wYCB0byByZXBsYXkgYWNyb3NzIGhvbGVzIGluc3RlYWQuXG4gKlxuICogQSBXb3JsZCB0aGF0IGFsbG9jYXRlcyBhIHBvc2l0aW9uIGF0IHRoZSBtb21lbnQgaXQgY29tbWl0cyBsZWF2ZXMgbm8gaG9sZVxuICogYmVoaW5kIHdoZW4gYSB3cml0ZSBmYWlscywgc28gZGVuc2l0eSBpcyBhIHByb3BlcnR5IHRoZSBsb2cgaGFzIGJ5XG4gKiBjb25zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gb25lIHRoaXMgY2hlY2sgbWFpbnRhaW5zLiBXaGF0IHRoZSBjaGVjayBpcyBmb3IgaXNcbiAqIHRoZSByZWFkcyBhbmQgdGhlIFdvcmxkcyB3aGVyZSB0aGF0IGRvZXMgbm90IGhvbGQsIGFuZCBieSB0aGUgdGltZSBpdCBydW5zXG4gKiB0aGUgYmVuaWduIGV4cGxhbmF0aW9ucyBhcmUgc3BlbnQ6IGEgcG9zaXRpb24gbWlzc2luZyBiZWNhdXNlIGEgY29uY3VycmVudFxuICogY29tbWl0IGlzIG5vdCB2aXNpYmxlIHlldCBjbGVhcnMgb24gYSByZS1yZWFkLCB3aGljaCBpcyB3aGF0XG4gKiB7QGxpbmsgc2V0dGxlRXZlbnRTbG90R2FwfSBkb2VzIGZpcnN0LlxuICpcbiAqIFdoYXQgaXMgbGVmdCBpcyBhIGhvbGUgdGhhdCBwZXJzaXN0cywgYW5kIGl0cyB0d28gY2F1c2VzIGFyZVxuICogaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgbG9nLiBFaXRoZXIgYSBXb3JsZCBhbGxvY2F0ZWQgdGhlIHBvc2l0aW9uIG91dHNpZGVcbiAqIHRoZSBjb21taXQgYW5kIGxvc3QgdGhlIHdyaXRlLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaGFwcGVuZWQgdGhlcmUgYW5kXG4gKiByZXBsYXlpbmcgcGFzdCBpdCBpcyBjb3JyZWN0LCBvciBhbiBldmVudCB0aGF0IGRpZCBoYXBwZW4gaXMgbWlzc2luZywgaW5cbiAqIHdoaWNoIGNhc2UgcmVwbGF5aW5nIHBhc3QgaXQgZGVjaWRlcyBhIGJyYW5jaCBvbiBhYnNlbmNlIGFuZCBwcm9kdWNlcyBhIHdyb25nXG4gKiByZXN1bHQgd2l0aCBub3RoaW5nIHRvIHNob3cgZm9yIGl0LiBGYWlsaW5nIGlzIHRoZSByZWNvdmVyYWJsZSBzaWRlIG9mIHRoYXRcbiAqIHRyYWRlLCBhbmQgdGhpcyBpcyB0aGUgd2F5IGJhY2sgb3V0IGlmIGEgZmxlZXQgdHVybnMgb3V0IHRvIGNhcnJ5IGhvbGVzIG9mXG4gKiB0aGUgZmlyc3Qga2luZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xvdEdhcENoZWNrRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX1NMT1RfR0FQX0NIRUNLICE9PSAnMCc7XG59XG5cbi8qXG4gKiBNZXJnaW5nIGludG8gYSBsb2cgYSByZXBsYXkgaXMgbWlkd2F5IHRocm91Z2ggcmVhZGluZy5cbiAqXG4gKiBUaHJlZSBwYXRocyBhZGQgZXZlbnRzIHRvIGEgbG9hZGVkIGxvZyBhZnRlciB0aGUgcmVwbGF5IGhhcyBzdGFydGVkOiBhXG4gKiBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZHMgYmFjayB0aGUgc2xvdHMgaXQgc2tpcHBlZCAoe0BsaW5rXG4gKiBtZXJnZVJlcG9ydGVkRXZlbnRzfSksIGFuIGlubGluZSBkZWx0YSBleHRlbmRzIHRoZSB0YWlsIChgYWJzb3JiQ3JlYXRlRGVsdGFgXG4gKiBpbiBgcnVudGltZS50c2ApLCBhbmQgYSBsaXN0ZWQgcGFnZSBhcHBlbmRzICh7QGxpbmsgYXBwZW5kVW5pcXVlRXZlbnRzfSkuXG4gKiBUaGV5IGxvb2sgYWxhcm1pbmcgKHRoZSByZXBsYXkgaXMgcmVhZGluZyBhbiBhcnJheSB3aGlsZSBzb21ldGhpbmcgZWxzZVxuICogd3JpdGVzIHRvIGl0KSBhbmQgdGhleSBhcmUgc2FmZSBmb3Igb25lIHJlYXNvbiB3b3J0aCBzdGF0aW5nIHBsYWlubHksIHNpbmNlXG4gKiBldmVyeSBjb3JyZWN0bmVzcyBhcmd1bWVudCBpbiB0aGlzIGZpbGUgbGVhbnMgb24gaXQuXG4gKlxuICogKipBbiBldmVudCBpbiB0aGUgbG9nIGlzIGEgZmFjdCwgYW5kIGEgbG9uZ2VyIGxvZyBjYW5ub3QgcmV0cmFjdCBvbmUuKiogVGhlXG4gKiBsb2cgaXMgYXBwZW5kLW9ubHkgYW5kIHBvc2l0aW9ucyBhcmUgbmV2ZXIgcmV1c2VkLCBzbyBhIHJlcGxheSB0aGF0IHByb2R1Y2VkXG4gKiBldmVudCBFIGZyb20gdGhlIHByZWZpeCBpdCBoYWQgbG9hZGVkIGhhcyBtYWRlIEUgdHJ1ZSBmb3IgZXZlcnkgcmVwbGF5IHRoYXRcbiAqIGZvbGxvd3MuIEEgbGF0ZXIgcmVwbGF5IHJlYWRpbmcgYSBmdWxsZXIgbG9nIGRvZXMgbm90IGdldCB0byBkZWNpZGUgRSBzaG91bGRcbiAqIG5vdCBiZSB0aGVyZTsgaXQgY29uc3VtZXMgRSBhbmQgcmVjb25jaWxlcyB0byBpdCwgd2hpY2ggaXMgd2hhdCB0aGUgZXZlbnRzXG4gKiBjb25zdW1lciBkb2VzIHdoZW4gaXQgd2Fsa3MgYSBsb2cgaG9sZGluZyB3cml0ZXMgZnJvbSBhIHJlcGxheSB0aGF0IHJhY2VkIGl0LlxuICpcbiAqIE1lcmdpbmcgaXMgdGhlcmVmb3JlIG1vbm90b25lOiBpdCBjYW4gb25seSBhZGQgZmFjdHMgdGhpcyByZXBsYXkgaGFzIHlldCB0b1xuICogcmVjb25jaWxlIHRvLCBuZXZlciByZW1vdmUgb25lIGl0IGFscmVhZHkgaGFzLiBUaGF0IGlzIHdoeSBhYnNvcmJpbmcgaXNcbiAqIGFsd2F5cyBvcHRpb25hbCBhbmQgbmV2ZXIgd3JvbmcgdG8gZGVjbGluZSAoYW4gdW5hYnNvcmJlZCBldmVudCBpcyBvbmUgdGhlXG4gKiBuZXh0IHJlYWQgcmV0dXJucyksIGFuZCB3aHkgdGhlIGd1YXJkcyBiZWxvdyBjYW4gYWZmb3JkIHRvIGJlIHN0cmljdC5cbiAqL1xuXG4vKipcbiAqIE1lcmdlIHRoZSBldmVudHMgYSBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZGVkIGJhY2sgaW50byB0aGUgbG9nIGl0IHdhc1xuICogZGVyaXZlZCBmcm9tLCBhbmQgYW5zd2VyIGhvdyBtYW55IG9mIHRoZW0gd2VyZSBuZXcuXG4gKlxuICogVW5saWtlIHtAbGluayBhcHBlbmRVbmlxdWVFdmVudHN9LCB0aGlzIHJlLXNvcnRzLiBUaGUgcmVwb3J0ZWQgZXZlbnRzIG9jY3VweVxuICogc2xvdHMgKmJlbG93KiB0aGUgd3JpdGUgdGhhdCByZXBvcnRlZCB0aGVtLCBzbyBhcHBlbmRpbmcgdGhlbSB3b3VsZCBwdXQgdGhlbVxuICogYWZ0ZXIgZXZlbnRzIHRoZXkgcHJlY2VkZS4gU29ydGluZyBieSBpZCByZXN0b3JlcyB0aGUgV29ybGQncyBjYW5vbmljYWwgb3JkZXJcbiAqIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGF0IGl0OiBhIHNsb3QgaWQgaXMgdGhhdCBvcmRlciwgd3JpdHRlbiBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSZXBvcnRlZEV2ZW50cyhcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IG51bWJlciB7XG4gIGNvbnN0IGJlZm9yZSA9IHRhcmdldC5sZW5ndGg7XG4gIGFwcGVuZFVuaXF1ZUV2ZW50cyh0YXJnZXQsIGV2ZW50cyk7XG4gIGNvbnN0IGFkZGVkID0gdGFyZ2V0Lmxlbmd0aCAtIGJlZm9yZTtcbiAgaWYgKGFkZGVkID4gMCkge1xuICAgIHRhcmdldC5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5ldmVudElkIDwgYi5ldmVudElkID8gLTEgOiBhLmV2ZW50SWQgPiBiLmV2ZW50SWQgPyAxIDogMFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGFkZGVkO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgYWJzb3JiU2tpcHBlZFNsb3RSZXBvcnR9IGRpZCB3aXRoIGEgd3JpdGUncyByZXBvcnQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNraXBwZWRTbG90UmVwb3J0IHtcbiAgLyoqIEhvdyBtYW55IG9mIHRoZSByZXBvcnRlZCBldmVudHMgd2VyZSBuZXcgdG8gdGhlIGxvZy4gWmVybyBpZiBkcm9wcGVkLiAqL1xuICBhZGRlZDogbnVtYmVyO1xuICAvKiogSG93IG1hbnkgZXZlbnRzIHRoZSByZXBvcnQgb2ZmZXJlZCwgd2hldGhlciBvciBub3QgdGhleSB3ZXJlIHRha2VuLiAqL1xuICBvZmZlcmVkOiBudW1iZXI7XG4gIC8qKiBUaGUgcmVwb3J0IHdhcyB0cnVuY2F0ZWQsIHNvIGl0IHdhcyBkcm9wcGVkIHdob2xlIGluc3RlYWQgb2YgbWVyZ2VkLiAqL1xuICB0cnVuY2F0ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQXBwbHkgYSB3cml0ZSdzIHNraXBwZWQtc2xvdCByZXBvcnQgdG8gdGhlIGxvZyBpdCB3YXMgZGVyaXZlZCBmcm9tLCBkZWNpZGluZ1xuICogd2hldGhlciB0aGUgcmVwb3J0IG1heSBiZSB0YWtlbiBhdCBhbGwuXG4gKlxuICogRXZlcnkgcmVwbGF5LWNvbnRleHQgd3JpdGUgY2FuIGNvbWUgYmFjayBjYXJyeWluZyB0aGUgZXZlbnRzIG9uIHRoZSBzbG90cyBpdFxuICogc2tpcHBlZCBvdmVyLCBhbmQgZXZlcnkgY2FsbGVyIHdhbnRzIHRoZSBzYW1lIHRoaW5nIGZyb20gdGhlbTogZm9sZCB0aGVtIGluXG4gKiBzbyB0aGUgd3JpdGVzIHRoYXQgZm9sbG93IG5hbWUgYSBwb3NpdGlvbiBhYm92ZSB0aGVtLCBhbmQgc28gdGhlIHJlcGxheVxuICogcmVzdW1pbmcgZnJvbSB0aGlzIGxvZyBzZWVzIHRoZW0gd2l0aG91dCBhIHJlbG9hZC5cbiAqXG4gKiBUaGUgb25lIHBvbGljeSBpcyB0aGF0IGEgKip0cnVuY2F0ZWQgcmVwb3J0IGlzIGRyb3BwZWQgd2hvbGUqKi4gSXQgY292ZXJzIGFcbiAqIHNwYW4gb2YgcG9zaXRpb25zIGJ1dCBjYXJyaWVzIG9ubHkgc29tZSBvZiB0aGUgZXZlbnRzIG9uIHRoZW0sIHNvIG1lcmdpbmcgaXRcbiAqIHdvdWxkIHJhaXNlIHRoZSBsb2cncyBoaWdoZXN0IHBvc2l0aW9uIHBhc3QgYSBwb3NpdGlvbiB3aG9zZSBldmVudCBpc1xuICogbWlzc2luZy4gTGF0ZXIgd3JpdGVzIHJlYWQgdGhhdCBtYXhpbXVtIHRvIHNheSB3aGF0IHRoZXkgaGF2ZSBzZWVuLCBzbyBlYWNoXG4gKiB3b3VsZCBjbGFpbSBhIHBvc2l0aW9uIGl0IG5ldmVyIHNhdywgYW5kIHRoZSBXb3JsZCBvbmx5IHJlcG9ydHMgdGhlIHNwYW4gYVxuICogd3JpdGUgc2tpcHM6IGl0IHdvdWxkIG5ldmVyIHNlbmQgdGhlIG1pc3Npbmcgb25lLiBEcm9wcGluZyBjb3N0cyBvbmUgbW9yZVxuICogcm91bmQgb2YgdGhlIHNhbWUgZXZlbnRzIG9uIHRoZSBuZXh0IHdyaXRlIGFuZCBrZWVwcyB0aGUgbG9nIGEgcHJlZml4IG9mIHRoZVxuICogdHJ1dGgsIHdoaWNoIHRoZSBub3RlIGFib3ZlIHtAbGluayBtZXJnZVJlcG9ydGVkRXZlbnRzfSBleHBsYWlucyBpcyBhbHdheXMgYW5cbiAqIGF2YWlsYWJsZSBhbnN3ZXIuXG4gKlxuICogQ2FsbGVycyB0aGF0IGxvZyBkbyBzbyBmcm9tIHRoZSByZXR1cm5lZCBjb3VudHM7IHRoZSBkZWNpc2lvbiBpcyBub3QgdGhlaXJzXG4gKiB0byByZS1kZXJpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydChcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICByZXN1bHQ6IHsgZXZlbnRzPzogcmVhZG9ubHkgRXZlbnRbXTsgaGFzTW9yZT86IGJvb2xlYW4gfVxuKTogU2tpcHBlZFNsb3RSZXBvcnQge1xuICBjb25zdCBvZmZlcmVkID0gcmVzdWx0LmV2ZW50cz8ubGVuZ3RoID8/IDA7XG4gIGlmIChvZmZlcmVkID09PSAwKSB7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IDAsIG9mZmVyZWQ6IDAsIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgfVxuICBpZiAocmVzdWx0Lmhhc01vcmUgPT09IHRydWUpIHtcbiAgICByZXR1cm4geyBhZGRlZDogMCwgb2ZmZXJlZCwgdHJ1bmNhdGVkOiB0cnVlIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhZGRlZDogbWVyZ2VSZXBvcnRlZEV2ZW50cyh0YXJnZXQsIHJlc3VsdC5ldmVudHMgPz8gW10pLFxuICAgIG9mZmVyZWQsXG4gICAgdHJ1bmNhdGVkOiBmYWxzZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBsb2FkZWQgbG9nIG9jY3VwaWVzLCBvciBgdW5kZWZpbmVkYCBmb3IgYW4gZW1wdHkgbG9nLlxuICpcbiAqIFRoZSBtYXhpbXVtLCBub3QgdGhlIGNvdW50LCBhbmQgdGhlIHR3byBhcmUgbm90IGludGVyY2hhbmdlYWJsZSBldmVuIHRob3VnaFxuICogYSBoZWFsdGh5IGxvZyBtYWtlcyB0aGVtIGVxdWFsLiBBIFdvcmxkIGhhbmRzIGEgcG9zaXRpb24gdG8gdGhlIGluc2VydCB0aGF0XG4gKiBvY2N1cGllcyBpdCwgc28gYSB3cml0ZSB0aGF0IG5ldmVyIGxhbmRzIGxlYXZlcyBubyBob2xlIGJlaGluZCBhbmQgdGhlIGxvZ1xuICogc3RheXMgZGVuc2UuIFdoYXQgdGhlIGNvdW50IGNhbm5vdCBzdXJ2aXZlIGlzIGEgKnBhcnRpYWwqIHJlYWQ6IGEgbG9nXG4gKiBhc3NlbWJsZWQgZnJvbSBhIHRydW5jYXRlZCByZXBvcnQsIG9yIHJlYWQgd2hpbGUgYSBjb25jdXJyZW50IHdyaXRlIGlzXG4gKiBjb21taXR0aW5nLCBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbi4gQ291bnRpbmcgdGhvc2VcbiAqIHdvdWxkIG1ha2UgdGhlIG5leHQgd3JpdGUgY2xhaW0gdG8gaGF2ZSBzZWVuIGxlc3MgdGhhbiBpdCBoYXMsIHNvIHRoZSBXb3JsZFxuICogd291bGQgcmVwb3J0IHRoZSBzYW1lIGV2ZW50cyBiYWNrIHRvIGl0IG9uIGV2ZXJ5IGF0dGVtcHQuXG4gKlxuICogQSBob2xlIGJlbG93IHRoZSBtYXhpbXVtIGlzIHRoZXJlZm9yZSBhIHByb3BlcnR5IG9mIHRoZSByZWFkLCBub3Qgb2YgdGhlIGxvZyxcbiAqIHdoaWNoIGlzIHdoYXQgbGV0cyB7QGxpbmsgc2V0dGxlRXZlbnRTbG90R2FwfSByZS1yZWFkIGluc3RlYWQgb2YgZ2l2aW5nIHVwLlxuICpcbiAqIEB0aHJvd3MgaWYgYW55IGV2ZW50IGlkIGNhcnJpZXMgbm8gc2xvdC4gRXZlcnkgV29ybGQgdGhlIHJ1bnRpbWUgcmVwbGF5c1xuICogYWdhaW5zdCBudW1iZXJzIGV2ZW50cyBieSBzbG90LCBzbyBhbiBpZCB0aGF0IGRvZXMgbm90IGlzIGEgYnJva2VuIGxvZyByYXRoZXJcbiAqIHRoYW4gYW4gb2xkZXIgb25lLCBhbmQgYSBtYXhpbXVtIGRlcml2ZWQgYnkgc2tpcHBpbmcgaXQgd291bGQgdW5kZXJzdGF0ZSB0aGVcbiAqIGxvZyB0byBldmVyeSB3cml0ZSB0aGF0IHJlYWRzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4RXZlbnRTbG90KGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXSk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGxldCBtYXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBzbG90ID0gcmVxdWlyZUV2ZW50U2xvdChldmVudC5ldmVudElkKTtcbiAgICBpZiAobWF4ID09PSB1bmRlZmluZWQgfHwgc2xvdCA+IG1heCkge1xuICAgICAgbWF4ID0gc2xvdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cblxuLyoqIEEgcG9zaXRpb24gdGhlIGxvZyBza2lwcyBvdmVyLCBkZXNjcmliZWQgd2VsbCBlbm91Z2ggdG8gbmFtZSBpbiBhbiBlcnJvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTbG90R2FwIHtcbiAgLyoqIFRoZSBsb3dlc3Qgc2xvdCBiZWxvdyB0aGUgbG9nJ3MgbWF4aW11bSB0aGF0IG5vIGV2ZW50IG9jY3VwaWVzLiAqL1xuICBmaXJzdE1pc3NpbmdTbG90OiBudW1iZXI7XG4gIC8qKiBIb3cgbWFueSBzbG90cyBiZWxvdyB0aGUgbWF4aW11bSBubyBldmVudCBvY2N1cGllcy4gKi9cbiAgbWlzc2luZ0NvdW50OiBudW1iZXI7XG4gIC8qKiBUaGUgaGlnaGVzdCBzbG90IHRoZSBsb2cgb2NjdXBpZXMuICovXG4gIG1heFNsb3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgaG9sZSBpbiBhIGxvYWRlZCBsb2csIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZSB0byBmaW5kLlxuICpcbiAqIFRoZSBXb3JsZCBhbGxvY2F0ZXMgZXZlcnkgcG9zaXRpb24sIHNvIGEgbG9nIHRoYXQgaG9sZHMgYG5gIGV2ZW50cyBiZWxvdyBzbG90XG4gKiBgbmAgaXMgbWlzc2luZyBvbmUuIFRoYXQgbWF0dGVycyBiZWZvcmUgYSByZXBsYXlcbiAqIGFuZCBub3doZXJlIGVsc2U6IHRoZSByZXBsYXkgcmVhZHMgdGhlIGxvZyBhcyB0aGUgY29tcGxldGUgcmVjb3JkIG9mIHdoYXQgaGFzXG4gKiBoYXBwZW5lZCwgYW5kIGFuIGFic2VudCBwb3NpdGlvbiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGV2ZW50IHRoYXRcbiAqIG5ldmVyIG9jY3VycmVkLiBUaGUgYnJhbmNoIGl0IHdvdWxkIGhhdmUgZGVjaWRlZCBnZXRzIGRlY2lkZWQgdGhlIG90aGVyIHdheSxcbiAqIGFuZCB0aGUgcnVuIGRpdmVyZ2VzIHF1aWV0bHkgcmF0aGVyIHRoYW4gZmFpbGluZy5cbiAqXG4gKiBPcmRlci1pbmRlcGVuZGVudCwgdW5saWtlIHRoZSBlcXVpdmFsZW50IGF1ZGl0IHRoZSBXb3JsZCBydW5zIG92ZXIgYSBwYWdlIGl0XG4gKiBqdXN0IHJlYWQuIEEgbG9hZGVkIGxvZyBpcyBhc3NlbWJsZWQgZnJvbSBsaXN0ZWQgcGFnZXMgcGx1cyB3aGF0ZXZlciBhXG4gKiBidW1wLWFuZC1yZXBvcnQgd3JpdGUgaGFuZGVkIGJhY2ssIGFuZCB3aGlsZSB7QGxpbmsgbWVyZ2VSZXBvcnRlZEV2ZW50c31cbiAqIHJlc3RvcmVzIGlkIG9yZGVyLCBhIGNoZWNrIHRoYXQgY2FuIGZhaWwgYSBoZWFsdGh5IHJ1biBzaG91bGQgbm90IGRlcGVuZCBvblxuICogdGhhdCBoYXZpbmcgaGFwcGVuZWQuXG4gKlxuICogVGhlIGZpcnN0IHNsb3QgaXMgbmV2ZXIgY291bnRlZC4gSXQgYmVsb25ncyB0byBgcnVuX2NyZWF0ZWRgLCB3aGljaCBgc3RhcnQoKWBcbiAqIHBvc3RzIGNvbmN1cnJlbnRseSB3aXRoIHRoZSBxdWV1ZSBzZW5kLCBzbyBhIGxvZyByZWFkIGluIHRoYXQgd2luZG93XG4gKiBsZWdpdGltYXRlbHkgYmVnaW5zIGF0IHRoZSBzZWNvbmQgc2xvdCBhbmQgZmlsbHMgaW4gb24gaXRzIG93bi4gRXZlcnkgcmVwbGF5XG4gKiB0aGF0IHJhY2VzIGEgcnVuJ3Mgb3duIHN0YXJ0IHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBob2xlLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGFuIGVtcHR5IGxvZywgd2hpY2ggaGFzIG5vIGRlbnNpdHkgdG8gY2hlY2suXG4gKlxuICogQHRocm93cyBpZiBhbnkgZXZlbnQgaWQgY2FycmllcyBubyBzbG90LCBmb3IgdGhlIHJlYXNvbiB7QGxpbmsgbWF4RXZlbnRTbG90fVxuICogZ2l2ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXZlbnRTbG90R2FwKFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IEV2ZW50U2xvdEdhcCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG9jY3VwaWVkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCBtYXhTbG90ID0gMDtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBjb25zdCBzbG90ID0gcmVxdWlyZUV2ZW50U2xvdChldmVudC5ldmVudElkKTtcbiAgICBvY2N1cGllZC5hZGQoc2xvdCk7XG4gICAgaWYgKHNsb3QgPiBtYXhTbG90KSB7XG4gICAgICBtYXhTbG90ID0gc2xvdDtcbiAgICB9XG4gIH1cbiAgaWYgKG1heFNsb3QgPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IGZsb29yID0gb2NjdXBpZWQuaGFzKEZJUlNUX0VWRU5UX1NMT1QpXG4gICAgPyBGSVJTVF9FVkVOVF9TTE9UXG4gICAgOiBGSVJTVF9FVkVOVF9TTE9UICsgMTtcbiAgLy8gRXZlcnkgc2xvdCBpcyBhdCBvciBhYm92ZSBgZmxvb3JgIGJ5IGNvbnN0cnVjdGlvbiwgc28gdGhlIGxvZyBpcyBkZW5zZVxuICAvLyBleGFjdGx5IHdoZW4gaXQgaG9sZHMgb25lIGV2ZW50IHBlciBwb3NpdGlvbiBpbiBgW2Zsb29yLCBtYXhTbG90XWAuIFRoZVxuICAvLyBzY2FuIGJlbG93IG9ubHkgcnVucyBvbmNlIHRoYXQgaGFzIGFscmVhZHkgYW5zd2VyZWQgbm8uXG4gIGlmIChvY2N1cGllZC5zaXplID09PSBtYXhTbG90IC0gZmxvb3IgKyAxKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgZmlyc3RNaXNzaW5nU2xvdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgbWlzc2luZ0NvdW50ID0gMDtcbiAgZm9yIChsZXQgc2xvdCA9IGZsb29yOyBzbG90IDw9IG1heFNsb3Q7IHNsb3QrKykge1xuICAgIGlmICghb2NjdXBpZWQuaGFzKHNsb3QpKSB7XG4gICAgICBmaXJzdE1pc3NpbmdTbG90ID8/PSBzbG90O1xuICAgICAgbWlzc2luZ0NvdW50Kys7XG4gICAgfVxuICB9XG4gIGlmIChmaXJzdE1pc3NpbmdTbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IGZpcnN0TWlzc2luZ1Nsb3QsIG1pc3NpbmdDb3VudCwgbWF4U2xvdCB9O1xufVxuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGEgZGV0ZWN0ZWQgaG9sZSBpcyByZS1yZWFkIGJlZm9yZSB0aGUgbG9nIGlzIHRha2VuIGF0IGl0c1xuICogd29yZCwgYW5kIHRoZSBiYWNrb2ZmIGJlZm9yZSBlYWNoIHJlLXJlYWQgKGRvdWJsaW5nIHBlciBhdHRlbXB0KS5cbiAqXG4gKiBBIGhvbGUgY2FuIGJlIHRyYW5zaWVudC4gVGhlIFdvcmxkIGFsbG9jYXRlcyBhIHNsb3QgaW5zaWRlIHRoZSBpbnNlcnQgdGhhdFxuICogb2NjdXBpZXMgaXQsIHNvIHR3byBjb25jdXJyZW50IHdyaXRlcnMgY2FuIGNvbGxpZGUsIG9uZSByZXRyeSBwYXN0IHRoZSBvdGhlcixcbiAqIGFuZCB0aGUgaGlnaGVyIHNsb3QgY29tbWl0IGZpcnN0LCBsZWF2aW5nIGEgd2luZG93IGluIHdoaWNoIHRoZSBsb3dlciBvbmUgaXNcbiAqIGdlbnVpbmVseSBhYnNlbnQgZnJvbSBhIHN0cm9uZ2x5LWNvbnNpc3RlbnQgcmVhZCBhbmQgZmlsbHMgaW4gYSBtb21lbnQgbGF0ZXIuXG4gKiBUaGUgd2luZG93IGlzIG9uZSBjb21taXQgd2lkZSwgc28gYSBzaG9ydCBiYWNrb2ZmIGNsZWFycyBpdDsgYW55dGhpbmcgdGhhdFxuICogc3Vydml2ZXMgYWxsIHRocmVlIHJlLXJlYWRzIGlzIGEgcG9zaXRpb24gbm8gd3JpdGUgd2lsbCBldmVyIG9jY3VweS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFMgPSAzO1xuY29uc3QgU0xPVF9HQVBfUkVDSEVDS19CQVNFX0RFTEFZX01TID0gMjU7XG5cbi8qKlxuICogUmUtcmVhZCBhIGxvZyB0aGF0IGxvb2tzIGhvbGV5IHVudGlsIHRoZSBob2xlIGZpbGxzIGluIG9yIHRoZSByZS1yZWFkcyBydW5cbiAqIG91dCwgYW5kIHJldHVybiB0aGUgc2V0dGxlZCBsb2cgYWxvbmdzaWRlIHRoZSBob2xlIHRoYXQgc3Vydml2ZWQuXG4gKlxuICogUmVhZHMgYXJlIHN0cm9uZ2x5IGNvbnNpc3RlbnQsIHNvIGEgaG9sZSBpcyBub3QgYW4gYXJ0aWZhY3Qgb2YgKndoZW4qIHRoZSBsb2dcbiAqIHdhcyByZWFkLCBidXQgaXQgY2FuIGJlIGFuIGFydGlmYWN0IG9mIGEgd3JpdGUgdGhhdCBoYWQgbm90IGNvbW1pdHRlZCB5ZXRcbiAqIChzZWUge0BsaW5rIFNMT1RfR0FQX1JFQ0hFQ0tfQVRURU1QVFN9KS4gRGlzdGluZ3Vpc2hpbmcgdGhlIHR3byBjb3N0cyBhXG4gKiByZS1yZWFkLCB3aGljaCBpcyBvbmx5IGV2ZXIgcGFpZCBieSBhIHJlcGxheSB0aGF0IGFscmVhZHkgZm91bmQgYSBob2xlLlxuICpcbiAqIFRoZSByZWxvYWQgaXMgZnVsbCByYXRoZXIgdGhhbiBpbmNyZW1lbnRhbDogdGhlIG1pc3NpbmcgcG9zaXRpb24gaXMgYmVsb3cgdGhlXG4gKiBsb2cncyBtYXhpbXVtLCBzbyBhIGN1cnNvci1hbmNob3JlZCByZWFkIHN0YXJ0cyBwYXN0IGl0IGFuZCBjYW4gbmV2ZXIgc2VlIGl0XG4gKiBhcnJpdmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR0bGVFdmVudFNsb3RHYXAoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGxvYWRlZDogTG9hZGVkRXZlbnRMb2dcbik6IFByb21pc2U8eyBsb2c6IExvYWRlZEV2ZW50TG9nOyBnYXA6IEV2ZW50U2xvdEdhcCB8IHVuZGVmaW5lZCB9PiB7XG4gIGxldCBsb2cgPSBsb2FkZWQ7XG4gIGxldCBnYXAgPSBmaW5kRXZlbnRTbG90R2FwKGxvZy5ldmVudHMpO1xuICBmb3IgKFxuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICBnYXAgIT09IHVuZGVmaW5lZCAmJiBhdHRlbXB0IDwgU0xPVF9HQVBfUkVDSEVDS19BVFRFTVBUUztcbiAgICBhdHRlbXB0KytcbiAgKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIFNMT1RfR0FQX1JFQ0hFQ0tfQkFTRV9ERUxBWV9NUyAqIDIgKiogYXR0ZW1wdClcbiAgICApO1xuICAgIGxvZyA9IGF3YWl0IGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhydW5JZCk7XG4gICAgZ2FwID0gZmluZEV2ZW50U2xvdEdhcChsb2cuZXZlbnRzKTtcbiAgfVxuICByZXR1cm4geyBsb2csIGdhcCB9O1xufVxuXG4vKipcbiAqIEhvdyBtdWNoIG9mIGl0cyBydW4ncyBsb2cgYSByZXBsYXktY29udGV4dCBldmVudCBjcmVhdGlvbiBoYWQgbG9hZGVkIHdoZW4gaXRcbiAqIGRlY2lkZWQgdG8gd3JpdGUsIGFzIHRoZSBoaWdoZXN0IHNsb3QgdGhhdCBsb2cgb2NjdXBpZXMuXG4gKlxuICogT25lIGludGVnZXIgc2F5cyBpdCBiZWNhdXNlIHRoZSBXb3JsZCBrZWVwcyBpdHMgcG9zaXRpb25zIGRlbnNlOiBhIHdyaXRlclxuICogdGhhdCBuYW1lcyBzbG90IE4gaXMgY2xhaW1pbmcgdG8gaG9sZCBldmVyeSBldmVudCBmcm9tIDEgdG8gTiBhbmQgbm90aGluZ1xuICogYWJvdmUuIFRoZSBXb3JsZCBhbnN3ZXJzIGJ5IG51bWJlcmluZyB0aGUgd3JpdGUgYWJvdmUgd2hhdGV2ZXIgdGhlIGxvZyBoYXNcbiAqIGFjdHVhbGx5IHJlYWNoZWQgYW5kIGhhbmRpbmcgYmFjayB0aGUgZXZlbnRzIG9uIHRoZSBzbG90cyBpbiBiZXR3ZWVuOiB0aGVcbiAqIG9uZXMgdGhpcyB3cml0ZXIgZGVjaWRlZCB3aXRob3V0LlxuICpcbiAqIERlbnNpdHkgaXMgdGhlIFdvcmxkJ3MgaW52YXJpYW50LCBub3QgYSBjbGFpbSBhYm91dCB0aGlzIHBhcnRpY3VsYXIgcmVhZC4gQVxuICogcmVhZGVyIHRoYXQgaXMgc2hvcnQgb2YgYSBwb3NpdGlvbiBpdCBob2xkcyBubyBldmVudCBmb3IgbmFtZXMgYSBsb3dlciBOLFxuICogd2hpY2ggdW5kZXJzdGF0ZXMgd2hhdCBpdCBoYXMgc2VlbiBhbmQgb25seSBjb3N0cyBpdCBhIHdpZGVyIHJlcG9ydC4gTmFtaW5nXG4gKiBhIHBvc2l0aW9uIGl0IGNhbm5vdCBhY2NvdW50IGZvciBpcyB0aGUgZGlyZWN0aW9uIHRoYXQgaXMgdW5zYWZlLCB3aGljaCBpc1xuICogd2h5IHtAbGluayBzbG90U25hcHNob3RQYXJhbXN9IHRha2VzIHRoZSBtYXhpbXVtIHJhdGhlciB0aGFuIHRoZSBjb3VudC5cbiAqXG4gKiBJdHMgb3duIG9iamVjdCByYXRoZXIgdGhhbiBhIGJhcmUgbnVtYmVyIHNvIGEgY2FsbCBzaXRlIGNhbm5vdCBoYWxmLXNlbmQgaXQsXG4gKiBhbmQgc28gdGhlIGVtcHR5IGNhc2Ugc3ByZWFkcyB0byBub3RoaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsb3RTbmFwc2hvdFBhcmFtcyB7XG4gIGV2ZW50Q291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHNsb3Qgc25hcHNob3QgdG8gYXR0YWNoIHRvIGEgcmVwbGF5LWNvbnRleHQgZXZlbnQgY3JlYXRpb24uXG4gKlxuICogRW1wdHkgZm9yIGFuIGVtcHR5IGxvZywgd2hpY2ggaXMgdGhlIHN0YXRlIGEgYHJ1bl9jcmVhdGVkYCB3cml0ZSBpcyBpc3N1ZWRcbiAqIGZyb206IHRoZXJlIGlzIG5vIHBvc2l0aW9uIGhlbGQgeWV0IHRvIG5hbWUuXG4gKlxuICogVGhlIG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIGxlbmd0aCwgZm9yIHRoZSByZWFzb24ge0BsaW5rIG1heEV2ZW50U2xvdH1cbiAqIGdpdmVzOiBhIHBhcnRpYWxseS1yZWFkIGxvZyBob2xkcyBmZXdlciBldmVudHMgdGhhbiBpdHMgaGlnaGVzdCBwb3NpdGlvbiwgYW5kXG4gKiBjb3VudGluZyB0aG9zZSB3b3VsZCBtYWtlIHRoZSB3cml0ZSBjbGFpbSB0byBoYXZlIHNlZW4gbGVzcyB0aGFuIGl0IGhhcywgc29cbiAqIHRoZSBXb3JsZCB3b3VsZCByZXBvcnQgdGhlIHNhbWUgZXZlbnRzIGJhY2sgb24gZXZlcnkgYXR0ZW1wdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsb3RTbmFwc2hvdFBhcmFtcyhcbiAgZXZlbnRzOiByZWFkb25seSBFdmVudFtdXG4pOiBTbG90U25hcHNob3RQYXJhbXMge1xuICBjb25zdCBldmVudENvdW50ID0gbWF4RXZlbnRTbG90KGV2ZW50cyk7XG4gIHJldHVybiBldmVudENvdW50ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZXZlbnRDb3VudCB9O1xufVxuXG4vKipcbiAqIFRoZSBldmVudHMgYSByZWplY3RpbmcgV29ybGQgYXR0YWNoZWQgdG8gYSBgUHJlY29uZGl0aW9uRmFpbGVkRXJyb3JgLCB3aGVuIGl0XG4gKiByZXR1cm5lZCB0aGUgb25lcyB0aGUgY2xpZW50J3Mgc25hcHNob3Qgd2FzIG1pc3NpbmcgaW5saW5lLlxuICpcbiAqIFJldHVybnMgYG51bGxgIGZvciBhbnl0aGluZyBlbHNlOiBubyBkZXRhaWxzLCBhIFdvcmxkIHRoYXQgZGlkIG5vdCBpbXBsZW1lbnRcbiAqIHRoaXMsIG9yIGEgcGF5bG9hZCB0aGF0IGRvZXMgbm90IG5hcnJvdyBjbGVhbmx5LiBDYWxsZXJzIGZhbGwgYmFjayB0b1xuICogcmVsb2FkaW5nIHRoZSBldmVudCBsb2csIHdoaWNoIGlzIGFsd2F5cyBjb3JyZWN0OyB0aGlzIGlzIHVudHJ1c3RlZC1zaGFwZWRcbiAqIGRhdGEgb24gYSBmYWlsdXJlIHBhdGgsIHNvIG5vdGhpbmcgaGVyZSBpcyByZXBhaXJlZC5cbiAqXG4gKiBgcnVuSWRgIGlzIHRoZSBjYWxsZXIncyBydW4uIEV2ZXJ5IGV2ZW50IG11c3QgYmVsb25nIHRvIGl0OiB0aGUgZGVsdGEgaXNcbiAqIG1lcmdlZCBzdHJhaWdodCBpbnRvIHRoZSByZXBsYXkncyBsb2csIGFuZCBvbmUgZm9yZWlnbiBldmVudCB0aGVyZSBpcyBhXG4gKiBjb3JydXB0IGxvZyByYXRoZXIgdGhhbiBhIGNvcnJlY3RlZCBvbmU6IHRoZSByZXBsYXkgd291bGQgY29uc3VtZSBhXG4gKiBjb3JyZWxhdGlvbiBpZCBmb3IgYW4gZXZlbnQgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNvbmRpdGlvbkV2ZW50RGVsdGEoXG4gIGVycm9yOiB1bmtub3duLFxuICBydW5JZDogc3RyaW5nXG4pOiB7IGV2ZW50czogRXZlbnRbXTsgY3Vyc29yOiBzdHJpbmcgfCBudWxsIH0gfCBudWxsIHtcbiAgaWYgKCFQcmVjb25kaXRpb25GYWlsZWRFcnJvci5pcyhlcnJvcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkZXRhaWxzID0gZXJyb3IuZGV0YWlscztcbiAgaWYgKHR5cGVvZiBkZXRhaWxzICE9PSAnb2JqZWN0JyB8fCBkZXRhaWxzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBldmVudHMsIGN1cnNvciB9ID0gZGV0YWlscyBhcyB7IGV2ZW50cz86IHVua25vd247IGN1cnNvcj86IHVua25vd24gfTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV2ZW50cykgfHwgZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgZXZlbnQgPT09IG51bGwgfHxcbiAgICAgIHR5cGVvZiAoZXZlbnQgYXMgeyBldmVudElkPzogdW5rbm93biB9KS5ldmVudElkICE9PSAnc3RyaW5nJyB8fFxuICAgICAgKGV2ZW50IGFzIHsgcnVuSWQ/OiB1bmtub3duIH0pLnJ1bklkICE9PSBydW5JZFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiBldmVudHMgYXMgRXZlbnRbXSxcbiAgICBjdXJzb3I6IHR5cGVvZiBjdXJzb3IgPT09ICdzdHJpbmcnID8gY3Vyc29yIDogbnVsbCxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZXMgb25lIGV2ZW50IG9uIGEgYm91bmQgcnVuLCBjYXJyeWluZyByZXBsYXktcmVjb3ZlcnkgdGVsZW1ldHJ5LiAqL1xuZXhwb3J0IHR5cGUgRXZlbnRDcmVhdG9yID0gKFxuICBkYXRhOiBDcmVhdGVFdmVudFJlcXVlc3QsXG4gIHBhcmFtcz86IENyZWF0ZUV2ZW50UGFyYW1zXG4pID0+IFByb21pc2U8RXZlbnRSZXN1bHQ+O1xuXG4vKipcbiAqIENPUlMgaGVhZGVycyBmb3IgaGVhbHRoIGNoZWNrIHJlc3BvbnNlcy5cbiAqIEFsbG93cyB0aGUgb2JzZXJ2YWJpbGl0eSBVSSB0byBjaGVjayBlbmRwb2ludCBoZWFsdGggZnJvbSBhIGRpZmZlcmVudCBvcmlnaW4uXG4gKi9cbmNvbnN0IEhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMgPSB7XG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogJ1BPU1QsIE9QVElPTlMsIEdFVCwgSEVBRCcsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogJ0NvbnRlbnQtVHlwZScsXG59O1xuXG4vKipcbiAqIFdyYXBzIGEgcmVxdWVzdC9yZXNwb25zZSBoYW5kbGVyIGFuZCBhZGRzIGEgaGVhbHRoIGNoZWNrIFwibW9kZVwiXG4gKiBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBgX19oZWFsdGhgIHF1ZXJ5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhIZWFsdGhDaGVjayhcbiAgaGFuZGxlcjogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgcmV0dXJuIGFzeW5jIChyZXE6IFJlcXVlc3QpID0+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpO1xuICAgIGNvbnN0IGlzSGVhbHRoQ2hlY2sgPSB1cmwuc2VhcmNoUGFyYW1zLmhhcygnX19oZWFsdGgnKTtcbiAgICBpZiAoaXNIZWFsdGhDaGVjaykge1xuICAgICAgLy8gSGFuZGxlIENPUlMgcHJlZmxpZ2h0IGZvciBoZWFsdGggY2hlY2tcbiAgICAgIGlmIChyZXEubWV0aG9kID09PSAnT1BUSU9OUycpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgICAgc3RhdHVzOiAyMDQsXG4gICAgICAgICAgaGVhZGVyczogSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgaGVhbHRoeTogdHJ1ZSxcbiAgICAgICAgICBlbmRwb2ludDogdXJsLnBhdGhuYW1lLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiB3b3JsZFNwZWNWZXJzaW9uID8/IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgIC4uLkhFQUxUSF9DSEVDS19DT1JTX0hFQURFUlMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgfTtcbn1cblxuLyoqIEZOVi0xYSAzMi1iaXQgaGFzaCBvZiBhIHN0cmluZywgYXMgOCBoZXggY2hhcnMuIFRpbnksIGRldGVybWluaXN0aWMsIGFuZFxuICogIGRlcGVuZGVuY3ktZnJlZS4gVXNlZCBvbmx5IHRvIHNjb3BlIGlkZW1wb3RlbmN5IGtleXMsIG5vdCBmb3Igc2VjdXJpdHkuICovXG5mdW5jdGlvbiBmbnYxYTMySGV4KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgaGFzaCA9IDB4ODExYzlkYzU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICBoYXNoIF49IHZhbHVlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCA9IE1hdGguaW11bChoYXNoLCAweDAxMDAwMTkzKTtcbiAgfVxuICByZXR1cm4gKGhhc2ggPj4+IDApLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg4LCAnMCcpO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbmN5IGtleSBmb3IgYSBzdGVwJ3MgYmFja2dyb3VuZC1kaXNwYXRjaCBxdWV1ZSBtZXNzYWdlLCBzY29wZWQgdG9cbiAqIHRoZSBzdGVwJ3MgSURFTlRJVFksIGNvcnJlbGF0aW9uIGlkIHBsdXMgKGhhc2hlZCkgc3RlcCBuYW1lLCByYXRoZXIgdGhhblxuICogdGhlIGJhcmUgY29ycmVsYXRpb24gaWQuXG4gKlxuICogVGhlIHNjb3BpbmcgbWF0dGVycyBmb3IgcmVzaWxpZW50IHN0ZXAgZGlzcGF0Y2ggdW5kZXIgdGhlIHByZWNvbmRpdGlvblxuICogZ3VhcmQ6IGEgZ3VhcmQtcmVqZWN0ZWQgYHN0ZXBfY3JlYXRlZGAgbGVhdmVzIGl0cyAocmV2b2tlZCkgc3RlcCBtZXNzYWdlIGluXG4gKiBmbGlnaHQsIGFuZCB0aGUgY29ycmVjdGVkIHJlcGxheSBtYXkgcmUtZGVyaXZlIHRoZSBzYW1lIGNvcnJlbGF0aW9uIGlkIGZvclxuICogYSBESUZGRVJFTlQgc3RlcC4gVW5kZXIgYSBiYXJlLWNvcnJlbGF0aW9uSWQga2V5IHRoZSBjb3JyZWN0ZWQgcmVwbGF5J3NcbiAqIGRpc3BhdGNoIHdvdWxkIHNpbGVudGx5IGRlZHVwZSBhZ2FpbnN0IHRoZSByZXZva2VkIGluLWZsaWdodCBtZXNzYWdlLFxuICogd2hpY2ggdGhlbiByZXNvbHZlcyBgc2tpcHBlZGAgYWdhaW5zdCB0aGUgcmUtY3JlYXRlZCBlbnRpdHkgKHRoZSBzZXJ2ZXInc1xuICogc3RlcE5hbWUgZmVuY2UgcmVqZWN0cyBpdHMgYmFyZSBzdGFydCksIGFuZCB0aGUgbGVnaXRpbWF0ZSBzdGVwIHdvdWxkXG4gKiBuZXZlciBiZSBleGVjdXRlZC4gU2NvcGluZyBieSBzdGVwIG5hbWUga2VlcHMgZXZlcnkgZGVkdXAgcHJvcGVydHkgdGhhdFxuICogbWF0dGVycyAoY3Jhc2ggcmVjb3ZlcnkgcmUtZGlzcGF0Y2gsIGNvbmN1cnJlbnQgaGFuZGxlcnMsIHRoZSBkZWxheWVkXG4gKiByZXRyeSBzaGFyaW5nIHRoZSBzdXNwZW5zaW9uIHJlLWRpc3BhdGNoJ3Mga2V5OiBhbGwgbmFtZSB0aGUgc2FtZSBzdGVwKVxuICogd2hpbGUgbGV0dGluZyB0aGUgY29ycmVjdGVkIHNjaGVkdWxlJ3MgZGlzcGF0Y2ggdGhyb3VnaC5cbiAqXG4gKiBFdmVyeSBwcm9kdWNlciBvZiBhIHN0ZXAtZGlzcGF0Y2ggKG9yIHN0ZXAtcmV0cnkpIG1lc3NhZ2UgbXVzdCB1c2UgdGhpc1xuICoga2V5LiBDcm9zcy12ZXJzaW9uIG1peGluZyBpcyBub3QgYSBjb25jZXJuOiBxdWV1ZSBtZXNzYWdlcyBhcmUgcGlubmVkIHRvXG4gKiB0aGUgZGVwbG95bWVudCB0aGF0IHByb2R1Y2VkIHRoZW0sIHNvIG9uZSBydW4gbmV2ZXIgc2VlcyB0d28ga2V5IHNjaGVtZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwRGlzcGF0Y2hJZGVtcG90ZW5jeUtleShcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nLFxuICBzdGVwTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Y29ycmVsYXRpb25JZH06JHtmbnYxYTMySGV4KHN0ZXBOYW1lKX1gO1xufVxuXG4vKipcbiAqIFF1ZXVlcyBhIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZCBxdWV1ZSB3aXRoIHRyYWNpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWV1ZU1lc3NhZ2UoXG4gIHdvcmxkOiBXb3JsZCxcbiAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2Ygd29ybGQucXVldWU+XG4pIHtcbiAgY29uc3QgcXVldWVOYW1lID0gYXJnc1swXTtcbiAgYXdhaXQgdHJhY2UoXG4gICAgJ3F1ZXVlLnB1Ymxpc2gnLFxuICAgIHtcbiAgICAgIC8vIFN0YW5kYXJkIE9URUwgbWVzc2FnaW5nIGNvbnZlbnRpb25zXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKHF1ZXVlTmFtZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdPcGVyYXRpb25UeXBlKCdwdWJsaXNoJyksXG4gICAgICAgIC8vIFBlZXIgc2VydmljZSBmb3IgRGF0YWRvZyBzZXJ2aWNlIG1hcHNcbiAgICAgICAgLi4uQXR0cmlidXRlLlBlZXJTZXJ2aWNlKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5ScGNTZXJ2aWNlKCd2cXMnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY01ldGhvZCgncHVibGlzaCcpLFxuICAgICAgfSxcbiAgICAgIGtpbmQ6IGF3YWl0IGdldFNwYW5LaW5kKCdQUk9EVUNFUicpLFxuICAgIH0sXG4gICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHsgbWVzc2FnZUlkIH0gPSBhd2FpdCB3b3JsZC5xdWV1ZSguLi5hcmdzKTtcbiAgICAgIGlmIChtZXNzYWdlSWQpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGUuTWVzc2FnaW5nTWVzc2FnZUlkKG1lc3NhZ2VJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBxdWV1ZSBvdmVyaGVhZCB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgYSBnaXZlbiBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVldWVPdmVyaGVhZChtZXNzYWdlOiB7IHJlcXVlc3RlZEF0PzogRGF0ZSB9KSB7XG4gIGlmICghbWVzc2FnZS5yZXF1ZXN0ZWRBdCkgcmV0dXJuO1xuICB0cnkge1xuICAgIHJldHVybiBBdHRyaWJ1dGUuUXVldWVPdmVyaGVhZE1zKFxuICAgICAgRGF0ZS5ub3coKSAtIG1lc3NhZ2UucmVxdWVzdGVkQXQuZ2V0VGltZSgpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgcnVuJ3MgZnVsbCBwYXlsb2FkLWVuY3J5cHRpb24gY2FwYWJpbGl0eS4gVGhpcyBpbmNsdWRlcyB0aGVcbiAqIHN5bW1ldHJpYyBrZXkgYW5kIFgyNTUxOSBrZXlwYWlyIG5lZWRlZCB0byBvcGVuIGNyb3NzLXJ1biBzZWFsZWQgcGF5bG9hZHMuXG4gKiBNaXNzaW5nIHdvcmxkIHN1cHBvcnQgb3Iga2V5IG1hdGVyaWFsIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgOyBsb29rdXAgYW5kXG4gKiBkZXJpdmF0aW9uIGZhaWx1cmVzIHByb3BhZ2F0ZSByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWxsaW5nIGJhY2sgdG8gcGxhaW50ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmcsXG4gIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJhd0tleSA9XG4gICAgdHlwZW9mIHJ1bk9ySWQgPT09ICdzdHJpbmcnXG4gICAgICA/IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkLCBjb250ZXh0KVxuICAgICAgOiBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4ocnVuT3JJZCk7XG4gIHJldHVybiByYXdLZXkgPyBhd2FpdCBkZXJpdmVSdW5QYXlsb2FkS2V5cyhyYXdLZXkpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGxhenksIG1lbW9pemVkIGFjY2Vzc29yIGFyb3VuZCB7QGxpbmsgcmVzb2x2ZVJ1bkVuY3J5cHRpb25LZXl9LlxuICogQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIHRoZSBzYW1lIHByb21pc2UsIGluY2x1ZGluZyBpdHMgcmVqZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZUVuY3J5cHRpb25LZXkoXG4gIHdvcmxkOiBXb3JsZCxcbiAgcnVuT3JJZDogV29ya2Zsb3dSdW4gfCBzdHJpbmdcbik6ICgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4ge1xuICBsZXQgY2FjaGVkOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjYWNoZWQgPSByZXNvbHZlUnVuRW5jcnlwdGlvbktleSh3b3JsZCwgcnVuT3JJZCk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWQ7XG4gIH07XG59XG4iXX0=
|
|
898
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFXMUIsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxJQUFJLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRCx3REFBd0Q7QUFDeEQsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLENBQUM7QUFFNUM7Ozs7R0FJRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsc0JBQXNCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsWUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxD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RUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QixDQUMzQyxLQUFZLEVBQ1osT0FBNkIsRUFDN0IsT0FBaUM7SUFFakMsTUFBTSxNQUFNLEdBQ1YsT0FBTyxPQUFPLEtBQUssUUFBUTtRQUN6QixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsS0FBWSxFQUNaLE9BQTZCO0lBRTdCLElBQUksTUFBbUQsQ0FBQztJQUN4RCxPQUFPLEdBQUcsRUFBRTtRQUNWLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQcmVjb25kaXRpb25GYWlsZWRFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBDcmVhdGVFdmVudFBhcmFtcyxcbiAgQ3JlYXRlRXZlbnRSZXF1ZXN0LFxuICBFdmVudCxcbiAgRXZlbnRSZXN1bHQsXG4gIEhlYWx0aENoZWNrUGF5bG9hZCxcbiAgVmFsaWRRdWV1ZU5hbWUsXG4gIFdvcmtmbG93UnVuLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIEZJUlNUX0VWRU5UX1NMT1QsXG4gIGdldFF1ZXVlVG9waWNQcmVmaXgsXG4gIEhlYWx0aENoZWNrUGF5bG9hZFNjaGVtYSxcbiAgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgcmVxdWlyZUV2ZW50U2xvdCxcbiAgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlLFxuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX0xFR0FDWSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgYnl0ZXNUb0Jhc2U2NCwgZGVyaXZlUnVuS2V5UGFpciB9IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHtcbiAgZGVyaXZlUnVuUGF5bG9hZEtleXMsXG4gIHR5cGUgUGF5bG9hZEtleSxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0U3BhbktpbmQsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5cbi8qKiBEZWZhdWx0IHRpbWVvdXQgZm9yIGhlYWx0aCBjaGVja3MgaW4gbWlsbGlzZWNvbmRzICovXG5jb25zdCBERUZBVUxUX0hFQUxUSF9DSEVDS19USU1FT1VUID0gMzBfMDAwO1xuXG4vKipcbiAqIFBhdHRlcm4gZm9yIHNhZmUgd29ya2Zsb3cgbmFtZXMuIE9ubHkgYWxsb3dzIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLFxuICogdW5kZXJzY29yZXMsIGh5cGhlbnMsIGRvdHMsIGZvcndhcmQgc2xhc2hlcyAoZm9yIG5hbWVzcGFjZWQgd29ya2Zsb3dzKSxcbiAqIGFuZCBhdCBzaWducyAoZm9yIHNjb3BlZCBwYWNrYWdlcykuXG4gKi9cbmNvbnN0IFNBRkVfV09SS0ZMT1dfTkFNRV9QQVRURVJOID0gL15bYS16QS1aMC05X1xcLS4vQF0rJC87XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgd29ya2Zsb3cgbmFtZSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBxdWV1ZSBuYW1lLlxuICogRW5zdXJlcyB0aGUgd29ya2Zsb3cgbmFtZSBvbmx5IGNvbnRhaW5zIHNhZmUgY2hhcmFjdGVycyBiZWZvcmVcbiAqIGludGVycG9sYXRpbmcgaXQgaW50byB0aGUgcXVldWUgbmFtZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1F1ZXVlTmFtZShcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmcsXG4gIG5hbWVzcGFjZT86IHN0cmluZ1xuKTogVmFsaWRRdWV1ZU5hbWUge1xuICBpZiAoIVNBRkVfV09SS0ZMT1dfTkFNRV9QQVRURVJOLnRlc3Qod29ya2Zsb3dOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHdvcmtmbG93IG5hbWUgXCIke3dvcmtmbG93TmFtZX1cIjogbXVzdCBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIHVuZGVyc2NvcmVzLCBoeXBoZW5zLCBkb3RzLCBmb3J3YXJkIHNsYXNoZXMsIG9yIGF0IHNpZ25zYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJlZml4ID0gZ2V0UXVldWVUb3BpY1ByZWZpeChcbiAgICAnd29ya2Zsb3cnLFxuICAgIHJlc29sdmVRdWV1ZU5hbWVzcGFjZShuYW1lc3BhY2UpXG4gICk7XG4gIHJldHVybiBgJHtwcmVmaXh9JHt3b3JrZmxvd05hbWV9YCBhcyBWYWxpZFF1ZXVlTmFtZTtcbn1cblxuY29uc3QgZ2VuZXJhdGVJZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHJlYW0gbmFtZSBmb3IgYSBoZWFsdGggY2hlY2sgd2l0aCB0aGUgZ2l2ZW4gY29ycmVsYXRpb24gSUQuXG4gKi9cbmZ1bmN0aW9uIGdldEhlYWx0aENoZWNrU3RyZWFtTmFtZShjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYF9faGVhbHRoX2NoZWNrX18ke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBoZWFsdGggY2hlY2sgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrUmVzdWx0IHtcbiAgaGVhbHRoeTogYm9vbGVhbjtcbiAgLyoqIEVycm9yIG1lc3NhZ2UgaWYgaGVhbHRoIGNoZWNrIGZhaWxlZCAqL1xuICBlcnJvcj86IHN0cmluZztcbiAgLyoqIExhdGVuY3kgaWYgdGhlIGhlYWx0aCBjaGVjayB3YXMgc3VjY2Vzc2Z1bCAqL1xuICBsYXRlbmN5TXM/OiBudW1iZXI7XG4gIC8qKiBTcGVjIHZlcnNpb24gb2YgdGhlIHJlc3BvbmRpbmcgZGVwbG95bWVudCAqL1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbiBvZiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50LCB1c2VkIGZvclxuICAgKiBjYXBhYmlsaXR5IGRldGVjdGlvbiAoc2VlIGBnZXRSdW5DYXBhYmlsaXRpZXNgKS4gT21pdHRlZCB3aGVuIHRoZVxuICAgKiByZXNwb25kaW5nIGRlcGxveW1lbnQgZGlkIG5vdCBwcm92aWRlIHRoZSBmaWVsZCBhcyBhIHN0cmluZzpcbiAgICogZm9yIGV4YW1wbGUsIGFuIG9sZGVyIGBAd29ya2Zsb3cvY29yZWAgdGhhdCBwcmVkYXRlcyB0aGlzIGZpZWxkLFxuICAgKiBvciBhIG5vbi1KU09OIHBsYWluLXRleHQgaGVhbHRoIHJlc3BvbnNlLlxuICAgKi9cbiAgd29ya2Zsb3dDb3JlVmVyc2lvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgcnVuJ3MgWDI1NTE5IHB1YmxpYyBrZXkgKGJhc2U2NCksIHJldHVybmVkIG9ubHkgd2hlbiB0aGUgcHJvYmVcbiAgICogY2FycmllZCBhIGBydW5JZGAgYW5kIHRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQgaGFzIGVuY3J5cHRpb24gZW5hYmxlZC5cbiAgICpcbiAgICogTGV0cyBhIGNyb3NzLWRlcGxveW1lbnQgYHN0YXJ0KClgIHNlYWwgdGhlIHdvcmtmbG93IGFyZ3VtZW50cyB1c2luZyBhXG4gICAqIHJlc3BvbnNlIGl0IHdhcyBhbHJlYWR5IHdhaXRpbmcgb24sIGluc3RlYWQgb2YgbWFraW5nIGEgc2VwYXJhdGVcbiAgICoga2V5LWxvb2t1cCByZXF1ZXN0LlxuICAgKi9cbiAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZXNwb25kaW5nIGRlcGxveW1lbnQncyBgSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTmA6IHRoZSBwcm90b2NvbFxuICAgKiB2ZXJzaW9uIGF0IHdoaWNoIHRoZSAqY29uc3VtZXIqIChxdWV1ZS1tZXNzYWdlIHRhcmdldCkgbWF0ZXJpYWxpemVzIHRoZVxuICAgKiBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSBgaG9va0lucHV0YCBvbiByZXBsYXkuIEEgY3Jvc3MtZGVwbG95bWVudFxuICAgKiBgc3RhcnQoKWAgc3RhbXBzIHRoZSAqdGFyZ2V0J3MqIHZhbHVlIChub3QgdGhlIGNhbGxlcidzKSBpbnRvIHRoZSBuZXdcbiAgICogcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHQuaG9va1Jlc3VtZUlucHV0VmVyc2lvbmAuIEN1cnJlbnQgcHJvZHVjZXJzIHdyaXRlXG4gICAqIHRoZSBldmVudCBkdXJhYmx5IGJlZm9yZSBwdWJsaXNoaW5nIHRoZSB3YWtlIGFuZCBkbyBub3QgcmVhZCB0aGUgbWFya2VyO1xuICAgKiBPTERFUiBwcm9kdWNlcnMgc3RpbGwgZ2F0ZSB0aGVpciBsYXp5IHBhdGggb24gaXQsIHNvIGl0IGtlZXBzIGJlaW5nXG4gICAqIHN0YW1wZWQuIE9taXR0ZWQgd2hlbiB0aGUgcmVzcG9uZGluZyBkZXBsb3ltZW50IHByZWRhdGVzIHRoaXMgZmllbGQsXG4gICAqIHdoaWNoIGZhaWxzIHRoYXQgZ2F0ZSBjbG9zZWQuXG4gICAqL1xuICBob29rUmVzdW1lSW5wdXRWZXJzaW9uPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSBpcyBhIGhlYWx0aCBjaGVjayBwYXlsb2FkLlxuICogSWYgc28sIHJldHVybnMgdGhlIHBhcnNlZCBwYXlsb2FkLiBPdGhlcndpc2UgcmV0dXJucyB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhlYWx0aENoZWNrUGF5bG9hZChcbiAgbWVzc2FnZTogdW5rbm93blxuKTogSGVhbHRoQ2hlY2tQYXlsb2FkIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzdWx0ID0gSGVhbHRoQ2hlY2tQYXlsb2FkU2NoZW1hLnNhZmVQYXJzZShtZXNzYWdlKTtcbiAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgZGV0ZXJtaW5pc3RpYyBmYWtlIHJ1bklkIGZvciBoZWFsdGggY2hlY2sgc3RyZWFtcy5cbiAqIEJvdGggdGhlIHdyaXRlciAoaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlKSBhbmQgcmVhZGVyIChoZWFsdGhDaGVjaykgZGVyaXZlXG4gKiB0aGUgc2FtZSBydW5JZCBmcm9tIHRoZSBjb3JyZWxhdGlvbklkIHNvIHRoYXQgaW1wbGVtZW50YXRpb25zIHRoYXQgc2NvcGVcbiAqIHN0cmVhbSByZWFkcyBieSBydW5JZCBzdGlsbCB3b3JrIGNvcnJlY3RseS5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVIZWFsdGhDaGVja1J1bklkKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd3J1bl9oY18ke2NvcnJlbGF0aW9uSWR9YDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2UgYnkgd3JpdGluZyB0aGUgcmVzdWx0IHRvIHRoZSB3b3JsZCdzIHN0cmVhbS5cbiAqIFRoZSBjYWxsZXIgY2FuIGxpc3RlbiB0byB0aGlzIHN0cmVhbSB0byBnZXQgdGhlIGhlYWx0aCBjaGVjayByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0gaGVhbHRoQ2hlY2sgLSBUaGUgcGFyc2VkIGhlYWx0aCBjaGVjayBwYXlsb2FkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gIGhlYWx0aENoZWNrOiBIZWFsdGhDaGVja1BheWxvYWQsXG4gIHdvcmxkU3BlY1ZlcnNpb24/OiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCBzdHJlYW1OYW1lID0gZ2V0SGVhbHRoQ2hlY2tTdHJlYW1OYW1lKGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQpO1xuXG4gIC8vIFdoZW4gdGhlIHByb2JlIG5hbWVzIGEgcnVuIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gY3JlYXRlLCBwdWJsaXNoIHRoYXRcbiAgLy8gcnVuJ3MgcHVibGljIGtleS4gV2UgYXJlIGV4ZWN1dGluZyBpbnNpZGUgdGhlIHRhcmdldCBkZXBsb3ltZW50LCBzbyBpdHNcbiAgLy8ga2V5IG1hdGVyaWFsIGlzIGF2YWlsYWJsZSBsb2NhbGx5IChubyBBUEkgY2FsbCksIGFuZCB0aGUgY2FsbGVyIGNhbiB0aGVuXG4gIC8vIHNlYWwgdGhlIHdvcmtmbG93IGFyZ3VtZW50cyBzdHJhaWdodCBmcm9tIHRoaXMgcmVzcG9uc2UgcmF0aGVyIHRoYW5cbiAgLy8gbWFraW5nIGEgc2VwYXJhdGUga2V5LWxvb2t1cCByZXF1ZXN0LlxuICAvL1xuICAvLyBPbmx5IGEgKnB1YmxpYyoga2V5IG1heSB0cmF2ZWwgdGhpcyB3YXk6IHRoZSBwcm9iZSByZXNwb25zZSBzdHJlYW0gaXNcbiAgLy8gZGVsaWJlcmF0ZWx5IHVuYXV0aGVudGljYXRlZCwgc28gYW55dGhpbmcgc2VjcmV0IHdvdWxkIGJlIGV4cG9zZWQuXG4gIC8vIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaGVyZSBtdXN0IG5vdCBmYWlsIHRoZSBoZWFsdGggY2hlY2sgaXRzZWxmLCB3aGljaFxuICAvLyBjYWxsZXJzIGFsc28gcmVseSBvbiBmb3IgcGxhaW4gY2FwYWJpbGl0eSBkZXRlY3Rpb24uXG4gIGxldCBlbmNyeXB0aW9uUHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChoZWFsdGhDaGVjay5ydW5JZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdLZXkgPSBhd2FpdCB3b3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuPy4oaGVhbHRoQ2hlY2sucnVuSWQpO1xuICAgICAgaWYgKHJhd0tleSkge1xuICAgICAgICBlbmNyeXB0aW9uUHVibGljS2V5ID0gYnl0ZXNUb0Jhc2U2NChcbiAgICAgICAgICAoYXdhaXQgZGVyaXZlUnVuS2V5UGFpcihyYXdLZXkpKS5wdWJsaWNLZXlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ0hlYWx0aCBjaGVjayBjb3VsZCBub3QgZGVyaXZlIGEgcnVuIHB1YmxpYyBrZXk7IHRoZSBjYWxsZXIgd2lsbCBmYWxsIGJhY2sgdG8gYSBrZXkgbG9va3VwJyxcbiAgICAgICAge1xuICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBoZWFsdGh5OiB0cnVlLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGhlYWx0aENoZWNrLmNvcnJlbGF0aW9uSWQsXG4gICAgc3BlY1ZlcnNpb246IHdvcmxkU3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAvLyBXZSBhcmUgZXhlY3V0aW5nIGluc2lkZSB0aGUgdGFyZ2V0IGRlcGxveW1lbnQsIHNvIHRoaXMgY29uc3RhbnQgcmVmbGVjdHNcbiAgICAvLyB0aGUgKmNvbnN1bWVyJ3MqIGhvb2stcmVzdW1lIHByb3RvY29sIHZlcnNpb24sIGV4YWN0bHkgd2hhdCBhXG4gICAgLy8gY3Jvc3MtZGVwbG95bWVudCBjYWxsZXIgbmVlZHMgdG8gZ2F0ZSBpdHMgcGFyYWxsZWwgcmVzdW1lIHBhdGggb24uXG4gICAgaG9va1Jlc3VtZUlucHV0VmVyc2lvbjogSE9PS19SRVNVTUVfSU5QVVRfVkVSU0lPTixcbiAgICAuLi4oZW5jcnlwdGlvblB1YmxpY0tleSA/IHsgZW5jcnlwdGlvblB1YmxpY0tleSB9IDoge30pLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgfSk7XG4gIC8vIFVzZSBhIGRldGVybWluaXN0aWMgZmFrZSBydW5JZCBkZXJpdmVkIGZyb20gdGhlIGNvcnJlbGF0aW9uSWQgc28gdGhhdFxuICAvLyB0aGUgcmVhZGVyIHNpZGUgcHJvZHVjZXMgdGhlIHNhbWUgdmFsdWUuXG4gIGNvbnN0IGZha2VSdW5JZCA9IGdlbmVyYXRlSGVhbHRoQ2hlY2tSdW5JZChoZWFsdGhDaGVjay5jb3JyZWxhdGlvbklkKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy53cml0ZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUsIHJlc3BvbnNlKTtcbiAgYXdhaXQgd29ybGQuc3RyZWFtcy5jbG9zZShmYWtlUnVuSWQsIHN0cmVhbU5hbWUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aENoZWNrT3B0aW9ucyB7XG4gIC8qKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBoZWFsdGggY2hlY2sgcmVzcG9uc2UuIERlZmF1bHQ6IDMwMDAwICgzMHMpICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBEZXBsb3ltZW50IElEIHRvIHNlbmQgdGhlIGhlYWx0aCBjaGVjayB0by4gRmFsbHMgYmFjayB0byBwcm9jZXNzLmVudi5WRVJDRUxfREVQTE9ZTUVOVF9JRC4gKi9cbiAgZGVwbG95bWVudElkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBpZCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGNyZWF0ZS4gV2hlbiBzZXQsIHRoZSByZXNwb25kaW5nXG4gICAqIGRlcGxveW1lbnQgZGVyaXZlcyB0aGF0IHJ1bidzIHB1YmxpYyBrZXkgbG9jYWxseSBhbmQgcmV0dXJucyBpdCBhc1xuICAgKiBgZW5jcnlwdGlvblB1YmxpY0tleWAsIGxldHRpbmcgYSBjcm9zcy1kZXBsb3ltZW50IGBzdGFydCgpYCBzZWFsIHRoZVxuICAgKiB3b3JrZmxvdyBhcmd1bWVudHMgd2l0aG91dCBhIHNlcGFyYXRlIGtleSBsb29rdXAuXG4gICAqL1xuICBydW5JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgdGFyZ2V0IGRlcGxveW1lbnQgKGUuZy4gYCdldmUnYCBmb3IgdG9waWNzIGxpa2VcbiAgICogYF9fZXZlX3drZl93b3JrZmxvd18qYCkuIEZhbGxzIGJhY2sgdG8gYFdPUktGTE9XX1FVRVVFX05BTUVTUEFDRWAgaW4gdGhlXG4gICAqIGNhbGxpbmcgcHJvY2Vzcy4gQ3Jvc3MtY29udGV4dCBjYWxsZXJzIChlLmcuIHRoZSBvYnNlcnZhYmlsaXR5XG4gICAqIGRhc2hib2FyZCkgbXVzdCBwYXNzIHRoZSB0YXJnZXQgZGVwbG95bWVudCdzIG5hbWVzcGFjZSBleHBsaWNpdGx5OlxuICAgKiB0aGUgZW52IGZhbGxiYWNrIHJlc29sdmVzIGluIHRoZSBjYWxsZXIncyBwcm9jZXNzLCBhbmQgYSBtZXNzYWdlXG4gICAqIHB1Ymxpc2hlZCB0byBhIG1pc21hdGNoZWQgdG9waWMgaGFzIG5vIGNvbnN1bWVyLCBzbyB0aGUgY2hlY2sgd291bGRcbiAgICogYWx3YXlzIHRpbWUgb3V0LlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGEgaGVhbHRoIGNoZWNrIGJ5IHNlbmRpbmcgYSBtZXNzYWdlIHRocm91Z2ggdGhlIHF1ZXVlIHBpcGVsaW5lXG4gKiBhbmQgdmVyaWZ5aW5nIGl0IGlzIHByb2Nlc3NlZCBieSB0aGUgY29tYmluZWQgd29ya2Zsb3cgZW5kcG9pbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBEZXBsb3ltZW50IFByb3RlY3Rpb24gb24gVmVyY2VsIGJlY2F1c2UgaXQgZ29lc1xuICogdGhyb3VnaCB0aGUgcXVldWUgaW5mcmFzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gZGlyZWN0IEhUVFAuXG4gKlxuICogQHBhcmFtIHdvcmxkIC0gVGhlIFdvcmxkIGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIGhlYWx0aCBjaGVja1xuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgaGVhbHRoIGNoZWNrXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBoZWFsdGggY2hlY2sgcmVzdWx0XG4gKi9cbi8vIFBvbGwgaW50ZXJ2YWwgZm9yIGhlYWx0aCBjaGVjayByZXRyaWVzIChtcylcbmNvbnN0IEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMID0gMTAwO1xuLy8gUGVyLXJlYWQgdGltZW91dCB0byBwcmV2ZW50IGJsb2NraW5nIGZvcmV2ZXIgb24gbG9jYWwgd29ybGQncyBFdmVudEVtaXR0ZXJcbi8vICh3aGljaCBkb2Vzbid0IHdvcmsgYWNyb3NzIHByb2Nlc3NlcylcbmNvbnN0IEhFQUxUSF9DSEVDS19SRUFEX1RJTUVPVVQgPSA1MDA7XG5cbi8qKlxuICogUmVhZCBjaHVua3MgZnJvbSBhIHN0cmVhbSB3aXRoIGEgdGltZW91dCBwZXIgcmVhZCBvcGVyYXRpb24uXG4gKiBSZXR1cm5zIHsgY2h1bmtzLCB0aW1lZE91dCB9IHdoZXJlIHRpbWVkT3V0IGluZGljYXRlcyBpZiBhIHJlYWQgdGltZWQgb3V0LlxuICovXG4vKipcbiAqIFJhY2UgYSBwcm9taXNlIGFnYWluc3QgYSBkZWFkbGluZS4gUmVqZWN0cyB3aXRoIGEgdGltZW91dCBlcnJvciB3aGVuIHRoZVxuICogZGVhZGxpbmUgZWxhcHNlcyBmaXJzdC4gVXNlZCB0byBib3VuZCBgd29ybGQuc3RyZWFtcy5nZXQoKWAgaW5zaWRlIHRoZVxuICogaGVhbHRoLWNoZWNrIHBvbGwgbG9vcDogc29tZSB3b3JsZHMgaG9sZCB0aGF0IHJlcXVlc3Qgb3BlbiB1bnRpbCB0aGVcbiAqIHN0cmVhbSBoYXMgZGF0YSAoZS5nLiB3b3JrZmxvdy1zZXJ2ZXIgaG9sZHMgdW53cml0dGVuIHN0cmVhbXMgb3BlbiBmb3JcbiAqIH4yIG1pbnV0ZXMpLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmxvdyB0aHJvdWdoIHRoZSBjb25maWd1cmVkIGhlYWx0aFxuICogY2hlY2sgdGltZW91dCwgc2luY2UgdGhlIGB3aGlsZWAgY29uZGl0aW9uIGlzIG9ubHkgcmUtY2hlY2tlZCBiZXR3ZWVuXG4gKiBpdGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiB3aXRoRGVhZGxpbmU8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgbXM6IG51bWJlcik6IFByb21pc2U8VD4ge1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcbiAgICBwcm9taXNlLFxuICAgIG5ldyBQcm9taXNlPG5ldmVyPigoXywgcmVqZWN0KSA9PiB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IHJlamVjdChuZXcgRXJyb3IoYE9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHttc31tc2ApKSxcbiAgICAgICAgbXNcbiAgICAgICk7XG4gICAgfSksXG4gIF0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVyKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW1XaXRoVGltZW91dChcbiAgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXI8VWludDhBcnJheT4sXG4gIHJlYWRUaW1lb3V0OiBudW1iZXJcbik6IFByb21pc2U8eyBjaHVua3M6IFVpbnQ4QXJyYXlbXTsgdGltZWRPdXQ6IGJvb2xlYW4gfT4ge1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICBsZXQgdGltZWRPdXQgPSBmYWxzZTtcblxuICB3aGlsZSAoIWRvbmUgJiYgIXRpbWVkT3V0KSB7XG4gICAgY29uc3QgcmVhZFByb21pc2UgPSByZWFkZXIucmVhZCgpO1xuICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8eyBkb25lOiB0cnVlOyB2YWx1ZTogdW5kZWZpbmVkIH0+KFxuICAgICAgKHJlc29sdmUpID0+XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfSwgcmVhZFRpbWVvdXQpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbcmVhZFByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgZG9uZSA9IHJlc3VsdC5kb25lO1xuICAgIGlmIChyZXN1bHQudmFsdWUpIGNodW5rcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gIH1cblxuICByZXR1cm4geyBjaHVua3MsIHRpbWVkT3V0IH07XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHZhbGlkYXRlIGEgaGVhbHRoIGNoZWNrIHJlc3BvbnNlIGZyb20gc3RyZWFtIGNodW5rcy5cbiAqIFJldHVybnMgdGhlIHBhcnNlZCByZXNwb25zZSBvciBudWxsIGlmIGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGVhbHRoQ2hlY2tSZXNwb25zZShjaHVua3M6IFVpbnQ4QXJyYXlbXSk6IHtcbiAgaGVhbHRoeTogYm9vbGVhbjtcbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG4gIHdvcmtmbG93Q29yZVZlcnNpb24/OiBzdHJpbmc7XG4gIGVuY3J5cHRpb25QdWJsaWNLZXk/OiBzdHJpbmc7XG59IHwgbnVsbCB7XG4gIGlmIChjaHVua3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0b3RhbExlbmd0aCA9IGNodW5rcy5yZWR1Y2UoKHN1bSwgY2h1bmspID0+IHN1bSArIGNodW5rLmxlbmd0aCwgMCk7XG4gIGNvbnN0IGNvbWJpbmVkID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBjb21iaW5lZC5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuICBjb25zdCByZXNwb25zZVRleHQgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoY29tYmluZWQpO1xuXG4gIGxldCByZXNwb25zZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gT2xkIGRlcGxveW1lbnRzIChzcGVjVmVyc2lvbiA8IDMpIHJldHVybiBwbGFpbiB0ZXh0IGxpa2VcbiAgICAvLyAnV29ya2Zsb3cgU0RLIFwiLi4uXCIgZW5kcG9pbnQgaXMgaGVhbHRoeScuIFRyZWF0IGFueSBub24tZW1wdHlcbiAgICAvLyB0ZXh0IHJlc3BvbnNlIGFzIGEgaGVhbHRoeSBkZXBsb3ltZW50IHdpdGggdW5rbm93biBzcGVjVmVyc2lvbi5cbiAgICBpZiAocmVzcG9uc2VUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7IGhlYWx0aHk6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHJlc3BvbnNlICE9PSAnb2JqZWN0JyB8fFxuICAgIHJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgISgnaGVhbHRoeScgaW4gcmVzcG9uc2UpIHx8XG4gICAgdHlwZW9mIChyZXNwb25zZSBhcyB7IGhlYWx0aHk6IHVua25vd24gfSkuaGVhbHRoeSAhPT0gJ2Jvb2xlYW4nXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgciA9IHJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBwYXJzZWQ6IHtcbiAgICBoZWFsdGh5OiBib29sZWFuO1xuICAgIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xuICAgIHdvcmtmbG93Q29yZVZlcnNpb24/OiBzdHJpbmc7XG4gICAgZW5jcnlwdGlvblB1YmxpY0tleT86IHN0cmluZztcbiAgICBob29rUmVzdW1lSW5wdXRWZXJzaW9uPzogbnVtYmVyO1xuICB9ID0ge1xuICAgIGhlYWx0aHk6IHIuaGVhbHRoeSBhcyBib29sZWFuLFxuICB9O1xuICBpZiAodHlwZW9mIHIuc3BlY1ZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgcGFyc2VkLnNwZWNWZXJzaW9uID0gci5zcGVjVmVyc2lvbjtcbiAgfVxuICBpZiAodHlwZW9mIHIud29ya2Zsb3dDb3JlVmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJzZWQud29ya2Zsb3dDb3JlVmVyc2lvbiA9IHIud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgfVxuICBpZiAodHlwZW9mIHIuZW5jcnlwdGlvblB1YmxpY0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJzZWQuZW5jcnlwdGlvblB1YmxpY0tleSA9IHIuZW5jcnlwdGlvblB1YmxpY0tleTtcbiAgfVxuICBpZiAodHlwZW9mIHIuaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICBwYXJzZWQuaG9va1Jlc3VtZUlucHV0VmVyc2lvbiA9IHIuaG9va1Jlc3VtZUlucHV0VmVyc2lvbjtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGVhbHRoQ2hlY2soXG4gIHdvcmxkOiBXb3JsZCxcbiAgb3B0aW9ucz86IEhlYWx0aENoZWNrT3B0aW9uc1xuKTogUHJvbWlzZTxIZWFsdGhDaGVja1Jlc3VsdD4ge1xuICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/PyBERUZBVUxUX0hFQUxUSF9DSEVDS19USU1FT1VUO1xuICAvLyBVc2UgdGhlIHdvcmxkJ3MgSUQgZ2VuZXJhdG9yIHdoZW4gYXZhaWxhYmxlIHNvIHRoZSBjb3JyZWxhdGlvbklkIGlzIGFcbiAgLy8gcmVnaW9uLXRhZ2dlZCBVTElELiBUaGUgaGVhbHRoLWNoZWNrIHJlc3BvbnNlIGlzIGRlbGl2ZXJlZCBvdmVyIGEgc3RyZWFtXG4gIC8vIHdob3NlIG5hbWUgZW1iZWRzIHRoaXMgY29ycmVsYXRpb25JZDsgdW5kZXIgcGxhdGZvcm0tZGlyZWN0ZWQgcm91dGluZyB0aGVcbiAgLy8gcmVhZGVyIGFuZCB0aGUgcmVzcG9uZGluZyBlbmRwb2ludCBjYW4gYmUgc2VydmVkIGZyb20gZGlmZmVyZW50IHBoeXNpY2FsXG4gIC8vIHJlZ2lvbnMsIHNvIHRoZSByZWdpb24gbXVzdCBiZSBlbmNvZGVkIGluIHRoZSBJRCBpdHNlbGYgZm9yIGJvdGggc2lkZXMgdG9cbiAgLy8gcmVzb2x2ZSB0aGUgc2FtZSAocmVnaW9uLXBpbm5lZCkgYmFja2VuZC4gRmFsbHMgYmFjayB0byBhIHBsYWluIFVMSUQgZm9yXG4gIC8vIHdvcmxkcyB0aGF0IGRvbid0IHRhZyBJRHMgKGUuZy4gbG9jYWwpLCB3aGljaCByZXNvbHZlIHRvIHRoZSBkZWZhdWx0XG4gIC8vIHJlZ2lvbiBvbiBib3RoIHNpZGVzLlxuICBjb25zdCBjb3JyZWxhdGlvbklkID0gd29ybGQuY3JlYXRlUnVuSWQ/LigpID8/IGdlbmVyYXRlSWQoKTtcbiAgY29uc3Qgc3RyZWFtTmFtZSA9IGdldEhlYWx0aENoZWNrU3RyZWFtTmFtZShjb3JyZWxhdGlvbklkKTtcblxuICBjb25zdCBxdWV1ZU5hbWUgPVxuICAgIGAke2dldFF1ZXVlVG9waWNQcmVmaXgoJ3dvcmtmbG93JywgcmVzb2x2ZVF1ZXVlTmFtZXNwYWNlKG9wdGlvbnM/Lm5hbWVzcGFjZSkpfWhlYWx0aF9jaGVja2AgYXMgVmFsaWRRdWV1ZU5hbWU7XG5cbiAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdvcmxkLnF1ZXVlKFxuICAgICAgcXVldWVOYW1lLFxuICAgICAge1xuICAgICAgICBfX2hlYWx0aENoZWNrOiB0cnVlLFxuICAgICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgICAuLi4ob3B0aW9ucz8ucnVuSWQgPyB7IHJ1bklkOiBvcHRpb25zLnJ1bklkIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBVc2UgSlNPTiB0cmFuc3BvcnQgc28gdGhlIGhlYWx0aCBjaGVjayB3b3JrcyBhZ2FpbnN0IGJvdGhcbiAgICAgICAgLy8gb2xkIChKU09OLW9ubHkpIGFuZCBuZXcgKGR1YWwpIGRlcGxveW1lbnRzLlxuICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgZGVwbG95bWVudElkOiBvcHRpb25zPy5kZXBsb3ltZW50SWQsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nTXMgPSB0aW1lb3V0IC0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCB3aXRoRGVhZGxpbmUoXG4gICAgICAgICAgd29ybGQuc3RyZWFtcy5nZXQoXG4gICAgICAgICAgICBnZW5lcmF0ZUhlYWx0aENoZWNrUnVuSWQoY29ycmVsYXRpb25JZCksXG4gICAgICAgICAgICBzdHJlYW1OYW1lXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZW1haW5pbmdNc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IHsgY2h1bmtzLCB0aW1lZE91dCB9ID0gYXdhaXQgcmVhZFN0cmVhbVdpdGhUaW1lb3V0KFxuICAgICAgICAgIHJlYWRlcixcbiAgICAgICAgICBIRUFMVEhfQ0hFQ0tfUkVBRF9USU1FT1VUXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRpbWVkT3V0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBjYW5jZWwgZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBIRUFMVEhfQ0hFQ0tfUE9MTF9JTlRFUlZBTClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBwYXJzZUhlYWx0aENoZWNrUmVzcG9uc2UoY2h1bmtzKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgICAgICAgbGF0ZW5jeU1zOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEhFQUxUSF9DSEVDS19QT0xMX0lOVEVSVkFMKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgSEVBTFRIX0NIRUNLX1BPTExfSU5URVJWQUwpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBoZWFsdGh5OiBmYWxzZSxcbiAgICAgIGVycm9yOiBgSGVhbHRoIGNoZWNrIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXNgLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWx0aHk6IGZhbHNlLFxuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZ1xuKTogV29ya2Zsb3dXb3JsZEVycm9yIHtcbiAgcmV0dXJuIG5ldyBXb3JrZmxvd1dvcmxkRXJyb3IoXG4gICAgYEV2ZW50IHBhZ2luYXRpb24gJHttZXNzYWdlfSBmb3Igd29ya2Zsb3cgcnVuIFwiJHtydW5JZH1cIi5gLFxuICAgIHsgY29kZTogUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SIH1cbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkUmVxdWVzdGVkRXZlbnRDdXJzb3IoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgcmVxdWVzdGVkQ3Vyc29yczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoIWN1cnNvcikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocmVxdWVzdGVkQ3Vyc29ycy5oYXMoY3Vyc29yKSkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IocnVuSWQsICdkaWQgbm90IGFkdmFuY2UnKTtcbiAgfVxuICByZXF1ZXN0ZWRDdXJzb3JzLmFkZChjdXJzb3IpO1xufVxuXG4vKipcbiAqIEFwcGVuZHMgZXZlbnRzIHdob3NlIElEcyBhcmUgbm90IGFscmVhZHkgcHJlc2VudCBpbiBgdGFyZ2V0YC5cbiAqXG4gKiBQYXNzIHRoZSBJRHMgY3VycmVudGx5IHByZXNlbnQgaW4gYHRhcmdldGAgd2hlbiBhcHBlbmRpbmcgcmVwZWF0ZWRseSB0byB0aGVcbiAqIHNhbWUgYXJyYXkuIFRoZSBzZXQgaXMgdXBkYXRlZCBhbG9uZ3NpZGUgYHRhcmdldGAuXG4gKlxuICogRXZlbnRzIGFyZSBhcHBlbmRlZCBpbiB0aGUgb3JkZXIgdGhlIFdvcmxkIHJldHVybmVkIHRoZW0sIGFuZCBhcmUgbm90XG4gKiByZS1zb3J0ZWQuIEV2ZXJ5IGFwcGVuZCBzb3VyY2UgaXMgYWxyZWFkeSBpbiBjYW5vbmljYWwgb3JkZXIgcmVsYXRpdmUgdG8gdGhlXG4gKiB0YWlsIChhIGN1cnNvci1kZWxpbWl0ZWQgcGFnZSwgb3IgYSB3cml0ZS1yZXNwb25zZSBkZWx0YSksIHNvIHJlY2VpcHQgb3JkZXIgaXNcbiAqIHRoZSBvcmRlciB0byBrZWVwLCBhbmQgcmUtc29ydGluZyBoZXJlIHdvdWxkIG9ubHkgY29zdCBhIHBhc3Mgb3ZlciB0aGUgbG9nLlxuICogTm90aGluZyBkb3duc3RyZWFtIG1heSBhc3N1bWUgdGhlIHRhaWwgaXMgdGhlIG5ld2VzdCBldmVudC4gU2VlXG4gKiB7QGxpbmsgbWF4RXZlbnRTbG90fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFVuaXF1ZUV2ZW50cyhcbiAgdGFyZ2V0OiBFdmVudFtdLFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W10sXG4gIHRhcmdldElkcz86IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpZHMgPSB0YXJnZXRJZHMgPz8gbmV3IFNldCh0YXJnZXQubWFwKChldmVudCkgPT4gZXZlbnQuZXZlbnRJZCkpO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGlmIChpZHMuaGFzKGV2ZW50LmV2ZW50SWQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWRzLmFkZChldmVudC5ldmVudElkKTtcbiAgICB0YXJnZXQucHVzaChldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnNlcnRzIGBldmVudGAgaW50byBgdGFyZ2V0YCBhdCB0aGUgcG9zaXRpb24gdGhhdCBrZWVwcyBgdGFyZ2V0YCBvcmRlcmVkIGJ5XG4gKiBhc2NlbmRpbmcgYGV2ZW50SWRgLCBvciBuby1vcHMgaWYgYW4gZXZlbnQgd2l0aCB0aGUgc2FtZSBgZXZlbnRJZGAgaXMgYWxyZWFkeVxuICogcHJlc2VudCAoaWRlbXBvdGVudCkuXG4gKlxuICogYHByZWxvYWRlZEV2ZW50c2AgaXMgbG9hZGVkIGBzb3J0T3JkZXI6ICdhc2MnYCBhbmQgaXMgbmV2ZXIgcmUtc29ydGVkXG4gKiBjbGllbnQtc2lkZSwgc28gYSBgaG9va19yZWNlaXZlZGAgc3BsaWNlZCBpbiBieSB0aGUgbGF6eS1yZXN1bWUgY29uc3VtZXIgbXVzdFxuICogbGFuZCBpbiBgZXZlbnRJZGAgb3JkZXI6IGEgcGxhaW4gYHB1c2hgIHdvdWxkIHBsYWNlIGEgbGF0ZS1jb21taXR0aW5nXG4gKiBlYXJsaWVyIGV2ZW50IGFmdGVyIGV2ZW50cyB0aGF0IHNvcnQgYmVmb3JlIGl0LCBjb3JydXB0aW5nIHJlcGxheS5cbiAqXG4gKiBMZXhpY29ncmFwaGljIHN0cmluZyBvcmRlciBpcyB0aGUgbG9nJ3Mgb3JkZXI6IGEgc2xvdCBpZCBpcyBhIGZpeGVkLXdpZHRoXG4gKiB6ZXJvLXBhZGRlZCBwb3NpdGlvbiwgc28gY29tcGFyaW5nIHRoZSBzdHJpbmdzIGNvbXBhcmVzIHRoZSBwb3NpdGlvbnMuIFRoaXNcbiAqIG5lZWRzIG5vIHBhcnNlIG9mIGl0cyBvd24gZm9yIHRoYXQgcmVhc29uLCBhbmQgdGhlIGNvbXBhcmlzb24gaXMgZXhhY3QgcmF0aGVyXG4gKiB0aGFuIGEgcmVjb25zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRFdmVudEJ5RXZlbnRJZCh0YXJnZXQ6IEV2ZW50W10sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAvLyBMaW5lYXIgc2NhbiBmcm9tIHRoZSBlbmQ6IHRoZSBzcGxpY2VkIGV2ZW50IGlzIGFsbW9zdCBhbHdheXMgdGhlIG5ld2VzdFxuICAvLyAoaXQgc29ydHMgYXQgb3IgbmVhciB0aGUgdGFpbCksIHNvIHRoaXMgZmluZHMgdGhlIHNsb3QgaW4gTygxKeKAk08oaykgZm9yIHRoZVxuICAvLyBjb21tb24gY2FzZSB3aGlsZSBzdGlsbCBoYW5kbGluZyBhbiBvdXQtb2Ytb3JkZXIgbGF0ZSBhcnJpdmFsIGNvcnJlY3RseS5cbiAgbGV0IGkgPSB0YXJnZXQubGVuZ3RoO1xuICB3aGlsZSAoaSA+IDApIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRhcmdldFtpIC0gMV07XG4gICAgaWYgKGV4aXN0aW5nLmV2ZW50SWQgPT09IGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIC8vIEFscmVhZHkgcHJlc2VudDoga2VlcCB0aGUgc3BsaWNlIGlkZW1wb3RlbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChleGlzdGluZy5ldmVudElkIDwgZXZlbnQuZXZlbnRJZCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGktLTtcbiAgfVxuICB0YXJnZXQuc3BsaWNlKGksIDAsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RXZlbnRQYWdpbmF0aW9uUHJvZ3Jlc3MoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGhhc01vcmU6IGJvb2xlYW4sXG4gIGN1cnNvcjogc3RyaW5nIHwgbnVsbCxcbiAgcmVxdWVzdGVkQ3Vyc29yczogU2V0PHN0cmluZz5cbik6IHZvaWQge1xuICBpZiAoIWhhc01vcmUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnNvciA9PT0gbnVsbCkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IoXG4gICAgICBydW5JZCxcbiAgICAgICdyZXR1cm5lZCBtb3JlIHBhZ2VzIHdpdGhvdXQgYSBjdXJzb3InXG4gICAgKTtcbiAgfVxuICBpZiAocmVxdWVzdGVkQ3Vyc29ycy5oYXMoY3Vyc29yKSkge1xuICAgIHRocm93IGV2ZW50UGFnaW5hdGlvbkNvbnRyYWN0RXJyb3IocnVuSWQsICdyZXBlYXRlZCBhIGN1cnNvcicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFJldHJ5V2l0aG91dEV2ZW50Q3Vyc29yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY3Vyc29yOiBzdHJpbmcgfCBudWxsLFxuICBhbHJlYWR5UmV0cmllZDogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY3Vyc29yICE9PSBudWxsICYmXG4gICAgIWFscmVhZHlSZXRyaWVkICYmXG4gICAgV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycm9yKSAmJlxuICAgIGVycm9yLnN0YXR1cyA9PT0gNDAwXG4gICk7XG59XG5cbi8qKlxuICogTG9hZHMgd29ya2Zsb3cgcnVuIGV2ZW50cyBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgcGFnZXMgb2YgcGFnaW5hdGVkXG4gKiByZXN1bHRzLiBFdmVudHMgYXJlIHJldHVybmVkIGluIGNocm9ub2xvZ2ljYWwgKGFzY2VuZGluZykgb3JkZXIgZm9yXG4gKiBkZXRlcm1pbmlzdGljIHdvcmtmbG93IHJlcGxheS5cbiAqXG4gKiBAcGFyYW0gcnVuSWQgLSBUaGUgd29ya2Zsb3cgcnVuIElELlxuICogQHBhcmFtIGFmdGVyQ3Vyc29yIC0gSWYgcHJvdmlkZWQsIG9ubHkgZXZlbnRzIGFmdGVyIHRoaXMgY3Vyc29yIGFyZVxuICogICByZXR1cm5lZCAoaW5jcmVtZW50YWwgbG9hZCkuIElmIG9taXR0ZWQsIGFsbCBldmVudHMgYXJlIHJldHVybmVkLlxuICogICBUaGUgcmV0dXJuZWQgY3Vyc29yIGNhbiBiZSBwYXNzZWQgYmFjayBpbiBvbiBhIHN1YnNlcXVlbnQgY2FsbCBmb3JcbiAqICAgaW5jcmVtZW50YWwgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXb3JrZmxvd1J1bkV2ZW50cyhcbiAgcnVuSWQ6IHN0cmluZyxcbiAgYWZ0ZXJDdXJzb3I/OiBzdHJpbmdcbik6IFByb21pc2U8TG9hZGVkRXZlbnRMb2c+IHtcbiAgY29uc3QgaW5jcmVtZW50YWwgPSBhZnRlckN1cnNvciAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJhY2UoJ3dvcmtmbG93LnJlcGxheS5sb2FkJywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1JlcGxheUxvYWRTb3VyY2UoXG4gICAgICAgIGluY3JlbWVudGFsID8gJ2V2ZW50c19saXN0X2luY3JlbWVudGFsJyA6ICdldmVudHNfbGlzdCdcbiAgICAgICksXG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2FkZWRFdmVudHM6IEV2ZW50W10gPSBbXTtcbiAgICBjb25zdCBsb2FkZWRFdmVudElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3Vyc29yOiBzdHJpbmcgfCBudWxsID0gYWZ0ZXJDdXJzb3IgPz8gbnVsbDtcbiAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgbGV0IHBhZ2VzTG9hZGVkID0gMDtcbiAgICBsZXQgcmV0cmllZFdpdGhvdXRDdXJzb3IgPSBmYWxzZTtcbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICAgIGNvbnN0IGxvYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGhhc01vcmUpIHtcbiAgICAgIC8vIFRPRE86IHdlJ3JlIGN1cnJlbnRseSBsb2FkaW5nIGFsbCB0aGUgZGF0YSB3aXRoIHJlc29sdmVSZWYgYmVoYXZpb3IuIFdlIG5lZWQgdG8gdXBkYXRlIHRoaXNcbiAgICAgIC8vIHRvIGxhenlsb2FkIHRoZSBkYXRhIGZyb20gdGhlIHdvcmxkIGluc3RlYWQgc28gdGhhdCB3ZSBjYW4gb3B0aW1pemUgYW5kIG1ha2UgdGhlIGV2ZW50IGxvZyBsb2FkaW5nXG4gICAgICAvLyBtdWNoIGZhc3RlciBhbmQgbWVtb3J5IGVmZmljaWVudFxuICAgICAgY29uc3QgcGFnZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEN1cnNvciA9IGN1cnNvcjtcbiAgICAgIHJlY29yZFJlcXVlc3RlZEV2ZW50Q3Vyc29yKHJ1bklkLCByZXF1ZXN0ZWRDdXJzb3IsIHJlcXVlc3RlZEN1cnNvcnMpO1xuXG4gICAgICBsZXQgcmVzcG9uc2U6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2Ygd29ybGQuZXZlbnRzLmxpc3Q+PjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgd29ybGQuZXZlbnRzLmxpc3Qoe1xuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogJ2FzYycsXG4gICAgICAgICAgICBjdXJzb3I6IHJlcXVlc3RlZEN1cnNvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2hvdWxkUmV0cnlXaXRob3V0RXZlbnRDdXJzb3IoXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIHJlcXVlc3RlZEN1cnNvcixcbiAgICAgICAgICAgIHJldHJpZWRXaXRob3V0Q3Vyc29yXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnRXZlbnQgY3Vyc29yIHdhcyByZWplY3RlZDsgcmV0cnlpbmcgd2l0aCBhIGZ1bGwgZXZlbnQgcmVsb2FkLicsXG4gICAgICAgICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGxvYWRlZEV2ZW50cy5sZW5ndGggPSAwO1xuICAgICAgICAgIGxvYWRlZEV2ZW50SWRzLmNsZWFyKCk7XG4gICAgICAgICAgcmVxdWVzdGVkQ3Vyc29ycy5jbGVhcigpO1xuICAgICAgICAgIGN1cnNvciA9IG51bGw7XG4gICAgICAgICAgcmV0cmllZFdpdGhvdXRDdXJzb3IgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBhcHBlbmRVbmlxdWVFdmVudHMobG9hZGVkRXZlbnRzLCByZXNwb25zZS5kYXRhLCBsb2FkZWRFdmVudElkcyk7XG4gICAgICBoYXNNb3JlID0gcmVzcG9uc2UuaGFzTW9yZTtcbiAgICAgIGFzc2VydEV2ZW50UGFnaW5hdGlvblByb2dyZXNzKFxuICAgICAgICBydW5JZCxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgcmVzcG9uc2UuY3Vyc29yLFxuICAgICAgICByZXF1ZXN0ZWRDdXJzb3JzXG4gICAgICApO1xuICAgICAgLy8gUHJlc2VydmUgdGhlIGxhc3Qgbm9uLW51bGwgY3Vyc29yIGFjcm9zcyBwYWdlcy4gQSBXb3JsZCBtYXlcbiAgICAgIC8vIGxlZ2l0aW1hdGVseSByZXR1cm4gYHsgZGF0YTogW10sIGN1cnNvcjogbnVsbCwgaGFzTW9yZTogZmFsc2UgfWBcbiAgICAgIC8vIG9uIGEgdHJhaWxpbmcgZW1wdHkgcGFnZSwgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcHJldmlvdXMgcGFnZSdzXG4gICAgICAvLyB1bmRlcmx5aW5nIERCIHF1ZXJ5IGhpdCB0aGUgbGltaXQgZXhhY3RseSBhbmQgcmV0dXJuZWQgYVxuICAgICAgLy8gcHJlY2F1dGlvbmFyeSBgTGFzdEV2YWx1YXRlZEtleWAuIE92ZXJ3cml0aW5nIHdpdGggdGhhdCBudWxsXG4gICAgICAvLyB3b3VsZCBsb3NlIHRoZSBwb3NpdGlvbiBwYXN0IHRoZSBsYXN0IHJlYWwgZXZlbnQgd2UgbG9hZGVkIGFuZFxuICAgICAgLy8gZm9yY2UgdGhlIHJ1bnRpbWUgaW50byB0aGUgXCJubyBjdXJzb3IgYWZ0ZXIgaW5pdGlhbCBsb2FkXCIgZnVsbC1cbiAgICAgIC8vIHJlbG9hZCBmYWxsYmFjayBvbiBldmVyeSBzdWJzZXF1ZW50IHJlcGxheSBpdGVyYXRpb24uXG4gICAgICBjdXJzb3IgPSByZXNwb25zZS5jdXJzb3IgPz8gY3Vyc29yO1xuICAgICAgcGFnZXNMb2FkZWQrKztcblxuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnTG9hZGVkIGV2ZW50IHBhZ2UnLCB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICBpbmNyZW1lbnRhbCxcbiAgICAgICAgcGFnZTogcGFnZXNMb2FkZWQsXG4gICAgICAgIHBhZ2VFdmVudHM6IHJlc3BvbnNlLmRhdGEubGVuZ3RoLFxuICAgICAgICB0b3RhbEV2ZW50czogbG9hZGVkRXZlbnRzLmxlbmd0aCxcbiAgICAgICAgaGFzTW9yZSxcbiAgICAgICAgcGFnZU1zOiBEYXRlLm5vdygpIC0gcGFnZVN0YXJ0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnRXZlbnQgbG9hZCBjb21wbGV0ZScsIHtcbiAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgaW5jcmVtZW50YWwsXG4gICAgICB0b3RhbEV2ZW50czogbG9hZGVkRXZlbnRzLmxlbmd0aCxcbiAgICAgIHBhZ2VzTG9hZGVkLFxuICAgICAgdG90YWxNczogRGF0ZS5ub3coKSAtIGxvYWRTdGFydCxcbiAgICB9KTtcblxuICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQobG9hZGVkRXZlbnRzLmxlbmd0aCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFdmVudHNQYWdlc0xvYWRlZChwYWdlc0xvYWRlZCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBldmVudHM6IGxvYWRlZEV2ZW50cywgY3Vyc29yIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBydW50aW1lJ3MgbG9hZGVkIGV2ZW50LWxvZyBzbmFwc2hvdDogdGhlIGV2ZW50cyByZXBsYXllZCBzbyBmYXIgYW5kIHRoZVxuICogY3Vyc29yIHBvc2l0aW9uZWQgYWZ0ZXIgdGhlbS4gSGFuZGVkIHRvIGhlbHBlcnMgdGhhdCBkZXJpdmUgdGhlIHByZWNvbmRpdGlvblxuICogc25hcHNob3QgZnJvbSBpdDsgdGhleSBkbyBub3QgbXV0YXRlIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZEV2ZW50TG9nIHtcbiAgZXZlbnRzOiBFdmVudFtdO1xuICBjdXJzb3I6IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICogRXh0ZW5kIGEgbG9hZGVkIGxvZyB3aXRoIGEgcGFnZSB0aGF0IGNvbnRpbnVlcyBpdCDigJQgYSBsaXN0ZWQgcGFnZSwgb3IgdGhlXG4gKiBpbmxpbmUgZGVsdGEgYSB3cml0ZSBoYW5kZWQgYmFjayDigJQgYW5kIG1vdmUgaXRzIHJlYWQgcG9zaXRpb24gd2l0aCBpdC5cbiAqXG4gKiBUaGUgY3Vyc29yIGlzIG9ubHkgYWR2YW5jZWQgd2hlbiB0aGUgcGFnZSBjYXJyaWVzIG9uZSwgc28gYSBzb3VyY2Ugd2l0aCBub1xuICogcG9zaXRpb24gb2YgaXRzIG93biAoYSBza2lwcGVkLXNsb3QgcmVwb3J0KSBjYW5ub3Qgd2FsayB0aGUgcmVhZCBwb3NpdGlvblxuICogcGFzdCBldmVudHMgaXQgZGlkIG5vdCBjYXJyeS4gQXBwZW5kaW5nIGRvZXMgbm90IHJlLXNvcnQ7IHNlZVxuICoge0BsaW5rIGFwcGVuZFVuaXF1ZUV2ZW50c30gZm9yIHdoeSByZWNlaXB0IG9yZGVyIGlzIHRoZSBvcmRlciB0byBrZWVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kRXZlbnRMb2coXG4gIGxvZzogTG9hZGVkRXZlbnRMb2csXG4gIGFwcGVuZGVkOiB7IGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXTsgY3Vyc29yPzogc3RyaW5nIHwgbnVsbCB9XG4pOiB2b2lkIHtcbiAgYXBwZW5kVW5pcXVlRXZlbnRzKGxvZy5ldmVudHMsIGFwcGVuZGVkLmV2ZW50cyk7XG4gIGxvZy5jdXJzb3IgPSBhcHBlbmRlZC5jdXJzb3IgPz8gbG9nLmN1cnNvcjtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVwbGF5IHJlZnVzZXMgdG8gcnVuIG92ZXIgYSBsb2cgd2l0aCBhIGhvbGUgaW4gaXQgKHNlZVxuICoge0BsaW5rIGZpbmRFdmVudFNsb3RHYXB9KS4gKipPbiBieSBkZWZhdWx0Kio7IHNldFxuICogYFdPUktGTE9XX1NMT1RfR0FQX0NIRUNLPTBgIHRvIHJlcGxheSBhY3Jvc3MgaG9sZXMgaW5zdGVhZC5cbiAqXG4gKiBBIFdvcmxkIHRoYXQgYWxsb2NhdGVzIGEgcG9zaXRpb24gYXQgdGhlIG1vbWVudCBpdCBjb21taXRzIGxlYXZlcyBubyBob2xlXG4gKiBiZWhpbmQgd2hlbiBhIHdyaXRlIGZhaWxzLCBzbyBkZW5zaXR5IGlzIGEgcHJvcGVydHkgdGhlIGxvZyBoYXMgYnlcbiAqIGNvbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBvbmUgdGhpcyBjaGVjayBtYWludGFpbnMuIFdoYXQgdGhlIGNoZWNrIGlzIGZvciBpc1xuICogdGhlIHJlYWRzIGFuZCB0aGUgV29ybGRzIHdoZXJlIHRoYXQgZG9lcyBub3QgaG9sZCwgYW5kIGJ5IHRoZSB0aW1lIGl0IHJ1bnNcbiAqIHRoZSBiZW5pZ24gZXhwbGFuYXRpb25zIGFyZSBzcGVudDogYSBwb3NpdGlvbiBtaXNzaW5nIGJlY2F1c2UgYSBjb25jdXJyZW50XG4gKiBjb21taXQgaXMgbm90IHZpc2libGUgeWV0IGNsZWFycyBvbiBhIHJlLXJlYWQsIHdoaWNoIGlzIHdoYXRcbiAqIHtAbGluayBzZXR0bGVFdmVudFNsb3RHYXB9IGRvZXMgZmlyc3QuXG4gKlxuICogV2hhdCBpcyBsZWZ0IGlzIGEgaG9sZSB0aGF0IHBlcnNpc3RzLCBhbmQgaXRzIHR3byBjYXVzZXMgYXJlXG4gKiBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBsb2cuIEVpdGhlciBhIFdvcmxkIGFsbG9jYXRlZCB0aGUgcG9zaXRpb24gb3V0c2lkZVxuICogdGhlIGNvbW1pdCBhbmQgbG9zdCB0aGUgd3JpdGUsIGluIHdoaWNoIGNhc2Ugbm90aGluZyBoYXBwZW5lZCB0aGVyZSBhbmRcbiAqIHJlcGxheWluZyBwYXN0IGl0IGlzIGNvcnJlY3QsIG9yIGFuIGV2ZW50IHRoYXQgZGlkIGhhcHBlbiBpcyBtaXNzaW5nLCBpblxuICogd2hpY2ggY2FzZSByZXBsYXlpbmcgcGFzdCBpdCBkZWNpZGVzIGEgYnJhbmNoIG9uIGFic2VuY2UgYW5kIHByb2R1Y2VzIGEgd3JvbmdcbiAqIHJlc3VsdCB3aXRoIG5vdGhpbmcgdG8gc2hvdyBmb3IgaXQuIEZhaWxpbmcgaXMgdGhlIHJlY292ZXJhYmxlIHNpZGUgb2YgdGhhdFxuICogdHJhZGUsIGFuZCB0aGlzIGlzIHRoZSB3YXkgYmFjayBvdXQgaWYgYSBmbGVldCB0dXJucyBvdXQgdG8gY2FycnkgaG9sZXMgb2ZcbiAqIHRoZSBmaXJzdCBraW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTbG90R2FwQ2hlY2tFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfU0xPVF9HQVBfQ0hFQ0sgIT09ICcwJztcbn1cblxuLypcbiAqIE1lcmdpbmcgaW50byBhIGxvZyBhIHJlcGxheSBpcyBtaWR3YXkgdGhyb3VnaCByZWFkaW5nLlxuICpcbiAqIFRocmVlIHBhdGhzIGFkZCBldmVudHMgdG8gYSBsb2FkZWQgbG9nIGFmdGVyIHRoZSByZXBsYXkgaGFzIHN0YXJ0ZWQ6IGFcbiAqIGJ1bXAtYW5kLXJlcG9ydCB3cml0ZSBoYW5kcyBiYWNrIHRoZSBzbG90cyBpdCBza2lwcGVkICh7QGxpbmtcbiAqIG1lcmdlUmVwb3J0ZWRFdmVudHN9KSwgYW4gaW5saW5lIGRlbHRhIGV4dGVuZHMgdGhlIHRhaWwgKGBhYnNvcmJDcmVhdGVEZWx0YWBcbiAqIGluIGBydW50aW1lLnRzYCksIGFuZCBhIGxpc3RlZCBwYWdlIGFwcGVuZHMgKHtAbGluayBhcHBlbmRVbmlxdWVFdmVudHN9KS5cbiAqIFRoZXkgbG9vayBhbGFybWluZyAodGhlIHJlcGxheSBpcyByZWFkaW5nIGFuIGFycmF5IHdoaWxlIHNvbWV0aGluZyBlbHNlXG4gKiB3cml0ZXMgdG8gaXQpIGFuZCB0aGV5IGFyZSBzYWZlIGZvciBvbmUgcmVhc29uIHdvcnRoIHN0YXRpbmcgcGxhaW5seSwgc2luY2VcbiAqIGV2ZXJ5IGNvcnJlY3RuZXNzIGFyZ3VtZW50IGluIHRoaXMgZmlsZSBsZWFucyBvbiBpdC5cbiAqXG4gKiAqKkFuIGV2ZW50IGluIHRoZSBsb2cgaXMgYSBmYWN0LCBhbmQgYSBsb25nZXIgbG9nIGNhbm5vdCByZXRyYWN0IG9uZS4qKiBUaGVcbiAqIGxvZyBpcyBhcHBlbmQtb25seSBhbmQgcG9zaXRpb25zIGFyZSBuZXZlciByZXVzZWQsIHNvIGEgcmVwbGF5IHRoYXQgcHJvZHVjZWRcbiAqIGV2ZW50IEUgZnJvbSB0aGUgcHJlZml4IGl0IGhhZCBsb2FkZWQgaGFzIG1hZGUgRSB0cnVlIGZvciBldmVyeSByZXBsYXkgdGhhdFxuICogZm9sbG93cy4gQSBsYXRlciByZXBsYXkgcmVhZGluZyBhIGZ1bGxlciBsb2cgZG9lcyBub3QgZ2V0IHRvIGRlY2lkZSBFIHNob3VsZFxuICogbm90IGJlIHRoZXJlOyBpdCBjb25zdW1lcyBFIGFuZCByZWNvbmNpbGVzIHRvIGl0LCB3aGljaCBpcyB3aGF0IHRoZSBldmVudHNcbiAqIGNvbnN1bWVyIGRvZXMgd2hlbiBpdCB3YWxrcyBhIGxvZyBob2xkaW5nIHdyaXRlcyBmcm9tIGEgcmVwbGF5IHRoYXQgcmFjZWQgaXQuXG4gKlxuICogTWVyZ2luZyBpcyB0aGVyZWZvcmUgbW9ub3RvbmU6IGl0IGNhbiBvbmx5IGFkZCBmYWN0cyB0aGlzIHJlcGxheSBoYXMgeWV0IHRvXG4gKiByZWNvbmNpbGUgdG8sIG5ldmVyIHJlbW92ZSBvbmUgaXQgYWxyZWFkeSBoYXMuIFRoYXQgaXMgd2h5IGFic29yYmluZyBpc1xuICogYWx3YXlzIG9wdGlvbmFsIGFuZCBuZXZlciB3cm9uZyB0byBkZWNsaW5lIChhbiB1bmFic29yYmVkIGV2ZW50IGlzIG9uZSB0aGVcbiAqIG5leHQgcmVhZCByZXR1cm5zKSwgYW5kIHdoeSB0aGUgZ3VhcmRzIGJlbG93IGNhbiBhZmZvcmQgdG8gYmUgc3RyaWN0LlxuICovXG5cbi8qKlxuICogTWVyZ2UgdGhlIGV2ZW50cyBhIGJ1bXAtYW5kLXJlcG9ydCB3cml0ZSBoYW5kZWQgYmFjayBpbnRvIHRoZSBsb2cgaXQgd2FzXG4gKiBkZXJpdmVkIGZyb20sIGFuZCBhbnN3ZXIgaG93IG1hbnkgb2YgdGhlbSB3ZXJlIG5ldy5cbiAqXG4gKiBVbmxpa2Uge0BsaW5rIGFwcGVuZFVuaXF1ZUV2ZW50c30sIHRoaXMgcmUtc29ydHMuIFRoZSByZXBvcnRlZCBldmVudHMgb2NjdXB5XG4gKiBzbG90cyAqYmVsb3cqIHRoZSB3cml0ZSB0aGF0IHJlcG9ydGVkIHRoZW0sIHNvIGFwcGVuZGluZyB0aGVtIHdvdWxkIHB1dCB0aGVtXG4gKiBhZnRlciBldmVudHMgdGhleSBwcmVjZWRlLiBTb3J0aW5nIGJ5IGlkIHJlc3RvcmVzIHRoZSBXb3JsZCdzIGNhbm9uaWNhbCBvcmRlclxuICogcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgaXQ6IGEgc2xvdCBpZCBpcyB0aGF0IG9yZGVyLCB3cml0dGVuIGRvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVJlcG9ydGVkRXZlbnRzKFxuICB0YXJnZXQ6IEV2ZW50W10sXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXVxuKTogbnVtYmVyIHtcbiAgY29uc3QgYmVmb3JlID0gdGFyZ2V0Lmxlbmd0aDtcbiAgYXBwZW5kVW5pcXVlRXZlbnRzKHRhcmdldCwgZXZlbnRzKTtcbiAgY29uc3QgYWRkZWQgPSB0YXJnZXQubGVuZ3RoIC0gYmVmb3JlO1xuICBpZiAoYWRkZWQgPiAwKSB7XG4gICAgdGFyZ2V0LnNvcnQoKGEsIGIpID0+XG4gICAgICBhLmV2ZW50SWQgPCBiLmV2ZW50SWQgPyAtMSA6IGEuZXZlbnRJZCA+IGIuZXZlbnRJZCA/IDEgOiAwXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYWRkZWQ7XG59XG5cbi8qKiBXaGF0IHtAbGluayBhYnNvcmJTa2lwcGVkU2xvdFJlcG9ydH0gZGlkIHdpdGggYSB3cml0ZSdzIHJlcG9ydC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcHBlZFNsb3RSZXBvcnQge1xuICAvKiogSG93IG1hbnkgb2YgdGhlIHJlcG9ydGVkIGV2ZW50cyB3ZXJlIG5ldyB0byB0aGUgbG9nLiBaZXJvIGlmIGRyb3BwZWQuICovXG4gIGFkZGVkOiBudW1iZXI7XG4gIC8qKiBIb3cgbWFueSBldmVudHMgdGhlIHJlcG9ydCBvZmZlcmVkLCB3aGV0aGVyIG9yIG5vdCB0aGV5IHdlcmUgdGFrZW4uICovXG4gIG9mZmVyZWQ6IG51bWJlcjtcbiAgLyoqIFRoZSByZXBvcnQgd2FzIHRydW5jYXRlZCwgc28gaXQgd2FzIGRyb3BwZWQgd2hvbGUgaW5zdGVhZCBvZiBtZXJnZWQuICovXG4gIHRydW5jYXRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBcHBseSBhIHdyaXRlJ3Mgc2tpcHBlZC1zbG90IHJlcG9ydCB0byB0aGUgbG9nIGl0IHdhcyBkZXJpdmVkIGZyb20sIGRlY2lkaW5nXG4gKiB3aGV0aGVyIHRoZSByZXBvcnQgbWF5IGJlIHRha2VuIGF0IGFsbC5cbiAqXG4gKiBFdmVyeSByZXBsYXktY29udGV4dCB3cml0ZSBjYW4gY29tZSBiYWNrIGNhcnJ5aW5nIHRoZSBldmVudHMgb24gdGhlIHNsb3RzIGl0XG4gKiBza2lwcGVkIG92ZXIsIGFuZCBldmVyeSBjYWxsZXIgd2FudHMgdGhlIHNhbWUgdGhpbmcgZnJvbSB0aGVtOiBmb2xkIHRoZW0gaW5cbiAqIHNvIHRoZSB3cml0ZXMgdGhhdCBmb2xsb3cgbmFtZSBhIHBvc2l0aW9uIGFib3ZlIHRoZW0sIGFuZCBzbyB0aGUgcmVwbGF5XG4gKiByZXN1bWluZyBmcm9tIHRoaXMgbG9nIHNlZXMgdGhlbSB3aXRob3V0IGEgcmVsb2FkLlxuICpcbiAqIFRoZSBvbmUgcG9saWN5IGlzIHRoYXQgYSAqKnRydW5jYXRlZCByZXBvcnQgaXMgZHJvcHBlZCB3aG9sZSoqLiBJdCBjb3ZlcnMgYVxuICogc3BhbiBvZiBwb3NpdGlvbnMgYnV0IGNhcnJpZXMgb25seSBzb21lIG9mIHRoZSBldmVudHMgb24gdGhlbSwgc28gbWVyZ2luZyBpdFxuICogd291bGQgcmFpc2UgdGhlIGxvZydzIGhpZ2hlc3QgcG9zaXRpb24gcGFzdCBhIHBvc2l0aW9uIHdob3NlIGV2ZW50IGlzXG4gKiBtaXNzaW5nLiBMYXRlciB3cml0ZXMgcmVhZCB0aGF0IG1heGltdW0gdG8gc2F5IHdoYXQgdGhleSBoYXZlIHNlZW4sIHNvIGVhY2hcbiAqIHdvdWxkIGNsYWltIGEgcG9zaXRpb24gaXQgbmV2ZXIgc2F3LCBhbmQgdGhlIFdvcmxkIG9ubHkgcmVwb3J0cyB0aGUgc3BhbiBhXG4gKiB3cml0ZSBza2lwczogaXQgd291bGQgbmV2ZXIgc2VuZCB0aGUgbWlzc2luZyBvbmUuIERyb3BwaW5nIGNvc3RzIG9uZSBtb3JlXG4gKiByb3VuZCBvZiB0aGUgc2FtZSBldmVudHMgb24gdGhlIG5leHQgd3JpdGUgYW5kIGtlZXBzIHRoZSBsb2cgYSBwcmVmaXggb2YgdGhlXG4gKiB0cnV0aCwgd2hpY2ggdGhlIG5vdGUgYWJvdmUge0BsaW5rIG1lcmdlUmVwb3J0ZWRFdmVudHN9IGV4cGxhaW5zIGlzIGFsd2F5cyBhblxuICogYXZhaWxhYmxlIGFuc3dlci5cbiAqXG4gKiBDYWxsZXJzIHRoYXQgbG9nIGRvIHNvIGZyb20gdGhlIHJldHVybmVkIGNvdW50czsgdGhlIGRlY2lzaW9uIGlzIG5vdCB0aGVpcnNcbiAqIHRvIHJlLWRlcml2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFic29yYlNraXBwZWRTbG90UmVwb3J0KFxuICB0YXJnZXQ6IEV2ZW50W10sXG4gIHJlc3VsdDogeyBldmVudHM/OiByZWFkb25seSBFdmVudFtdOyBoYXNNb3JlPzogYm9vbGVhbiB9XG4pOiBTa2lwcGVkU2xvdFJlcG9ydCB7XG4gIGNvbnN0IG9mZmVyZWQgPSByZXN1bHQuZXZlbnRzPy5sZW5ndGggPz8gMDtcbiAgaWYgKG9mZmVyZWQgPT09IDApIHtcbiAgICByZXR1cm4geyBhZGRlZDogMCwgb2ZmZXJlZDogMCwgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICB9XG4gIGlmIChyZXN1bHQuaGFzTW9yZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7IGFkZGVkOiAwLCBvZmZlcmVkLCB0cnVuY2F0ZWQ6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFkZGVkOiBtZXJnZVJlcG9ydGVkRXZlbnRzKHRhcmdldCwgcmVzdWx0LmV2ZW50cyA/PyBbXSksXG4gICAgb2ZmZXJlZCxcbiAgICB0cnVuY2F0ZWQ6IGZhbHNlLFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBoaWdoZXN0IHNsb3QgdGhlIGxvYWRlZCBsb2cgb2NjdXBpZXMsIG9yIGB1bmRlZmluZWRgIGZvciBhbiBlbXB0eSBsb2cuXG4gKlxuICogVGhlIG1heGltdW0sIG5vdCB0aGUgY291bnQsIGFuZCB0aGUgdHdvIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlIGV2ZW4gdGhvdWdoXG4gKiBhIGhlYWx0aHkgbG9nIG1ha2VzIHRoZW0gZXF1YWwuIEEgV29ybGQgaGFuZHMgYSBwb3NpdGlvbiB0byB0aGUgaW5zZXJ0IHRoYXRcbiAqIG9jY3VwaWVzIGl0LCBzbyBhIHdyaXRlIHRoYXQgbmV2ZXIgbGFuZHMgbGVhdmVzIG5vIGhvbGUgYmVoaW5kIGFuZCB0aGUgbG9nXG4gKiBzdGF5cyBkZW5zZS4gV2hhdCB0aGUgY291bnQgY2Fubm90IHN1cnZpdmUgaXMgYSAqcGFydGlhbCogcmVhZDogYSBsb2dcbiAqIGFzc2VtYmxlZCBmcm9tIGEgdHJ1bmNhdGVkIHJlcG9ydCwgb3IgcmVhZCB3aGlsZSBhIGNvbmN1cnJlbnQgd3JpdGUgaXNcbiAqIGNvbW1pdHRpbmcsIGhvbGRzIGZld2VyIGV2ZW50cyB0aGFuIGl0cyBoaWdoZXN0IHBvc2l0aW9uLiBDb3VudGluZyB0aG9zZVxuICogd291bGQgbWFrZSB0aGUgbmV4dCB3cml0ZSBjbGFpbSB0byBoYXZlIHNlZW4gbGVzcyB0aGFuIGl0IGhhcywgc28gdGhlIFdvcmxkXG4gKiB3b3VsZCByZXBvcnQgdGhlIHNhbWUgZXZlbnRzIGJhY2sgdG8gaXQgb24gZXZlcnkgYXR0ZW1wdC5cbiAqXG4gKiBBIGhvbGUgYmVsb3cgdGhlIG1heGltdW0gaXMgdGhlcmVmb3JlIGEgcHJvcGVydHkgb2YgdGhlIHJlYWQsIG5vdCBvZiB0aGUgbG9nLFxuICogd2hpY2ggaXMgd2hhdCBsZXRzIHtAbGluayBzZXR0bGVFdmVudFNsb3RHYXB9IHJlLXJlYWQgaW5zdGVhZCBvZiBnaXZpbmcgdXAuXG4gKlxuICogQHRocm93cyBpZiBhbnkgZXZlbnQgaWQgY2FycmllcyBubyBzbG90LiBFdmVyeSBXb3JsZCB0aGUgcnVudGltZSByZXBsYXlzXG4gKiBhZ2FpbnN0IG51bWJlcnMgZXZlbnRzIGJ5IHNsb3QsIHNvIGFuIGlkIHRoYXQgZG9lcyBub3QgaXMgYSBicm9rZW4gbG9nIHJhdGhlclxuICogdGhhbiBhbiBvbGRlciBvbmUsIGFuZCBhIG1heGltdW0gZGVyaXZlZCBieSBza2lwcGluZyBpdCB3b3VsZCB1bmRlcnN0YXRlIHRoZVxuICogbG9nIHRvIGV2ZXJ5IHdyaXRlIHRoYXQgcmVhZHMgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhFdmVudFNsb3QoZXZlbnRzOiByZWFkb25seSBFdmVudFtdKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgbGV0IG1heDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGNvbnN0IHNsb3QgPSByZXF1aXJlRXZlbnRTbG90KGV2ZW50LmV2ZW50SWQpO1xuICAgIGlmIChtYXggPT09IHVuZGVmaW5lZCB8fCBzbG90ID4gbWF4KSB7XG4gICAgICBtYXggPSBzbG90O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4O1xufVxuXG4vKiogQSBwb3NpdGlvbiB0aGUgbG9nIHNraXBzIG92ZXIsIGRlc2NyaWJlZCB3ZWxsIGVub3VnaCB0byBuYW1lIGluIGFuIGVycm9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudFNsb3RHYXAge1xuICAvKiogVGhlIGxvd2VzdCBzbG90IGJlbG93IHRoZSBsb2cncyBtYXhpbXVtIHRoYXQgbm8gZXZlbnQgb2NjdXBpZXMuICovXG4gIGZpcnN0TWlzc2luZ1Nsb3Q6IG51bWJlcjtcbiAgLyoqIEhvdyBtYW55IHNsb3RzIGJlbG93IHRoZSBtYXhpbXVtIG5vIGV2ZW50IG9jY3VwaWVzLiAqL1xuICBtaXNzaW5nQ291bnQ6IG51bWJlcjtcbiAgLyoqIFRoZSBoaWdoZXN0IHNsb3QgdGhlIGxvZyBvY2N1cGllcy4gKi9cbiAgbWF4U2xvdDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBob2xlIGluIGEgbG9hZGVkIGxvZywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lIHRvIGZpbmQuXG4gKlxuICogVGhlIFdvcmxkIGFsbG9jYXRlcyBldmVyeSBwb3NpdGlvbiwgc28gYSBsb2cgdGhhdCBob2xkcyBgbmAgZXZlbnRzIGJlbG93IHNsb3RcbiAqIGBuYCBpcyBtaXNzaW5nIG9uZS4gVGhhdCBtYXR0ZXJzIGJlZm9yZSBhIHJlcGxheVxuICogYW5kIG5vd2hlcmUgZWxzZTogdGhlIHJlcGxheSByZWFkcyB0aGUgbG9nIGFzIHRoZSBjb21wbGV0ZSByZWNvcmQgb2Ygd2hhdCBoYXNcbiAqIGhhcHBlbmVkLCBhbmQgYW4gYWJzZW50IHBvc2l0aW9uIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gZXZlbnQgdGhhdFxuICogbmV2ZXIgb2NjdXJyZWQuIFRoZSBicmFuY2ggaXQgd291bGQgaGF2ZSBkZWNpZGVkIGdldHMgZGVjaWRlZCB0aGUgb3RoZXIgd2F5LFxuICogYW5kIHRoZSBydW4gZGl2ZXJnZXMgcXVpZXRseSByYXRoZXIgdGhhbiBmYWlsaW5nLlxuICpcbiAqIE9yZGVyLWluZGVwZW5kZW50LCB1bmxpa2UgdGhlIGVxdWl2YWxlbnQgYXVkaXQgdGhlIFdvcmxkIHJ1bnMgb3ZlciBhIHBhZ2UgaXRcbiAqIGp1c3QgcmVhZC4gQSBsb2FkZWQgbG9nIGlzIGFzc2VtYmxlZCBmcm9tIGxpc3RlZCBwYWdlcyBwbHVzIHdoYXRldmVyIGFcbiAqIGJ1bXAtYW5kLXJlcG9ydCB3cml0ZSBoYW5kZWQgYmFjaywgYW5kIHdoaWxlIHtAbGluayBtZXJnZVJlcG9ydGVkRXZlbnRzfVxuICogcmVzdG9yZXMgaWQgb3JkZXIsIGEgY2hlY2sgdGhhdCBjYW4gZmFpbCBhIGhlYWx0aHkgcnVuIHNob3VsZCBub3QgZGVwZW5kIG9uXG4gKiB0aGF0IGhhdmluZyBoYXBwZW5lZC5cbiAqXG4gKiBUaGUgZmlyc3Qgc2xvdCBpcyBuZXZlciBjb3VudGVkLiBJdCBiZWxvbmdzIHRvIGBydW5fY3JlYXRlZGAsIHdoaWNoIGBzdGFydCgpYFxuICogcG9zdHMgY29uY3VycmVudGx5IHdpdGggdGhlIHF1ZXVlIHNlbmQsIHNvIGEgbG9nIHJlYWQgaW4gdGhhdCB3aW5kb3dcbiAqIGxlZ2l0aW1hdGVseSBiZWdpbnMgYXQgdGhlIHNlY29uZCBzbG90IGFuZCBmaWxscyBpbiBvbiBpdHMgb3duLiBFdmVyeSByZXBsYXlcbiAqIHRoYXQgcmFjZXMgYSBydW4ncyBvd24gc3RhcnQgd291bGQgb3RoZXJ3aXNlIHJlcG9ydCBhIGhvbGUuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW4gZW1wdHkgbG9nLCB3aGljaCBoYXMgbm8gZGVuc2l0eSB0byBjaGVjay5cbiAqXG4gKiBAdGhyb3dzIGlmIGFueSBldmVudCBpZCBjYXJyaWVzIG5vIHNsb3QsIGZvciB0aGUgcmVhc29uIHtAbGluayBtYXhFdmVudFNsb3R9XG4gKiBnaXZlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRFdmVudFNsb3RHYXAoXG4gIGV2ZW50czogcmVhZG9ubHkgRXZlbnRbXVxuKTogRXZlbnRTbG90R2FwIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb2NjdXBpZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGV0IG1heFNsb3QgPSAwO1xuICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgIGNvbnN0IHNsb3QgPSByZXF1aXJlRXZlbnRTbG90KGV2ZW50LmV2ZW50SWQpO1xuICAgIG9jY3VwaWVkLmFkZChzbG90KTtcbiAgICBpZiAoc2xvdCA+IG1heFNsb3QpIHtcbiAgICAgIG1heFNsb3QgPSBzbG90O1xuICAgIH1cbiAgfVxuICBpZiAobWF4U2xvdCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgZmxvb3IgPSBvY2N1cGllZC5oYXMoRklSU1RfRVZFTlRfU0xPVClcbiAgICA/IEZJUlNUX0VWRU5UX1NMT1RcbiAgICA6IEZJUlNUX0VWRU5UX1NMT1QgKyAxO1xuICAvLyBFdmVyeSBzbG90IGlzIGF0IG9yIGFib3ZlIGBmbG9vcmAgYnkgY29uc3RydWN0aW9uLCBzbyB0aGUgbG9nIGlzIGRlbnNlXG4gIC8vIGV4YWN0bHkgd2hlbiBpdCBob2xkcyBvbmUgZXZlbnQgcGVyIHBvc2l0aW9uIGluIGBbZmxvb3IsIG1heFNsb3RdYC4gVGhlXG4gIC8vIHNjYW4gYmVsb3cgb25seSBydW5zIG9uY2UgdGhhdCBoYXMgYWxyZWFkeSBhbnN3ZXJlZCBuby5cbiAgaWYgKG9jY3VwaWVkLnNpemUgPT09IG1heFNsb3QgLSBmbG9vciArIDEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCBmaXJzdE1pc3NpbmdTbG90OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxldCBtaXNzaW5nQ291bnQgPSAwO1xuICBmb3IgKGxldCBzbG90ID0gZmxvb3I7IHNsb3QgPD0gbWF4U2xvdDsgc2xvdCsrKSB7XG4gICAgaWYgKCFvY2N1cGllZC5oYXMoc2xvdCkpIHtcbiAgICAgIGZpcnN0TWlzc2luZ1Nsb3QgPz89IHNsb3Q7XG4gICAgICBtaXNzaW5nQ291bnQrKztcbiAgICB9XG4gIH1cbiAgaWYgKGZpcnN0TWlzc2luZ1Nsb3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgZmlyc3RNaXNzaW5nU2xvdCwgbWlzc2luZ0NvdW50LCBtYXhTbG90IH07XG59XG5cbi8qKlxuICogSG93IG1hbnkgdGltZXMgYSBkZXRlY3RlZCBob2xlIGlzIHJlLXJlYWQgYmVmb3JlIHRoZSBsb2cgaXMgdGFrZW4gYXQgaXRzXG4gKiB3b3JkLCBhbmQgdGhlIGJhY2tvZmYgYmVmb3JlIGVhY2ggcmUtcmVhZCAoZG91YmxpbmcgcGVyIGF0dGVtcHQpLlxuICpcbiAqIEEgaG9sZSBjYW4gYmUgdHJhbnNpZW50LiBUaGUgV29ybGQgYWxsb2NhdGVzIGEgc2xvdCBpbnNpZGUgdGhlIGluc2VydCB0aGF0XG4gKiBvY2N1cGllcyBpdCwgc28gdHdvIGNvbmN1cnJlbnQgd3JpdGVycyBjYW4gY29sbGlkZSwgb25lIHJldHJ5IHBhc3QgdGhlIG90aGVyLFxuICogYW5kIHRoZSBoaWdoZXIgc2xvdCBjb21taXQgZmlyc3QsIGxlYXZpbmcgYSB3aW5kb3cgaW4gd2hpY2ggdGhlIGxvd2VyIG9uZSBpc1xuICogZ2VudWluZWx5IGFic2VudCBmcm9tIGEgc3Ryb25nbHktY29uc2lzdGVudCByZWFkIGFuZCBmaWxscyBpbiBhIG1vbWVudCBsYXRlci5cbiAqIFRoZSB3aW5kb3cgaXMgb25lIGNvbW1pdCB3aWRlLCBzbyBhIHNob3J0IGJhY2tvZmYgY2xlYXJzIGl0OyBhbnl0aGluZyB0aGF0XG4gKiBzdXJ2aXZlcyBhbGwgdGhyZWUgcmUtcmVhZHMgaXMgYSBwb3NpdGlvbiBubyB3cml0ZSB3aWxsIGV2ZXIgb2NjdXB5LlxuICovXG5leHBvcnQgY29uc3QgU0xPVF9HQVBfUkVDSEVDS19BVFRFTVBUUyA9IDM7XG5jb25zdCBTTE9UX0dBUF9SRUNIRUNLX0JBU0VfREVMQVlfTVMgPSAyNTtcblxuLyoqXG4gKiBSZS1yZWFkIGEgbG9nIHRoYXQgbG9va3MgaG9sZXkgdW50aWwgdGhlIGhvbGUgZmlsbHMgaW4gb3IgdGhlIHJlLXJlYWRzIHJ1blxuICogb3V0LCBhbmQgcmV0dXJuIHRoZSBzZXR0bGVkIGxvZyBhbG9uZ3NpZGUgdGhlIGhvbGUgdGhhdCBzdXJ2aXZlZC5cbiAqXG4gKiBSZWFkcyBhcmUgc3Ryb25nbHkgY29uc2lzdGVudCwgc28gYSBob2xlIGlzIG5vdCBhbiBhcnRpZmFjdCBvZiAqd2hlbiogdGhlIGxvZ1xuICogd2FzIHJlYWQsIGJ1dCBpdCBjYW4gYmUgYW4gYXJ0aWZhY3Qgb2YgYSB3cml0ZSB0aGF0IGhhZCBub3QgY29tbWl0dGVkIHlldFxuICogKHNlZSB7QGxpbmsgU0xPVF9HQVBfUkVDSEVDS19BVFRFTVBUU30pLiBEaXN0aW5ndWlzaGluZyB0aGUgdHdvIGNvc3RzIGFcbiAqIHJlLXJlYWQsIHdoaWNoIGlzIG9ubHkgZXZlciBwYWlkIGJ5IGEgcmVwbGF5IHRoYXQgYWxyZWFkeSBmb3VuZCBhIGhvbGUuXG4gKlxuICogVGhlIHJlbG9hZCBpcyBmdWxsIHJhdGhlciB0aGFuIGluY3JlbWVudGFsOiB0aGUgbWlzc2luZyBwb3NpdGlvbiBpcyBiZWxvdyB0aGVcbiAqIGxvZydzIG1heGltdW0sIHNvIGEgY3Vyc29yLWFuY2hvcmVkIHJlYWQgc3RhcnRzIHBhc3QgaXQgYW5kIGNhbiBuZXZlciBzZWUgaXRcbiAqIGFycml2ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHRsZUV2ZW50U2xvdEdhcChcbiAgcnVuSWQ6IHN0cmluZyxcbiAgbG9hZGVkOiBMb2FkZWRFdmVudExvZ1xuKTogUHJvbWlzZTx7IGxvZzogTG9hZGVkRXZlbnRMb2c7IGdhcDogRXZlbnRTbG90R2FwIHwgdW5kZWZpbmVkIH0+IHtcbiAgbGV0IGxvZyA9IGxvYWRlZDtcbiAgbGV0IGdhcCA9IGZpbmRFdmVudFNsb3RHYXAobG9nLmV2ZW50cyk7XG4gIGZvciAoXG4gICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgIGdhcCAhPT0gdW5kZWZpbmVkICYmIGF0dGVtcHQgPCBTTE9UX0dBUF9SRUNIRUNLX0FUVEVNUFRTO1xuICAgIGF0dGVtcHQrK1xuICApIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgU0xPVF9HQVBfUkVDSEVDS19CQVNFX0RFTEFZX01TICogMiAqKiBhdHRlbXB0KVxuICAgICk7XG4gICAgbG9nID0gYXdhaXQgbG9hZFdvcmtmbG93UnVuRXZlbnRzKHJ1bklkKTtcbiAgICBnYXAgPSBmaW5kRXZlbnRTbG90R2FwKGxvZy5ldmVudHMpO1xuICB9XG4gIHJldHVybiB7IGxvZywgZ2FwIH07XG59XG5cbi8qKlxuICogSG93IG11Y2ggb2YgaXRzIHJ1bidzIGxvZyBhIHJlcGxheS1jb250ZXh0IGV2ZW50IGNyZWF0aW9uIGhhZCBsb2FkZWQgd2hlbiBpdFxuICogZGVjaWRlZCB0byB3cml0ZSwgYXMgdGhlIGhpZ2hlc3Qgc2xvdCB0aGF0IGxvZyBvY2N1cGllcy5cbiAqXG4gKiBPbmUgaW50ZWdlciBzYXlzIGl0IGJlY2F1c2UgdGhlIFdvcmxkIGtlZXBzIGl0cyBwb3NpdGlvbnMgZGVuc2U6IGEgd3JpdGVyXG4gKiB0aGF0IG5hbWVzIHNsb3QgTiBpcyBjbGFpbWluZyB0byBob2xkIGV2ZXJ5IGV2ZW50IGZyb20gMSB0byBOIGFuZCBub3RoaW5nXG4gKiBhYm92ZS4gVGhlIFdvcmxkIGFuc3dlcnMgYnkgbnVtYmVyaW5nIHRoZSB3cml0ZSBhYm92ZSB3aGF0ZXZlciB0aGUgbG9nIGhhc1xuICogYWN0dWFsbHkgcmVhY2hlZCBhbmQgaGFuZGluZyBiYWNrIHRoZSBldmVudHMgb24gdGhlIHNsb3RzIGluIGJldHdlZW46IHRoZVxuICogb25lcyB0aGlzIHdyaXRlciBkZWNpZGVkIHdpdGhvdXQuXG4gKlxuICogRGVuc2l0eSBpcyB0aGUgV29ybGQncyBpbnZhcmlhbnQsIG5vdCBhIGNsYWltIGFib3V0IHRoaXMgcGFydGljdWxhciByZWFkLiBBXG4gKiByZWFkZXIgdGhhdCBpcyBzaG9ydCBvZiBhIHBvc2l0aW9uIGl0IGhvbGRzIG5vIGV2ZW50IGZvciBuYW1lcyBhIGxvd2VyIE4sXG4gKiB3aGljaCB1bmRlcnN0YXRlcyB3aGF0IGl0IGhhcyBzZWVuIGFuZCBvbmx5IGNvc3RzIGl0IGEgd2lkZXIgcmVwb3J0LiBOYW1pbmdcbiAqIGEgcG9zaXRpb24gaXQgY2Fubm90IGFjY291bnQgZm9yIGlzIHRoZSBkaXJlY3Rpb24gdGhhdCBpcyB1bnNhZmUsIHdoaWNoIGlzXG4gKiB3aHkge0BsaW5rIHNsb3RTbmFwc2hvdFBhcmFtc30gdGFrZXMgdGhlIG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIGNvdW50LlxuICpcbiAqIEl0cyBvd24gb2JqZWN0IHJhdGhlciB0aGFuIGEgYmFyZSBudW1iZXIgc28gYSBjYWxsIHNpdGUgY2Fubm90IGhhbGYtc2VuZCBpdCxcbiAqIGFuZCBzbyB0aGUgZW1wdHkgY2FzZSBzcHJlYWRzIHRvIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xvdFNuYXBzaG90UGFyYW1zIHtcbiAgZXZlbnRDb3VudD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgc2xvdCBzbmFwc2hvdCB0byBhdHRhY2ggdG8gYSByZXBsYXktY29udGV4dCBldmVudCBjcmVhdGlvbi5cbiAqXG4gKiBFbXB0eSBmb3IgYW4gZW1wdHkgbG9nLCB3aGljaCBpcyB0aGUgc3RhdGUgYSBgcnVuX2NyZWF0ZWRgIHdyaXRlIGlzIGlzc3VlZFxuICogZnJvbTogdGhlcmUgaXMgbm8gcG9zaXRpb24gaGVsZCB5ZXQgdG8gbmFtZS5cbiAqXG4gKiBUaGUgbWF4aW11bSByYXRoZXIgdGhhbiB0aGUgbGVuZ3RoLCBmb3IgdGhlIHJlYXNvbiB7QGxpbmsgbWF4RXZlbnRTbG90fVxuICogZ2l2ZXM6IGEgcGFydGlhbGx5LXJlYWQgbG9nIGhvbGRzIGZld2VyIGV2ZW50cyB0aGFuIGl0cyBoaWdoZXN0IHBvc2l0aW9uLCBhbmRcbiAqIGNvdW50aW5nIHRob3NlIHdvdWxkIG1ha2UgdGhlIHdyaXRlIGNsYWltIHRvIGhhdmUgc2VlbiBsZXNzIHRoYW4gaXQgaGFzLCBzb1xuICogdGhlIFdvcmxkIHdvdWxkIHJlcG9ydCB0aGUgc2FtZSBldmVudHMgYmFjayBvbiBldmVyeSBhdHRlbXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xvdFNuYXBzaG90UGFyYW1zKFxuICBldmVudHM6IHJlYWRvbmx5IEV2ZW50W11cbik6IFNsb3RTbmFwc2hvdFBhcmFtcyB7XG4gIGNvbnN0IGV2ZW50Q291bnQgPSBtYXhFdmVudFNsb3QoZXZlbnRzKTtcbiAgcmV0dXJuIGV2ZW50Q291bnQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBldmVudENvdW50IH07XG59XG5cbi8qKlxuICogVGhlIGV2ZW50cyBhIHJlamVjdGluZyBXb3JsZCBhdHRhY2hlZCB0byBhIGBQcmVjb25kaXRpb25GYWlsZWRFcnJvcmAsIHdoZW4gaXRcbiAqIHJldHVybmVkIHRoZSBvbmVzIHRoZSBjbGllbnQncyBzbmFwc2hvdCB3YXMgbWlzc2luZyBpbmxpbmUuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgZm9yIGFueXRoaW5nIGVsc2U6IG5vIGRldGFpbHMsIGEgV29ybGQgdGhhdCBkaWQgbm90IGltcGxlbWVudFxuICogdGhpcywgb3IgYSBwYXlsb2FkIHRoYXQgZG9lcyBub3QgbmFycm93IGNsZWFubHkuIENhbGxlcnMgZmFsbCBiYWNrIHRvXG4gKiByZWxvYWRpbmcgdGhlIGV2ZW50IGxvZywgd2hpY2ggaXMgYWx3YXlzIGNvcnJlY3Q7IHRoaXMgaXMgdW50cnVzdGVkLXNoYXBlZFxuICogZGF0YSBvbiBhIGZhaWx1cmUgcGF0aCwgc28gbm90aGluZyBoZXJlIGlzIHJlcGFpcmVkLlxuICpcbiAqIGBydW5JZGAgaXMgdGhlIGNhbGxlcidzIHJ1bi4gRXZlcnkgZXZlbnQgbXVzdCBiZWxvbmcgdG8gaXQ6IHRoZSBkZWx0YSBpc1xuICogbWVyZ2VkIHN0cmFpZ2h0IGludG8gdGhlIHJlcGxheSdzIGxvZywgYW5kIG9uZSBmb3JlaWduIGV2ZW50IHRoZXJlIGlzIGFcbiAqIGNvcnJ1cHQgbG9nIHJhdGhlciB0aGFuIGEgY29ycmVjdGVkIG9uZTogdGhlIHJlcGxheSB3b3VsZCBjb25zdW1lIGFcbiAqIGNvcnJlbGF0aW9uIGlkIGZvciBhbiBldmVudCB0aGF0IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlY29uZGl0aW9uRXZlbnREZWx0YShcbiAgZXJyb3I6IHVua25vd24sXG4gIHJ1bklkOiBzdHJpbmdcbik6IHsgZXZlbnRzOiBFdmVudFtdOyBjdXJzb3I6IHN0cmluZyB8IG51bGwgfSB8IG51bGwge1xuICBpZiAoIVByZWNvbmRpdGlvbkZhaWxlZEVycm9yLmlzKGVycm9yKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGRldGFpbHMgPSBlcnJvci5kZXRhaWxzO1xuICBpZiAodHlwZW9mIGRldGFpbHMgIT09ICdvYmplY3QnIHx8IGRldGFpbHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7IGV2ZW50cywgY3Vyc29yIH0gPSBkZXRhaWxzIGFzIHsgZXZlbnRzPzogdW5rbm93bjsgY3Vyc29yPzogdW5rbm93biB9O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZXZlbnRzKSB8fCBldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnIHx8XG4gICAgICBldmVudCA9PT0gbnVsbCB8fFxuICAgICAgdHlwZW9mIChldmVudCBhcyB7IGV2ZW50SWQ/OiB1bmtub3duIH0pLmV2ZW50SWQgIT09ICdzdHJpbmcnIHx8XG4gICAgICAoZXZlbnQgYXMgeyBydW5JZD86IHVua25vd24gfSkucnVuSWQgIT09IHJ1bklkXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBldmVudHM6IGV2ZW50cyBhcyBFdmVudFtdLFxuICAgIGN1cnNvcjogdHlwZW9mIGN1cnNvciA9PT0gJ3N0cmluZycgPyBjdXJzb3IgOiBudWxsLFxuICB9O1xufVxuXG4vKiogQ3JlYXRlcyBvbmUgZXZlbnQgb24gYSBib3VuZCBydW4sIGNhcnJ5aW5nIHJlcGxheS1yZWNvdmVyeSB0ZWxlbWV0cnkuICovXG5leHBvcnQgdHlwZSBFdmVudENyZWF0b3IgPSAoXG4gIGRhdGE6IENyZWF0ZUV2ZW50UmVxdWVzdCxcbiAgcGFyYW1zPzogQ3JlYXRlRXZlbnRQYXJhbXNcbikgPT4gUHJvbWlzZTxFdmVudFJlc3VsdD47XG5cbi8qKlxuICogQ09SUyBoZWFkZXJzIGZvciBoZWFsdGggY2hlY2sgcmVzcG9uc2VzLlxuICogQWxsb3dzIHRoZSBvYnNlcnZhYmlsaXR5IFVJIHRvIGNoZWNrIGVuZHBvaW50IGhlYWx0aCBmcm9tIGEgZGlmZmVyZW50IG9yaWdpbi5cbiAqL1xuY29uc3QgSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyA9IHtcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICcqJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiAnUE9TVCwgT1BUSU9OUywgR0VULCBIRUFEJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiAnQ29udGVudC1UeXBlJyxcbn07XG5cbi8qKlxuICogV3JhcHMgYSByZXF1ZXN0L3Jlc3BvbnNlIGhhbmRsZXIgYW5kIGFkZHMgYSBoZWFsdGggY2hlY2sgXCJtb2RlXCJcbiAqIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGBfX2hlYWx0aGAgcXVlcnkgcGFyYW1ldGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aEhlYWx0aENoZWNrKFxuICBoYW5kbGVyOiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPixcbiAgd29ybGRTcGVjVmVyc2lvbj86IG51bWJlclxuKTogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4ge1xuICByZXR1cm4gYXN5bmMgKHJlcTogUmVxdWVzdCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCk7XG4gICAgY29uc3QgaXNIZWFsdGhDaGVjayA9IHVybC5zZWFyY2hQYXJhbXMuaGFzKCdfX2hlYWx0aCcpO1xuICAgIGlmIChpc0hlYWx0aENoZWNrKSB7XG4gICAgICAvLyBIYW5kbGUgQ09SUyBwcmVmbGlnaHQgZm9yIGhlYWx0aCBjaGVja1xuICAgICAgaWYgKHJlcS5tZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHtcbiAgICAgICAgICBzdGF0dXM6IDIwNCxcbiAgICAgICAgICBoZWFkZXJzOiBIRUFMVEhfQ0hFQ0tfQ09SU19IRUFERVJTLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBoZWFsdGh5OiB0cnVlLFxuICAgICAgICAgIGVuZHBvaW50OiB1cmwucGF0aG5hbWUsXG4gICAgICAgICAgc3BlY1ZlcnNpb246IHdvcmxkU3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgLi4uSEVBTFRIX0NIRUNLX0NPUlNfSEVBREVSUyxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgaGFuZGxlcihyZXEpO1xuICB9O1xufVxuXG4vKiogRk5WLTFhIDMyLWJpdCBoYXNoIG9mIGEgc3RyaW5nLCBhcyA4IGhleCBjaGFycy4gVGlueSwgZGV0ZXJtaW5pc3RpYywgYW5kXG4gKiAgZGVwZW5kZW5jeS1mcmVlLiBVc2VkIG9ubHkgdG8gc2NvcGUgaWRlbXBvdGVuY3kga2V5cywgbm90IGZvciBzZWN1cml0eS4gKi9cbmZ1bmN0aW9uIGZudjFhMzJIZXgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBoYXNoID0gMHg4MTFjOWRjNTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGhhc2ggXj0gdmFsdWUuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoID0gTWF0aC5pbXVsKGhhc2gsIDB4MDEwMDAxOTMpO1xuICB9XG4gIHJldHVybiAoaGFzaCA+Pj4gMCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDgsICcwJyk7XG59XG5cbi8qKlxuICogSWRlbXBvdGVuY3kga2V5IGZvciBhIHN0ZXAncyBiYWNrZ3JvdW5kLWRpc3BhdGNoIHF1ZXVlIG1lc3NhZ2UsIHNjb3BlZCB0b1xuICogdGhlIHN0ZXAncyBJREVOVElUWSwgY29ycmVsYXRpb24gaWQgcGx1cyAoaGFzaGVkKSBzdGVwIG5hbWUsIHJhdGhlciB0aGFuXG4gKiB0aGUgYmFyZSBjb3JyZWxhdGlvbiBpZC5cbiAqXG4gKiBUaGUgc2NvcGluZyBtYXR0ZXJzIGZvciByZXNpbGllbnQgc3RlcCBkaXNwYXRjaCB1bmRlciB0aGUgcHJlY29uZGl0aW9uXG4gKiBndWFyZDogYSBndWFyZC1yZWplY3RlZCBgc3RlcF9jcmVhdGVkYCBsZWF2ZXMgaXRzIChyZXZva2VkKSBzdGVwIG1lc3NhZ2UgaW5cbiAqIGZsaWdodCwgYW5kIHRoZSBjb3JyZWN0ZWQgcmVwbGF5IG1heSByZS1kZXJpdmUgdGhlIHNhbWUgY29ycmVsYXRpb24gaWQgZm9yXG4gKiBhIERJRkZFUkVOVCBzdGVwLiBVbmRlciBhIGJhcmUtY29ycmVsYXRpb25JZCBrZXkgdGhlIGNvcnJlY3RlZCByZXBsYXknc1xuICogZGlzcGF0Y2ggd291bGQgc2lsZW50bHkgZGVkdXBlIGFnYWluc3QgdGhlIHJldm9rZWQgaW4tZmxpZ2h0IG1lc3NhZ2UsXG4gKiB3aGljaCB0aGVuIHJlc29sdmVzIGBza2lwcGVkYCBhZ2FpbnN0IHRoZSByZS1jcmVhdGVkIGVudGl0eSAodGhlIHNlcnZlcidzXG4gKiBzdGVwTmFtZSBmZW5jZSByZWplY3RzIGl0cyBiYXJlIHN0YXJ0KSwgYW5kIHRoZSBsZWdpdGltYXRlIHN0ZXAgd291bGRcbiAqIG5ldmVyIGJlIGV4ZWN1dGVkLiBTY29waW5nIGJ5IHN0ZXAgbmFtZSBrZWVwcyBldmVyeSBkZWR1cCBwcm9wZXJ0eSB0aGF0XG4gKiBtYXR0ZXJzIChjcmFzaCByZWNvdmVyeSByZS1kaXNwYXRjaCwgY29uY3VycmVudCBoYW5kbGVycywgdGhlIGRlbGF5ZWRcbiAqIHJldHJ5IHNoYXJpbmcgdGhlIHN1c3BlbnNpb24gcmUtZGlzcGF0Y2gncyBrZXk6IGFsbCBuYW1lIHRoZSBzYW1lIHN0ZXApXG4gKiB3aGlsZSBsZXR0aW5nIHRoZSBjb3JyZWN0ZWQgc2NoZWR1bGUncyBkaXNwYXRjaCB0aHJvdWdoLlxuICpcbiAqIEV2ZXJ5IHByb2R1Y2VyIG9mIGEgc3RlcC1kaXNwYXRjaCAob3Igc3RlcC1yZXRyeSkgbWVzc2FnZSBtdXN0IHVzZSB0aGlzXG4gKiBrZXkuIENyb3NzLXZlcnNpb24gbWl4aW5nIGlzIG5vdCBhIGNvbmNlcm46IHF1ZXVlIG1lc3NhZ2VzIGFyZSBwaW5uZWQgdG9cbiAqIHRoZSBkZXBsb3ltZW50IHRoYXQgcHJvZHVjZWQgdGhlbSwgc28gb25lIHJ1biBuZXZlciBzZWVzIHR3byBrZXkgc2NoZW1lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZXBEaXNwYXRjaElkZW1wb3RlbmN5S2V5KFxuICBjb3JyZWxhdGlvbklkOiBzdHJpbmcsXG4gIHN0ZXBOYW1lOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjb3JyZWxhdGlvbklkfToke2ZudjFhMzJIZXgoc3RlcE5hbWUpfWA7XG59XG5cbi8qKlxuICogUXVldWVzIGEgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIHF1ZXVlIHdpdGggdHJhY2luZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWVzc2FnZShcbiAgd29ybGQ6IFdvcmxkLFxuICAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiB3b3JsZC5xdWV1ZT5cbikge1xuICBjb25zdCBxdWV1ZU5hbWUgPSBhcmdzWzBdO1xuICBhd2FpdCB0cmFjZShcbiAgICAncXVldWUucHVibGlzaCcsXG4gICAge1xuICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUocXVldWVOYW1lKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3B1Ymxpc2gnKSxcbiAgICAgICAgLy8gUGVlciBzZXJ2aWNlIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwc1xuICAgICAgICAuLi5BdHRyaWJ1dGUuUGVlclNlcnZpY2UoJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjU3lzdGVtKCd2ZXJjZWwtcXVldWUnKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLlJwY1NlcnZpY2UoJ3ZxcycpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuUnBjTWV0aG9kKCdwdWJsaXNoJyksXG4gICAgICB9LFxuICAgICAga2luZDogYXdhaXQgZ2V0U3BhbktpbmQoJ1BST0RVQ0VSJyksXG4gICAgfSxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3QgeyBtZXNzYWdlSWQgfSA9IGF3YWl0IHdvcmxkLnF1ZXVlKC4uLmFyZ3MpO1xuICAgICAgaWYgKG1lc3NhZ2VJZCkge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWVzc2FnZUlkKSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHF1ZXVlIG92ZXJoZWFkIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciBhIGdpdmVuIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWV1ZU92ZXJoZWFkKG1lc3NhZ2U6IHsgcmVxdWVzdGVkQXQ/OiBEYXRlIH0pIHtcbiAgaWYgKCFtZXNzYWdlLnJlcXVlc3RlZEF0KSByZXR1cm47XG4gIHRyeSB7XG4gICAgcmV0dXJuIEF0dHJpYnV0ZS5RdWV1ZU92ZXJoZWFkTXMoXG4gICAgICBEYXRlLm5vdygpIC0gbWVzc2FnZS5yZXF1ZXN0ZWRBdC5nZXRUaW1lKClcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBydW4ncyBmdWxsIHBheWxvYWQtZW5jcnlwdGlvbiBjYXBhYmlsaXR5LiBUaGlzIGluY2x1ZGVzIHRoZVxuICogc3ltbWV0cmljIGtleSBhbmQgWDI1NTE5IGtleXBhaXIgbmVlZGVkIHRvIG9wZW4gY3Jvc3MtcnVuIHNlYWxlZCBwYXlsb2Fkcy5cbiAqIE1pc3Npbmcgd29ybGQgc3VwcG9ydCBvciBrZXkgbWF0ZXJpYWwgcmVzb2x2ZXMgdG8gYHVuZGVmaW5lZGA7IGxvb2t1cCBhbmRcbiAqIGRlcml2YXRpb24gZmFpbHVyZXMgcHJvcGFnYXRlIHJhdGhlciB0aGFuIHNpbGVudGx5IGZhbGxpbmcgYmFjayB0byBwbGFpbnRleHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUnVuRW5jcnlwdGlvbktleShcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5PcklkOiBXb3JrZmxvd1J1biB8IHN0cmluZyxcbiAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmF3S2V5ID1cbiAgICB0eXBlb2YgcnVuT3JJZCA9PT0gJ3N0cmluZydcbiAgICAgID8gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bk9ySWQsIGNvbnRleHQpXG4gICAgICA6IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5PcklkKTtcbiAgcmV0dXJuIHJhd0tleSA/IGF3YWl0IGRlcml2ZVJ1blBheWxvYWRLZXlzKHJhd0tleSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbGF6eSwgbWVtb2l6ZWQgYWNjZXNzb3IgYXJvdW5kIHtAbGluayByZXNvbHZlUnVuRW5jcnlwdGlvbktleX0uXG4gKiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgdGhlIHNhbWUgcHJvbWlzZSwgaW5jbHVkaW5nIGl0cyByZWplY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplRW5jcnlwdGlvbktleShcbiAgd29ybGQ6IFdvcmxkLFxuICBydW5PcklkOiBXb3JrZmxvd1J1biB8IHN0cmluZ1xuKTogKCkgPT4gUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPiB7XG4gIGxldCBjYWNoZWQ6IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgIGNhY2hlZCA9IHJlc29sdmVSdW5FbmNyeXB0aW9uS2V5KHdvcmxkLCBydW5PcklkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quickjs-serde.d.ts","sourceRoot":"","sources":["../../src/runtime/quickjs-serde.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAUH,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"quickjs-serde.d.ts","sourceRoot":"","sources":["../../src/runtime/quickjs-serde.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAUH,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AA+O3D;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,GAAG,aAAa,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAExE;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAAC;IAC5C,qEAAqE;IACrE,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAAC;IAC7C;;;;;OAKG;IACH,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,wDAAwD;IACxD,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;IACjE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,OAAO;AACX;;;;;;;;GAQG;AACH,YAAY,CAAC,EAAE,aAAa,GAC3B,YAAY,CAu0Dd"}
|