@shumai-one/shumai-transcode 0.1.8 → 0.1.9
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/bin/{chunk-8m5z0v3d.js → chunk-e9eqczj7.js} +25 -2
- package/bin/shumai-transcode-app.js +116 -105
- package/package.json +7 -7
- package/prisma/migrations/20260711121142_add_agent_session_type/migration.sql +8 -0
- package/prisma/migrations/20260711123731_add_agent_session_name/migration.sql +2 -0
- package/prisma/migrations/20260711124459_add_naming_session_type/migration.sql +2 -0
- package/prisma/migrations/20260714024940_add_session_id_to_workflow_tasks/migration.sql +5 -0
- package/prisma/migrations/20260714025034_backfill_session_id_in_workflow_tasks/migration.sql +4 -0
- package/prisma/schema.prisma +11 -0
|
@@ -9438,7 +9438,10 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
9438
9438
|
/* harmony export */ getActivities: () => (/* binding */ getActivities),
|
|
9439
9439
|
/* harmony export */ getConcurrencyLimit: () => (/* binding */ getConcurrencyLimit),
|
|
9440
9440
|
/* harmony export */ isTemporal: () => (/* binding */ isTemporal),
|
|
9441
|
-
/* harmony export */
|
|
9441
|
+
/* harmony export */ registerLocalCancelHandler: () => (/* binding */ registerLocalCancelHandler),
|
|
9442
|
+
/* harmony export */ sleep: () => (/* binding */ sleep),
|
|
9443
|
+
/* harmony export */ triggerLocalCancel: () => (/* binding */ triggerLocalCancel),
|
|
9444
|
+
/* harmony export */ unregisterLocalCancelHandler: () => (/* binding */ unregisterLocalCancelHandler)
|
|
9442
9445
|
/* harmony export */ });
|
|
9443
9446
|
/* harmony import */ var _temporalio_workflow__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @temporalio/workflow */ "./node_modules/.bun/@temporalio+workflow@1.17.2/node_modules/@temporalio/workflow/lib/index.js");
|
|
9444
9447
|
/* harmony import */ var _temporalio_workflow__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_temporalio_workflow__WEBPACK_IMPORTED_MODULE_0__);
|
|
@@ -9591,6 +9594,26 @@ activityFunc, // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
9591
9594
|
}
|
|
9592
9595
|
return parsed;
|
|
9593
9596
|
}
|
|
9597
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9598
|
+
const globalObjWithCancel = globalThis;
|
|
9599
|
+
if (!globalObjWithCancel.__localCancelHandlers) {
|
|
9600
|
+
globalObjWithCancel.__localCancelHandlers = new Map();
|
|
9601
|
+
}
|
|
9602
|
+
const localCancelHandlers = globalObjWithCancel.__localCancelHandlers;
|
|
9603
|
+
function registerLocalCancelHandler(taskId, cancelFn) {
|
|
9604
|
+
localCancelHandlers.set(taskId, cancelFn);
|
|
9605
|
+
}
|
|
9606
|
+
function unregisterLocalCancelHandler(taskId) {
|
|
9607
|
+
localCancelHandlers.delete(taskId);
|
|
9608
|
+
}
|
|
9609
|
+
function triggerLocalCancel(taskId) {
|
|
9610
|
+
const handler = localCancelHandlers.get(taskId);
|
|
9611
|
+
if (handler) {
|
|
9612
|
+
handler();
|
|
9613
|
+
return true;
|
|
9614
|
+
}
|
|
9615
|
+
return false;
|
|
9616
|
+
}
|
|
9594
9617
|
|
|
9595
9618
|
|
|
9596
9619
|
/***/ },
|
|
@@ -11507,5 +11530,5 @@ exports.importInterceptors = function importInterceptors() {
|
|
|
11507
11530
|
__TEMPORAL__ = __webpack_exports__;
|
|
11508
11531
|
/******/ })()
|
|
11509
11532
|
;
|
|
11510
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBNEM7WUFDNUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FDakIsQ0FBQztZQUNGLElBQUksR0FBRyxHQUFHLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMs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LGlCQUFpQixRQUFRO0FBQ3pCLGlCQUFpQixVQUFVO0FBQzNCLG1CQUFtQixPQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7OztVQ3JsREE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0M1QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0EsRTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEEsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdELEU7Ozs7Ozs7Ozs7OztBQ0xBLFlBQVksbUJBQU8sQ0FBQywrSkFBOEM7QUFDbEUsV0FBVzs7QUFFWCxRQUFRLGtCQUFrQixFQUFFLG1CQUFPLENBQUMsK0pBQThDO0FBQ2xGOztBQUVBLHNCQUFzQjs7QUFFdEI7O0FBRUEsdUJBQXVCO0FBQ3ZCLFNBQVMsbUJBQU8sNEJBQTRCLDRFQUFpRTtBQUM3Rzs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1jYW5jZWxsYXRpb24tZGV0YWlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1vcHRpb25zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnRpbnVlLWFzLW5ldy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvZGF0YS1jb252ZXJ0ZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2ZhaWx1cmUtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvbnZlcnRlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvdHlwZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZGVwcmVjYXRlZC10aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2VuY29kaW5nLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2Vycm9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9mYWlsdXJlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVyY2VwdG9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcmZhY2VzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvb2JqZWN0cy1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2xvZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9tZXRyaWNzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ByaW9yaXR5LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3Jlc2VydmVkLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3JldHJ5LXBvbGljeS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy90aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3R5cGUtaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy91c2VyLW1ldGFkYXRhLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LWVudW0udHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdmVyc2lvbmluZy1pbnRlbnQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2VyLWRlcGxveW1lbnRzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy93b3JrZmxvdy1oYW5kbGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvYWxlYS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvY2FuY2VsbGF0aW9uLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9lcnJvcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ZsYWdzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9nbG9iYWwtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLW92ZXJyaWRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVyY2VwdG9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJmYWNlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJuYWxzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9sb2dzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9tZXRyaWNzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9uZXh1cy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvcGtnLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9zaW5rcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc3RhY2staGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdHJpZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdXBkYXRlLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZXItaW50ZXJmYWNlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZmxvdy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9oYW5kbGVyLWVycm9yLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL29wZXJhdGlvbi1lcnJvci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL29wZXJhdGlvbi1oYW5kbGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9zZXJ2aWNlLWhhbmRsZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL3N0YXJ0LW9wZXJhdGlvbi1yZXN1bHQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL29iamVjdC11dGlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2Uvc2VydmljZS1kZWZpbml0aW9uLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9hcHBzL3RyYW5zY29kZS9zcmMvd29ya2Zsb3dzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9wYWNrYWdlcy90cmFuc2NvZGUvc3JjL3dvcmtmbG93cy90cmFuc2NvZGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL3BhY2thZ2VzL3dvcmtmbG93LWNvcmUvc3JjL3dvcmtmbG93LXV0aWxzLnRzIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX2ZhaWx1cmVfY29udmVydGVyIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX3BheWxvYWRfY29udmVydGVyIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9tc0AzLjAuMC1jYW5hcnkuMS9ub2RlX21vZHVsZXMvbXMvZGlzdC9pbmRleC5janMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL2xvbmdANS4zLjIvbm9kZV9tb2R1bGVzL2xvbmcvdW1kL2luZGV4LmpzIiwid2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0IiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9hcHBzL3RyYW5zY29kZS9zcmMvd29ya2Zsb3dzLWF1dG9nZW5lcmF0ZWQtZW50cnlwb2ludC5janMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHNIb2xkZXIge1xuICBkZXRhaWxzPzogQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMge1xuICBub3RGb3VuZD86IGJvb2xlYW47XG4gIGNhbmNlbFJlcXVlc3RlZD86IGJvb2xlYW47XG4gIHBhdXNlZD86IGJvb2xlYW47XG4gIHRpbWVkT3V0PzogYm9vbGVhbjtcbiAgd29ya2VyU2h1dGRvd24/OiBib29sZWFuO1xuICByZXNldD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIHJlYXNvbnMgZm9yIHRoZSBhY3Rpdml0eSdzIGNhbmNlbGxhdGlvbi4gQ2FuY2VsbGF0aW9uIGRldGFpbHMgYXJlIHNldCBvbmNlIGFuZCBkbyBub3QgY2hhbmdlIG9uY2Ugc2V0LlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIHtcbiAgcmVhZG9ubHkgbm90Rm91bmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNhbmNlbFJlcXVlc3RlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGF1c2VkOiBib29sZWFuO1xuICByZWFkb25seSB0aW1lZE91dDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgd29ya2VyU2h1dGRvd246IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlc2V0OiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHNPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm5vdEZvdW5kID0gb3B0aW9ucy5ub3RGb3VuZCA/PyBmYWxzZTtcbiAgICB0aGlzLmNhbmNlbFJlcXVlc3RlZCA9IG9wdGlvbnMuY2FuY2VsUmVxdWVzdGVkID8/IGZhbHNlO1xuICAgIHRoaXMucGF1c2VkID0gb3B0aW9ucy5wYXVzZWQgPz8gZmFsc2U7XG4gICAgdGhpcy50aW1lZE91dCA9IG9wdGlvbnMudGltZWRPdXQgPz8gZmFsc2U7XG4gICAgdGhpcy53b3JrZXJTaHV0ZG93biA9IG9wdGlvbnMud29ya2VyU2h1dGRvd24gPz8gZmFsc2U7XG4gICAgdGhpcy5yZXNldCA9IG9wdGlvbnMucmVzZXQgPz8gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgZnJvbVByb3RvKFxuICAgIHByb3RvOiBjb3Jlc2RrLmFjdGl2aXR5X3Rhc2suSUFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIHtcbiAgICBpZiAocHJvdG8gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMoe1xuICAgICAgbm90Rm91bmQ6IHByb3RvLmlzTm90Rm91bmQgPz8gZmFsc2UsXG4gICAgICBjYW5jZWxSZXF1ZXN0ZWQ6IHByb3RvLmlzQ2FuY2VsbGVkID8/IGZhbHNlLFxuICAgICAgcGF1c2VkOiBwcm90by5pc1BhdXNlZCA/PyBmYWxzZSxcbiAgICAgIHRpbWVkT3V0OiBwcm90by5pc1RpbWVkT3V0ID8/IGZhbHNlLFxuICAgICAgd29ya2VyU2h1dGRvd246IHByb3RvLmlzV29ya2VyU2h1dGRvd24gPz8gZmFsc2UsXG4gICAgICByZXNldDogcHJvdG8uaXNSZXNldCA/PyBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBSZXRyeVBvbGljeSB9IGZyb20gJy4vcmV0cnktcG9saWN5JztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyBWZXJzaW9uaW5nSW50ZW50IH0gZnJvbSAnLi92ZXJzaW9uaW5nLWludGVudCc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBQcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknO1xuXG4vLyBOb3RlOiBUaGUgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgYXJlIGhlcmUgZm9yIGxlZ2FjeSByZWFzb25zLiBUaGV5IHNob3VsZCBoYXZlIGJlZW4gZGVmaW5lZFxuLy8gaW4gdGhlICd3b3JrZmxvdycgcGFja2FnZSwgaW5zdGVhZCBvZiAnY29tbW9uJy4gVGhleSBhcmUgbm93IHJlZXhwb3J0ZWQgZnJvbSB0aGUgJ3dvcmtmbG93J1xuLy8gcGFja2FnZSwgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gaW1wb3J0IHRoZW0sIGJ1dCB3ZSB1bmZvcnR1bmF0ZWx5IGNhbid0IHJlbW92ZSB0aGVtIGZyb21cbi8vIGhlcmUgYXMgdGhhdCB3b3VsZCBiZSBhIGJyZWFraW5nIGNoYW5nZS5cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gKiAtIHdoZW4gc2hvdWxkIHRoZSBBY3Rpdml0eSBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgdG8gV29ya2Zsb3cgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGVcbiAqICAgQWN0aXZpdHkgY2FsbCdzIHByb21pc2UgZmFpbCB3aXRoIGFuIGBBY3Rpdml0eUZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBjYW5jZWxsYXRpb24gYmVpbmdcbiAqIGV4dGVybmFsbHkgcmVxdWVzdGVkIG9uIHRoZSBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZVxuICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAqIGFsd2F5cyByZXN1bHRzIGluIGNhbmNlbGxhdGlvbiBvZiBpdHMgb3V0c3RhbmRpbmcgQWN0aXZpdHkgZXhlY3V0aW9ucywgcmVnYXJkbGVzcyBvZiB0aG9zZVxuICogQWN0aXZpdGllcycge0BsaW5rIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZX0gc2V0dGluZ3MuXG4gKlxuICogQGRlZmF1bHQgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICovXG4vLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGFuZFxuLy8gICAgICAgICAgICAgIGBMb2NhbEFjdGl2aXR5T3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlYCBmaWVsZHMgbGF0ZXIgaW4gdGhpcyBmaWxlLlxuZXhwb3J0IGNvbnN0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHRvIHRoZSBBY3Rpdml0eSwgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydCBjYW5jZWxsYXRpb25cbiAgICogdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eSwgeWV0IF9pbW1lZGlhdGVseV8gcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLCBpLmUuIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHNlcnZlciB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb25cbiAgICogcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgcHJvdmlkZXMgbm8gZ3VhcmFudGVlLCBmcm9tIHRoZSBXb3JrZmxvdy1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGFjdHVhbGx5IGJlIGRlbGl2ZXJlZCB0byB0aGUgQWN0aXZpdHk7IGUuZy4gdGhlIGNhbGxpbmcgV29ya2Zsb3dcbiAgICogbWF5IGV4aXQgYmVmb3JlIHRoZSBkZWxpdmVyeSBpcyBjb21wbGV0ZWQsIG9yIHRoZSBBY3Rpdml0eSBtYXkgY29tcGxldGUgKGVpdGhlciBzdWNjZXNzZnVsbHlcbiAgICogb3IgdW5jZXNzZnVsbHkpIGJlZm9yZSB0aGUgY2FuY2VsbGF0aW9uIGlzIGRlbGl2ZXJlZCwgcmVzdWx0aW5nIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZVxuICAgKiB3b3JrZmxvdyB0aGlua3MgdGhlIGFjdGl2aXR5IHdhcyBjYW5jZWxsZWQsIGJ1dCB0aGUgYWN0aXZpdHkgYWN0dWFsbHkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogVG8gZW5zdXJlIHRoYXQgdGhlIFdvcmtmbG93IGlzIHByb3Blcmx5IGluZm9ybWVkIG9mIHRoZSBBY3Rpdml0eSdzIGZpbmFsIHN0YXRlIChpLmUuIGVpdGhlclxuICAgKiBjb21wbGV0aW9uIG9yIGNhbmNlbGxhdGlvbiksIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eSwgYW5kIHdhaXQgZm9yIHRoZSBhY3Rpdml0eVxuICAgKiB0byBjb21wbGV0ZSBpdHMgZXhlY3V0aW9uIChlaXRoZXIgc3VjY2Vzc2Z1bGx5LCB1bmNlc3NmdWxseSwgb3IgYXMgY2FuY2VsbGVkKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBBY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCB0byByZWNlaXZlIGEgY2FuY2VsbGF0aW9uIG5vdGlmaWNhdGlvbi4gVGhpcyBjYW4gYmxvY2tcbiAgICogdGhlIFdvcmtmbG93J3MgY2FuY2VsbGF0aW9uIGZvciBhIGxvbmcgdGltZSBpZiB0aGUgQWN0aXZpdHkgZG9lc24ndCBoZWFydGJlYXQgb3IgY2hvb3NlcyB0b1xuICAgKiBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUgPSAodHlwZW9mIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLCBkZWNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAwLFxuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXTogMSxcbiAgICBbQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLkFCQU5ET05dOiAyLFxuICB9IGFzIGNvbnN0LFxuICAnJ1xuKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBub24tbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvbiBpbnNpZGUgYSB3b3JrZmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIHRvIHVzZSBmb3IgdHJhY2tpbmcgdGhlIGFjdGl2aXR5IGluIFdvcmtmbG93IGhpc3RvcnkuXG4gICAqIFRoZSBgYWN0aXZpdHlJZGAgY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZSBhY3Rpdml0eSBmdW5jdGlvbi5cbiAgICogRG9lcyBub3QgbmVlZCB0byBiZSB1bmlxdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFuIGluY3JlbWVudGFsIHNlcXVlbmNlIG51bWJlclxuICAgKi9cbiAgYWN0aXZpdHlJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBjdXJyZW50IHdvcmtlciB0YXNrIHF1ZXVlXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhlYXJ0YmVhdCBpbnRlcnZhbC4gQWN0aXZpdHkgbXVzdCBoZWFydGJlYXQgYmVmb3JlIHRoaXMgaW50ZXJ2YWwgcGFzc2VzIGFmdGVyIGEgbGFzdCBoZWFydGJlYXQgb3IgYWN0aXZpdHkgc3RhcnQuXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgaGVhcnRiZWF0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBSZXRyeVBvbGljeSB0aGF0IGRlZmluZSBob3cgYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgc2VydmVyLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLiBUbyBlbnN1cmUgemVybyByZXRyaWVzLCBzZXQgbWF4aW11bSBhdHRlbXB0cyB0byAxLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIG9mIGEgc2luZ2xlIEFjdGl2aXR5IGV4ZWN1dGlvbiBhdHRlbXB0LiBOb3RlIHRoYXQgdGhlIFRlbXBvcmFsIFNlcnZlciBkb2Vzbid0IGRldGVjdCBXb3JrZXIgcHJvY2Vzc1xuICAgKiBmYWlsdXJlcyBkaXJlY3RseTogaW5zdGVhZCwgaXQgcmVsaWVzIG9uIHRoaXMgdGltZW91dCB0byBkZXRlY3QgdGhhdCBhbiBBY3Rpdml0eSBkaWRuJ3QgY29tcGxldGUgb24gdGltZS4gVGhlcmVmb3JlLCB0aGlzXG4gICAqIHRpbWVvdXQgc2hvdWxkIGJlIGFzIHNob3J0IGFzIHRoZSBsb25nZXN0IHBvc3NpYmxlIGV4ZWN1dGlvbiBvZiB0aGUgQWN0aXZpdHkgYm9keS4gUG90ZW50aWFsbHkgbG9uZy1ydW5uaW5nXG4gICAqIEFjdGl2aXRpZXMgbXVzdCBzcGVjaWZ5IHtAbGluayBoZWFydGJlYXRUaW1lb3V0fSBhbmQgY2FsbCB7QGxpbmsgYWN0aXZpdHkuQ29udGV4dC5oZWFydGJlYXR9IHBlcmlvZGljYWxseSBmb3JcbiAgICogdGltZWx5IGZhaWx1cmUgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgb3IgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc3RhcnRUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaW1lIHRoYXQgdGhlIEFjdGl2aXR5IFRhc2sgY2FuIHN0YXkgaW4gdGhlIFRhc2sgUXVldWUgYmVmb3JlIGl0IGlzIHBpY2tlZCB1cCBieSBhIFdvcmtlci4gRG8gbm90IHNwZWNpZnkgdGhpcyB0aW1lb3V0IHVubGVzcyB1c2luZyBob3N0LXNwZWNpZmljIFRhc2sgUXVldWVzIGZvciBBY3Rpdml0eSBUYXNrcyBhcmUgYmVpbmcgdXNlZCBmb3Igcm91dGluZy5cbiAgICogYHNjaGVkdWxlVG9TdGFydFRpbWVvdXRgIGlzIGFsd2F5cyBub24tcmV0cnlhYmxlLiBSZXRyeWluZyBhZnRlciB0aGlzIHRpbWVvdXQgZG9lc24ndCBtYWtlIHNlbnNlIGFzIGl0IHdvdWxkIGp1c3QgcHV0IHRoZSBBY3Rpdml0eSBUYXNrIGJhY2sgaW50byB0aGUgc2FtZSBUYXNrIFF1ZXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgb3IgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUb3RhbCB0aW1lIHRoYXQgYSB3b3JrZmxvdyBpcyB3aWxsaW5nIHRvIHdhaXQgZm9yIHRoZSBBY3Rpdml0eSB0byBjb21wbGV0ZS5cbiAgICogYHNjaGVkdWxlVG9DbG9zZVRpbWVvdXRgIGxpbWl0cyB0aGUgdG90YWwgdGltZSBvZiBhbiBBY3Rpdml0eSdzIGV4ZWN1dGlvbiBpbmNsdWRpbmcgcmV0cmllcyAodXNlIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSB0byBsaW1pdCB0aGUgdGltZSBvZiBhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAgICogLSB3aGVuIHNob3VsZCB0aGUgQWN0aXZpdHkgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIHRvIFdvcmtmbG93IChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlXG4gICAqICAgQWN0aXZpdHkgY2FsbCdzIHByb21pc2UgZmFpbCB3aXRoIGFuIGBBY3Rpdml0eUZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gY2FuY2VsbGF0aW9uIGJlaW5nXG4gICAqIGV4dGVybmFsbHkgcmVxdWVzdGVkIG9uIHRoZSBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZVxuICAgKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKiBhbHdheXMgcmVzdWx0cyBpbiBjYW5jZWxsYXRpb24gb2YgaXRzIG91dHN0YW5kaW5nIEFjdGl2aXR5IGV4ZWN1dGlvbnMsIHJlZ2FyZGxlc3Mgb2YgdGhvc2VcbiAgICogQWN0aXZpdGllcycge0BsaW5rIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZX0gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgY2FuY2VsbGF0aW9uVHlwZT86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogRWFnZXIgZGlzcGF0Y2ggaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaW1wcm92ZXMgdGhlIHRocm91Z2hwdXQgYW5kIGxvYWQgb24gdGhlIHNlcnZlciBmb3Igc2NoZWR1bGluZyBBY3Rpdml0aWVzLlxuICAgKiBXaGVuIHVzZWQsIHRoZSBzZXJ2ZXIgd2lsbCBoYW5kIG91dCBBY3Rpdml0eSB0YXNrcyBiYWNrIHRvIHRoZSBXb3JrZXIgd2hlbiBpdCBjb21wbGV0ZXMgYSBXb3JrZmxvdyB0YXNrLlxuICAgKiBJdCBpcyBhdmFpbGFibGUgZnJvbSBzZXJ2ZXIgdmVyc2lvbiAxLjE3IGJlaGluZCB0aGUgYHN5c3RlbS5lbmFibGVBY3Rpdml0eUVhZ2VyRXhlY3V0aW9uYCBmZWF0dXJlIGZsYWcuXG4gICAqXG4gICAqIEVhZ2VyIGRpc3BhdGNoIHdpbGwgb25seSBiZSB1c2VkIGlmIGBhbGxvd0VhZ2VyRGlzcGF0Y2hgIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSBhbmQge0BsaW5rIHRhc2tRdWV1ZX0gaXMgZWl0aGVyXG4gICAqIG9taXR0ZWQgb3IgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgV29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGFsbG93RWFnZXJEaXNwYXRjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgQWN0aXZpdHkgc2hvdWxkIHJ1biBvbiBhXG4gICAqIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgYWN0aXZpdHlcbiAgICovXG4gIHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lcyBob3cgYW4gYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgU0RLLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLlxuICAgKiBOb3RlIHRoYXQgbG9jYWwgYWN0aXZpdGllcyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgbWF4aW11bSBhdHRlbXB0cyBpcyBzZXQgdG8gMSBkdWUgdG8gV29ya2Zsb3cgdGFzayByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIHRhc2sgaXMgZGlzcGF0Y2hlZC4gVGhpc1xuICAgKiB0aW1lb3V0IGlzIGFsd2F5cyByZXRyeWFibGUuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqIElmIHNldCwgdGhpcyBtdXN0IGJlIDw9IHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpbWl0cyB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBjYW4gaWRsZSBpbnRlcm5hbGx5IGJlZm9yZSBiZWluZyBleGVjdXRlZC4gVGhhdCBjYW4gaGFwcGVuIGlmXG4gICAqIHRoZSB3b3JrZXIgaXMgY3VycmVudGx5IGF0IG1heCBjb25jdXJyZW50IGxvY2FsIGFjdGl2aXR5IGV4ZWN1dGlvbnMuIFRoaXMgdGltZW91dCBpcyBhbHdheXNcbiAgICogbm9uIHJldHJ5YWJsZSBhcyBhbGwgYSByZXRyeSB3b3VsZCBhY2hpZXZlIGlzIHRvIHB1dCBpdCBiYWNrIGludG8gdGhlIHNhbWUgcXVldWUuIERlZmF1bHRzXG4gICAqIHRvIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpZiBub3Qgc3BlY2lmaWVkIGFuZCB0aGF0IGlzIHNldC4gTXVzdCBiZSA8PVxuICAgKiB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gd2hlbiBzZXQsIG90aGVyd2lzZSwgaXQgd2lsbCBiZSBjbGFtcGVkIGRvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0IGZvciBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uLiBMaW1pdHMgaG93XG4gICAqIGxvbmcgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZC5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWN0aXZpdHkgaXMgcmV0cnlpbmcgYW5kIGJhY2tvZmYgd291bGQgZXhjZWVkIHRoaXMgdmFsdWUsIGEgc2VydmVyIHNpZGUgdGltZXIgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IGF0dGVtcHQuXG4gICAqIE90aGVyd2lzZSwgYmFja29mZiB3aWxsIGhhcHBlbiBpbnRlcm5hbGx5IGluIHRoZSBTREsuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgbWludXRlXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiovXG4gIGxvY2FsUmV0cnlUaHJlc2hvbGQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gICAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICAgKiAgIEFjdGl2aXR5IGNhbGwncyBwcm9taXNlIGZhaWwgd2l0aCBhbiBgQWN0aXZpdHlGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICAgKiBleHRlcm5hbGx5IHJlcXVlc3RlZCBvbiB0aGUgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGVcbiAgICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gICAqIEFjdGl2aXRpZXMnIHtAbGluayBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGV9IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgTWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gPSB7XG4gIEhJU1RPUllfU0laRV9UT09fTEFSR0U6ICdISVNUT1JZX1NJWkVfVE9PX0xBUkdFJyxcbiAgVE9PX01BTllfSElTVE9SWV9FVkVOVFM6ICdUT09fTUFOWV9ISVNUT1JZX0VWRU5UUycsXG4gIFRPT19NQU5ZX1VQREFURVM6ICdUT09fTUFOWV9VUERBVEVTJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiA9ICh0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24pW2tleW9mIHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLCBkZWNvZGVTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gICdTVUdHRVNUX0NPTlRJTlVFX0FTX05FV19SRUFTT05fJ1xuPihcbiAge1xuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5ISVNUT1JZX1NJWkVfVE9PX0xBUkdFXTogMSxcbiAgICBbU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24uVE9PX01BTllfSElTVE9SWV9FVkVOVFNdOiAyLFxuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5UT09fTUFOWV9VUERBVEVTXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1NVR0dFU1RfQ09OVElOVUVfQVNfTkVXX1JFQVNPTl8nXG4pO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uc0Zyb21Qcm90byhcbiAgcmVhc29uczogdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlYXNvbnMgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZXM6IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlYXNvbnMpIHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24ocik7XG4gICAgaWYgKGRlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnB1c2goZGVjb2RlZCk7XG4gICAgfVxuICB9XG4gIGlmIChyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBGYWlsdXJlQ29udmVydGVyIH0gZnJvbSAnLi9mYWlsdXJlLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciB9IGZyb20gJy4vZmFpbHVyZS1jb252ZXJ0ZXInO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29kZWMgfSBmcm9tICcuL3BheWxvYWQtY29kZWMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFdoZW4geW91ciBkYXRhIChhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMpIGlzIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgc3RvcmVkIGJ5IFRlbXBvcmFsIFNlcnZlciwgaXQgaXMgZW5jb2RlZCBpblxuICogYmluYXJ5IGluIGEge0BsaW5rIFBheWxvYWR9IFByb3RvYnVmIG1lc3NhZ2UuXG4gKlxuICogVGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIHN1cHBvcnRzIGB1bmRlZmluZWRgLCBgVWludDhBcnJheWAsIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgZGF0YSBjb252ZXJ0ZXIgd2lsbCB3b3JrKS4gUHJvdG9idWZzIGFyZSBzdXBwb3J0ZWQgdmlhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGF0YS1jb252ZXJ0ZXJzI3Byb3RvYnVmcyB8IHRoaXMgQVBJfS5cbiAqXG4gKiBVc2UgYSBjdXN0b20gYERhdGFDb252ZXJ0ZXJgIHRvIGNvbnRyb2wgdGhlIGNvbnRlbnRzIG9mIHlvdXIge0BsaW5rIFBheWxvYWR9cy4gQ29tbW9uIHJlYXNvbnMgZm9yIHVzaW5nIGEgY3VzdG9tXG4gKiBgRGF0YUNvbnZlcnRlcmAgYXJlOlxuICogLSBDb252ZXJ0aW5nIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCAoZm9yIGV4YW1wbGUsIGBKU09OLnN0cmluZ2lmeSgpYCBkb2Vzbid0XG4gKiAgIGhhbmRsZSBgQmlnSW50YHMsIHNvIGlmIHlvdSB3YW50IHRvIHJldHVybiBgeyB0b3RhbDogMTAwMG4gfWAgZnJvbSBhIFdvcmtmbG93LCBTaWduYWwsIG9yIEFjdGl2aXR5LCB5b3UgbmVlZCB5b3VyXG4gKiAgIG93biBgRGF0YUNvbnZlcnRlcmApLlxuICogLSBFbmNyeXB0aW5nIHZhbHVlcyB0aGF0IG1heSBjb250YWluIHByaXZhdGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgZG9uJ3Qgd2FudCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluIFRlbXBvcmFsIFNlcnZlcidzXG4gKiAgIGRhdGFiYXNlLlxuICogLSBDb21wcmVzc2luZyB2YWx1ZXMgdG8gcmVkdWNlIGRpc2sgb3IgbmV0d29yayB1c2FnZS5cbiAqXG4gKiBUbyB1c2UgeW91ciBjdXN0b20gYERhdGFDb252ZXJ0ZXJgLCBwcm92aWRlIGl0IHRvIHRoZSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9LCB7QGxpbmsgV29ya2VyfSwgYW5kXG4gKiB7QGxpbmsgYnVuZGxlV29ya2Zsb3dDb2RlfSAoaWYgeW91IHVzZSBpdCk6XG4gKiAtIGBuZXcgV29ya2Zsb3dDbGllbnQoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBXb3JrZXIuY3JlYXRlKHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgYnVuZGxlV29ya2Zsb3dDb2RlKHsgLi4uLCBwYXlsb2FkQ29udmVydGVyUGF0aCB9KWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYHBheWxvYWRDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYHBheWxvYWRDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgcGF5bG9hZENvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYGZhaWx1cmVDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYGZhaWx1cmVDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGYWlsdXJlQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgZmFpbHVyZUNvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkQ29kZWN9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUGF5bG9hZHMgYXJlIGVuY29kZWQgaW4gdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBhbmQgZGVjb2RlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhXG4gICAqIGNvbXByZXNzaW9uIGNvZGVjIGFuZCBhbiBlbmNyeXB0aW9uIGNvZGVjLCB0aGVuIHlvdSB3YW50IGRhdGEgdG8gYmUgZW5jb2RlZCB3aXRoIHRoZSBjb21wcmVzc2lvbiBjb2RlYyBmaXJzdCwgc29cbiAgICogeW91J2QgZG8gYHBheWxvYWRDb2RlY3M6IFtjb21wcmVzc2lvbkNvZGVjLCBlbmNyeXB0aW9uQ29kZWNdYC5cbiAgICovXG4gIHBheWxvYWRDb2RlY3M/OiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEYXRhQ29udmVydGVyfSB0aGF0IGhhcyBiZWVuIGxvYWRlZCB2aWEge0BsaW5rIGxvYWREYXRhQ29udmVydGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWREYXRhQ29udmVydGVyIHtcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcjtcbiAgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlcjtcbiAgcGF5bG9hZENvZGVjczogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy5cbiAqXG4gKiBFcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFyZSBzZXJpemFsaXplZCBhcyBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBBIFwibG9hZGVkXCIgZGF0YSBjb252ZXJ0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IHNldCBvZiBmYWlsdXJlIGFuZCBwYXlsb2FkIGNvbnZlcnRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YUNvbnZlcnRlcjogTG9hZGVkRGF0YUNvbnZlcnRlciA9IHtcbiAgcGF5bG9hZENvbnZlcnRlcjogZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGZhaWx1cmVDb252ZXJ0ZXI6IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBwYXlsb2FkQ29kZWNzOiBbXSxcbn07XG4iLCJpbXBvcnQgKiBhcyBuZXh1cyBmcm9tICduZXh1cy1ycGMnO1xuaW1wb3J0IExvbmcgZnJvbSAnbG9uZyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQcm90b0ZhaWx1cmUgfSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7XG4gIEFjdGl2aXR5RmFpbHVyZSxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksXG4gIGRlY29kZVJldHJ5U3RhdGUsXG4gIGRlY29kZVRpbWVvdXRUeXBlLFxuICBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgZW5jb2RlUmV0cnlTdGF0ZSxcbiAgZW5jb2RlVGltZW91dFR5cGUsXG4gIEZBSUxVUkVfU09VUkNFLFxuICBOZXh1c09wZXJhdGlvbkZhaWx1cmUsXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgaXNFcnJvciB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJy4uL3RpbWUnO1xuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBhcnJheUZyb21QYXlsb2FkcywgZnJvbVBheWxvYWRzQXRJbmRleCwgdG9QYXlsb2FkcyB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vLyBDYW4ndCBpbXBvcnQgcHJvdG8gZW51bXMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgdXNlIHRoaXMgaGVscGVyIHR5cGUgYW5kIGVudW0gY29udmVydGVyIGluc3RlYWQuXG5jb25zdCBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgPSB7XG4gIFJFVFJZQUJMRTogJ1JFVFJZQUJMRScsXG4gIE5PTl9SRVRSWUFCTEU6ICdOT05fUkVUUllBQkxFJyxcbn0gYXMgY29uc3Q7XG50eXBlIE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciA9XG4gICh0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKVtrZXlvZiB0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXTtcblxuY29uc3QgW2VuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciwgZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gIHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gICdORVhVU19IQU5ETEVSX0VSUk9SX1JFVFJZX0JFSEFWSU9SXydcbj4oXG4gIHtcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgICBbTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLlJFVFJZQUJMRV06IDEsXG4gICAgW05leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvci5OT05fUkVUUllBQkxFXTogMixcbiAgfSBhcyBjb25zdCxcbiAgJ05FWFVTX0hBTkRMRVJfRVJST1JfUkVUUllfQkVIQVZJT1JfJ1xuKTtcblxuZnVuY3Rpb24gY29tYmluZVJlZ0V4cCguLi5yZWdleHBzOiBSZWdFeHBbXSk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cHMubWFwKCh4KSA9PiBgKD86JHt4LnNvdXJjZX0pYCkuam9pbignfCcpKTtcbn1cblxuLyoqXG4gKiBTdGFjayB0cmFjZXMgd2lsbCBiZSBjdXRvZmYgd2hlbiBvbiBvZiB0aGVzZSBwYXR0ZXJucyBpcyBtYXRjaGVkXG4gKi9cbmNvbnN0IENVVE9GRl9TVEFDS19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBBY3Rpdml0eSBleGVjdXRpb24gKi9cbiAgL1xccythdCAoQWN0aXZpdHlcXC4pP2V4ZWN1dGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIE5leHVzIGV4ZWN1dGlvbiAqL1xuICAvXFxzK2F0KCBhc3luYyk/IChOZXh1c0hhbmRsZXJcXC4pP2ludm9rZVVzZXJDb2RlIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11uZXh1c1tcXFxcL11pbmRleFxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBhY3RpdmF0aW9uIChpbmJvdW5kIGhhbmRsZXJzIG9ubHkpICovXG4gIC9cXHMrYXQoIGFzeW5jKT8gKEFjdGl2YXRvclxcLik/KHN0YXJ0V29ya2Zsb3d8cXVlcnlXb3JrZmxvd3xzaWduYWxXb3JrZmxvd3x1cGRhdGV8dmFsaWRhdGVVcGRhdGUpTmV4dEhhbmRsZXIgXFwoLipcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogV29ya2Zsb3cgcnVuIGFueXRoaW5nIGluIGNvbnRleHQgKi9cbiAgL1xccythdCAoU2NyaXB0XFwuKT9ydW5JbkNvbnRleHQgXFwobmF0aXZlfHVua25vd258KD86KD86bm9kZTp2bXx2bVxcLmpzKTpcXGQrOlxcZCspXFwpL1xuKTtcblxuLyoqXG4gKiBBbnkgc3RhY2sgdHJhY2UgZnJhbWVzIHRoYXQgbWF0Y2ggYW55IG9mIHRob3NlIHdpbCBiZSBkb3BwZWQuXG4gKiBUaGUgXCJudWxsLlwiIHByZWZpeCBvbiBzb21lIGNhc2VzIGlzIHRvIGF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDI0MTdcbiAqL1xuY29uc3QgRFJPUFBFRF9TVEFDS19GUkFNRVNfUEFUVEVSTlMgPSBjb21iaW5lUmVnRXhwKFxuICAvKiogSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2hhaW4gaW50ZXJjZXB0b3JzICovXG4gIC9cXHMrYXQgKG51bGxcXC4pP25leHQgXFwoLipbXFxcXC9dY29tbW9uW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWludGVyY2VwdG9yc1xcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/ZXhlY3V0ZU5leHRIYW5kbGVyIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11hY3Rpdml0eVxcLltqdF1zOlxcZCs6XFxkK1xcKS9cbik7XG5cbi8qKlxuICogQ3V0cyBvdXQgdGhlIGZyYW1ld29yayBwYXJ0IG9mIGEgc3RhY2sgdHJhY2UsIGxlYXZpbmcgb25seSB1c2VyIGNvZGUgZW50cmllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3V0b2ZmU3RhY2tUcmFjZShzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gKHN0YWNrID8/ICcnKS5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBhY2MgPSBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChDVVRPRkZfU1RBQ0tfUEFUVEVSTlMudGVzdChsaW5lKSkgYnJlYWs7XG4gICAgaWYgKCFEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUy50ZXN0KGxpbmUpKSBhY2MucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gYWNjLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEEgYEZhaWx1cmVDb252ZXJ0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGZyb20gcHJvdG8gYEZhaWx1cmVgIGluc3RhbmNlcyB0byBKUyBgRXJyb3JzYCBhbmQgYmFjay5cbiAqXG4gKiBXZSByZWNvbW1lbmRlZCB1c2luZyB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpbnN0ZWFkIG9mIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGluIG9yZGVyXG4gKiB0byBtYWludGFpbiBjcm9zcy1sYW5ndWFnZSBGYWlsdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2F1Z2h0IGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlLlxuICAgKi9cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIGVycm9yIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYFRlbXBvcmFsRmFpbHVyZWAuXG4gICAqL1xuICBmYWlsdXJlVG9FcnJvcihlcnI6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IEVycm9yO1xufVxuXG4vKipcbiAqIFRoZSBcInNoYXBlXCIgb2YgdGhlIGF0dHJpYnV0ZXMgc2V0IGFzIHRoZSB7QGxpbmsgUHJvdG9GYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzfSBwYXlsb2FkIGluIGNhc2VcbiAqIHtAbGluayBEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzLmVuY29kZUNvbW1vbkF0dHJpYnV0ZXN9IGlzIHNldCB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcyB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2tfdHJhY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBlbmNvZGUgZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyAoZm9yIGVuY3J5cHRpbmcgdGhlc2UgYXR0cmlidXRlcyB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfSkuXG4gICAqL1xuICBlbmNvZGVDb21tb25BdHRyaWJ1dGVzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlZmF1bHQsIGNyb3NzLWxhbmd1YWdlLWNvbXBhdGlibGUgRmFpbHVyZSBjb252ZXJ0ZXIuXG4gKlxuICogQnkgZGVmYXVsdCwgaXQgd2lsbCBsZWF2ZSBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFzIHBsYWluIHRleHQuIEluIG9yZGVyIHRvIGVuY3J5cHQgdGhlbSwgc2V0XG4gKiBgZW5jb2RlQ29tbW9uQXR0cmlidXRlc2AgdG8gYHRydWVgIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfSB0aGF0IGNhbiBlbmNyeXB0IC9cbiAqIGRlY3J5cHQgUGF5bG9hZHMgaW4geW91ciB7QGxpbmsgV29ya2VyT3B0aW9ucy5kYXRhQ29udmVydGVyIHwgV29ya2VyfSBhbmRcbiAqIHtAbGluayBDbGllbnRPcHRpb25zLmRhdGFDb252ZXJ0ZXIgfCBDbGllbnQgb3B0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciBpbXBsZW1lbnRzIEZhaWx1cmVDb252ZXJ0ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucz4pIHtcbiAgICBjb25zdCB7IGVuY29kZUNvbW1vbkF0dHJpYnV0ZXMgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgZW5jb2RlQ29tbW9uQXR0cmlidXRlczogZW5jb2RlQ29tbW9uQXR0cmlidXRlcyA/PyBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBEb2VzIG5vdCBzZXQgY29tbW9uIHByb3BlcnRpZXMsIHRoYXQgaXMgZG9uZSBpbiB7QGxpbmsgZmFpbHVyZVRvRXJyb3J9LlxuICAgKi9cbiAgZmFpbHVyZVRvRXJyb3JJbm5lcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBFcnJvciB7XG4gICAgaWYgKGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby50eXBlLFxuICAgICAgICBCb29sZWFuKGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5ub25SZXRyeWFibGUpLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8uZGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBkZWNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeShmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8uY2F0ZWdvcnkpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5zZXJ2ZXJGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBCb29sZWFuKGZhaWx1cmUuc2VydmVyRmFpbHVyZUluZm8ubm9uUmV0cnlhYmxlKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBUaW1lb3V0RmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZnJvbVBheWxvYWRzQXRJbmRleChwYXlsb2FkQ29udmVydGVyLCAwLCBmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mby5sYXN0SGVhcnRiZWF0RGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICBkZWNvZGVUaW1lb3V0VHlwZShmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mby50aW1lb3V0VHlwZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnRlcm1pbmF0ZWRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtaW5hdGVkRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmNhbmNlbGVkRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGVkRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5jYW5jZWxlZEZhaWx1cmVJbmZvLmRldGFpbHM/LnBheWxvYWRzKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnJlc2V0V29ya2Zsb3dGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICdSZXNldFdvcmtmbG93JyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUucmVzZXRXb3JrZmxvd0ZhaWx1cmVJbmZvLmxhc3RIZWFydGJlYXREZXRhaWxzPy5wYXlsb2FkcyksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5jaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIGNvbnN0IHsgbmFtZXNwYWNlLCB3b3JrZmxvd1R5cGUsIHdvcmtmbG93RXhlY3V0aW9uLCByZXRyeVN0YXRlIH0gPSBmYWlsdXJlLmNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbztcbiAgICAgIGlmICghKHdvcmtmbG93VHlwZT8ubmFtZSAmJiB3b3JrZmxvd0V4ZWN1dGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhdHRyaWJ1dGVzIG9uIGNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBDaGlsZFdvcmtmbG93RmFpbHVyZShcbiAgICAgICAgbmFtZXNwYWNlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dFeGVjdXRpb24sXG4gICAgICAgIHdvcmtmbG93VHlwZS5uYW1lLFxuICAgICAgICBkZWNvZGVSZXRyeVN0YXRlKHJldHJ5U3RhdGUpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mbykge1xuICAgICAgaWYgKCFmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlUeXBlPy5uYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZpdHlUeXBlPy5uYW1lIG9uIGFjdGl2aXR5RmFpbHVyZUluZm8nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQWN0aXZpdHlGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlUeXBlLm5hbWUsXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eUlkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZGVjb2RlUmV0cnlTdGF0ZShmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8ucmV0cnlTdGF0ZSksXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5pZGVudGl0eSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5uZXh1c0hhbmRsZXJGYWlsdXJlSW5mbykge1xuICAgICAgbGV0IHJldHJ5YWJsZU92ZXJyaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmV0cnlCZWhhdmlvciA9IGRlY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcihmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvLnJldHJ5QmVoYXZpb3IpO1xuICAgICAgc3dpdGNoIChyZXRyeUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgJ1JFVFJZQUJMRSc6XG4gICAgICAgICAgcmV0cnlhYmxlT3ZlcnJpZGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdOT05fUkVUUllBQkxFJzpcbiAgICAgICAgICByZXRyeWFibGVPdmVycmlkZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXdFcnJvclR5cGUgPSBmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvLnR5cGUgfHwgJyc7XG4gICAgICBjb25zdCByZXNvbHZlZFR5cGU6IG5leHVzLkhhbmRsZXJFcnJvclR5cGUgPSBPYmplY3QuaGFzT3duKG5leHVzLkhhbmRsZXJFcnJvclR5cGUsIHJhd0Vycm9yVHlwZSlcbiAgICAgICAgPyBuZXh1cy5IYW5kbGVyRXJyb3JUeXBlW3Jhd0Vycm9yVHlwZSBhcyBrZXlvZiB0eXBlb2YgbmV4dXMuSGFuZGxlckVycm9yVHlwZV1cbiAgICAgICAgOiAnVU5LTk9XTic7XG5cbiAgICAgIHJldHVybiBuZXcgbmV4dXMuSGFuZGxlckVycm9yKHJlc29sdmVkVHlwZSwgZmFpbHVyZS5tZXNzYWdlID8/ICdOZXh1cyBoYW5kbGVyIGVycm9yJywge1xuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciksXG4gICAgICAgIHJldHJ5YWJsZU92ZXJyaWRlLFxuICAgICAgICByYXdFcnJvclR5cGUsXG4gICAgICAgIG9yaWdpbmFsRmFpbHVyZTogdGhpcy50ZW1wb3JhbEZhaWx1cmVUb05leHVzRmFpbHVyZShmYWlsdXJlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IE5leHVzT3BlcmF0aW9uRmFpbHVyZShcbiAgICAgICAgLy8gVE9ETyhuZXh1cy9lcnJvcik6IE1heWJlIHNldCBhIGRlZmF1bHQgbWVzc2FnZSBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5zY2hlZHVsZWRFdmVudElkPy50b051bWJlcigpLFxuICAgICAgICAvLyBXZSBhc3N1bWUgdGhlc2Ugd2lsbCBhbHdheXMgYmUgc2V0IG9yIGdyYWNlZnVsbHkgc2V0IHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5lbmRwb2ludCA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLnNlcnZpY2UgPz8gJycsXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5vcGVyYXRpb24gPz8gJycsXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5vcGVyYXRpb25Ub2tlbiA/PyB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlbXBvcmFsRmFpbHVyZShcbiAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICk7XG4gIH1cblxuICBmYWlsdXJlVG9FcnJvcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBFcnJvciB7XG4gICAgaWYgKGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gcGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZDxEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzPihmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzKTtcbiAgICAgIC8vIERvbid0IGFwcGx5IGVuY29kZWRBdHRyaWJ1dGVzIHVubGVzcyB0aGV5IGNvbmZvcm0gdG8gYW4gZXhwZWN0ZWQgc2NoZW1hXG4gICAgICBpZiAodHlwZW9mIGF0dHJzID09PSAnb2JqZWN0JyAmJiBhdHRycyAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlIH0gPSBhdHRycztcbiAgICAgICAgLy8gQXZvaWQgbXV0YXRpbmcgdGhlIGFyZ3VtZW50XG4gICAgICAgIGZhaWx1cmUgPSB7IC4uLmZhaWx1cmUgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGZhaWx1cmUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdGFja190cmFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSBzdGFja190cmFjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlcnIgPSB0aGlzLmZhaWx1cmVUb0Vycm9ySW5uZXIoZmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcik7XG4gICAgZXJyLnN0YWNrID0gZmFpbHVyZS5zdGFja1RyYWNlID8/ICcnO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgIGVyci5mYWlsdXJlID0gZmFpbHVyZTtcbiAgICB9XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlKGVycjogdW5rbm93biwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFByb3RvRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IHRoaXMuZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnIsIHBheWxvYWRDb252ZXJ0ZXIpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jb2RlQ29tbW9uQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja1RyYWNlIH0gPSBmYWlsdXJlO1xuICAgICAgZmFpbHVyZS5tZXNzYWdlID0gJ0VuY29kZWQgZmFpbHVyZSc7XG4gICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSAnJztcbiAgICAgIGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlOiBzdGFja1RyYWNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZTtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlSW5uZXIoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIG5leHVzLkhhbmRsZXJFcnJvcikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSAmJiBlcnIuZmFpbHVyZSkgcmV0dXJuIGVyci5mYWlsdXJlO1xuICAgICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrVHJhY2U6IGN1dG9mZlN0YWNrVHJhY2UoZXJyLnN0YWNrKSxcbiAgICAgICAgY2F1c2U6IHRoaXMub3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKGVyci5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciksXG4gICAgICAgIHNvdXJjZTogRkFJTFVSRV9TT1VSQ0UsXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQWN0aXZpdHlGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBhY3Rpdml0eUZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICAuLi5lcnIsXG4gICAgICAgICAgICByZXRyeVN0YXRlOiBlbmNvZGVSZXRyeVN0YXRlKGVyci5yZXRyeVN0YXRlKSxcbiAgICAgICAgICAgIGFjdGl2aXR5VHlwZTogeyBuYW1lOiBlcnIuYWN0aXZpdHlUeXBlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBDaGlsZFdvcmtmbG93RmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICAuLi5lcnIsXG4gICAgICAgICAgICByZXRyeVN0YXRlOiBlbmNvZGVSZXRyeVN0YXRlKGVyci5yZXRyeVN0YXRlKSxcbiAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiBlcnIuZXhlY3V0aW9uLFxuICAgICAgICAgICAgd29ya2Zsb3dUeXBlOiB7IG5hbWU6IGVyci53b3JrZmxvd1R5cGUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgYXBwbGljYXRpb25GYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgdHlwZTogZXJyLnR5cGUsXG4gICAgICAgICAgICBub25SZXRyeWFibGU6IGVyci5ub25SZXRyeWFibGUsXG4gICAgICAgICAgICBkZXRhaWxzOlxuICAgICAgICAgICAgICBlcnIuZGV0YWlscyAmJiBlcnIuZGV0YWlscy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgLi4uZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5leHRSZXRyeURlbGF5OiBtc09wdGlvbmFsVG9UcyhlcnIubmV4dFJldHJ5RGVsYXkpLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGVuY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5KGVyci5jYXRlZ29yeSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjYW5jZWxlZEZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICBkZXRhaWxzOlxuICAgICAgICAgICAgICBlcnIuZGV0YWlscyAmJiBlcnIuZGV0YWlscy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgLi4uZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRpbWVvdXRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0aW1lb3V0RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHRpbWVvdXRUeXBlOiBlbmNvZGVUaW1lb3V0VHlwZShlcnIudGltZW91dFR5cGUpLFxuICAgICAgICAgICAgbGFzdEhlYXJ0YmVhdERldGFpbHM6IGVyci5sYXN0SGVhcnRiZWF0RGV0YWlsc1xuICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzKSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgU2VydmVyRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgc2VydmVyRmFpbHVyZUluZm86IHsgbm9uUmV0cnlhYmxlOiBlcnIubm9uUmV0cnlhYmxlIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVybWluYXRlZEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRlcm1pbmF0ZWRGYWlsdXJlSW5mbzoge30sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgbmV4dXMuSGFuZGxlckVycm9yKSB7XG4gICAgICAgIGlmIChlcnIub3JpZ2luYWxGYWlsdXJlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUoZXJyLm9yaWdpbmFsRmFpbHVyZSwgZXJyLnJldHJ5YWJsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHJ5QmVoYXZpb3I6IHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgc3dpdGNoIChlcnIucmV0cnlhYmxlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvciA9IGVuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcignUkVUUllBQkxFJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvciA9IGVuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcignTk9OX1JFVFJZQUJMRScpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgIG5leHVzSGFuZGxlckZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxuICAgICAgICAgICAgICByZXRyeUJlaGF2aW9yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTmV4dXNPcGVyYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBuZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICBzY2hlZHVsZWRFdmVudElkOiBlcnIuc2NoZWR1bGVkRXZlbnRJZCA/IExvbmcuZnJvbU51bWJlcihlcnIuc2NoZWR1bGVkRXZlbnRJZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbmRwb2ludDogZXJyLmVuZHBvaW50LFxuICAgICAgICAgICAgc2VydmljZTogZXJyLnNlcnZpY2UsXG4gICAgICAgICAgICBvcGVyYXRpb246IGVyci5vcGVyYXRpb24sXG4gICAgICAgICAgICBvcGVyYXRpb25Ub2tlbjogZXJyLm9wZXJhdGlvblRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBKdXN0IGEgVGVtcG9yYWxGYWlsdXJlXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlID0ge1xuICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICB9O1xuXG4gICAgaWYgKGlzRXJyb3IoZXJyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgbWVzc2FnZTogU3RyaW5nKGVyci5tZXNzYWdlID8/ICcnKSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoKGVyciBhcyBhbnkpLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBgIFtBIG5vbi1FcnJvciB2YWx1ZSB3YXMgdGhyb3duIGZyb20geW91ciBjb2RlLiBXZSByZWNvbW1lbmQgdGhyb3dpbmcgRXJyb3Igb2JqZWN0cyBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIGEgc3RhY2sgdHJhY2VdYDtcblxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogZXJyICsgcmVjb21tZW5kYXRpb24gfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IG1lc3NhZ2UgKyByZWNvbW1lbmRhdGlvbiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IFN0cmluZyhlcnIpICsgcmVjb21tZW5kYXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdCBpZiBkZWZpbmVkIG9yIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cbiAgb3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKFxuICAgIGZhaWx1cmU6IFByb3RvRmFpbHVyZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlclxuICApOiBFcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZhaWx1cmUgPyB0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXIpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIGlmIGRlZmluZWQgb3IgcmV0dXJucyB1bmRlZmluZWRcbiAgICovXG4gIG9wdGlvbmFsRXJyb3JUb09wdGlvbmFsRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBlcnIgPyB0aGlzLmVycm9yVG9GYWlsdXJlKGVyciwgcGF5bG9hZENvbnZlcnRlcikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIG5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGZhaWx1cmU6IG5leHVzLkZhaWx1cmUsIHJldHJ5YWJsZTogYm9vbGVhbik6IFByb3RvRmFpbHVyZSB7XG4gICAgaWYgKGZhaWx1cmUubWV0YWRhdGE/LnR5cGUgPT09ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJykge1xuICAgICAgaWYgKGZhaWx1cmUuZGV0YWlscyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtaXNzaW5nIGRldGFpbHMgZm9yIE5leHVzIEZhaWx1cmUgb2YgdHlwZSAndGVtcG9yYWwuYXBpLmZhaWx1cmUudjEuRmFpbHVyZSdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbHVyZS5kZXRhaWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wb3JhbEZhaWx1cmU6IFByb3RvRmFpbHVyZSA9IHt9O1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8gPSB7XG4gICAgICAgIHR5cGU6ICdOZXh1c0ZhaWx1cmUnLFxuICAgICAgICBub25SZXRyeWFibGU6ICFyZXRyeWFibGUsXG4gICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICBwYXlsb2FkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRhZGF0YTogeyBlbmNvZGluZzogZW5jb2RlKCdqc29uL3BsYWluJykgfSxcbiAgICAgICAgICAgICAgZGF0YTogZW5jb2RlKEpTT04uc3RyaW5naWZ5KHsgLi4uZmFpbHVyZSwgbWVzc2FnZTogJycgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHRlbXBvcmFsRmFpbHVyZS5tZXNzYWdlID0gZmFpbHVyZS5tZXNzYWdlO1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLnN0YWNrVHJhY2UgPSBmYWlsdXJlLnN0YWNrVHJhY2UgPz8gJyc7XG4gICAgICByZXR1cm4gdGVtcG9yYWxGYWlsdXJlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGVtcG9yYWxGYWlsdXJlVG9OZXh1c0ZhaWx1cmUoZmFpbHVyZTogUHJvdG9GYWlsdXJlKTogbmV4dXMuRmFpbHVyZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGZhaWx1cmUubWVzc2FnZSA/PyAnJyxcbiAgICAgIG1ldGFkYXRhOiB7IHR5cGU6ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJyB9LFxuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgUHJvdG9GYWlsdXJlIGFzIHRoZSBOZXh1cyBmYWlsdXJlIGRldGFpbHMgc28gaXQgY2FuIGJlIHJvdW5kLXRyaXBwZWRcbiAgICAgIC8vIGxvc3NsZXNzbHkgYmFjayB0byBhIFByb3RvRmFpbHVyZSB2aWEgbmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUuXG4gICAgICBkZXRhaWxzOiB7IC4uLmZhaWx1cmUgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBgUGF5bG9hZENvZGVjYCBpcyBhbiBvcHRpb25hbCBzdGVwIHRoYXQgaGFwcGVucyBiZXR3ZWVuIHRoZSB3aXJlIGFuZCB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIFRlbXBvcmFsIFNlcnZlciA8LS0+IFdpcmUgPC0tPiBgUGF5bG9hZENvZGVjYCA8LS0+IGBQYXlsb2FkQ29udmVydGVyYCA8LS0+IFVzZXIgY29kZVxuICpcbiAqIEltcGxlbWVudCB0aGlzIHRvIHRyYW5zZm9ybSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHRvL2Zyb20gdGhlIGZvcm1hdCBzZW50IG92ZXIgdGhlIHdpcmUgYW5kIHN0b3JlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuXG4gKiBDb21tb24gdHJhbnNmb3JtYXRpb25zIGFyZSBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29kZWMge1xuICAvKipcbiAgICogRW5jb2RlIGFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkfXMgZm9yIHNlbmRpbmcgb3ZlciB0aGUgd2lyZS5cbiAgICogQHBhcmFtIHBheWxvYWRzIE1heSBoYXZlIGxlbmd0aCAwLlxuICAgKi9cbiAgZW5jb2RlKHBheWxvYWRzOiBQYXlsb2FkW10pOiBQcm9taXNlPFBheWxvYWRbXT47XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHJlY2VpdmVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBkZWNvZGUocGF5bG9hZHM6IFBheWxvYWRbXSk6IFByb21pc2U8UGF5bG9hZFtdPjtcbn1cbiIsImltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHsgUGF5bG9hZENvbnZlcnRlckVycm9yLCBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZW5jb2RpbmdLZXlzLCBlbmNvZGluZ1R5cGVzLCBNRVRBREFUQV9FTkNPRElOR19LRVkgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgbGlrZSBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLlxuICpcbiAqIFRoaXMgaXMgY2FsbGVkIGluc2lkZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2RldGVybWluaXNtIHwgV29ya2Zsb3cgaXNvbGF0ZX0uXG4gKiBUbyB3cml0ZSBhc3luYyBjb2RlIG9yIHVzZSBOb2RlIEFQSXMgKG9yIHVzZSBwYWNrYWdlcyB0aGF0IHVzZSBOb2RlIEFQSXMpLCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4gRXhhbXBsZSB2YWx1ZXMgaW5jbHVkZSB0aGUgV29ya2Zsb3cgYXJncyBzZW50IGZyb20gdGhlIENsaWVudCBhbmQgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIFdvcmtmbG93IG9yIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBTaG91bGQgdGhyb3cge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZDtcblxuICAvKipcbiAgICogQ29udmVydHMgYSB7QGxpbmsgUGF5bG9hZH0gYmFjayB0byBhIHZhbHVlLlxuICAgKi9cbiAgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQ7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBjb252ZXJzaW9uIG9mIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlclxuICogQHBhcmFtIHZhbHVlcyBKUyB2YWx1ZXMgdG8gY29udmVydCB0byBQYXlsb2Fkc1xuICogQHJldHVybiBsaXN0IG9mIHtAbGluayBQYXlsb2FkfXNcbiAqIEB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgdGhlIHZhbHVlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZmFpbGVkIGZvciBhbnlcbiAqICAgICByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BheWxvYWRzKGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgLi4udmFsdWVzOiB1bmtub3duW10pOiBQYXlsb2FkW10gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUpKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBhbiBvcHRpb25hbCB2YWx1ZSwgYW5kIHRoZW4gZW5jb2RlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE9wdGlvbmFsVG9QYXlsb2FkKFxuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICB2YWx1ZTogdW5rbm93blxuKTogUGF5bG9hZCB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHZhbHVlO1xuXG4gIHJldHVybiBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSk7XG59XG5cbi8qKlxuICogUnVuIHtAbGluayBQYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZH0gb24gZWFjaCB2YWx1ZSBpbiB0aGUgbWFwLlxuICpcbiAqIEB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgYW55IHZhbHVlIGluIHRoZSBtYXAgZmFpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvUGF5bG9hZHM8SyBleHRlbmRzIHN0cmluZywgVCA9IGFueT4oXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgbWFwOiBSZWNvcmQ8SywgVD5cbik6IFJlY29yZDxLLCBQYXlsb2FkPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCB2XSk6IFtLLCBQYXlsb2FkXSA9PiBbayBhcyBLLCBjb252ZXJ0ZXIudG9QYXlsb2FkKHYpXSlcbiAgKSBhcyBSZWNvcmQ8SywgUGF5bG9hZD47XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBjb252ZXJzaW9uIG9mIGFuIGFycmF5IG9mIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIFVzZWZ1bCBmb3IgZGVzZXJpYWxpemluZ1xuICogYXJndW1lbnRzIG9mIGZ1bmN0aW9uIGludm9jYXRpb25zLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIHBheWxvYWRzXG4gKiBAcGFyYW0gcGF5bG9hZHMgc2VyaWFsaXplZCB2YWx1ZSB0byBjb252ZXJ0IHRvIEpTIHZhbHVlcy5cbiAqIEByZXR1cm4gY29udmVydGVkIEpTIHZhbHVlXG4gKiBAdGhyb3dzIHtAbGluayBQYXlsb2FkQ29udmVydGVyRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgdGhlIGRhdGEgcGFzc2VkIGFzIHBhcmFtZXRlciBmYWlsZWQgZm9yIGFueVxuICogICAgIHJlYXNvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21QYXlsb2Fkc0F0SW5kZXg8VD4oY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBpbmRleDogbnVtYmVyLCBwYXlsb2Fkcz86IFBheWxvYWRbXSB8IG51bGwpOiBUIHtcbiAgLy8gVG8gbWFrZSBhZGRpbmcgYXJndW1lbnRzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlXG4gIGlmIChwYXlsb2FkcyA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWRzID09PSBudWxsIHx8IGluZGV4ID49IHBheWxvYWRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBwYXlsb2Fkcz8uW2luZGV4XTtcbiAgaWYgKCFwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGcm9tUGF5bG9hZHMoY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBwYXlsb2Fkcz86IFBheWxvYWRbXSB8IG51bGwpOiB1bmtub3duW10ge1xuICBpZiAoIXBheWxvYWRzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBwYXlsb2Fkcy5tYXAoKHBheWxvYWQ6IFBheWxvYWQpID0+IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBGcm9tUGF5bG9hZHM8SyBleHRlbmRzIHN0cmluZywgVCA9IHVua25vd24+KFxuICBjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIG1hcD86IFJlY29yZDxLLCBQYXlsb2FkPiB8IG51bGwgfCB1bmRlZmluZWRcbik6IFJlY29yZDxLLCBUPiB8IHVuZGVmaW5lZCB7XG4gIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXApLm1hcCgoW2ssIHBheWxvYWRdKTogW0ssIHVua25vd25dID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQgYXMgUGF5bG9hZCk7XG4gICAgICByZXR1cm4gW2sgYXMgSywgdmFsdWVdO1xuICAgIH0pXG4gICkgYXMgUmVjb3JkPEssIFQ+O1xufVxuXG5leHBvcnQgZGVjbGFyZSBjb25zdCByYXdQYXlsb2FkVHlwZUJyYW5kOiB1bmlxdWUgc3ltYm9sO1xuLyoqXG4gKiBSYXdWYWx1ZSBpcyBhIHdyYXBwZXIgb3ZlciBhIHBheWxvYWQuXG4gKiBBIHBheWxvYWQgdGhhdCBiZWxvbmdzIHRvIGEgUmF3VmFsdWUgaXMgc3BlY2lhbCBpbiB0aGF0IGl0IGJ5cGFzc2VzIHVzZXItZGVmaW5lZCBwYXlsb2FkIGNvbnZlcnRlcnMsXG4gKiBpbnN0ZWFkIHVzaW5nIHRoZSBkZWZhdWx0IHBheWxvYWQgY29udmVydGVyLiBUaGUgcGF5bG9hZCBzdGlsbCB1bmRlcmdvZXMgY29kZWMgY29udmVyc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJhd1ZhbHVlPFQgPSB1bmtub3duPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BheWxvYWQ6IFBheWxvYWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgW3Jhd1BheWxvYWRUeXBlQnJhbmRdOiBUID0gdW5kZWZpbmVkIGFzIFQ7XG5cbiAgY29uc3RydWN0b3IodmFsdWU6IFQsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIgPSBkZWZhdWx0UGF5bG9hZENvbnZlcnRlcikge1xuICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVBheWxvYWQocDogUGF5bG9hZCk6IFJhd1ZhbHVlIHtcbiAgICByZXR1cm4gbmV3IFJhd1ZhbHVlKHAsIGlkZW50aXR5UGF5bG9hZENvbnZlcnRlcik7XG4gIH1cblxuICBnZXQgcGF5bG9hZCgpOiBQYXlsb2FkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBFeGFtcGxlIHZhbHVlcyBpbmNsdWRlIHRoZSBXb3JrZmxvdyBhcmdzIHNlbnQgZnJvbSB0aGUgQ2xpZW50IGFuZCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgV29ya2Zsb3cgb3IgQWN0aXZpdHkuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGF5bG9hZH0sIG9yIGB1bmRlZmluZWRgIGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ29udmVydHMgYSB7QGxpbmsgUGF5bG9hZH0gYmFjayB0byBhIHZhbHVlLlxuICAgKi9cbiAgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQ7XG5cbiAgcmVhZG9ubHkgZW5jb2RpbmdUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJpZXMgdG8gY29udmVydCB2YWx1ZXMgdG8ge0BsaW5rIFBheWxvYWR9cyB1c2luZyB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmd9cyBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IsIGluIHRoZSBvcmRlciBwcm92aWRlZC5cbiAqXG4gKiBDb252ZXJ0cyBQYXlsb2FkcyB0byB2YWx1ZXMgYmFzZWQgb24gdGhlIGBQYXlsb2FkLm1ldGFkYXRhLmVuY29kaW5nYCBmaWVsZCwgd2hpY2ggbWF0Y2hlcyB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZW5jb2RpbmdUeXBlfVxuICogb2YgdGhlIGNvbnZlcnRlciB0aGF0IGNyZWF0ZWQgdGhlIFBheWxvYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIHJlYWRvbmx5IGNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXTtcbiAgcmVhZG9ubHkgY29udmVydGVyQnlFbmNvZGluZzogTWFwPHN0cmluZywgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZz4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoLi4uY29udmVydGVyczogUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZ1tdKSB7XG4gICAgaWYgKGNvbnZlcnRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUGF5bG9hZENvbnZlcnRlckVycm9yKCdNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzO1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIHRoaXMuY29udmVydGVyQnlFbmNvZGluZy5zZXQoY29udmVydGVyLmVuY29kaW5nVHlwZSwgY29udmVydGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdG8gcnVuIGAudG9QYXlsb2FkKHZhbHVlKWAgb24gZWFjaCBjb252ZXJ0ZXIgaW4gdGhlIG9yZGVyIHByb3ZpZGVkIGF0IGNvbnN0cnVjdGlvbi5cbiAgICogUmV0dXJucyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHQsIHRocm93cyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgdGhlcmUgaXMgbm8gY29udmVydGVyIHRoYXQgY2FuIGhhbmRsZSB0aGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZCB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5wYXlsb2FkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0ICR7dmFsdWV9IHRvIHBheWxvYWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZnJvbVBheWxvYWR9IGJhc2VkIG9uIHRoZSBgZW5jb2RpbmdgIG1ldGFkYXRhIG9mIHRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZC5tZXRhZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY29kaW5nID0gZGVjb2RlKHBheWxvYWQubWV0YWRhdGFbTUVUQURBVEFfRU5DT0RJTkdfS0VZXSEpO1xuICAgIGNvbnN0IGNvbnZlcnRlciA9IHRoaXMuY29udmVydGVyQnlFbmNvZGluZy5nZXQoZW5jb2RpbmcpO1xuICAgIGlmIChjb252ZXJ0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVua25vd24gZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIEpTIHVuZGVmaW5lZCBhbmQgTlVMTCBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmRlZmluZWRQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX05VTEw7XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBbTUVUQURBVEFfRU5DT0RJTkdfS0VZXTogZW5jb2RpbmdLZXlzLk1FVEFEQVRBX0VOQ09ESU5HX05VTEwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oX2NvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTsgLy8gSnVzdCByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIGJpbmFyeSBkYXRhIHR5cGVzIGFuZCBSQVcgUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgQmluYXJ5UGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICBwdWJsaWMgZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19SQVc7XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXLFxuICAgICAgfSxcbiAgICAgIGRhdGE6IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiAoXG4gICAgICAvLyBXcmFwIHdpdGggVWludDhBcnJheSBmcm9tIHRoaXMgY29udGV4dCB0byBlbnN1cmUgYGluc3RhbmNlb2ZgIHdvcmtzXG4gICAgICAoXG4gICAgICAgIGNvbnRlbnQuZGF0YSA/IG5ldyBVaW50OEFycmF5KGNvbnRlbnQuZGF0YS5idWZmZXIsIGNvbnRlbnQuZGF0YS5ieXRlT2Zmc2V0LCBjb250ZW50LmRhdGEubGVuZ3RoKSA6IGNvbnRlbnQuZGF0YVxuICAgICAgKSBhcyBhbnlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYmV0d2VlbiBub24tdW5kZWZpbmVkIHZhbHVlcyBhbmQgc2VyaWFsaXplZCBKU09OIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIEpzb25QYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX0pTT047XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCBqc29uO1xuICAgIHRyeSB7XG4gICAgICBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTixcbiAgICAgIH0sXG4gICAgICBkYXRhOiBlbmNvZGUoanNvbiksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihjb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgaWYgKGNvbnRlbnQuZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGNvbnRlbnQuZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0dvdCBwYXlsb2FkIHdpdGggbm8gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGUoY29udGVudC5kYXRhKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRQYXlsb2FkQ29udmVydGVyIGV4dGVuZHMgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciB7XG4gIC8vIE1hdGNoIHRoZSBvcmRlciB1c2VkIGluIG90aGVyIFNES3MsIGJ1dCBleGNsdWRlIFByb3RvYnVmIGNvbnZlcnRlcnMgc28gdGhhdCB0aGUgY29kZSwgaW5jbHVkaW5nXG4gIC8vIGBwcm90bzMtanNvbi1zZXJpYWxpemVyYCwgZG9lc24ndCB0YWtlIHNwYWNlIGluIFdvcmtmbG93IGJ1bmRsZXMgdGhhdCBkb24ndCB1c2UgUHJvdG9idWZzLiBUbyB1c2UgUHJvdG9idWZzLCB1c2VcbiAgLy8ge0BsaW5rIERlZmF1bHRQYXlsb2FkQ29udmVydGVyV2l0aFByb3RvYnVmc30uXG4gIC8vXG4gIC8vIEdvIFNESzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbXBvcmFsaW8vc2RrLWdvL2Jsb2IvNWU1NjQ1ZjBjNTUwZGNmNzE3YzA5NWFlMzJjNzZhNzA4N2QyZTk4NS9jb252ZXJ0ZXIvZGVmYXVsdF9kYXRhX2NvbnZlcnRlci5nbyNMMjhcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIobmV3IFVuZGVmaW5lZFBheWxvYWRDb252ZXJ0ZXIoKSwgbmV3IEJpbmFyeVBheWxvYWRDb252ZXJ0ZXIoKSwgbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCkpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy4gU3VwcG9ydHMgYFVpbnQ4QXJyYXlgIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgcGF5bG9hZCBjb252ZXJ0ZXIgd2lsbCB3b3JrKS5cbiAqXG4gKiBUbyBhbHNvIHN1cHBvcnQgUHJvdG9idWZzLCBjcmVhdGUgYSBjdXN0b20gcGF5bG9hZCBjb252ZXJ0ZXIgd2l0aCB7QGxpbmsgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIGBjb25zdCBteUNvbnZlcnRlciA9IG5ldyBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcih7IHByb3RvYnVmUm9vdCB9KWBcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyID0gbmV3IERlZmF1bHRQYXlsb2FkQ29udmVydGVyKCk7XG5cbi8qKlxuICogVGhlIGlkZW50aXR5IHBheWxvYWQgY29udmVydGVyIHJldHVybnMgdGhlIGlucHV0cyBpdCB3YXMgZ2l2ZW4uXG4gKi9cbmNsYXNzIElkZW50aXR5UGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICB0b1BheWxvYWQ8VD4odmFsdWU6IFQpOiBQYXlsb2FkIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgUGF5bG9hZDtcbiAgfVxuXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICByZXR1cm4gcGF5bG9hZCBhcyBUO1xuICB9XG59XG5cbmNvbnN0IGlkZW50aXR5UGF5bG9hZENvbnZlcnRlciA9IG5ldyBJZGVudGl0eVBheWxvYWRDb252ZXJ0ZXIoKTtcbiIsImltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgU2VhcmNoQXR0cmlidXRlcywgU2VhcmNoQXR0cmlidXRlUGFpciwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpciB9IGZyb20gJy4uL3NlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7XG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlVHlwZSxcbiAgaXNWYWxpZFZhbHVlRm9yVHlwZSxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZSxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSxcbn0gZnJvbSAnLi4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBKc29uUGF5bG9hZENvbnZlcnRlciwgbWFwRnJvbVBheWxvYWRzLCBtYXBUb1BheWxvYWRzIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5cbi8qKlxuICogQ29udmVydHMgU2VhcmNoIEF0dHJpYnV0ZSB2YWx1ZXMgdXNpbmcgSnNvblBheWxvYWRDb252ZXJ0ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyIHtcbiAganNvbkNvbnZlcnRlciA9IG5ldyBKc29uUGF5bG9hZENvbnZlcnRlcigpO1xuICB2YWxpZE5vbkRhdGVUeXBlcyA9IFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ107XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZXM6IHVua25vd24pOiBQYXlsb2FkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFNlYXJjaEF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5YCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgZmlyc3RUeXBlID0gdHlwZW9mIGZpcnN0VmFsdWU7XG4gICAgICBpZiAoZmlyc3RUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IFtpZHgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBTZWFyY2hBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYXJyYXlzIG9mIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBvciBEYXRlcy4gVGhlIHZhbHVlICR7dmFsdWV9IGF0IGluZGV4ICR7aWR4fSBpcyBvZiB0eXBlICR7dHlwZW9mIHZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWROb25EYXRlVHlwZXMuaW5jbHVkZXMoZmlyc3RUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBTZWFyY2hBdHRyaWJ1dGUgYXJyYXkgdmFsdWVzIG11c3QgYmU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlYCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtpZHgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gZmlyc3RUeXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYEFsbCBTZWFyY2hBdHRyaWJ1dGUgYXJyYXkgdmFsdWVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGZpcnN0IHZhbHVlICR7Zmlyc3RWYWx1ZX0gb2YgdHlwZSAke2ZpcnN0VHlwZX0gZG9lc24ndCBtYXRjaCB2YWx1ZSAke3ZhbHVlfSBvZiB0eXBlICR7dHlwZW9mIHZhbHVlfSBhdCBpbmRleCAke2lkeH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEpTT04uc3RyaW5naWZ5IHRha2VzIGNhcmUgb2YgY29udmVydGluZyBEYXRlcyB0byBJU08gc3RyaW5nc1xuICAgIGNvbnN0IHJldCA9IHRoaXMuanNvbkNvbnZlcnRlci50b1BheWxvYWQodmFsdWVzKTtcbiAgICBpZiAocmV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBzZWFyY2ggYXR0cmlidXRlcyB0byBwYXlsb2FkcycpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGV0aW1lIFNlYXJjaCBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gYERhdGVgc1xuICAgKi9cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmpzb25Db252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG4gICAgbGV0IGFycmF5V3JhcHBlZFZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgY29uc3Qgc2VhcmNoQXR0cmlidXRlVHlwZSA9IHBheWxvYWQubWV0YWRhdGEudHlwZSA/IGRlY29kZShwYXlsb2FkLm1ldGFkYXRhLnR5cGUpIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWFyY2hBdHRyaWJ1dGVUeXBlID09PSAnRGF0ZXRpbWUnKSB7XG4gICAgICBhcnJheVdyYXBwZWRWYWx1ZSA9IGFycmF5V3JhcHBlZFZhbHVlLm1hcCgoZGF0ZVN0cmluZykgPT4gbmV3IERhdGUoZGF0ZVN0cmluZykpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlXcmFwcGVkVmFsdWUgYXMgdW5rbm93biBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyID0gbmV3IFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIoKTtcblxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICBqc29uQ29udmVydGVyID0gbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCk7XG5cbiAgcHVibGljIHRvUGF5bG9hZDxUPihhdHRyOiBUKTogUGF5bG9hZCB7XG4gICAgaWYgKCEoYXR0ciBpbnN0YW5jZW9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUgfHwgYXR0ciBpbnN0YW5jZW9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYEV4cGVjdCBpbnB1dCB0byBiZSBpbnN0YW5jZSBvZiBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlIG9yIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWUsIGdvdDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBhdHRyXG4gICAgICAgICl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBjaGVjayBmb3IgZGVsZXRpb24gYXMgd2VsbCBhcyByZWd1bGFyIHR5cGVkIHNlYXJjaCBhdHRyaWJ1dGVzLlxuICAgIGlmIChhdHRyLnZhbHVlICE9PSBudWxsICYmICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHIudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHNlYXJjaCBhdHRyaWJ1dGUgdmFsdWUgJHthdHRyLnZhbHVlfSBmb3IgZ2l2ZW4gdHlwZSAke2F0dHIudHlwZX1gKTtcbiAgICB9XG5cbiAgICAvLyBGb3Igc2VydmVyIHNlYXJjaCBhdHRyaWJ1dGVzIHRvIHdvcmsgcHJvcGVybHksIHdlIGNhbm5vdCBzZXQgdGhlIG1ldGFkYXRhXG4gICAgLy8gdHlwZSB3aGVuIHdlIHNldCBudWxsXG4gICAgaWYgKGF0dHIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKGF0dHIudmFsdWUpO1xuICAgICAgaWYgKHBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZSB0byBwYXlsb2FkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG5cbiAgICAvLyBKU09OLnN0cmluZ2lmeSB0YWtlcyBjYXJlIG9mIGNvbnZlcnRpbmcgRGF0ZXMgdG8gSVNPIHN0cmluZ3NcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZChhdHRyLnZhbHVlKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZSB0byBwYXlsb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgdGhlIGNhc2UgYnV0IHRoZSBjb21waWxlciBjb21wbGFpbnMgd2l0aG91dCB0aGlzIGNoZWNrLlxuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG4gICAgLy8gQWRkIGVuY29kZWQgdHlwZSBvZiBzZWFyY2ggYXR0cmlidXRlIHRvIG1ldGF0ZGF0YVxuICAgIHBheWxvYWQubWV0YWRhdGFbJ3R5cGUnXSA9IGVuY29kZShUeXBlZFNlYXJjaEF0dHJpYnV0ZXMudG9NZXRhZGF0YVR5cGUoYXR0ci50eXBlKSk7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvLyBOb3RlOiB0eXBlIGNhc3RpbmcgdW5kZWZpbmVkIHZhbHVlcyBpcyBub3QgY2xlYXIgdG8gY2FsbGVyLlxuICAvLyBXZSBjYW4ndCBjaGFuZ2UgdGhlIHR5cGluZyBvZiB0aGUgbWV0aG9kIHRvIHJldHVybiB1bmRlZmluZWQsIGl0J3Mgbm90IGFsbG93ZWQgYnkgdGhlIGludGVyZmFjZS5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gJ3R5cGUnIG1ldGFkYXRhIGZpZWxkIG9yIG5vIGdpdmVuIHZhbHVlLCB3ZSBza2lwLlxuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhLnR5cGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnRvU2VhcmNoQXR0cmlidXRlVHlwZShkZWNvZGUocGF5bG9hZC5tZXRhZGF0YS50eXBlKSk7XG4gICAgLy8gVW5yZWNvZ25pemVkIG1ldGFkYXRhIHR5cGUgKHNhbml0eSBjaGVjaykuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IHRoaXMuanNvbkNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcblxuICAgIC8vIEhhbmRsZSBsZWdhY3kgdmFsdWVzIHdpdGhvdXQgS0VZV09SRF9MSVNUIHR5cGUuXG4gICAgaWYgKHR5cGUgIT09IFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBDYW5ub3QgaGF2ZSBhbiBhcnJheSB3aXRoIG11bHRpcGxlIHZhbHVlcyBmb3Igbm9uLUtFWVdPUkRfTElTVCB0eXBlLlxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgICAgfVxuICAgICAgLy8gVW5wYWNrIHNpbmdsZSB2YWx1ZSBhcnJheS5cbiAgICAgIHZhbHVlID0gdmFsdWVbMF07XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FICYmIHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGZvciB0aGUgZ2l2ZW4gdHlwZS4gSWYgbm90LCBza2lwLlxuICAgIGlmICghaXNWYWxpZFZhbHVlRm9yVHlwZSh0eXBlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKHR5cGUsIHZhbHVlKSBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0eXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyKCk7XG5cbi8vIElmIGJvdGggcGFyYW1zIGFyZSBwcm92aWRlZCwgY29uZmxpY3Rpbmcga2V5cyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhcbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXMsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaEF0dHJpYnV0ZXMgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXMpIDoge30pLFxuICAgIC4uLih0eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgID8gbWFwVG9QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+KFxuICAgICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0eXBlZFNlYXJjaEF0dHJpYnV0ZXMpID8gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzIDogdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLmdldEFsbCgpKS5tYXAoXG4gICAgICAgICAgICAgIChwYWlyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtwYWlyLmtleS5uYW1lLCBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTZWFyY2hBdHRyaWJ1dGVzKGluZGV4ZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHwgdW5kZWZpbmVkIHwgbnVsbCk6IFNlYXJjaEF0dHJpYnV0ZXMge1xuICBpZiAoIWluZGV4ZWRGaWVsZHMpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICBPYmplY3QuZW50cmllcyhtYXBGcm9tUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgaW5kZXhlZEZpZWxkcykgYXMgU2VhcmNoQXR0cmlidXRlcykuZmlsdGVyKFxuICAgICAgKFtfLCB2XSkgPT4gdiAmJiB2Lmxlbmd0aCA+IDBcbiAgICApIC8vIEZpbHRlciBvdXQgZW1wdHkgYXJyYXlzIHJldHVybmVkIGJ5IHByZSAxLjE4IHNlcnZlcnNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgaW5kZXhlZEZpZWxkczogUmVjb3JkPHN0cmluZywgUGF5bG9hZD4gfCB1bmRlZmluZWQgfCBudWxsXG4pOiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICByZXR1cm4gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgICBPYmplY3QuZW50cmllcyhcbiAgICAgIG1hcEZyb21QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQ+KFxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgIGluZGV4ZWRGaWVsZHNcbiAgICAgICkgPz8ge31cbiAgICApLnJlZHVjZTxTZWFyY2hBdHRyaWJ1dGVQYWlyW10+KChhY2MsIFtrLCBhdHRyXSkgPT4ge1xuICAgICAgLy8gRmlsdGVyIG91dCB1bmRlZmluZWQgdmFsdWVzIGZyb20gY29udmVydGVyLlxuICAgICAgaWYgKCFhdHRyKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB7IG5hbWU6IGssIHR5cGU6IGF0dHIudHlwZSB9O1xuICAgICAgLy8gRW5zdXJlIGlzIHZhbGlkIHBhaXIuXG4gICAgICBpZiAoaXNWYWxpZFZhbHVlRm9yVHlwZShrZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgYWNjLnB1c2goeyBrZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKVxuICApO1xufVxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfRU5DT0RJTkdfS0VZID0gJ2VuY29kaW5nJztcbmV4cG9ydCBjb25zdCBlbmNvZGluZ1R5cGVzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiAnYmluYXJ5L251bGwnLFxuICBNRVRBREFUQV9FTkNPRElOR19SQVc6ICdiaW5hcnkvcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiAnanNvbi9wbGFpbicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046ICdqc29uL3Byb3RvYnVmJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUY6ICdiaW5hcnkvcHJvdG9idWYnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEVuY29kaW5nVHlwZSA9ICh0eXBlb2YgZW5jb2RpbmdUeXBlcylba2V5b2YgdHlwZW9mIGVuY29kaW5nVHlwZXNdO1xuXG5leHBvcnQgY29uc3QgZW5jb2RpbmdLZXlzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19OVUxMKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19SQVcpLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19KU09OKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRiksXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfTUVTU0FHRV9UWVBFX0tFWSA9ICdtZXNzYWdlVHlwZSc7XG4iLCJpbXBvcnQgKiBhcyB0aW1lIGZyb20gJy4vdGltZSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IHR5cGUgVGltZXN0YW1wIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5vcHRpb25hbFRzVG9Ncyh0cyk7XG59XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gdGltZS50c1RvTXModHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc051bWJlclRvVHMobWlsbGlzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc1RvVHMoc3RyKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUubXNPcHRpb25hbFRvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIHJldHVybiB0aW1lLm1zVG9OdW1iZXIodmFsKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gdGltZS50c1RvRGF0ZSh0cyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvRGF0ZSh0cyk7XG59XG4iLCIvLyBQYXN0ZWQgd2l0aCBtb2RpZmljYXRpb25zIGZyb206IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbm9ueWNvL0Zhc3Rlc3RTbWFsbGVzdFRleHRFbmNvZGVyRGVjb2Rlci9tYXN0ZXIvRW5jb2RlckRlY29kZXJUb2dldGhlci5zcmMuanNcbi8qIGVzbGludCBuby1mYWxsdGhyb3VnaDogMCAqL1xuXG5jb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuY29uc3QgZW5jb2RlclJlZ2V4cCA9IC9bXFx4ODAtXFx1RDdmZlxcdURDMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXT8vZztcbmNvbnN0IHRtcEJ1ZmZlclUxNiA9IG5ldyBVaW50MTZBcnJheSgzMik7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RGVjb2RlciB7XG4gIGRlY29kZShpbnB1dEFycmF5T3JCdWZmZXI6IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlciB8IFNoYXJlZEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnB1dEFzOCA9IGlucHV0QXJyYXlPckJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBpbnB1dEFycmF5T3JCdWZmZXIgOiBuZXcgVWludDhBcnJheShpbnB1dEFycmF5T3JCdWZmZXIpO1xuXG4gICAgbGV0IHJlc3VsdGluZ1N0cmluZyA9ICcnLFxuICAgICAgdG1wU3RyID0gJycsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBuZXh0RW5kID0gMCxcbiAgICAgIGNwMCA9IDAsXG4gICAgICBjb2RlUG9pbnQgPSAwLFxuICAgICAgbWluQml0cyA9IDAsXG4gICAgICBjcDEgPSAwLFxuICAgICAgcG9zID0gMCxcbiAgICAgIHRtcCA9IC0xO1xuICAgIGNvbnN0IGxlbiA9IGlucHV0QXM4Lmxlbmd0aCB8IDA7XG4gICAgY29uc3QgbGVuTWludXMzMiA9IChsZW4gLSAzMikgfCAwO1xuICAgIC8vIE5vdGUgdGhhdCB0bXAgcmVwcmVzZW50cyB0aGUgMm5kIGhhbGYgb2YgYSBzdXJyb2dhdGUgcGFpciBpbmNhc2UgYSBzdXJyb2dhdGUgZ2V0cyBkaXZpZGVkIGJldHdlZW4gYmxvY2tzXG4gICAgZm9yICg7IGluZGV4IDwgbGVuOyApIHtcbiAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgIGZvciAoOyBwb3MgPCBuZXh0RW5kOyBpbmRleCA9IChpbmRleCArIDEpIHwgMCwgcG9zID0gKHBvcyArIDEpIHwgMCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICBjcDAgPSBpbnB1dEFzOFtpbmRleF0gJiAweGZmO1xuICAgICAgICBzd2l0Y2ggKGNwMCA+PiA0KSB7XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBpZiAoY3AxID4+IDYgIT09IDBiMTAgfHwgMGIxMTExMDExMSA8IGNwMCkge1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSAoKGNwMCAmIDBiMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSA1OyAvLyAyMCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IDB4MTAwOyAvLyAga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICAgICAgY3AxID0gaW5wdXRBczhbKGluZGV4ID0gKGluZGV4ICsgMSkgfCAwKV0gJiAweGZmO1xuICAgICAgICAgICAgY29kZVBvaW50IDw8PSA2O1xuICAgICAgICAgICAgY29kZVBvaW50IHw9ICgoY3AwICYgMGIxMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSBjcDEgPj4gNiA9PT0gMGIxMCA/IChtaW5CaXRzICsgNCkgfCAwIDogMjQ7IC8vIDI0IGVuc3VyZXMgaXQgbmV2ZXIgcGFzc2VzIC0+IGFsbCBpbnZhbGlkIHJlcGxhY2VtZW50c1xuICAgICAgICAgICAgY3AwID0gKGNwMCArIDB4MTAwKSAmIDB4MzAwOyAvLyBrZWVwIHRyYWNrIG9mIHRoIGJpdCBzaXplXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IChtaW5CaXRzICsgNykgfCAwO1xuXG4gICAgICAgICAgICAvLyBOb3csIHByb2Nlc3MgdGhlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGlmIChpbmRleCA8IGxlbiAmJiBjcDEgPj4gNiA9PT0gMGIxMCAmJiBjb2RlUG9pbnQgPj4gbWluQml0cyAmJiBjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjcDAgPSBjb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IChjb2RlUG9pbnQgLSAweDEwMDAwKSB8IDA7XG4gICAgICAgICAgICAgIGlmICgwIDw9IGNvZGVQb2ludCAvKjB4ZmZmZiA8IGNvZGVQb2ludCovKSB7XG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcbiAgICAgICAgICAgICAgICAvL25leHRFbmQgPSBuZXh0RW5kIC0gMXwwO1xuXG4gICAgICAgICAgICAgICAgdG1wID0gKChjb2RlUG9pbnQgPj4gMTApICsgMHhkODAwKSB8IDA7IC8vIGhpZ2hTdXJyb2dhdGVcbiAgICAgICAgICAgICAgICBjcDAgPSAoKGNvZGVQb2ludCAmIDB4M2ZmKSArIDB4ZGMwMCkgfCAwOyAvLyBsb3dTdXJyb2dhdGUgKHdpbGwgYmUgaW5zZXJ0ZWQgbGF0ZXIgaW4gdGhlIHN3aXRjaC1zdGF0ZW1lbnQpXG5cbiAgICAgICAgICAgICAgICBpZiAocG9zIDwgMzEpIHtcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGljZSAzMSBpbnN0ZWFkIG9mIDMyXG4gICAgICAgICAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHBvcyA9IChwb3MgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgICB0bXAgPSAtMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gZWxzZSwgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0QXM4IGFuZCBsZXQgdG1wMCBiZSBmaWxsZWQgaW4gbGF0ZXIgb25cbiAgICAgICAgICAgICAgICAgIC8vIE5PVEUgdGhhdCBjcDEgaXMgYmVpbmcgdXNlZCBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgdGhlIHN3YXBwaW5nIG9mIHRtcCB3aXRoIGNwMFxuICAgICAgICAgICAgICAgICAgY3AxID0gdG1wO1xuICAgICAgICAgICAgICAgICAgdG1wID0gY3AwO1xuICAgICAgICAgICAgICAgICAgY3AwID0gY3AxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIG5leHRFbmQgPSAobmV4dEVuZCArIDEpIHwgMDsgLy8gYmVjYXVzZSB3ZSBhcmUgYWR2YW5jaW5nIGkgd2l0aG91dCBhZHZhbmNpbmcgcG9zXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNvZGUgcG9pbnQgbWVhbnMgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyB3aXRoIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgICBjcDAgPj49IDg7XG4gICAgICAgICAgICAgIGluZGV4ID0gKGluZGV4IC0gY3AwIC0gMSkgfCAwOyAvLyByZXNldCBpbmRleCAgYmFjayB0byB3aGF0IGl0IHdhcyBiZWZvcmVcbiAgICAgICAgICAgICAgY3AwID0gMHhmZmZkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5hbGx5LCByZXNldCB0aGUgdmFyaWFibGVzIGZvciB0aGUgbmV4dCBnby1hcm91bmRcbiAgICAgICAgICAgIG1pbkJpdHMgPSAwO1xuICAgICAgICAgICAgY29kZVBvaW50ID0gMDtcbiAgICAgICAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgICAgICAvKmNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNvZGVQb2ludCA/IGNvZGVQb2ludCA9IDAgOiBjcDAgPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IGNwMDtcbiAgICAgICAgICBjb250aW51ZTsqL1xuICAgICAgICAgIGRlZmF1bHQ6IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgfVxuICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IDB4ZmZmZDsgLy8gZmlsbCB3aXRoIGludmFsaWQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICB9XG4gICAgICB0bXBTdHIgKz0gZnJvbUNoYXJDb2RlKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICB0bXBCdWZmZXJVMTZbMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls0XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls3XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMV1cbiAgICAgICk7XG4gICAgICBpZiAocG9zIDwgMzIpIHRtcFN0ciA9IHRtcFN0ci5zbGljZSgwLCAocG9zIC0gMzIpIHwgMCk7IC8vLSgzMi1wb3MpKTtcbiAgICAgIGlmIChpbmRleCA8IGxlbikge1xuICAgICAgICAvL2Zyb21DaGFyQ29kZS5hcHBseSgwLCB0bXBCdWZmZXJVMTYgOiBVaW50OEFycmF5ID8gIHRtcEJ1ZmZlclUxNi5zdWJhcnJheSgwLHBvcykgOiB0bXBCdWZmZXJVMTYuc2xpY2UoMCxwb3MpKTtcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdID0gdG1wO1xuICAgICAgICBwb3MgPSB+dG1wID4+PiAzMTsgLy90bXAgIT09IC0xID8gMSA6IDA7XG4gICAgICAgIHRtcCA9IC0xO1xuXG4gICAgICAgIGlmICh0bXBTdHIubGVuZ3RoIDwgcmVzdWx0aW5nU3RyaW5nLmxlbmd0aCkgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHRtcCAhPT0gLTEpIHtcbiAgICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZSh0bXApO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRpbmdTdHJpbmcgKz0gdG1wU3RyO1xuICAgICAgdG1wU3RyID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ1N0cmluZztcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gZW5jb2RlclJlcGxhY2VyKG5vbkFzY2lpQ2hhcnM6IHN0cmluZykge1xuICAvLyBtYWtlIHRoZSBVVEYgc3RyaW5nIGludG8gYSBiaW5hcnkgVVRGLTggZW5jb2RlZCBzdHJpbmdcbiAgbGV0IHBvaW50ID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDApIHwgMDtcbiAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgIGNvbnN0IG5leHRjb2RlID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDEpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICBpZiAoMHhkYzAwIDw9IG5leHRjb2RlICYmIG5leHRjb2RlIDw9IDB4ZGZmZikge1xuICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgaWYgKHBvaW50ID4gMHhmZmZmKVxuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCksXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDYpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi9cbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfVxuICB9XG4gIC8qaWYgKHBvaW50IDw9IDB4MDA3ZikgcmV0dXJuIG5vbkFzY2lpQ2hhcnM7XG4gIGVsc2UgKi8gaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KSwgKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpKTtcbiAgfSBlbHNlXG4gICAgcmV0dXJuIGZyb21DaGFyQ29kZShcbiAgICAgICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMiksXG4gICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRFbmNvZGVyIHtcbiAgcHVibGljIGVuY29kZShpbnB1dFN0cmluZzogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgLy8gMHhjMCA9PiAwYjExMDAwMDAwOyAweGZmID0+IDBiMTExMTExMTE7IDB4YzAtMHhmZiA9PiAwYjExeHh4eHh4XG4gICAgLy8gMHg4MCA9PiAwYjEwMDAwMDAwOyAweGJmID0+IDBiMTAxMTExMTE7IDB4ODAtMHhiZiA9PiAwYjEweHh4eHh4XG4gICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGlucHV0U3RyaW5nID09PSB2b2lkIDAgPyAnJyA6ICcnICsgaW5wdXRTdHJpbmcsXG4gICAgICBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KCgobGVuIDw8IDEpICsgOCkgfCAwKTtcbiAgICBsZXQgdG1wUmVzdWx0OiBVaW50OEFycmF5O1xuICAgIGxldCBpID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICBwb2ludCA9IDAsXG4gICAgICBuZXh0Y29kZSA9IDA7XG4gICAgbGV0IHVwZ3JhZGVkZWRBcnJheVNpemUgPSAhVWludDhBcnJheTsgLy8gbm9ybWFsIGFycmF5cyBhcmUgYXV0by1leHBhbmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpID0gKGkgKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgIHBvaW50ID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgIGlmIChwb2ludCA8PSAweDAwN2YpIHtcbiAgICAgICAgcmVzdWx0W3Bvc10gPSBwb2ludDtcbiAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHgwN2ZmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIDw8IDYpIHwgKHBvaW50ICYgMHgzZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWRlbkNoZWNrOiB7XG4gICAgICAgICAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgICAgICAgICAgaWYgKHBvaW50IDw9IDB4ZGJmZikge1xuICAgICAgICAgICAgICBuZXh0Y29kZSA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdCgoaSA9IChpICsgMSkgfCAwKSkgfCAwOyAvLyBkZWZhdWx0cyB0byAwIHdoZW4gTmFOLCBjYXVzaW5nIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG5cbiAgICAgICAgICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gKChwb2ludCA8PCAxMCkgKyBuZXh0Y29kZSAtIDB4MzVmZGMwMCkgfCAwO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0W3Bvc10gPSAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDEyKSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWsgd2lkZW5DaGVjaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF1cGdyYWRlZGVkQXJyYXlTaXplICYmIGkgPDwgMSA8IHBvcyAmJiBpIDw8IDEgPCAoKHBvcyAtIDcpIHwgMCkpIHtcbiAgICAgICAgICAgIHVwZ3JhZGVkZWRBcnJheVNpemUgPSB0cnVlO1xuICAgICAgICAgICAgdG1wUmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuICogMyk7XG4gICAgICAgICAgICB0bXBSZXN1bHQuc2V0KHJlc3VsdCk7XG4gICAgICAgICAgICByZXN1bHQgPSB0bXBSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4ZSAvKjBiMTExMCovIDw8IDQpIHwgKHBvaW50ID4+IDEyKTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkgPyByZXN1bHQuc3ViYXJyYXkoMCwgcG9zKSA6IHJlc3VsdC5zbGljZSgwLCBwb3MpO1xuICB9XG5cbiAgcHVibGljIGVuY29kZUludG8oaW5wdXRTdHJpbmc6IHN0cmluZywgdThBcnI6IFVpbnQ4QXJyYXkpOiB7IHdyaXR0ZW46IG51bWJlcjsgcmVhZDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAoJycgKyBpbnB1dFN0cmluZykucmVwbGFjZShlbmNvZGVyUmVnZXhwLCBlbmNvZGVyUmVwbGFjZXIpO1xuICAgIGxldCBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGNoYXIgPSAwLFxuICAgICAgcmVhZCA9IDA7XG4gICAgY29uc3QgdThBcnJMZW4gPSB1OEFyci5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXRTdHJpbmcubGVuZ3RoIHwgMDtcbiAgICBpZiAodThBcnJMZW4gPCBsZW4pIGxlbiA9IHU4QXJyTGVuO1xuICAgIHB1dENoYXJzOiB7XG4gICAgICBmb3IgKDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwKSB7XG4gICAgICAgIGNoYXIgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoaSkgfCAwO1xuICAgICAgICBzd2l0Y2ggKGNoYXIgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgLy8gZXh0ZW5zaW9uIHBvaW50czpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGlmICgoKGkgKyAxKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgaWYgKCgoaSArIDIpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICAvL2lmICghKGNoYXIgPT09IDB4RUYgJiYgZW5jb2RlZFN0cmluZy5zdWJzdHIoaSsxfDAsMikgPT09IFwiXFx4QkZcXHhCRFwiKSlcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgaWYgKCgoaSArIDMpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhayBwdXRDaGFycztcbiAgICAgICAgfVxuICAgICAgICAvL3JlYWQgPSByZWFkICsgKChjaGFyID4+IDYpICE9PSAyKSB8MDtcbiAgICAgICAgdThBcnJbaV0gPSBjaGFyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB3cml0dGVuOiBpLCByZWFkOiBpbnB1dExlbmd0aCA8IHJlYWQgPyBpbnB1dExlbmd0aCA6IHJlYWQgfTtcbiAgfVxufVxuXG4vKipcbiAqIEVuY29kZSBhIFVURi04IHN0cmluZyBpbnRvIGEgVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZShzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBVaW50OEFycmF5IGludG8gYSBVVEYtOCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIFRleHREZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUoYSk7XG59XG4iLCJpbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLyoqXG4gKiBUaHJvd24gZnJvbSBjb2RlIHRoYXQgcmVjZWl2ZXMgYSB2YWx1ZSB0aGF0IGlzIHVuZXhwZWN0ZWQgb3IgdGhhdCBpdCdzIHVuYWJsZSB0byBoYW5kbGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVmFsdWVFcnJvcicpXG5leHBvcnQgY2xhc3MgVmFsdWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSA/PyB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBQYXlsb2FkIENvbnZlcnRlciBpcyBtaXNjb25maWd1cmVkLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1BheWxvYWRDb252ZXJ0ZXJFcnJvcicpXG5leHBvcnQgY2xhc3MgUGF5bG9hZENvbnZlcnRlckVycm9yIGV4dGVuZHMgVmFsdWVFcnJvciB7fVxuXG4vKipcbiAqIFNpZ25hbHMgdGhhdCBhIHJlcXVlc3RlZCBvcGVyYXRpb24gY2FuJ3QgYmUgY29tcGxldGVkIGJlY2F1c2UgaXQgaXMgaWxsZWdhbCBnaXZlbiB0aGVcbiAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9iamVjdDsgZS5nLiB0cnlpbmcgdG8gdXNlIGEgcmVzb3VyY2UgYWZ0ZXIgaXQgaGFzIGJlZW4gY2xvc2VkLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0lsbGVnYWxTdGF0ZUVycm9yJylcbmV4cG9ydCBjbGFzcyBJbGxlZ2FsU3RhdGVFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBXb3JrZmxvdyB3aXRoIHRoZSBnaXZlbiBJZCBpcyBub3Qga25vd24gdG8gVGVtcG9yYWwgU2VydmVyLlxuICogSXQgY291bGQgYmUgYmVjYXVzZTpcbiAqIC0gSWQgcGFzc2VkIGlzIGluY29ycmVjdFxuICogLSBXb3JrZmxvdyBpcyBjbG9zZWQgKGZvciBzb21lIGNhbGxzLCBlLmcuIGB0ZXJtaW5hdGVgKVxuICogLSBXb3JrZmxvdyB3YXMgZGVsZXRlZCBmcm9tIHRoZSBTZXJ2ZXIgYWZ0ZXIgcmVhY2hpbmcgaXRzIHJldGVudGlvbiBsaW1pdFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1dvcmtmbG93Tm90Rm91bmRFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIGlzIG5vdCBrbm93biB0byBUZW1wb3JhbCBTZXJ2ZXIuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignTmFtZXNwYWNlTm90Rm91bmRFcnJvcicpXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYE5hbWVzcGFjZSBub3QgZm91bmQ6ICcke25hbWVzcGFjZX0nYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdyB0aGlzIGVycm9yIGZyb20gYW4gQWN0aXZpdHkgaW4gb3JkZXIgdG8gbWFrZSB0aGUgV29ya2VyIGZvcmdldCBhYm91dCB0aGlzIEFjdGl2aXR5LlxuICpcbiAqIFRoZSBBY3Rpdml0eSBjYW4gdGhlbiBiZSBjb21wbGV0ZWQgYXN5bmNocm9ub3VzbHkgKGZyb20gYW55d2hlcmXigJR1c3VhbGx5IG91dHNpZGUgdGhlIFdvcmtlcikgdXNpbmdcbiAqIHRoZSBDbGllbnQncyBhY3Rpdml0eSBoYW5kbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICppbXBvcnQgeyBDb21wbGV0ZUFzeW5jRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9hY3Rpdml0eSc7XG4gKlxuICpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlBY3Rpdml0eSgpOiBQcm9taXNlPG5ldmVyPiB7XG4gKiAgLy8gLi4uXG4gKiAgdGhyb3cgbmV3IENvbXBsZXRlQXN5bmNFcnJvcigpO1xuICp9XG4gKiBgYGBcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdDb21wbGV0ZUFzeW5jRXJyb3InKVxuZXhwb3J0IGNsYXNzIENvbXBsZXRlQXN5bmNFcnJvciBleHRlbmRzIEVycm9yIHt9XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBpc1JlY29yZCwgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbmV4cG9ydCBjb25zdCBGQUlMVVJFX1NPVVJDRSA9ICdUeXBlU2NyaXB0U0RLJztcbmV4cG9ydCB0eXBlIFByb3RvRmFpbHVyZSA9IHRlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLklGYWlsdXJlO1xuXG5leHBvcnQgY29uc3QgVGltZW91dFR5cGUgPSB7XG4gIFNUQVJUX1RPX0NMT1NFOiAnU1RBUlRfVE9fQ0xPU0UnLFxuICBTQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJyxcbiAgU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG4gIEhFQVJUQkVBVDogJ0hFQVJUQkVBVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU1RBUlRfVE9fQ0xPU0V9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19TVEFSVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX1NUQVJUOiAnU0NIRURVTEVfVE9fU1RBUlQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNDSEVEVUxFX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSEVBUlRCRUFUfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfSEVBUlRCRUFUOiAnSEVBUlRCRUFUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGB1bmRlZmluZWRgIGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRpbWVvdXRUeXBlID0gKHR5cGVvZiBUaW1lb3V0VHlwZSlba2V5b2YgdHlwZW9mIFRpbWVvdXRUeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVUaW1lb3V0VHlwZSwgZGVjb2RlVGltZW91dFR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIFRpbWVvdXRUeXBlLFxuICAnVElNRU9VVF9UWVBFXydcbj4oXG4gIHtcbiAgICBbVGltZW91dFR5cGUuU1RBUlRfVE9fQ0xPU0VdOiAxLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19TVEFSVF06IDIsXG4gICAgW1RpbWVvdXRUeXBlLlNDSEVEVUxFX1RPX0NMT1NFXTogMyxcbiAgICBbVGltZW91dFR5cGUuSEVBUlRCRUFUXTogNCxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4pO1xuXG5leHBvcnQgY29uc3QgUmV0cnlTdGF0ZSA9IHtcbiAgSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG4gIE5PTl9SRVRSWUFCTEVfRkFJTFVSRTogJ05PTl9SRVRSWUFCTEVfRkFJTFVSRScsXG4gIFRJTUVPVVQ6ICdUSU1FT1VUJyxcbiAgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEOiAnTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEJyxcbiAgUkVUUllfUE9MSUNZX05PVF9TRVQ6ICdSRVRSWV9QT0xJQ1lfTk9UX1NFVCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gIENBTkNFTF9SRVFVRVNURUQ6ICdDQU5DRUxfUkVRVUVTVEVEJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTl9QUk9HUkVTU30gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTk9OX1JFVFJZQUJMRV9GQUlMVVJFfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9OT05fUkVUUllBQkxFX0ZBSUxVUkU6ICdOT05fUkVUUllBQkxFX0ZBSUxVUkUnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFRJTUVPVVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1RJTUVPVVQ6ICdUSU1FT1VUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUkVUUllfUE9MSUNZX05PVF9TRVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1JFVFJZX1BPTElDWV9OT1RfU0VUOiAnUkVUUllfUE9MSUNZX05PVF9TRVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElOVEVSTkFMX1NFUlZFUl9FUlJPUn0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5URVJOQUxfU0VSVkVSX0VSUk9SOiAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDQU5DRUxfUkVRVUVTVEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9DQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJldHJ5U3RhdGUgPSAodHlwZW9mIFJldHJ5U3RhdGUpW2tleW9mIHR5cGVvZiBSZXRyeVN0YXRlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVSZXRyeVN0YXRlLCBkZWNvZGVSZXRyeVN0YXRlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiBSZXRyeVN0YXRlLFxuICAnUkVUUllfU1RBVEVfJ1xuPihcbiAge1xuICAgIFtSZXRyeVN0YXRlLklOX1BST0dSRVNTXTogMSxcbiAgICBbUmV0cnlTdGF0ZS5OT05fUkVUUllBQkxFX0ZBSUxVUkVdOiAyLFxuICAgIFtSZXRyeVN0YXRlLlRJTUVPVVRdOiAzLFxuICAgIFtSZXRyeVN0YXRlLk1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRF06IDQsXG4gICAgW1JldHJ5U3RhdGUuUkVUUllfUE9MSUNZX05PVF9TRVRdOiA1LFxuICAgIFtSZXRyeVN0YXRlLklOVEVSTkFMX1NFUlZFUl9FUlJPUl06IDYsXG4gICAgW1JldHJ5U3RhdGUuQ0FOQ0VMX1JFUVVFU1RFRF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdSRVRSWV9TVEFURV8nXG4pO1xuXG4vKipcbiAqIEEgY2F0ZWdvcnkgdG8gZGVzY3JpYmUgdGhlIHNldmVyaXR5IGFuZCBjaGFuZ2UgdGhlIG9ic2VydmFiaWxpdHkgYmVoYXZpb3Igb2YgYW4gYXBwbGljYXRpb24gZmFpbHVyZS5cbiAqXG4gKiBDdXJyZW50bHksIG9ic2VydmFiaWxpdHkgYmVoYXZpb3IgY2hhbmdlcyBhcmUgbGltaXRlZCB0bzpcbiAqIC0gYWN0aXZpdGllcyB0aGF0IGZhaWwgZHVlIHRvIGEgQkVOSUdOIGFwcGxpY2F0aW9uIGZhaWx1cmUgZW1pdCBERUJVRyBsZXZlbCBsb2dzIGFuZCBkbyBub3QgcmVjb3JkIG1ldHJpY3NcbiAqXG4gKiBAZXhwZXJpbWVudGFsIENhdGVnb3J5IGlzIGEgbmV3IGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0ge1xuICBCRU5JR046ICdCRU5JR04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0gKHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSlba2V5b2YgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSwgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5BcHBsaWNhdGlvbkVycm9yQ2F0ZWdvcnksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQXBwbGljYXRpb25FcnJvckNhdGVnb3J5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkFwcGxpY2F0aW9uRXJyb3JDYXRlZ29yeSxcbiAgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuPihcbiAge1xuICAgIFtBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeS5CRU5JR05dOiAxLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuKTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dFeGVjdXRpb24gPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklXb3JrZmxvd0V4ZWN1dGlvbjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGZhaWx1cmVzIHRoYXQgY2FuIGNyb3NzIFdvcmtmbG93IGFuZCBBY3Rpdml0eSBib3VuZGFyaWVzLlxuICpcbiAqICoqTmV2ZXIgZXh0ZW5kIHRoaXMgY2xhc3Mgb3IgYW55IG9mIGl0cyBjaGlsZHJlbi4qKlxuICpcbiAqIFRoZSBvbmx5IGNoaWxkIGNsYXNzIHlvdSBzaG91bGQgZXZlciB0aHJvdyBmcm9tIHlvdXIgY29kZSBpcyB7QGxpbmsgQXBwbGljYXRpb25GYWlsdXJlfS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdUZW1wb3JhbEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRlbXBvcmFsRmFpbHVyZSBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBmYWlsdXJlIHRoYXQgY29uc3RydWN0ZWQgdGhpcyBlcnJvci5cbiAgICpcbiAgICogT25seSBwcmVzZW50IGlmIHRoaXMgZXJyb3Igd2FzIGdlbmVyYXRlZCBmcm9tIGFuIGV4dGVybmFsIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmYWlsdXJlPzogUHJvdG9GYWlsdXJlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKiogRXhjZXB0aW9ucyBvcmlnaW5hdGVkIGF0IHRoZSBUZW1wb3JhbCBzZXJ2aWNlLiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdTZXJ2ZXJGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBTZXJ2ZXJGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU6IGJvb2xlYW4sXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYHMgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgZmFpbHVyZXMgaW4gV29ya2Zsb3dzIGFuZCBBY3Rpdml0aWVzLlxuICpcbiAqIFRoZSB7QGxpbmsgdHlwZX0gcHJvcGVydHkgaXMgbWF0Y2hlZCBhZ2FpbnN0IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSB0byBkZXRlcm1pbmUgaWYgYW4gaW5zdGFuY2VcbiAqIG9mIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLiBBbm90aGVyIHdheSB0byBhdm9pZCByZXRyeWluZyBpcyBieSBzZXR0aW5nIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHRvIGB0cnVlYC5cbiAqXG4gKiBJbiBXb3JrZmxvd3MsIGlmIHlvdSB0aHJvdyBhIG5vbi1gQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IFRhc2sgd2lsbCBmYWlsIGFuZCBiZSByZXRyaWVkLiBJZiB5b3UgdGhyb3cgYW5cbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgLCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIHdpbGwgZmFpbC5cbiAqXG4gKiBJbiBBY3Rpdml0aWVzLCB5b3UgY2FuIGVpdGhlciB0aHJvdyBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCBvciBhbm90aGVyIGBFcnJvcmAgdG8gZmFpbCB0aGUgQWN0aXZpdHkgVGFzay4gSW4gdGhlXG4gKiBsYXR0ZXIgY2FzZSwgdGhlIGBFcnJvcmAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAuIFRoZSBjb252ZXJzaW9uIGlzIGRvbmUgYXMgZm9sbG93aW5nOlxuICpcbiAqIC0gYHR5cGVgIGlzIHNldCB0byBgZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZWBcbiAqIC0gYG1lc3NhZ2VgIGlzIHNldCB0byBgZXJyb3IubWVzc2FnZWBcbiAqIC0gYG5vblJldHJ5YWJsZWAgaXMgc2V0IHRvIGZhbHNlXG4gKiAtIGBkZXRhaWxzYCBhcmUgc2V0IHRvIG51bGxcbiAqIC0gc3RhY2sgdHJhY2UgaXMgY29waWVkIGZyb20gdGhlIG9yaWdpbmFsIGVycm9yXG4gKlxuICogV2hlbiBhbiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYW4tYWN0aXZpdHktZXhlY3V0aW9uIHwgQWN0aXZpdHkgRXhlY3V0aW9ufSBmYWlscywgdGhlXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIHRoZSBsYXN0IEFjdGl2aXR5IFRhc2sgd2lsbCBiZSB0aGUgYGNhdXNlYCBvZiB0aGUge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gdGhyb3duIGluIHRoZVxuICogV29ya2Zsb3cuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQXBwbGljYXRpb25GYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICAvKipcbiAgICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmcm9tRXJyb3J9IG9yIHtAbGluayBjcmVhdGV9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25bXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgY2F1c2U/OiBFcnJvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5PzogQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkgfCB1bmRlZmluZWQgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgZnJvbSBhbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEZpcnN0IGNhbGxzIHtAbGluayBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUgfCBgZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKWB9IGFuZCB0aGVuIG92ZXJyaWRlcyBhbnkgZmllbGRzXG4gICAqIHByb3ZpZGVkIGluIGBvdmVycmlkZXNgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yIHwgdW5rbm93biwgb3ZlcnJpZGVzPzogQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcik7XG4gICAgT2JqZWN0LmFzc2lnbihmYWlsdXJlLCBvdmVycmlkZXMpO1xuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgd2lsbCBiZSByZXRyeWFibGUgKHVubGVzcyBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZSA9IGZhbHNlLCBkZXRhaWxzLCBuZXh0UmV0cnlEZWxheSwgY2F1c2UsIGNhdGVnb3J5IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUsIGRldGFpbHMsIGNhdXNlLCBuZXh0UmV0cnlEZWxheSwgY2F0ZWdvcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzdGlsbFxuICAgKiBub3QgYmUgcmV0cmllZCBpZiBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIGZhbHNlLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogV2hlbiB0aHJvd24gZnJvbSBhbiBBY3Rpdml0eSBvciBXb3JrZmxvdywgdGhlIEFjdGl2aXR5IG9yIFdvcmtmbG93IHdpbGwgbm90IGJlIHJldHJpZWQgKGV2ZW4gaWYgYHR5cGVgIGlzIG5vdFxuICAgKiBsaXN0ZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlXG4gICAqIEBwYXJhbSBkZXRhaWxzIE9wdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uUmV0cnlhYmxlKG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCB0eXBlPzogc3RyaW5nIHwgbnVsbCwgLi4uZGV0YWlsczogdW5rbm93bltdKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSA/PyAnRXJyb3InLCB0cnVlLCBkZXRhaWxzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogRXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSAodXNlZCBieSB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFjdGl2aXR5IG9yIFdvcmtmbG93IGNhbiBiZSByZXRyaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub25SZXRyeWFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBkZXRhaWxzPzogdW5rbm93bltdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIG92ZXJyaWRlcyB0aGUgZGVsYXkgdW50aWwgdGhlIG5leHQgcmV0cnkgb2YgdGhpcyBBY3Rpdml0eSAvIFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFJldHJ5IGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgc3ViamVjdCB0byB0aGUgbWF4aW11bSByZXRyaWVzIGxpbWl0IGFuZCB0b3RhbCB0aW1lIGxpbWl0IGRlZmluZWRcbiAgICogYnkgdGhlIHBvbGljeS5cbiAgICovXG4gIG5leHRSZXRyeURlbGF5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENhdXNlIG9mIHRoZSBmYWlsdXJlXG4gICAqL1xuICBjYXVzZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXZlcml0eSBjYXRlZ29yeSBvZiB0aGUgYXBwbGljYXRpb24gZXJyb3IuXG4gICAqIEFmZmVjdHMgd29ya2VyLXNpZGUgbG9nZ2luZyBhbmQgbWV0cmljcyBiZWhhdmlvciBvZiB0aGlzIGZhaWx1cmUuXG4gICAqL1xuICBjYXRlZ29yeT86IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5O1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gQ2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4gVG8gYWxsb3cgQ2FuY2VsbGF0aW9uIHRvIGhhcHBlbiwgbGV0IGl0IHByb3BhZ2F0ZS4gVG9cbiAqIGlnbm9yZSBDYW5jZWxsYXRpb24sIGNhdGNoIGl0IGFuZCBjb250aW51ZSBleGVjdXRpbmcuIE5vdGUgdGhhdCBDYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgcmVxdWVzdGVkIGEgc2luZ2xlIHRpbWUsIHNvXG4gKiB5b3VyIFdvcmtmbG93L0FjdGl2aXR5IEV4ZWN1dGlvbiB3aWxsIG5vdCByZWNlaXZlIGZ1cnRoZXIgQ2FuY2VsbGF0aW9uIHJlcXVlc3RzLlxuICpcbiAqIFdoZW4gYSBXb3JrZmxvdyBvciBBY3Rpdml0eSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCBhIGBDYW5jZWxsZWRGYWlsdXJlYCB3aWxsIGJlIHRoZSBgY2F1c2VgLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NhbmNlbGxlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZEZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IHVua25vd25bXSA9IFtdLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgYGNhdXNlYCB3aGVuIGEgV29ya2Zsb3cgaGFzIGJlZW4gdGVybWluYXRlZFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1Rlcm1pbmF0ZWRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZXJtaW5hdGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F1c2U/OiBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgdG8gcmVwcmVzZW50IHRpbWVvdXRzIG9mIEFjdGl2aXRpZXMgYW5kIFdvcmtmbG93c1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RpbWVvdXRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUaW1lb3V0RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdEhlYXJ0YmVhdERldGFpbHM6IHVua25vd24sXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRUeXBlOiBUaW1lb3V0VHlwZVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEFjdGl2aXR5IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgb3JpZ2luYWwgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMgYGNhdXNlYC5cbiAqIEZvciBleGFtcGxlLCBpZiBhbiBBY3Rpdml0eSB0aW1lZCBvdXQsIHRoZSBjYXVzZSB3aWxsIGJlIGEge0BsaW5rIFRpbWVvdXRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQWN0aXZpdHlGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBpZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBDaGlsZCBXb3JrZmxvdyBmYWlsdXJlLiBBbHdheXMgY29udGFpbnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgYXMgaXRzIHtAbGluayBjYXVzZX0uXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIENoaWxkIHdhcyBUZXJtaW5hdGVkLCB0aGUgYGNhdXNlYCBpcyBhIHtAbGluayBUZXJtaW5hdGVkRmFpbHVyZX0uXG4gKlxuICogVGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIG9ubHkgYnkgdGhlIGZyYW1ld29yayBjb2RlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NoaWxkV29ya2Zsb3dGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBDaGlsZFdvcmtmbG93RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb24sXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoJ0NoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBmYWlsZWQnLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIE5leHVzIE9wZXJhdGlvbiBleGVjdXRlZCBpbnNpZGUgYSBXb3JrZmxvdyBmYWlscy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOZXh1c09wZXJhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIE5leHVzT3BlcmF0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlZEV2ZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgYWRkIGEgTmV4dXNIYW5kbGVyRmFpbHVyZSBjbGFzcyBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG5cbi8qKlxuICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gKiAgLSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElEIGlzIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGlzIGBXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfRkFJTGBcbiAqICAtIFRoZXJlIGlzIGEgY2xvc2VkIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSWQgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX1cbiAqICAgIGlzIGBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfUkVKRUNUX0RVUExJQ0FURWBcbiAqICAtIFRoZXJlIGlzIGNsb3NlZCBXb3JrZmxvdyBpbiB0aGUgYENvbXBsZXRlZGAgc3RhdGUgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFlgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBgZXJyb3JgIGlzIGFscmVhZHkgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHJldHVybnMgYGVycm9yYC5cbiAqXG4gKiBPdGhlcndpc2UsIGNvbnZlcnRzIGBlcnJvcmAgaW50byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoOlxuICpcbiAqIC0gYG1lc3NhZ2VgOiBgZXJyb3IubWVzc2FnZWAgb3IgYFN0cmluZyhlcnJvcilgXG4gKiAtIGB0eXBlYDogYGVycm9yLmNvbnN0cnVjdG9yLm5hbWVgIG9yIGBlcnJvci5uYW1lYFxuICogLSBgc3RhY2tgOiBgZXJyb3Iuc3RhY2tgIG9yIGAnJ2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSAoaXNSZWNvcmQoZXJyb3IpICYmIFN0cmluZyhlcnJvci5tZXNzYWdlKSkgfHwgU3RyaW5nKGVycm9yKTtcbiAgY29uc3QgdHlwZSA9IChpc1JlY29yZChlcnJvcikgJiYgKGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWUpKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZhaWx1cmUgPSBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlOiBmYWxzZSB9KTtcbiAgZmFpbHVyZS5zdGFjayA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLnN0YWNrKSkgfHwgJyc7XG4gIHJldHVybiBmYWlsdXJlO1xufVxuXG4vKipcbiAqIElmIGBlcnJgIGlzIGFuIEVycm9yIGl0IGlzIHR1cm5lZCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICpcbiAqIElmIGBlcnJgIHdhcyBhbHJlYWR5IGEgYFRlbXBvcmFsRmFpbHVyZWAsIHJldHVybnMgdGhlIG9yaWdpbmFsIGVycm9yLlxuICpcbiAqIE90aGVyd2lzZSByZXR1cm5zIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggYFN0cmluZyhlcnIpYCBhcyB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnI6IHVua25vd24pOiBUZW1wb3JhbEZhaWx1cmUge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICByZXR1cm4gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycik7XG59XG5cbi8qKlxuICogR2V0IHRoZSByb290IGNhdXNlIG1lc3NhZ2Ugb2YgZ2l2ZW4gYGVycm9yYC5cbiAqXG4gKiBJbiBjYXNlIGBlcnJvcmAgaXMgYSB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSwgcmVjdXJzZSB0aGUgYGNhdXNlYCBjaGFpbiBhbmQgcmV0dXJuIHRoZSByb290IGBjYXVzZS5tZXNzYWdlYC5cbiAqIE90aGVyd2lzZSwgcmV0dXJuIGBlcnJvci5tZXNzYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RDYXVzZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZSA/IHJvb3RDYXVzZShlcnJvci5jYXVzZSkgOiBlcnJvci5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBlcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuIiwiLyoqXG4gKiBDb21tb24gbGlicmFyeSBmb3IgY29kZSB0aGF0J3MgdXNlZCBhY3Jvc3MgdGhlIENsaWVudCwgV29ya2VyLCBhbmQvb3IgV29ya2Zsb3dcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnLi9lbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hY3Rpdml0eS1vcHRpb25zJztcbmV4cG9ydCB7IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMsIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB9IGZyb20gJy4vYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMnO1xuZXhwb3J0IHsgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gfSBmcm9tICcuL2NvbnRpbnVlLWFzLW5ldyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwcmVjYXRlZC10aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZmFpbHVyZSc7XG5leHBvcnQgeyBIZWFkZXJzLCBOZXh0IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpb3JpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWNzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktcG9saWN5JztcbmV4cG9ydCB0eXBlIHsgVGltZXN0YW1wLCBEdXJhdGlvbiwgU3RyaW5nVmFsdWUgfSBmcm9tICcuL3RpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZXItZGVwbG95bWVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1kZWZpbml0aW9uLW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuZXhwb3J0IHtcbiAgU2VhcmNoQXR0cmlidXRlcywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleSxcbn0gZnJvbSAnLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHU4KHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gZW5jb2RpbmcuZW5jb2RlKHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIFVpbnQ4QXJyYXkgaW50byBhIFVURi04IHN0cmluZ1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYXJyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShhcnIpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvckNvZGUoZXJyb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlGdW5jLCBPbWl0TGFzdFBhcmFtIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBuZXh0IGZ1bmN0aW9uIGZvciBhIGdpdmVuIGludGVyY2VwdG9yIGZ1bmN0aW9uXG4gKlxuICogQ2FsbGVkIGZyb20gYW4gaW50ZXJjZXB0b3IgdG8gY29udGludWUgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG5leHBvcnQgdHlwZSBOZXh0PElGLCBGTiBleHRlbmRzIGtleW9mIElGPiA9IFJlcXVpcmVkPElGPltGTl0gZXh0ZW5kcyBBbnlGdW5jID8gT21pdExhc3RQYXJhbTxSZXF1aXJlZDxJRj5bRk5dPiA6IG5ldmVyO1xuXG4vKiogSGVhZGVycyBhcmUganVzdCBhIG1hcHBpbmcgb2YgaGVhZGVyIG5hbWUgdG8gUGF5bG9hZCAqL1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG4vKipcbiAqIENvbXBvc2UgYWxsIGludGVyY2VwdG9yIG1ldGhvZHMgaW50byBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBDYWxsaW5nIHRoZSBjb21wb3NlZCBmdW5jdGlvbiByZXN1bHRzIGluIGNhbGxpbmcgZWFjaCBvZiB0aGUgcHJvdmlkZWQgaW50ZXJjZXB0b3IsIGluIG9yZGVyIChmcm9tIHRoZSBmaXJzdCB0b1xuICogdGhlIGxhc3QpLCBmb2xsb3dlZCBieSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gcHJvdmlkZWQgYXMgYXJndW1lbnQgdG8gYGNvbXBvc2VJbnRlcmNlcHRvcnMoKWAuXG4gKlxuICogQHBhcmFtIGludGVyY2VwdG9ycyBhIGxpc3Qgb2YgaW50ZXJjZXB0b3JzXG4gKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRvciBtZXRob2QgdG8gY29tcG9zZVxuICogQHBhcmFtIG5leHQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dCAoaW1wb3J0ZWQgdmlhIGxpYi9pbnRlcmNlcHRvcnMpXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUludGVyY2VwdG9yczxJLCBNIGV4dGVuZHMga2V5b2YgST4oaW50ZXJjZXB0b3JzOiBJW10sIG1ldGhvZDogTSwgbmV4dDogTmV4dDxJLCBNPik6IE5leHQ8SSwgTT4ge1xuICBmb3IgKGxldCBpID0gaW50ZXJjZXB0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcnNbaV07XG4gICAgaWYgKGludGVyY2VwdG9yPy5bbWV0aG9kXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcmV2ID0gbmV4dDtcbiAgICAgIC8vIFdlIGxvc2UgdHlwZSBzYWZldHkgaGVyZSBiZWNhdXNlIFR5cGVzY3JpcHQgY2FuJ3QgZGVkdWNlIHRoYXQgaW50ZXJjZXB0b3JbbWV0aG9kXSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAgLy8gdGhlIHNhbWUgdHlwZSBhcyBOZXh0PEksIE0+XG4gICAgICBuZXh0ID0gKChpbnB1dDogYW55KSA9PiAoaW50ZXJjZXB0b3JbbWV0aG9kXSBhcyBhbnkpKGlucHV0LCBwcmV2KSkgYXMgYW55O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbmV4cG9ydCB0eXBlIFBheWxvYWQgPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklQYXlsb2FkO1xuXG4vKiogVHlwZSB0aGF0IGNhbiBiZSByZXR1cm5lZCBmcm9tIGEgV29ya2Zsb3cgYGV4ZWN1dGVgIGZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JldHVyblR5cGUgPSBQcm9taXNlPGFueT47XG5leHBvcnQgdHlwZSBXb3JrZmxvd1VwZGF0ZVR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55PiB8IGFueTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSA9IHtcbiAgaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgdmFsaWRhdG9yPzogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbFR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1NpZ25hbFR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5VHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGUgPSB7IGhhbmRsZXI6IFdvcmtmbG93UXVlcnlUeXBlOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEJyb2FkIFdvcmtmbG93IGZ1bmN0aW9uIGRlZmluaXRpb24sIHNwZWNpZmljIFdvcmtmbG93cyB3aWxsIHR5cGljYWxseSB1c2UgYSBuYXJyb3dlciB0eXBlIGRlZmluaXRpb24sIGUuZzpcbiAqIGBgYHRzXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdyhhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvdyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlO1xuXG5kZWNsYXJlIGNvbnN0IGFyZ3NCcmFuZDogdW5pcXVlIHN5bWJvbDtcbmRlY2xhcmUgY29uc3QgcmV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHVwZGF0ZSBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVVcGRhdGV9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSB1cGRhdGUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3VwZGF0ZSc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHNpZ25hbCBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWZpbml0aW9uPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHR5cGU6ICdzaWduYWwnO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgU2lnbmFsRGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBXb3JrZmxvdyBxdWVyeSBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVF1ZXJ5fVxuICpcbiAqIEByZW1hcmtzIGBBcmdzYCBhbmQgYFJldGAgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHF1ZXJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3F1ZXJ5JztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFF1ZXJ5RGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKiBHZXQgdGhlIFwidW53cmFwcGVkXCIgcmV0dXJuIHR5cGUgKHdpdGhvdXQgUHJvbWlzZSkgb2YgdGhlIGV4ZWN1dGUgaGFuZGxlciBmcm9tIFdvcmtmbG93IHR5cGUgYFdgICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdFR5cGU8VyBleHRlbmRzIFdvcmtmbG93PiA9IFJldHVyblR5cGU8Vz4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIFI+ID8gUiA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RnVuY3Rpb248UCBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+IHtcbiAgKC4uLmFyZ3M6IFApOiBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICogQGRlcHJlY2F0ZWQgbm90IHJlcXVpcmVkIGFueW1vcmUsIGZvciB1bnR5cGVkIGFjdGl2aXRpZXMgdXNlIHtAbGluayBVbnR5cGVkQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlJbnRlcmZhY2UgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIEFjdGl2aXR5IG5hbWUgdG8gZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgVW50eXBlZEFjdGl2aXRpZXMgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBBIHdvcmtmbG93J3MgaGlzdG9yeSBhbmQgSUQuIFVzZWZ1bCBmb3IgcmVwbGF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBbmRXb3JrZmxvd0lkIHtcbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICBoaXN0b3J5OiB0ZW1wb3JhbC5hcGkuaGlzdG9yeS52MS5IaXN0b3J5IHwgdW5rbm93biB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZGVmaW5pbmcgYWN0aW9ucyB0YWtlbiB3aGVuIGEgd29ya2Zsb3cgZXhpdHMgd2hpbGUgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVubmluZy5cbiAqIFRoZSB3b3JrZmxvdyBleGl0IG1heSBiZSBkdWUgdG8gc3VjY2Vzc2Z1bCByZXR1cm4sIGZhaWx1cmUsIGNhbmNlbGxhdGlvbiwgb3IgY29udGludWUtYXMtbmV3LlxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaW4gYWRkaXRpb24gdG8gYWJhbmRvbmluZyB0aGUgaGFuZGxlciBleGVjdXRpb24uIFRoZSB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZCBpZiB0aGUgd29ya2Zsb3cgZmFpbHMuXG4gICAqL1xuICBXQVJOX0FORF9BQkFORE9OOiAnV0FSTl9BTkRfQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIEFiYW5kb24gdGhlIGhhbmRsZXIgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBhbiB1cGRhdGUgaGFuZGxlciB0aGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW5cbiAgICogdGhlIHVwZGF0ZSByZXN1bHQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSAodHlwZW9mIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5KVtrZXlvZiB0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ldO1xuIiwiaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEV4YWN0LCBSZW1vdmVQcmVmaXgsIFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuXG4vKipcbiAqIENyZWF0ZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgbnVtZXJpYyBgZW51bWAgdHlwZXMgcHJvZHVjZWQgYnkgb3VyXG4gKiBQcm90b2J1ZiBjb21waWxlciBhbmQgXCJjb25zdCBvYmplY3Qgb2Ygc3RyaW5nc1wiIGVudW0gdmFsdWVzIHRoYXQgd2UgZXhwb3NlIGluIG91ciBwdWJsaWMgQVBJcy5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBOZXdseSBpbnRyb2R1Y2VkIGVudW1zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gKiAgICAgICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuICogICAgICAgQUJBTkRPTjogJ0FCQU5ET04nLFxuICogICAgICAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG4gKiAgICAgfSBhcyBjb25zdDtcbiAqICAgICB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbiAqXG4gKiAgICAgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSAvL1xuICogICAgICAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gKiAgICAgICAgIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nICAvLyBUaGlzIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3RvIGVudW0gZG9lc24ndCBhZGQgYSByZXBlYXRlZCBwcmVmaXggb24gdmFsdWVzXG4gKiAgICAgICA+KFxuICogICAgICAgICB7XG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsIC8vIFRoZXNlIG51bWJlcnMgbXVzdCBtYXRjaCB0aGUgb25lcyBpbiB0aGUgcHJvdG8gZW51bVxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICpcbiAqICAgICAgICAgICBVTlNQRUNJRklFRDogMCxcbiAqICAgICAgICAgfSBhcyBjb25zdCxcbiAqICAgICAgICAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuICogICAgICAgKTtcbiAqIGBgYFxuICpcbiAqIGBtYWtlUHJvdG9FbnVtQ29udmVydGVyc2Agc3VwcG9ydHMgb3RoZXIgdXNhZ2UgcGF0dGVybnMsIGJ1dCB0aGV5IGFyZSBvbmx5IG1lYW50IGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGZvcm1lciBlbnVtIGRlZmluaXRpb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBlbnVtcy5cbiAqXG4gKiAjIyMgQ29udGV4dFxuICpcbiAqIFRlbXBvcmFsJ3MgUHJvdG9idWYgQVBJcyBkZWZpbmUgc2V2ZXJhbCBgZW51bWAgdHlwZXM7IG91ciBQcm90b2J1ZiBjb21waWxlciB0cmFuc2Zvcm1zIHRoZXNlIHRvXG4gKiB0cmFkaXRpb25hbCAoaS5lLiBub24tY29uc3QpIFtUeXBlU2NyaXB0IG51bWVyaWMgYGVudW1gc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNudW1lcmljLWVudW1zKS5cbiAqXG4gKiBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIGZhciBmcm9tIGlkZWFsOlxuICpcbiAqICAtIER1ZSB0byB0aGUgZHVhbCBuYXR1cmUgb2Ygbm9uLWNvbnN0IFR5cGVTY3JpcHQgYGVudW1gcyAodGhleSBhcmUgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUpLFxuICogICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlZmVyIHRvIGFuIGVudW0gdmFsdWUgZnJvbSBjb2RlIHdpdGhvdXQgYSBcInJlYWxcIiBpbXBvcnQgb2YgdGhlIGVudW0gdHlwZVxuICogICAgKGkuZS4gY2FuJ3Qgc2ltcGx5IGRvIGBpbXBvcnQgdHlwZSAuLi5gKS4gSW4gV29ya2Zsb3cgY29kZSwgc3VjaCBhbiBpbXBvcnQgd291bGQgcmVzdWx0IGluXG4gKiAgICBsb2FkaW5nIG91ciBlbnRpcmUgUHJvdG9idWYgZGVmaW5pdGlvbnMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgYWRkaW5nIHNldmVyYWwgbWVnYWJ5dGVzIHRvXG4gKiAgICB0aGUgcGVyLXdvcmtmbG93IG1lbW9yeSBmb290cHJpbnQsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZTsgdG8gYXZvaWQgdGhhdCwgd2UgbmVlZCB0byBtYWludGFpblxuICogICAgYSBtaXJyb3IgY29weSBvZiBlYWNoIGVudW0gdHlwZXMgdXNlZCBieSBpbi13b3JrZmxvdyBBUElzLCBhbmQgZXhwb3J0IHRoZXNlIGZyb20gZWl0aGVyXG4gKiAgICBgQHRlbXBvcmFsaW8vY29tbW9uYCBvciBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgLlxuICogIC0gSXQgaXMgbm90IGRlc2lyYWJsZSBmb3IgdXNlcnMgdG8gbmVlZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGBAdGVtcG9yYWxpby9wcm90b2AganVzdCB0b1xuICogICAgZ2V0IGFjY2VzcyB0byB0aGVzZSBlbnVtIHR5cGVzOyB3ZSB0aGVyZWZvcmUgbWFkZSBpdCBhIGNvbW1vbiBwcmFjdGljZSB0byByZWV4cG9ydCB0aGVzZSBlbnVtc1xuICogICAgZnJvbSBvdXIgcHVibGljIGZhY2luZyBwYWNrYWdlcy4gSG93ZXZlciwgZXhwZXJpZW5jZSBkZW1vbnRyYXRlZCB0aGF0IHRoZXNlIHJlZXhwb3J0cyBlZmZlY3RpdmVseVxuICogICAgcmVzdWx0ZWQgaW4gcG9vciBhbmQgaW5jb25zaXN0ZW50IGRvY3VtZW50YXRpb24gY292ZXJhZ2UgY29tcGFyZWQgdG8gbWlycm9yZWQgZW51bXMgdHlwZXMuXG4gKiAgLSBPdXIgUHJvdG9idWYgZW51bSB0eXBlcyB0ZW5kIHRvIGZvbGxvdyBhIHZlcmJvc2UgYW5kIHJlZHVuZGFudCBuYW1pbmcgY29udmVudGlvbiwgd2hpY2ggZmVlbHNcbiAqICAgIHVuYXR1cmFsIGFuZCBleGNlc3NpdmUgYWNjb3JkaW5nIHRvIG1vc3QgVHlwZVNjcmlwdCBzdHlsZSBndWlkZXM7IGUuZy4gaW5zdGVhZCBvZlxuICogICAgYHdvcmtmbG93SWRSZXVzZVBvbGljeTogV29ya2Zsb3dJZFJldXNlUG9saWN5LldPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYCxcbiAqICAgIGEgVHlwZVNjcmlwdCBkZXZlbG9wZXIgd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWV0aGluZyBzaW1pbGFyIHRvXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiAnUkVKRUNUX0RVUExJQ0FURSdgLlxuICogIC0gQmVjYXVzZSBvZiB0aGUgd2F5IFByb3RvYnVmIHdvcmtzLCBtYW55IG9mIG91ciBlbnVtIHR5cGVzIGNvbnRhaW4gYW4gYFVOU1BFQ0lGSUVEYCB2YWx1ZSwgd2hpY2hcbiAqICAgIGlzIHVzZWQgdG8gZXhwbGljaXRseSBpZGVudGlmeSBhIHZhbHVlIHRoYXQgaXMgdW5zZXQuIEluIFR5cGVTY3JpcHQgY29kZSwgdGhlIGB1bmRlZmluZWRgIHZhbHVlXG4gKiAgICBhbHJlYWR5IHNlcnZlcyB0aGF0IHB1cnBvc2UsIGFuZCBpcyBkZWZpbml0ZWx5IG1vcmUgaWRpb21hdGljIHRvIFRTIGRldmVsb3BlcnMsIHdoZXJlYXMgdGhlc2VcbiAqICAgIGBVTlNQRUNJRklFRGAgdmFsdWVzIGNyZWF0ZSBub2lzZSBhbmQgY29uZnVzaW9uIGluIG91ciBBUElzLlxuICogIC0gVHlwZVNjcmlwdCBlZGl0b3JzIGdlbmVyYWxseSBkbyBhIHZlcnkgYmFkIGpvYiBhdCBwcm92aWRpbmcgYXV0b2NvbXBsZXRpb24gdGhhdCBpbXBsaWVzIHJlYWNoaW5nXG4gKiAgICBmb3IgdmFsdWVzIG9mIGEgVHlwZVNjcmlwdCBlbnVtIHR5cGUsIGZvcmNpbmcgZGV2ZWxvcGVycyB0byBleHBsaWNpdGx5IHR5cGUgaW4gYXQgbGVhc3QgcGFydFxuICogICAgb2YgdGhlIG5hbWUgb2YgdGhlIGVudW0gdHlwZSBiZWZvcmUgdGhleSBjYW4gZ2V0IGF1dG9jb21wbGV0aW9uIGZvciBpdHMgdmFsdWVzLiBPbiB0aGUgb3RoZXJcbiAqICAgIGhhbmQsIGFsbCBUUyBlZGl0b3JzIGltbWVkaWF0ZWx5IHByb3ZpZGUgYXV0b2NvbXBsZXRpb24gZm9yIHN0cmluZyB1bmlvbiB0eXBlcy5cbiAqICAtIFRoZSBbVHlwZVNjcmlwdCdzIG9mZmljaWFsIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2VudW1zLmh0bWwjb2JqZWN0cy12cy1lbnVtcylcbiAqICAgIGl0c2VsZiBzdWdnZXN0cyB0aGF0LCBpbiBtb2Rlcm4gVHlwZVNjcmlwdCwgdGhlIHVzZSBvZiBgYXMgY29uc3RgIG9iamVjdHMgbWF5IGdlbmVyYWxseSBzdWZmaWNlXG4gKiAgICBhbmQgbWF5IGJlIGFkdmFudGFnZW91cyBvdmVyIHRoZSB1c2Ugb2YgYGVudW1gIHR5cGVzLlxuICpcbiAqIEEgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MsIGNvbWJpbmVkIHdpdGggYSB1bmlvbiB0eXBlIG9mIHBvc3NpYmxlIHN0cmluZyB2YWx1ZXMsIHByb3ZpZGVzIGEgbXVjaFxuICogbW9yZSBpZGlvbWF0aWMgc3ludGF4IGFuZCBhIGJldHRlciBEWCBmb3IgVHlwZVNjcmlwdCBkZXZlbG9wZXJzLiBUaGlzIGhvd2V2ZXIgcmVxdWlyZXMgYSB3YXkgdG9cbiAqIGNvbnZlcnQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgYGVudW1gIHZhbHVlcyBwcm9kdWNlZCBieSB0aGUgUHJvdG9idWYgY29tcGlsZXIgYW5kIHRoZVxuICogZXF1aXZhbGVudCBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIFRoaXMgaGVscGVyIGR5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIGEgZ2l2ZW4gUHJvdG9idWYgZW51bSB0eXBlLFxuICogc3Ryb25nbHkgYnVpbGRpbmcgdXBvbiBzcGVjaWZpYyBjb252ZW50aW9ucyB0aGF0IHdlIGhhdmUgYWRvcHRlZCBpbiBvdXIgUHJvdG9idWYgZGVmaW5pdGlvbnMuXG4gKlxuICogIyMjIFZhbGlkYXRpb25zXG4gKlxuICogVGhlIGNvbXBsZXggdHlwZSBzaWduYXR1cmUgb2YgdGhpcyBoZWxwZXIgaXMgdGhlcmUgdG8gcHJldmVudCBtb3N0IHBvdGVudGlhbCBpbmNvaGVyZW5jaWVzXG4gKiB0aGF0IGNvdWxkIHJlc3VsdCBmcm9tIGhhdmluZyB0byBtYW51YWxseSBzeW5jaHJvbml6ZSB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSBhbmQgdGhlXG4gKiBjb252ZXJzaW9uIHRhYmxlIHdpdGggdGhlIHByb3RvIGVudW0sIHdoaWxlIG5vdCByZXF1aXJpbmcgYSByZWd1bGFyIGltcG9ydCBvbiB0aGUgUHJvdG9idWYgZW51bVxuICogaXRzZWxmIChzbyBpdCBjYW4gYmUgdXNlZCBzYWZlbHkgZm9yIGVudW1zIG1lYW50IHRvIGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb2RlKS5cbiAqXG4gKiBJbiBwYXJ0aWN1bGFyLCBmYWlsaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgd2lsbCByZXN1bHQgaW4gYnVpbGQgdGltZSBlcnJvcnM6XG4gKlxuICogLSBGb3IgZXZlcnkga2V5IG9mIHRoZSBmb3JtIGBQUkVGSVhfS0VZOiBudW1iZXJgIGluIHRoZSBwcm90byBlbnVtLCBleGNsdWRpbmcgdGhlIGBVTlNQRUNJRklFRGAga2V5OlxuICogICAtIFRoZXJlIE1VU1QgYmUgYSBjb3JyZXNwb25kaW5nIGBLRVk6ICdLRVknYCBlbnRyeSBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bTtcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfS0VZOiAnS0VZJ2AgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW1cbiAqICAgICAodGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHN1Y2ggYWxpYXNlcyBzaG91bGRcbiAqICAgICBub3QgYmUgYWRkZWQgZm9yIG5ldyBlbnVtcyBhbmQgZW51bSBlbnRyaWVzIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZCk7XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogbnVtYmVyYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gSWYgdGhlIHByb3RvIGVudW0gY29udGFpbnMgYSBgUFJFRklYX1VOU1BFQ0lGSUVEYCBlbnRyeSwgdGhlbjpcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZGAgYW5kL29yIGBVTlNQRUNJRklFRDogdW5kZWZpbmVkYFxuICogICAgIGVudHJpZXMgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0g4oCUIHRoaXMgaXMgbWVhbnQgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogICAgIHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHRoaXMgYWxpYXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZDtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGFuIGBVTlNQRUNJRklFRDogMGAgaW4gdGhlIG1hcHBpbmcgdGFibGUuXG4gKiAtIFRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBvclxuICogICBvcHRpb25hbGx5IGFsbG93ZWQgYmUgdGhlIHByZWNlZWRpbmcgcnVsZXMuXG4gKiAtIFRoZSBtYXBwaW5nIHRhYmxlIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBhYm92ZS5cbiAqXG4gKiBUaGVzZSBydWxlcyBub3RhYmx5IGVuc3VyZSB0aGF0IHdoZW5ldmVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIFByb3RvIGVudW0sIHRoZSBjb2RlXG4gKiB3aWxsIGZhaWwgdG8gY29tcGlsZSB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpcyBhZGRlZCBvbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogYW5kIHRoZSBtYXBwaW5nIHRhYmxlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIFByb3RvRW51bVZhbHVlIGV4dGVuZHMgbnVtYmVyLFxuICBQcm90b0VudW0gZXh0ZW5kcyB7IFtrIGluIFByb3RvRW51bUtleV06IFByb3RvRW51bVZhbHVlIH0sXG4gIFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gLFxuICBTdHJpbmdFbnVtVHlwZUFjdHVhbCBleHRlbmRzIEV4YWN0PFN0cmluZ0VudW1UeXBlLCBTdHJpbmdFbnVtVHlwZUFjdHVhbD4sXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgLy9cbiAgLy8gUGFyYW1ldGVycyBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgaW5mZXJyZWQ7IHRoZXkncmUgbm90IG1lYW50IG5vdCB0byBiZSBzcGVjaWZpZWQgYnkgZGV2ZWxvcGVyc1xuICBVbnNwZWNpZmllZCA9IFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH1VTlNQRUNJRklFRGAgPyAnVU5TUEVDSUZJRUQnIDogbmV2ZXIsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4gPSBFeGNsdWRlPFxuICAgIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4gICAgVW5zcGVjaWZpZWRcbiAgPixcbiAgU3RyaW5nRW51bVR5cGUgZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkXG4gID4gPSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBNYXBUYWJsZSBleHRlbmRzIFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICAgIFN0cmluZ0VudW1UeXBlLFxuICAgIFByb3RvRW51bVZhbHVlLFxuICAgIFByb3RvRW51bSxcbiAgICBQcm90b0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkLFxuICAgIFNob3J0U3RyaW5nRW51bUtleVxuICA+ID0gUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4sXG4+KFxuICBtYXBUYWJsZTogTWFwVGFibGUsXG4gIHByZWZpeDogUHJlZml4XG4pOiBbXG4gIChcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKSA9PiBQcm90b0VudW1WYWx1ZSB8IHVuZGVmaW5lZCwgLy9cbiAgKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpID0+IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCwgLy9cbl0ge1xuICBjb25zdCByZXZlcnNlVGFibGU6IFJlY29yZDxQcm90b0VudW1WYWx1ZSwgU2hvcnRTdHJpbmdFbnVtS2V5PiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXBUYWJsZSkubWFwKChbaywgdl0pID0+IFt2LCBrXSlcbiAgKTtcbiAgY29uc3QgaGFzVW5zcGVjaWZpZWQgPSAobWFwVGFibGUgYXMgYW55KVsnVU5TUEVDSUZJRUQnXSA9PT0gMCB8fCAobWFwVGFibGUgYXMgYW55KVtgJHtwcmVmaXh9VU5TUEVDSUZJRURgXSA9PT0gMDtcblxuICBmdW5jdGlvbiBpc1Nob3J0U3RyaW5nRW51bUtleXMoeDogdW5rbm93bik6IHggaXMgU2hvcnRTdHJpbmdFbnVtS2V5IHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHggaW4gbWFwVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBpc051bWVyaWNFbnVtVmFsdWUoeDogdW5rbm93bik6IHggaXMgUHJvdG9FbnVtW2tleW9mIFByb3RvRW51bV0ge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgeCBpbiByZXZlcnNlVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBlbmNvZGUoXG4gICAgaW5wdXQ6IFNob3J0U3RyaW5nRW51bUtleSB8IGAke1ByZWZpeH0ke1Nob3J0U3RyaW5nRW51bUtleX1gIHwgUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBzaG9ydGVuOiBzdHJpbmcgPSBpbnB1dDtcbiAgICAgIGlmIChzaG9ydGVuLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBzaG9ydGVuID0gc2hvcnRlbi5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Nob3J0U3RyaW5nRW51bUtleXMoc2hvcnRlbikpIHtcbiAgICAgICAgcmV0dXJuIG1hcFRhYmxlW3Nob3J0ZW5dO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgZW51bSB2YWx1ZTogJyR7aW5wdXR9J2ApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBTaG9ydFN0cmluZ0VudW1LZXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGhhc1Vuc3BlY2lmaWVkICYmIGlucHV0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc051bWVyaWNFbnVtVmFsdWUoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlVGFibGVbaW5wdXRdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBnb3QgYSBwcm90byBlbnVtIHZhbHVlIHRoYXQgd2UgZG9uJ3QgeWV0IGtub3cgYWJvdXQgKGkuZS4gaXQgZGlkbid0IGV4aXN0IHdoZW4gdGhpcyBjb2RlXG4gICAgICAvLyB3YXMgY29tcGlsZWQpLiBUaGlzIGlzIGNlcnRhaW5seSBhIHBvc3NpYmlsaXR5LCBidXQgZ2l2ZW4gaG93IG91ciBBUElzIGV2b2x2ZSwgdGhpcyBpcyBpc1xuICAgICAgLy8gdW5saWtlbHkgdG8gYmUgYSB0ZXJyaWJseSBiYWQgdGhpbmcgYnkgaXRzZWxmICh3ZSBhdm9pZCBhZGRpbmcgbmV3IGVudW0gdmFsdWVzIGluIHBsYWNlc1xuICAgICAgLy8gdGhhdCB3b3VsZCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgZGVwbG95ZWQgY29kZSkuIFRoZXJlZm9yZSwgdGhyb3dpbmdcbiAgICAgIC8vIG9uIFwidW5leHBlY3RlZFwiIHZhbHVlcyBpcyBsaWtlbHkgdG8gZW5kIHVwIGNhdXNpbmcgbW9yZSBwcm9ibGVtcyB0aGFuIGl0IG1pZ2h0IGF2b2lkLFxuICAgICAgLy8gZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoZSBkZWNvZGVkIHZhbHVlIG1heSBhY3R1YWxseSBuZXZlciBnZXQgcmVhZCBhbnd5YXkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBpbnN0ZWFkIGNoZWF0IG9uIHR5cGUgY29uc3RyYWludHMgYW5kIHJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSBcInVua25vd25fMjNcIi5cbiAgICAgIC8vIFRoYXQgc29tZXdoYXQgbWlycm9ycyB0aGUgYmVoYXZpb3Igd2UnZCBnZXQgd2l0aCB0aGUgcHVyZSBudW1lcmljYWwgYXBwcm9hY2guXG4gICAgICByZXR1cm4gYHVua25vd25fJHtpbnB1dH1gIGFzIFNob3J0U3RyaW5nRW51bUtleTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBwcm90byBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gIH1cblxuICByZXR1cm4gW2VuY29kZSwgZGVjb2RlXSBhcyBjb25zdDtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBvZiBhIHByb3RvIGVudW0gKGkuZS4gc2hvcnQga2V5cywgcHJlZml4LCBhbmQgc2hvcnQga2V5IG9mIHRoZVxuICogdW5zcGVjaWZpZWQgdmFsdWUpLCBtYWtlIGEgdHlwZSB0aGF0IF9leGFjdGx5XyBjb3JyZXNwb25kcyB0byB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSxcbiAqIGUuZy4gdGhlIHR5cGUgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIGV4cGVjdGVkIHRvIHdyaXRlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSwgdGhpcyBldmFsdWF0ZXMgdG86XG4gKlxuICoge1xuICogICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCI7XG4gKiAgIEFCQU5ET046IFwiQUJBTkRPTlwiO1xuICogICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU/OiBcIlRFUk1JTkFURVwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX0FCQU5ET04/OiBcIkFCQU5ET05cIjtcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTD86IFwiUkVRVUVTVF9DQU5DRUxcIjtcbiAqXG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ/OiB1bmRlZmluZWQ7XG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08XG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIHN0cmluZyxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCwgLy8gZS5nLiAnVU5TUEVDSUZJRUQnXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAgfCB7XG4gICAgICAvLyBlLmcuOiBcIlRFUk1JTkFURVwiOiBcIlRFUk1JTkFURVwiXG4gICAgICByZWFkb25seSBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBrO1xuICAgIH1cbiAgfCB7XG4gICAgICBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBQcmVmaXggZXh0ZW5kcyAnJ1xuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC8vIGUuZy46IFwiUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcIj86IFwiVEVSTUlOQVRFXCJcbiAgICAgICAgICAgIHJlYWRvbmx5IFtrayBpbiBgJHtQcmVmaXh9JHtrfWBdPzogaztcbiAgICAgICAgICB9O1xuICAgIH1bU2hvcnRTdHJpbmdFbnVtS2V5XVxuICB8IChVbnNwZWNpZmllZCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtQcmVmaXh9JHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlVOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4+O1xuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXBwaW5nIHRhYmxlIHRoYXQgdGhlIHVzZXIgaXNcbiAqIGV4cGVjdGVkIHRvIHByb3ZpZGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgVU5TUEVDSUZJRUQ6IDAsXG4gKiAgVEVSTUlOQVRFOiAxLFxuICogIEFCQU5ET046IDIsXG4gKiAgUkVRVUVTVF9DQU5DRUw6IDMsXG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gIF9TdHJpbmdFbnVtIGV4dGVuZHMgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08U2hvcnRTdHJpbmdFbnVtS2V5LCBQcmVmaXgsIFVuc3BlY2lmaWVkPixcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgVW5zcGVjaWZpZWQsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAge1xuICAgIFtrIGluIFByb3RvRW51bUtleV06IHtcbiAgICAgIFtrayBpbiBSZW1vdmVQcmVmaXg8UHJlZml4LCBrPl06IFByb3RvRW51bVtrXSBleHRlbmRzIG51bWJlciA/IFByb3RvRW51bVtrXSA6IG5ldmVyO1xuICAgIH07XG4gIH1bUHJvdG9FbnVtS2V5XVxuPjtcbiIsImV4cG9ydCAqIGZyb20gJy4vZW51bXMtaGVscGVycyc7XG5leHBvcnQge1xuICBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLFxuICBtZXJnZU9iamVjdHMsXG4gIC8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG4gIGRlZXBNZXJnZSxcbn0gZnJvbSAnLi9vYmplY3RzLWhlbHBlcnMnO1xuIiwiLyoqXG4gKiBIZWxwZXIgdG8gcHJldmVudCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHZhbHVlcyBvdmVycmlkaW5nIGRlZmF1bHRzIHdoZW4gbWVyZ2luZyBtYXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTnVsbEFuZFVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT0gbnVsbCkpIGFzIGFueTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb2JqZWN0cywgcG9zc2libHkgcmVtb3Zpbmcga2V5cy5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseTpcbiAqIC0gQW55IGtleS92YWx1ZSBwYWlyIGluIGBkZWx0YWAgb3ZlcnJpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGtleS92YWx1ZSBwYWlyIGluIGBvcmlnaW5hbGA7XG4gKiAtIEEga2V5IHByZXNlbnQgaW4gYGRlbHRhYCB3aXRoIHZhbHVlIGB1bmRlZmluZWRgIHJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByZXN1bHRpbmcgb2JqZWN0O1xuICogLSBJZiBgb3JpZ2luYWxgIGlzIGB1bmRlZmluZWRgIG9yIGVtcHR5LCByZXR1cm4gYGRlbHRhYDtcbiAqIC0gSWYgYGRlbHRhYCBpcyBgdW5kZWZpbmVkYCBvciBlbXB0eSwgcmV0dXJuIGBvcmlnaW5hbGAgKG9yIHVuZGVmaW5lZCBpZiBgb3JpZ2luYWxgIGlzIGFsc28gdW5kZWZpbmVkKTtcbiAqIC0gSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMsIHRoZW4gcmV0dXJuIGBvcmlnaW5hbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9yaWdpbmFsOiBULCBkZWx0YTogVCB8IHVuZGVmaW5lZCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb3JpZ2luYWw6IFQgfCB1bmRlZmluZWQsXG4gIGRlbHRhOiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9yaWdpbmFsID09IG51bGwpIHJldHVybiBkZWx0YTtcbiAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybiBvcmlnaW5hbDtcblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLm9yaWdpbmFsIH07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhKSkge1xuICAgIGlmICh2ICE9PSBtZXJnZWRba10pIHtcbiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSBtZXJnZWRba107XG4gICAgICBlbHNlIG1lcmdlZFtrXSA9IHY7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IChtZXJnZWQgYXMgVCkgOiBvcmlnaW5hbDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBQcm9wZXJ0aWVzIGZyb20gYHNvdXJjZWAgd2lsbCBvdmVyd3JpdGUgcHJvcGVydGllcyBvbiBgdGFyZ2V0YC5cbiAqIE5lc3RlZCBvYmplY3RzIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuXG4gKlxuICogT2JqZWN0IGZpZWxkcyBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFyZSByZWZlcmVuY2VzLCBhcyBpbixcbiAqIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBQYXJ0aWFsPFQ+KTogVCB7XG4gIGNvbnN0IG91dHB1dCA9IHsgLi4udGFyZ2V0IH07XG5cbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgICBpZiAoaXNPYmplY3Qoc291cmNlVmFsdWUpICYmIGtleSBpbiB0YXJnZXQgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0gYXMgYW55KSkge1xuICAgICAgICBvdXRwdXRba2V5IGFzIGtleW9mIFRdID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2VWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAob3V0cHV0IGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLCBtZXJnZU9iamVjdHMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnVFJBQ0UnIHwgJ0RFQlVHJyB8ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUic7XG5cbmV4cG9ydCB0eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55PjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY3VzdG9taXplIHdvcmtlciBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG59XG5cbi8qKlxuICogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgc2RrQ29tcG9uZW50YCBtZXRhIGF0dHJpYnV0ZXMgb24gbG9nIG1lc3NhZ2VzLiBUaGlzXG4gKiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIHN1YnN5c3RlbSBlbWl0dGVkIHRoZSBsb2cgbWVzc2FnZTsgdGhpcyBtYXkgZm9yXG4gKiBleGFtcGxlIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIG1lc3NhZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIGxpc3Qgd2lsbCByZW1haW4gc3RhYmxlIGluIHRoZVxuICogZnV0dXJlOyB2YWx1ZXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQsIGFuZCBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHlcbiAqIGVtaXR0ZWQgd2l0aCBzb21lIGBzZGtDb21wb25lbnRgIHZhbHVlIG1heSB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGVudW0gU2RrQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2luZyB0aGUge0BsaW5rIFdvcmtmbG93IGNvbnRleHQgbG9nZ2VyfHdvcmtmbG93LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICB3b3JrZmxvdyA9ICd3b3JrZmxvdycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhbiBhY3Rpdml0eSwgdXNpbmcgdGhlIHtAbGluayBhY3Rpdml0eSBjb250ZXh0IGxvZ2dlcnxDb250ZXh0LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBhY3Rpdml0eSA9ICdhY3Rpdml0eScsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIE5leHVzIE9wZXJhdGlvbiBIYW5kbGVyLCB1c2luZyB0aGUgTmV4dXMgY29udGV4dCBsb2dnZXIuXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBuZXh1cyA9ICduZXh1cycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIFRlbXBvcmFsIFdvcmtlciBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyBub3RhYmx5IGluY2x1ZGVzOlxuICAgKiAtIElzc3VlcyB3aXRoIFdvcmtlciBvciBydW50aW1lIGNvbmZpZ3VyYXRpb24sIG9yIHRoZSBKUyBleGVjdXRpb24gZW52aXJvbm1lbnQ7XG4gICAqIC0gV29ya2VyJ3MsIEFjdGl2aXR5J3MsIGFuZCBXb3JrZmxvdydzIGxpZmVjeWNsZSBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgQWN0aXZhdGlvbiBhbmQgQWN0aXZpdHkgVGFzayBwcm9jZXNzaW5nIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBidW5kbGluZyBtZXNzYWdlcztcbiAgICogLSBTaW5rIHByb2Nlc3NpbmcgaXNzdWVzLlxuICAgKi9cbiAgd29ya2VyID0gJ3dvcmtlcicsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBhbGwgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgUnVzdCBDb3JlIFNESyBsaWJyYXJ5LlxuICAgKi9cbiAgY29yZSA9ICdjb3JlJyxcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBMb2dNZXRhT3JGdW5jID0gTG9nTWV0YWRhdGEgfCAoKCkgPT4gTG9nTWV0YWRhdGEpO1xuXG4vKipcbiAqIEEgbG9nZ2VyIGltcGxlbWVudGF0aW9uIHRoYXQgYWRkcyBtZXRhZGF0YSBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBsb2dnZXIuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YSBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTG9nZ2VyfSB0aGF0IGFkZHMgbWV0YWRhdGEgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbG9nZ2VyLlxuICAgKlxuICAgKiBOZXcgbWV0YWRhdGEgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvbiBldmFsdWF0ZWRcbiAgICogZXZlcnkgdGltZSBhIGxvZyBpcyBlbWl0dGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIG1ldGFkYXRhIGFzIGxvdyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29tcG9zZShsb2dnZXI6IExvZ2dlciwgbWV0YU9yRnVuYzogTG9nTWV0YU9yRnVuYyk6IExvZ2dlciB7XG4gICAgLy8gRmxhdHRlbiByZWN1cnNpdmUgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEgaW5zdGFuY2VzXG4gICAgaWYgKGxvZ2dlciBpbnN0YW5jZW9mIExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKGxvZ2dlci5jb250cmlidXRvcnMsIG1ldGFPckZ1bmMpO1xuICAgICAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluLCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcgbG9nZ2VyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiBsb2dnZXI7XG4gICAgICByZXR1cm4gbmV3IExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKGxvZ2dlci5wYXJlbnRMb2dnZXIsIGNvbnRyaWJ1dG9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odW5kZWZpbmVkLCBtZXRhT3JGdW5jKTtcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGxvZ2dlcjtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEobG9nZ2VyLCBjb250cmlidXRvcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXVxuICApIHt9XG5cbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmxvZyhsZXZlbCwgbWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci50cmFjZShtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmRlYnVnKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci5pbmZvKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci53YXJuKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIuZXJyb3IobWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTWV0YWRhdGEoY29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10sIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogTG9nTWV0YWRhdGEge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFNZXRhKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIG1ldGFkYXRhIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvQ2hhaW4oXG4gIGV4aXN0aW5nQ29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQsXG4gIG5ld0NvbnRyaWJ1dG9yOiBMb2dNZXRhT3JGdW5jXG4pOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQge1xuICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIGFuIGVtcHR5IG9iamVjdCwgdGhlbiBpdCByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluXG4gIGlmICh0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG5ld0NvbnRyaWJ1dG9yKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gIH1cblxuICAvLyBJZiBleGlzdGluZyBjaGFpbiBpcyBlbXB0eSwgdGhlbiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIHRoZSBjaGFpblxuICBpZiAoZXhpc3RpbmdDb250cmlidXRvcnMgPT0gbnVsbCB8fCBleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW25ld0NvbnRyaWJ1dG9yXTtcbiAgfVxuXG4gIC8vIElmIGJvdGggbGFzdCBjb250cmlidXRvciBhbmQgbmV3IGNvbnRyaWJ1dG9yIGFyZSBwbGFpbiBvYmplY3RzLCBtZXJnZSB0aGVtIHRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29uc3QgbGFzdCA9IGV4aXN0aW5nQ29udHJpYnV0b3JzW2V4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCAtIDFdO1xuICBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZU9iamVjdHMobGFzdCwgbmV3Q29udHJpYnV0b3IpO1xuICAgIGlmIChtZXJnZWQgPT09IGxhc3QpIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgICByZXR1cm4gWy4uLmV4aXN0aW5nQ29udHJpYnV0b3JzLnNsaWNlKDAsIC0xKSwgbWVyZ2VkXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB7IGZpbHRlck51bGxBbmRVbmRlZmluZWQsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIEEgbWV0ZXIgZm9yIGNyZWF0aW5nIG1ldHJpY3MgdG8gcmVjb3JkIHZhbHVlcyBvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljTWV0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaGlzdG9ncmFtIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHJlY29yZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gcmVjb3JkLiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlPzogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGdhdWdlIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHNldHRpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgZ2F1Z2UgbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVHYXVnZShuYW1lOiBzdHJpbmcsIHZhbHVlVHlwZT86IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljR2F1Z2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB1cC1kb3duIGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHNpZ25lZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSB1cC1kb3duIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgdXAtZG93biBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIHVwLWRvd24gY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKi9cbiAgY3JlYXRlVXBEb3duQ291bnRlcj8obmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXI7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgbWV0ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLiBBbGwgbWV0cmljcyBjcmVhdGVkIG9mZiB0aGUgbWV0ZXIgd2lsbFxuICAgKiBoYXZlIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZC5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIG1ldHJpY3MuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pdCBvZiB0aGUgbWV0cmljLCBpZiBhbnkuXG4gICAqL1xuICB1bml0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldHJpYywgaWYgYW55LlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSBtZXRyaWMgKGUuZy4gYGNvdW50ZXJgLCBgaGlzdG9ncmFtYCwgYGdhdWdlYCkuXG4gICAqL1xuICBraW5kOiBNZXRyaWNLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB2YWx1ZSByZWNvcmRlZCBieSB0aGUgbWV0cmljLiBFaXRoZXIgYGludGAgb3IgYGZsb2F0YC5cbiAgICovXG4gIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBUYWdzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWUgbWV0cmljcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIG9mIG51bWVyaWNhbCB2YWx1ZXMgcmVjb3JkZWQgYnkgYSBtZXRyaWMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgcmVwcmVzZW50cyB0aGUgX2NvbmZpZ3VyYXRpb25fIG9mIHRoZSBtZXRyaWM7IGhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZG9lc24ndFxuICogaGF2ZSBkaWZmZXJlbnQgcnVudGltZSByZXByZXNlbnRhdGlvbiBmb3IgaW50ZWdlcnMgYW5kIGZsb2F0cywgdGhlIGFjdHVhbCB2YWx1ZSB0eXBlIGlzIGFsd2F5c1xuICogYSBKUyAnbnVtYmVyJy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyB8ICdmbG9hdCc7XG5cbi8qKlxuICogVGhlIGtpbmQgb2YgYSBtZXRyaWMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgdHlwZSBNZXRyaWNLaW5kID0gJ2NvdW50ZXInIHwgJ2hpc3RvZ3JhbScgfCAnZ2F1Z2UnIHwgJ3VwLWRvd24tY291bnRlcic7XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgdmFsdWVzIGFzIGEgY291bnRlci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljQ291bnRlciBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBjb3VudGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYWRkLlxuICAgKiBAcGFyYW0gZXh0cmFUYWdzIEV4dHJhIHRhZ3MgaWYgYW55LlxuICAgKi9cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIGNvdW50ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0NvdW50ZXI7XG5cbiAga2luZDogJ2NvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vKipcbiAqIEEgbWV0cmljIHRoYXQgc3VwcG9ydHMgcmVjb3JkaW5nIHZhbHVlcyBvbiBhIGhpc3RvZ3JhbS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljSGlzdG9ncmFtIGV4dGVuZHMgTWV0cmljIHtcbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIGhpc3RvZ3JhbS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHJlY29yZC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFZhbHVlIHdpbGwgYmUgY2FzdGVkIHRvIHRoZSBnaXZlblxuICAgKiAgICAgICAgICAgICAge0BsaW5rIHZhbHVlVHlwZX0uIExvc3Mgb2YgcHJlY2lzaW9uIG1heSBvY2N1ciBpZiB0aGUgdmFsdWUgaXMgbm90IGFscmVhZHkgb2YgdGhlXG4gICAqICAgICAgICAgICAgICBjb3JyZWN0IHR5cGUuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgaGlzdG9ncmFtLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW07XG5cbiAga2luZDogJ2hpc3RvZ3JhbSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBzZXR0aW5nIHZhbHVlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljR2F1Z2UgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBvbiB0aGUgZ2F1Z2UuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXQuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBzZXQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgZ2F1Z2UsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlO1xuXG4gIGtpbmQ6ICdnYXVnZSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgc2lnbmVkIHZhbHVlcyBhcyBhbiB1cC1kb3duIGNvdW50ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1VwRG93bkNvdW50ZXIgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgdXAtZG93biBjb3VudGVyLiBWYWx1ZSBtYXkgYmUgbmVnYXRpdmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQgKGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSkuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBhZGQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgdXAtZG93biBjb3VudGVyLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNVcERvd25Db3VudGVyO1xuXG4gIGtpbmQ6ICd1cC1kb3duLWNvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQSBtZXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqL1xuY2xhc3MgTm9vcE1ldHJpY01ldGVyIGltcGxlbWVudHMgTWV0cmljTWV0ZXIge1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2NvdW50ZXInLFxuICAgICAgdmFsdWVUeXBlOiAnaW50JyxcblxuICAgICAgYWRkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2hpc3RvZ3JhbScsXG4gICAgICB2YWx1ZVR5cGUsXG5cbiAgICAgIHJlY29yZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlR2F1Z2UoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljR2F1Z2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnZ2F1Z2UnLFxuICAgICAgdmFsdWVUeXBlLFxuXG4gICAgICBzZXQoX3ZhbHVlLCBfZXh0cmFUYWdzKSB7fSxcblxuICAgICAgd2l0aFRhZ3MoX2V4dHJhVGFncykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAndXAtZG93bi1jb3VudGVyJyxcbiAgICAgIHZhbHVlVHlwZTogJ2ludCcsXG5cbiAgICAgIGFkZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgd2l0aFRhZ3MoX2V4dHJhVGFnczogTWV0cmljVGFncyk6IE1ldHJpY01ldGVyIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgbm9vcE1ldHJpY01ldGVyID0gbmV3IE5vb3BNZXRyaWNNZXRlcigpO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3NPckZ1bmMgPSBNZXRyaWNUYWdzIHwgKCgpID0+IE1ldHJpY1RhZ3MpO1xuXG4vKipcbiAqIEEgbWV0ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhZGRzIHRhZ3MgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbWV0ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTWV0cmljTWV0ZXJ9IHRoYXQgYWRkcyB0YWdzIGJlZm9yZSBkZWxlZ2F0aW5nIGNhbGxzIHRvIGEgcGFyZW50IG1ldGVyLlxuICAgKlxuICAgKiBOZXcgdGFncyBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBzdGF0aWNhbGx5IGFzIGEgZGVsdGEgb2JqZWN0LCBvciBhcyBhIGZ1bmN0aW9uIGV2YWx1YXRlZFxuICAgKiBldmVyeSB0aW1lIGEgbWV0cmljIGlzIHJlY29yZGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIHRhZ3MgYXMgbG93IGFzIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0ZXIgVGhlIHBhcmVudCBtZXRlciB0byBkZWxlZ2F0ZSBjYWxscyB0by5cbiAgICogQHBhcmFtIHRhZ3NPckZ1bmMgTmV3IHRhZ3MgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgZXZlcnkgdGltZSBhIG1ldHJpYyBpcyByZWNvcmRlZCB0aGF0IHdpbGwgcmV0dXJuIGEgZGVsdGEgb2JqZWN0LlxuICAgKiBAcGFyYW0gZm9yY2UgaWYgYHRydWVgLCB0aGVuIGEgYE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFnc2Agd2lsbCBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlcmVcbiAgICogICAgICAgICAgICAgIGlzIG5vIHRhZ3MgdG8gYWRkLiBUaGlzIGlzIHVzZWZ1bCB0byBhZGQgdGFncyBzdXBwb3J0IHRvIGFuIHVuZGVybHlpbmcgbWV0ZXJcbiAgICogICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb21wb3NlKG1ldGVyOiBNZXRyaWNNZXRlciwgdGFnc09yRnVuYzogTWV0cmljVGFnc09yRnVuYywgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IE1ldHJpY01ldGVyIHtcbiAgICBpZiAobWV0ZXIgaW5zdGFuY2VvZiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MpIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4obWV0ZXIuY29udHJpYnV0b3JzLCB0YWdzT3JGdW5jKTtcbiAgICAgIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgcmVzdWx0cyBpbiBubyBhY3R1YWwgY2hhbmdlIHRvIHRoZSBjaGFpbiwgdGhlbiB3ZSBkb24ndCBuZWVkIGEgbmV3IG1ldGVyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQgJiYgIWZvcmNlKSByZXR1cm4gbWV0ZXI7XG4gICAgICByZXR1cm4gbmV3IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyhtZXRlci5wYXJlbnRNZXRlciwgY29udHJpYnV0b3JzID8/IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih1bmRlZmluZWQsIHRhZ3NPckZ1bmMpO1xuICAgICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIG1ldGVyO1xuICAgICAgcmV0dXJuIG5ldyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MobWV0ZXIsIGNvbnRyaWJ1dG9ycyA/PyBbXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1ldGVyOiBNZXRyaWNNZXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBwYXJlbnRDb3VudGVyID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVDb3VudGVyKG5hbWUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0NvdW50ZXJXaXRoQ29tcG9zZWRUYWdzKHBhcmVudENvdW50ZXIsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIGNvbnN0IHBhcmVudEhpc3RvZ3JhbSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlSGlzdG9ncmFtKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiBuZXcgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyhwYXJlbnRIaXN0b2dyYW0sIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBjb25zdCBwYXJlbnRHYXVnZSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlR2F1Z2UobmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNHYXVnZVdpdGhDb21wb3NlZFRhZ3MocGFyZW50R2F1Z2UsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBndWFyZCBvbmNlIHVwLWRvd24tY291bnRlciBzdXBwb3J0IGlzIGNvbXBsZXRlIG9uIGFsbCBNZXRyaWNNZXRlclxuICAgIC8vIGltcGxlbWVudGF0aW9ucyBhbmQgYGNyZWF0ZVVwRG93bkNvdW50ZXJgIGlzIG5vIGxvbmdlciBvcHRpb25hbCBvbiBNZXRyaWNNZXRlci5cbiAgICBpZiAoIXRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVVcERvd25Db3VudGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgbWV0ZXInKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q291bnRlciA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyhwYXJlbnRDb3VudGVyLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIHJldHVybiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MuY29tcG9zZSh0aGlzLCB0YWdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljQ291bnRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudENvdW50ZXI6IE1ldHJpY0NvdW50ZXIsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudENvdW50ZXIuYWRkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudENvdW50ZXIsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIubmFtZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci51bml0O1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRIaXN0b2dyYW06IE1ldHJpY0hpc3RvZ3JhbSxcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50SGlzdG9ncmFtLnJlY29yZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50SGlzdG9ncmFtLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0ubmFtZTtcbiAgfVxuXG4gIGdldCB2YWx1ZVR5cGUoKTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnZhbHVlVHlwZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0uZGVzY3JpcHRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRHYXVnZTogTWV0cmljR2F1Z2UsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudEdhdWdlLnNldCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0dhdWdlV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudEdhdWdlLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5uYW1lO1xuICB9XG5cbiAgZ2V0IHZhbHVlVHlwZSgpOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS52YWx1ZVR5cGU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5jbGFzcyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICd1cC1kb3duLWNvdW50ZXInO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlID0gJ2ludCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRDb3VudGVyOiBNZXRyaWNVcERvd25Db3VudGVyLFxuICAgIHByaXZhdGUgY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW11cbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRDb3VudGVyLmFkZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljVXBEb3duQ291bnRlciB7XG4gICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKTtcbiAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBuZXcgTWV0cmljVXBEb3duQ291bnRlcldpdGhDb21wb3NlZFRhZ3ModGhpcy5wYXJlbnRDb3VudGVyLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb3VudGVyLm5hbWU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIudW5pdDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIuZGVzY3JpcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZ3MoY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW10sIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiBNZXRyaWNUYWdzIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7fTtcbiAgZm9yIChjb25zdCBjb250cmlidXRvciBvZiBjb250cmlidXRvcnMpIHtcbiAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkLCB0eXBlb2YgY29udHJpYnV0b3IgPT09ICdmdW5jdGlvbicgPyBjb250cmlidXRvcigpIDogY29udHJpYnV0b3IpO1xuICB9XG4gIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIGV4dHJhVGFncyk7XG4gIHJldHVybiBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkKHJlc29sdmVkKTtcbn1cblxuLyoqXG4gKiBBcHBlbmQgYSB0YWdzIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBwb3NzaWJsZS5cbiAqXG4gKiBJZiBhcHBlbmRpbmcgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluIG9mIGNvbnRyaWJ1dG9ycywgcmV0dXJuXG4gKiBgZXhpc3RpbmdDb250cmlidXRvcnNgOyBpbiB0aGF0IGNhc2UsIHRoZSBjYWxsZXIgc2hvdWxkIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBpZiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9DaGFpbihcbiAgZXhpc3RpbmdDb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCxcbiAgbmV3Q29udHJpYnV0b3I6IE1ldHJpY1RhZ3NPckZ1bmNcbik6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCB7XG4gIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgYW4gZW1wdHkgb2JqZWN0LCB0aGVuIGl0IHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW5cbiAgaWYgKHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobmV3Q29udHJpYnV0b3IpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgfVxuXG4gIC8vIElmIGV4aXN0aW5nIGNoYWluIGlzIGVtcHR5LCB0aGVuIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgdGhlIGNoYWluXG4gIGlmIChleGlzdGluZ0NvbnRyaWJ1dG9ycyA9PSBudWxsIHx8IGV4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbbmV3Q29udHJpYnV0b3JdO1xuICB9XG5cbiAgLy8gSWYgYm90aCBsYXN0IGNvbnRyaWJ1dG9yIGFuZCBuZXcgY29udHJpYnV0b3IgYXJlIHBsYWluIG9iamVjdHMsIG1lcmdlIHRoZW0gdG8gYSBzaW5nbGUgb2JqZWN0LlxuICBjb25zdCBsYXN0ID0gZXhpc3RpbmdDb250cmlidXRvcnNbZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoIC0gMV07XG4gIGlmICh0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlT2JqZWN0cyhsYXN0LCBuZXdDb250cmlidXRvcik7XG4gICAgaWYgKG1lcmdlZCA9PT0gbGFzdCkgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICAgIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMuc2xpY2UoMCwgLTEpLCBtZXJnZWQhXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogUHJpb3JpdHkgY29udGFpbnMgbWV0YWRhdGEgdGhhdCBjb250cm9scyByZWxhdGl2ZSBvcmRlcmluZyBvZiB0YXNrIHByb2Nlc3Npbmcgd2hlbiB0YXNrcyBhcmVcbiAqIGJhY2tsb2dnZWQgaW4gYSBxdWV1ZS4gSW5pdGlhbGx5LCBQcmlvcml0eSB3aWxsIGJlIHVzZWQgaW4gYWN0aXZpdHkgYW5kIHdvcmtmbG93IHRhc2sgcXVldWVzLFxuICogd2hpY2ggYXJlIHR5cGljYWxseSB3aGVyZSBiYWNrbG9ncyBleGlzdC5cbiAqIFByaW9yaXR5IGlzIChmb3Igbm93KSBhdHRhY2hlZCB0byB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuIEFjdGl2aXRpZXMgYW5kIGNoaWxkIHdvcmtmbG93c1xuICogaW5oZXJpdCBQcmlvcml0eSBmcm9tIHRoZSB3b3JrZmxvdyB0aGF0IGNyZWF0ZWQgdGhlbSwgYnV0IG1heSBvdmVycmlkZSBmaWVsZHMgd2hlbiB0aGV5IGFyZVxuICogc3RhcnRlZCBvciBtb2RpZmllZC4gRm9yIGVhY2ggZmllbGQgb2YgYSBQcmlvcml0eSBvbiBhbiBhY3Rpdml0eS93b3JrZmxvdywgbm90IHByZXNlbnQgb3IgZXF1YWxcbiAqIHRvIHplcm8vZW1wdHkgc3RyaW5nIG1lYW5zIHRvIGluaGVyaXQgdGhlIHZhbHVlIGZyb20gdGhlIGNhbGxpbmcgd29ya2Zsb3csIG9yIGlmIHRoZXJlIGlzIG5vXG4gKiBjYWxsaW5nIHdvcmtmbG93LCB0aGVuIHVzZSB0aGUgZGVmYXVsdCAoZG9jdW1lbnRlZCBvbiB0aGUgZmllbGQpLlxuICogVGhlIG92ZXJhbGwgc2VtYW50aWNzIG9mIFByaW9yaXR5IGFyZTpcbiAqIDEuIEZpcnN0LCBjb25zaWRlciBcInByaW9yaXR5X2tleVwiOiBsb3dlciBudW1iZXIgZ29lcyBmaXJzdC5cbiAqIDIuIFRoZW4sIGNvbnNpZGVyIGZhaXJuZXNzOiB0aGUgZmFpcm5lc3MgbWVjaGFuaXNtIGF0dGVtcHRzIHRvIGRpc3BhdGNoIHRhc2tzIGZvciBhIGdpdmVuIGtleSBpblxuICogICAgcHJvcG9ydGlvbiB0byBpdHMgd2VpZ2h0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW9yaXR5IHtcbiAgLyoqXG4gICAqIFByaW9yaXR5IGtleSBpcyBhIHBvc2l0aXZlIGludGVnZXIgZnJvbSAxIHRvIG4sIHdoZXJlIHNtYWxsZXIgaW50ZWdlcnNcbiAgICogY29ycmVzcG9uZCB0byBoaWdoZXIgcHJpb3JpdGllcyAodGFza3MgcnVuIHNvb25lcikuIEluIGdlbmVyYWwsIHRhc2tzIGluXG4gICAqIGEgcXVldWUgc2hvdWxkIGJlIHByb2Nlc3NlZCBpbiBjbG9zZSB0byBwcmlvcml0eSBvcmRlciwgYWx0aG91Z2ggc21hbGxcbiAgICogZGV2aWF0aW9ucyBhcmUgcG9zc2libGUuXG4gICAqXG4gICAqIFRoZSBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIChtaW5pbXVtIHByaW9yaXR5KSBpcyBkZXRlcm1pbmVkIGJ5IHNlcnZlciBjb25maWd1cmF0aW9uLCBhbmRcbiAgICogZGVmYXVsdHMgdG8gNS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgKG1pbittYXgpLzIuIFdpdGggdGhlIGRlZmF1bHQgbWF4IG9mIDUgYW5kIG1pbiBvZiAxLCB0aGF0IGNvbWVzIG91dCB0byAzLlxuICAgKi9cbiAgcHJpb3JpdHlLZXk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZhaXJuZXNzS2V5IGlzIGEgc2hvcnQgc3RyaW5nIHRoYXQncyB1c2VkIGFzIGEga2V5IGZvciBhIGZhaXJuZXNzXG4gICAqIGJhbGFuY2luZyBtZWNoYW5pc20uIEl0IG1heSBjb3JyZXNwb25kIHRvIGEgdGVuYW50IGlkLCBvciB0byBhIGZpeGVkXG4gICAqIHN0cmluZyBsaWtlIFwiaGlnaFwiIG9yIFwibG93XCIuIFRoZSBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBmYWlybmVzcyBtZWNoYW5pc20gYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGFza3MgZm9yIGEgZ2l2ZW4ga2V5IGluXG4gICAqIHByb3BvcnRpb24gdG8gaXRzIHdlaWdodC4gRm9yIGV4YW1wbGUsIHVzaW5nIGEgdGhvdXNhbmQgZGlzdGluY3QgdGVuYW50XG4gICAqIGlkcywgZWFjaCB3aXRoIGEgd2VpZ2h0IG9mIDEuMCAodGhlIGRlZmF1bHQpIHdpbGwgcmVzdWx0IGluIGVhY2ggdGVuYW50XG4gICAqIGdldHRpbmcgYSByb3VnaGx5IGVxdWFsIHNoYXJlIG9mIHRhc2sgZGlzcGF0Y2ggdGhyb3VnaHB1dC5cbiAgICpcbiAgICogRmFpcm5lc3Mga2V5cyBhcmUgbGltaXRlZCB0byA2NCBieXRlcy5cbiAgICovXG4gIGZhaXJuZXNzS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlybmVzc1dlaWdodCBmb3IgYSB0YXNrIGNhbiBjb21lIGZyb20gbXVsdGlwbGUgc291cmNlcyBmb3JcbiAgICogZmxleGliaWxpdHkuIEZyb20gaGlnaGVzdCB0byBsb3dlc3QgcHJlY2VkZW5jZTpcbiAgICogMS4gV2VpZ2h0cyBmb3IgYSBzbWFsbCBzZXQgb2Yga2V5cyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0YXNrIHF1ZXVlXG4gICAqICAgIGNvbmZpZ3VyYXRpb24gd2l0aCBhbiBBUEkuXG4gICAqIDIuIEl0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgd29ya2Zsb3cvYWN0aXZpdHkgaW4gdGhpcyBmaWVsZC5cbiAgICogMy4gVGhlIGRlZmF1bHQgd2VpZ2h0IG9mIDEuMCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFdlaWdodCB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gdGhlIHJhbmdlIFswLjAwMSwgMTAwMF0uXG4gICAqL1xuICBmYWlybmVzc1dlaWdodD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUdXJuIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eSBpbnRvIGEgVFMgUHJpb3JpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVByaW9yaXR5KHByaW9yaXR5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUHJpb3JpdHkgfCBudWxsKTogUHJpb3JpdHkge1xuICByZXR1cm4ge1xuICAgIHByaW9yaXR5S2V5OiBwcmlvcml0eT8ucHJpb3JpdHlLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzS2V5OiBwcmlvcml0eT8uZmFpcm5lc3NLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzV2VpZ2h0OiBwcmlvcml0eT8uZmFpcm5lc3NXZWlnaHQgPz8gdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBQcmlvcml0eSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByaW9yaXR5KHByaW9yaXR5OiBQcmlvcml0eSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVByaW9yaXR5IHtcbiAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5ICE9PSB1bmRlZmluZWQgJiYgcHJpb3JpdHkucHJpb3JpdHlLZXkgIT09IG51bGwpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocHJpb3JpdHkucHJpb3JpdHlLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmlvcml0eUtleSBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ByaW9yaXR5S2V5IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcmlvcml0eUtleTogcHJpb3JpdHkucHJpb3JpdHlLZXkgPz8gMCxcbiAgICBmYWlybmVzc0tleTogcHJpb3JpdHkuZmFpcm5lc3NLZXkgPz8gJycsXG4gICAgZmFpcm5lc3NXZWlnaHQ6IHByaW9yaXR5LmZhaXJuZXNzV2VpZ2h0ID8/IDAsXG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYID0gJ19fdGVtcG9yYWxfJztcbmV4cG9ydCBjb25zdCBTVEFDS19UUkFDRV9RVUVSWV9OQU1FID0gJ19fc3RhY2tfdHJhY2UnO1xuZXhwb3J0IGNvbnN0IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUgPSAnX19lbmhhbmNlZF9zdGFja190cmFjZSc7XG5cbi8qKlxuICogVmFsaWQgZW50aXR5IHR5cGVzIHRoYXQgY2FuIGJlIGNoZWNrZWQgZm9yIHJlc2VydmVkIG5hbWUgdmlvbGF0aW9uc1xuICovXG5leHBvcnQgdHlwZSBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlID0gJ3F1ZXJ5JyB8ICdzaWduYWwnIHwgJ3VwZGF0ZScgfCAnYWN0aXZpdHknIHwgJ3Rhc2sgcXVldWUnIHwgJ3NpbmsnIHwgJ3dvcmtmbG93JztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgaWYgdGhlIHByb3ZpZGVkIG5hbWUgY29udGFpbnMgYW55IHJlc2VydmVkIHByZWZpeGVzIG9yIG1hdGNoZXMgYW55IHJlc2VydmVkIG5hbWVzLlxuICogVGhyb3dzIGEgVHlwZUVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHMsIHdpdGggYSBzcGVjaWZpYyBtZXNzYWdlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaXNzdWVcbiAqIGlzIHdpdGggYSByZXNlcnZlZCBwcmVmaXggb3IgYW4gZXhhY3QgbWF0Y2ggdG8gYSByZXNlcnZlZCBuYW1lLlxuICpcbiAqIEBwYXJhbSB0eXBlIFRoZSBlbnRpdHkgdHlwZSBiZWluZyBjaGVja2VkXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBjaGVjayBhZ2FpbnN0IHJlc2VydmVkIHByZWZpeGVzL25hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmUmVzZXJ2ZWROYW1lKHR5cGU6IFJlc2VydmVkTmFtZUVudGl0eVR5cGUsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAobmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlICR7dHlwZX0gbmFtZTogJyR7bmFtZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgfVxuXG4gIGlmIChuYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8IG5hbWUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlICR7dHlwZX0gbmFtZTogJyR7bmFtZX0nLCB3aGljaCBpcyBhIHJlc2VydmVkIG5hbWVgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb051bWJlciwgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9Ucywgb3B0aW9uYWxUc1RvTXMgfSBmcm9tICcuL3RpbWUnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJldHJ5aW5nIFdvcmtmbG93cyBhbmQgQWN0aXZpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIENvZWZmaWNpZW50IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuZXh0IHJldHJ5IGludGVydmFsLlxuICAgKiBUaGUgbmV4dCByZXRyeSBpbnRlcnZhbCBpcyBwcmV2aW91cyBpbnRlcnZhbCBtdWx0aXBsaWVkIGJ5IHRoaXMgY29lZmZpY2llbnQuXG4gICAqIEBtaW5pbXVtIDFcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgYmFja29mZkNvZWZmaWNpZW50PzogbnVtYmVyO1xuICAvKipcbiAgICogSW50ZXJ2YWwgb2YgdGhlIGZpcnN0IHJldHJ5LlxuICAgKiBJZiBjb2VmZmljaWVudCBpcyAxIHRoZW4gaXQgaXMgdXNlZCBmb3IgYWxsIHJldHJpZXNcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqIEBkZWZhdWx0IDEgc2Vjb25kXG4gICAqL1xuICBpbml0aWFsSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzLiBXaGVuIGV4Y2VlZGVkLCByZXRyaWVzIHN0b3AgKGV2ZW4gaWYge0BsaW5rIEFjdGl2aXR5T3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fVxuICAgKiBoYXNuJ3QgYmVlbiByZWFjaGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgSW5maW5pdHlcbiAgICovXG4gIG1heGltdW1BdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gaW50ZXJ2YWwgYmV0d2VlbiByZXRyaWVzLlxuICAgKiBFeHBvbmVudGlhbCBiYWNrb2ZmIGxlYWRzIHRvIGludGVydmFsIGluY3JlYXNlLlxuICAgKiBUaGlzIHZhbHVlIGlzIHRoZSBjYXAgb2YgdGhlIGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDB4IG9mIHtAbGluayBpbml0aWFsSW50ZXJ2YWx9XG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgbWF4aW11bUludGVydmFsPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXBwbGljYXRpb24gZmFpbHVyZXMgdHlwZXMgdG8gbm90IHJldHJ5LlxuICAgKi9cbiAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBSZXRyeVBvbGljeSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVJldHJ5UG9saWN5KHJldHJ5UG9saWN5OiBSZXRyeVBvbGljeSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVJldHJ5UG9saWN5IHtcbiAgaWYgKHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCAhPSBudWxsICYmIHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gIH1cbiAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyAhPSBudWxsKSB7XG4gICAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICAvLyBkcm9wIGZpZWxkIChJbmZpbml0eSBpcyB0aGUgZGVmYXVsdClcbiAgICAgIGNvbnN0IHsgbWF4aW11bUF0dGVtcHRzOiBfLCAuLi53aXRob3V0IH0gPSByZXRyeVBvbGljeTtcbiAgICAgIHJldHJ5UG9saWN5ID0gd2l0aG91dDtcbiAgICB9IGVsc2UgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfSBlbHNlIGlmICghTnVtYmVyLmlzSW50ZWdlcihyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYXhpbXVtSW50ZXJ2YWwgPSBtc09wdGlvbmFsVG9OdW1iZXIocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKTtcbiAgY29uc3QgaW5pdGlhbEludGVydmFsID0gbXNUb051bWJlcihyZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgPz8gMTAwMCk7XG4gIGlmIChtYXhpbXVtSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKGluaXRpYWxJbnRlcnZhbCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgY2Fubm90IGJlIDAnKTtcbiAgfVxuICBpZiAobWF4aW11bUludGVydmFsICE9IG51bGwgJiYgbWF4aW11bUludGVydmFsIDwgaW5pdGlhbEludGVydmFsKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgbGVzcyB0aGFuIGl0cyBpbml0aWFsSW50ZXJ2YWwnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1heGltdW1BdHRlbXB0czogcmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzLFxuICAgIGluaXRpYWxJbnRlcnZhbDogbXNUb1RzKGluaXRpYWxJbnRlcnZhbCksXG4gICAgbWF4aW11bUludGVydmFsOiBtc09wdGlvbmFsVG9UcyhtYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50LFxuICAgIG5vblJldHJ5YWJsZUVycm9yVHlwZXM6IHJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXMsXG4gIH07XG59XG5cbi8qKlxuICogVHVybiBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3kgaW50byBhIFRTIFJldHJ5UG9saWN5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvbXBpbGVSZXRyeVBvbGljeShcbiAgcmV0cnlQb2xpY3k/OiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB8IG51bGxcbik6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZXRyeVBvbGljeSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50ID8/IHVuZGVmaW5lZCxcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUludGVydmFsOiBvcHRpb25hbFRzVG9NcyhyZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGluaXRpYWxJbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsKSxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzID8/IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKiogQGRlcHJlY2F0ZWQ6IFVzZSB7QGxpbmsgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVWYWx1ZU9yUmVhZG9ubHkgPSBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSB8IFJlYWRvbmx5PFNlYXJjaEF0dHJpYnV0ZVZhbHVlPiB8IHVuZGVmaW5lZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuLyoqIEBkZXByZWNhdGVkOiBVc2Uge0BsaW5rIFR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZCAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlcyA9IFJlY29yZDxzdHJpbmcsIFNlYXJjaEF0dHJpYnV0ZVZhbHVlT3JSZWFkb25seT47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbi8qKiBAZGVwcmVjYXRlZDogVXNlIHtAbGluayBUeXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQgKi9cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVZhbHVlID0gc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXSB8IERhdGVbXTtcblxuZXhwb3J0IGNvbnN0IFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSB7XG4gIFRFWFQ6ICdURVhUJyxcbiAgS0VZV09SRDogJ0tFWVdPUkQnLFxuICBJTlQ6ICdJTlQnLFxuICBET1VCTEU6ICdET1VCTEUnLFxuICBCT09MOiAnQk9PTCcsXG4gIERBVEVUSU1FOiAnREFURVRJTUUnLFxuICBLRVlXT1JEX0xJU1Q6ICdLRVlXT1JEX0xJU1QnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSAodHlwZW9mIFNlYXJjaEF0dHJpYnV0ZVR5cGUpW2tleW9mIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuLy8gTm90ZTogZW5jb2RlU2VhcmNoQXR0cmlidXRlSW5kZXhlZFZhbHVlVHlwZSBleHBvcnRlZCBmb3IgdXNlIGluIHRlc3RzIHRvIHJlZ2lzdGVyIHNlYXJjaCBhdHRyaWJ1dGVzXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVTZWFyY2hBdHRyaWJ1dGVJbmRleGVkVmFsdWVUeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuSW5kZXhlZFZhbHVlVHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5JbmRleGVkVmFsdWVUeXBlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkluZGV4ZWRWYWx1ZVR5cGUsXG4gIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICAnSU5ERVhFRF9WQUxVRV9UWVBFXydcbj4oXG4gIHtcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUXTogMSxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEXTogMixcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5JTlRdOiAzLFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRV06IDQsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTF06IDUsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUVdOiA2LFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdJTkRFWEVEX1ZBTFVFX1RZUEVfJ1xuKTtcblxuaW50ZXJmYWNlIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nIHtcbiAgVEVYVDogc3RyaW5nO1xuICBLRVlXT1JEOiBzdHJpbmc7XG4gIElOVDogbnVtYmVyO1xuICBET1VCTEU6IG51bWJlcjtcbiAgQk9PTDogYm9vbGVhbjtcbiAgREFURVRJTUU6IERhdGU7XG4gIEtFWVdPUkRfTElTVDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVmFsdWVGb3JUeXBlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPihcbiAgdHlwZTogVCxcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUU6XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaEF0dHJpYnV0ZUtleTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTZWFyY2hBdHRyaWJ1dGVLZXk8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KG5hbWU6IHN0cmluZywgdHlwZTogVCk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPiB7XG4gIHJldHVybiB7IG5hbWUsIHR5cGUgfTtcbn1cblxuY2xhc3MgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlLCBWID0gSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZTogVDtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFY7XG5cbiAgY29uc3RydWN0b3IodHlwZTogVCwgdmFsdWU6IFYpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogViB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG59XG5cbi8vIEludGVybmFsIHR5cGUgZm9yIGNsYXNzIHByaXZhdGUgZGF0YS5cbi8vIEV4cG9ydGVkIGZvciB1c2UgaW4gcGF5bG9hZCBjb252ZXJzaW9uLlxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQ+IHt9XG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFxuICBULFxuICBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGxcbj4ge31cblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB9O1xufVtTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGwgfTtcbn1bU2VhcmNoQXR0cmlidXRlVHlwZV07XG5cbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICBwcml2YXRlIHNlYXJjaEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+ID0ge307XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10pIHtcbiAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcGFpciBvZiBpbml0aWFsQXR0cmlidXRlcykge1xuICAgICAgaWYgKHBhaXIua2V5Lm5hbWUgaW4gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHNlYXJjaCBhdHRyaWJ1dGUga2V5OiAke3BhaXIua2V5Lm5hbWV9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQ8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KGtleTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+KTogSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNba2V5Lm5hbWVdO1xuICAgIC8vIEtleSBub3QgZm91bmQgb3IgdHlwZSBtaXNtYXRjaC5cbiAgICBpZiAoYXR0ciA9PT0gdW5kZWZpbmVkIHx8ICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGtleS50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHIudmFsdWU7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIGluc3RhbmNlICovXG4gIGNvcHkoKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgICBjb25zdCBzdGF0ZTogUmVjb3JkPHN0cmluZywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxTZWFyY2hBdHRyaWJ1dGVUeXBlPj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgbGV0IHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgIC8vIEZvciBub24tcHJpbWl0aXZlIHR5cGVzLCBjcmVhdGUgYSBkZWVwIGNvcHlcbiAgICAgIGlmIChhdHRyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKGF0dHIudmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGF0dHIudmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gWy4uLmF0dHIudmFsdWVdO1xuICAgICAgfVxuICAgICAgc3RhdGVba2V5XSA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKGF0dHIudHlwZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSByZXR1cm4gdmFsdWUgd2l0aCBtYW51YWxseSBhc3NpZ25lZCBzdGF0ZS5cbiAgICBjb25zdCByZXMgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKCk7XG4gICAgcmVzLnNlYXJjaEF0dHJpYnV0ZXMgPSBzdGF0ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBoaWRkZW5cbiAgICogUmV0dXJuIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzcyBhcyBTZWFyY2hBdHRyaWJ1dGVQYWlyW11cbiAgICogRGVmYXVsdCB0b0pTT04gbWV0aG9kIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQncyBKU09OIHJlcHJlc2VudGF0aW9uIGluY2x1ZGVzIHByaXZhdGUgc3RhdGUuXG4gICAqL1xuICB0b0pTT04oKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgaW5zdGFuY2Ugd2l0aCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGVzLiAqL1xuICB1cGRhdGVDb3B5KHVwZGF0ZXM6IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IFR5cGVkU2VhcmNoQXR0cmlidXRlcyB7XG4gICAgLy8gQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgIGNvbnN0IHJlcyA9IHRoaXMuY29weSgpO1xuICAgIC8vIEFwcGx5IHVwZGF0ZXMuXG4gICAgcmVzLnVwZGF0ZSh1cGRhdGVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gUGVyZm9ybXMgZGlyZWN0IG11dGF0aW9uIG9uIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICBwcml2YXRlIHVwZGF0ZSh1cGRhdGVzOiBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pIHtcbiAgICAvLyBBcHBseSB1cGRhdGVzLlxuICAgIGZvciAoY29uc3QgcGFpciBvZiB1cGRhdGVzKSB7XG4gICAgICAvLyBEZWxldGUgYXR0cmlidXRlLlxuICAgICAgaWYgKHBhaXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRGVsZXRlIG9ubHkgaWYgdGhlIHVwZGF0ZSBtYXRjaGVzIGEga2V5IGFuZCB0eXBlLlxuICAgICAgICBjb25zdCBhdHRyVmFsID0gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICBpZiAoYXR0clZhbCAmJiBhdHRyVmFsLnR5cGUgPT09IHBhaXIua2V5LnR5cGUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQWRkIG9yIHVwZGF0ZSBhdHRyaWJ1dGUuXG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGwoKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICBjb25zdCByZXM6IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cktleSA9IHsgbmFtZToga2V5LCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIFNhbml0eSBjaGVjaywgc2hvdWxkIGFsd2F5cyBiZSBsZWdhbC5cbiAgICAgIGlmIChpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHJLZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgcmVzLnB1c2goeyBrZXk6IGF0dHJLZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0S2V5RnJvbVVudHlwZWQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFNlYXJjaEF0dHJpYnV0ZVZhbHVlT3JSZWFkb25seSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICk6IFNlYXJjaEF0dHJpYnV0ZUtleTxTZWFyY2hBdHRyaWJ1dGVUeXBlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVbnBhY2sgc2luZ2xlLWVsZW1lbnQgYXJyYXlzLlxuICAgIGNvbnN0IHZhbCA9IHZhbHVlLmxlbmd0aCA9PT0gMSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAvLyBDaGVjayBpZiB2YWwgaXMgYW4gSVNPIHN0cmluZywgaWYgc28sIHJldHVybiBhIERBVEVUSU1FIGtleS5cbiAgICAgICAgaWYgKCFpc05hTihEYXRlLnBhcnNlKHZhbCkpICYmIERhdGUucGFyc2UodmFsKSA9PT0gbmV3IERhdGUodmFsKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuVEVYVCB9O1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgdHlwZTogTnVtYmVyLmlzSW50ZWdlcih2YWwpID8gU2VhcmNoQXR0cmlidXRlVHlwZS5JTlQgOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTCB9O1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgIHJldHVybiB7IG5hbWU6IGtleSwgdHlwZTogU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1QgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHRvTWV0YWRhdGFUeXBlKHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgICAgIHJldHVybiAnVGV4dCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRDpcbiAgICAgICAgcmV0dXJuICdLZXl3b3JkJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5JTlQ6XG4gICAgICAgIHJldHVybiAnSW50JztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICAgIHJldHVybiAnRG91YmxlJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5CT09MOlxuICAgICAgICByZXR1cm4gJ0Jvb2wnO1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FOlxuICAgICAgICByZXR1cm4gJ0RhdGV0aW1lJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICAgIHJldHVybiAnS2V5d29yZExpc3QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNlYXJjaCBhdHRyaWJ1dGUgdHlwZTogJHt0eXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b1NlYXJjaEF0dHJpYnV0ZVR5cGUodHlwZTogc3RyaW5nKTogU2VhcmNoQXR0cmlidXRlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhlIHR5cGUgbWV0YWRhdGEgaXMgdXN1YWxseSBpbiBQYXNjYWxDYXNlIChlLmcuIFwiS2V5d29yZExpc3RcIikgYnV0IGluXG4gICAgLy8gcmFyZSBjYXNlcyBtYXkgYmUgaW4gU0NSRUFNSU5HX1NOQUtFX0NBU0UgKGUuZy4gXCJJTkRFWEVEX1ZBTFVFX1RZUEVfS0VZV09SRF9MSVNUXCIpLlxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnVGV4dCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfVEVYVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ7XG4gICAgICBjYXNlICdLZXl3b3JkJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9LRVlXT1JEJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRDtcbiAgICAgIGNhc2UgJ0ludCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfSU5UJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UO1xuICAgICAgY2FzZSAnRG91YmxlJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9ET1VCTEUnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU7XG4gICAgICBjYXNlICdCb29sJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9CT09MJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDtcbiAgICAgIGNhc2UgJ0RhdGV0aW1lJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9EQVRFVElNRSc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FO1xuICAgICAgY2FzZSAnS2V5d29yZExpc3QnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX0tFWVdPUkRfTElTVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBMb25nIGZyb20gJ2xvbmcnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgdHlwZSB7IGdvb2dsZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIE5PVEU6IHRoZXNlIGFyZSB0aGUgc2FtZSBpbnRlcmZhY2UgaW4gSlNcbi8vIGdvb2dsZS5wcm90b2J1Zi5JRHVyYXRpb247XG4vLyBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcbi8vIFRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBiZWxvdyBzaG91bGQgd29yayBmb3IgYm90aFxuXG5leHBvcnQgdHlwZSBUaW1lc3RhbXAgPSBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcblxuLyoqXG4gKiBBIGR1cmF0aW9uLCBleHByZXNzZWQgZWl0aGVyIGFzIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgb3IgYXMgYSB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqL1xuZXhwb3J0IHR5cGUgRHVyYXRpb24gPSBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvdy5cbiAqIElmIHRzIGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aHJvd3MgYSBUeXBlRXJyb3IsIHdpdGggZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAke2ZpZWxkTmFtZX0gdG8gYmUgYSB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRpbWVzdGFtcCwgZ290ICR7dHN9YCk7XG4gIH1cbiAgY29uc3QgeyBzZWNvbmRzLCBuYW5vcyB9ID0gdHM7XG4gIHJldHVybiAoc2Vjb25kcyB8fCBMb25nLlVaRVJPKVxuICAgIC5tdWwoMTAwMClcbiAgICAuYWRkKE1hdGguZmxvb3IoKG5hbm9zIHx8IDApIC8gMTAwMDAwMCkpXG4gICAgLnRvTnVtYmVyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTtcbiAgY29uc3QgbmFub3MgPSAobWlsbGlzICUgMTAwMCkgKiAxMDAwMDAwO1xuICBpZiAoTnVtYmVyLmlzTmFOKHNlY29uZHMpIHx8IE51bWJlci5pc05hTihuYW5vcykpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBtaWxsaXMgJHttaWxsaXN9YCk7XG4gIH1cbiAgcmV0dXJuIHsgc2Vjb25kczogTG9uZy5mcm9tTnVtYmVyKHNlY29uZHMpLCBuYW5vcyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gbXNOdW1iZXJUb1RzKG1zVG9OdW1iZXIoc3RyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9UcyhzdHI6IER1cmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHIgPyBtc1RvVHMoc3RyKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbXNUb051bWJlcih2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb051bWJlcih2YWw6IER1cmF0aW9uKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICByZXR1cm4gbXNXaXRoVmFsaWRhdGlvbih2YWwpO1xufVxuXG5mdW5jdGlvbiBtc1dpdGhWYWxpZGF0aW9uKHN0cjogU3RyaW5nVmFsdWUpOiBudW1iZXIge1xuICBjb25zdCBtaWxsaXMgPSBtcyhzdHIpO1xuICBpZiAobWlsbGlzID09IG51bGwgfHwgaXNOYU4obWlsbGlzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZHVyYXRpb24gc3RyaW5nOiAnJHtzdHJ9J2ApO1xuICB9XG4gIHJldHVybiBtaWxsaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0c1RvRGF0ZSh0czogVGltZXN0YW1wKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUocmVxdWlyZWRUc1RvTXModHMsIGZpZWxkTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAodHMgPT09IHVuZGVmaW5lZCB8fCB0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKHRzVG9Ncyh0cykpO1xufVxuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dCAoaW1wb3J0ZWQgdmlhIHNjaGVkdWxlLWhlbHBlcnMudHMpXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxEYXRlVG9UcyhkYXRlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1zVG9UcyhkYXRlLmdldFRpbWUoKSk7XG59XG4iLCJleHBvcnQgdHlwZSBOb25OdWxsYWJsZU9iamVjdDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0tPzogTm9uTnVsbGFibGU8VFtQXT4gfTtcblxuLyoqIFNob3J0aGFuZCBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgQW55RnVuYyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4vKiogQSB0dXBsZSB3aXRob3V0IGl0cyBsYXN0IGVsZW1lbnQgKi9cbmV4cG9ydCB0eXBlIE9taXRMYXN0PFQ+ID0gVCBleHRlbmRzIFsuLi5pbmZlciBSRVNULCBhbnldID8gUkVTVCA6IG5ldmVyO1xuXG4vKiogRiB3aXRoIGFsbCBhcmd1bWVudHMgYnV0IHRoZSBsYXN0ICovXG5leHBvcnQgdHlwZSBPbWl0TGFzdFBhcmFtPEYgZXh0ZW5kcyBBbnlGdW5jPiA9ICguLi5hcmdzOiBPbWl0TGFzdDxQYXJhbWV0ZXJzPEY+PikgPT4gUmV0dXJuVHlwZTxGPjtcblxuZXhwb3J0IHR5cGUgT21pdEZpcnN0PFQ+ID0gVCBleHRlbmRzIFthbnksIC4uLmluZmVyIFJFU1RdID8gUkVTVCA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBPbWl0Rmlyc3RQYXJhbTxUPiA9IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueVxuICA/ICguLi5hcmdzOiBPbWl0Rmlyc3Q8UGFyYW1ldGVyczxUPj4pID0+IFJldHVyblR5cGU8VD5cbiAgOiBuZXZlcjtcblxuLyoqIFJlcXVpcmUgdGhhdCBUIGhhcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZGVmaW5lZCAqL1xuZXhwb3J0IHR5cGUgUmVxdWlyZUF0TGVhc3RPbmU8VCwgS2V5cyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IFBpY2s8VCwgRXhjbHVkZTxrZXlvZiBULCBLZXlzPj4gJlxuICB7XG4gICAgW0sgaW4gS2V5c10tPzogUmVxdWlyZWQ8UGljazxULCBLPj4gJiBQYXJ0aWFsPFBpY2s8VCwgRXhjbHVkZTxLZXlzLCBLPj4+O1xuICB9W0tleXNdO1xuXG4vKiogVmVyaWZ5IHRoYXQgYW4gdHlwZSBfQ29weSBleHRlbmRzIF9PcmlnICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFeHRlbmRzPF9PcmlnLCBfQ29weSBleHRlbmRzIF9PcmlnPigpOiB2b2lkIHtcbiAgLy8gbm9vcCwganVzdCB0eXBlIGNoZWNrXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxhY2U8QmFzZSwgTmV3PiA9IE9taXQ8QmFzZSwga2V5b2YgTmV3PiAmIE5ldztcblxuLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3VuaW9uLXRvLWludGVyc2VjdGlvbi5kLnRzXG4vLyBNSVQgb3IgQ0MwLTEuMCDigJQgSXQgaXMgbWVhbnQgdG8gYmUgY29waWVkIGludG8geW91ciBjb2RlYmFzZSByYXRoZXIgdGhhbiBiZWluZyB1c2VkIGFzIGEgZGVwZW5kZW5jeS5cbmV4cG9ydCB0eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VW5pb24+ID1cbiAgLy8gYGV4dGVuZHMgdW5rbm93bmAgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRoZSBjYXNlIGFuZCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGBVbmlvbmAgaW50byBhXG4gIC8vIFtkaXN0cmlidXRpdmUgY29uZGl0aW9uYWwgdHlwZV0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svcmVsZWFzZS1ub3Rlcy90eXBlc2NyaXB0LTItOC5odG1sI2Rpc3RyaWJ1dGl2ZS1jb25kaXRpb25hbC10eXBlcykuXG4gIChcbiAgICBVbmlvbiBleHRlbmRzIHVua25vd25cbiAgICAgID8gLy8gVGhlIHVuaW9uIHR5cGUgaXMgdXNlZCBhcyB0aGUgb25seSBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIHNpbmNlIHRoZSB1bmlvblxuICAgICAgICAvLyBvZiBmdW5jdGlvbiBhcmd1bWVudHMgaXMgYW4gaW50ZXJzZWN0aW9uLlxuICAgICAgICAoZGlzdHJpYnV0ZWRVbmlvbjogVW5pb24pID0+IHZvaWRcbiAgICAgIDogLy8gVGhpcyB3b24ndCBoYXBwZW4uXG4gICAgICAgIG5ldmVyXG4gICkgZXh0ZW5kcyAvLyBJbmZlciB0aGUgYEludGVyc2VjdGlvbmAgdHlwZSBzaW5jZSBUeXBlU2NyaXB0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWxcbiAgLy8gYXJndW1lbnRzIG9mIHVuaW9ucyBvZiBmdW5jdGlvbnMgYXMgYW4gaW50ZXJzZWN0aW9uIG9mIHRoZSB1bmlvbi5cbiAgKG1lcmdlZEludGVyc2VjdGlvbjogaW5mZXIgSW50ZXJzZWN0aW9uKSA9PiB2b2lkXG4gICAgPyAvLyBUaGUgYCYgVW5pb25gIGlzIHRvIGFsbG93IGluZGV4aW5nIGJ5IHRoZSByZXN1bHRpbmcgdHlwZVxuICAgICAgSW50ZXJzZWN0aW9uICYgVW5pb25cbiAgICA6IG5ldmVyO1xuXG50eXBlIElzRXF1YWw8QSwgQj4gPSAoPEc+KCkgPT4gRyBleHRlbmRzIEEgPyAxIDogMikgZXh0ZW5kcyA8Rz4oKSA9PiBHIGV4dGVuZHMgQiA/IDEgOiAyID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFByaW1pdGl2ZSA9IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3ltYm9sIHwgYmlnaW50O1xuXG50eXBlIElzTnVsbDxUPiA9IFtUXSBleHRlbmRzIFtudWxsXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Vua25vd248VD4gPSB1bmtub3duIGV4dGVuZHMgVCAvLyBgVGAgY2FuIGJlIGB1bmtub3duYCBvciBgYW55YFxuICA/IElzTnVsbDxUPiBleHRlbmRzIGZhbHNlIC8vIGBhbnlgIGNhbiBiZSBgbnVsbGAsIGJ1dCBgdW5rbm93bmAgY2FuJ3QgYmVcbiAgICA/IHRydWVcbiAgICA6IGZhbHNlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0VmFsdWU8VCwgSz4gPSBLIGV4dGVuZHMga2V5b2YgVFxuICA/IFRbS11cbiAgOiBUb1N0cmluZzxLPiBleHRlbmRzIGtleW9mIFRcbiAgICA/IFRbVG9TdHJpbmc8Sz5dXG4gICAgOiBLIGV4dGVuZHMgYCR7aW5mZXIgTnVtYmVySyBleHRlbmRzIG51bWJlcn1gXG4gICAgICA/IE51bWJlcksgZXh0ZW5kcyBrZXlvZiBUXG4gICAgICAgID8gVFtOdW1iZXJLXVxuICAgICAgICA6IG5ldmVyXG4gICAgICA6IG5ldmVyO1xuXG50eXBlIFRvU3RyaW5nPFQ+ID0gVCBleHRlbmRzIHN0cmluZyB8IG51bWJlciA/IGAke1R9YCA6IG5ldmVyO1xuXG50eXBlIEtleXNPZlVuaW9uPE9iamVjdFR5cGU+ID0gT2JqZWN0VHlwZSBleHRlbmRzIHVua25vd24gPyBrZXlvZiBPYmplY3RUeXBlIDogbmV2ZXI7XG5cbnR5cGUgQXJyYXlFbGVtZW50PFQ+ID0gVCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA/IFRbMF0gOiBuZXZlcjtcblxudHlwZSBFeGFjdE9iamVjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+ID0ge1xuICBbS2V5IGluIGtleW9mIFBhcmFtZXRlclR5cGVdOiBFeGFjdDxQYXJhbWV0ZXJUeXBlW0tleV0sIE9iamVjdFZhbHVlPElucHV0VHlwZSwgS2V5Pj47XG59ICYgUmVjb3JkPEV4Y2x1ZGU8a2V5b2YgSW5wdXRUeXBlLCBLZXlzT2ZVbmlvbjxQYXJhbWV0ZXJUeXBlPj4sIG5ldmVyPjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiA9XG4gIC8vIEJlZm9yZSBkaXN0cmlidXRpbmcsIGNoZWNrIGlmIHRoZSB0d28gdHlwZXMgYXJlIGVxdWFsIGFuZCBpZiBzbywgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbW1lZGlhdGVseVxuICBJc0VxdWFsPFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gZXh0ZW5kcyB0cnVlXG4gICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGEgcHJpbWl0aXZlLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gICAgICA/IFBhcmFtZXRlclR5cGVcbiAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhbiB1bmtub3duLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICAgIElzVW5rbm93bjxQYXJhbWV0ZXJUeXBlPiBleHRlbmRzIHRydWVcbiAgICAgICAgPyB1bmtub3duXG4gICAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIEZ1bmN0aW9uLCByZXR1cm4gaXQgYXMgaXMgYmVjYXVzZSB0aGlzIHR5cGUgaXMgbm90IGNhcGFibGUgb2YgaGFuZGxpbmcgZnVuY3Rpb24sIGxlYXZlIGl0IHRvIFR5cGVTY3JpcHRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gICAgICAgICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgICAgICAgOiAvLyBDb252ZXJ0IHVuaW9uIG9mIGFycmF5IHRvIGFycmF5IG9mIHVuaW9uOiBBW10gJiBCW10gPT4gKEEgJiBCKVtdXG4gICAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgdW5rbm93bltdXG4gICAgICAgICAgICA/IEFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgOiAvLyBJbiBUeXBlU2NyaXB0LCBBcnJheSBpcyBhIHN1YnR5cGUgb2YgUmVhZG9ubHlBcnJheSwgc28gYWx3YXlzIHRlc3QgQXJyYXkgYmVmb3JlIFJlYWRvbmx5QXJyYXkuXG4gICAgICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW11cbiAgICAgICAgICAgICAgPyBSZWFkb25seUFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgICA6IEV4YWN0T2JqZWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT47XG4vLyBFbmQgb2YgYm9ycm93IGZyb20gIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2UvdW5pb24tdG8taW50ZXJzZWN0aW9uLmQudHNcblxuZXhwb3J0IHR5cGUgUmVtb3ZlUHJlZml4PFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5cyBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEtleXNdOiBrIGV4dGVuZHMgYCR7UHJlZml4fSR7aW5mZXIgU3VmZml4fWAgPyBTdWZmaXggOiBuZXZlcjtcbn1bS2V5c107XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eTxYIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHJlY29yZDogWCxcbiAgcHJvcDogWVxuKTogcmVjb3JkIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvcCBpbiByZWNvcmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0aWVzPFggZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcmVjb3JkOiBYLFxuICBwcm9wczogWVtdXG4pOiByZWNvcmQgaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gIHJldHVybiBwcm9wcy5ldmVyeSgocHJvcCkgPT4gcHJvcCBpbiByZWNvcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yIHtcbiAgcmV0dXJuIChcbiAgICBpc1JlY29yZChlcnJvcikgJiZcbiAgICB0eXBlb2YgZXJyb3IubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAoZXJyb3Iuc3RhY2sgPT0gbnVsbCB8fCB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09ICdzdHJpbmcnKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBYm9ydEVycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3IgJiB7IG5hbWU6ICdBYm9ydEVycm9yJyB9IHtcbiAgcmV0dXJuIGlzRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLm1lc3NhZ2VgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIEVycm9yV2l0aENvZGUge1xuICBjb2RlOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3JXaXRoQ29kZShlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yV2l0aENvZGUge1xuICByZXR1cm4gaXNSZWNvcmQoZXJyb3IpICYmIHR5cGVvZiBlcnJvci5jb2RlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLmNvZGVgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBzb21lIHR5cGUgaXMgdGhlIG5ldmVyIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKG1zZzogc3RyaW5nLCB4OiBuZXZlcik6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihtc2cgKyAnOiAnICsgeCk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzPEUgZXh0ZW5kcyBFcnJvcj4gPSB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59O1xuXG4vKipcbiAqIEEgZGVjb3JhdG9yIHRvIGJlIHVzZWQgb24gZXJyb3IgY2xhc3Nlcy4gSXQgYWRkcyB0aGUgJ25hbWUnIHByb3BlcnR5IEFORCBwcm92aWRlcyBhIGN1c3RvbVxuICogJ2luc3RhbmNlb2YnIGhhbmRsZXIgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcjxFIGV4dGVuZHMgRXJyb3I+KG1hcmtlck5hbWU6IHN0cmluZyk6IChjbGF6ejogQ2xhc3M8RT4pID0+IHZvaWQge1xuICByZXR1cm4gKGNsYXp6OiBDbGFzczxFPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fdGVtcG9yYWxfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCAnbmFtZScsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgbWFya2VyLCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9iamVjdC1zaG9ydGhhbmRcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAodGhpczogYW55LCBlcnJvcjogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICAgIHJldHVybiBpc1JlY29yZChlcnJvcikgJiYgKGVycm9yIGFzIGFueSlbbWFya2VyXSA9PT0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgICAvLyBmcm9tIGNsYXp6J3MgW1N5bWJvbC5oYXNJbnN0YW5jZV0uIElmIHdlIGRvbid0IGhhbmRsZSB0aGlzIHBhcnRpY3VsYXIgc2l0dWF0aW9uLCB0aGVuXG4gICAgICAgICAgLy8gYHggaW5zdGFuY2VvZiBTdWJjbGFzc09mUGFyZW50YCB3b3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW55IGluc3RhbmNlIG9mICdQYXJlbnQnLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSWRlYWxseSwgaXQnZCBiZSBwcmVmZXJhYmxlIHRvIGF2b2lkIHRoaXMgY2FzZSBlbnRpcmVseSwgYnkgbWFraW5nIHN1cmUgdGhhdCBhbGwgc3ViY2xhc3NlcyBvZiAnY2xhenonXG4gICAgICAgICAgLy8gcmVkZWZpbmUgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQuIFdlIHRoZXJlZm9yZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZW9mXG4gICAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlcnJvcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgY29udmVydE9wdGlvbmFsVG9QYXlsb2FkIH0gZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFVzZXIgbWV0YWRhdGEgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gd29ya2Zsb3cgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1ldGFkYXRhIHtcbiAgLyoqIEBleHBlcmltZW50YWwgQSBmaXhlZCwgc2luZ2xlIGxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCdzIHB1cnBvc2UgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcbiAgLyoqIEBleHBlcmltZW50YWwgRml4ZWQgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBjb21tYW5kIGZvciBsb25nZXItdGV4dCBkZXNjcmlwdGlvbiwgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJNZXRhZGF0YVRvUGF5bG9hZChcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgc3RhdGljU3VtbWFyeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdGF0aWNEZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHRlbXBvcmFsLmFwaS5zZGsudjEuSVVzZXJNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGlmIChzdGF0aWNTdW1tYXJ5ID09IG51bGwgJiYgc3RhdGljRGV0YWlscyA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN1bW1hcnkgPSBjb252ZXJ0T3B0aW9uYWxUb1BheWxvYWQocGF5bG9hZENvbnZlcnRlciwgc3RhdGljU3VtbWFyeSk7XG4gIGNvbnN0IGRldGFpbHMgPSBjb252ZXJ0T3B0aW9uYWxUb1BheWxvYWQocGF5bG9hZENvbnZlcnRlciwgc3RhdGljRGV0YWlscyk7XG5cbiAgaWYgKHN1bW1hcnkgPT0gbnVsbCAmJiBkZXRhaWxzID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHsgc3VtbWFyeSwgZGV0YWlscyB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBWZXJzaW9uaW5nSW50ZW50IGFzIFZlcnNpb25pbmdJbnRlbnRTdHJpbmcgfSBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmltcG9ydCB7IGFzc2VydE5ldmVyLCBjaGVja0V4dGVuZHMgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkICovXG5cbi8vIEF2b2lkIGltcG9ydGluZyB0aGUgcHJvdG8gaW1wbGVtZW50YXRpb24gdG8gcmVkdWNlIHdvcmtmbG93IGJ1bmRsZSBzaXplXG4vLyBDb3BpZWQgZnJvbSBjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50XG4vKipcbiAqIFByb3RvYnVmIGVudW0gcmVwcmVzZW50YXRpb24gb2Yge0BsaW5rIFZlcnNpb25pbmdJbnRlbnRTdHJpbmd9LlxuICpcbiAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICovXG5leHBvcnQgZW51bSBWZXJzaW9uaW5nSW50ZW50IHtcbiAgVU5TUEVDSUZJRUQgPSAwLFxuICBDT01QQVRJQkxFID0gMSxcbiAgREVGQVVMVCA9IDIsXG59XG5cbmNoZWNrRXh0ZW5kczxjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50LCBWZXJzaW9uaW5nSW50ZW50PigpO1xuY2hlY2tFeHRlbmRzPFZlcnNpb25pbmdJbnRlbnQsIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnQ+KCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uaW5nSW50ZW50VG9Qcm90byhpbnRlbnQ6IFZlcnNpb25pbmdJbnRlbnRTdHJpbmcgfCB1bmRlZmluZWQpOiBWZXJzaW9uaW5nSW50ZW50IHtcbiAgc3dpdGNoIChpbnRlbnQpIHtcbiAgICBjYXNlICdERUZBVUxUJzpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LkRFRkFVTFQ7XG4gICAgY2FzZSAnQ09NUEFUSUJMRSc6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5DT01QQVRJQkxFO1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuVU5TUEVDSUZJRUQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKCdVbmV4cGVjdGVkIFZlcnNpb25pbmdJbnRlbnQnLCBpbnRlbnQpO1xuICB9XG59XG4iLCIvKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIGludGVuZHMgY2VydGFpbiBjb21tYW5kcyB0byBiZSBydW4gb24gYSBjb21wYXRpYmxlIHdvcmtlciBCdWlsZCBJZCB2ZXJzaW9uIG9yIG5vdC5cbiAqXG4gKiBgQ09NUEFUSUJMRWAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1biBvbiBhIHdvcmtlciB3aXRoIGNvbXBhdGlibGUgdmVyc2lvbiBpZiBwb3NzaWJsZS4gSXQgbWF5IG5vdCBiZVxuICogcG9zc2libGUgaWYgdGhlIHRhcmdldCB0YXNrIHF1ZXVlIGRvZXMgbm90IGFsc28gaGF2ZSBrbm93bGVkZ2Ugb2YgdGhlIGN1cnJlbnQgd29ya2VyJ3MgQnVpbGQgSWQuXG4gKlxuICogYERFRkFVTFRgIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIHNob3VsZCBydW4gb24gdGhlIHRhcmdldCB0YXNrIHF1ZXVlJ3MgY3VycmVudCBvdmVyYWxsLWRlZmF1bHQgQnVpbGQgSWQuXG4gKlxuICogV2hlcmUgdGhpcyB0eXBlIGlzIGFjY2VwdGVkIG9wdGlvbmFsbHksIGFuIHVuc2V0IHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBTREsgc2hvdWxkIGNob29zZSB0aGUgbW9zdCBzZW5zaWJsZSBkZWZhdWx0XG4gKiBiZWhhdmlvciBmb3IgdGhlIHR5cGUgb2YgY29tbWFuZCwgYWNjb3VudGluZyBmb3Igd2hldGhlciB0aGUgY29tbWFuZCB3aWxsIGJlIHJ1biBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIHRoZVxuICogY3VycmVudCB3b3JrZXIuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBzdGFydGluZyBXb3JrZmxvd3MgaXMgYERFRkFVTFRgLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgV29ya2Zsb3dzIHN0YXJ0aW5nXG4gKiBBY3Rpdml0aWVzLCBzdGFydGluZyBDaGlsZCBXb3JrZmxvd3MsIG9yIENvbnRpbnVpbmcgQXMgTmV3IGlzIGBDT01QQVRJQkxFYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IHR5cGUgVmVyc2lvbmluZ0ludGVudCA9ICdDT01QQVRJQkxFJyB8ICdERUZBVUxUJztcbiIsImltcG9ydCB0eXBlIHsgY29yZXNkaywgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHZlcnNpb24gb2YgYSBzcGVjaWZpYyB3b3JrZXIgZGVwbG95bWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbiB7XG4gIHJlYWRvbmx5IGJ1aWxkSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZGVwbG95bWVudE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgZGVwbG95bWVudCB2ZXJzaW9uLCB3aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybWF0XG4gKiBgZGVwbG95bWVudE5hbWUuYnVpbGRJZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Nhbm9uaWNhbFN0cmluZyh2ZXJzaW9uOiBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHt2ZXJzaW9uLmRlcGxveW1lbnROYW1lfS4ke3ZlcnNpb24uYnVpbGRJZH1gO1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB3aGVuIGEgd29ya2Zsb3cgbWlnaHQgbW92ZSBmcm9tIGEgd29ya2VyIG9mIG9uZSBCdWlsZCBJZCB0byBhbm90aGVyLlxuICpcbiAqICogJ1BJTk5FRCcgLSBUaGUgd29ya2Zsb3cgd2lsbCBiZSBwaW5uZWQgdG8gdGhlIGN1cnJlbnQgQnVpbGQgSUQgdW5sZXNzIG1hbnVhbGx5IG1vdmVkLlxuICogKiAnQVVUT19VUEdSQURFJyAtIFRoZSB3b3JrZmxvdyB3aWxsIGF1dG9tYXRpY2FsbHkgbW92ZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gKGRlZmF1bHQgQnVpbGQgSURcbiAqICAgIG9mIHRoZSB0YXNrIHF1ZXVlKSB3aGVuIHRoZSBuZXh0IHRhc2sgaXMgZGlzcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFZlcnNpb25pbmdCZWhhdmlvciA9IHtcbiAgUElOTkVEOiAnUElOTkVEJyxcbiAgQVVUT19VUEdSQURFOiAnQVVUT19VUEdSQURFJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nQmVoYXZpb3IgPSAodHlwZW9mIFZlcnNpb25pbmdCZWhhdmlvcilba2V5b2YgdHlwZW9mIFZlcnNpb25pbmdCZWhhdmlvcl07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yLCBkZWNvZGVWZXJzaW9uaW5nQmVoYXZpb3JdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5WZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVmVyc2lvbmluZ0JlaGF2aW9yLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIFZlcnNpb25pbmdCZWhhdmlvcixcbiAgJ1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuPihcbiAge1xuICAgIFtWZXJzaW9uaW5nQmVoYXZpb3IuUElOTkVEXTogMSxcbiAgICBbVmVyc2lvbmluZ0JlaGF2aW9yLkFVVE9fVVBHUkFERV06IDIsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdWRVJTSU9OSU5HX0JFSEFWSU9SXydcbik7XG5cbi8qKlxuICogUmVwcmVzZW50cyB2ZXJzaW9uaW5nIG92ZXJyaWRlcy4gRm9yIGV4YW1wbGUsIHdoZW4gc3RhcnRpbmcgd29ya2Zsb3dzLlxuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nT3ZlcnJpZGUgPSBQaW5uZWRWZXJzaW9uaW5nT3ZlcnJpZGUgfCAnQVVUT19VUEdSQURFJztcblxuLyoqXG4gKiBXb3JrZmxvdyB3aWxsIGJlIHBpbm5lZCB0byBhIHNwZWNpZmljIGRlcGxveW1lbnQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaW5uZWRWZXJzaW9uaW5nT3ZlcnJpZGUge1xuICAvKipcbiAgICogVGhlIHdvcmtlciBkZXBsb3ltZW50IHZlcnNpb24gdG8gcGluIHRoZSB3b3JrZmxvdyB0by5cbiAgICovXG4gIHBpbm5lZFRvOiBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgd29ya2Zsb3cgd2lsbCBhdXRvLXVwZ3JhZGUgdG8gdGhlIGN1cnJlbnQgZGVwbG95bWVudCB2ZXJzaW9uIG9uIHRoZSBuZXh0IHdvcmtmbG93IHRhc2suXG4gKi9cbmV4cG9ydCB0eXBlIEF1dG9VcGdyYWRlVmVyc2lvbmluZ092ZXJyaWRlID0gJ0FVVE9fVVBHUkFERSc7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgdmVyc2lvbmluZyBiZWhhdmlvciB0byBiZSB1c2VkIGJ5IHRoZSBmaXJzdCB0YXNrIG9mIGEgbmV3IHdvcmtmbG93IHJ1biBpbiBhIGNvbnRpbnVlLWFzLW5ldyBjaGFpbi5cbiAqXG4gKiBBVVRPX1VQR1JBREUgLSBTdGFydCB0aGUgbmV3IHJ1biB3aXRoIEF1dG9VcGdyYWRlIGJlaGF2aW9yLiBVc2UgdGhlIFRhcmdldCBWZXJzaW9uIG9mIHRoZSB3b3JrZmxvdydzIHRhc2sgcXVldWUgYXRcbiAqICAgc3RhcnQtdGltZSwgYXMgQXV0b1VwZ3JhZGUgd29ya2Zsb3dzIGRvLiBBZnRlciB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBjb21wbGV0ZXMsIHVzZSB3aGF0ZXZlclxuICogICBWZXJzaW9uaW5nIEJlaGF2aW9yIHRoZSB3b3JrZmxvdyBpcyBhbm5vdGF0ZWQgd2l0aCBpbiB0aGUgd29ya2Zsb3cgY29kZS5cbiAqXG4gKiAgIE5vdGUgdGhhdCBpZiB0aGUgcHJldmlvdXMgd29ya2Zsb3cgaGFkIGEgUGlubmVkIG92ZXJyaWRlLCB0aGF0IG92ZXJyaWRlIHdpbGwgYmUgaW5oZXJpdGVkIGJ5IHRoZVxuICogICBuZXcgd29ya2Zsb3cgcnVuIHJlZ2FyZGxlc3Mgb2YgdGhlIENvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3Igc3BlY2lmaWVkIGluIHRoZSBjb250aW51ZS1hcy1uZXdcbiAqICAgY29tbWFuZC4gSWYgYSBQaW5uZWQgb3ZlcnJpZGUgaXMgaW5oZXJpdGVkIGJ5IHRoZSBuZXcgcnVuLCBhbmQgdGhlIG5ldyBydW4gc3RhcnRzIHdpdGggQXV0b1VwZ3JhZGVcbiAqICAgYmVoYXZpb3IsIHRoZSBiYXNlIHZlcnNpb24gb2YgdGhlIG5ldyBydW4gd2lsbCBiZSB0aGUgVGFyZ2V0IFZlcnNpb24gYXMgZGVzY3JpYmVkIGFib3ZlLCBidXQgdGhlXG4gKiAgIGVmZmVjdGl2ZSB2ZXJzaW9uIHdpbGwgYmUgd2hhdGV2ZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBWZXJzaW9uaW5nIE92ZXJyaWRlIHVudGlsIHRoZSBvdmVycmlkZSBpcyByZW1vdmVkLlxuICpcbiAqIFVTRV9SQU1QSU5HX1ZFUlNJT04gLSBVc2UgdGhlIFJhbXBpbmcgVmVyc2lvbiBvZiB0aGUgd29ya2Zsb3cncyB0YXNrIHF1ZXVlIGF0IHN0YXJ0IHRpbWUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHdvcmtmbG93J3NcbiAqICAgVGFyZ2V0IFZlcnNpb24gKGFjY29yZGluZyB0byBmKHdvcmtmbG93X2lkLCByYW1wX3BlcmNlbnRhZ2UpKS4gQWZ0ZXIgdGhlIGZpcnN0IHdvcmtmbG93IHRhc2sgY29tcGxldGVzLFxuICogICB0aGUgd29ya2Zsb3cgd2lsbCB1c2Ugd2hhdGV2ZXIgVmVyc2lvbmluZyBCZWhhdmlvciBpdCBpcyBhbm5vdGF0ZWQgd2l0aC4gSWYgdGhlcmUgaXMgbm8gUmFtcGluZ1xuICogICBWZXJzaW9uIGJ5IHRoZSB0aW1lIHRoYXQgdGhlIGZpcnN0IHdvcmtmbG93IHRhc2sgaXMgZGlzcGF0Y2hlZCwgaXQgd2lsbCBiZSBzZW50IHRvIHRoZSBDdXJyZW50IFZlcnNpb24uXG4gKlxuICogICBJdCBpcyBoaWdobHkgZGlzY291cmFnZWQgdG8gdXNlIHRoaXMgaWYgdGhlIHdvcmtmbG93IGlzIGFubm90YXRlZCB3aXRoIEF1dG9VcGdyYWRlIGJlaGF2aW9yLCBiZWNhdXNlXG4gKiAgIHRoaXMgc2V0dGluZyBPTkxZIGFwcGxpZXMgdG8gdGhlIGZpcnN0IHRhc2sgb2YgdGhlIHdvcmtmbG93LiBJZiwgYWZ0ZXIgdGhlIGZpcnN0IHRhc2ssIHRoZSB3b3JrZmxvd1xuICogICBpcyBBdXRvVXBncmFkZSwgaXQgd2lsbCBiZWhhdmUgbGlrZSBhIG5vcm1hbCBBdXRvVXBncmFkZSB3b3JrZmxvdyBhbmQgZ28gdG8gdGhlIFRhcmdldCBWZXJzaW9uLCB3aGljaFxuICogICBtYXkgYmUgdGhlIEN1cnJlbnQgVmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBSYW1waW5nIFZlcnNpb24uXG4gKlxuICogICBOb3RlIHRoYXQgaWYgdGhlIHdvcmtmbG93IGJlaW5nIGNvbnRpbnVlZCBoYXMgYSBQaW5uZWQgb3ZlcnJpZGUsIHRoYXQgb3ZlcnJpZGUgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlXG4gKiAgIG5ldyB3b3JrZmxvdyBydW4gcmVnYXJkbGVzcyBvZiB0aGUgQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvciBzcGVjaWZpZWQgaW4gdGhlIGNvbnRpbnVlLWFzLW5ld1xuICogICBjb21tYW5kLiBWZXJzaW9uaW5nIE92ZXJyaWRlIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlIHVudGlsIGl0J3MgcmVtb3ZlZCBtYW51YWxseSB2aWEgVXBkYXRlV29ya2Zsb3dFeGVjdXRpb25PcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgVmVyc2lvbmluZyBzZW1hbnRpY3Mgd2l0aCBjb250aW51ZS1hcy1uZXcgYXJlIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvciA9IHtcbiAgQVVUT19VUEdSQURFOiAnQVVUT19VUEdSQURFJyxcbiAgVVNFX1JBTVBJTkdfVkVSU0lPTjogJ1VTRV9SQU1QSU5HX1ZFUlNJT04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IgPSAodHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IpW2tleW9mIHR5cGVvZiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLCBkZWNvZGVJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Db250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkNvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHR5cGVvZiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLFxuICAnQ09OVElOVUVfQVNfTkVXX1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuPihcbiAge1xuICAgIFtJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLkFVVE9fVVBHUkFERV06IDEsXG4gICAgW0luaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IuVVNFX1JBTVBJTkdfVkVSU0lPTl06IDIsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdDT05USU5VRV9BU19ORVdfVkVSU0lPTklOR19CRUhBVklPUl8nXG4pO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERlcGxveW1lbnRWZXJzaW9uKFxuICB2OiBjb3Jlc2RrLmNvbW1vbi5JV29ya2VyRGVwbG95bWVudFZlcnNpb24gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghdiB8fCAhdi5idWlsZElkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYnVpbGRJZDogdi5idWlsZElkLFxuICAgIGRlcGxveW1lbnROYW1lOiB2LmRlcGxveW1lbnROYW1lID8/ICcnLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBWZXJzaW9uaW5nQmVoYXZpb3IgfSBmcm9tICcuL3dvcmtlci1kZXBsb3ltZW50cyc7XG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gZGVmaW5pbmcgYSB3b3JrZmxvdyB2aWEge0BsaW5rIHNldFdvcmtmbG93T3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyB7XG4gIHZlcnNpb25pbmdCZWhhdmlvcj86IFZlcnNpb25pbmdCZWhhdmlvcjtcbn1cblxudHlwZSBBc3luY0Z1bmN0aW9uPEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0dXJuVHlwZT4gPSAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPjtcbmV4cG9ydCB0eXBlIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlciA9IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMgfCAoKCkgPT4gV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKiBBIHdvcmtmbG93IGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4gZGVmaW5lZCB3aXRoIG9wdGlvbnMgZnJvbSB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0dXJuVHlwZT4gZXh0ZW5kcyBBc3luY0Z1bmN0aW9uPEFyZ3MsIFJldHVyblR5cGU+IHtcbiAgd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uczogV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBXb3JrZmxvdywgV29ya2Zsb3dSZXN1bHRUeXBlLCBTaWduYWxEZWZpbml0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBCYXNlIFdvcmtmbG93SGFuZGxlIGludGVyZmFjZSwgZXh0ZW5kZWQgaW4gd29ya2Zsb3cgYW5kIGNsaWVudCBsaWJzLlxuICpcbiAqIFRyYW5zZm9ybXMgYSB3b3JrZmxvdyBpbnRlcmZhY2UgYFRgIGludG8gYSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VXb3JrZmxvd0hhbmRsZTxUIGV4dGVuZHMgV29ya2Zsb3c+IHtcbiAgLyoqXG4gICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIFdvcmtmbG93IGV4ZWN1dGlvbiBjb21wbGV0ZXNcbiAgICovXG4gIHJlc3VsdCgpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbiAgLyoqXG4gICAqIFNpZ25hbCBhIHJ1bm5pbmcgV29ya2Zsb3cuXG4gICAqXG4gICAqIEBwYXJhbSBkZWYgYSBzaWduYWwgZGVmaW5pdGlvbiBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGF3YWl0IGhhbmRsZS5zaWduYWwoaW5jcmVtZW50U2lnbmFsLCAzKTtcbiAgICogYGBgXG4gICAqL1xuICBzaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzLCBOYW1lPiB8IHN0cmluZyxcbiAgICAuLi5hcmdzOiBBcmdzXG4gICk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JrZmxvd0lkIG9mIHRoZSBjdXJyZW50IFdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvdyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hBdHRyaWJ1dGVQYWlyLCBTZWFyY2hBdHRyaWJ1dGVzLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgfSBmcm9tICcuL3NlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB0eXBlIHsgUHJpb3JpdHkgfSBmcm9tICcuL3ByaW9yaXR5JztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zIH0gZnJvbSAnLi93b3JrZmxvdy1kZWZpbml0aW9uLW9wdGlvbnMnO1xuXG4vKipcbiAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICpcbiAqIFNlZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeX0gZm9yIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhXG4gKiBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKlJ1bm5pbmcqIFdvcmtmbG93LlxuICpcbiAqIENvbmNlcHQ6IHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hLXdvcmtmbG93LWlkLXJldXNlLXBvbGljeS8gfCBXb3JrZmxvdyBJZCBSZXVzZSBQb2xpY3l9XG4gKlxuICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlLlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbiBiZSBzdGFydGVkIGlmIHRoZSBwcmV2aW91cyBXb3JrZmxvdyBpcyBpbiBhIENsb3NlZCBzdGF0ZSB0aGF0IGlzIG5vdCBDb21wbGV0ZWQuXG4gICAqL1xuICBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2Fubm90IGJlIHN0YXJ0ZWQuXG4gICAqL1xuICBSRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBXb3JrZmxvdyBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nOyBvdGhlcndpc2UgYWxsb3cgcmV1c2luZyB0aGUgV29ya2Zsb3cgSUQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURX0gaW5zdGVhZCwgYW5kXG4gICAqICAgICAgICAgICAgIHNldCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgdG9cbiAgICogICAgICAgICAgICAge0BsaW5rIFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVEVSTUlOQVRFX0VYSVNUSU5HfS5cbiAgICogICAgICAgICAgICAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgYFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3lgIG11c3QgYmUgbGVmdCB1bnNwZWNpZmllZC5cbiAgICovXG4gIFRFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLFxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBObyBuZWVkIHRvIHVzZSB0aGlzLiBJZiBhIGBXb3JrZmxvd0lkUmV1c2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLiAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFl9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFSkVDVF9EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVEVSTUlOQVRFX0lGX1JVTk5JTkd9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9URVJNSU5BVEVfSUZfUlVOTklORzogJ1RFUk1JTkFURV9JRl9SVU5OSU5HJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSAodHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSlba2V5b2YgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LCBkZWNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVdOiAxLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZXTogMixcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LlJFSkVDVF9EVVBMSUNBVEVdOiAzLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuVEVSTUlOQVRFX0lGX1JVTk5JTkddOiA0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfJ1xuKTtcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3dcbiAqIHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiAqTm90ZTogSXQgaXMgbmV2ZXIgcG9zc2libGUgdG8gaGF2ZSB0d28gX2FjdGl2ZWx5IHJ1bm5pbmdfIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByYWlzZSBhIGBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3JgLlxuICAgKi9cbiAgRkFJTDogJ0ZBSUwnLFxuXG4gIC8qKlxuICAgKiBEbyBub3Qgc3RhcnQgYSBuZXcgV29ya2Zsb3cuIEluc3RlYWQgcmV0dXJuIGEgV29ya2Zsb3cgSGFuZGxlIGZvciB0aGUgYWxyZWFkeSBSdW5uaW5nIFdvcmtmbG93LlxuICAgKi9cbiAgVVNFX0VYSVNUSU5HOiAnVVNFX0VYSVNUSU5HJyxcblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgV29ya2Zsb3csIHRlcm1pbmF0aW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAqL1xuICBURVJNSU5BVEVfRVhJU1RJTkc6ICdURVJNSU5BVEVfRVhJU1RJTkcnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICAnV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LkZBSUxdOiAxLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVVNFX0VYSVNUSU5HXTogMixcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LlRFUk1JTkFURV9FWElTVElOR106IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICAgKlxuICAgKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICAgKlxuICAgKiBAZGVmYXVsdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kuV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURVxuICAgKi9cbiAgd29ya2Zsb3dJZFJldXNlUG9saWN5PzogV29ya2Zsb3dJZFJldXNlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVU5TUEVDSUZJRURcbiAgICovXG4gIHdvcmtmbG93SWRDb25mbGljdFBvbGljeT86IFdvcmtmbG93SWRDb25mbGljdFBvbGljeTtcblxuICAvKipcbiAgICogQ29udHJvbHMgaG93IGEgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIHJldHJpZWQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFdvcmtmbG93IEV4ZWN1dGlvbnMgYXJlIG5vdCByZXRyaWVkLiBEbyBub3Qgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAqIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hLXJldHJ5LXBvbGljeS8gfCBNb3JlIGluZm9ybWF0aW9ufS5cbiAgICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNyb24gc2NoZWR1bGUgZm9yIFdvcmtmbG93LiBJZiBhIGNyb24gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgV29ya2Zsb3cgd2lsbCBydW4gYXMgYSBjcm9uIGJhc2VkIG9uIHRoZVxuICAgKiBzY2hlZHVsZS4gVGhlIHNjaGVkdWxpbmcgd2lsbCBiZSBiYXNlZCBvbiBVVEMgdGltZS4gVGhlIHNjaGVkdWxlIGZvciB0aGUgbmV4dCBydW4gb25seSBoYXBwZW5zIGFmdGVyIHRoZSBjdXJyZW50XG4gICAqIHJ1biBpcyBjb21wbGV0ZWQvZmFpbGVkL3RpbWVvdXQuIElmIGEgUmV0cnlQb2xpY3kgaXMgYWxzbyBzdXBwbGllZCwgYW5kIHRoZSBXb3JrZmxvdyBmYWlsZWQgb3IgdGltZWQgb3V0LCB0aGVcbiAgICogV29ya2Zsb3cgd2lsbCBiZSByZXRyaWVkIGJhc2VkIG9uIHRoZSByZXRyeSBwb2xpY3kuIFdoaWxlIHRoZSBXb3JrZmxvdyBpcyByZXRyeWluZywgaXQgd29uJ3Qgc2NoZWR1bGUgaXRzIG5leHQgcnVuLlxuICAgKiBJZiB0aGUgbmV4dCBzY2hlZHVsZSBpcyBkdWUgd2hpbGUgdGhlIFdvcmtmbG93IGlzIHJ1bm5pbmcgKG9yIHJldHJ5aW5nKSwgdGhlbiBpdCB3aWxsIHNraXAgdGhhdCBzY2hlZHVsZS4gQ3JvblxuICAgKiBXb3JrZmxvdyB3aWxsIG5vdCBzdG9wIHVudGlsIGl0IGlzIHRlcm1pbmF0ZWQgb3IgY2FuY2VsbGVkIChieSByZXR1cm5pbmcgdGVtcG9yYWwuQ2FuY2VsZWRFcnJvcikuXG4gICAqIGh0dHBzOi8vY3JvbnRhYi5ndXJ1LyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgeW91ciBjcm9uIGV4cHJlc3Npb25zLlxuICAgKi9cbiAgY3JvblNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBub24taW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gVGhlIHZhbHVlcyBjYW4gYmUgYW55dGhpbmcgdGhhdFxuICAgKiBpcyBzZXJpYWxpemFibGUgYnkge0BsaW5rIERhdGFDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBpbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBNb3JlIGluZm86XG4gICAqIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kb2NzL3R5cGVzY3JpcHQvc2VhcmNoLWF0dHJpYnV0ZXNcbiAgICpcbiAgICogVmFsdWVzIGFyZSBhbHdheXMgY29udmVydGVkIHVzaW5nIHtAbGluayBKc29uUGF5bG9hZENvbnZlcnRlcn0sIGV2ZW4gd2hlbiBhIGN1c3RvbSBkYXRhIGNvbnZlcnRlciBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBpbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBNb3JlIGluZm86XG4gICAqIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kb2NzL3R5cGVzY3JpcHQvc2VhcmNoLWF0dHJpYnV0ZXNcbiAgICpcbiAgICogVmFsdWVzIGFyZSBhbHdheXMgY29udmVydGVkIHVzaW5nIHtAbGluayBKc29uUGF5bG9hZENvbnZlcnRlcn0sIGV2ZW4gd2hlbiBhIGN1c3RvbSBkYXRhIGNvbnZlcnRlciBpcyBwcm92aWRlZC5cbiAgICogTm90ZSB0aGF0IHNlYXJjaCBhdHRyaWJ1dGVzIGFyZSBub3QgZW5jb2RlZCwgYXMgc3VjaCwgZG8gbm90IGluY2x1ZGUgYW55IHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogSWYgYm90aCB7QGxpbmsgc2VhcmNoQXR0cmlidXRlc30gYW5kIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGFyZSBwcm92aWRlZCwgY29uZmxpY3Rpbmcga2V5cyB3aWxsIGJlIG92ZXJ3cml0dGVuXG4gICAqIGJ5IHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9LlxuICAgKi9cbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlUGFpcltdIHwgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzO1xuXG4gIC8qKlxuICAgKiBHZW5lcmFsIGZpeGVkIGRldGFpbHMgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdCBhbmQgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN0YXRpY0RldGFpbHM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHNpbmdsZS1saW5lIGZpeGVkIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN0YXRpY1N1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIGEgd29ya2Zsb3dcbiAgICovXG4gIHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbmV4cG9ydCB0eXBlIFdpdGhXb3JrZmxvd0FyZ3M8VyBleHRlbmRzIFdvcmtmbG93LCBUPiA9IFQgJlxuICAoUGFyYW1ldGVyczxXPiBleHRlbmRzIFthbnksIC4uLmFueVtdXVxuICAgID8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIFdvcmtmbG93XG4gICAgICAgICAqL1xuICAgICAgICBhcmdzOiBQYXJhbWV0ZXJzPFc+IHwgUmVhZG9ubHk8UGFyYW1ldGVyczxXPj47XG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M/OiBQYXJhbWV0ZXJzPFc+IHwgUmVhZG9ubHk8UGFyYW1ldGVyczxXPj47XG4gICAgICB9KTtcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBydW4gaXMgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIHNlcnZpY2UuIERvIG5vdFxuICAgKiByZWx5IG9uIHJ1biB0aW1lb3V0IGZvciBidXNpbmVzcyBsZXZlbCB0aW1lb3V0cy4gSXQgaXMgcHJlZmVycmVkIHRvIHVzZSBpbiB3b3JrZmxvdyB0aW1lcnNcbiAgICogZm9yIHRoaXMgcHVycG9zZS5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICpcbiAgICogVGhlIHRpbWUgYWZ0ZXIgd2hpY2ggd29ya2Zsb3cgZXhlY3V0aW9uICh3aGljaCBpbmNsdWRlcyBydW4gcmV0cmllcyBhbmQgY29udGludWUgYXMgbmV3KSBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90IHJlbHkgb24gZXhlY3V0aW9uIHRpbWVvdXQgZm9yIGJ1c2luZXNzXG4gICAqIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVycyBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93RXhlY3V0aW9uVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIGEgc2luZ2xlIHdvcmtmbG93IHRhc2suIERlZmF1bHQgaXMgMTAgc2Vjb25kcy5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1Rhc2tUaW1lb3V0PzogRHVyYXRpb247XG59XG5cbmV4cG9ydCB0eXBlIENvbW1vbldvcmtmbG93T3B0aW9ucyA9IEJhc2VXb3JrZmxvd09wdGlvbnMgJiBXb3JrZmxvd0R1cmF0aW9uT3B0aW9ucztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RXb3JrZmxvd1R5cGU8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlT3JGdW5jOiBzdHJpbmcgfCBUIHwgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPGFueVtdLCBhbnk+XG4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuYyA9PT0gJ3N0cmluZycpIHJldHVybiB3b3JrZmxvd1R5cGVPckZ1bmMgYXMgc3RyaW5nO1xuICBpZiAodHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh3b3JrZmxvd1R5cGVPckZ1bmM/Lm5hbWUpIHJldHVybiB3b3JrZmxvd1R5cGVPckZ1bmMubmFtZTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdvcmtmbG93IHR5cGU6IHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBhbm9ueW1vdXMnKTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBJbnZhbGlkIHdvcmtmbG93IHR5cGU6IGV4cGVjdGVkIGVpdGhlciBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLCBnb3QgJyR7dHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuY30nYFxuICApO1xufVxuIiwiLy8gQSBwb3J0IG9mIGFuIGFsZ29yaXRobSBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLmNvbT4sIDIwMTBcbi8vIGh0dHA6Ly9iYWFnb2UuY29tL2VuL1JhbmRvbU11c2luZ3MvamF2YXNjcmlwdC9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucXVpbmxhbi9iZXR0ZXItcmFuZG9tLW51bWJlcnMtZm9yLWphdmFzY3JpcHQtbWlycm9yXG4vLyBPcmlnaW5hbCB3b3JrIGlzIHVuZGVyIE1JVCBsaWNlbnNlIC1cblxuLy8gQ29weXJpZ2h0IChDKSAyMDEwIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2Uub3JnPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbi8vIFRha2VuIGFuZCBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZGJhdS9zZWVkcmFuZG9tL2Jsb2IvcmVsZWFzZWQvbGliL2FsZWEuanNcblxuY2xhc3MgQWxlYSB7XG4gIHB1YmxpYyBjOiBudW1iZXI7XG4gIHB1YmxpYyBzMDogbnVtYmVyO1xuICBwdWJsaWMgczE6IG51bWJlcjtcbiAgcHVibGljIHMyOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc2VlZDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBtYXNoID0gbmV3IE1hc2goKTtcbiAgICAvLyBBcHBseSB0aGUgc2VlZGluZyBhbGdvcml0aG0gZnJvbSBCYWFnb2UuXG4gICAgdGhpcy5jID0gMTtcbiAgICB0aGlzLnMwID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczEgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMiA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMwIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMCA8IDApIHtcbiAgICAgIHRoaXMuczAgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMSAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczEgPCAwKSB7XG4gICAgICB0aGlzLnMxICs9IDE7XG4gICAgfVxuICAgIHRoaXMuczIgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMyIDwgMCkge1xuICAgICAgdGhpcy5zMiArPSAxO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZXh0KCk6IG51bWJlciB7XG4gICAgY29uc3QgdCA9IDIwOTE2MzkgKiB0aGlzLnMwICsgdGhpcy5jICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICB0aGlzLnMwID0gdGhpcy5zMTtcbiAgICB0aGlzLnMxID0gdGhpcy5zMjtcbiAgICByZXR1cm4gKHRoaXMuczIgPSB0IC0gKHRoaXMuYyA9IHQgfCAwKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUk5HID0gKCkgPT4gbnVtYmVyO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxlYShzZWVkOiBudW1iZXJbXSk6IFJORyB7XG4gIGNvbnN0IHhnID0gbmV3IEFsZWEoc2VlZCk7XG4gIHJldHVybiB4Zy5uZXh0LmJpbmQoeGcpO1xufVxuXG5leHBvcnQgY2xhc3MgTWFzaCB7XG4gIHByaXZhdGUgbiA9IDB4ZWZjODI0OWQ7XG5cbiAgcHVibGljIG1hc2goZGF0YTogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIGxldCB7IG4gfSA9IHRoaXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGFbaV0hO1xuICAgICAgbGV0IGggPSAwLjAyNTE5NjAzMjgyNDE2OTM4ICogbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgaCAqPSBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBuICs9IGggKiAweDEwMDAwMDAwMDsgLy8gMl4zMlxuICAgIH1cbiAgICB0aGlzLm4gPSBuO1xuICAgIHJldHVybiAobiA+Pj4gMCkgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzeW5jTG9jYWxTdG9yYWdlIGFzIEFMUyB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBDYW5jZWxsZWRGYWlsdXJlLCBJbGxlZ2FsU3RhdGVFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9OdW1iZXIgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuXG4vLyBBc3luY0xvY2FsU3RvcmFnZSBpcyBpbmplY3RlZCB2aWEgdm0gbW9kdWxlIGludG8gZ2xvYmFsIHNjb3BlLlxuLy8gSW4gY2FzZSBXb3JrZmxvdyBjb2RlIGlzIGltcG9ydGVkIGluIE5vZGUuanMgY29udGV4dCwgcmVwbGFjZSB3aXRoIGFuIGVtcHR5IGNsYXNzLlxuZXhwb3J0IGNvbnN0IEFzeW5jTG9jYWxTdG9yYWdlOiBuZXcgPFQ+KCkgPT4gQUxTPFQ+ID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Bc3luY0xvY2FsU3RvcmFnZSA/PyBjbGFzcyB7fTtcblxuLyoqIE1hZ2ljIHN5bWJvbCB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBzY29wZSAtIGludGVudGlvbmFsbHkgbm90IGV4cG9ydGVkICovXG5jb25zdCBOT19QQVJFTlQgPSBTeW1ib2woJ05PX1BBUkVOVCcpO1xuXG4vKipcbiAqIE9wdGlvbiBmb3IgY29uc3RydWN0aW5nIGEgQ2FuY2VsbGF0aW9uU2NvcGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMge1xuICAvKipcbiAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzY29wZSBjYW5jZWxsYXRpb24gaXMgYXV0b21hdGljYWxseSByZXF1ZXN0ZWRcbiAgICovXG4gIHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIHByZXZlbnQgb3V0ZXIgY2FuY2VsbGF0aW9uIGZyb20gcHJvcGFnYXRpbmcgdG8gaW5uZXIgc2NvcGVzLCBBY3Rpdml0aWVzLCB0aW1lcnMsIGFuZCBUcmlnZ2VycywgZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogKFNjb3BlIHN0aWxsIHByb3BhZ2F0ZXMgQ2FuY2VsbGVkRmFpbHVyZSB0aHJvd24gZnJvbSB3aXRoaW4pLlxuICAgKi9cbiAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBDYW5jZWxsYXRpb25TY29wZSAodXNlZnVsIGZvciBydW5uaW5nIGJhY2tncm91bmQgdGFza3MpLlxuICAgKiBUaGUgYE5PX1BBUkVOVGAgc3ltYm9sIGlzIHJlc2VydmVkIGZvciB0aGUgcm9vdCBzY29wZS5cbiAgICovXG4gIHBhcmVudD86IENhbmNlbGxhdGlvblNjb3BlIHwgdHlwZW9mIE5PX1BBUkVOVDtcbn1cblxuLyoqXG4gKiBDYW5jZWxsYXRpb24gU2NvcGVzIHByb3ZpZGUgdGhlIG1lY2hhbmljIGJ5IHdoaWNoIGEgV29ya2Zsb3cgbWF5IGdyYWNlZnVsbHkgaGFuZGxlIGluY29taW5nIHJlcXVlc3RzIGZvciBjYW5jZWxsYXRpb25cbiAqIChlLmcuIGluIHJlc3BvbnNlIHRvIHtAbGluayBXb3JrZmxvd0hhbmRsZS5jYW5jZWx9IG9yIHRocm91Z2ggdGhlIFVJIG9yIENMSSksIGFzIHdlbGwgYXMgcmVxdWVzdCBjYW5jZWxsYXRpb24gb2ZcbiAqIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgaXQgb3ducyAoZS5nLiBBY3Rpdml0aWVzLCBUaW1lcnMsIENoaWxkIFdvcmtmbG93cywgZXRjKS5cbiAqXG4gKiBDYW5jZWxsYXRpb24gU2NvcGVzIGZvcm0gYSB0cmVlLCB3aXRoIHRoZSBXb3JrZmxvdydzIG1haW4gZnVuY3Rpb24gcnVubmluZyBpbiB0aGUgcm9vdCBzY29wZSBvZiB0aGF0IHRyZWUuXG4gKiBCeSBkZWZhdWx0LCBjYW5jZWxsYXRpb24gcHJvcGFnYXRlcyBkb3duIGZyb20gYSBwYXJlbnQgc2NvcGUgdG8gaXRzIGNoaWxkcmVuIGFuZCBpdHMgY2FuY2VsbGFibGUgb3BlcmF0aW9ucy5cbiAqIEEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGNhbiByZWNlaXZlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cywgYnV0IGlzIG5ldmVyIGVmZmVjdGl2ZWx5IGNvbnNpZGVyZWQgYXMgY2FuY2VsbGVkLFxuICogdGh1cyBzaGllbGRkaW5nIGl0cyBjaGlsZHJlbiBhbmQgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBmcm9tIHByb3BhZ2F0aW9uIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBpdCByZWNlaXZlcy5cbiAqXG4gKiBTY29wZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgY29uc3RydWN0b3Igb3IgdGhlIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyB7QGxpbmsgY2FuY2VsbGFibGV9LFxuICoge0BsaW5rIG5vbkNhbmNlbGxhYmxlfSBhbmQge0BsaW5rIHdpdGhUaW1lb3V0fS4gYHdpdGhUaW1lb3V0YCBjcmVhdGVzIGEgc2NvcGUgdGhhdCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmIGFmdGVyXG4gKiBzb21lIGR1cmF0aW9uLlxuICpcbiAqIENhbmNlbGxhdGlvbiBvZiBhIGNhbmNlbGxhYmxlIHNjb3BlIHJlc3VsdHMgaW4gYWxsIG9wZXJhdGlvbnMgY3JlYXRlZCBkaXJlY3RseSBpbiB0aGF0IHNjb3BlIHRvIHRocm93IGFcbiAqIHtAbGluayBDYW5jZWxsZWRGYWlsdXJlfSAoZWl0aGVyIGRpcmVjdGx5LCBvciBhcyB0aGUgYGNhdXNlYCBvZiBhbiB7QGxpbmsgQWN0aXZpdHlGYWlsdXJlfSBvciBhXG4gKiB7QGxpbmsgQ2hpbGRXb3JrZmxvd0ZhaWx1cmV9KS4gRnVydGhlciBhdHRlbXB0IHRvIGNyZWF0ZSBuZXcgY2FuY2VsbGFibGUgc2NvcGVzIG9yIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgd2l0aGluIGFcbiAqIHNjb3BlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWQgd2lsbCBhbHNvIGltbWVkaWF0ZWx5IHRocm93IGEge0BsaW5rIENhbmNlbGxlZEZhaWx1cmV9IGV4Y2VwdGlvbi4gSXQgaXMgaG93ZXZlclxuICogcG9zc2libGUgdG8gY3JlYXRlIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGF0IHRoYXQgcG9pbnQ7IHRoaXMgaXMgb2Z0ZW4gdXNlZCB0byBleGVjdXRlIHJvbGxiYWNrIG9yIGNsZWFudXBcbiAqIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KC4uLik6IFByb21pc2U8dm9pZD4ge1xuICogICB0cnkge1xuICogICAgIC8vIFRoaXMgYWN0aXZpdHkgcnVucyBpbiB0aGUgcm9vdCBjYW5jZWxsYXRpb24gc2NvcGUuIFRoZXJlZm9yZSwgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBvblxuICogICAgIC8vIHRoZSBXb3JrZmxvdyBleGVjdXRpb24gKGUuZy4gdGhyb3VnaCB0aGUgVUkgb3IgQ0xJKSBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZXMgdG8gdGhpc1xuICogICAgIC8vIGFjdGl2aXR5LiBBc3N1bWluZyB0aGF0IHRoZSBhY3Rpdml0eSBwcm9wZXJseSBoYW5kbGUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LCB0aGVuIHRoZVxuICogICAgIC8vIGNhbGwgYmVsb3cgd2lsbCB0aHJvdyBhbiBgQWN0aXZpdHlGYWlsdXJlYCBleGNlcHRpb24sIHdpdGggYGNhdXNlYCBzZXRzIHRvIGFuXG4gKiAgICAgLy8gaW5zdGFuY2Ugb2YgYENhbmNlbGxlZEZhaWx1cmVgLlxuICogICAgIGF3YWl0IHNvbWVBY3Rpdml0eSgpO1xuICogICB9IGNhdGNoIChlKSB7XG4gKiAgICAgaWYgKGlzQ2FuY2VsbGF0aW9uKGUpKSB7XG4gKiAgICAgICAvLyBSdW4gY2xlYW51cCBhY3Rpdml0eSBpbiBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZVxuICogICAgICAgYXdhaXQgQ2FuY2VsbGF0aW9uU2NvcGUubm9uQ2FuY2VsbGFibGUoYXN5bmMgKCkgPT4ge1xuICogICAgICAgICBhd2FpdCBjbGVhbnVwQWN0aXZpdHkoKTtcbiAqICAgICAgIH1cbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgdGhyb3cgZTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEEgY2FuY2VsbGFibGUgc2NvcGUgbWF5IGJlIHByb2dyYW1hdGljYWxseSBjYW5jZWxsZWQgYnkgY2FsbGluZyB7QGxpbmsgY2FuY2VsfGBzY29wZS5jYW5jZWwoKWB9YC4gVGhpcyBtYXkgYmUgdXNlZCxcbiAqIGZvciBleGFtcGxlLCB0byBleHBsaWNpdGx5IHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIEFjdGl2aXR5IG9yIENoaWxkIFdvcmtmbG93OlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUgPSBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoKTtcbiAqIGNvbnN0IGFjdGl2aXR5UHJvbWlzZSA9IGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZS5ydW4oKCkgPT4gc29tZUFjdGl2aXR5KCkpO1xuICogY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlLmNhbmNlbCgpOyAvLyBDYW5jZWxzIHRoZSBhY3Rpdml0eVxuICogYXdhaXQgYWN0aXZpdHlQcm9taXNlOyAvLyBUaHJvd3MgYEFjdGl2aXR5RmFpbHVyZWAgd2l0aCBgY2F1c2VgIHNldCB0byBgQ2FuY2VsbGVkRmFpbHVyZWBcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGF0aW9uU2NvcGUge1xuICAvKipcbiAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzY29wZSBjYW5jZWxsYXRpb24gaXMgYXV0b21hdGljYWxseSByZXF1ZXN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgdGhlbiB0aGlzIHNjb3BlIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCBjYW5jZWxsZWQsIGV2ZW4gaWYgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBpcyByZWNlaXZlZCAoZWl0aGVyXG4gICAqIGRpcmVjdGx5IGJ5IGNhbGxpbmcgYHNjb3BlLmNhbmNlbCgpYCBvciBpbmRpcmVjdGx5IGJ5IGNhbmNlbGxpbmcgYSBjYW5jZWxsYWJsZSBwYXJlbnQgc2NvcGUpLiBUaGlzIGVmZmVjdGl2ZWx5XG4gICAqIHNoaWVsZHMgdGhlIHNjb3BlJ3MgY2hpbGRyZW4gYW5kIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgZnJvbSBwcm9wYWdhdGlvbiBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgbWFkZSBvbiB0aGVcbiAgICogbm9uLWNhbmNlbGxhYmxlIHNjb3BlLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIFByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGBydW5gIGZ1bmN0aW9uIG9mIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBtYXkgc3RpbGwgdGhyb3cgYSBgQ2FuY2VsbGVkRmFpbHVyZWBcbiAgICogaWYgc3VjaCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gd2l0aGluIHRoYXQgc2NvcGUgKGUuZy4gYnkgZGlyZWN0bHkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIGNoaWxkIHNjb3BlKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5jZWxsYWJsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgQ2FuY2VsbGF0aW9uU2NvcGUgKHVzZWZ1bCBmb3IgcnVubmluZyBiYWNrZ3JvdW5kIHRhc2tzKSwgZGVmYXVsdHMgdG8ge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnR9KClcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXJlbnQ/OiBDYW5jZWxsYXRpb25TY29wZTtcblxuICAvKipcbiAgICogQSBQcm9taXNlIHRoYXQgdGhyb3dzIHdoZW4gYSBjYW5jZWxsYWJsZSBzY29wZSByZWNlaXZlcyBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0LCBlaXRoZXIgZGlyZWN0bHlcbiAgICogKGkuZS4gYHNjb3BlLmNhbmNlbCgpYCksIG9yIGluZGlyZWN0bHkgKGJ5IGNhbmNlbGxpbmcgYSBjYW5jZWxsYWJsZSBwYXJlbnQgc2NvcGUpLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgbWF5IHJlY2VpdmUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLCByZXN1bHRpbmcgaW4gdGhlIGBjYW5jZWxSZXF1ZXN0ZWRgIHByb21pc2UgZm9yXG4gICAqIHRoYXQgc2NvcGUgdG8gdGhyb3csIHRob3VnaCB0aGUgc2NvcGUgd2lsbCBub3QgZWZmZWN0aXZlbHkgZ2V0IGNhbmNlbGxlZCAoaS5lLiBgY29uc2lkZXJlZENhbmNlbGxlZGAgd2lsbCBzdGlsbFxuICAgKiByZXR1cm4gYGZhbHNlYCwgYW5kIGNhbmNlbGxhdGlvbiB3aWxsIG5vdCBiZSBwcm9wYWdhdGVkIHRvIGNoaWxkIHNjb3BlcyBhbmQgY29udGFpbmVkIG9wZXJhdGlvbnMpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbmNlbFJlcXVlc3RlZDogUHJvbWlzZTxuZXZlcj47XG5cbiAgI2NhbmNlbFJlcXVlc3RlZCA9IGZhbHNlO1xuXG4gIC8vIFR5cGVzY3JpcHQgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGF0IHRoZSBQcm9taXNlIGV4ZWN1dG9yIHJ1bnMgc3luY2hyb25vdXNseSBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHByb3RlY3RlZCByZWFkb25seSByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IENhbmNlbGxhdGlvblNjb3BlT3B0aW9ucykge1xuICAgIHRoaXMudGltZW91dCA9IG1zT3B0aW9uYWxUb051bWJlcihvcHRpb25zPy50aW1lb3V0KTtcbiAgICB0aGlzLmNhbmNlbGxhYmxlID0gb3B0aW9ucz8uY2FuY2VsbGFibGUgPz8gdHJ1ZTtcbiAgICB0aGlzLmNhbmNlbFJlcXVlc3RlZCA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVFNDIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoZSBQcm9taXNlIGV4ZWN1dG9yIHJ1bnMgc3luY2hyb25vdXNseVxuICAgICAgdGhpcy5yZWplY3QgPSAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICB1bnRyYWNrUHJvbWlzZSh0aGlzLmNhbmNlbFJlcXVlc3RlZCk7XG4gICAgLy8gQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbnNcbiAgICB1bnRyYWNrUHJvbWlzZSh0aGlzLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgICBpZiAob3B0aW9ucz8ucGFyZW50ICE9PSBOT19QQVJFTlQpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gb3B0aW9ucz8ucGFyZW50IHx8IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsbGFibGUgfHxcbiAgICAgICAgKHRoaXMucGFyZW50LiNjYW5jZWxSZXF1ZXN0ZWQgJiZcbiAgICAgICAgICAhZ2V0QWN0aXZhdG9yKCkuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgPSB0aGlzLnBhcmVudC4jY2FuY2VsUmVxdWVzdGVkO1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmICghZ2V0QWN0aXZhdG9yKCkuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKSkge1xuICAgICAgICAgICAgICB0aGlzLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNjb3BlIHdhcyBlZmZlY3RpdmVseSBjYW5jZWxsZWQuIEEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGNhbiBuZXZlciBiZSBjb25zaWRlcmVkIGNhbmNlbGxlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uc2lkZXJlZENhbmNlbGxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2FuY2VsUmVxdWVzdGVkICYmIHRoaXMuY2FuY2VsbGFibGU7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHNjb3BlIGFzIGN1cnJlbnQgYW5kIHJ1biAgYGZuYFxuICAgKlxuICAgKiBBbnkgdGltZXJzLCBBY3Rpdml0aWVzLCBUcmlnZ2VycyBhbmQgQ2FuY2VsbGF0aW9uU2NvcGVzIGNyZWF0ZWQgaW4gdGhlIGJvZHkgb2YgYGZuYFxuICAgKiBhdXRvbWF0aWNhbGx5IGxpbmsgdGhlaXIgY2FuY2VsbGF0aW9uIHRvIHRoaXMgc2NvcGUuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBgZm5gXG4gICAqL1xuICBydW48VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gc3RvcmFnZS5ydW4odGhpcywgdGhpcy5ydW5JbkNvbnRleHQuYmluZCh0aGlzLCBmbikgYXMgKCkgPT4gUHJvbWlzZTxUPik7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRoYXQgcnVucyBhIGZ1bmN0aW9uIGluIEFzeW5jTG9jYWxTdG9yYWdlIGNvbnRleHQuXG4gICAqXG4gICAqIENvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGFzIGFub255bW91cyBmdW5jdGlvbiwgbWFkZSBpbnRvIGEgbWV0aG9kIGZvciBpbXByb3ZlZCBzdGFjayB0cmFjZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcnVuSW5Db250ZXh0PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHRpbWVyU2NvcGU6IENhbmNlbGxhdGlvblNjb3BlIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIHRpbWVyU2NvcGUgPSBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICB0aW1lclNjb3BlXG4gICAgICAgICAgLnJ1bigoKSA9PiBzbGVlcCh0aGlzLnRpbWVvdXQgYXMgbnVtYmVyKSlcbiAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICgpID0+IHRoaXMuY2FuY2VsKCksXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHNjb3BlIHdhcyBhbHJlYWR5IGNhbmNlbGxlZCwgaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRpbWVyU2NvcGUgJiZcbiAgICAgICAgIXRpbWVyU2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCAmJlxuICAgICAgICBnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgdGltZXJTY29wZS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0byBjYW5jZWwgdGhlIHNjb3BlIGFuZCBsaW5rZWQgY2hpbGRyZW5cbiAgICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChuZXcgQ2FuY2VsbGVkRmFpbHVyZSgnQ2FuY2VsbGF0aW9uIHNjb3BlIGNhbmNlbGxlZCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgXCJhY3RpdmVcIiBzY29wZVxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKTogQ2FuY2VsbGF0aW9uU2NvcGUge1xuICAgIC8vIFVzaW5nIGdsb2JhbHMgZGlyZWN0bHkgaW5zdGVhZCBvZiBhIGhlbHBlciBmdW5jdGlvbiB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRcbiAgICByZXR1cm4gc3RvcmFnZS5nZXRTdG9yZSgpID8/IChnbG9iYWxUaGlzIGFzIGFueSkuX19URU1QT1JBTF9BQ1RJVkFUT1JfXy5yb290U2NvcGU7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyBjYW5jZWxsYWJsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiB0cnVlIH0pLnJ1bihmbik7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiBmYWxzZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgbm9uQ2FuY2VsbGFibGU8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogZmFsc2UgfSkucnVuKGZuKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUsIHRpbWVvdXQgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIHdpdGhUaW1lb3V0PFQ+KHRpbWVvdXQ6IER1cmF0aW9uLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiB0cnVlLCB0aW1lb3V0IH0pLnJ1bihmbik7XG4gIH1cbn1cblxuY29uc3Qgc3RvcmFnZTogQUxTPENhbmNlbGxhdGlvblNjb3BlPiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuXG5leHBvcnQgY2xhc3MgUm9vdENhbmNlbGxhdGlvblNjb3BlIGV4dGVuZHMgQ2FuY2VsbGF0aW9uU2NvcGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7IGNhbmNlbGxhYmxlOiB0cnVlLCBwYXJlbnQ6IE5PX1BBUkVOVCB9KTtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChuZXcgQ2FuY2VsbGVkRmFpbHVyZSgnV29ya2Zsb3cgY2FuY2VsbGVkJykpO1xuICB9XG59XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhpcyBtb2R1bGUgYW5kIHdvcmtmbG93LnRzICovXG5sZXQgc2xlZXAgPSAoXzogRHVyYXRpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBoYXMgbm90IGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclNsZWVwSW1wbGVtZW50YXRpb24oZm46IHR5cGVvZiBzbGVlcCk6IHZvaWQge1xuICBzbGVlcCA9IGZuO1xufVxuIiwiaW1wb3J0IHsgQWN0aXZpdHlGYWlsdXJlLCBDYW5jZWxsZWRGYWlsdXJlLCBDaGlsZFdvcmtmbG93RmFpbHVyZSwgTmV4dXNPcGVyYXRpb25GYWlsdXJlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCB3b3JrZmxvdyBlcnJvcnNcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd0Vycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Vycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBUaHJvd24gaW4gd29ya2Zsb3cgd2hlbiBpdCB0cmllcyB0byBkbyBzb21ldGhpbmcgdGhhdCBub24tZGV0ZXJtaW5pc3RpYyBzdWNoIGFzIGNvbnN0cnVjdCBhIFdlYWtSZWYoKVxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0RldGVybWluaXNtVmlvbGF0aW9uRXJyb3InKVxuZXhwb3J0IGNsYXNzIERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHt9XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGFjdHMgYXMgYSBtYXJrZXIgZm9yIHRoaXMgc3BlY2lhbCByZXN1bHQgdHlwZVxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0xvY2FsQWN0aXZpdHlEb0JhY2tvZmYnKVxuZXhwb3J0IGNsYXNzIExvY2FsQWN0aXZpdHlEb0JhY2tvZmYgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBiYWNrb2ZmOiBjb3Jlc2RrLmFjdGl2aXR5X3Jlc3VsdC5JRG9CYWNrb2ZmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBwcm92aWRlZCBgZXJyYCBpcyBjYXVzZWQgYnkgY2FuY2VsbGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbmNlbGxhdGlvbihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBlcnIgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlIHx8XG4gICAgKChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgTmV4dXNPcGVyYXRpb25GYWlsdXJlKSAmJlxuICAgICAgZXJyLmNhdXNlIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHR5cGUgU2RrRmxhZyA9IHtcbiAgZ2V0IGlkKCk6IG51bWJlcjtcbiAgZ2V0IGRlZmF1bHQoKTogYm9vbGVhbjtcbiAgZ2V0IGFsdGVybmF0aXZlQ29uZGl0aW9ucygpOiBBbHRDb25kaXRpb25GbltdIHwgdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZmxhZ3NSZWdpc3RyeTogTWFwPG51bWJlciwgU2RrRmxhZz4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBTZGtGbGFncyA9IHtcbiAgLyoqXG4gICAqIFRoaXMgZmxhZyBnYXRlcyBtdWx0aXBsZSBmaXhlcyByZWxhdGVkIHRvIGNhbmNlbGxhdGlvbiBzY29wZXMgYW5kIHRpbWVycyBpbnRyb2R1Y2VkIGluIDEuMTAuMi8xLjExLjA6XG4gICAqIC0gQ2FuY2VsbGF0aW9uIG9mIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG5vIGxvbmdlciBwcm9wYWdhdGVzIHRvIGNoaWxkcmVuIHNjb3Blc1xuICAgKiAgIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbXBvcmFsaW8vc2RrLXR5cGVzY3JpcHQvaXNzdWVzLzE0MjMpLlxuICAgKiAtIENhbmNlbGxhdGlvblNjb3BlLndpdGhUaW1lb3V0KGZuKSBub3cgY2FuY2VsIHRoZSB0aW1lciBpZiBgZm5gIGNvbXBsZXRlcyBiZWZvcmUgZXhwaXJhdGlvblxuICAgKiAgIG9mIHRoZSB0aW1lb3V0LCBzaW1pbGFyIHRvIGhvdyBgY29uZGl0aW9uKGZuLCB0aW1lb3V0KWAgd29ya3MuXG4gICAqIC0gVGltZXJzIGNyZWF0ZWQgdXNpbmcgc2V0VGltZW91dCBjYW4gbm93IGJlIGludGVyY2VwdGVkLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEwLjIvMS4xMS4wLiBIb3dldmVyLCBkdWUgdG8gYW4gU0RLIGJ1ZywgU0RLcyB2MS4xMS4wIGFuZCB2MS4xMS4xIHdlcmUgbm90XG4gICAqICAgICAgICBwcm9wZXJseSB3cml0aW5nIGJhY2sgdGhlIGZsYWdzIHRvIGhpc3RvcnksIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBOREUgb24gcmVwbGF5LiBXZSB0aGVyZWZvcmVcbiAgICogICAgICAgIGNvbnNpZGVyIHRoYXQgYSBXRlQgZW1pdHRlZCBieSBXb3JrZXIgdjEuMTEuMCBvciB2MS4xMS4xIHRvIGltcGxpY2l0bHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBOb25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uOiBkZWZpbmVGbGFnKDEsIHRydWUsIFtidWlsZElkU2RrVmVyc2lvbk1hdGNoZXMoLzFcXC4xMVxcLlswMV0vKV0pLFxuXG4gIC8qKlxuICAgKiBQcmlvciB0byAxLjExLjAsIHdoZW4gcHJvY2Vzc2luZyBhIFdvcmtmbG93IGFjdGl2YXRpb24sIHRoZSBTREsgd291bGQgZXhlY3V0ZSBgbm90aWZ5SGFzUGF0Y2hgXG4gICAqIGFuZCBgc2lnbmFsV29ya2Zsb3dgIGpvYnMgaW4gZGlzdGluY3QgcGhhc2VzLCBiZWZvcmUgb3RoZXIgdHlwZXMgb2Ygam9icy4gVGhlIHByaW1hcnkgcmVhc29uXG4gICAqIGJlaGluZCB0aGF0IG11bHRpLXBoYXNlIGFsZ29yaXRobSB3YXMgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYSBXb3JrZmxvdyBleGVjdXRpb24gbWlnaHRcbiAgICogY29tcGxldGUgYmVmb3JlIGFsbCBpbmNvbWluZyBzaWduYWxzIGhhdmUgYmVlbiBkaXNwYXRjaGVkIChhdCBsZWFzdCB0byB0aGUgcG9pbnQgdGhhdCB0aGVcbiAgICogX3N5bmNocm9ub3VzXyBwYXJ0IG9mIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkKS5cbiAgICpcbiAgICogVGhpcyBmbGFnIHJlcGxhY2VzIHRoYXQgbXVsdGktcGhhc2UgYWxnb3JpdGhtIHdpdGggYSBzaW1wbGVyIG9uZSB3aGVyZSBqb2JzIGFyZSBzaW1wbHkgc29ydGVkIGFzXG4gICAqIGAoc2lnbmFscyBhbmQgdXBkYXRlcykgLT4gb3RoZXJzYCwgYnV0IHdpdGhvdXQgcHJvY2Vzc2luZyB0aGVtIGFzIGRpc3RpbmN0IGJhdGNoZXMgKGkuZS4gd2l0aG91dFxuICAgKiBsZWF2aW5nL3JlZW50ZXJpbmcgdGhlIFZNIGNvbnRleHQgYmV0d2VlbiBlYWNoIGdyb3VwLCB3aGljaCBhdXRvbWF0aWNhbGx5IHRyaWdnZXJzIHRoZSBleGVjdXRpb25cbiAgICogb2YgYWxsIG91dHN0YW5kaW5nIG1pY3JvdGFza3MpLiBUaGF0IHNpbmdsZS1waGFzZSBhcHByb2FjaCByZXNvbHZlcyBhIG51bWJlciBvZiBxdWlya3Mgb2YgdGhlXG4gICAqIGZvcm1lciBhbGdvcml0aG0sIGFuZCB5ZXQgc3RpbGwgc2F0aXNmaWVzIHRvIHRoZSBvcmlnaW5hbCByZXF1aXJlbWVudCBvZiBlbnN1cmluZyB0aGF0IGV2ZXJ5XG4gICAqIGBzaWduYWxXb3JrZmxvd2Agam9icyAtIGFuZCBub3cgYGRvVXBkYXRlYCBqb2JzIGFzIHdlbGwgLSBoYXZlIGJlZW4gZ2l2ZW4gYSBwcm9wZXIgY2hhbmNlIHRvXG4gICAqIGV4ZWN1dGUgYmVmb3JlIHRoZSBXb3JrZmxvdyBtYWluIGZ1bmN0aW9uIG1pZ2h0IGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMS4wLiBUaGlzIGNoYW5nZSBpcyBub3Qgcm9sbGJhY2stc2FmZS4gSG93ZXZlciwgZHVlIHRvIGFuIFNESyBidWcsIFNES3NcbiAgICogICAgICAgIHYxLjExLjAgYW5kIHYxLjExLjEgd2VyZSBub3QgcHJvcGVybHkgd3JpdGluZyBiYWNrIHRoZSBmbGFncyB0byBoaXN0b3J5LCBwb3NzaWJseSByZXN1bHRpbmdcbiAgICogICAgICAgIGluIE5ERSBvbiByZXBsYXkuIFdlIHRoZXJlZm9yZSBjb25zaWRlciB0aGF0IGEgV0ZUIGVtaXR0ZWQgYnkgV29ya2VyIHYxLjExLjAgb3IgdjEuMTEuMVxuICAgKiAgICAgICAgdG8gaW1wbGljaXRlbHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBQcm9jZXNzV29ya2Zsb3dBY3RpdmF0aW9uSm9ic0FzU2luZ2xlQmF0Y2g6IGRlZmluZUZsYWcoMiwgdHJ1ZSwgW2J1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcygvMVxcLjExXFwuWzAxXS8pXSksXG5cbiAgLyoqXG4gICAqIEluIDEuMTEuNSB0aGUgYGhhbmRsZVNpZ25hbGAgaW50ZXJjZXB0b3Igd2FzIGFkZGVkIHRvIEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5XG4gICAqIHdoaWNoIGFkZGVkIGEgeWllbGQgcG9pbnQuIFRoZSBhZGRlZCB5aWVsZCBwb2ludCBjYW4gY2F1c2UgTkRFIGlmIHRoZXJlIHdhcyBhIHNpZ25hbCBoYW5kbGVyIGFuZFxuICAgKiB0aGUgd29ya2Zsb3cgd2FzIHN0YXJ0ZWQgd2l0aCBhIHNpZ25hbC5cbiAgICpcbiAgICogVGhpcyB5aWVsZCBwb2ludCB3YXMgcmVtb3ZlZCBpbiAxLjEzLjIsIGJ1dCBpbiBvcmRlciB0byBwcmV2ZW50IHdvcmtmbG93cyBmcm9tIHRoZVxuICAgKiBhZmZlY3RlZCB2ZXJzaW9ucyByZXN1bHRpbmcgaW4gTkRFLCB3ZSBoYXZlIHRvIGluamVjdCB0aGUgeWllbGQgcG9pbnQgb24gcmVwbGF5LlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjIuXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzVHJhY2VzSW5ib3VuZFNpZ25hbHM6IGRlZmluZUZsYWcoMywgdHJ1ZSwgW2lzQXRMZWFzdCh7IG1ham9yOiAxLCBtaW5vcjogMTEsIHBhdGNoOiA1IH0pXSksXG5cbiAgLyoqXG4gICAqIEluIDEuMTEuNiwgdGhlIGBzY2hlZHVsZUxvY2FsQWN0aXZpdHlgIGludGVyY2VwdG9yIHdhcyBhZGRlZCB0b1xuICAgKiBgQHRlbXBvcmFsaW8vaW50ZXJjZXB0b3JzLW9wZW50ZWxlbWV0cnlgIHdoaWNoIGFkZGVkIGEgeWllbGQgcG9pbnQgdG8gdGhlXG4gICAqIG91dGJvdW5kIGludGVyY2VwdG9yLiBUaGlzIHlpZWxkIHBvaW50IHdhcyByZW1vdmVkIGluIDEuMTMuMi5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzVHJhY2VzTG9jYWxBY3Rpdml0aWVzOiBkZWZpbmVGbGFnKDQsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDExLCBwYXRjaDogNiB9KV0pLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJjZXB0b3JzIHByb3ZpZGVkIGJ5IEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5IGluaXRpYWxseSBoYWQgdW5uZWNlc3NhcnlcbiAgICogeWllbGQgcG9pbnRzIG9uIGNhbGxpbmcgdG8gYGV4dHJhY3RDb250ZXh0RnJvbUhlYWRlcnNgLlxuICAgKiBJZiByZXBsYXlpbmcgYSB3b3JrZmxvdyBjcmVhdGVkIGZyb20gdGhlc2UgdmVyc2lvbnMgYSB5aWVsZCBwb2ludCBpcyBpbmplY3RlZCB0byBwcmV2ZW50IGFueSBOREUuXG4gICAqXG4gICAqIElmIHRoZSBoaXN0b3J5IGRvZXMgbm90IGluY2x1ZGUgdGhlIFNESyB2ZXJzaW9uLCBkZWZhdWx0IHRvIGV4dHJhIHlpZWxkcyBzaW5jZSB0aGUgeWllbGRzIHdlcmUgcHJlc2VudCBzaW5jZSB0aGUgT1RFTFxuICAgKiBwYWNrYWdlIHdhcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjJcbiAgICovXG4gIE9wZW5UZWxlbWV0cnlJbnRlcmNlcG9yc0F2b2lkc0V4dHJhWWllbGRzOiBkZWZpbmVGbGFnKDUsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDEzLCBwYXRjaDogMiB9KV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjEzLjMsIGFsbCByZW1haW5pbmcgaW50ZXJjZXB0b3IgbWV0aG9kcyB3ZXJlIGltcGxlbWVudGVkIGluIEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5XG4gICAqIGluY2x1ZGluZyBgaGFuZGxlVXBkYXRlYCwgYHZhbGlkYXRlVXBkYXRlYCwgYGhhbmRsZVF1ZXJ5YCwgYHN0YXJ0VGltZXJgLCBhbmQgYHN0YXJ0TmV4dXNPcGVyYXRpb25gLlxuICAgKiBUaGVzZSBhZGQgaW5zdHJ1bWVudGF0aW9uIGFuZCB5aWVsZCBwb2ludHMgdGhhdCB3ZXJlIG5vdCBwcmVzZW50IGluIGVhcmxpZXIgdmVyc2lvbnMuXG4gICAqIFRoaXMgZmxhZyBnYXRlcyB0aGVzZSBuZXcgaW50ZXJjZXB0b3IgbWV0aG9kcyB0byBwcmV2ZW50IE5ERSBvbiByZXBsYXkgb2Ygd29ya2Zsb3dzIGZyb20gZWFybGllciB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4zXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzSW5zdHJ1bWVudHNBbGxNZXRob2RzOiBkZWZpbmVGbGFnKDYsIHRydWUpLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZGVmaW5lRmxhZyhpZDogbnVtYmVyLCBkZWY6IGJvb2xlYW4sIGFsdGVybmF0aXZlQ29uZGl0aW9ucz86IEFsdENvbmRpdGlvbkZuW10pOiBTZGtGbGFnIHtcbiAgY29uc3QgZmxhZyA9IHsgaWQsIGRlZmF1bHQ6IGRlZiwgYWx0ZXJuYXRpdmVDb25kaXRpb25zIH07XG4gIGZsYWdzUmVnaXN0cnkuc2V0KGlkLCBmbGFnKTtcbiAgcmV0dXJuIGZsYWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZEZsYWcoaWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWZsYWdzUmVnaXN0cnkuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBTREsgZmxhZzogJHtpZH1gKTtcbn1cblxuLyoqXG4gKiBBbiBTREsgRmxhZyBBbHRlcm5hdGUgQ29uZGl0aW9uIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgZmxhZ1xuICogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV0ZUOyBlLmcuIGJ5IGxvb2tpbmcgYXQgdGhlIHZlcnNpb24gb2YgdGhlIFNES1xuICogdGhhdCBlbWl0dGVkIGEgV0ZULiBUaGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byByZXRyb2FjdGl2ZWx5IHR1cm4gb24gc29tZSBmbGFncyBmb3IgV0ZUXG4gKiBlbWl0dGVkIGJ5IHByZXZpb3VzIFNES3MgdGhhdCBjb250YWluZWQgYSBidWcuXG4gKlxuICogTm90ZSB0aGF0IGNvbmRpdGlvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIHdoaWxlIHJlcGxheWluZywgYW5kIG9ubHkgaWYgdGhlIGNvcnJlc3BvbmluZyBmbGFnIGlzXG4gKiBub3QgYWxyZWFkeSBzZXQuIEFsc28sIGFsdGVybmF0ZSBjb25kaXRpb25zIHdpbGwgbm90IGNhdXNlIHRoZSBmbGFnIHRvIGJlIHBlcnNpc3RlZCB0byB0aGVcbiAqIFwidXNlZCBmbGFnc1wiIHNldCwgd2hpY2ggbWVhbnMgdGhhdCBmdXJ0aGVyIFdvcmtmbG93IFRhc2tzIG1heSBub3QgcmVmbGVjdCB0aGlzIGZsYWcgaWYgdGhlXG4gKiBjb25kaXRpb24gbm8gbG9uZ2VyIGhvbGRzLiBUaGlzIGlzIHNvIHRvIGF2b2lkIGluY29ycmVjdCBiZWhhdmlvcnMgaW4gY2FzZSB3aGVyZSBhIFdvcmtmbG93XG4gKiBFeGVjdXRpb24gaGFzIGdvbmUgdGhyb3VnaCBhIG5ld2VyIFNESyB2ZXJzaW9uIHRoZW4gYWdhaW4gdGhyb3VnaCBhbiBvbGRlciBvbmUuXG4gKi9cbnR5cGUgQWx0Q29uZGl0aW9uRm4gPSAoY3R4OiB7IGluZm86IFdvcmtmbG93SW5mbzsgc2RrVmVyc2lvbj86IHN0cmluZyB9KSA9PiBib29sZWFuO1xuXG5mdW5jdGlvbiBidWlsZElkU2RrVmVyc2lvbk1hdGNoZXModmVyc2lvbjogUmVnRXhwKTogQWx0Q29uZGl0aW9uRm4ge1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF5AdGVtcG9yYWxpby93b3JrZXJAKCR7dmVyc2lvbi5zb3VyY2V9KVsrXWApO1xuICByZXR1cm4gKHsgaW5mbyB9KSA9PiBpbmZvLmN1cnJlbnRCdWlsZElkICE9IG51bGwgJiYgcmVnZXgudGVzdChpbmZvLmN1cnJlbnRCdWlsZElkKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxufVxuXG50eXBlIFNlbVZlciA9IHtcbiAgbWFqb3I6IG51bWJlcjtcbiAgbWlub3I6IG51bWJlcjtcbiAgcGF0Y2g6IG51bWJlcjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBgQWx0Q29uZGl0aW9uRm5gIHRoYXQgY2hlY2tzIGlmIHRoZSBTREsgdmVyc2lvbiBpcyBlcXVhbCB0byBvciBhZnRlciB0aGUgcHJvdmlkZWQgdmVyc2lvbi5cbiAqIEFuIG9wdGlvbmFsIGRlZmF1bHQgY2FuIGJlIHByb3ZpZGVkIGluIGNhc2UgdGhlIFNESyB2ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIGlzQXRMZWFzdChjb21wYXJlOiBTZW1WZXIsIG1pc3NpbmdEZWZhdWx0PzogYm9vbGVhbik6IEFsdENvbmRpdGlvbkZuIHtcbiAgcmV0dXJuIChjdHgpID0+IHtcbiAgICByZXR1cm4gaXNDb21wYXJlZChjb21wYXJlLCAtMSwgbWlzc2luZ0RlZmF1bHQpKGN0eCkgfHwgaXNDb21wYXJlZChjb21wYXJlLCAwLCBtaXNzaW5nRGVmYXVsdCkoY3R4KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNDb21wYXJlZChjb21wYXJlOiBTZW1WZXIsIGNvbXBhcmlzb246IC0xIHwgMCB8IDEsIG1pc3NpbmdEZWZhdWx0OiBib29sZWFuID0gZmFsc2UpOiBBbHRDb25kaXRpb25GbiB7XG4gIHJldHVybiAoeyBzZGtWZXJzaW9uIH0pID0+IHtcbiAgICBpZiAoIXNka1ZlcnNpb24pIHJldHVybiBtaXNzaW5nRGVmYXVsdDtcbiAgICBjb25zdCB2ZXJzaW9uID0gcGFyc2VTZW12ZXIoc2RrVmVyc2lvbik7XG4gICAgaWYgKCF2ZXJzaW9uKSByZXR1cm4gbWlzc2luZ0RlZmF1bHQ7XG4gICAgcmV0dXJuIGNvbXBhcmVTZW12ZXIoY29tcGFyZSwgdmVyc2lvbikgPT09IGNvbXBhcmlzb247XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2VtdmVyKHZlcnNpb246IHN0cmluZyk6IFNlbVZlciB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgW18sIG1ham9yLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvbi5tYXRjaCgvKFxcZCspXFwuKFxcZCspXFwuKFxcZCspLykhO1xuICAgIHJldHVybiB7XG4gICAgICBtYWpvcjogTnVtYmVyLnBhcnNlSW50KG1ham9yISksXG4gICAgICBtaW5vcjogTnVtYmVyLnBhcnNlSW50KG1pbm9yISksXG4gICAgICBwYXRjaDogTnVtYmVyLnBhcnNlSW50KHBhdGNoISksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlU2VtdmVyKGE6IFNlbVZlciwgYjogU2VtVmVyKTogLTEgfCAwIHwgMSB7XG4gIGlmIChhLm1ham9yIDwgYi5tYWpvcikgcmV0dXJuIC0xO1xuICBpZiAoYS5tYWpvciA+IGIubWFqb3IpIHJldHVybiArMTtcbiAgaWYgKGEubWlub3IgPCBiLm1pbm9yKSByZXR1cm4gLTE7XG4gIGlmIChhLm1pbm9yID4gYi5taW5vcikgcmV0dXJuICsxO1xuICBpZiAoYS5wYXRjaCA8IGIucGF0Y2gpIHJldHVybiAtMTtcbiAgaWYgKGEucGF0Y2ggPiBiLnBhdGNoKSByZXR1cm4gKzE7XG4gIHJldHVybiAwO1xufVxuIiwiaW1wb3J0IHsgSWxsZWdhbFN0YXRlRXJyb3IsIHR5cGUgV29ya2Zsb3cgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAvLyBUaGUgX19URU1QT1JBTF9fIG9iamVjdCB3aWxsIGJlIGFzc2lnbmVkIGJ5IFdlYnBhY2sgdG8gdGhlIGV4cG9ydHMgb2YgdGhlIGVudHJ5cG9pbnQgbW9kdWxlXG4gIC8vIGZpbGUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBidW5kbGVyIChzZWUgd29ya2Zsb3cvYnVuZGxlci50cyNnZW5FbnRyeXBvaW50KCkpLlxuICAvL1xuICAvLyBGSVhNRTogUmVuYW1lIHRvIGxvd2VyY2FzZSBzeW50YXggYmVmb3JlIDEuMTUuMC4gSSBwcmVzZXJ2ZWQgdGhlIHVwcGVyY2FzZSBuYW1lIGZvciBiYWNrd2FyZFxuICAvLyBjb21wYXRpYmlsaXR5IHdpdGggYnVuZGxlcyBnZW5lcmF0ZWQgYnkgMS4xNC4wLiBXZSBnZW5lcmFsbHkgZG8gbm90IGd1YXJhbnRlZSBjb21wYXRpYmlsaXR5IG9mXG4gIC8vIGJ1bmRsZXMgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIFNESywgYnV0IGluIHRoaXMgc3BlY2lmaWMgY2FzZSwgdGhlcmUncyByZWFsbHkgbm9cbiAgLy8gdXNlci1zaWRlIHZhbHVlIGluIHJlbmFtaW5nIHRoaXMsIHNvIG1ha2luZyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgdGhhdCB3b3VsZCBub3QgYmUganVzdGlmaWVkLlxuICAvL1xuXG4gIHZhciBfX1RFTVBPUkFMX186IHtcbiAgICBhcGk6IHR5cGVvZiBpbXBvcnQoJy4vd29ya2VyLWludGVyZmFjZS50cycpO1xuICAgIHByZWxvYWRNb2R1bGVzPzogKCkgPT4gdm9pZDtcbiAgICBpbXBvcnRXb3JrZmxvd3M6ICgpID0+IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PjtcbiAgICBpbXBvcnRJbnRlcmNlcHRvcnM6ICgpID0+IFt7IGludGVyY2VwdG9yczogV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH1dO1xuICB9O1xuXG4gIC8vIERlc3RydWN0b3JzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzaGFyZWQgc2FuZGJveCBpcyBkZXN0cm95ZWQuXG5cbiAgdmFyIF9fdGVtcG9yYWxfZ2xvYmFsU2FuZGJveERlc3RydWN0b3JzOiAoKCkgPT4gdm9pZClbXSB8IHVuZGVmaW5lZDtcblxuICAvLyBGSVhNRTogUmVuYW1lIHRvIGxvd2VyY2FzZSBzeW50YXggYmVmb3JlIDEuMTUuMC5cblxuICB2YXIgX19URU1QT1JBTF9BQ1RJVkFUT1JfXzogQWN0aXZhdG9yIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aXZhdG9yKGFjdGl2YXRvcjogQWN0aXZhdG9yIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGdsb2JhbFRoaXMuX19URU1QT1JBTF9BQ1RJVkFUT1JfXyA9IGFjdGl2YXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlR2V0QWN0aXZhdG9yKCk6IEFjdGl2YXRvciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnbG9iYWxUaGlzLl9fVEVNUE9SQUxfQUNUSVZBVE9SX187XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbldvcmtmbG93Q29udGV4dCh1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlOiBzdHJpbmcpOiBBY3RpdmF0b3Ige1xuICBjb25zdCBhY3RpdmF0b3IgPSBtYXliZUdldEFjdGl2YXRvcigpO1xuICBpZiAoYWN0aXZhdG9yID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcih1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlKTtcbiAgcmV0dXJuIGFjdGl2YXRvcjtcbn1cblxuLy8gVGhpcyBpcyByZWFsbHkganVzdCBhbiBhbGlhcyBmb3IgYGFzc2VydEluV29ya2Zsb3dDb250ZXh0YCB3aXRoIGEgZGVmYXVsdCBlcnJvciBtZXNzYWdlLFxuLy8gYmVjYXVzZSB0aGF0IG5hbWUgYmV0dGVyIGNvbnZleXMgdGhlIGludGVudCBpbiBzb21lIHZlcnkgY29tbW9uIHVzZSBjYXNlcy5cbmV4cG9ydCBjb25zdCBnZXRBY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dC5iaW5kKG51bGwsICdXb3JrZmxvdyB1bmluaXRpYWxpemVkJyk7XG4iLCIvKipcbiAqIE92ZXJyaWRlcyBzb21lIGdsb2JhbCBvYmplY3RzIHRvIG1ha2UgdGhlbSBkZXRlcm1pbmlzdGljLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgbXNUb1RzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgU2RrRmxhZ3MgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi93b3JrZmxvdyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXMgYXMgYW55O1xuY29uc3QgT3JpZ2luYWxEYXRlID0gZ2xvYmFsVGhpcy5EYXRlO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVHbG9iYWxzKCk6IHZvaWQge1xuICAvLyBNb2NrIGFueSB3ZWFrIHJlZmVyZW5jZSBiZWNhdXNlIEdDIGlzIG5vbi1kZXRlcm1pbmlzdGljIGFuZCB0aGUgZWZmZWN0IGlzIG9ic2VydmFibGUgZnJvbSB0aGUgV29ya2Zsb3cuXG4gIC8vIFdvcmtmbG93IGRldmVsb3BlciB3aWxsIGdldCBhIG1lYW5pbmdmdWwgZXhjZXB0aW9uIGlmIHRoZXkgdHJ5IHRvIHVzZSB0aGVzZS5cbiAgZ2xvYmFsLldlYWtSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoJ1dlYWtSZWYgY2Fubm90IGJlIHVzZWQgaW4gV29ya2Zsb3dzIGJlY2F1c2UgdjggR0MgaXMgbm9uLWRldGVybWluaXN0aWMnKTtcbiAgfTtcbiAgZ2xvYmFsLkZpbmFsaXphdGlvblJlZ2lzdHJ5ID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKFxuICAgICAgJ0ZpbmFsaXphdGlvblJlZ2lzdHJ5IGNhbm5vdCBiZSB1c2VkIGluIFdvcmtmbG93cyBiZWNhdXNlIHY4IEdDIGlzIG5vbi1kZXRlcm1pbmlzdGljJ1xuICAgICk7XG4gIH07XG5cbiAgZ2xvYmFsLkRhdGUgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIG5ldyAoT3JpZ2luYWxEYXRlIGFzIGFueSkoLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT3JpZ2luYWxEYXRlKGdldEFjdGl2YXRvcigpLm5vdyk7XG4gIH07XG5cbiAgZ2xvYmFsLkRhdGUubm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRBY3RpdmF0b3IoKS5ub3c7XG4gIH07XG5cbiAgZ2xvYmFsLkRhdGUucGFyc2UgPSBPcmlnaW5hbERhdGUucGFyc2UuYmluZChPcmlnaW5hbERhdGUpO1xuICBnbG9iYWwuRGF0ZS5VVEMgPSBPcmlnaW5hbERhdGUuVVRDLmJpbmQoT3JpZ2luYWxEYXRlKTtcblxuICBnbG9iYWwuRGF0ZS5wcm90b3R5cGUgPSBPcmlnaW5hbERhdGUucHJvdG90eXBlO1xuXG4gIGNvbnN0IHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMgPSBuZXcgTWFwPG51bWJlciwgQ2FuY2VsbGF0aW9uU2NvcGU+KCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtcyBzbGVlcCBkdXJhdGlvbiAtICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBJZiBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlciwgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMS5cbiAgICovXG4gIGdsb2JhbC5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKGNiOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgbXM6IG51bWJlciwgLi4uYXJnczogYW55W10pOiBudW1iZXIge1xuICAgIG1zID0gTWF0aC5tYXgoMSwgbXMpO1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgIGlmIChhY3RpdmF0b3IuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKSkge1xuICAgICAgLy8gQ2FwdHVyZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgc2xlZXAgd2lsbCBhbGxvY2F0ZVxuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyO1xuICAgICAgY29uc3QgdGltZXJTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgc2xlZXBQcm9taXNlID0gdGltZXJTY29wZS5ydW4oKCkgPT4gc2xlZXAobXMpKTtcbiAgICAgIHNsZWVwUHJvbWlzZS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgICBjYiguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMuZGVsZXRlKHNlcSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzbGVlcFByb21pc2UpO1xuICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5zZXQoc2VxLCB0aW1lclNjb3BlKTtcbiAgICAgIHJldHVybiBzZXE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrO1xuICAgICAgLy8gQ3JlYXRlIGEgUHJvbWlzZSBmb3IgQXN5bmNMb2NhbFN0b3JhZ2UgdG8gYmUgYWJsZSB0byB0cmFjayB0aGlzIGNvbXBsZXRpb24gdXNpbmcgcHJvbWlzZSBob29rcy5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLnNldChzZXEsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgIHN0YXJ0VGltZXI6IHtcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKG1zKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRoZW4oXG4gICAgICAgICgpID0+IGNiKC4uLmFyZ3MpLFxuICAgICAgICAoKSA9PiB1bmRlZmluZWQgLyogaWdub3JlIGNhbmNlbGxhdGlvbiAqL1xuICAgICAgKTtcbiAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICB9O1xuXG4gIGdsb2JhbC5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoaGFuZGxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICBjb25zdCB0aW1lclNjb3BlID0gdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5nZXQoaGFuZGxlKTtcbiAgICBpZiAodGltZXJTY29wZSkge1xuICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoaGFuZGxlKTtcbiAgICAgIHRpbWVyU2NvcGUuY2FuY2VsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrOyAvLyBTaG91bGRuJ3QgaW5jcmVhc2Ugc2VxIG51bWJlciwgYnV0IHRoYXQncyB0aGUgbGVnYWN5IGJlaGF2aW9yXG4gICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuZGVsZXRlKGhhbmRsZSk7XG4gICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICBjYW5jZWxUaW1lcjoge1xuICAgICAgICAgIHNlcTogaGFuZGxlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGFjdGl2YXRvci5yYW5kb20gaXMgbXV0YWJsZSwgZG9uJ3QgaGFyZGNvZGUgaXRzIHJlZmVyZW5jZVxuICBNYXRoLnJhbmRvbSA9ICgpID0+IGdldEFjdGl2YXRvcigpLnJhbmRvbSgpO1xufVxuIiwiLyoqXG4gKiBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgdG9vbHMgcmVxdWlyZWQgZm9yIGF1dGhvcmluZyB3b3JrZmxvd3MuXG4gKlxuICogIyMgVXNhZ2VcbiAqIFNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2hlbGxvLXdvcmxkI3dvcmtmbG93cyB8IHR1dG9yaWFsfSBmb3Igd3JpdGluZyB5b3VyIGZpcnN0IHdvcmtmbG93LlxuICpcbiAqICMjIyBUaW1lcnNcbiAqXG4gKiBUaGUgcmVjb21tZW5kZWQgd2F5IG9mIHNjaGVkdWxpbmcgdGltZXJzIGlzIGJ5IHVzaW5nIHRoZSB7QGxpbmsgc2xlZXB9IGZ1bmN0aW9uLiBXZSd2ZSByZXBsYWNlZCBgc2V0VGltZW91dGAgYW5kXG4gKiBgY2xlYXJUaW1lb3V0YCB3aXRoIGRldGVybWluaXN0aWMgdmVyc2lvbnMgc28gdGhlc2UgYXJlIGFsc28gdXNhYmxlIGJ1dCBoYXZlIGEgbGltaXRhdGlvbiB0aGF0IHRoZXkgZG9uJ3QgcGxheSB3ZWxsXG4gKiB3aXRoIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzIHwgY2FuY2VsbGF0aW9uIHNjb3Blc30uXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNsZWVwIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcGVyKG1zID0gMTAwKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGF3YWl0IHNsZWVwKG1zKTtcbiAqICAgY29uc29sZS5sb2coJ3NsZXB0Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgQWN0aXZpdGllc1xuICpcbiAqIFRvIHNjaGVkdWxlIEFjdGl2aXRpZXMsIHVzZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSB0byBvYnRhaW4gYW4gQWN0aXZpdHkgZnVuY3Rpb24gYW5kIGNhbGwuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB0eXBlICogYXMgYWN0aXZpdGllcyBmcm9tICcuL2FjdGl2aXRpZXMnO1xuICpcbiAqIGNvbnN0IHsgc2VuZEVtYWlsIH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzEgbWludXRlJyxcbiAqIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FtcGxlV29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgc2VuZEVtYWlsKFwidG9AZXhhbXBsZS5jb21cIixcIkhlbGxvLCBUZW1wb3JhbCFcIik7XG59XG5cbiAqIGBgYFxuICogXG4gKiAjIyMgVXBkYXRlcywgU2lnbmFscyBhbmQgUXVlcmllc1xuICpcbiAqIFVzZSB7QGxpbmsgc2V0SGFuZGxlcn0gdG8gc2V0IGhhbmRsZXJzIGZvciBVcGRhdGVzLCBTaWduYWxzLCBhbmQgUXVlcmllcy5cbiAqXG4gKiBVcGRhdGUgYW5kIFNpZ25hbCBoYW5kbGVycyBjYW4gYmUgZWl0aGVyIGFzeW5jIG9yIG5vbi1hc3luYyBmdW5jdGlvbnMuIFVwZGF0ZSBoYW5kbGVycyBtYXkgcmV0dXJuIGEgdmFsdWUsIGJ1dCBzaWduYWxcbiAqIGhhbmRsZXJzIG1heSBub3QgKHJldHVybiBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gKS4gWW91IG1heSB1c2UgQWN0aXZpdGllcywgVGltZXJzLCBjaGlsZCBXb3JrZmxvd3MsIGV0YyBpbiBVcGRhdGVcbiAqIGFuZCBTaWduYWwgaGFuZGxlcnMsIGJ1dCB0aGlzIHNob3VsZCBiZSBkb25lIGNhdXRpb3VzbHk6IGZvciBleGFtcGxlLCBub3RlIHRoYXQgaWYgeW91IGF3YWl0IGFzeW5jIG9wZXJhdGlvbnMgc3VjaCBhc1xuICogdGhlc2UgaW4gYW4gVXBkYXRlIG9yIFNpZ25hbCBoYW5kbGVyLCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHdvcmtmbG93IGRvZXMgbm90IGNvbXBsZXRlIGZpcnN0LlxuICpcbiAqIFF1ZXJ5IGhhbmRsZXJzIG1heSAqKm5vdCoqIGJlIGFzeW5jIGZ1bmN0aW9ucywgYW5kIG1heSAqKm5vdCoqIG11dGF0ZSBhbnkgdmFyaWFibGVzIG9yIHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsXG4gKiBjaGlsZCBXb3JrZmxvd3MsIGV0Yy5cbiAqXG4gKiAjIyMjIEltcGxlbWVudGF0aW9uXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRTaWduYWwgPSB3Zi5kZWZpbmVTaWduYWw8W251bWJlcl0+KCdpbmNyZW1lbnQnKTtcbiAqIGV4cG9ydCBjb25zdCBnZXRWYWx1ZVF1ZXJ5ID0gd2YuZGVmaW5lUXVlcnk8bnVtYmVyPignZ2V0VmFsdWUnKTtcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRBbmRHZXRWYWx1ZVVwZGF0ZSA9IHdmLmRlZmluZVVwZGF0ZTxudW1iZXIsIFtudW1iZXJdPignaW5jcmVtZW50QW5kR2V0VmFsdWUnKTtcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRlcldvcmtmbG93KGluaXRpYWxWYWx1ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGxldCBjb3VudCA9IGluaXRpYWxWYWx1ZTtcbiAqICAgd2Yuc2V0SGFuZGxlcihpbmNyZW1lbnRTaWduYWwsIChhcmc6IG51bWJlcikgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgfSk7XG4gKiAgIHdmLnNldEhhbmRsZXIoZ2V0VmFsdWVRdWVyeSwgKCkgPT4gY291bnQpO1xuICogICB3Zi5zZXRIYW5kbGVyKGluY3JlbWVudEFuZEdldFZhbHVlVXBkYXRlLCAoYXJnOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgICByZXR1cm4gY291bnQ7XG4gKiAgIH0pO1xuICogICBhd2FpdCB3Zi5jb25kaXRpb24oKCkgPT4gZmFsc2UpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIE1vcmVcbiAqXG4gKiAtIFtEZXRlcm1pbmlzdGljIGJ1aWx0LWluc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGV0ZXJtaW5pc20jc291cmNlcy1vZi1ub24tZGV0ZXJtaW5pc20pXG4gKiAtIFtDYW5jZWxsYXRpb24gYW5kIHNjb3Blc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvY2FuY2VsbGF0aW9uLXNjb3BlcylcbiAqICAgLSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9XG4gKiAgIC0ge0BsaW5rIFRyaWdnZXJ9XG4gKiAtIFtTaW5rc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2FwcGxpY2F0aW9uLWRldmVsb3BtZW50L29ic2VydmFiaWxpdHkvP2xhbmc9dHMjbG9nZ2luZylcbiAqICAgLSB7QGxpbmsgU2lua3N9XG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB7XG4gIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgQ2FuY2VsbGVkRmFpbHVyZSxcbiAgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBQYXlsb2FkQ29udmVydGVyLFxuICBSZXRyeVBvbGljeSxcbiAgcm9vdENhdXNlLFxuICBTZWFyY2hBdHRyaWJ1dGVzLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9lcnJvcnMnO1xuZXhwb3J0IHtcbiAgQWN0aXZpdHlGdW5jdGlvbixcbiAgQWN0aXZpdHlJbnRlcmZhY2UsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgUGF5bG9hZCxcbiAgUXVlcnlEZWZpbml0aW9uLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UXVlcnlUeXBlLFxuICBXb3JrZmxvd1Jlc3VsdFR5cGUsXG4gIFdvcmtmbG93UmV0dXJuVHlwZSxcbiAgV29ya2Zsb3dTaWduYWxUeXBlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlLCBDYW5jZWxsYXRpb25TY29wZSwgQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0IHtcbiAgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zLFxuICBDb250aW51ZUFzTmV3LFxuICBDb250aW51ZUFzTmV3T3B0aW9ucyxcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBTdGFja1RyYWNlRmlsZUxvY2F0aW9uLFxuICBTdGFja1RyYWNlRmlsZVNsaWNlLFxuICBQYXJlbnRDbG9zZVBvbGljeSxcbiAgUGFyZW50V29ya2Zsb3dJbmZvLFxuICBSb290V29ya2Zsb3dJbmZvLFxuICBTdGFja1RyYWNlU0RLSW5mbyxcbiAgU3RhY2tUcmFjZSxcbiAgVW5zYWZlV29ya2Zsb3dJbmZvLFxuICBXb3JrZmxvd0luZm8sXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgeyBwcm94eVNpbmtzLCBTaW5rLCBTaW5rQ2FsbCwgU2lua0Z1bmN0aW9uLCBTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuZXhwb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2dzJztcbmV4cG9ydCB7IFRyaWdnZXIgfSBmcm9tICcuL3RyaWdnZXInO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdyc7XG5leHBvcnQgeyBDaGlsZFdvcmtmbG93SGFuZGxlLCBFeHRlcm5hbFdvcmtmbG93SGFuZGxlIH0gZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0IHsgbWV0cmljTWV0ZXIgfSBmcm9tICcuL21ldHJpY3MnO1xuZXhwb3J0IHtcbiAgY3JlYXRlTmV4dXNTZXJ2aWNlQ2xpZW50LFxuICBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zLFxuICBOZXh1c1NlcnZpY2VDbGllbnQsXG4gIE5leHVzT3BlcmF0aW9uSGFuZGxlLFxuICBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG59IGZyb20gJy4vbmV4dXMnO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIERlcHJlY2F0ZWQgQVBJc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIExvZ2dlclNpbmtzIGRpcmVjdGx5LiBUbyBsb2cgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2UgdGhlIGBsb2dgIG9iamVjdFxuICAgKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gICAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAgICovXG5cbiAgTG9nZ2VyU2lua3NEZXByZWNhdGVkIGFzIExvZ2dlclNpbmtzLFxufSBmcm9tICcuL2xvZ3MnO1xuIiwiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciBXb3JrZmxvdyBpbnRlcmNlcHRvcnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlPcHRpb25zLFxuICBEdXJhdGlvbixcbiAgTG9jYWxBY3Rpdml0eU9wdGlvbnMsXG4gIE1ldHJpY1RhZ3MsXG4gIFRpbWVzdGFtcCxcbiAgV29ya2Zsb3dFeGVjdXRpb24sXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBIZWFkZXJzLCBOZXh0IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMsIENvbnRpbnVlQXNOZXdPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlIH0gZnJvbSAnLi9uZXh1cyc7XG5cbmV4cG9ydCB7IE5leHQsIEhlYWRlcnMgfTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaW5zdGFudGlhdGVzIHtAbGluayBXb3JrZmxvd0ludGVyY2VwdG9yc30uXG4gKlxuICogV29ya2Zsb3cgaW50ZXJjZXB0b3IgbW9kdWxlcyBzaG91bGQgZXhwb3J0IGFuIGBpbnRlcmNlcHRvcnNgIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBleHBvcnQgZnVuY3Rpb24gaW50ZXJjZXB0b3JzKCk6IFdvcmtmbG93SW50ZXJjZXB0b3JzIHtcbiAqICAgcmV0dXJuIHtcbiAqICAgICBpbmJvdW5kOiBbXSwgICAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2YgaW5ib3VuZCBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgICBvdXRib3VuZDogW10sICAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2Ygb3V0Ym91bmQgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgICAgaW50ZXJuYWxzOiBbXSwgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIGludGVybmFscyBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgPSAoKSA9PiBXb3JrZmxvd0ludGVyY2VwdG9ycztcblxuLyoqXG4gKiBBIG1hcHBpbmcgZnJvbSBpbnRlcmNlcHRvciB0eXBlIHRvIGFuIG9wdGlvbmFsIGxpc3Qgb2YgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbnRlcmNlcHRvcnMge1xuICBpbmJvdW5kPzogV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvcltdO1xuICBvdXRib3VuZD86IFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yW107XG4gIGludGVybmFscz86IFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3JbXTtcbn1cblxuLy8gV29ya2Zsb3cgSW5ib3VuZCBDYWxscyBJbnRlcmNlcHRvcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogSW1wbGVtZW50IGFueSBvZiB0aGVzZSBtZXRob2RzIHRvIGludGVyY2VwdCBXb3JrZmxvdyBpbmJvdW5kIGNhbGxzIGxpa2UgZXhlY3V0aW9uLCBhbmQgc2lnbmFsIGFuZCBxdWVyeSBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IGV4ZWN1dGUgbWV0aG9kIGlzIGNhbGxlZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgV29ya2Zsb3cgZXhlY3V0aW9uXG4gICAqL1xuICBleGVjdXRlPzogKGlucHV0OiBXb3JrZmxvd0V4ZWN1dGVJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnZXhlY3V0ZSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBVcGRhdGUgaGFuZGxlciBpcyBjYWxsZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIFVwZGF0ZVxuICAgKi9cbiAgaGFuZGxlVXBkYXRlPzogKGlucHV0OiBVcGRhdGVJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnaGFuZGxlVXBkYXRlJz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHVwZGF0ZSB2YWxpZGF0b3IgY2FsbGVkXG4gICAqL1xuICB2YWxpZGF0ZVVwZGF0ZT86IChpbnB1dDogVXBkYXRlSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3ZhbGlkYXRlVXBkYXRlJz4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHNpZ25hbCBpcyBkZWxpdmVyZWQgdG8gYSBXb3JrZmxvdyBleGVjdXRpb25cbiAgICovXG4gIGhhbmRsZVNpZ25hbD86IChpbnB1dDogU2lnbmFsSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2hhbmRsZVNpZ25hbCc+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIFdvcmtmbG93IGlzIHF1ZXJpZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIHF1ZXJ5XG4gICAqL1xuICBoYW5kbGVRdWVyeT86IChpbnB1dDogUXVlcnlJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnaGFuZGxlUXVlcnknPikgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuZXhlY3V0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dFeGVjdXRlSW5wdXQge1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVVwZGF0ZX0gYW5kIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLnZhbGlkYXRlVXBkYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbnB1dCB7XG4gIHJlYWRvbmx5IHVwZGF0ZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVTaWduYWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbElucHV0IHtcbiAgcmVhZG9ubHkgc2lnbmFsTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVF1ZXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUlucHV0IHtcbiAgcmVhZG9ubHkgcXVlcnlJZDogc3RyaW5nO1xuICByZWFkb25seSBxdWVyeU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vLyBXb3JrZmxvdyBPdXRib3VuZCBDYWxscyBJbnRlcmNlcHRvcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogSW1wbGVtZW50IGFueSBvZiB0aGVzZSBtZXRob2RzIHRvIGludGVyY2VwdCBXb3JrZmxvdyBjb2RlIGNhbGxzIHRvIHRoZSBUZW1wb3JhbCBBUElzLCBsaWtlIHNjaGVkdWxpbmcgYW4gYWN0aXZpdHlcbiAqIGFuZCBzdGFydGluZyBhIHRpbWVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHN0YXJ0cyBhIHRpbWVyLlxuICAgKi9cbiAgc3RhcnRUaW1lcj86IChpbnB1dDogVGltZXJJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3N0YXJ0VGltZXInPikgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2NoZWR1bGVzIGFuIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aXZpdHkgZXhlY3V0aW9uXG4gICAqL1xuICBzY2hlZHVsZUFjdGl2aXR5PzogKFxuICAgIGlucHV0OiBBY3Rpdml0eUlucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzY2hlZHVsZUFjdGl2aXR5Jz5cbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzY2hlZHVsZXMgYSBsb2NhbCBBY3Rpdml0eS5cbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGFjdGl2aXR5IGV4ZWN1dGlvblxuICAgKi9cbiAgc2NoZWR1bGVMb2NhbEFjdGl2aXR5PzogKFxuICAgIGlucHV0OiBMb2NhbEFjdGl2aXR5SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3NjaGVkdWxlTG9jYWxBY3Rpdml0eSc+XG4gICkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgTmV4dXMgT3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIHN0YXJ0TmV4dXNPcGVyYXRpb24/OiAoXG4gICAgaW5wdXQ6IFN0YXJ0TmV4dXNPcGVyYXRpb25JbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc3RhcnROZXh1c09wZXJhdGlvbic+XG4gICkgPT4gUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgY2hpbGQgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBUaGUgaW50ZXJjZXB0b3IgZnVuY3Rpb24gcmV0dXJucyAyIHByb21pc2VzOlxuICAgKiAtIFRoZSBmaXJzdCByZXNvbHZlcyB3aXRoIHRoZSBgcnVuSWRgIHdoZW4gdGhlIGNoaWxkIHdvcmtmbG93IGhhcyBzdGFydGVkIG9yIHJlamVjdHMgaWYgZmFpbGVkIHRvIHN0YXJ0LlxuICAgKiAtIFRoZSBzZWNvbmQgcmVzb2x2ZXMgd2l0aCB0aGUgd29ya2Zsb3cgcmVzdWx0IHdoZW4gdGhlIGNoaWxkIHdvcmtmbG93IGNvbXBsZXRlcyBvciByZWplY3RzIG9uIGZhaWx1cmUuXG4gICAqL1xuICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24/OiAoXG4gICAgaW5wdXQ6IFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24nPlxuICApID0+IFByb21pc2U8W1Byb21pc2U8c3RyaW5nPiwgUHJvbWlzZTx1bmtub3duPl0+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzaWduYWxzIGEgY2hpbGQgb3IgZXh0ZXJuYWwgV29ya2Zsb3cuXG4gICAqL1xuICBzaWduYWxXb3JrZmxvdz86IChcbiAgICBpbnB1dDogU2lnbmFsV29ya2Zsb3dJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc2lnbmFsV29ya2Zsb3cnPlxuICApID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IGNhbGxzIGNvbnRpbnVlQXNOZXcuXG4gICAqL1xuICBjb250aW51ZUFzTmV3PzogKFxuICAgIGlucHV0OiBDb250aW51ZUFzTmV3SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2NvbnRpbnVlQXNOZXcnPlxuICApID0+IFByb21pc2U8bmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBgd29ya2Zsb3cubG9nYCBtZXRob2RzLlxuICAgKlxuICAgKiBUaGUgYXR0cmlidXRlcyByZXR1cm5lZCBpbiB0aGlzIGNhbGwgYXJlIGF0dGFjaGVkIHRvIGV2ZXJ5IGxvZyBtZXNzYWdlLlxuICAgKi9cbiAgZ2V0TG9nQXR0cmlidXRlcz86IChcbiAgICBpbnB1dDogR2V0TG9nQXR0cmlidXRlc0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdnZXRMb2dBdHRyaWJ1dGVzJz5cbiAgKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgZXZlcnkgdGltZSBhIG1ldHJpYyBpcyBlbWl0dGVkIGZyb20gYSBXb3JrZmxvdyBtZXRyaWMgKGllLiBhIG1ldHJpYyBjcmVhdGVkXG4gICAqIGZyb20ge0BsaW5rIHdvcmtmbG93Lm1ldHJpY01ldGVyfSkuXG4gICAqXG4gICAqIFRhZ3MgcmV0dXJuZWQgYnkgdGhpcyBob29rIGFyZSBfcHJlcGVuZGVkXyB0byB0YWdzIGRlZmluZWQgYXQgdGhlIG1ldHJpYyBsZXZlbCBhbmQgdGFnc1xuICAgKiBkZWZpbmVkIG9uIHRoZSBlbWl0dGVyIGZ1bmN0aW9uIGl0c2VsZi5cbiAgICovXG4gIGdldE1ldHJpY1RhZ3M/OiAoXG4gICAgaW5wdXQ6IEdldE1ldHJpY1RhZ3NJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnZ2V0TWV0cmljVGFncyc+XG4gICkgPT4gTWV0cmljVGFncztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0VGltZXJ9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZXJJbnB1dCB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG9wdGlvbnM/OiBUaW1lck9wdGlvbnM7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSB0aW1lciAoaS5lLiBzbGVlcClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lck9wdGlvbnMge1xuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlIGxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCdzIHB1cnBvc2VcbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnNjaGVkdWxlQWN0aXZpdHl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5SW5wdXQge1xuICByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2NoZWR1bGVMb2NhbEFjdGl2aXR5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbEFjdGl2aXR5SW5wdXQge1xuICByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG9yaWdpbmFsU2NoZWR1bGVUaW1lPzogVGltZXN0YW1wO1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydE5leHVzT3BlcmF0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydE5leHVzT3BlcmF0aW9uSW5wdXQge1xuICByZWFkb25seSBpbnB1dDogdW5rbm93bjtcbiAgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuICByZWFkb25seSBvcHRpb25zOiBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBlbmQgdG8gZW5kIHRpbWVvdXQgZm9yIHRoZSBOZXh1cyBPcGVyYXRpb24uXG4gICAqXG4gICAqIE9wdGlvbmFsOiBkZWZhdWx0cyB0byB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBUZW1wb3JhbCBzZXJ2ZXIuXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbWF5IHdhaXQgYmVmb3JlIGl0IGJlZ2lucyBleGVjdXRpbmcuIElmIHRoZSBvcGVyYXRpb24gaGFzIG5vdCBzdGFydGVkXG4gICAqIHdpdGhpbiB0aGlzIHdpbmRvdywgYSB0aW1lb3V0IGVycm9yIHdpdGggdHlwZSBTQ0hFRFVMRV9UT19TVEFSVCBpcyByYWlzZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsOiBkZWZhdWx0cyB0byBubyB0aW1lb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGVUb1N0YXJ0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyBhbiBhc3luYyBvcGVyYXRpb24gbWF5IHRha2UgdG8gY29tcGxldGUgYWZ0ZXIgaXQgaGFzIHN0YXJ0ZWQuIElmIHRoZSBvcGVyYXRpb24gZG9lc1xuICAgKiBub3QgY29tcGxldGUgd2l0aGluIHRoaXMgd2luZG93LCBhIHRpbWVvdXQgZXJyb3Igd2l0aCB0eXBlIFNUQVJUX1RPX0NMT1NFIGlzIHJhaXNlZC5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIG5vIHRpbWVvdXQuXG4gICAqL1xuICByZWFkb25seSBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE5leHVzIE9wZXJhdGlvblxuICAgKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBPcGVyYXRpb24ncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgV29ya2Zsb3dcbiAgICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSBvcGVyYXRpb24ncyByZXN1bHQgcHJvbWlzZSBmYWlsIHdpdGggYSBgTmV4dXNPcGVyYXRpb25GYWlsdXJlYCxcbiAgICogICB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXh0ZXJuYWwgcmVxdWVzdCBmb3IgdGhlXG4gICAqIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gICAqIE9wZXJhdGlvbiBjYWxsIHdhcyBtYWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgcmVhZG9ubHkgY2FuY2VsbGF0aW9uVHlwZT86IE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlLWxpbmUgc3VtbWFyeSBmb3IgdGhpcyBOZXh1cyBPcGVyYXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRwdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydE5leHVzT3BlcmF0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0IHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiBmb3IgdGhlIE5leHVzIE9wZXJhdGlvbi5cbiAgICpcbiAgICogVW5kZWZpbmVkIGlmIHRoZSBOZXh1cyBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHksIGluIHdoaWNoIGNhc2UgdGhlIHtAbGluayByZXN1bHR9XG4gICAqIHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gdGhlIE5leHVzIE9wZXJhdGlvbiBjb21wbGV0ZXMsIGVpdGhlciB3aXRoIHRoZSByZXN1bHQgb2YgdGhlXG4gICAqIE9wZXJhdGlvbiBpZiBpdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvciBhIGZhaWx1cmUgaWYgdGhlIE5leHVzIE9wZXJhdGlvbiBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ6IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0IHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnNpZ25hbFdvcmtmbG93fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxXb3JrZmxvd0lucHV0IHtcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNpZ25hbE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSB0YXJnZXQ6XG4gICAgfCB7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6ICdleHRlcm5hbCc7XG4gICAgICAgIHJlYWRvbmx5IHdvcmtmbG93RXhlY3V0aW9uOiBXb3JrZmxvd0V4ZWN1dGlvbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogJ2NoaWxkJztcbiAgICAgICAgcmVhZG9ubHkgY2hpbGRXb3JrZmxvd0lkOiBzdHJpbmc7XG4gICAgICB9O1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuY29udGludWVBc05ld30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld0lucHV0IHtcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBvcHRpb25zOiBDb250aW51ZUFzTmV3SW5wdXRPcHRpb25zO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuY29udGludWVBc05ld30uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRpbnVlQXNOZXdJbnB1dE9wdGlvbnMgPSBDb250aW51ZUFzTmV3T3B0aW9ucyAmIFJlcXVpcmVkPFBpY2s8Q29udGludWVBc05ld09wdGlvbnMsICd3b3JrZmxvd1R5cGUnPj47XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5nZXRMb2dBdHRyaWJ1dGVzfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0TG9nQXR0cmlidXRlc0lucHV0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5nZXRNZXRyaWNUYWdzfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0TWV0cmljVGFnc0lucHV0ID0gTWV0cmljVGFncztcblxuLy8gV29ya2Zsb3cgSW50ZXJuYWxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogSW50ZXJjZXB0b3IgZm9yIHRoZSBpbnRlcm5hbHMgb2YgdGhlIFdvcmtmbG93IHJ1bnRpbWUuXG4gKlxuICogVXNlIHRvIG1hbmlwdWxhdGUgb3IgdHJhY2UgV29ya2Zsb3cgYWN0aXZhdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIEFQSSBpcyBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgV29ya2Zsb3cgcnVudGltZSBydW5zIGEgV29ya2Zsb3dBY3RpdmF0aW9uSm9iLlxuICAgKi9cbiAgYWN0aXZhdGU/KGlucHV0OiBBY3RpdmF0ZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdhY3RpdmF0ZSc+KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIGFsbCBgV29ya2Zsb3dBY3RpdmF0aW9uSm9iYHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBmb3IgYW4gYWN0aXZhdGlvbi5cbiAgICpcbiAgICogQ2FuIG1hbmlwdWxhdGUgdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBieSB0aGUgV29ya2Zsb3dcbiAgICovXG4gIGNvbmNsdWRlQWN0aXZhdGlvbj8oaW5wdXQ6IENvbmNsdWRlQWN0aXZhdGlvbklucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdjb25jbHVkZUFjdGl2YXRpb24nPik6IENvbmNsdWRlQWN0aXZhdGlvbk91dHB1dDtcblxuICAvKipcbiAgICogQ2FsbGVkIGJlZm9yZSBkaXNwb3NpbmcgdGhlIFdvcmtmbG93IGlzb2xhdGUgY29udGV4dC5cbiAgICpcbiAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAuXG4gICAqL1xuICBkaXNwb3NlPyhpbnB1dDogRGlzcG9zZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdkaXNwb3NlJz4pOiB2b2lkO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5hY3RpdmF0ZX1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0ZUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb247XG4gIHJlYWRvbmx5IGJhdGNoSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuZGlzcG9zZX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVxuZXhwb3J0IGludGVyZmFjZSBEaXNwb3NlSW5wdXQge31cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuY29uY2x1ZGVBY3RpdmF0aW9ufVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmNsdWRlQWN0aXZhdGlvbklucHV0IHtcbiAgcmVhZG9ubHkgY29tbWFuZHM6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZFtdO1xufVxuXG4vKipcbiAqIE91dHB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuY29uY2x1ZGVBY3RpdmF0aW9ufVxuICovXG5leHBvcnQgdHlwZSBDb25jbHVkZUFjdGl2YXRpb25PdXRwdXQgPSBDb25jbHVkZUFjdGl2YXRpb25JbnB1dDtcbiIsImltcG9ydCB0eXBlIHsgUmF3U291cmNlTWFwIH0gZnJvbSAnc291cmNlLW1hcCc7XG5pbXBvcnQgdHlwZSB7XG4gIFJldHJ5UG9saWN5LFxuICBDb21tb25Xb3JrZmxvd09wdGlvbnMsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVcGRhdGVEZWZpbml0aW9uLFxuICBRdWVyeURlZmluaXRpb24sXG4gIER1cmF0aW9uLFxuICBWZXJzaW9uaW5nSW50ZW50LFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVBhaXIsXG4gIFByaW9yaXR5LFxuICBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbixcbiAgVmVyc2lvbmluZ0JlaGF2aW9yLFxuICBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLFxuICBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG4vKipcbiAqIFdvcmtmbG93IEV4ZWN1dGlvbiBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW5mbyB7XG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgV29ya2Zsb3csIHRoaXMgY2FuIGJlIHNldCBieSB0aGUgY2xpZW50IGR1cmluZyBXb3JrZmxvdyBjcmVhdGlvbi5cbiAgICogQSBzaW5nbGUgV29ya2Zsb3cgbWF5IHJ1biBtdWx0aXBsZSB0aW1lcyBlLmcuIHdoZW4gc2NoZWR1bGVkIHdpdGggY3Jvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSUQgb2YgYSBzaW5nbGUgV29ya2Zsb3cgcnVuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXb3JrZmxvdyBmdW5jdGlvbidzIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRleGVkIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBtYXkgY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaEF0dHJpYnV0ZXM6IFNlYXJjaEF0dHJpYnV0ZXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogSW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLCBleHBvc2VkIHRocm91Z2ggYW4gaW50ZXJmYWNlLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogTm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaW5mbyAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ2hpbGQgV29ya2Zsb3cpXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBQYXJlbnRXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSByb290IHdvcmtmbG93IGV4ZWN1dGlvbiwgZGVmaW5lZCBhcyBmb2xsb3dzOlxuICAgKiAxLiBBIHdvcmtmbG93IHdpdGhvdXQgYSBwYXJlbnQgd29ya2Zsb3cgaXMgaXRzIG93biByb290IHdvcmtmbG93LlxuICAgKiAyLiBBIHdvcmtmbG93IHdpdGggYSBwYXJlbnQgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXNcbiAgICogaXRzIHBhcmVudC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBubyBwYXJlbnQgd29ya2Zsb3csIGkuZS4sIHRoZSB3b3JrZmxvdyBpcyBpdHMgb3duIHJvb3Qgd29ya2Zsb3csXG4gICAqIHRoaXMgZmllbGQgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBDb250aW51ZS1hcy1OZXcgKG9yIHJlc2V0KSBwcm9wYWdhdGVzIHRoZSB3b3JrZmxvdyBwYXJlbnRhZ2UgcmVsYXRpb25zaGlwLFxuICAgKiBhbmQgdGhlcmVmb3JlLCB3aGV0aGVyIHRoZSBuZXcgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXMgdGhlIG9yaWdpbmFsIG9uZVxuICAgKiBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaGFkIGEgcGFyZW50LlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdD86IFJvb3RXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFJlc3VsdCBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgaWYgdGhpcyBpcyBhIENyb24gV29ya2Zsb3cgb3Igd2FzIENvbnRpbnVlZCBBcyBOZXcpLlxuICAgKlxuICAgKiBBbiBhcnJheSBvZiB2YWx1ZXMsIHNpbmNlIG90aGVyIFNES3MgbWF5IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgZnJvbSBhIFdvcmtmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFJlc3VsdD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIEZhaWx1cmUgZnJvbSB0aGUgcHJldmlvdXMgUnVuIChwcmVzZW50IHdoZW4gdGhpcyBSdW4gaXMgYSByZXRyeSwgb3IgdGhlIGxhc3QgUnVuIG9mIGEgQ3JvbiBXb3JrZmxvdyBmYWlsZWQpXG4gICAqL1xuICByZWFkb25seSBsYXN0RmFpbHVyZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgV29ya2Zsb3cgaGlzdG9yeSB1cCB1bnRpbCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiBXb3JrZmxvdyBoaXN0b3J5IGluIGJ5dGVzIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgemVybyBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKlxuICAgKiBZb3UgbWF5IHNhZmVseSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hlbiB0byB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgV29ya2Zsb3dUYXNrU3RhcnRlZCBldmVudCByZWNvbW1lbmRpbmcgd2hldGhlciB0b1xuICAgKiB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgYGZhbHNlYCBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVBc05ld1N1Z2dlc3RlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgd29ya2Zsb3cncyBUYXJnZXQgV29ya2VyIERlcGxveW1lbnQgVmVyc2lvbiBoYXMgY2hhbmdlZCBmcm9tIGl0cyBQaW5uZWQgVmVyc2lvbi5cbiAgICogV2hlbiB0cnVlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGNvbnNpZGVyIGNvbnRpbnVpbmctYXMtbmV3IHdpdGhcbiAgICogYGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6ICdBVVRPX1VQR1JBREUnYCB0byBtb3ZlIHRvIHRoZSBuZXcgdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVwZ3JhZGUtb24tQ29udGludWUtYXMtTmV3IGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFdvcmtlckRlcGxveW1lbnRWZXJzaW9uQ2hhbmdlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVhc29uKHMpIHdoeSBjb250aW51ZSBhcyBuZXcgaXMgc3VnZ2VzdGVkLiBDYW4gcG90ZW50aWFsbHkgYmUgbXVsdGlwbGUgcmVhc29ucy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBNYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRDb250aW51ZUFzTmV3UmVhc29ucz86IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW107XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgb25cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tRdWV1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2UgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgaW5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW4gSWQgb2YgdGhlIGZpcnN0IFJ1biBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RFeGVjdXRpb25SdW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBSdW4gSWQgaW4gdGhpcyBFeGVjdXRpb24gQ2hhaW5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRpbnVlZEZyb21FeGVjdXRpb25SdW5JZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSBhdCB3aGljaCB0aGlzIFtXb3JrZmxvdyBFeGVjdXRpb24gQ2hhaW5dKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvd3Mjd29ya2Zsb3ctZXhlY3V0aW9uLWNoYWluKSB3YXMgc3RhcnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBjdXJyZW50IFdvcmtmbG93IFJ1biBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBydW5TdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gZXhwaXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uRXhwaXJhdGlvblRpbWU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIFdvcmtmbG93IFJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgU2VydmVyLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dSdW5UaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1blRpbWVvdXRNcz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBhIFdvcmtmbG93IFRhc2sgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSB0YXNrVGltZW91dE1zOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldHJ5IFBvbGljeSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5yZXRyeX0uXG4gICAqL1xuICByZWFkb25seSByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBTdGFydHMgYXQgMSBhbmQgaW5jcmVtZW50cyBmb3IgZXZlcnkgcmV0cnkgaWYgdGhlcmUgaXMgYSBgcmV0cnlQb2xpY3lgXG4gICAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyb24gU2NoZWR1bGUgZm9yIHRoaXMgRXhlY3V0aW9uLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMuY3JvblNjaGVkdWxlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGJldHdlZW4gQ3JvbiBSdW5zXG4gICAqL1xuICByZWFkb25seSBjcm9uU2NoZWR1bGVUb1NjaGVkdWxlSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBCdWlsZCBJRCBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWQgaWYgdGhlXG4gICAqIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgQnVpbGQgSUQuIElmIHRoaXMgd29ya2VyIGlzIHRoZSBvbmUgZXhlY3V0aW5nIHRoaXNcbiAgICogdGFzayBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGhhcyBhIEJ1aWxkIElEIHNldCwgdGhlbiBpdHMgSUQgd2lsbCBiZSB1c2VkLiBUaGlzIHZhbHVlIG1heSBjaGFuZ2VcbiAgICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIHdvcmtmbG93IHJ1biwgYnV0IGlzIGRldGVybWluaXN0aWMgYW5kIHNhZmUgdG8gdXNlIGZvciBicmFuY2hpbmcuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgY3VycmVudERlcGxveW1lbnRWZXJzaW9uYCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50QnVpbGRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIERlcGxveW1lbnQgVmVyc2lvbiBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWRcbiAgICogaWYgdGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgRGVwbG95bWVudCBWZXJzaW9uLiBJZiB0aGlzIHdvcmtlciBpcyB0aGUgb25lXG4gICAqIGV4ZWN1dGluZyB0aGlzIHRhc2sgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBoYXMgYSBEZXBsb3ltZW50IFZlcnNpb24gc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlXG4gICAqIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmRcbiAgICogc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnREZXBsb3ltZW50VmVyc2lvbj86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xuXG4gIHJlYWRvbmx5IHVuc2FmZTogVW5zYWZlV29ya2Zsb3dJbmZvO1xuXG4gIC8qKlxuICAgKiBQcmlvcml0eSBvZiB0aGlzIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86IFByaW9yaXR5O1xufVxuXG4vKipcbiAqIFVuc2FmZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24uXG4gKlxuICogTmV2ZXIgcmVseSBvbiB0aGlzIGluZm9ybWF0aW9uIGluIFdvcmtmbG93IGxvZ2ljIGFzIGl0IHdpbGwgY2F1c2Ugbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5zYWZlV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIFRoZSBzYWZlIHZlcnNpb24gb2YgdGltZSBpcyBgbmV3IERhdGUoKWAgYW5kIGBEYXRlLm5vdygpYCwgd2hpY2ggYXJlIHNldCBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBhIFdvcmtmbG93XG4gICAqIFRhc2sgYW5kIHN0YXkgY29uc3RhbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgVGFzayBhbmQgZHVyaW5nIHJlcGxheS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdyBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmc6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGN1cnJlbnRseSByZXBsYXlpbmcgaGlzdG9yeSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byB7QGxpbmsgaXNSZXBsYXlpbmd9LCBidXQgcmV0dXJucyBgZmFsc2VgIGR1cmluZyBxdWVyeSBoYW5kbGVycyBhbmQgdXBkYXRlXG4gICAqIHZhbGlkYXRvcnMsIHdoaWNoIGFyZSBsaXZlIHJlYWQtb25seSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIHJlcGxheWluZ1xuICAgKiBoaXN0b3J5IGV2ZW50cy5cbiAgICpcbiAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHRydWUsIHdvcmtmbG93IGxvZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZCBhbmQgc2lua3MgZGVmaW5lZCB3aXRoXG4gICAqIGNhbGxEdXJpbmdSZXBsYXk9ZmFsc2Ugd29uJ3QgZ2V0IHByb2Nlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHdvcmtmbG93IHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmZvIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm90IGFuIGFjdHVhbCBlcnJvciwgdXNlZCBieSB0aGUgV29ya2Zsb3cgcnVudGltZSB0byBhYm9ydCBleGVjdXRpb24gd2hlbiB7QGxpbmsgY29udGludWVBc05ld30gaXMgY2FsbGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29udGludWVBc05ldycpXG5leHBvcnQgY2xhc3MgQ29udGludWVBc05ldyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSUNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbikge1xuICAgIHN1cGVyKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb250aW51aW5nIGEgV29ya2Zsb3cgYXMgbmV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld09wdGlvbnMge1xuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBXb3JrZmxvdyB0eXBlIG5hbWUsIGUuZy4gdGhlIGZpbGVuYW1lIGluIHRoZSBOb2RlLmpzIFNESyBvciBjbGFzcyBuYW1lIGluIEphdmFcbiAgICovXG4gIHdvcmtmbG93VHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdG8gY29udGludWUgdGhlIFdvcmtmbG93IGluXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciB0aGUgZW50aXJlIFdvcmtmbG93IHJ1blxuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGEgc2luZ2xlIFdvcmtmbG93IHRhc2tcbiAgICogQGZvcm1hdCB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dUYXNrVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogTm9uLXNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqIE5vdGUgdGhhdCBzZWFyY2ggYXR0cmlidXRlcyBhcmUgbm90IGVuY29kZWQsIGFzIHN1Y2gsIGRvIG5vdCBpbmNsdWRlIGFueSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIElmIGJvdGgge0BsaW5rIHNlYXJjaEF0dHJpYnV0ZXN9IGFuZCB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBhcmUgcHJvdmlkZWQsIGNvbmZsaWN0aW5nIGtleXMgd2lsbCBiZSBvdmVyd3JpdHRlblxuICAgKiBieSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfS5cbiAgICovXG4gIHR5cGVkU2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSB8IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgV29ya2Zsb3cgc2hvdWxkXG4gICAqIENvbnRpbnVlLWFzLU5ldyBvbnRvIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIHZlcnNpb25pbmcgYmVoYXZpb3IgdG8gYmUgdXNlZCBieSB0aGUgZmlyc3QgdGFzayBvZiBhIG5ldyB3b3JrZmxvdyBydW4gaW4gYSBjb250aW51ZS1hcy1uZXcgY2hhaW4uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVmVyc2lvbmluZyBzZW1hbnRpY3Mgd2l0aCBjb250aW51ZS1hcy1uZXcgYXJlIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICAgKi9cbiAgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcj86IEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lczpcbiAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgYW5kXG4gKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBDaGlsZCdzIGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3dcbiAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUge0BsaW5rIGV4ZWN1dGVDaGlsZH0ncyBvciB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZS5yZXN1bHR9J3NcbiAqICAgcHJvbWlzZSBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAqIFBhcmVudCBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICogQ2hpbGQgV29ya2Zsb3cgY2FsbCB3YXMgbWFkZS4gRXZlbnR1YWwgQ2FuY2VsbGF0aW9uIG9mIGEgQ2hpbGQgV29ya2Zsb3cgb24gY29tcGxldGlvbiBvZiB0aGVcbiAqIFBhcmVudCBXb3JrZmxvdyBpcyBjb250cm9sbGVkIGJ5IHRoZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3l9IHNldHRpbmcuXG4gKlxuICogQGRlZmF1bHQgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gKi9cbi8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBDaGlsZFdvcmtmbG93T3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlYCBmaWVsZFxuZXhwb3J0IGNvbnN0IENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIENoaWxkLCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvblxuICAgKiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgeWV0IF9pbW1lZGlhdGVseV8gcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLCBpLmUuIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHNlcnZlciB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb25cbiAgICogcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgcHJvdmlkZXMgbm8gZ3VhcmFudGVlLCBmcm9tIHRoZSBQYXJlbnQtc2lkZSwgdGhhdCB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3Qgd2lsbCBhY3R1YWxseSBiZSBhdG9taWNhbGx5IGFkZGVkIHRvIHRoZSBDaGlsZCB3b3JrZmxvdydzIGhpc3RvcnkuXG4gICAqIEluIHBhcnRpY3VsYXIsIHRoZSBDaGlsZCBtYXkgY29tcGxldGUgKGVpdGhlciBzdWNjZXNzZnVsbHkgb3IgdW5jZXNzZnVsbHkpIGJlZm9yZSB0aGVcbiAgICogY2FuY2VsbGF0aW9uIGlzIGRlbGl2ZXJlZCwgcmVzdWx0aW5nIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBQYXJlbnQgd29ya2Zsb3cgdGhpbmtzIGl0cyBjaGlsZFxuICAgKiB3YXMgY2FuY2VsbGVkLCBidXQgdGhlIGNoaWxkIGFjdHVhbGx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIFRvIGd1YXJhbnRlZSB0aGF0IHRoZSBDaGlsZCB3aWxsIGV2ZW50dWFsbHkgYmUgbm90aWZpZWQgb2YgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LFxuICAgKiB1c2Uge0BsaW5rIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRH0uXG4gICAqL1xuICBUUllfQ0FOQ0VMOiAnVFJZX0NBTkNFTCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB0aGVuIHdhaXQgZm9yIHRoZSBzZXJ2ZXJcbiAgICogdG8gY29uZmlybSB0aGF0IHRoZSBDaGlsZCBXb3JrZmxvdyBjYW5jZWxsYXRpb24gcmVxdWVzdCB3YXMgcmVjb3JkZWQgaW4gaXRzIGhpc3RvcnkuXG4gICAqXG4gICAqIFRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgZ3VhcmFudGVlcyB0aGF0IHRoZSBDaGlsZCB3aWxsIGV2ZW50dWFsbHkgYmUgbm90aWZpZWQgb2YgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0ICh0aGF0IGlzLCB1bmxlc3MgdGhlIENoaWxkIHRlcm1pbmF0ZXMgaW5iZXR3ZWVuIGR1ZSB0byB1bmV4cGVjdGVkIGNhdXNlcykuXG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUQnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgdGhlbiB3YWl0IGZvciBjb21wbGV0aW9uXG4gICAqIG9mIHRoZSBDaGlsZCBXb3JrZmxvdy5cbiAgICpcbiAgICogVGhlIENoaWxkIG1heSByZXNwZWN0IGNhbmNlbGxhdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgUGFyZW50J3MgYGV4ZWN1dGVDaGlsZGAgb3JcbiAgICogYENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0YCBwcm9taXNlIHdpbGwgZmFpbCB3aXRoIGEgYENoaWxkV29ya2Zsb3dGYWlsdXJlYCwgd2l0aCBgY2F1c2VgXG4gICAqIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYC4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBDaGlsZCBtYXkgaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCxcbiAgICogaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVzcG9uZGluZyBwcm9taXNlIHdpbGwgZWl0aGVyIHJlc29sdmUgd2l0aCBhIHJlc3VsdCAoaWYgQ2hpbGQgY29tcGxldGVkXG4gICAqIHN1Y2Nlc3NmdWxseSkgb3IgcmVqZWN0IHdpdGggYSBkaWZmZXJlbnQgY2F1c2UgKGlmIENoaWxkIGNvbXBsZXRlZCB1bmNlc3NmdWxseSkuXG4gICAqXG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlID1cbiAgKHR5cGVvZiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlXTtcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsIGRlY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDAsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAxLFxuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAyLFxuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURURdOiAzLFxuICB9IGFzIGNvbnN0LFxuICAnJ1xuKTtcblxuLyoqXG4gKiBIb3cgYSBDaGlsZCBXb3JrZmxvdyByZWFjdHMgdG8gdGhlIFBhcmVudCBXb3JrZmxvdyByZWFjaGluZyBhIENsb3NlZCBzdGF0ZS5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hLXBhcmVudC1jbG9zZS1wb2xpY3kvIHwgUGFyZW50IENsb3NlIFBvbGljeX1cbiAqL1xuZXhwb3J0IGNvbnN0IFBhcmVudENsb3NlUG9saWN5ID0ge1xuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIFRlcm1pbmF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCBub3RoaW5nIGlzIGRvbmUgdG8gdGhlIENoaWxkLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgQ2FuY2VsbGVkLlxuICAgKi9cbiAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG5cbiAgLy8vIEFueXRoaW5nIGJlbG93IHRoaXMgbGluZSBoYXMgYmVlbiBkZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIElmIGEgYFBhcmVudENsb3NlUG9saWN5YCBpcyBzZXQgdG8gdGhpcywgb3IgaXMgbm90IHNldCBhdCBhbGwsIHRoZSBzZXJ2ZXIgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEVpdGhlciBsZWF2ZSBwcm9wZXJ0eSBgdW5kZWZpbmVkYCwgb3Igc2V0IGFuIGV4cGxpY2l0IHBvbGljeSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEV9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURTogJ1RFUk1JTkFURScsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuQUJBTkRPTn0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgQ2FuY2VsbGVkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlJFUVVFU1RfQ0FOQ0VMfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQYXJlbnRDbG9zZVBvbGljeSA9ICh0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3kpW2tleW9mIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeV07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ksXG4gICdQQVJFTlRfQ0xPU0VfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuVEVSTUlOQVRFXTogMSxcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuQUJBTkRPTl06IDIsXG4gICAgW1BhcmVudENsb3NlUG9saWN5LlJFUVVFU1RfQ0FOQ0VMXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGlsZFdvcmtmbG93T3B0aW9ucyBleHRlbmRzIE9taXQ8Q29tbW9uV29ya2Zsb3dPcHRpb25zLCAnd29ya2Zsb3dJZENvbmZsaWN0UG9saWN5Jz4ge1xuICAvKipcbiAgICogV29ya2Zsb3cgaWQgdG8gdXNlIHdoZW4gc3RhcnRpbmcuIElmIG5vdCBzcGVjaWZpZWQgYSBVVUlEIGlzIGdlbmVyYXRlZC4gTm90ZSB0aGF0IGl0IGlzXG4gICAqIGRhbmdlcm91cyBhcyBpbiBjYXNlIG9mIGNsaWVudCBzaWRlIHJldHJpZXMgbm8gZGVkdXBsaWNhdGlvbiB3aWxsIGhhcHBlbiBiYXNlZCBvbiB0aGVcbiAgICogZ2VuZXJhdGVkIGlkLiBTbyBwcmVmZXIgYXNzaWduaW5nIGJ1c2luZXNzIG1lYW5pbmdmdWwgaWRzIGlmIHBvc3NpYmxlLlxuICAgKi9cbiAgd29ya2Zsb3dJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSB0byB1c2UgZm9yIFdvcmtmbG93IHRhc2tzLiBJdCBzaG91bGQgbWF0Y2ggYSB0YXNrIHF1ZXVlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGFcbiAgICogYFdvcmtlcmAgdGhhdCBob3N0cyB0aGUgV29ya2Zsb3cgY29kZS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYSBjaGlsZCBpcyBzY2hlZHVsZWQgb24gdGhlIHNhbWUgVGFzayBRdWV1ZSBhcyB0aGUgcGFyZW50LlxuICAgKi9cbiAgdGFza1F1ZXVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIGFuZFxuICAgKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBDaGlsZCdzIGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3dcbiAgICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSB7QGxpbmsgZXhlY3V0ZUNoaWxkfSdzIG9yIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH0nc1xuICAgKiAgIHByb21pc2UgZmFpbCB3aXRoIGEgYENoaWxkV29ya2Zsb3dGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAgICogQ2hpbGQgV29ya2Zsb3cgY2FsbCB3YXMgbWFkZS4gRXZlbnR1YWwgQ2FuY2VsbGF0aW9uIG9mIGEgQ2hpbGQgV29ya2Zsb3cgb24gY29tcGxldGlvbiBvZiB0aGVcbiAgICogUGFyZW50IFdvcmtmbG93IGlzIGNvbnRyb2xsZWQgYnkgdGhlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeX0gc2V0dGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgY2FuY2VsbGF0aW9uVHlwZT86IENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRoZSBDaGlsZCByZWFjdHMgdG8gdGhlIFBhcmVudCBXb3JrZmxvdyByZWFjaGluZyBhIENsb3NlZCBzdGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgUGFyZW50Q2xvc2VQb2xpY3kuUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcbiAgICovXG4gIHBhcmVudENsb3NlUG9saWN5PzogUGFyZW50Q2xvc2VQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgQ2hpbGQgV29ya2Zsb3cgc2hvdWxkIHJ1biBvblxuICAgKiBhIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG59XG5cbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnMgPSBSZXF1aXJlZDxQaWNrPENoaWxkV29ya2Zsb3dPcHRpb25zLCAnd29ya2Zsb3dJZCcgfCAnY2FuY2VsbGF0aW9uVHlwZSc+PiAmIHtcbiAgYXJnczogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMgPSBDaGlsZFdvcmtmbG93T3B0aW9ucyAmIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZVNES0luZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2xpY2Ugb2YgYSBmaWxlIHN0YXJ0aW5nIGF0IGxpbmVPZmZzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlRmlsZVNsaWNlIHtcbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBwb3NzaWJsZSB0byB0cmltIHRoZSBmaWxlIHdpdGhvdXQgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy5cbiAgICovXG4gIGxpbmVfb2Zmc2V0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBzbGljZSBvZiBhIGZpbGUgd2l0aCBgXFxuYCAobmV3bGluZSkgbGluZSB0ZXJtaW5hdG9yLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIGEgZmlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24ge1xuICAvKipcbiAgICogUGF0aCB0byBzb3VyY2UgZmlsZSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpLlxuICAgKiBXaGVuIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCwgbWFrZSBzdXJlIGFsbCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgcm9vdC5cbiAgICovXG4gIGZpbGVfcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIElmIHBvc3NpYmxlLCBTREsgc2hvdWxkIHNlbmQgdGhpcywgcmVxdWlyZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGNvZGUgbG9jYXRpb24uXG4gICAqL1xuICBsaW5lPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLlxuICAgKi9cbiAgY29sdW1uPzogbnVtYmVyO1xuICAvKipcbiAgICogRnVuY3Rpb24gbmFtZSB0aGlzIGxpbmUgYmVsb25ncyB0byAoaWYgYXBwbGljYWJsZSkuXG4gICAqIFVzZWQgZm9yIGZhbGxpbmcgYmFjayB0byBzdGFjayB0cmFjZSB2aWV3LlxuICAgKi9cbiAgZnVuY3Rpb25fbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEZsYWcgdG8gbWFyayB0aGlzIGFzIGludGVybmFsIFNESyBjb2RlIGFuZCBoaWRlIGJ5IGRlZmF1bHQgaW4gdGhlIFVJLlxuICAgKi9cbiAgaW50ZXJuYWxfY29kZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlIHtcbiAgbG9jYXRpb25zOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgcmVzdWx0IGZvciB0aGUgZW5oYW5jZWQgc3RhY2sgdHJhY2UgcXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFN0YWNrVHJhY2Uge1xuICBzZGs6IFN0YWNrVHJhY2VTREtJbmZvO1xuICAvKipcbiAgICogTWFwcGluZyBvZiBmaWxlIHBhdGggdG8gZmlsZSBjb250ZW50cy5cbiAgICogU0RLIG1heSBjaG9vc2UgdG8gc2VuZCBubywgc29tZSBvciBhbGwgc291cmNlcy5cbiAgICogU291cmNlcyBtaWdodCBiZSB0cmltbWVkLCBhbmQgc29tZSB0aW1lIG9ubHkgdGhlIGZpbGUocykgb2YgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSB0cmFjZSB3aWxsIGJlIHNlbnQuXG4gICAqL1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+O1xuICBzdGFja3M6IFN0YWNrVHJhY2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnMge1xuICBpbmZvOiBXb3JrZmxvd0luZm87XG4gIHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXTtcbiAgbm93OiBudW1iZXI7XG4gIHNob3dTdGFja1RyYWNlU291cmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCBleHRlbmRzIFdvcmtmbG93Q3JlYXRlT3B0aW9ucyB7XG4gIHNvdXJjZU1hcDogUmF3U291cmNlTWFwO1xuICByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG4gIGdldFRpbWVPZkRheSgpOiBiaWdpbnQ7XG4gIHN0YWNrVHJhY2VzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gY2FwYWJsZSBvZiBhY2NlcHRpbmcgdGhlIGFyZ3VtZW50cyBmb3IgYSBnaXZlbiBVcGRhdGVEZWZpbml0aW9uLCBTaWduYWxEZWZpbml0aW9uIG9yIFF1ZXJ5RGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgSGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+ID0gVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgPyAoLi4uYXJnczogQSkgPT4gUiB8IFByb21pc2U8Uj5cbiAgOiBUIGV4dGVuZHMgU2lnbmFsRGVmaW5pdGlvbjxpbmZlciBBPlxuICAgID8gKC4uLmFyZ3M6IEEpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+XG4gICAgOiBUIGV4dGVuZHMgUXVlcnlEZWZpbml0aW9uPGluZmVyIFIsIGluZmVyIEE+XG4gICAgICA/ICguLi5hcmdzOiBBKSA9PiBSXG4gICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgc2lnbmFsIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRTaWduYWxIYW5kbGVyID0gKHNpZ25hbE5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gYWNjZXB0aW5nIHVwZGF0ZSBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLlxuICovXG5leHBvcnQgdHlwZSBEZWZhdWx0VXBkYXRlSGFuZGxlciA9ICh1cGRhdGVOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPiB8IHVua25vd247XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyBxdWVyeSBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRRdWVyeUhhbmRsZXIgPSAocXVlcnlOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcblxuLyoqXG4gKiBBIHZhbGlkYXRpb24gZnVuY3Rpb24gY2FwYWJsZSBvZiBhY2NlcHRpbmcgdGhlIGFyZ3VtZW50cyBmb3IgYSBnaXZlbiBVcGRhdGVEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBVcGRhdGVWYWxpZGF0b3I8QXJncyBleHRlbmRzIGFueVtdPiA9ICguLi5hcmdzOiBBcmdzKSA9PiB2b2lkO1xuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBxdWVyeSBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBRdWVyeUhhbmRsZXJPcHRpb25zID0geyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBzaWduYWwgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgU2lnbmFsSGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyB1bmZpbmlzaGVkUG9saWN5PzogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgfTtcblxuLyoqXG4gKiBBIHZhbGlkYXRvciBhbmQgZGVzY3JpcHRpb24gb2YgYW4gdXBkYXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSB7XG4gIHZhbGlkYXRvcj86IFVwZGF0ZVZhbGlkYXRvcjxBcmdzPjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW107XG4gIHVzZWRJbnRlcm5hbEZsYWdzOiBudW1iZXJbXTtcbiAgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgRmFpbHVyZUNvbnZlcnRlcixcbiAgUGF5bG9hZENvbnZlcnRlcixcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UXVlcnlBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSxcbiAgUHJvdG9GYWlsdXJlLFxuICBXb3JrZmxvd1VwZGF0ZVR5cGUsXG4gIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSxcbiAgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQge1xuICBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcixcbiAgYXJyYXlGcm9tUGF5bG9hZHMsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBlbnN1cmVUZW1wb3JhbEZhaWx1cmUsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBJbGxlZ2FsU3RhdGVFcnJvcixcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgbWFwRnJvbVBheWxvYWRzLFxuICBmcm9tUGF5bG9hZHNBdEluZGV4LFxuICBSYXdWYWx1ZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGRlY29kZVNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93JztcbmltcG9ydCB0eXBlIHsgY29yZXNkaywgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQge1xuICBURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgsXG4gIFNUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gIEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvcmVzZXJ2ZWQnO1xuaW1wb3J0IHR5cGUgeyBSTkcgfSBmcm9tICcuL2FsZWEnO1xuaW1wb3J0IHsgYWxlYSB9IGZyb20gJy4vYWxlYSc7XG5pbXBvcnQgeyBSb290Q2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBVcGRhdGVTY29wZSB9IGZyb20gJy4vdXBkYXRlLXNjb3BlJztcbmltcG9ydCB7IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IsIExvY2FsQWN0aXZpdHlEb0JhY2tvZmYsIGlzQ2FuY2VsbGF0aW9uIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBRdWVyeUlucHV0LFxuICBTaWduYWxJbnB1dCxcbiAgU3RhcnROZXh1c09wZXJhdGlvbk91dHB1dCxcbiAgVXBkYXRlSW5wdXQsXG4gIFdvcmtmbG93RXhlY3V0ZUlucHV0LFxuICBXb3JrZmxvd0ludGVyY2VwdG9ycyxcbn0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBEZWZhdWx0U2lnbmFsSGFuZGxlcixcbiAgU3RhY2tUcmFjZVNES0luZm8sXG4gIFN0YWNrVHJhY2VGaWxlU2xpY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFdvcmtmbG93SW5mbyxcbiAgV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwsXG4gIEFjdGl2YXRpb25Db21wbGV0aW9uLFxuICBEZWZhdWx0VXBkYXRlSGFuZGxlcixcbiAgRGVmYXVsdFF1ZXJ5SGFuZGxlcixcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29udGludWVBc05ldyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0eXBlIFNpbmtDYWxsIH0gZnJvbSAnLi9zaW5rcyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgcGtnIGZyb20gJy4vcGtnJztcbmltcG9ydCB0eXBlIHsgU2RrRmxhZyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRGbGFnIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcsIGxvZyB9IGZyb20gJy4vbG9ncyc7XG5cbmNvbnN0IFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlID0ge1xuICBXT1JLRkxPV19BTFJFQURZX0VYSVNUUzogJ1dPUktGTE9XX0FMUkVBRFlfRVhJU1RTJyxcbn0gYXMgY29uc3Q7XG50eXBlIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlID1cbiAgKHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSlba2V5b2YgdHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlXTtcblxuY29uc3QgW19lbmNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSwgZGVjb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdID1cbiAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gICAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICA+KFxuICAgIHtcbiAgICAgIFtTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZS5XT1JLRkxPV19BTFJFQURZX0VYSVNUU106IDEsXG4gICAgICBVTlNQRUNJRklFRDogMCxcbiAgICB9IGFzIGNvbnN0LFxuICAgICdTVEFSVF9DSElMRF9XT1JLRkxPV19FWEVDVVRJT05fRkFJTEVEX0NBVVNFXydcbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFjayB7XG4gIGZvcm1hdHRlZDogc3RyaW5nO1xuICBzdHJ1Y3R1cmVkOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogR2xvYmFsIHN0b3JlIHRvIHRyYWNrIHByb21pc2Ugc3RhY2tzIGZvciBzdGFjayB0cmFjZSBxdWVyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb21pc2VTdGFja1N0b3JlIHtcbiAgY2hpbGRUb1BhcmVudDogTWFwPFByb21pc2U8dW5rbm93bj4sIFNldDxQcm9taXNlPHVua25vd24+Pj47XG4gIHByb21pc2VUb1N0YWNrOiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU3RhY2s+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb248U3VjY2Vzcz4ge1xuICByZXNvbHZlKHZhbDogU3VjY2Vzcyk6IHZvaWQ7XG4gIHJlamVjdChyZWFzb246IEVycm9yKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb24ge1xuICBmbigpOiBib29sZWFuO1xuXG4gIHJlc29sdmUoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aXZhdGlvbkhhbmRsZXJGdW5jdGlvbjxLIGV4dGVuZHMga2V5b2YgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2I+ID0gKFxuICBhY3RpdmF0aW9uOiBOb25OdWxsYWJsZTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYltLXT5cbikgPT4gdm9pZDtcblxuLyoqXG4gKiBWZXJpZmllcyBhbGwgYWN0aXZhdGlvbiBqb2IgaGFuZGxpbmcgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWRcbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZhdGlvbkhhbmRsZXIgPSB7XG4gIFtQIGluIGtleW9mIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iXTogQWN0aXZhdGlvbkhhbmRsZXJGdW5jdGlvbjxQPjtcbn07XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbi5cbiAqL1xuaW50ZXJmYWNlIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgaWQ/OiBzdHJpbmc7XG59XG5cbnR5cGUgSW5mZXJNYXBWYWx1ZTxUPiA9IFQgZXh0ZW5kcyBNYXA8bnVtYmVyLCBpbmZlciBWPiA/IFYgOiBuZXZlcjtcblxuLyoqXG4gKiBLZWVwcyBhbGwgb2YgdGhlIFdvcmtmbG93IHJ1bnRpbWUgc3RhdGUgbGlrZSBwZW5kaW5nIGNvbXBsZXRpb25zIGZvciBhY3Rpdml0aWVzIGFuZCB0aW1lcnMuXG4gKlxuICogSW1wbGVtZW50cyBoYW5kbGVycyBmb3IgYWxsIHdvcmtmbG93IGFjdGl2YXRpb24gam9icy5cbiAqXG4gKiBOb3RlIHRoYXQgbW9zdCBtZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIHRoZSBWTS5cbiAqXG4gKiBIb3dldmVyLCBhIGZldyBtZXRob2RzIG1heSBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBvdXRzaWRlIHRoZSBWTSAoZXNzZW50aWFsbHkgZnJvbSBgdm0tc2hhcmVkLnRzYCkuXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBzcGVjaWZpY2FsbHkgbWFya2VkIHdpdGggYSBjb21tZW50IGFuZCByZXF1aXJlIGNhcmVmdWwgY29uc2lkZXJhdGlvbiwgYXMgdGhlXG4gKiBleGVjdXRpb24gY29udGV4dCBtYXkgbm90IHByb3Blcmx5IHJlZmxlY3QgdGhhdCBvZiB0aGUgdGFyZ2V0IHdvcmtmbG93IGV4ZWN1dGlvbiAoZS5nLjogd2l0aCBSZXVzYWJsZVxuICogVk1zLCB0aGUgYGdsb2JhbGAgbWF5IG5vdCBoYXZlIGJlZW4gc3dhcHBlZCB0byB0aG9zZSBvZiB0aGF0IHdvcmtmbG93IGV4ZWN1dGlvbjsgdGhlIGFjdGl2ZSBtaWNyb3Rhc2tcbiAqIHF1ZXVlIG1heSBiZSB0aGF0IG9mIHRoZSB0aHJlYWQvcHJvY2VzcywgcmF0aGVyIHRoYW4gdGhlIHF1ZXVlIG9mIHRoYXQgVk0gY29udGV4dDsgZXRjKS4gQ29uc2VxdWVudGx5LFxuICogbWV0aG9kcyB0aGF0IGFyZSBtZWFudCB0byBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBWTSBtdXN0IG5vdCBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAtIEFjY2VzcyBhbnkgZ2xvYmFsIHZhcmlhYmxlO1xuICogLSBDcmVhdGUgUHJvbWlzZSBvYmplY3RzLCB1c2UgYXN5bmMvYXdhaXQsIG9yIG90aGVyd2lzZSBzY2hlZHVsZSBtaWNyb3Rhc2tzO1xuICogLSBDYWxsIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMsIGluY2x1ZGluZyBhbnkgZm9ybSBvZiBpbnRlcmNlcHRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEFjdGl2YXRpb25IYW5kbGVyIHtcbiAgLyoqXG4gICAqIENhY2hlIGZvciBtb2R1bGVzIC0gcmVmZXJlbmNlZCBpbiByZXVzYWJsZS12bS50c1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICAvKipcbiAgICogTWFwIG9mIHRhc2sgc2VxdWVuY2UgdG8gYSBDb21wbGV0aW9uXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IHtcbiAgICB0aW1lcjogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dm9pZD4+KCksXG4gICAgYWN0aXZpdHk6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHVua25vd24+PigpLFxuICAgIG5leHVzT3BlcmF0aW9uU3RhcnQ6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQ+PigpLFxuICAgIG5leHVzT3BlcmF0aW9uQ29tcGxldGU6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHVua25vd24+PigpLFxuICAgIGNoaWxkV29ya2Zsb3dTdGFydDogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248c3RyaW5nPj4oKSxcbiAgICBjaGlsZFdvcmtmbG93Q29tcGxldGU6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHVua25vd24+PigpLFxuICAgIHNpZ25hbFdvcmtmbG93OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkPj4oKSxcbiAgICBjYW5jZWxXb3JrZmxvdzogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dm9pZD4+KCksXG4gIH07XG5cbiAgLyoqXG4gICAqIEhvbGRzIGJ1ZmZlcmVkIFVwZGF0ZSBjYWxscyB1bnRpbCBhIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVmZmVyZWRVcGRhdGVzID0gQXJyYXk8Y29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZT4oKTtcblxuICAvKipcbiAgICogSG9sZHMgYnVmZmVyZWQgc2lnbmFsIGNhbGxzIHVudGlsIGEgaGFuZGxlciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWFkb25seSBidWZmZXJlZFNpZ25hbHMgPSBBcnJheTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVNpZ25hbFdvcmtmbG93PigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHVwZGF0ZSBuYW1lIHRvIGhhbmRsZXIgYW5kIHZhbGlkYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dVcGRhdGVBbm5vdGF0ZWRUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHNpZ25hbCBuYW1lIHRvIGhhbmRsZXJcbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93U2lnbmFsQW5ub3RhdGVkVHlwZT4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbi1wcm9ncmVzcyB1cGRhdGVzIHRvIGhhbmRsZXIgZXhlY3V0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Qcm9ncmVzc1VwZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgaW4tcHJvZ3Jlc3Mgc2lnbmFscyB0byBoYW5kbGVyIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGluUHJvZ3Jlc3NTaWduYWxzID0gbmV3IE1hcDxudW1iZXIsIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBBIHNlcXVlbmNlIG51bWJlciBwcm92aWRpbmcgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNpZ25hbEhhbmRsZXJFeGVjdXRpb25TZXEgPSAwO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFNpZ25hbEhhbmRsZXI/OiBEZWZhdWx0U2lnbmFsSGFuZGxlcjtcblxuICAvKipcbiAgICogQSB1cGRhdGUgaGFuZGxlciB0aGF0IGNhdGNoZXMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHVwZGF0ZSBuYW1lcy5cbiAgICovXG4gIGRlZmF1bHRVcGRhdGVIYW5kbGVyPzogRGVmYXVsdFVwZGF0ZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEEgcXVlcnkgaGFuZGxlciB0aGF0IGNhdGNoZXMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHF1ZXJ5IG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFF1ZXJ5SGFuZGxlcj86IERlZmF1bHRRdWVyeUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFNvdXJjZSBtYXAgZmlsZSBmb3IgbG9va2luZyB1cCB0aGUgc291cmNlIGZpbGVzIGluIHJlc3BvbnNlIHRvIF9fZW5oYW5jZWRfc3RhY2tfdHJhY2VcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzb3VyY2VNYXA6IFJhd1NvdXJjZU1hcDtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gc2VuZCB0aGUgc291cmNlcyBpbiBlbmhhbmNlZCBzdGFjayB0cmFjZSBxdWVyeSByZXNwb25zZXNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG5cbiAgcmVhZG9ubHkgcHJvbWlzZVN0YWNrU3RvcmU6IFByb21pc2VTdGFja1N0b3JlID0ge1xuICAgIHByb21pc2VUb1N0YWNrOiBuZXcgTWFwKCksXG4gICAgY2hpbGRUb1BhcmVudDogbmV3IE1hcCgpLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzayB0byBmYWlsLiBTZXRzIGlmIGEgbm9uLWBUZW1wb3JhbEZhaWx1cmVgXG4gICAqIGVycm9yIGJ1YmJsZXMgdXAgb3V0IG9mIHRoZSBXb3JrZmxvdyBmdW5jdGlvbiwgb3Igb3V0IG9mIGEgU2lnbmFsIG9yIFVwZGF0ZSBoYW5kbGVyLiBXZVxuICAgKiBjYXB0dXJlIGVycm9ycyB0aGlzIHdheSBiZWNhdXNlIHRob3NlIGZ1bmN0aW9ucyBhcmUgbm90IHRlY2huaWNhbGx5IGF3YWl0ZWQgd2hlbiBzdGFydGVkLFxuICAgKiBidXQgbGVmdCB0byBydW4gYXN5bmNocm9ub3VzbHkuIFRoZXJlIGlzIHRoZXJlZm9yZSBubyByZWFsIFwicGFyZW50XCIgZnVuY3Rpb24gdGhhdCBjYW5cbiAgICogZGlyZWN0bHkgaGFuZGxlIHRob3NlIGVycm9ycywgYW5kIG5vdCBjYXB0dXJpbmcgaXQgd291bGQgcmVzdWx0IGluIGFuIFVuaGFuZGxlZCBQcm9taXNlXG4gICAqIFJlamVjdGlvbi4gU28gaW5zdGVhZCwgd2UgYnVmZmVyIHRoZSBlcnJvciBoZXJlLCB0byB0aGVuIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29udGV4dFxuICAgKiBvZiBvdXIgb3duIHN5bmNocm9ub3VzIEFjdGl2YXRpb24gaGFuZGxpbmcgZXZlbnQgbG9vcC5cbiAgICpcbiAgICogT3VyIGNvZGUgZG9lcyBhIGJlc3QgZWZmb3J0IHRvIHN0b3AgcHJvY2Vzc2luZyB0aGUgY3VycmVudCBhY3RpdmF0aW9uIGFzIHNvb24gYXMgcG9zc2libGVcbiAgICogYWZ0ZXIgdGhpcyBmaWVsZCBpcyBzZXQ6XG4gICAqICAtIElmIGFuIGVycm9yIGlzIHRocm93biB3aGlsZSBleGVjdXRpbmcgY29kZSBzeW5jaHJvbm91c2x5IChlLmcuIGFueXRoaW5nIGJlZm9yZSB0aGVcbiAgICogICAgZmlyc3QgYGF3YWl0YCBzdGF0ZW1lbnQgaW4gYSBXb3JrZmxvdyBmdW5jdGlvbiBvciBhIHNpZ25hbC91cGRhdGUgaGFuZGxlciksIHRoZSBlcnJvclxuICAgKiAgICB3aWxsIGJlIF9pbW1lZGlhdGVseV8gcmV0aHJvd24sIHdoaWNoIHdpbGwgcHJldmVudCBleGVjdXRpb24gb2YgZnVydGhlciBqb2JzIGluIHRoZVxuICAgKiAgICBjdXJyZW50IGFjdGl2YXRpb24uIFdlIGtub3cgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgY29kZSBzeW5jaHJvbm91c2x5IHRoYW5rcyB0byB0aGVcbiAgICogICAgYHJldGhyb3dTeW5jaHJvbm91c2x5YCBmbGFnIGJlbG93LlxuICAgKiAgLSBJdCBhbiBlcnJvciBpcyB0aHJvd24gd2hpbGUgZXhlY3V0aW5nIG1pY3JvdGFza3MsIHRoZW4gdGhlIGVycm9yIHdpbGwgYmUgcmV0aHJvd24gb25cbiAgICogICAgdGhlIG5leHQgY2FsbCB0byBgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKWAuXG4gICAqXG4gICAqIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3Mgbm8gd2F5IGZvciB1cyB0byBwcmV2ZW50IGZ1cnRoZXIgZXhlY3V0aW9uIG9mIG1pY3JvdGFza3MgdGhhdCBoYXZlXG4gICAqIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQsIG5vciB0aG9zZSB0aGF0IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2NoZWR1bGVkIGZyb20gdGhvc2UgbWljcm90YXNrcy5cbiAgICogU2hvdWxkIG1vcmUgZXJyb3JzIGdldCB0aHJvd24gd2hpbGUgc2V0dGxpbmcgbWljcm90YXNrcywgdGhvc2Ugd2lsbCBiZSBpZ25vcmVkIChpLmUuIG9ubHlcbiAgICogdGhlIGZpcnN0IGNhcHR1cmVkIGVycm9yIGlzIHByZXNlcnZlZCkuXG4gICAqL1xuICBwdWJsaWMgd29ya2Zsb3dUYXNrRXJyb3I6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHdoZW4gcnVubmluZyBzeW5jaHJvbm91cyBjb2RlIChlLmcuIHdoaWxlIHByb2Nlc3NpbmcgYWN0aXZhdGlvbiBqb2JzIGFuZCB3aGVuIGNhbGxpbmdcbiAgICogYHRyeVVuYmxvY2tDb25kaXRpb25zKClgKS4gV2hpbGUgdGhpcyBmbGFnIGlzIHNldCwgaXQgaXMgc2FmZSB0byBsZXQgZXJyb3JzIGJ1YmJsZSB1cC5cbiAgICovXG4gIHB1YmxpYyByZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSByb290U2NvcGUgPSBuZXcgUm9vdENhbmNlbGxhdGlvblNjb3BlKCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgcXVlcnkgbmFtZSB0byBoYW5kbGVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXVlcnlIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZT4oW1xuICAgIFtcbiAgICAgIFNUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJhd1ZhbHVlPHN0cmluZz4oXG4gICAgICAgICAgICB0aGlzLmdldFN0YWNrVHJhY2VzKClcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy5mb3JtYXR0ZWQpXG4gICAgICAgICAgICAgIC5qb2luKCdcXG5cXG4nKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHNlbnNpYmxlIHN0YWNrIHRyYWNlLicsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IFJhd1ZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNvdXJjZU1hcCB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBzZGs6IFN0YWNrVHJhY2VTREtJbmZvID0geyBuYW1lOiAndHlwZXNjcmlwdCcsIHZlcnNpb246IHBrZy52ZXJzaW9uIH07XG4gICAgICAgICAgY29uc3Qgc3RhY2tzID0gdGhpcy5nZXRTdGFja1RyYWNlcygpLm1hcCgoeyBzdHJ1Y3R1cmVkOiBsb2NhdGlvbnMgfSkgPT4gKHsgbG9jYXRpb25zIH0pKTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+ID0ge307XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1N0YWNrVHJhY2VTb3VyY2VzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgbG9jYXRpb25zIH0gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgeyBmaWxlX3BhdGggfSBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfcGF0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHNvdXJjZU1hcD8uc291cmNlc0NvbnRlbnQ/Lltzb3VyY2VNYXA/LnNvdXJjZXMuaW5kZXhPZihmaWxlX3BhdGgpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXNbZmlsZV9wYXRoXSA9IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZV9vZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTxFbmhhbmNlZFN0YWNrVHJhY2U+KHsgc2RrLCBzdGFja3MsIHNvdXJjZXMgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHN0YWNrIHRyYWNlIGFubm90YXRlZCB3aXRoIHNvdXJjZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgICdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IFJhd1ZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCB3b3JrZmxvd1R5cGUgPSB0aGlzLmluZm8ud29ya2Zsb3dUeXBlO1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5RGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHNpZ25hbERlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnNpZ25hbEhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlRGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMudXBkYXRlSGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFJhd1ZhbHVlPHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KHtcbiAgICAgICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgdHlwZTogd29ya2Zsb3dUeXBlLFxuICAgICAgICAgICAgICBxdWVyeURlZmluaXRpb25zLFxuICAgICAgICAgICAgICBzaWduYWxEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgdXBkYXRlRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VycmVudERldGFpbHM6IHRoaXMuY3VycmVudERldGFpbHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3b3JrZmxvdy4nLFxuICAgICAgfSxcbiAgICBdLFxuICBdKTtcblxuICAvKipcbiAgICogTG9hZGVkIGluIHtAbGluayBpbml0UnVudGltZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnM6IFJlcXVpcmVkPFdvcmtmbG93SW50ZXJjZXB0b3JzPiA9IHtcbiAgICBpbmJvdW5kOiBbXSxcbiAgICBvdXRib3VuZDogW10sXG4gICAgaW50ZXJuYWxzOiBbXSxcbiAgfTtcblxuICAvKipcbiAgICogQnVmZmVyIHRoYXQgc3RvcmVzIGFsbCBnZW5lcmF0ZWQgY29tbWFuZHMsIHJlc2V0IGFmdGVyIGVhY2ggYWN0aXZhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgYWxsIHtAbGluayBjb25kaXRpb259cyB0aGF0IGhhdmVuJ3QgYmVlbiB1bmJsb2NrZWQgeWV0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tlZENvbmRpdGlvbnMgPSBuZXcgTWFwPG51bWJlciwgQ29uZGl0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBJcyB0aGlzIFdvcmtmbG93IGNvbXBsZXRlZD9cbiAgICpcbiAgICogQSBXb3JrZmxvdyB3aWxsIGJlIGNvbnNpZGVyZWQgY29tcGxldGVkIGlmIGl0IGdlbmVyYXRlcyBhIGNvbW1hbmQgdGhhdCB0aGVcbiAgICogc3lzdGVtIGNvbnNpZGVycyBhcyBhIGZpbmFsIFdvcmtmbG93IGNvbW1hbmQgKGUuZy5cbiAgICogY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbiBvciBmYWlsV29ya2Zsb3dFeGVjdXRpb24pLlxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXYXMgdGhpcyBXb3JrZmxvdyBjYW5jZWxsZWQ/XG4gICAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXh0IChpbmNyZW1lbnRhbCkgc2VxdWVuY2UgdG8gYXNzaWduIHdoZW4gZ2VuZXJhdGluZyBjb21wbGV0YWJsZSBjb21tYW5kc1xuICAgKi9cbiAgcHVibGljIG5leHRTZXFzID0ge1xuICAgIHRpbWVyOiAxLFxuICAgIGFjdGl2aXR5OiAxLFxuICAgIGNoaWxkV29ya2Zsb3c6IDEsXG4gICAgc2lnbmFsV29ya2Zsb3c6IDEsXG4gICAgY2FuY2VsV29ya2Zsb3c6IDEsXG4gICAgY29uZGl0aW9uOiAxLFxuICAgIG5leHVzT3BlcmF0aW9uOiAxLFxuICAgIC8vIFVzZWQgaW50ZXJuYWxseSB0byBrZWVwIHRyYWNrIG9mIGFjdGl2ZSBzdGFjayB0cmFjZXNcbiAgICBzdGFjazogMSxcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyBzZXQgZXZlcnkgdGltZSB0aGUgd29ya2Zsb3cgZXhlY3V0ZXMgYW4gYWN0aXZhdGlvblxuICAgKiBNYXkgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBub3c6IG51bWJlcjtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFdvcmtmbG93LCBpbml0aWFsaXplZCB3aGVuIGEgV29ya2Zsb3cgaXMgc3RhcnRlZFxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93PzogV29ya2Zsb3cgfCBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT47XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93XG4gICAqIE1heSBiZSBhY2Nlc3NlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGluZm86IFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogQSBkZXRlcm1pbmlzdGljIFJORywgdXNlZCBieSB0aGUgaXNvbGF0ZSdzIG92ZXJyaWRkZW4gTWF0aC5yYW5kb21cbiAgICovXG4gIHB1YmxpYyByYW5kb206IFJORztcblxuICBwdWJsaWMgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciA9IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyO1xuICBwdWJsaWMgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlciA9IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIGtub3cgdGhlIHN0YXR1cyBvZiBmb3IgdGhpcyB3b3JrZmxvdywgYXMgaW4ge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duUHJlc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGF0Y2hlcyB3ZSBzZW50IHRvIGNvcmUge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbnRQYXRjaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBrbm93bkZsYWdzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgc2RrVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQnVmZmVyZWQgc2luayBjYWxscyBwZXIgYWN0aXZhdGlvblxuICAgKi9cbiAgc2lua0NhbGxzID0gQXJyYXk8U2lua0NhbGw+KCk7XG5cbiAgLyoqXG4gICAqIEEgbmFub3NlY29uZCByZXNvbHV0aW9uIHRpbWUgZnVuY3Rpb24sIGV4dGVybmFsbHkgaW5qZWN0ZWQuIFRoaXMgaXMgdXNlZCB0b1xuICAgKiBwcmVjaXNlbHkgc29ydCBsb2dzIGVudHJpZXMgZW1pdHRlZCBmcm9tIHRoZSBXb3JrZmxvdyBDb250ZXh0IHZzIHRob3NlIGVtaXR0ZWRcbiAgICogZnJvbSBvdGhlciBzb3VyY2VzIChlLmcuIG1haW4gdGhyZWFkLCBDb3JlLCBldGMpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdldFRpbWVPZkRheTogKCkgPT4gYmlnaW50O1xuXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG5cbiAgcHVibGljIGN1cnJlbnREZXRhaWxzOiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuICBwdWJsaWMgd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcj86ICgpID0+IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93U2FuZGJveERlc3RydWN0b3JzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdGFja1RyYWNlc0VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZm8sXG4gICAgbm93LFxuICAgIHNob3dTdGFja1RyYWNlU291cmNlcyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZ2V0VGltZU9mRGF5LFxuICAgIHJhbmRvbW5lc3NTZWVkLFxuICAgIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLFxuICAgIHN0YWNrVHJhY2VzRW5hYmxlZCxcbiAgfTogV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwpIHtcbiAgICB0aGlzLmdldFRpbWVPZkRheSA9IGdldFRpbWVPZkRheTtcbiAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIHRoaXMubm93ID0gbm93O1xuICAgIHRoaXMuc2hvd1N0YWNrVHJhY2VTb3VyY2VzID0gc2hvd1N0YWNrVHJhY2VTb3VyY2VzO1xuICAgIHRoaXMuc291cmNlTWFwID0gc291cmNlTWFwO1xuICAgIHRoaXMucmFuZG9tID0gYWxlYShyYW5kb21uZXNzU2VlZCk7XG4gICAgdGhpcy5yZWdpc3RlcmVkQWN0aXZpdHlOYW1lcyA9IHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzO1xuICAgIHRoaXMuc3RhY2tUcmFjZXNFbmFibGVkID0gc3RhY2tUcmFjZXNFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBtdXRhdGVXb3JrZmxvd0luZm8oZm46IChpbmZvOiBXb3JrZmxvd0luZm8pID0+IFdvcmtmbG93SW5mbyk6IHZvaWQge1xuICAgIHRoaXMuaW5mbyA9IGZuKHRoaXMuaW5mbyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3RhY2tUcmFjZXMoKTogU3RhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBzdGFjayB0cmFjZXMgYXJlIG5vdCBlbmFibGVkIG9uIHRoaXMgd29ya2VyJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY2hpbGRUb1BhcmVudCwgcHJvbWlzZVRvU3RhY2sgfSA9IHRoaXMucHJvbWlzZVN0YWNrU3RvcmU7XG4gICAgY29uc3QgaW50ZXJuYWxOb2RlcyA9IFsuLi5jaGlsZFRvUGFyZW50LnZhbHVlcygpXS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGN1cnIpIHtcbiAgICAgICAgYWNjLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IFNldCgpKTtcbiAgICBjb25zdCBzdGFja3MgPSBuZXcgTWFwPHN0cmluZywgU3RhY2s+KCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFRvUGFyZW50LmtleXMoKSkge1xuICAgICAgaWYgKCFpbnRlcm5hbE5vZGVzLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBwcm9taXNlVG9TdGFjay5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAoIXN0YWNrIHx8ICFzdGFjay5mb3JtYXR0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBzdGFja3Muc2V0KHN0YWNrLmZvcm1hdHRlZCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3QgMTAwJSBzdXJlIHdoZXJlIHRoaXMgY29tZXMgZnJvbSwganVzdCBmaWx0ZXIgaXQgb3V0XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pJyk7XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pXFxuJyk7XG4gICAgcmV0dXJuIFsuLi5zdGFja3NdLm1hcCgoW18sIHN0YWNrXSkgPT4gc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBnZXRBbmRSZXNldFNpbmtDYWxscygpOiBTaW5rQ2FsbFtdIHtcbiAgICBjb25zdCB7IHNpbmtDYWxscyB9ID0gdGhpcztcbiAgICB0aGlzLnNpbmtDYWxscyA9IFtdO1xuICAgIHJldHVybiBzaW5rQ2FsbHM7XG4gIH1cblxuICAvKipcbiAgICogQnVmZmVyIGEgV29ya2Zsb3cgY29tbWFuZCB0byBiZSBjb2xsZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBQcmV2ZW50cyBjb21tYW5kcyBmcm9tIGJlaW5nIGFkZGVkIGFmdGVyIFdvcmtmbG93IGNvbXBsZXRpb24uXG4gICAqL1xuICBwdXNoQ29tbWFuZChjbWQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZCwgY29tcGxldGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaChjbWQpO1xuICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKSxcbiAgICAgIHVzZWRJbnRlcm5hbEZsYWdzOiBbLi4udGhpcy5rbm93bkZsYWdzXSxcbiAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFdvcmtmbG93TmV4dEhhbmRsZXIoeyBhcmdzIH06IFdvcmtmbG93RXhlY3V0ZUlucHV0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHdvcmtmbG93IH0gPSB0aGlzO1xuICAgIGlmICh3b3JrZmxvdyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93KC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0V29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyh0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLCAnZXhlY3V0ZScsIHRoaXMuc3RhcnRXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuXG4gICAgdW50cmFja1Byb21pc2UoXG4gICAgICBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcoKCkgPT5cbiAgICAgICAgZXhlY3V0ZSh7XG4gICAgICAgICAgaGVhZGVyczogYWN0aXZhdGlvbi5oZWFkZXJzID8/IHt9LFxuICAgICAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMpLFxuICAgICAgICB9KVxuICAgICAgKS50aGVuKHRoaXMuY29tcGxldGVXb3JrZmxvdy5iaW5kKHRoaXMpLCB0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZS5iaW5kKHRoaXMpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JSW5pdGlhbGl6ZVdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250aW51ZWRGYWlsdXJlLCBsYXN0Q29tcGxldGlvblJlc3VsdCwgbWVtbywgc2VhcmNoQXR0cmlidXRlcyB9ID0gYWN0aXZhdGlvbjtcblxuICAgIC8vIE1vc3QgdGhpbmdzIHJlbGF0ZWQgdG8gaW5pdGlhbGl6YXRpb24gaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICB0aGlzLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbykgPT4gKHtcbiAgICAgIC4uLmluZm8sXG5cbiAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IGRlY29kZVNlYXJjaEF0dHJpYnV0ZXMoc2VhcmNoQXR0cmlidXRlcz8uaW5kZXhlZEZpZWxkcyksXG4gICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyhzZWFyY2hBdHRyaWJ1dGVzPy5pbmRleGVkRmllbGRzKSxcblxuICAgICAgbWVtbzogbWFwRnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgbWVtbz8uZmllbGRzKSxcbiAgICAgIGxhc3RSZXN1bHQ6IGZyb21QYXlsb2Fkc0F0SW5kZXgodGhpcy5wYXlsb2FkQ29udmVydGVyLCAwLCBsYXN0Q29tcGxldGlvblJlc3VsdD8ucGF5bG9hZHMpLFxuICAgICAgbGFzdEZhaWx1cmU6XG4gICAgICAgIGNvbnRpbnVlZEZhaWx1cmUgIT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGNvbnRpbnVlZEZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlcilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG4gICAgaWYgKHRoaXMud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcikge1xuICAgICAgdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IgPSB0aGlzLndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNHZXR0ZXIoKS52ZXJzaW9uaW5nQmVoYXZpb3I7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbFdvcmtmbG93KF9hY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUNhbmNlbFdvcmtmbG93KTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMucm9vdFNjb3BlLmNhbmNlbCgpO1xuICB9XG5cbiAgcHVibGljIGZpcmVUaW1lcihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUZpcmVUaW1lcik6IHZvaWQge1xuICAgIC8vIFRpbWVycyBhcmUgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlaXIgY29tcGxldGlvbiBtaWdodCBub3QgYmUgaW4gV29ya2Zsb3cgc3RhdGUsXG4gICAgLy8gdGhpcyBpcyBkdWUgdG8gaW1tZWRpYXRlIHRpbWVyIGNhbmNlbGxhdGlvbiB0aGF0IGRvZXNuJ3QgZ28gd2FpdCBmb3IgQ29yZS5cbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCd0aW1lcicsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgY29tcGxldGlvbj8ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVBY3Rpdml0eShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVBY3Rpdml0eSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQWN0aXZpdHkgYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignYWN0aXZpdHknLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZC5yZXN1bHQgPyB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoY29tcGxldGVkLnJlc3VsdCkgOiB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgY2FuY2VsbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSB7XG4gICAgICByZWplY3QobmV3IExvY2FsQWN0aXZpdHlEb0JhY2tvZmYoYWN0aXZhdGlvbi5yZXN1bHQuYmFja29mZikpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0KFxuICAgIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd1N0YXJ0JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5zdWNjZWVkZWQpIHtcbiAgICAgIGlmICghYWN0aXZhdGlvbi5zdWNjZWVkZWQucnVuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQgd2l0aCBubyBydW5JZCcpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShhY3RpdmF0aW9uLnN1Y2NlZWRlZC5ydW5JZCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLmZhaWxlZCkge1xuICAgICAgaWYgKGRlY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKGFjdGl2YXRpb24uZmFpbGVkLmNhdXNlKSAhPT0gJ1dPUktGTE9XX0FMUkVBRFlfRVhJU1RTJykge1xuICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ0dvdCB1bmtub3duIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIShhY3RpdmF0aW9uLnNlcSAmJiBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd0lkICYmIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93VHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhdHRyaWJ1dGVzIGluIGFjdGl2YXRpb24gam9iJyk7XG4gICAgICB9XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IoXG4gICAgICAgICAgJ1dvcmtmbG93IGV4ZWN1dGlvbiBhbHJlYWR5IHN0YXJ0ZWQnLFxuICAgICAgICAgIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93SWQsXG4gICAgICAgICAgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dUeXBlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLmNhbmNlbGxlZCkge1xuICAgICAgaWYgKCFhY3RpdmF0aW9uLmNhbmNlbGxlZC5mYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBubyBmYWlsdXJlIGluIGNhbmNlbGxlZCB2YXJpYW50Jyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmNhbmNlbGxlZC5mYWlsdXJlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0IHdpdGggbm8gc3RhdHVzJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2YXRpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24gYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd0NvbXBsZXRlJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV0ZWQucmVzdWx0ID8gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGNvbXBsZXRlZC5yZXN1bHQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGZhaWxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGNhbmNlbGxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlTmV4dXNPcGVyYXRpb25TdGFydChhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0KTogdm9pZCB7XG4gICAgY29uc3Qgc2VxID0gZ2V0U2VxKGFjdGl2YXRpb24pO1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvblN0YXJ0Jywgc2VxKTtcblxuICAgIGlmICghYWN0aXZhdGlvbi5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvbkNvbXBsZXRlLnNldChzZXEsIHtcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZSk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG5cbiAgICAgIHJlc29sdmUoeyB0b2tlbjogYWN0aXZhdGlvbi5vcGVyYXRpb25Ub2tlbiEsIHJlc3VsdDogY29tcGxldGVQcm9taXNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmZhaWxlZCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlTmV4dXNPcGVyYXRpb24oYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlTmV4dXNPcGVyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzZXEgPSBnZXRTZXEoYWN0aXZhdGlvbik7XG5cbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCk7XG5cbiAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBSZXNvbHZlTmV4dXNPcGVyYXRpb24gdG8gYmUgcmVjZWl2ZWQgd2l0aG91dCBhIHByaW9yIFJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0LFxuICAgICAgLy8gZS5nLiBiZWNhdXNlIHRoZSBoYW5kbGVyIGNvbXBsZXRlZCB0aGUgT3BlcmF0aW9uIHN5bmNocm9ub3VzbHkuXG4gICAgICBjb25zdCBzdGFydENvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuICAgICAgaWYgKHN0YXJ0Q29tcGxldGlvbikge1xuICAgICAgICBzdGFydENvbXBsZXRpb24ucmVzb2x2ZSh7IHJlc3VsdDogUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnI6IEVycm9yO1xuICAgICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0Py5mYWlsZWQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8uY2FuY2VsbGVkKSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LnRpbWVkT3V0KSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQudGltZWRPdXQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wbGV0aW9uID1cbiAgICAgICAgdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvblN0YXJ0Jywgc2VxKSA/P1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKTtcbiAgICAgIGNvbXBsZXRpb24ucmVqZWN0KGVyciEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEludGVudGlvbmFsbHkgbm9uLWFzeW5jIGZ1bmN0aW9uIHNvIHRoaXMgaGFuZGxlciBkb2Vzbid0IHNob3cgdXAgaW4gdGhlIHN0YWNrIHRyYWNlXG4gIHByb3RlY3RlZCBxdWVyeVdvcmtmbG93TmV4dEhhbmRsZXIoeyBxdWVyeU5hbWUsIGFyZ3MgfTogUXVlcnlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGxldCBmbiA9IHRoaXMucXVlcnlIYW5kbGVycy5nZXQocXVlcnlOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm4gPSB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIuYmluZCh1bmRlZmluZWQsIHF1ZXJ5TmFtZSk7XG4gICAgfVxuICAgIC8vIE5vIGhhbmRsZXIgb3IgZGVmYXVsdCByZWdpc3RlcmVkLCBmYWlsLlxuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBrbm93blF1ZXJ5VHlwZXMgPSBbLi4udGhpcy5xdWVyeUhhbmRsZXJzLmtleXMoKV0uam9pbignICcpO1xuICAgICAgLy8gRmFpbCB0aGUgcXVlcnlcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgIGBXb3JrZmxvdyBkaWQgbm90IHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgJHtxdWVyeU5hbWV9LiBSZWdpc3RlcmVkIHF1ZXJpZXM6IFske2tub3duUXVlcnlUeXBlc31dYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBFeGVjdXRlIGhhbmRsZXIuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdRdWVyeSBoYW5kbGVycyBzaG91bGQgbm90IHJldHVybiBhIFByb21pc2UnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcXVlcnlXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVF1ZXJ5V29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHF1ZXJ5VHlwZSwgcXVlcnlJZCwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIShxdWVyeVR5cGUgJiYgcXVlcnlJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcXVlcnkgYWN0aXZhdGlvbiBhdHRyaWJ1dGVzJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgcXVlcnkgaGFzIF9fdGVtcG9yYWxfIHByZWZpeCBidXQgbm8gaGFuZGxlciBleGlzdHMsIHRocm93IGVycm9yXG4gICAgaWYgKHF1ZXJ5VHlwZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiYgIXRoaXMucXVlcnlIYW5kbGVycy5oYXMocXVlcnlUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSBxdWVyeSBuYW1lOiAnJHtxdWVyeVR5cGV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbnRlcmNlcHRvcnMgaWYgaXQncyBhbiBpbnRlcm5hbCBxdWVyeS5cbiAgICBjb25zdCBpc0ludGVybmFsUXVlcnkgPVxuICAgICAgcXVlcnlUeXBlLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSB8fFxuICAgICAgcXVlcnlUeXBlID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBxdWVyeVR5cGUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUU7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gaXNJbnRlcm5hbFF1ZXJ5ID8gW10gOiB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kO1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9ycywgJ2hhbmRsZVF1ZXJ5JywgdGhpcy5xdWVyeVdvcmtmbG93TmV4dEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgZXhlY3V0ZSh7XG4gICAgICBxdWVyeU5hbWU6IHF1ZXJ5VHlwZSxcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMpLFxuICAgICAgcXVlcnlJZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSkudGhlbihcbiAgICAgIChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVRdWVyeShxdWVyeUlkLCByZXN1bHQpLFxuICAgICAgKHJlYXNvbikgPT4gdGhpcy5mYWlsUXVlcnkocXVlcnlJZCwgcmVhc29uKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZG9VcGRhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgaWQ6IHVwZGF0ZUlkLCBwcm90b2NvbEluc3RhbmNlSWQsIG5hbWUsIGhlYWRlcnMsIHJ1blZhbGlkYXRvciB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXVwZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIGlkJyk7XG4gICAgfVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHVwZGF0ZSBuYW1lJyk7XG4gICAgfVxuICAgIGlmICghcHJvdG9jb2xJbnN0YW5jZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIHByb3RvY29sSW5zdGFuY2VJZCcpO1xuICAgIH1cblxuICAgIC8vIElmIHVwZGF0ZSBoYXMgX190ZW1wb3JhbF8gcHJlZml4IGJ1dCBubyBoYW5kbGVyIGV4aXN0cywgdGhyb3cgZXJyb3JcbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiYgIXRoaXMudXBkYXRlSGFuZGxlcnMuZ2V0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlIHVwZGF0ZSBuYW1lOiAnJHtuYW1lfScsIHdpdGggcmVzZXJ2ZWQgcHJlZml4OiAnJHtURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVh9J2ApO1xuICAgIH1cblxuICAgIC8vIFNraXAgaW50ZXJjZXB0b3JzIGlmIGl0J3MgYW4gaW50ZXJuYWwgdXBkYXRlLlxuICAgIGNvbnN0IGlzSW50ZXJuYWxVcGRhdGUgPVxuICAgICAgbmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgfHxcbiAgICAgIG5hbWUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIG5hbWUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUU7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gaXNJbnRlcm5hbFVwZGF0ZSA/IFtdIDogdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZDtcblxuICAgIGNvbnN0IGVudHJ5ID1cbiAgICAgIHRoaXMudXBkYXRlSGFuZGxlcnMuZ2V0KG5hbWUpID8/XG4gICAgICAodGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlclxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMuZGVmYXVsdFVwZGF0ZUhhbmRsZXIuYmluZCh1bmRlZmluZWQsIG5hbWUpLFxuICAgICAgICAgICAgdmFsaWRhdG9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGEgd2FybmluZyBwb2xpY3kuXG4gICAgICAgICAgICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsKTtcblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gZW50cnkgZnJvbSBlaXRoZXIgc291cmNlLCBidWZmZXIgYW5kIHJldHVyblxuICAgIGlmIChlbnRyeSA9PSBudWxsKSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1ha2VJbnB1dCA9ICgpOiBVcGRhdGVJbnB1dCA9PiAoe1xuICAgICAgdXBkYXRlSWQsXG4gICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uaW5wdXQpLFxuICAgICAgbmFtZSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgaXMgcmVzcG9uc2libGUgZm9yIHVwaG9sZGluZywgYW5kIGNvbnN0cmFpbmVkXG4gICAgLy8gYnksIHRoZSBmb2xsb3dpbmcgY29udHJhY3Q6XG4gICAgLy9cbiAgICAvLyAxLiBJZiBubyB2YWxpZGF0b3IgaXMgcHJlc2VudCB0aGVuIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzIHdpbGwgbm90IGJlIHJ1bi5cbiAgICAvL1xuICAgIC8vIDIuIER1cmluZyB2YWxpZGF0aW9uLCBhbnkgZXJyb3IgbXVzdCBmYWlsIHRoZSBVcGRhdGU7IGR1cmluZyB0aGUgVXBkYXRlXG4gICAgLy8gICAgaXRzZWxmLCBUZW1wb3JhbCBlcnJvcnMgZmFpbCB0aGUgVXBkYXRlIHdoZXJlYXMgb3RoZXIgZXJyb3JzIGZhaWwgdGhlXG4gICAgLy8gICAgYWN0aXZhdGlvbi5cbiAgICAvL1xuICAgIC8vIDMuIFRoZSBoYW5kbGVyIG11c3Qgbm90IHNlZSBhbnkgbXV0YXRpb25zIG9mIHRoZSBhcmd1bWVudHMgbWFkZSBieSB0aGVcbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA0LiBBbnkgZXJyb3Igd2hlbiBkZWNvZGluZy9kZXNlcmlhbGl6aW5nIGlucHV0IG11c3QgYmUgY2F1Z2h0IGFuZCByZXN1bHRcbiAgICAvLyAgICBpbiByZWplY3Rpb24gb2YgdGhlIFVwZGF0ZSBiZWZvcmUgaXQgaXMgYWNjZXB0ZWQsIGV2ZW4gaWYgdGhlcmUgaXMgbm9cbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA1LiBUaGUgaW5pdGlhbCBzeW5jaHJvbm91cyBwb3J0aW9uIG9mIHRoZSAoYXN5bmMpIFVwZGF0ZSBoYW5kbGVyIHNob3VsZFxuICAgIC8vICAgIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSAoc3luYykgdmFsaWRhdG9yIGNvbXBsZXRlcyBzdWNoIHRoYXQgdGhlcmUgaXNcbiAgICAvLyAgICBtaW5pbWFsIG9wcG9ydHVuaXR5IGZvciBhIGRpZmZlcmVudCBjb25jdXJyZW50IHRhc2sgdG8gYmUgc2NoZWR1bGVkXG4gICAgLy8gICAgYmV0d2VlbiB0aGVtLlxuICAgIC8vXG4gICAgLy8gNi4gVGhlIHN0YWNrIHRyYWNlIHZpZXcgcHJvdmlkZWQgaW4gdGhlIFRlbXBvcmFsIFVJIG11c3Qgbm90IGJlIHBvbGx1dGVkXG4gICAgLy8gICAgYnkgcHJvbWlzZXMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gdXNlciBjb2RlLiBUaGlzIGltcGxpZXMgdGhhdFxuICAgIC8vICAgIGFzeW5jL2F3YWl0IHN5bnRheCBtYXkgbm90IGJlIHVzZWQuXG4gICAgLy9cbiAgICAvLyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBkZWxpYmVyYXRlbHkgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGJlbG93LlxuICAgIC8vIFRoZXNlIGFyZSBjYXVnaHQgZWxzZXdoZXJlIGFuZCBmYWlsIHRoZSBjb3JyZXNwb25kaW5nIGFjdGl2YXRpb24uXG4gICAgY29uc3QgZG9VcGRhdGVJbXBsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGlucHV0OiBVcGRhdGVJbnB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChydW5WYWxpZGF0b3IgJiYgZW50cnkudmFsaWRhdG9yKSB7XG4gICAgICAgICAgLy8gVGVtcG9yYXJpbHkgbWFyayBhcyBub3QgcmVwbGF5aW5nIGhpc3RvcnkgZXZlbnRzIGR1cmluZyB2YWxpZGF0b3IgZXhlY3V0aW9uXG4gICAgICAgICAgLy8gc28gdGhhdCBsb2dnaW5nIGlzIHBlcm1pdHRlZC4gVmFsaWRhdG9ycyBhcmUgbGl2ZSByZWFkLW9ubHkgb3BlcmF0aW9ucy5cbiAgICAgICAgICBjb25zdCB3YXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzID0gdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZ0hpc3RvcnlFdmVudHM7XG4gICAgICAgICAgdGhpcy5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm8pID0+ICh7XG4gICAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgICAgdW5zYWZlOiB7IC4uLmluZm8udW5zYWZlLCBpc1JlcGxheWluZ0hpc3RvcnlFdmVudHM6IGZhbHNlIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgICAgICAgIGludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgJ3ZhbGlkYXRlVXBkYXRlJyxcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkudmFsaWRhdG9yKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhbGlkYXRlKG1ha2VJbnB1dCgpKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm8pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmluZm8sXG4gICAgICAgICAgICAgIHVuc2FmZTogeyAuLi5pbmZvLnVuc2FmZSwgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiB3YXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gbWFrZUlucHV0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hY2NlcHRVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkKTtcbiAgICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICBpbnRlcmNlcHRvcnMsXG4gICAgICAgICdoYW5kbGVVcGRhdGUnLFxuICAgICAgICB0aGlzLnVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkuaGFuZGxlcilcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHVuZmluaXNoZWRQb2xpY3kgfSA9IGVudHJ5O1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5zZXQodXBkYXRlSWQsIHsgbmFtZSwgdW5maW5pc2hlZFBvbGljeSwgaWQ6IHVwZGF0ZUlkIH0pO1xuICAgICAgY29uc3QgcmVzID0gZXhlY3V0ZShpbnB1dClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gdGhpcy5jb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIHJlc3VsdCkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZShlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLmRlbGV0ZSh1cGRhdGVJZCkpO1xuICAgICAgdW50cmFja1Byb21pc2UocmVzKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICB1bnRyYWNrUHJvbWlzZShVcGRhdGVTY29wZS51cGRhdGVXaXRoSW5mbyh1cGRhdGVJZCwgbmFtZSwgZG9VcGRhdGVJbXBsKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlTmV4dEhhbmRsZXIoaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXdhaXQgaGFuZGxlciguLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyKHZhbGlkYXRvcjogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiB2b2lkIHtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICB2YWxpZGF0b3IoLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkVXBkYXRlcyA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzO1xuICAgIHdoaWxlIChidWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciwgc28gYWxsIHVwZGF0ZXMgYXJlIGRpc3BhdGNoYWJsZS5cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGJ1ZmZlcmVkVXBkYXRlcy5zaGlmdCgpO1xuICAgICAgICAvLyBMb2dpY2FsbHksIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGFzIHdlJ3JlIGluIHRoZSBsb29wLlxuICAgICAgICAvLyBCdXQgVHlwZXNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBzbyB3ZSB1c2UgYSBub24tbnVsbCBhc3NlcnRpb24gKCEpLlxuICAgICAgICB0aGlzLmRvVXBkYXRlKHVwZGF0ZSEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGJ1ZmZlcmVkVXBkYXRlcy5maW5kSW5kZXgoKHVwZGF0ZSkgPT4gdGhpcy51cGRhdGVIYW5kbGVycy5oYXModXBkYXRlLm5hbWUgYXMgc3RyaW5nKSk7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgIC8vIE5vIGJ1ZmZlcmVkIFVwZGF0ZXMgaGF2ZSBhIGhhbmRsZXIgeWV0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFt1cGRhdGVdID0gYnVmZmVyZWRVcGRhdGVzLnNwbGljZShmb3VuZEluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5kb1VwZGF0ZSh1cGRhdGUhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzLnNoaWZ0KCk7XG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKFxuICAgICAgICAgIHVwZGF0ZS5wcm90b2NvbEluc3RhbmNlSWQhLFxuICAgICAgICAgIEFwcGxpY2F0aW9uRmFpbHVyZS5ub25SZXRyeWFibGUoYE5vIHJlZ2lzdGVyZWQgaGFuZGxlciBmb3IgdXBkYXRlOiAke3VwZGF0ZS5uYW1lfWApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzaWduYWxOYW1lLCBhcmdzIH06IFNpZ25hbElucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBhd2FpdCBmbiguLi5hcmdzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKHNpZ25hbE5hbWUsIC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoYE5vIHJlZ2lzdGVyZWQgc2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbDogJHtzaWduYWxOYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaWduYWxXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVNpZ25hbFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBzaWduYWxOYW1lLCBoZWFkZXJzIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghc2lnbmFsTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHNpZ25hbE5hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBzaWduYWwgaGFzIF9fdGVtcG9yYWxfIHByZWZpeCBidXQgbm8gaGFuZGxlciBleGlzdHMsIHRocm93IGVycm9yXG4gICAgaWYgKHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmICF0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWxOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYENhbm5vdCB1c2Ugc2lnbmFsIG5hbWU6ICcke3NpZ25hbE5hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHNpZ25hbC5cbiAgICBjb25zdCBpc0ludGVybmFsU2lnbmFsID1cbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FO1xuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGlzSW50ZXJuYWxTaWduYWwgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG5cbiAgICBpZiAoIXRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbE5hbWUpICYmICF0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkU2lnbmFscy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciB0aGVuIHRoZSB1bmZpbmlzaGVkXG4gICAgLy8gcG9saWN5IGlzIFdBUk5fQU5EX0FCQU5ET047IHVzZXJzIGN1cnJlbnRseSBoYXZlIG5vIHdheSB0byBzaWxlbmNlIGFueVxuICAgIC8vIGVuc3Vpbmcgd2FybmluZ3MuXG4gICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9XG4gICAgICB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuXG4gICAgY29uc3Qgc2lnbmFsRXhlY3V0aW9uTnVtID0gdGhpcy5zaWduYWxIYW5kbGVyRXhlY3V0aW9uU2VxKys7XG4gICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5zZXQoc2lnbmFsRXhlY3V0aW9uTnVtLCB7IG5hbWU6IHNpZ25hbE5hbWUsIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlU2lnbmFsJywgdGhpcy5zaWduYWxXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGV4ZWN1dGUoe1xuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmlucHV0KSxcbiAgICAgIHNpZ25hbE5hbWUsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUuYmluZCh0aGlzKSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuaW5Qcm9ncmVzc1NpZ25hbHMuZGVsZXRlKHNpZ25hbEV4ZWN1dGlvbk51bSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkU2lnbmFscyA9IHRoaXMuYnVmZmVyZWRTaWduYWxzO1xuICAgIHdoaWxlIChidWZmZXJlZFNpZ25hbHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcikge1xuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmYXVsdCBzaWduYWwgaGFuZGxlciwgc28gYWxsIHNpZ25hbHMgYXJlIGRpc3BhdGNoYWJsZVxuXG4gICAgICAgIHRoaXMuc2lnbmFsV29ya2Zsb3coYnVmZmVyZWRTaWduYWxzLnNoaWZ0KCkhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBidWZmZXJlZFNpZ25hbHMuZmluZEluZGV4KChzaWduYWwpID0+IHRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbC5zaWduYWxOYW1lIGFzIHN0cmluZykpO1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGJyZWFrO1xuICAgICAgICBjb25zdCBbc2lnbmFsXSA9IGJ1ZmZlcmVkU2lnbmFscy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuc2lnbmFsV29ya2Zsb3coc2lnbmFsISk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVNpZ25hbEV4dGVybmFsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignc2lnbmFsV29ya2Zsb3cnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLmZhaWx1cmUpIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVSZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvdyhcbiAgICBhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVSZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvd1xuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2FuY2VsV29ya2Zsb3cnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLmZhaWx1cmUpIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgZ2V0V2FybmFibGUgPSAoaGFuZGxlckV4ZWN1dGlvbnM6IEl0ZXJhYmxlPE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPik6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10gPT4ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oaGFuZGxlckV4ZWN1dGlvbnMpLmZpbHRlcihcbiAgICAgICAgKGV4KSA9PiBleC51bmZpbmlzaGVkUG9saWN5ID09PSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCB3YXJuYWJsZVVwZGF0ZXMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVVcGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2Uod2FybmFibGVVcGRhdGVzKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmFibGVTaWduYWxzID0gZ2V0V2FybmFibGUodGhpcy5pblByb2dyZXNzU2lnbmFscy52YWx1ZXMoKSk7XG4gICAgaWYgKHdhcm5hYmxlU2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihtYWtlVW5maW5pc2hlZFNpZ25hbEhhbmRsZXJNZXNzYWdlKHdhcm5hYmxlU2lnbmFscykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSYW5kb21TZWVkKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JVXBkYXRlUmFuZG9tU2VlZCk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWN0aXZhdGlvbiB3aXRoIHJhbmRvbW5lc3NTZWVkIGF0dHJpYnV0ZScpO1xuICAgIH1cbiAgICB0aGlzLnJhbmRvbSA9IGFsZWEoYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZC50b0J5dGVzKCkpO1xuICB9XG5cbiAgcHVibGljIG5vdGlmeUhhc1BhdGNoKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JTm90aWZ5SGFzUGF0Y2gpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcpXG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1VuZXhwZWN0ZWQgbm90aWZ5SGFzUGF0Y2ggam9iIG9uIG5vbi1yZXBsYXkgYWN0aXZhdGlvbicpO1xuICAgIGlmICghYWN0aXZhdGlvbi5wYXRjaElkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3RpZnlIYXNQYXRjaCBtaXNzaW5nIHBhdGNoIGlkJyk7XG4gICAgdGhpcy5rbm93blByZXNlbnRQYXRjaGVzLmFkZChhY3RpdmF0aW9uLnBhdGNoSWQpO1xuICB9XG5cbiAgcHVibGljIHBhdGNoSW50ZXJuYWwocGF0Y2hJZDogc3RyaW5nLCBkZXByZWNhdGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud29ya2Zsb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdQYXRjaGVzIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBXb3JrZmxvdyBzdGFydHMnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlUGF0Y2ggPSAhdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyB8fCB0aGlzLmtub3duUHJlc2VudFBhdGNoZXMuaGFzKHBhdGNoSWQpO1xuICAgIC8vIEF2b2lkIHNlbmRpbmcgY29tbWFuZHMgZm9yIHBhdGNoZXMgY29yZSBhbHJlYWR5IGtub3dzIGFib3V0LlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGVuYWJsZXMgZGV2ZWxvcG1lbnQgb2YgYXV0b21hdGljIHBhdGNoaW5nIHRvb2xzLlxuICAgIGlmICh1c2VQYXRjaCAmJiAhdGhpcy5zZW50UGF0Y2hlcy5oYXMocGF0Y2hJZCkpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgICBzZXRQYXRjaE1hcmtlcjogeyBwYXRjaElkLCBkZXByZWNhdGVkIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VudFBhdGNoZXMuYWRkKHBhdGNoSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlUGF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGVhcmx5IHdoaWxlIGhhbmRsaW5nIGFuIGFjdGl2YXRpb24gdG8gcmVnaXN0ZXIga25vd24gZmxhZ3MuXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBwdWJsaWMgYWRkS25vd25GbGFncyhmbGFnczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgZmxhZ3MpIHtcbiAgICAgIGFzc2VydFZhbGlkRmxhZyhmbGFnKTtcbiAgICAgIHRoaXMua25vd25GbGFncy5hZGQoZmxhZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIFNESyBGbGFnIG1heSBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFNESyBmbGFncyBwbGF5IGEgcm9sZSBzaW1pbGFyIHRvIHRoZSBgcGF0Y2hlZCgpYCBBUEksIGJ1dCBhcmUgbWVhbnQgZm9yIGludGVybmFsIHVzYWdlIGJ5IHRoZVxuICAgKiBTREsgaXRzZWxmLiBUaGV5IG1ha2UgaXQgcG9zc2libGUgZm9yIHRoZSBTREsgdG8gZXZvbHZlIGl0cyBiZWhhdmlvcnMgb3ZlciB0aW1lLCB3aGlsZSBzdGlsbFxuICAgKiBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggV29ya2Zsb3cgaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IG9sZGVyIFNES3MsIHdpdGhvdXQgY2F1c2luZ1xuICAgKiBkZXRlcm1pbmlzbSB2aW9sYXRpb25zLlxuICAgKlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGhhc0ZsYWcoZmxhZzogU2RrRmxhZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmtub3duRmxhZ3MuaGFzKGZsYWcuaWQpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIElmIG5vdCByZXBsYXlpbmcsIGVuYWJsZSB0aGUgZmxhZyBpZiBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gU2V0dGluZyBhXG4gICAgLy8gZmxhZydzIGRlZmF1bHQgdG8gZmFsc2UgYWxsb3dzIHByb2dyZXNzaXZlIHJvbGxvdXQgb2YgbmV3IGZlYXR1cmUgZmxhZ3MsIHdpdGggdGhlIHBvc3NpYmlsaXR5XG4gICAgLy8gb2YgcmV2ZXJ0aW5nIGJhY2sgdG8gYSB2ZXJzaW9uIG9mIHRoZSBTREsgd2hlcmUgdGhlIGZsYWcgaXMgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgIC8vIEl0IGlzIGFsc28gdXNlZnVsIGZvciB0ZXN0aW5nIHB1cnBvc2UuXG4gICAgaWYgKCF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuZGVmYXVsdCkge1xuICAgICAgdGhpcy5rbm93bkZsYWdzLmFkZChmbGFnLmlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdoZW4gcmVwbGF5aW5nLCBhIGZsYWcgaXMgY29uc2lkZXJlZCBlbmFibGVkIGlmIGl0IHdhcyBlbmFibGVkIGR1cmluZyB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIG9mXG4gICAgLy8gdGhhdCBXb3JrZmxvdyBUYXNrOyB0aGlzIGlzIG5vcm1hbGx5IGRldGVybWluZWQgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBmbGFnIElEIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgLy8gV0ZUIENvbXBsZXRlZCdzIGBzZGtNZXRhZGF0YS5sYW5nVXNlZEZsYWdzYC5cbiAgICAvL1xuICAgIC8vIFNESyBGbGFnIEFsdGVybmF0ZSBDb25kaXRpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgYSBmbGFnIHNob3VsZFxuICAgIC8vIGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV0ZUOyBlLmcuIGJ5IGxvb2tpbmcgYXQgdGhlIHZlcnNpb24gb2YgdGhlIFNESyB0aGF0XG4gICAgLy8gZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVCBlbWl0dGVkXG4gICAgLy8gYnkgcHJldmlvdXMgU0RLcyB0aGF0IGNvbnRhaW5lZCBhIGJ1Zy4gQWx0IENvbmRpdGlvbnMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IGNvbmRpdGlvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIHdoaWxlIHJlcGxheWluZy4gQWxzbywgYWx0ZXJuYXRlIGNvbmRpdGlvbnMgd2lsbCBub3RcbiAgICAvLyBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIFwidXNlZCBmbGFnc1wiIHNldCwgd2hpY2ggbWVhbnMgdGhhdCBmdXJ0aGVyIFdvcmtmbG93IFRhc2tzXG4gICAgLy8gbWF5IG5vdCByZWZsZWN0IHRoaXMgZmxhZyBpZiB0aGUgY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3RcbiAgICAvLyBiZWhhdmlvcnMgaW4gY2FzZSB3aGVyZSBhIFdvcmtmbG93IEV4ZWN1dGlvbiBoYXMgZ29uZSB0aHJvdWdoIGEgbmV3ZXIgU0RLIHZlcnNpb24gdGhlbiBhZ2FpblxuICAgIC8vIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICAgIGlmICh0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuYWx0ZXJuYXRpdmVDb25kaXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmQgb2YgZmxhZy5hbHRlcm5hdGl2ZUNvbmRpdGlvbnMpIHtcbiAgICAgICAgaWYgKGNvbmQoeyBpbmZvOiB0aGlzLmluZm8sIHNka1ZlcnNpb246IHRoaXMuc2RrVmVyc2lvbiB9KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUZyb21DYWNoZSgpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ3JlbW92ZUZyb21DYWNoZSBhY3RpdmF0aW9uIGpvYiBzaG91bGQgbm90IHJlYWNoIHdvcmtmbG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBmYWlsdXJlcyBpbnRvIGEgY29tbWFuZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIFVzZWQgdG8gaGFuZGxlIGFueSBmYWlsdXJlIGVtaXR0ZWQgYnkgdGhlIFdvcmtmbG93LlxuICAgKi9cbiAgaGFuZGxlV29ya2Zsb3dGYWlsdXJlKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkICYmIGlzQ2FuY2VsbGF0aW9uKGVycm9yKSkge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNhbmNlbFdvcmtmbG93RXhlY3V0aW9uOiB7fSB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udGludWVBc05ldykge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbjogZXJyb3IuY29tbWFuZCB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdy4gV2UgZG8gbm90IHdhbnQgdG8gaXNzdWUgdW5maW5pc2hlZEhhbmRsZXJzIHdhcm5pbmdzLiBUbyBhY2hpZXZlIHRoYXQsIHdlXG4gICAgICAvLyBtYXJrIGFsbCBoYW5kbGVycyBhcyBjb21wbGV0ZWQgbm93LlxuICAgICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5jbGVhcigpO1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5jbGVhcigpO1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGZhaWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5lcnJvclRvRmFpbHVyZShlcnJvciksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWNvcmRXb3JrZmxvd1Rhc2tFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcmVjb3JkV29ya2Zsb3dUYXNrRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGtlZXAgdGhlIGZpcnN0IGVycm9yIHRoYXQgYnViYmxlcyB1cDsgc3Vic2VxdWVudCBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkLlxuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yID09PSB1bmRlZmluZWQpIHRoaXMud29ya2Zsb3dUYXNrRXJyb3IgPSBlcnJvcjtcblxuICAgIC8vIEltbWVkaWF0ZWx5IHJldGhyb3cgdGhlIGVycm9yIGlmIHdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBzbyAoaS5lLiB3ZSBhcmUgbm90IHJ1bm5pbmcgYXN5bmNcbiAgICAvLyBtaWNyb3Rhc2tzKS4gT3RoZXJ3aXNlLCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biB3aGVuZXZlciB3ZSBnZXQgYW4gb3Bwb3J0dW5pdHkgdG8gZG8gc28sXG4gICAgLy8gZS5nLiB0aGUgbmV4dCB0aW1lIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCBpcyBjYWxsZWQuXG4gICAgaWYgKHRoaXMucmV0aHJvd1N5bmNocm9ub3VzbHkpIHRoaXMubWF5YmVSZXRocm93V29ya2Zsb3dUYXNrRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIFdvcmtmbG93IFRhc2sgZXJyb3Igd2FzIGNhcHR1cmVkLCBhbmQgd2UgYXJlIHJ1bm5pbmcgaW4gc3luY2hyb25vdXMgbW9kZSxcbiAgICogdGhlbiBidWJibGUgaXQgdXAgbm93LiBUaGlzIGlzIHNhZmUgdG8gY2FsbCBldmVuIGlmIHRoZXJlIGlzIG5vIGVycm9yIHRvIHJldGhyb3cuXG4gICAqL1xuICBtYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgdGhyb3cgdGhpcy53b3JrZmxvd1Rhc2tFcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVRdWVyeShxdWVyeUlkOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgcmVzcG9uZFRvUXVlcnk6IHsgcXVlcnlJZCwgc3VjY2VlZGVkOiB7IHJlc3BvbnNlOiB0aGlzLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHJlc3VsdCkgfSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWlsUXVlcnkocXVlcnlJZDogc3RyaW5nLCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgcmVzcG9uZFRvUXVlcnk6IHtcbiAgICAgICAgcXVlcnlJZCxcbiAgICAgICAgZmFpbGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWNjZXB0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7IHVwZGF0ZVJlc3BvbnNlOiB7IHByb3RvY29sSW5zdGFuY2VJZCwgYWNjZXB0ZWQ6IHt9IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlVXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nLCByZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHVwZGF0ZVJlc3BvbnNlOiB7IHByb3RvY29sSW5zdGFuY2VJZCwgY29tcGxldGVkOiB0aGlzLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHJlc3VsdCkgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nLCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgdXBkYXRlUmVzcG9uc2U6IHtcbiAgICAgICAgcHJvdG9jb2xJbnN0YW5jZUlkLFxuICAgICAgICByZWplY3RlZDogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uc3VtZSBhIGNvbXBsZXRpb24gaWYgaXQgZXhpc3RzIGluIFdvcmtmbG93IHN0YXRlICovXG4gIHByaXZhdGUgbWF5YmVDb25zdW1lQ29tcGxldGlvbjxLIGV4dGVuZHMga2V5b2YgQWN0aXZhdG9yWydjb21wbGV0aW9ucyddPihcbiAgICB0eXBlOiBLLFxuICAgIHRhc2tTZXE6IG51bWJlclxuICApOiBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLmNvbXBsZXRpb25zW3R5cGVdLmdldCh0YXNrU2VxKTtcbiAgICBpZiAoY29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbXBsZXRpb25zW3R5cGVdLmRlbGV0ZSh0YXNrU2VxKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBsZXRpb24gYXMgSW5mZXJNYXBWYWx1ZTxBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ11bS10+IHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIENvbnN1bWUgYSBjb21wbGV0aW9uIGlmIGl0IGV4aXN0cyBpbiBXb3JrZmxvdyBzdGF0ZSwgdGhyb3dzIGlmIGl0IGRvZXNuJ3QgKi9cbiAgcHJpdmF0ZSBjb25zdW1lQ29tcGxldGlvbjxLIGV4dGVuZHMga2V5b2YgQWN0aXZhdG9yWydjb21wbGV0aW9ucyddPihcbiAgICB0eXBlOiBLLFxuICAgIHRhc2tTZXE6IG51bWJlclxuICApOiBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4ge1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24odHlwZSwgdGFza1NlcSk7XG4gICAgaWYgKGNvbXBsZXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKGBObyBjb21wbGV0aW9uIGZvciB0YXNrU2VxICR7dGFza1NlcX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBsZXRpb247XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlV29ya2Zsb3cocmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgIHJlc3VsdDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duKTogUHJvdG9GYWlsdXJlIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ29udmVydGVyLmVycm9yVG9GYWlsdXJlKGVyciwgdGhpcy5wYXlsb2FkQ29udmVydGVyKTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSk6IEVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VxPFQgZXh0ZW5kcyB7IHNlcT86IG51bWJlciB8IG51bGwgfT4oYWN0aXZhdGlvbjogVCk6IG51bWJlciB7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRpb24uc2VxO1xuICBpZiAoc2VxID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBHb3QgYWN0aXZhdGlvbiB3aXRoIG5vIHNlcSBhdHRyaWJ1dGVgKTtcbiAgfVxuICByZXR1cm4gc2VxO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5maW5pc2hlZFVwZGF0ZUhhbmRsZXJNZXNzYWdlKGhhbmRsZXJFeGVjdXRpb25zOiBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbltdKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBcbltUTVBSTDExMDJdIFdvcmtmbG93IGZpbmlzaGVkIHdoaWxlIGFuIHVwZGF0ZSBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnVwZGF0ZSBoYW5kbGVyIHdhcyBkb2luZywgYW5kIHRoZSBjbGllbnQgdGhhdCBzZW50IHRoZSB1cGRhdGUgd2lsbCByZWNlaXZlIGEgJ3dvcmtmbG93IGV4ZWN1dGlvblxuYWxyZWFkeSBjb21wbGV0ZWQnIFJQQ0Vycm9yIGluc3RlYWQgb2YgdGhlIHVwZGF0ZSByZXN1bHQuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsXG5oYW5kbGVycyB0byBjb21wbGV0ZSBieSB1c2luZyBcXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuXG5BbHRlcm5hdGl2ZWx5LCBpZiBib3RoIHlvdSBhbmQgdGhlIGNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnNcbndoZW4gdGhlIHdvcmtmbG93IGZpbmlzaGVzLCBhbmQgY2F1c2luZyBjbGllbnRzIHRvIHJlY2VpdmUgZXJyb3JzLCB0aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnlcbnBhc3NpbmcgYW4gb3B0aW9uIHdoZW4gc2V0dGluZyB0aGUgaGFuZGxlcjpcblxcYHdvcmtmbG93LnNldEhhbmRsZXIobXlVcGRhdGUsIG15VXBkYXRlSGFuZGxlciwge3VuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LkFCQU5ET059KTtcXGAuYFxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGAke21lc3NhZ2V9IFRoZSBmb2xsb3dpbmcgdXBkYXRlcyB3ZXJlIHVuZmluaXNoZWQgKGFuZCB3YXJuaW5ncyB3ZXJlIG5vdCBkaXNhYmxlZCBmb3IgdGhlaXIgaGFuZGxlcik6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgaGFuZGxlckV4ZWN1dGlvbnMubWFwKChleCkgPT4gKHsgbmFtZTogZXgubmFtZSwgaWQ6IGV4LmlkIH0pKVxuICApfWA7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYSBzaWduYWwgaGFuZGxlciB3YXMgc3RpbGwgcnVubmluZy4gVGhpcyBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB3b3JrIHRoYXQgdGhlXG5zaWduYWwgaGFuZGxlciB3YXMgZG9pbmcuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nXG5cXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuIEFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGVcbmNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnMgd2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsXG50aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnkgcGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVNpZ25hbCwgbXlTaWduYWxIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG5cbiAgICAucmVwbGFjZSgvXFxuL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IG5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBleCBvZiBoYW5kbGVyRXhlY3V0aW9ucykge1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZXMuZ2V0KGV4Lm5hbWUpIHx8IDA7XG4gICAgbmFtZXMuc2V0KGV4Lm5hbWUsIGNvdW50ICsgMSk7XG4gIH1cblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyBzaWduYWxzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBBcnJheS5mcm9tKG5hbWVzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgY291bnRdKSA9PiAoeyBuYW1lLCBjb3VudCB9KSlcbiAgKX1gO1xufVxuIiwiaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJjZXB0b3JzJztcbmltcG9ydCB7IFNka0NvbXBvbmVudCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgeyB0eXBlIFNpbmssIHR5cGUgU2lua3MsIHByb3h5U2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IGlzQ2FuY2VsbGF0aW9uIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0luZm8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29udGludWVBc05ldyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgY3VycmVudFVwZGF0ZUluZm8sIGluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi93b3JrZmxvdyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dMb2dnZXIgZXh0ZW5kcyBTaW5rIHtcbiAgdHJhY2UobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG59XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbG9ncyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXJcbiAqXG4gKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIExvZ2dlclNpbmtzIGRpcmVjdGx5LiBUbyBsb2cgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2UgdGhlIGBsb2dgIG9iamVjdFxuICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclNpbmtzRGVwcmVjYXRlZCBleHRlbmRzIFNpbmtzIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gICAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAgICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICAgKi9cbiAgZGVmYXVsdFdvcmtlckxvZ2dlcjogV29ya2Zsb3dMb2dnZXI7XG59XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbG9ncyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJTaW5rc0ludGVybmFsIGV4dGVuZHMgU2lua3Mge1xuICBfX3RlbXBvcmFsX2xvZ2dlcjogV29ya2Zsb3dMb2dnZXI7XG59XG5cbmNvbnN0IGxvZ2dlclNpbmsgPSBwcm94eVNpbmtzPExvZ2dlclNpbmtzSW50ZXJuYWw+KCkuX190ZW1wb3JhbF9sb2dnZXI7XG5cbi8qKlxuICogU3ltYm9sIHVzZWQgYnkgdGhlIFNESyBsb2dnZXIgdG8gZXh0cmFjdCBhIHRpbWVzdGFtcCBmcm9tIGxvZyBhdHRyaWJ1dGVzLlxuICogQWxzbyBkZWZpbmVkIGluIGB3b3JrZXIvbG9nZ2VyLnRzYCAtIGludGVudGlvbmFsbHkgbm90IHNoYXJlZC5cbiAqL1xuY29uc3QgTG9nVGltZXN0YW1wID0gU3ltYm9sLmZvcignbG9nX3RpbWVzdGFtcCcpO1xuXG4vKipcbiAqIERlZmF1bHQgd29ya2Zsb3cgbG9nZ2VyLlxuICpcbiAqIFRoaXMgbG9nZ2VyIGlzIHJlcGxheS1hd2FyZSBhbmQgd2lsbCBvbWl0IGxvZyBtZXNzYWdlcyBvbiB3b3JrZmxvdyByZXBsYXkuIE1lc3NhZ2VzIGVtaXR0ZWQgYnkgdGhpcyBsb2dnZXIgYXJlXG4gKiBmdW5uZWxsZWQgdGhyb3VnaCBhIHNpbmsgdGhhdCBmb3J3YXJkcyB0aGVtIHRvIHRoZSBsb2dnZXIgcmVnaXN0ZXJlZCBvbiB7QGxpbmsgUnVudGltZS5sb2dnZXJ9LlxuICpcbiAqIEF0dHJpYnV0ZXMgZnJvbSB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24gY29udGV4dCBhcmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBhcyBtZXRhZGF0YSBvbiBldmVyeSBsb2dcbiAqIGVudHJpZXMuIEFuIGV4dHJhIGBzZGtDb21wb25lbnRgIG1ldGFkYXRhIGF0dHJpYnV0ZSBpcyBhbHNvIGFkZGVkLCB3aXRoIHZhbHVlIGB3b3JrZmxvd2A7IHRoaXMgY2FuIGJlIHVzZWQgZm9yXG4gKiBmaW5lLWdyYWluZWQgZmlsdGVyaW5nIG9mIGxvZyBlbnRyaWVzIGZ1cnRoZXIgZG93bnN0cmVhbS5cbiAqXG4gKiBUbyBjdXN0b21pemUgbG9nIGF0dHJpYnV0ZXMsIHJlZ2lzdGVyIGEge0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yfSB0aGF0IGludGVyY2VwdHMgdGhlXG4gKiBgZ2V0TG9nQXR0cmlidXRlcygpYCBtZXRob2QuXG4gKlxuICogTm90aWNlIHRoYXQgc2luY2Ugc2lua3MgYXJlIHVzZWQgdG8gcG93ZXIgdGhpcyBsb2dnZXIsIGFueSBsb2cgYXR0cmlidXRlcyBtdXN0IGJlIHRyYW5zZmVyYWJsZSB2aWEgdGhlXG4gKiB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS93b3JrZXJfdGhyZWFkcy5odG1sI3dvcmtlcl90aHJlYWRzX3BvcnRfcG9zdG1lc3NhZ2VfdmFsdWVfdHJhbnNmZXJsaXN0IHwgcG9zdE1lc3NhZ2V9XG4gKiBBUEkuXG4gKlxuICogTk9URTogU3BlY2lmeWluZyBhIGN1c3RvbSBsb2dnZXIgdGhyb3VnaCB7QGxpbmsgZGVmYXVsdFNpbmt9IG9yIGJ5IG1hbnVhbGx5IHJlZ2lzdGVyaW5nIGEgc2luayBuYW1lZFxuICogYGRlZmF1bHRXb3JrZXJMb2dnZXJgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Uge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgbG9nOiBXb3JrZmxvd0xvZ2dlciA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgKFsndHJhY2UnLCAnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ10gYXMgQXJyYXk8a2V5b2YgV29ya2Zsb3dMb2dnZXI+KS5tYXAoKGxldmVsKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGxldmVsLFxuICAgICAgKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cubG9nKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJyk7XG4gICAgICAgIGNvbnN0IGdldExvZ0F0dHJpYnV0ZXMgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdnZXRMb2dBdHRyaWJ1dGVzJywgKGEpID0+IGEpO1xuICAgICAgICByZXR1cm4gbG9nZ2VyU2lua1tsZXZlbF0hKG1lc3NhZ2UsIHtcbiAgICAgICAgICAvLyBJbmplY3QgdGhlIGNhbGwgdGltZSBpbiBuYW5vc2Vjb25kIHJlc29sdXRpb24gYXMgZXhwZWN0ZWQgYnkgdGhlIHdvcmtlciBsb2dnZXIuXG4gICAgICAgICAgW0xvZ1RpbWVzdGFtcF06IGFjdGl2YXRvci5nZXRUaW1lT2ZEYXkoKSxcbiAgICAgICAgICBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZmxvdyxcbiAgICAgICAgICAuLi5nZXRMb2dBdHRyaWJ1dGVzKHdvcmtmbG93TG9nQXR0cmlidXRlcyhhY3RpdmF0b3IuaW5mbykpLFxuICAgICAgICAgIC4uLmF0dHJzLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgXTtcbiAgfSlcbikgYXMgYW55O1xuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVdpdGhMaWZlY3ljbGVMb2dnaW5nKGZuOiAoKSA9PiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGxvZy5kZWJ1ZygnV29ya2Zsb3cgc3RhcnRlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICBjb25zdCBwID0gZm4oKS50aGVuKFxuICAgIChyZXMpID0+IHtcbiAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29tcGxldGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICAvLyBBdm9pZCB1c2luZyBpbnN0YW5jZW9mIGNoZWNrcyBpbiBjYXNlIHRoZSBtb2R1bGVzIHRoZXkncmUgZGVmaW5lZCBpbiBsb2FkZWQgbW9yZSB0aGFuIG9uY2UsXG4gICAgICAvLyBlLmcuIGJ5IGplc3Qgb3Igd2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBhcmUgaW5zdGFsbGVkLlxuICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNDYW5jZWxsYXRpb24oZXJyb3IpKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb21wbGV0ZWQgYXMgY2FuY2VsbGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb250aW51ZUFzTmV3KSB7XG4gICAgICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3JywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKCdXb3JrZmxvdyBmYWlsZWQnLCB7IGVycm9yLCBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICk7XG4gIC8vIEF2b2lkIHNob3dpbmcgdGhpcyBpbnRlcmNlcHRvciBpbiBzdGFjayB0cmFjZSBxdWVyeVxuICB1bnRyYWNrUHJvbWlzZShwKTtcbiAgcmV0dXJuIHA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG1hcCBvZiBhdHRyaWJ1dGVzIHRvIGJlIHNldCBfYnkgZGVmYXVsdF8gb24gbG9nIG1lc3NhZ2VzIGZvciBhIGdpdmVuIFdvcmtmbG93LlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFdvcmtmbG93IGNvbnRleHQgKGVnLiBieSB0aGUgd29ya2VyIGl0c2VsZikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0xvZ0F0dHJpYnV0ZXMoaW5mbzogV29ya2Zsb3dJbmZvKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBhdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIG5hbWVzcGFjZTogaW5mby5uYW1lc3BhY2UsXG4gICAgdGFza1F1ZXVlOiBpbmZvLnRhc2tRdWV1ZSxcbiAgICB3b3JrZmxvd0lkOiBpbmZvLndvcmtmbG93SWQsXG4gICAgcnVuSWQ6IGluZm8ucnVuSWQsXG4gICAgd29ya2Zsb3dUeXBlOiBpbmZvLndvcmtmbG93VHlwZSxcbiAgfTtcbiAgaWYgKGluV29ya2Zsb3dDb250ZXh0KCkpIHtcbiAgICBjb25zdCB1cGRhdGVJbmZvID0gY3VycmVudFVwZGF0ZUluZm8oKTtcbiAgICBpZiAodXBkYXRlSW5mbykge1xuICAgICAgLy8gQWRkIHVwZGF0ZSBpbmZvIGlmIGl0IGV4aXN0c1xuICAgICAgYXR0cmlidXRlc1sndXBkYXRlSWQnXSA9IHVwZGF0ZUluZm8uaWQ7XG4gICAgICBhdHRyaWJ1dGVzWyd1cGRhdGVOYW1lJ10gPSB1cGRhdGVJbmZvLm5hbWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBNZXRyaWNDb3VudGVyLFxuICBNZXRyaWNHYXVnZSxcbiAgTWV0cmljSGlzdG9ncmFtLFxuICBNZXRyaWNNZXRlcixcbiAgTWV0cmljVGFncyxcbiAgTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBTaW5rLCBTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgd29ya2Zsb3dJbmZvIH0gZnJvbSAnLi93b3JrZmxvdyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG5jbGFzcyBXb3JrZmxvd01ldHJpY01ldGVySW1wbCBpbXBsZW1lbnRzIE1ldHJpY01ldGVyIHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNyZWF0ZUNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY0NvdW50ZXIge1xuICAgIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFwiV29ya2Zsb3cncyBgbWV0cmljTWV0ZXJgIGNhbiBvbmx5IGJlIHVzZWQgd2hpbGUgaW4gV29ya2Zsb3cgQ29udGV4dFwiKTtcbiAgICByZXR1cm4gbmV3IFdvcmtmbG93TWV0cmljQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0dhdWdlKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlciB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNNZXRlcmApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljQ291bnRlciBpbXBsZW1lbnRzIE1ldHJpY0NvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdjb3VudGVyJztcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlVHlwZSA9ICdpbnQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFnczogTWV0cmljVGFncyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNDb3VudGVyIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIChnb3QgJHt2YWx1ZX0pYCk7XG4gICAgfVxuICAgIGlmICghd29ya2Zsb3dJbmZvKCkudW5zYWZlLmlzUmVwbGF5aW5nKSB7XG4gICAgICBtZXRyaWNTaW5rLmFkZE1ldHJpY0NvdW50ZXJWYWx1ZSh0aGlzLm5hbWUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIGV4dHJhVGFncyk7XG4gICAgfVxuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljQ291bnRlcmApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljSGlzdG9ncmFtIGltcGxlbWVudHMgTWV0cmljSGlzdG9ncmFtIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnaGlzdG9ncmFtJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgcmVjb3JkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFnczogTWV0cmljVGFncyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNIaXN0b2dyYW0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgKGdvdCAke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgaWYgKCF3b3JrZmxvd0luZm8oKS51bnNhZmUuaXNSZXBsYXlpbmcpIHtcbiAgICAgIG1ldHJpY1NpbmsucmVjb3JkTWV0cmljSGlzdG9ncmFtVmFsdWUodGhpcy5uYW1lLCB0aGlzLnZhbHVlVHlwZSwgdGhpcy51bml0LCB0aGlzLmRlc2NyaXB0aW9uLCB2YWx1ZSwgZXh0cmFUYWdzKTtcbiAgICB9XG4gIH1cblxuICB3aXRoVGFncyhfdGFnczogTWV0cmljVGFncyk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgLy8gVGFncyBjb21wb3NpdGlvbiBpcyBoYW5kbGVkIGJ5IGEgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIHdyYXBwZXIgb3ZlciB0aGlzIG9uZVxuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aFRhZ3MgaXMgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBvbiBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbWApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljR2F1Z2UgaW1wbGVtZW50cyBNZXRyaWNHYXVnZSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2dhdWdlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIHRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNHYXVnZSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoZ290ICR7dmFsdWV9KWApO1xuICAgIH1cbiAgICBpZiAoIXdvcmtmbG93SW5mbygpLnVuc2FmZS5pc1JlcGxheWluZykge1xuICAgICAgbWV0cmljU2luay5zZXRNZXRyaWNHYXVnZVZhbHVlKHRoaXMubmFtZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIHRhZ3MgPz8ge30pO1xuICAgIH1cbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNHYXVnZWApO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8gTm90ZTogZ2l2ZW4gdGhhdCBmb3J3YXJkaW5nIG1ldHJpY3Mgb3V0c2lkZSBvZiB0aGUgc2FuYm94IGNhbiBiZSBxdWl0ZSBjaGF0dHkgYW5kIGFkZCBub25cbi8vIG5lZ2xpZ2VhYmxlIG92ZXJoZWFkLCB3ZSBlYWdlcmx5IGNoZWNrIGZvciBgaXNSZXBsYXlpbmdgIGFuZCBjb21wbGV0ZWx5IHNraXAgZG9pbmcgc2lua1xuLy8gY2FsbHMgaWYgd2UgYXJlIHJlcGxheWluZy5cbmNvbnN0IG1ldHJpY1NpbmsgPSBwcm94eVNpbmtzPE1ldHJpY1NpbmtzPigpLl9fdGVtcG9yYWxfbWV0cmljcztcblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBtZXRyaWNzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlci5cbiAqXG4gKiBUaGVzZSBzaW5rIGZ1bmN0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHdvcmtmbG93IGNvZGU7IGluc3RlYWQsXG4gKiBkZXZlbG9wZXJzIHNob3VsZCB1c2UgdGhlIGBtZXRyaWNNZXRlcmAgb2JqZWN0IGV4cG9zZWQgdG8gd29ya2Zsb3cgY29kZSBieSB0aGUgU0RLLCB3aGljaFxuICogcHJvdmlkZXMgYW4gQVBJIHRoYXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aC5cbiAqXG4gKiBUaGlzIHNpbmsgaW50ZXJmYWNlIGlzIGFsc28gbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IHVzZXIuXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsIFVzZXJzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBub3IgdXNlIGl0IGRpcmVjdGx5LiBVc2UgYG1ldHJpY01ldGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1NpbmtzIGV4dGVuZHMgU2lua3Mge1xuICBfX3RlbXBvcmFsX21ldHJpY3M6IFdvcmtmbG93TWV0cmljTWV0ZXI7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGludGVybmFsIFVzZXJzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBub3IgdXNlIGl0IGRpcmVjdGx5LiBVc2UgYG1ldHJpY01ldGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93TWV0cmljTWV0ZXIgZXh0ZW5kcyBTaW5rIHtcbiAgYWRkTWV0cmljQ291bnRlclZhbHVlKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG5cbiAgcmVjb3JkTWV0cmljSGlzdG9ncmFtVmFsdWUoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG5cbiAgc2V0TWV0cmljR2F1Z2VWYWx1ZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgYXR0cnM6IE1ldHJpY1RhZ3NcbiAgKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIE1ldHJpY01ldGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW1pdCBtZXRyaWNzIGZyb20gd2l0aGluIGEgV29ya2Zsb3cuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgY29uc3QgbWV0cmljTWV0ZXI6IE1ldHJpY01ldGVyID0gTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzLmNvbXBvc2UoXG4gIG5ldyBXb3JrZmxvd01ldHJpY01ldGVySW1wbCgpLFxuICAoKSA9PiB7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93Lm1ldHJpY01ldGVyIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICAgIGNvbnN0IGdldE1ldHJpY1RhZ3MgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdnZXRNZXRyaWNUYWdzJywgKGEpID0+IGEpO1xuXG4gICAgY29uc3QgaW5mbyA9IGFjdGl2YXRvci5pbmZvO1xuICAgIHJldHVybiBnZXRNZXRyaWNUYWdzKHtcbiAgICAgIC8vIG5hbWVzcGFjZSBhbmQgdGFza1F1ZXVlIHdpbGwgYmUgYWRkZWQgYnkgdGhlIFdvcmtlclxuICAgICAgd29ya2Zsb3dUeXBlOiBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB9KTtcbiAgfSxcbiAgdHJ1ZVxuKTtcbiIsImltcG9ydCB0eXBlICogYXMgbmV4dXMgZnJvbSAnbmV4dXMtcnBjJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb1RzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IHVzZXJNZXRhZGF0YVRvUGF5bG9hZCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdXNlci1tZXRhZGF0YSc7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgU3RhcnROZXh1c09wZXJhdGlvbklucHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuLyoqXG4gKiBBIE5leHVzIGNsaWVudCBmb3IgaW52b2tpbmcgTmV4dXMgT3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh1c1NlcnZpY2VDbGllbnQ8VCBleHRlbmRzIG5leHVzLlNlcnZpY2VEZWZpbml0aW9uPiB7XG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24gdGFraW5nIGEge0BsaW5rIG5leHVzLm9wZXJhdGlvbn0uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBleGVjdXRlT3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgb3A6IE8sXG4gICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PE8+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj47XG5cbiAgLy8gVE9ETyhuZXh1cy9wb3N0LWluaXRpYWwtcmVsZWFzZSk6IFJldmlzaXQgdGhlIFwiT3BlcmF0aW9uIFByb3BlcnR5IE5hbWVcIiB0ZXJtaW5vbG9neSxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZWZsZWN0IGluIHRoZSBOZXh1cyBSUEMgU0RLLlxuXG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQW4gT3BlcmF0aW9uJ3MgX3Byb3BlcnR5IG5hbWVfIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB1c2VkIHRvIGRlZmluZSB0aGF0IE9wZXJhdGlvbiBpblxuICAgKiB0aGUge0BsaW5rIG5leHVzLlNlcnZpY2VEZWZpbml0aW9ufSBvYmplY3Q7IGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICAgKiBpZiBvbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoZSB7QGxpbmsgbmV4dXMuT3BlcmF0aW9uRGVmaW5pdGlvbn0gb2JqZWN0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIGV4ZWN1dGVPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj47XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIHRha2luZyBhIHtAbGluayBuZXh1cy5vcGVyYXRpb259LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIE9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgIG9wOiBPLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxPPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+PjtcblxuICAvKipcbiAgICogU3RhcnQgYSBOZXh1cyBPcGVyYXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgT3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBBbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGVmaW5lIHRoYXQgT3BlcmF0aW9uIGluXG4gICAqIHRoZSB7QGxpbmsgbmV4dXMuU2VydmljZURlZmluaXRpb259IG9iamVjdDsgaXQgbWF5IGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgYG5hbWVgIHByb3BlcnR5XG4gICAqIGlmIG9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIHtAbGluayBuZXh1cy5PcGVyYXRpb25EZWZpbml0aW9ufSBvYmplY3QuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnRPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj4+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHVzT3BlcmF0aW9uSGFuZGxlPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBPcGVyYXRpb24ncyBzZXJ2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0aW9uIHRva2VuIGFzIHNldCBieSB0aGUgT3BlcmF0aW9uJ3MgaGFuZGxlci4gTWF5IGJlIGVtcHR5IGlmIHRoZSBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2FpdCBmb3IgT3BlcmF0aW9uIGNvbXBsZXRpb24gYW5kIGdldCBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dXNTZXJ2aWNlQ2xpZW50T3B0aW9uczxUPiB7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHNlcnZpY2U6IFQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTmV4dXMgY2xpZW50IGZvciBpbnZva2luZyBOZXh1cyBPcGVyYXRpb25zIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudDxUIGV4dGVuZHMgbmV4dXMuU2VydmljZURlZmluaXRpb24+KFxuICBvcHRpb25zOiBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zPFQ+XG4pOiBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICBjbGFzcyBOZXh1c1NlcnZpY2VDbGllbnRJbXBsPFQgZXh0ZW5kcyBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbj4gaW1wbGVtZW50cyBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICAgIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb248TyBleHRlbmRzIFRbJ29wZXJhdGlvbnMnXVtrZXlvZiBUWydvcGVyYXRpb25zJ11dPihcbiAgICAgIG9wZXJhdGlvbjogc3RyaW5nIHwgVFsnb3BlcmF0aW9ucyddW25leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+XSxcbiAgICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dPixcbiAgICAgIG9wZXJhdGlvbk9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICAgICk6IFByb21pc2U8bmV4dXMuT3BlcmF0aW9uT3V0cHV0PE8+PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB0aGlzLnN0YXJ0T3BlcmF0aW9uKG9wZXJhdGlvbiwgaW5wdXQsIG9wZXJhdGlvbk9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgICAgb3BlcmF0aW9uOiBzdHJpbmcgfCBUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dLFxuICAgICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0+LFxuICAgICAgb3BlcmF0aW9uT3B0aW9ucz86IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBvcE5hbWUgPVxuICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gLy8gQ2FzdGluZyBhcyBzdHJpbmcgdG8gY292ZXIgdXAgdGhlIGZhY3QgdGhhdCBgb3BOYW1lYCBtaWdodCBiZSB1bmRlZmluZWQuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHRoZW4gYGV4ZWN1dGVgIHdpbGwgcHJvZHVjZSBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmUuTk9UX0ZPVU5EYC5cbiAgICAgICAgICAgIChvcHRpb25zLnNlcnZpY2Uub3BlcmF0aW9uc1tvcGVyYXRpb25dPy5uYW1lIGFzIHN0cmluZylcbiAgICAgICAgICA6IG9wZXJhdGlvbi5uYW1lO1xuXG4gICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5uZXh1c09wZXJhdGlvbisrO1xuXG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nLFxuICAgICAgICBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBpbnRlcmNlcHRvciByZXR1cm5zIGEgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0Piwgd2l0aCB0aGUgcmVzdWx0IHByb21pc2UgY29udGFpbmVkXG4gICAgICAvLyBpbiB0aGF0IE91dHB1dCBvYmplY3QuIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgdGhlIHJlc3VsdCBwcm9taXNlL2NvbXBsZXRpb24gZG9lcyBub3QgZXhpc3RcbiAgICAgIC8vIHVudGlsIHRoZSBTdGFydE5leHVzT3BlcmF0aW9uIGV2ZW50IGlzIHJlY2VpdmVkLiBUaGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBkaWQgaW5cbiAgICAgIC8vIENoaWxkV29ya2Zsb3csIGJ1dCBpcyBtdWNoIGNsZWFuZXIgZnJvbSB0aGUgaW50ZXJjZXB0b3JzIHBvaW50IG9mIHZpZXcuXG4gICAgICBjb25zdCB7IHRva2VuLCByZXN1bHQ6IHJlc3VsdFByb21pc2UgfSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBlbmRwb2ludDogb3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgc2VydmljZTogb3B0aW9ucy5zZXJ2aWNlLm5hbWUsXG4gICAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBvcGVyYXRpb25PcHRpb25zPy5jYW5jZWxsYXRpb25UeXBlID8/ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc2VxLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UubmFtZSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBhc3luYyByZXN1bHQoKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+IHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZSBhcyBuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz47XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTmV4dXNTZXJ2aWNlQ2xpZW50SW1wbDxUPigpO1xufVxuXG5mdW5jdGlvbiBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXIoe1xuICBpbnB1dCxcbiAgZW5kcG9pbnQsXG4gIHNlcnZpY2UsXG4gIG9wdGlvbnMsXG4gIG9wZXJhdGlvbixcbiAgc2VxLFxuICBoZWFkZXJzLFxufTogU3RhcnROZXh1c09wZXJhdGlvbklucHV0KTogUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWQgPVxuICAgICAgICAgICAgIWFjdGl2YXRvci5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvblN0YXJ0LmhhcyhzZXEpICYmXG4gICAgICAgICAgICAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuaGFzKHNlcSk7XG5cbiAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkge1xuICAgICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgcmVxdWVzdENhbmNlbE5leHVzT3BlcmF0aW9uOiB7IHNlcSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZU5leHVzT3BlcmF0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIHNlcnZpY2UsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgbmV4dXNIZWFkZXI6IGhlYWRlcnMsXG4gICAgICAgIGlucHV0OiBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQoaW5wdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zPy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucz8uc2NoZWR1bGVUb1N0YXJ0VGltZW91dCksXG4gICAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnM/LnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUob3B0aW9ucz8uY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnM/LnN1bW1hcnksIHVuZGVmaW5lZCksXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25TdGFydC5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uXG4gKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBPcGVyYXRpb24ncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgV29ya2Zsb3dcbiAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0IHByb21pc2UgZmFpbCB3aXRoIGEgYE5leHVzT3BlcmF0aW9uRmFpbHVyZWAsXG4gKiAgIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAqIE9wZXJhdGlvbiBjYWxsIHdhcyBtYWRlLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG4vLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgZmllbGRcbmV4cG9ydCBjb25zdCBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uLCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciB0aGUgTmV4dXMgb3BlcmF0aW9uIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uIHRvXG4gICAqIHRoZSBjYWxsZXIuIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGNhbmNlbGxhdGlvbiBpcyBkZWxpdmVyZWQgdG8gdGhlIG9wZXJhdGlvbiBpZlxuICAgKiBjYWxsaW5nIHdvcmtmbG93IGV4aXRzIGJlZm9yZSB0aGUgZGVsaXZlcnkgaXMgZG9uZS4gSWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgY2FuY2VsbGF0aW9uIGlzXG4gICAqIGRlbGl2ZXJlZCB0byB0aGUgb3BlcmF0aW9uLCB1c2Uge0BsaW5rIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRH0uXG4gICAqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgT3BlcmF0aW9uLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBPcGVyYXRpb24gSGFuZGxlci4gSW4gcGFydGljdWxhciwgZWl0aGVyIHRoZVxuICAgKiBPcGVyYXRpb24gb3IgdGhlIFdvcmtmbG93IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgT3BlcmF0aW9uIGNvbXBsZXRlZFxuICAgKiBzdWNjZXNzZnVsbHksIGJ1dCB0aGUgV29ya2Zsb3cgdGhpbmtzIGl0IHdhcyBjYW5jZWxsZWQuXG4gICAqXG4gICAqIFRvIGd1YXJhbnRlZSB0aGF0IHRoZSBPcGVyYXRpb24gd2lsbCBldmVudHVhbGx5IGJlIG5vdGlmaWVkIG9mIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCxcbiAgICogdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE9wZXJhdGlvbiwgdGhlbiB3YWl0IGZvciB0aGUgc2VydmVyXG4gICAqIHRvIGNvbmZpcm0gdGhhdCB0aGUgT3BlcmF0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyBkZWxpdmVyZWQgdG8gdGhlIE9wZXJhdGlvbiBIYW5kbGVyLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBPcGVyYXRpb24sIHRoZW4gd2FpdCBmb3IgY29tcGxldGlvblxuICAgKiBvZiB0aGUgT3BlcmF0aW9uLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZV07XG5cbmNvbnN0IFtlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsIF9dID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsubmV4dXMuTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay5uZXh1cy5OZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLm5leHVzLk5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDAsXG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMSxcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAyLFxuICAgIFtOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEXTogMyxcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG4iLCIvLyAuLi9wYWNrYWdlLmpzb24gaXMgb3V0c2lkZSBvZiB0aGUgVFMgcHJvamVjdCByb290RGlyIHdoaWNoIGNhdXNlcyBUUyB0byBjb21wbGFpbiBhYm91dCB0aGlzIGltcG9ydC5cbi8vIFdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSB0aGUgcm9vdERpciBiZWNhdXNlIGl0IG1lc3NlcyB1cCB0aGUgb3V0cHV0IHN0cnVjdHVyZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuZXhwb3J0IGRlZmF1bHQgcGtnIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiIsIi8qKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFdvcmtmbG93IGVuZCBvZiB0aGUgc2lua3MgbWVjaGFuaXNtLlxuICpcbiAqIFNpbmtzIGFyZSBhIG1lY2hhbmlzbSBmb3IgZXhwb3J0aW5nIGRhdGEgZnJvbSB0aGUgV29ya2Zsb3cgaXNvbGF0ZSB0byB0aGVcbiAqIE5vZGUuanMgZW52aXJvbm1lbnQsIHRoZXkgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBXb3JrZmxvdyBoYXMgbm8gd2F5IHRvXG4gKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSBvdXRzaWRlIFdvcmxkLlxuICpcbiAqIFNpbmtzIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgZXhwb3J0aW5nIGxvZ3MsIG1ldHJpY3MgYW5kIHRyYWNlcyBvdXQgZnJvbSB0aGVcbiAqIFdvcmtmbG93LlxuICpcbiAqIFNpbmsgZnVuY3Rpb25zIG1heSBub3QgcmV0dXJuIHZhbHVlcyB0byB0aGUgV29ya2Zsb3cgaW4gb3JkZXIgdG8gcHJldmVudFxuICogYnJlYWtpbmcgZGV0ZXJtaW5pc20uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQW55IGZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gYmUgdXNlZCBmb3IgU2luayBmdW5jdGlvbnMgYXMgbG9uZyBhcyB0aGUgcmV0dXJuIHR5cGUgaXMgYHZvaWRgLlxuICpcbiAqIFdoZW4gY2FsbGluZyBhIFNpbmsgZnVuY3Rpb24sIGFyZ3VtZW50cyBhcmUgY29waWVkIGZyb20gdGhlIFdvcmtmbG93IGlzb2xhdGUgdG8gdGhlIE5vZGUuanMgZW52aXJvbm1lbnQgdXNpbmdcbiAqIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3dvcmtlcl90aHJlYWRzLmh0bWwjd29ya2VyX3RocmVhZHNfcG9ydF9wb3N0bWVzc2FnZV92YWx1ZV90cmFuc2Zlcmxpc3QgfCBwb3N0TWVzc2FnZX0uXG5cbiAqIFRoaXMgY29uc3RyYWlucyB0aGUgYXJndW1lbnQgdHlwZXMgdG8gcHJpbWl0aXZlcyAoZXhjbHVkaW5nIFN5bWJvbHMpLlxuICovXG5leHBvcnQgdHlwZSBTaW5rRnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbi8qKiBBIG1hcHBpbmcgb2YgbmFtZSB0byBmdW5jdGlvbiwgZGVmaW5lcyBhIHNpbmdsZSBzaW5rIChlLmcuIGxvZ2dlcikgKi9cbmV4cG9ydCB0eXBlIFNpbmsgPSBSZWNvcmQ8c3RyaW5nLCBTaW5rRnVuY3Rpb24+O1xuLyoqXG4gKiBXb3JrZmxvdyBTaW5rIGFyZSBhIG1hcHBpbmcgb2YgbmFtZSB0byB7QGxpbmsgU2lua31cbiAqL1xuZXhwb3J0IHR5cGUgU2lua3MgPSBSZWNvcmQ8c3RyaW5nLCBTaW5rPjtcblxuLyoqXG4gKiBDYWxsIGluZm9ybWF0aW9uIGZvciBhIFNpbmtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5rQ2FsbCB7XG4gIGlmYWNlTmFtZTogc3RyaW5nO1xuICBmbk5hbWU6IHN0cmluZztcbiAgYXJnczogYW55W107XG4gIHdvcmtmbG93SW5mbzogV29ya2Zsb3dJbmZvO1xufVxuXG4vKipcbiAqIEdldCBhIHJlZmVyZW5jZSB0byBTaW5rcyBmb3IgZXhwb3J0aW5nIGRhdGEgb3V0IG9mIHRoZSBXb3JrZmxvdy5cbiAqXG4gKiBUaGVzZSBTaW5rcyAqKm11c3QqKiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIFdvcmtlciBpbiBvcmRlciBmb3IgdGhpc1xuICogbWVjaGFuaXNtIHRvIHdvcmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwcm94eVNpbmtzLCBTaW5rcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqXG4gKiBpbnRlcmZhY2UgTXlTaW5rcyBleHRlbmRzIFNpbmtzIHtcbiAqICAgbG9nZ2VyOiB7XG4gKiAgICAgaW5mbyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICogICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gKiAgIH07XG4gKiB9XG4gKlxuICogY29uc3QgeyBsb2dnZXIgfSA9IHByb3h5U2lua3M8TXlEZXBlbmRlbmNpZXM+KCk7XG4gKiBsb2dnZXIuaW5mbygnc2V0dGluZyB1cCcpO1xuICpcbiAqIGV4cG9ydCBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICByZXR1cm4ge1xuICogICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gKiAgICAgICBsb2dnZXIuaW5mbyhcImhleSBob1wiKTtcbiAqICAgICAgIGxvZ2dlci5lcnJvcihcImxldHMgZ29cIik7XG4gKiAgICAgfVxuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eVNpbmtzPFQgZXh0ZW5kcyBTaW5rcz4oKTogVCB7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAge30sXG4gICAge1xuICAgICAgZ2V0KF8sIGlmYWNlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGdldChfLCBmbk5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICAgICAgICAgICAgICAgJ1Byb3hpZWQgc2lua3MgZnVuY3Rpb25zIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhY3RpdmF0b3Iuc2lua0NhbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaWZhY2VOYW1lOiBpZmFjZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgZm5OYW1lOiBmbk5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgLy8gU2luayBmdW5jdGlvbiBkb2Vzbid0IGdldCBjYWxsZWQgaW1tZWRpYXRlbHkuIE1ha2UgYSBjbG9uZSBvZiB0aGUgc2luaydzIGFyZ3MsIHNvIHRoYXQgZnVydGhlciBtdXRhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZXNlIG9iamVjdHMgZG9uJ3QgY29ycnVwdCB0aGUgYXJncyB0aGF0IHRoZSBzaW5rIGZ1bmN0aW9uIHdpbGwgcmVjZWl2ZS4gT25seSBhdmFpbGFibGUgZnJvbSBub2RlIDE3LlxuICAgICAgICAgICAgICAgICAgYXJnczogKGdsb2JhbFRoaXMgYXMgYW55KS5zdHJ1Y3R1cmVkQ2xvbmUgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZShhcmdzKSA6IGFyZ3MsXG4gICAgICAgICAgICAgICAgICAvLyBhY3RpdmF0b3IuaW5mbyBpcyBpbnRlcm5hbGx5IGNvcHktb24td3JpdGUuIFRoaXMgZW5zdXJlIHRoYXQgYW55IGZ1cnRoZXIgbXV0YXRpb25zXG4gICAgICAgICAgICAgICAgICAvLyB0byB0aGUgd29ya2Zsb3cgc3RhdGUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByZXNlbnQgYWN0aXZhdGlvbiB3aWxsIG5vdCBjb3JydXB0IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3dJbmZvIHN0YXRlIHRoYXQgZ2V0cyBwYXNzZWQgd2hlbiB0aGUgc2luayBmdW5jdGlvbiBhY3R1YWxseSBnZXRzIGNhbGxlZC5cbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93SW5mbzogYWN0aXZhdG9yLmluZm8sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfVxuICApIGFzIGFueTtcbn1cbiIsImltcG9ydCB7IG1heWJlR2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHByb21pc2UgZnJvbSBiZWluZyB0cmFja2VkIGZvciBzdGFjayB0cmFjZSBxdWVyeSBwdXJwb3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW50cmFja1Byb21pc2UocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBzdG9yZSA9IG1heWJlR2V0QWN0aXZhdG9yKCk/LnByb21pc2VTdGFja1N0b3JlO1xuICBpZiAoIXN0b3JlKSByZXR1cm47XG4gIHN0b3JlLmNoaWxkVG9QYXJlbnQuZGVsZXRlKHByb21pc2UpO1xuICBzdG9yZS5wcm9taXNlVG9TdGFjay5kZWxldGUocHJvbWlzZSk7XG59XG4iLCJpbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuLyoqXG4gKiBBIGBQcm9taXNlTGlrZWAgaGVscGVyIHdoaWNoIGV4cG9zZXMgaXRzIGByZXNvbHZlYCBhbmQgYHJlamVjdGAgbWV0aG9kcy5cbiAqXG4gKiBUcmlnZ2VyIGlzIENhbmNlbGxhdGlvblNjb3BlLWF3YXJlOiBpdCBpcyBsaW5rZWQgdG8gdGhlIGN1cnJlbnQgc2NvcGUgb25cbiAqIGNvbnN0cnVjdGlvbiBhbmQgdGhyb3dzIHdoZW4gdGhhdCBzY29wZSBpcyBjYW5jZWxsZWQuXG4gKlxuICogVXNlZnVsIGZvciBlLmcuIHdhaXRpbmcgZm9yIHVuYmxvY2tpbmcgYSBXb3JrZmxvdyBmcm9tIGEgU2lnbmFsLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZGVmaW5lU2lnbmFsLCBzZXRIYW5kbGVyLCBzbGVlcCwgVHJpZ2dlciB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqXG4gKiBjb25zdCBjb21wbGV0ZVVzZXJJbnRlcmFjdGlvbiA9IGRlZmluZVNpZ25hbCgnY29tcGxldGVVc2VySW50ZXJhY3Rpb24nKTtcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdE9uVXNlcih1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICogICBjb25zdCB1c2VySW50ZXJhY3Rpb24gPSBuZXcgVHJpZ2dlcjxib29sZWFuPigpO1xuICpcbiAqICAgLy8gcHJvZ3JhbW1hdGljYWxseSByZXNvbHZlIFRyaWdnZXJcbiAqICAgc2V0SGFuZGxlcihjb21wbGV0ZVVzZXJJbnRlcmFjdGlvbiwgKCkgPT4gdXNlckludGVyYWN0aW9uLnJlc29sdmUodHJ1ZSkpO1xuICpcbiAqICAgY29uc3QgdXNlckludGVyYWN0ZWQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3VzZXJJbnRlcmFjdGlvbiwgc2xlZXAoJzMwIGRheXMnKV0pO1xuICogICBpZiAoIXVzZXJJbnRlcmFjdGVkKSB7XG4gKiAgICAgYXdhaXQgc2VuZFJlbWluZGVyRW1haWwodXNlcklkKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4ge1xuICAvLyBUeXBlc2NyaXB0IGRvZXMgbm90IHJlYWxpemUgdGhhdCB0aGUgcHJvbWlzZSBleGVjdXRvciBpcyBydW4gc3luY2hyb25vdXNseSBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyByZWFkb25seSByZXNvbHZlOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyByZWFkb25seSByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgICAvLyBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMucHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuXG4gIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGxcbiAgKTogUHJvbWlzZUxpa2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLnByb21pc2UudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8qKlxuICogT3B0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBVcGRhdGVTY29wZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVNjb3BlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHVwZGF0ZSB0eXBlIG5hbWUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8vIEFzeW5jTG9jYWxTdG9yYWdlIGlzIGluamVjdGVkIHZpYSB2bSBtb2R1bGUgaW50byBnbG9iYWwgc2NvcGUuXG4vLyBJbiBjYXNlIFdvcmtmbG93IGNvZGUgaXMgaW1wb3J0ZWQgaW4gTm9kZS5qcyBjb250ZXh0LCByZXBsYWNlIHdpdGggYW4gZW1wdHkgY2xhc3MuXG5leHBvcnQgY29uc3QgQXN5bmNMb2NhbFN0b3JhZ2U6IG5ldyA8VD4oKSA9PiBBTFM8VD4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLkFzeW5jTG9jYWxTdG9yYWdlID8/IGNsYXNzIHt9O1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlU2NvcGUge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVXBkYXRlU2NvcGVPcHRpb25zKSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQ7XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBzY29wZSBhcyBjdXJyZW50IGFuZCBydW4gdGhlIHVwZGF0ZSBoYW5kbGVyIGBmbmAuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBgZm5gXG4gICAqL1xuICBydW48VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gc3RvcmFnZS5ydW4odGhpcywgZm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBcImFjdGl2ZVwiIHVwZGF0ZSBzY29wZS5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCk6IFVwZGF0ZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3RvcmFnZS5nZXRTdG9yZSgpO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgVXBkYXRlU2NvcGUoeyBpZCwgbmFtZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgdXBkYXRlV2l0aEluZm88VD4oaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGlkLCBuYW1lIH0pLnJ1bihmbik7XG4gIH1cbn1cblxuY29uc3Qgc3RvcmFnZTogQUxTPFVwZGF0ZVNjb3BlPiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuIiwiLyoqXG4gKiBFeHBvcnRlZCBmdW5jdGlvbnMgZm9yIHRoZSBXb3JrZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgV29ya2Zsb3cgaXNvbGF0ZVxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yLCBJbGxlZ2FsU3RhdGVFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB7IHNldEFjdGl2YXRvciwgZ2V0QWN0aXZhdG9yLCBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vLyBFeHBvcnQgdGhlIHR5cGUgZm9yIHVzZSBvbiB0aGUgXCJ3b3JrZXJcIiBzaWRlXG5leHBvcnQgeyBQcm9taXNlU3RhY2tTdG9yZSB9IGZyb20gJy4vaW50ZXJuYWxzJztcblxuY29uc3QgT3JpZ2luYWxEYXRlID0gZ2xvYmFsVGhpcy5EYXRlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGlzb2xhdGUgcnVudGltZS5cbiAqXG4gKiBTZXRzIHJlcXVpcmVkIGludGVybmFsIHN0YXRlIGFuZCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtmbG93IGFuZCBpbnRlcmNlcHRvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0UnVudGltZShvcHRpb25zOiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBuZXcgQWN0aXZhdG9yKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGluZm86IGZpeFByb3RvdHlwZXMoe1xuICAgICAgLi4ub3B0aW9ucy5pbmZvLFxuICAgICAgdW5zYWZlOiB7IC4uLm9wdGlvbnMuaW5mby51bnNhZmUsIG5vdzogT3JpZ2luYWxEYXRlLm5vdyB9LFxuICAgIH0pLFxuICB9KTtcbiAgLy8gVGhlcmUncyBvbmUgYWN0aXZhdG9yIHBlciB3b3JrZmxvdyBpbnN0YW5jZSwgc2V0IGl0IGdsb2JhbGx5IG9uIHRoZSBjb250ZXh0LlxuICAvLyBXZSBkbyB0aGlzIGJlZm9yZSBpbXBvcnRpbmcgYW55IHVzZXIgY29kZSBzbyB1c2VyIGNvZGUgY2FuIHN0YXRpY2FsbHkgcmVmZXJlbmNlIEB0ZW1wb3JhbGlvL3dvcmtmbG93IGZ1bmN0aW9uc1xuICAvLyBhcyB3ZWxsIGFzIERhdGUgYW5kIE1hdGgucmFuZG9tLlxuICBzZXRBY3RpdmF0b3IoYWN0aXZhdG9yKTtcblxuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIC8vIHdlYnBhY2sgYWxpYXMgdG8gcGF5bG9hZENvbnZlcnRlclBhdGhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgPSByZXF1aXJlKCdfX3RlbXBvcmFsX2N1c3RvbV9wYXlsb2FkX2NvbnZlcnRlcicpLnBheWxvYWRDb252ZXJ0ZXI7XG4gICAgLy8gVGhlIGBwYXlsb2FkQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgICBpZiAoY3VzdG9tUGF5bG9hZENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciA9IGN1c3RvbVBheWxvYWRDb252ZXJ0ZXI7XG4gICAgfVxuICAgIC8vIHdlYnBhY2sgYWxpYXMgdG8gZmFpbHVyZUNvbnZlcnRlclBhdGhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgPSByZXF1aXJlKCdfX3RlbXBvcmFsX2N1c3RvbV9mYWlsdXJlX2NvbnZlcnRlcicpLmZhaWx1cmVDb252ZXJ0ZXI7XG4gICAgLy8gVGhlIGBmYWlsdXJlQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgICBpZiAoY3VzdG9tRmFpbHVyZUNvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IuZmFpbHVyZUNvbnZlcnRlciA9IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpbXBvcnRXb3JrZmxvd3MsIGltcG9ydEludGVyY2VwdG9ycyB9ID0gZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX187XG4gICAgaWYgKGltcG9ydFdvcmtmbG93cyA9PT0gdW5kZWZpbmVkIHx8IGltcG9ydEludGVyY2VwdG9ycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGJ1bmRsZSBkaWQgbm90IHJlZ2lzdGVyIGltcG9ydCBob29rcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGltcG9ydEludGVyY2VwdG9ycygpO1xuICAgIGZvciAoY29uc3QgbW9kIG9mIGludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgZmFjdG9yeTogV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5ID0gbW9kLmludGVyY2VwdG9ycztcbiAgICAgIGlmIChmYWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3JrZmxvd3MgaW50ZXJjZXB0b3JzOiBleHBlY3RlZCBhIGZ1bmN0aW9uLCBidXQgZ290OiAnJHtmYWN0b3J5fSdgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBmYWN0b3J5KCk7XG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW5ib3VuZC5wdXNoKC4uLihpbnRlcmNlcHRvcnMuaW5ib3VuZCA/PyBbXSkpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLnB1c2goLi4uKGludGVyY2VwdG9ycy5vdXRib3VuZCA/PyBbXSkpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscy5wdXNoKC4uLihpbnRlcmNlcHRvcnMuaW50ZXJuYWxzID8/IFtdKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kID0gaW1wb3J0V29ya2Zsb3dzKCk7XG4gICAgY29uc3Qgd29ya2Zsb3dGbiA9IG1vZFthY3RpdmF0b3IuaW5mby53b3JrZmxvd1R5cGVdO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZmxvd0ZuID0gbW9kWydkZWZhdWx0J107XG5cbiAgICBpZiAodHlwZW9mIHdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFjdGl2YXRvci53b3JrZmxvdyA9IHdvcmtmbG93Rm47XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmYXVsdFdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFjdGl2YXRvci53b3JrZmxvdyA9IGRlZmF1bHRXb3JrZmxvd0ZuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZXRhaWxzID1cbiAgICAgICAgd29ya2Zsb3dGbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAnbm8gc3VjaCBmdW5jdGlvbiBpcyBleHBvcnRlZCBieSB0aGUgd29ya2Zsb3cgYnVuZGxlJ1xuICAgICAgICAgIDogYGV4cGVjdGVkIGEgZnVuY3Rpb24sIGJ1dCBnb3Q6ICcke3R5cGVvZiB3b3JrZmxvd0ZufSdgO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3cgb2YgdHlwZSAnJHthY3RpdmF0b3IuaW5mby53b3JrZmxvd1R5cGV9JzogJHtkZXRhaWxzfWApO1xuICAgIH1cbiAgICBpZiAoaXNXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMoYWN0aXZhdG9yLndvcmtmbG93KSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYWN0aXZhdG9yLnZlcnNpb25pbmdCZWhhdmlvciA9IGFjdGl2YXRvci53b3JrZmxvdy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zLnZlcnNpb25pbmdCZWhhdmlvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyID0gYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENvcmUgd29uJ3Qgc2VuZCBhbiBldmljdGlvbiBqb2IgYWZ0ZXIgYW4gZWFybHkgZXJyb3IsIHNvIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZ1xuICAgICAgLy8gZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0LiBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHJlc291cmNlIGxlYWtzLlxuICAgICAgZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKF9pbm5lckVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3IgZGlzcG9zaW5nIG9mIGFjdGl2YXRvciwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIE9iamVjdHMgdHJhbnNmZXJlZCB0byB0aGUgVk0gZnJvbSBvdXRzaWRlIGhhdmUgcHJvdG90eXBlcyBiZWxvbmdpbmcgdG8gdGhlXG4gKiBvdXRlciBjb250ZXh0LCB3aGljaCBtZWFucyB0aGF0IGluc3RhbmNlb2Ygd29uJ3Qgd29yayBpbnNpZGUgdGhlIFZNLiBUaGlzXG4gKiBmdW5jdGlvbiByZWN1cnNpdmVseSB3YWxrcyBvdmVyIHRoZSBjb250ZW50IG9mIGFuIG9iamVjdCwgYW5kIHJlY3JlYXRlIHNvbWVcbiAqIG9mIHRoZXNlIG9iamVjdHMgKG5vdGFibHkgQXJyYXksIERhdGUgYW5kIE9iamVjdHMpLlxuICovXG5mdW5jdGlvbiBmaXhQcm90b3R5cGVzPFg+KG9iajogWCk6IFgge1xuICBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopPy5jb25zdHJ1Y3Rvcj8ubmFtZSkge1xuICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSgob2JqIGFzIEFycmF5PHVua25vd24+KS5tYXAoZml4UHJvdG90eXBlcykpIGFzIFg7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iaiBhcyB1bmtub3duIGFzIERhdGUpIGFzIFg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pOiBbc3RyaW5nLCBhbnldID0+IFtrLCBmaXhQcm90b3R5cGVzKHYpXSkpIGFzIFg7XG4gICAgfVxuICB9IGVsc2UgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSB3b3JrZmxvdy4gT3IgdG8gYmUgZXhhY3QsIF9jb21wbGV0ZV8gaW5pdGlhbGl6YXRpb24sIGFzIG1vc3QgcGFydCBoYXMgYmVlbiBkb25lIGluIGNvbnN0cnVjdG9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemUoaW5pdGlhbGl6ZVdvcmtmbG93Sm9iOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IuaW5pdGlhbGl6ZVdvcmtmbG93KGluaXRpYWxpemVXb3JrZmxvd0pvYik7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gYSBjaHVuayBvZiBhY3RpdmF0aW9uIGpvYnMuXG4gKlxuICogTm90aWNlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgYXN5bmMgYW5kIHJ1bnMgX2luc2lkZV8gdGhlIFZNIGNvbnRleHQuIFRoZXJlZm9yZSwgbm8gbWljcm90YXNrXG4gKiB3aWxsIGdldCBleGVjdXRlZCBfd2hpbGVfIHRoaXMgZnVuY3Rpb24gaXMgYWN0aXZlOyB0aGV5IHdpbGwgaG93ZXZlciBnZXQgZXhlY3V0ZWQgX2FmdGVyXyB0aGlzXG4gKiBmdW5jdGlvbiByZXR1cm5zIChpLmUuIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzIGluIHRoZSBWTSB3aWxsIGdldCBleGVjdXRlZCBiZWZvcmUgZXhlY3V0aW9uXG4gKiByZXN1bWVzIG91dCBvZiB0aGUgVk0sIGluIGB2bS1zaGFyZWQudHM6YWN0aXZhdGUoKWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb24sIGJhdGNoSW5kZXggPSAwKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGludGVyY2VwdCA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdhY3RpdmF0ZScsICh7IGFjdGl2YXRpb24gfSkgPT4ge1xuICAgICAgLy8gQ2FzdCBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzIHdoaWNoIGhhcyB0aGUgYHZhcmlhbnRgIGF0dHJpYnV0ZS5cbiAgICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBhY3RpdmF0aW9uIGlzIGEgcHJvdG8gY2xhc3MuXG4gICAgICBjb25zdCBqb2JzID0gYWN0aXZhdGlvbi5qb2JzIGFzIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5Xb3JrZmxvd0FjdGl2YXRpb25Kb2JbXTtcblxuICAgICAgLy8gSW5pdGlhbGl6YXRpb24gd2lsbCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LCBidXQgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBzdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAgIGNvbnN0IHN0YXJ0V29ya2Zsb3dKb2IgPSBqb2JzWzBdPy52YXJpYW50ID09PSAnaW5pdGlhbGl6ZVdvcmtmbG93JyA/IGpvYnMuc2hpZnQoKT8uaW5pdGlhbGl6ZVdvcmtmbG93IDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgIGlmIChqb2IudmFyaWFudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBqb2IudmFyaWFudCB0byBiZSBkZWZpbmVkJyk7XG5cbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGpvYltqb2IudmFyaWFudF07XG4gICAgICAgIGlmICghdmFyaWFudCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgam9iLiR7am9iLnZhcmlhbnR9IHRvIGJlIHNldGApO1xuXG4gICAgICAgIGFjdGl2YXRvcltqb2IudmFyaWFudF0odmFyaWFudCBhcyBhbnkgLyogVFMgY2FuJ3QgaW5mZXIgdGhpcyB0eXBlICovKTtcblxuICAgICAgICBpZiAoam9iLnZhcmlhbnQgIT09ICdxdWVyeVdvcmtmbG93JykgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0V29ya2Zsb3dKb2IpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYlR5cGVzOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iWyd2YXJpYW50J11bXSA9IFtcbiAgICAgICAgICAnaW5pdGlhbGl6ZVdvcmtmbG93JyxcbiAgICAgICAgICAnc2lnbmFsV29ya2Zsb3cnLFxuICAgICAgICAgICdkb1VwZGF0ZScsXG4gICAgICAgICAgJ2NhbmNlbFdvcmtmbG93JyxcbiAgICAgICAgICAndXBkYXRlUmFuZG9tU2VlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChqb2JzLnNvbWUoKGpvYikgPT4gIXNhZmVKb2JUeXBlcy5pbmNsdWRlcyhqb2IudmFyaWFudCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdSZWNlaXZlZCBib3RoIGluaXRpYWxpemVXb3JrZmxvdyBhbmQgbm9uLXNpZ25hbC9ub24tdXBkYXRlIGpvYnMgaW4gdGhlIHNhbWUgYWN0aXZhdGlvbjogJyArXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGpvYnMubWFwKChqb2IpID0+IGpvYi52YXJpYW50KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aXZhdG9yLnN0YXJ0V29ya2Zsb3coc3RhcnRXb3JrZmxvd0pvYik7XG5cbiAgICAgICAgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcmNlcHQoeyBhY3RpdmF0aW9uLCBiYXRjaEluZGV4IH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29uY2x1ZGUgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYWN0aXZhdGlvbiBqb2JzIGFuZCBxdWV1ZWQgbWljcm90YXNrcy5cbiAqXG4gKiBBY3RpdmF0aW9uIGZhaWx1cmVzIGFyZSBoYW5kbGVkIGluIHRoZSBtYWluIE5vZGUuanMgaXNvbGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBjb3Jlc2RrLndvcmtmbG93X2NvbXBsZXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IucmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk7XG4gICAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2NvbmNsdWRlQWN0aXZhdGlvbicsIChpbnB1dCkgPT4gaW5wdXQpO1xuICAgIGNvbnN0IGFjdGl2YXRpb25Db21wbGV0aW9uID0gYWN0aXZhdG9yLmNvbmNsdWRlQWN0aXZhdGlvbigpO1xuICAgIGNvbnN0IHsgY29tbWFuZHMgfSA9IGludGVyY2VwdCh7IGNvbW1hbmRzOiBhY3RpdmF0aW9uQ29tcGxldGlvbi5jb21tYW5kcyB9KTtcbiAgICBpZiAoYWN0aXZhdG9yLmNvbXBsZXRlZCkge1xuICAgICAgYWN0aXZhdG9yLndhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcnVuSWQ6IGFjdGl2YXRvci5pbmZvLnJ1bklkLFxuICAgICAgc3VjY2Vzc2Z1bDoge1xuICAgICAgICAuLi5hY3RpdmF0aW9uQ29tcGxldGlvbixcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yKGFjdGl2YXRpb25Db21wbGV0aW9uLnZlcnNpb25pbmdCZWhhdmlvciksXG4gICAgICB9LFxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29wIHRocm91Z2ggYWxsIGJsb2NrZWQgY29uZGl0aW9ucywgZXZhbHVhdGUgYW5kIHVuYmxvY2sgaWYgcG9zc2libGUuXG4gKlxuICogQHJldHVybnMgbnVtYmVyIG9mIHVuYmxvY2tlZCBjb25kaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTogbnVtYmVyIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgbGV0IG51bVVuYmxvY2tlZCA9IDA7XG4gICAgZm9yICg7Oykge1xuICAgICAgYWN0aXZhdG9yLm1heWJlUmV0aHJvd1dvcmtmbG93VGFza0Vycm9yKCk7XG4gICAgICBjb25zdCBwcmV2VW5ibG9ja2VkID0gbnVtVW5ibG9ja2VkO1xuICAgICAgZm9yIChjb25zdCBbc2VxLCBjb25kXSBvZiBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChjb25kLmZuKCkpIHtcbiAgICAgICAgICBjb25kLnJlc29sdmUoKTtcbiAgICAgICAgICBudW1VbmJsb2NrZWQrKztcbiAgICAgICAgICAvLyBJdCBpcyBzYWZlIHRvIGRlbGV0ZSBlbGVtZW50cyBkdXJpbmcgbWFwIGl0ZXJhdGlvblxuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByZXZVbmJsb2NrZWQgPT09IG51bVVuYmxvY2tlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bVVuYmxvY2tlZDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBIYW5kbGUgZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0IChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBkZXN0cm95aW5nXG4vLyB0aGUgc2FuZGJveCB2bSwgd2hpY2ggbWF5IHBvc3NpYmx5IGJlIHJldXNlZCBpZiBgcmV1c2VWOENvbnRleHRgIGlzIHRydWUpLlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzcG9zZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdkaXNwb3NlJywgYXN5bmMgKCkgPT4ge30pO1xuICAgICAgZGlzcG9zZSh7fSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgIH1cblxuICAgIC8vIERlc3RydWN0b3JzIGFyZSBydW4gb3V0c2lkZSBvZiBpbnRlcmNlcHRvcnMsIGJlY2F1c2UgaW50ZXJjZXB0b3JzIHRoZW1zZWx2ZXMgb2Z0ZW4gcmVseVxuICAgIC8vIG9uIG9iamVjdHMgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZCAobm90YWJseSBBc3luY0xvY2FsU3RvcmFnZSBpbnN0YW5jZXMpLCBhbmQgYmVjYXVzZSB3ZVxuICAgIC8vIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgcmVzb3VyY2VzIGdldCBjbGVhbmVkIHVwIGV2ZW4gaWYgYW4gaW50ZXJjZXB0b3IgdGhyb3dzIGFuIGVycm9yLlxuICAgIC8vIE9ubHkgdGhlIGZpcnN0IGVycm9yIChpZiBhbnkpIGlzIHJldGhyb3duLlxuICAgIGZvciAoY29uc3QgZGVzdHJ1Y3RvciBvZiBhY3RpdmF0b3Iud29ya2Zsb3dTYW5kYm94RGVzdHJ1Y3RvcnMuc3BsaWNlKDApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGFjdGl2YXRvciBpcyBubyBsb25nZXIgdmFsaWQgcGFzdCB0aGlzIHBvaW50LlxuICAgIHNldEFjdGl2YXRvcih1bmRlZmluZWQpO1xuICB9XG59XG5cbi8vIERlc3Ryb3kgdGhlIHNhbmRib3ggVk0gKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRpc3Bvc2luZyBvZiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQpLlxuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3koKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGhhdmUgYmVlbiBkaXNwb3NlZCBmaXJzdCcpO1xuXG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBkZXN0cnVjdG9yIG9mIGdsb2JhbFRoaXMuX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM/LnNwbGljZSgwKSA/PyBbXSkge1xuICAgIHRyeSB7XG4gICAgICBkZXN0cnVjdG9yKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGVycm9yID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyhvYmo6IGFueSk6IG9iaiBpcyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT4ge1xuICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24ob2JqLCAnd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucycpO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgVXBkYXRlRGVmaW5pdGlvbixcbiAgV2l0aFdvcmtmbG93QXJncyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG4gIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGNvbXBpbGVSZXRyeVBvbGljeSxcbiAgY29tcGlsZVByaW9yaXR5LFxuICBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgZXh0cmFjdFdvcmtmbG93VHlwZSxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIG1hcFRvUGF5bG9hZHMsXG4gIHRvUGF5bG9hZHMsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IHVzZXJNZXRhZGF0YVRvUGF5bG9hZCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdXNlci1tZXRhZGF0YSc7XG5pbXBvcnQge1xuICBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyxcbiAgc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyB2ZXJzaW9uaW5nSW50ZW50VG9Qcm90byB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdmVyc2lvbmluZy1pbnRlbnQtZW51bSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIHJlcXVpcmVkVHNUb01zIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgeyB0aHJvd0lmUmVzZXJ2ZWROYW1lIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9yZXNlcnZlZCc7XG5pbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSwgcmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgVXBkYXRlU2NvcGUgfSBmcm9tICcuL3VwZGF0ZS1zY29wZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEFjdGl2aXR5SW5wdXQsXG4gIExvY2FsQWN0aXZpdHlJbnB1dCxcbiAgU2lnbmFsV29ya2Zsb3dJbnB1dCxcbiAgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gIFRpbWVySW5wdXQsXG4gIFRpbWVyT3B0aW9ucyxcbn0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBDaGlsZFdvcmtmbG93T3B0aW9ucyxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBEZWZhdWx0U2lnbmFsSGFuZGxlcixcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBIYW5kbGVyLFxuICBRdWVyeUhhbmRsZXJPcHRpb25zLFxuICBTaWduYWxIYW5kbGVyT3B0aW9ucyxcbiAgVXBkYXRlSGFuZGxlck9wdGlvbnMsXG4gIFdvcmtmbG93SW5mbyxcbiAgVXBkYXRlSW5mbyxcbiAgRGVmYXVsdFVwZGF0ZUhhbmRsZXIsXG4gIERlZmF1bHRRdWVyeUhhbmRsZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ29udGludWVBc05ldyxcbiAgZW5jb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVBhcmVudENsb3NlUG9saWN5LFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTG9jYWxBY3Rpdml0eURvQmFja29mZiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LCBnZXRBY3RpdmF0b3IsIG1heWJlR2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5cbi8vIEF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxucmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKHNsZWVwKTtcblxuLyoqXG4gKiBBZGRzIGRlZmF1bHQgdmFsdWVzIG9mIGB3b3JrZmxvd0lkYCBhbmQgYGNhbmNlbGxhdGlvblR5cGVgIHRvIGdpdmVuIHdvcmtmbG93IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdHM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyB7XG4gIGNvbnN0IHsgYXJncywgd29ya2Zsb3dJZCwgLi4ucmVzdCB9ID0gb3B0cztcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkOiB3b3JrZmxvd0lkID8/IHV1aWQ0KCksXG4gICAgYXJnczogKGFyZ3MgPz8gW10pIGFzIHVua25vd25bXSxcbiAgICBjYW5jZWxsYXRpb25UeXBlOiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc3RhcnRUaW1lciBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuZnVuY3Rpb24gdGltZXJOZXh0SGFuZGxlcih7IHNlcSwgZHVyYXRpb25Ncywgb3B0aW9ucyB9OiBUaW1lcklucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuZGVsZXRlKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKGR1cmF0aW9uTXMpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zPy5zdW1tYXJ5LCB1bmRlZmluZWQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXMgc2xlZXAuXG4gKlxuICogU2NoZWR1bGVzIGEgdGltZXIgb24gdGhlIFRlbXBvcmFsIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyIG9yIDAsIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDEuXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25hbCB0aW1lciBvcHRpb25zIGZvciBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBEdXJhdGlvbiwgb3B0aW9ucz86IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuc2xlZXAoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nKTtcbiAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG5cbiAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDEsIG1zVG9OdW1iZXIobXMpKTtcblxuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc3RhcnRUaW1lcicsIHRpbWVyTmV4dEhhbmRsZXIpO1xuXG4gIHJldHVybiBleGVjdXRlKHtcbiAgICBkdXJhdGlvbk1zLFxuICAgIHNlcSxcbiAgICBvcHRpb25zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnMob3B0aW9uczogQWN0aXZpdHlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVpcmVkIGVpdGhlciBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0IG9yIHN0YXJ0VG9DbG9zZVRpbWVvdXQnKTtcbiAgfVxufVxuXG4vLyBVc2Ugc2FtZSB2YWxpZGF0aW9uIHdlIHVzZSBmb3Igbm9ybWFsIGFjdGl2aXRpZXNcbmNvbnN0IHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMgPSB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucztcblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gYWN0aXZhdG9yIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcih7IG9wdGlvbnMsIGFyZ3MsIGhlYWRlcnMsIHNlcSwgYWN0aXZpdHlUeXBlIH06IEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhY3Rpdml0eUlkOiBvcHRpb25zLmFjdGl2aXR5SWQgPz8gYCR7c2VxfWAsXG4gICAgICAgIGFjdGl2aXR5VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICBoZWFydGJlYXRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgICAgZG9Ob3RFYWdlcmx5RXhlY3V0ZTogIShvcHRpb25zLmFsbG93RWFnZXJEaXNwYXRjaCA/PyB0cnVlKSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAgICAgICBwcmlvcml0eTogb3B0aW9ucy5wcmlvcml0eSA/IGNvbXBpbGVQcmlvcml0eShvcHRpb25zLnByaW9yaXR5KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zdW1tYXJ5LCB1bmRlZmluZWQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVMb2NhbEFjdGl2aXR5TmV4dEhhbmRsZXIoe1xuICBvcHRpb25zLFxuICBhcmdzLFxuICBoZWFkZXJzLFxuICBzZXEsXG4gIGFjdGl2aXR5VHlwZSxcbiAgYXR0ZW1wdCxcbiAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG59OiBMb2NhbEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIC8vIEVhZ2VybHkgZmFpbCB0aGUgbG9jYWwgYWN0aXZpdHkgKHdoaWNoIHdpbGwgaW4gdHVybiBmYWlsIHRoZSB3b3JrZmxvdyB0YXNrLlxuICAvLyBEbyBub3QgZmFpbCBvbiByZXBsYXkgd2hlcmUgdGhlIGxvY2FsIGFjdGl2aXRpZXMgbWF5IG5vdCBiZSByZWdpc3RlcmVkIG9uIHRoZSByZXBsYXkgd29ya2VyLlxuICBpZiAoIWFjdGl2YXRvci5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiAhYWN0aXZhdG9yLnJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLmhhcyhhY3Rpdml0eVR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBMb2NhbCBhY3Rpdml0eSBvZiB0eXBlICcke2FjdGl2aXR5VHlwZX0nIG5vdCByZWdpc3RlcmVkIG9uIHdvcmtlcmApO1xuICB9XG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICByZXF1ZXN0Q2FuY2VsTG9jYWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eToge1xuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCBleHBvc2luZyBhY3Rpdml0eUlkIGFzIGFuIG9wdGlvblxuICAgICAgICBhY3Rpdml0eUlkOiBgJHtzZXF9YCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIC4uLmFyZ3MpLFxuICAgICAgICByZXRyeVBvbGljeTogb3B0aW9ucy5yZXRyeSA/IGNvbXBpbGVSZXRyeVBvbGljeShvcHRpb25zLnJldHJ5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0KSxcbiAgICAgICAgbG9jYWxSZXRyeVRocmVzaG9sZDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5sb2NhbFJldHJ5VGhyZXNob2xkKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMuc3VtbWFyeSwgdW5kZWZpbmVkKSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHk8Uj4oYWN0aXZpdHlUeXBlOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc2NoZWR1bGVBY3Rpdml0eScsIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGFjdGl2aXR5VHlwZSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBvcHRpb25zLFxuICAgIGFyZ3MsXG4gICAgc2VxLFxuICB9KSBhcyBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHk8Uj4oXG4gIGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVMb2NhbEFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMTtcbiAgbGV0IG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5JyxcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgfSkpIGFzIFByb21pc2U8Uj47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTG9jYWxBY3Rpdml0eURvQmFja29mZikge1xuICAgICAgICBhd2FpdCBzbGVlcChyZXF1aXJlZFRzVG9NcyhlcnIuYmFja29mZi5iYWNrb2ZmRHVyYXRpb24sICdiYWNrb2ZmRHVyYXRpb24nKSk7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyLmJhY2tvZmYuYXR0ZW1wdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJhY2tvZmYgYXR0ZW1wdCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdCA9IGVyci5iYWNrb2ZmLmF0dGVtcHQ7XG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gZXJyLmJhY2tvZmYub3JpZ2luYWxTY2hlZHVsZVRpbWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGhlYWRlcnMsXG4gIHdvcmtmbG93VHlwZSxcbiAgc2VxLFxufTogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQpOiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB3b3JrZmxvd0lkID0gb3B0aW9ucy53b3JrZmxvd0lkID8/IHV1aWQ0KCk7XG4gIGNvbnN0IHN0YXJ0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGUgPSAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNoaWxkV29ya2Zsb3dDb21wbGV0ZS5oYXMoc2VxKTtcblxuICAgICAgICAgIGlmICghY29tcGxldGUpIHtcbiAgICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIGNhbmNlbENoaWxkV29ya2Zsb3dFeGVjdXRpb246IHsgY2hpbGRXb3JrZmxvd1NlcTogc2VxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgd29ya2Zsb3dJZCxcbiAgICAgICAgd29ya2Zsb3dUeXBlLFxuICAgICAgICBpbnB1dDogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4ub3B0aW9ucy5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0KSxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLCAvLyBOb3QgY29uZmlndXJhYmxlXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIHdvcmtmbG93SWRSZXVzZVBvbGljeTogZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5KG9wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5KSxcbiAgICAgICAgcGFyZW50Q2xvc2VQb2xpY3k6IGVuY29kZVBhcmVudENsb3NlUG9saWN5KG9wdGlvbnMucGFyZW50Q2xvc2VQb2xpY3kpLFxuICAgICAgICBjcm9uU2NoZWR1bGU6IG9wdGlvbnMuY3JvblNjaGVkdWxlLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA/IHsgaW5kZXhlZEZpZWxkczogZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMob3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzLCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcykgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogb3B0aW9ucy5tZW1vICYmIG1hcFRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMubWVtbyksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgcHJpb3JpdHk6IG9wdGlvbnMucHJpb3JpdHkgPyBjb21waWxlUHJpb3JpdHkob3B0aW9ucy5wcmlvcml0eSkgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnM/LnN0YXRpY1N1bW1hcnksIG9wdGlvbnM/LnN0YXRpY0RldGFpbHMpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93U3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gV2UgY29uc3RydWN0IGEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNoaWxkIFdvcmtmbG93IGJlZm9yZSB3ZSBrbm93XG4gIC8vIGlmIHRoZSBXb3JrZmxvdyBjb2RlIHdpbGwgYXdhaXQgaXQgdG8gY2FwdHVyZSB0aGUgcmVzdWx0IGluIGNhc2UgaXQgZG9lcy5cbiAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIENoYWluIHN0YXJ0IFByb21pc2UgcmVqZWN0aW9uIHRvIHRoZSBjb21wbGV0ZSBQcm9taXNlLlxuICAgIHVudHJhY2tQcm9taXNlKHN0YXJ0UHJvbWlzZS5jYXRjaChyZWplY3QpKTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd0NvbXBsZXRlLnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgfSk7XG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAvLyBQcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb24gYmVjYXVzZSB0aGUgY29tcGxldGlvbiBtaWdodCBub3QgYmUgYXdhaXRlZFxuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIGNvbnN0IHJldCA9IG5ldyBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbc3RhcnRQcm9taXNlLCBjb21wbGV0ZVByb21pc2VdKSk7XG4gIHVudHJhY2tQcm9taXNlKHJldCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzZXEsIHNpZ25hbE5hbWUsIGFyZ3MsIHRhcmdldCwgaGVhZGVycyB9OiBTaWduYWxXb3JrZmxvd0lucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnNpZ25hbFdvcmtmbG93LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7IGNhbmNlbFNpZ25hbFdvcmtmbG93OiB7IHNlcSB9IH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNpZ25hbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhcmdzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgc2lnbmFsTmFtZSxcbiAgICAgICAgLi4uKHRhcmdldC50eXBlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgLi4udGFyZ2V0LndvcmtmbG93RXhlY3V0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaGlsZFdvcmtmbG93SWQ6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGluIHRoZSByZXR1cm4gdHlwZSBvZiBwcm94eSBtZXRob2RzIHRvIG1hcmsgdGhhdCBhbiBhdHRyaWJ1dGUgb24gdGhlIHNvdXJjZSB0eXBlIGlzIG5vdCBhIG1ldGhvZC5cbiAqXG4gKiBAc2VlIHtAbGluayBBY3Rpdml0eUludGVyZmFjZUZvcn1cbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc31cbiAqIEBzZWUge0BsaW5rIHByb3h5TG9jYWxBY3Rpdml0aWVzfVxuICovXG5leHBvcnQgY29uc3QgTm90QW5BY3Rpdml0eU1ldGhvZCA9IFN5bWJvbC5mb3IoJ19fVEVNUE9SQUxfTk9UX0FOX0FDVElWSVRZX01FVEhPRCcpO1xuXG4vKipcbiAqIFR5cGUgaGVscGVyIHRoYXQgdGFrZXMgYSB0eXBlIGBUYCBhbmQgdHJhbnNmb3JtcyBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCB7QGxpbmsgQWN0aXZpdHlGdW5jdGlvbn0gdG9cbiAqIHtAbGluayBOb3RBbkFjdGl2aXR5TWV0aG9kfS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIFVzZWQgYnkge0BsaW5rIHByb3h5QWN0aXZpdGllc30gdG8gZ2V0IHRoaXMgY29tcGlsZS10aW1lIGVycm9yOlxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcmZhY2UgTXlBY3Rpdml0aWVzIHtcbiAqICAgdmFsaWQoaW5wdXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbiAqICAgaW52YWxpZChpbnB1dDogbnVtYmVyKTogbnVtYmVyO1xuICogfVxuICpcbiAqIGNvbnN0IGFjdCA9IHByb3h5QWN0aXZpdGllczxNeUFjdGl2aXRpZXM+KHsgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyB9KTtcbiAqXG4gKiBhd2FpdCBhY3QudmFsaWQodHJ1ZSk7XG4gKiBhd2FpdCBhY3QuaW52YWxpZCgpO1xuICogLy8gXiBUUyBjb21wbGFpbnMgd2l0aDpcbiAqIC8vIChwcm9wZXJ0eSkgaW52YWxpZERlZmluaXRpb246IHR5cGVvZiBOb3RBbkFjdGl2aXR5TWV0aG9kXG4gKiAvLyBUaGlzIGV4cHJlc3Npb24gaXMgbm90IGNhbGxhYmxlLlxuICogLy8gVHlwZSAnU3ltYm9sJyBoYXMgbm8gY2FsbCBzaWduYXR1cmVzLigyMzQ5KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2aXR5SW50ZXJmYWNlRm9yPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24gPyBBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VFtLXT4gOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZDtcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aXZpdHksIG92ZXJyaWRpbmcgaXRzIGV4aXN0aW5nIG9wdGlvbnMgd2l0aCB0aGVcbiAgICogcHJvdmlkZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgQWN0aXZpdHlPcHRpb25zXG4gICAqIEBwYXJhbSBhcmdzOiBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIFRoZSBsb2NhbCBhY3Rpdml0eSBjb3VudGVycGFydCB0byB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbiA/IExvY2FsQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBMb2NhbEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogUnVuIHRoZSBsb2NhbCBhY3Rpdml0eSwgb3ZlcnJpZGluZyBpdHMgZXhpc3Rpbmcgb3B0aW9ucyB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJnczogbGlzdCBvZiBhcmd1bWVudHNcbiAgICogQHJldHVybnMgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpdml0eVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIGV4ZWN1dGVXaXRoT3B0aW9ucyBpcyBhIG5ldyBtZXRob2QgdG8gcHJvdmlkZSBjYWxsLXNpdGUgb3B0aW9ucyBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2VcbiAgICovXG4gIGV4ZWN1dGVXaXRoT3B0aW9ucyhvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZSBBY3Rpdml0eSBmdW5jdGlvbnMgd2l0aCBnaXZlbiB7QGxpbmsgQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9IGZvclxuICogICAgICAgICB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwcm94eUFjdGl2aXRpZXMgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKiBpbXBvcnQgKiBhcyBhY3Rpdml0aWVzIGZyb20gJy4uL2FjdGl2aXRpZXMnO1xuICpcbiAqIC8vIFNldHVwIEFjdGl2aXRpZXMgZnJvbSBtb2R1bGUgZXhwb3J0c1xuICogY29uc3QgeyBodHRwR2V0LCBvdGhlckFjdGl2aXR5IH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzMwIG1pbnV0ZXMnLFxuICogfSk7XG4gKlxuICogLy8gVXNlIGFjdGl2aXRpZXMgd2l0aCBkZWZhdWx0IG9wdGlvbnNcbiAqIGNvbnN0IHJlc3VsdDEgPSBhd2FpdCBodHRwR2V0KCdodHRwOi8vZXhhbXBsZS5jb20nKTtcbiAqXG4gKiAvLyBPdmVycmlkZSBvcHRpb25zIGZvciBzcGVjaWZpYyBhY3Rpdml0eSBjYWxsc1xuICogY29uc3QgcmVzdWx0MiA9IGF3YWl0IGh0dHBHZXQuZXhlY3V0ZVdpdGhPcHRpb25zKHtcbiAqICAgc3RhdGljU3VtbWFyeTogJ0ZldGNoZXMgZGF0YSBmcm9tIGV4dGVybmFsIEFQSScsXG4gKiAgIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ6ICc1bSdcbiAqIH0sIFsnaHR0cDovL2FwaS5leGFtcGxlLmNvbSddKTtcbiAqXG4gKiBjb25zdCByZXN1bHQzID0gYXdhaXQgb3RoZXJBY3Rpdml0eS5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICBzdGF0aWNTdW1tYXJ5OiAnUHJvY2Vzc2VzIHRoZSBmZXRjaGVkIGRhdGEnLFxuICogICB0YXNrUXVldWU6ICdzcGVjaWFsLXRhc2stcXVldWUnXG4gKiB9LCBbZGF0YV0pO1xuICpcbiAqIC8vIFNldHVwIEFjdGl2aXRpZXMgZnJvbSBhbiBleHBsaWNpdCBpbnRlcmZhY2UgKGUuZy4gd2hlbiBkZWZpbmVkIGJ5IGFub3RoZXIgU0RLKVxuICogaW50ZXJmYWNlIEphdmFBY3Rpdml0aWVzIHtcbiAqICAgaHR0cEdldEZyb21KYXZhKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG4gKiAgIHNvbWVPdGhlckphdmFBY3Rpdml0eShhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIH1cbiAqXG4gKiBjb25zdCB7XG4gKiAgIGh0dHBHZXRGcm9tSmF2YSxcbiAqICAgc29tZU90aGVySmF2YUFjdGl2aXR5XG4gKiB9ID0gcHJveHlBY3Rpdml0aWVzPEphdmFBY3Rpdml0aWVzPih7XG4gKiAgIHRhc2tRdWV1ZTogJ2phdmEtd29ya2VyLXRhc2tRdWV1ZScsXG4gKiAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc1bScsXG4gKiB9KTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwR2V0KFwiaHR0cDovL2V4YW1wbGUuY29tXCIpO1xuICogICAvLyBPciB3aXRoIGN1c3RvbSBvcHRpb25zOlxuICogICBjb25zdCByZXNwb25zZTIgPSBhd2FpdCBodHRwR2V0RnJvbUphdmEuZXhlY3V0ZVdpdGhPcHRpb25zKHtcbiAqICAgICBzdGF0aWNTdW1tYXJ5OiAnSmF2YSBIVFRQIGNhbGwgd2l0aCB0aW1lb3V0IG92ZXJyaWRlJyxcbiAqICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMm0nXG4gKiAgIH0sIFtcImh0dHA6Ly9mYXN0LWFwaS5leGFtcGxlLmNvbVwiXSk7XG4gKiAgIC8vIC4uLlxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eUFjdGl2aXRpZXM8QSA9IFVudHlwZWRBY3Rpdml0aWVzPihvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcblxuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+LCB7XG4gICAgZ2V0KF8sIGFjdGl2aXR5VHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBBY3Rpdml0eSB0eXBlcywgZ290OiAke1N0cmluZyhhY3Rpdml0eVR5cGUpfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUFjdGl2aXR5KGFjdGl2aXR5VHlwZSBhcyBzdHJpbmcsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBhY3Rpdml0eVByb3h5RnVuY3Rpb24uZXhlY3V0ZVdpdGhPcHRpb25zID0gZnVuY3Rpb24gKFxuICAgICAgICBvdmVycmlkZU9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyxcbiAgICAgICAgYXJnczogYW55W11cbiAgICAgICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVBY3Rpdml0eShhY3Rpdml0eVR5cGUsIGFyZ3MsIGRlZXBNZXJnZShvcHRpb25zLCBvdmVycmlkZU9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhY3Rpdml0eVByb3h5RnVuY3Rpb247XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uZmlndXJlIExvY2FsIEFjdGl2aXR5IGZ1bmN0aW9ucyB3aXRoIGdpdmVuIHtAbGluayBMb2NhbEFjdGl2aXR5T3B0aW9uc30uXG4gKlxuICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBzZXR1cCBBY3Rpdml0aWVzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMuXG4gKlxuICogQHJldHVybiBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSB8IFByb3h5fVxuICogICAgICAgICBmb3Igd2hpY2ggZWFjaCBhdHRyaWJ1dGUgaXMgYSBjYWxsYWJsZSBBY3Rpdml0eSBmdW5jdGlvblxuICpcbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc30gZm9yIGV4YW1wbGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eUxvY2FsQWN0aXZpdGllczxBID0gVW50eXBlZEFjdGl2aXRpZXM+KFxuICBvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuKTogTG9jYWxBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTG9jYWxBY3Rpdml0eUludGVyZmFjZUZvcjxBPiwge1xuICAgIGdldChfLCBhY3Rpdml0eVR5cGUpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZpdHlUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgQWN0aXZpdHkgdHlwZXMsIGdvdDogJHtTdHJpbmcoYWN0aXZpdHlUeXBlKX1gKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUxvY2FsQWN0aXZpdHkoYWN0aXZpdHlUeXBlIGFzIHN0cmluZywgYXJncywgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uLmV4ZWN1dGVXaXRoT3B0aW9ucyA9IGZ1bmN0aW9uIChcbiAgICAgICAgb3ZlcnJpZGVPcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucyxcbiAgICAgICAgYXJnczogYW55W11cbiAgICAgICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVMb2NhbEFjdGl2aXR5KGFjdGl2aXR5VHlwZSwgYXJncywgZGVlcE1lcmdlKG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBwYXRjaCBhZnRlciBcImVub3VnaFwiIHRpbWUgaGFzIHBhc3NlZFxuY29uc3QgRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIID0gJ19fdGVtcG9yYWxfaW50ZXJuYWxfY29ubmVjdF9leHRlcm5hbF9oYW5kbGVfY2FuY2VsX3RvX3Njb3BlJztcbi8vIFRoZSBuYW1lIG9mIHRoaXMgcGF0Y2ggY29tZXMgZnJvbSBhbiBhdHRlbXB0IHRvIGJ1aWxkIGEgZ2VuZXJpYyBpbnRlcm5hbCBwYXRjaGluZyBtZWNoYW5pc20uXG4vLyBUaGF0IGVmZm9ydCBoYXMgYmVlbiBhYmFuZG9uZWQgaW4gZmF2b3Igb2YgYSBuZXdlciBXb3JrZmxvd1Rhc2tDb21wbGV0ZWRNZXRhZGF0YSBiYXNlZCBtZWNoYW5pc20uXG5jb25zdCBDT05ESVRJT05fMF9QQVRDSCA9ICdfX3Nka19pbnRlcm5hbF9wYXRjaF9udW1iZXI6MSc7XG5cbi8qKlxuICogUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBhbmQgY2FuY2VsIGFuIGV4aXN0aW5nIFdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqIEl0IHRha2VzIGEgV29ya2Zsb3cgSUQgYW5kIG9wdGlvbmFsIHJ1biBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsV29ya2Zsb3dIYW5kbGUod29ya2Zsb3dJZDogc3RyaW5nLCBydW5JZD86IHN0cmluZyk6IEV4dGVybmFsV29ya2Zsb3dIYW5kbGUge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZ2V0RXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4gQ29uc2lkZXIgdXNpbmcgQ2xpZW50LndvcmtmbG93LmdldEhhbmRsZSguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkLFxuICAgIHJ1bklkLFxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIENvbm5lY3QgdGhpcyBjYW5jZWwgb3BlcmF0aW9uIHRvIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiBzY29wZS5cbiAgICAgICAgLy8gVGhpcyBpcyBiZWhhdmlvciB3YXMgaW50cm9kdWNlZCBhZnRlciB2MC4yMi4wIGFuZCBpcyBpbmNvbXBhdGlibGVcbiAgICAgICAgLy8gd2l0aCBoaXN0b3JpZXMgZ2VuZXJhdGVkIHdpdGggcHJldmlvdXMgU0RLIHZlcnNpb25zIGFuZCB0aHVzIHJlcXVpcmVzXG4gICAgICAgIC8vIHBhdGNoaW5nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSB0cnkgdG8gZGVsYXkgcGF0Y2hpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBhdm9pZCBwb2xsdXRpbmdcbiAgICAgICAgLy8gaGlzdG9yaWVzIHVubGVzcyBzdHJpY3RseSByZXF1aXJlZC5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHBhdGNoZWQoRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIKSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgICAgICBpZiAocGF0Y2hlZChFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0gpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLmNhbmNlbFdvcmtmbG93Kys7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgcmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLFxuICAgICAgICAgICAgICB3b3JrZmxvd0lkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jYW5jZWxXb3JrZmxvdy5zZXQoc2VxLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdleHRlcm5hbCcsXG4gICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHsgd29ya2Zsb3dJZCwgcnVuSWQgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqICoqT3ZlcnJpZGUgZm9yIFdvcmtmbG93cyB0aGF0IGFjY2VwdCBubyBhcmd1bWVudHMqKi5cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd1R5cGU6IHN0cmluZyk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoZSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGFueT4+KHdvcmtmbG93RnVuYzogVCk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnN0YXJ0Q2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5zdGFydCguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IGFkZERlZmF1bHRXb3JrZmxvd09wdGlvbnMob3B0aW9ucyA/PyAoe30gYXMgYW55KSk7XG4gIGNvbnN0IHdvcmtmbG93VHlwZSA9IGV4dHJhY3RXb3JrZmxvd1R5cGUod29ya2Zsb3dUeXBlT3JGdW5jKTtcbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJyxcbiAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlclxuICApO1xuICBjb25zdCBbc3RhcnRlZCwgY29tcGxldGVkXSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLmNoaWxkV29ya2Zsb3crKyxcbiAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIHdvcmtmbG93VHlwZSxcbiAgfSk7XG4gIGNvbnN0IGZpcnN0RXhlY3V0aW9uUnVuSWQgPSBhd2FpdCBzdGFydGVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgIGZpcnN0RXhlY3V0aW9uUnVuSWQsXG4gICAgYXN5bmMgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gICAgICByZXR1cm4gKGF3YWl0IGNvbXBsZXRlZCkgYXMgYW55O1xuICAgIH0sXG4gICAgYXN5bmMgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdjaGlsZCcsXG4gICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiBvcHRpb25zV2l0aERlZmF1bHRzLndvcmtmbG93SWQsXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyAoKSA9PiBXb3JrZmxvd1JldHVyblR5cGU+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlT3JGdW5jOiBzdHJpbmcgfCBULFxuICBvcHRpb25zPzogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5leGVjdXRlQ2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5leGVjdXRlKC4uLikgaW5zdGVhZC4nXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgZXhlY1Byb21pc2UgPSBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShleGVjUHJvbWlzZSk7XG4gIGNvbnN0IGNvbXBsZXRlZFByb21pc2UgPSBleGVjUHJvbWlzZS50aGVuKChbX3N0YXJ0ZWQsIGNvbXBsZXRlZF0pID0+IGNvbXBsZXRlZCk7XG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlZFByb21pc2UpO1xuICByZXR1cm4gY29tcGxldGVkUHJvbWlzZSBhcyBQcm9taXNlPGFueT47XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93LlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZyb3plbiBjb3B5IG9mIFdvcmtmbG93SW5mbywgYXQgdGhlIHBvaW50IHdoZXJlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAqIENoYW5nZXMgaGFwcGVuaW5nIGF0IGxhdGVyIHBvaW50IGluIHdvcmtmbG93IGV4ZWN1dGlvbiB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cbiAqXG4gKiBGb3IgdGhpcyByZWFzb24sIHdlIHJlY29tbWVuZCBjYWxsaW5nIGB3b3JrZmxvd0luZm8oKWAgb24gZXZlcnkgYWNjZXNzIHRvIHtAbGluayBXb3JrZmxvd0luZm99J3MgZmllbGRzLFxuICogcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgYFdvcmtmbG93SW5mb2Agb2JqZWN0IChvciBwYXJ0IG9mIGl0KSBpbiBhIGxvY2FsIHZhcmlhYmxlLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogLy8gR09PRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgZG9Tb21ldGhpbmcod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZSh3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKlxuICogdnNcbiAqXG4gKiBgYGB0c1xuICogLy8gQkFEXG4gKiBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICBjb25zdCBhdHRyaWJ1dGVzID0gd29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlc1xuICogICBkb1NvbWV0aGluZyhhdHRyaWJ1dGVzKVxuICogICAuLi5cbiAqICAgZG9Tb21ldGhpbmdFbHNlKGF0dHJpYnV0ZXMpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93SW5mbygpOiBXb3JrZmxvd0luZm8ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dJbmZvKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmluZm87XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHVwZGF0ZSBpZiBhbnkuXG4gKlxuICogQHJldHVybiBJbmZvIGZvciB0aGUgY3VycmVudCB1cGRhdGUgaGFuZGxlciB0aGUgY29kZSBjYWxsaW5nIHRoaXMgaXMgZXhlY3V0aW5nXG4gKiB3aXRoaW4gaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFVwZGF0ZUluZm8oKTogVXBkYXRlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5jdXJyZW50VXBkYXRlSW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIFVwZGF0ZVNjb3BlLmN1cnJlbnQoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGNvZGUgaXMgZXhlY3V0aW5nIGluIHdvcmtmbG93IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluV29ya2Zsb3dDb250ZXh0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF5YmVHZXRBY3RpdmF0b3IoKSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBgZmAgdGhhdCB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIENvbnRpbnVlQXNOZXcgd2hlbiBjYWxsZWQuXG4gKlxuICogYGZgIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgV29ya2Zsb3cgZnVuY3Rpb24gc3VwcGxpZWQgdG8gdHlwZXBhcmFtIGBGYC5cbiAqXG4gKiBPbmNlIGBmYCBpcyBjYWxsZWQsIFdvcmtmbG93IEV4ZWN1dGlvbiBpbW1lZGlhdGVseSBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29udGludWVBc05ld0Z1bmM8RiBleHRlbmRzIFdvcmtmbG93PihcbiAgb3B0aW9ucz86IENvbnRpbnVlQXNOZXdPcHRpb25zXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxGPikgPT4gUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuY29udGludWVBc05ldyguLi4pIGFuZCBXb3JrZmxvdy5tYWtlQ29udGludWVBc05ld0Z1bmMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBjb25zdCBpbmZvID0gYWN0aXZhdG9yLmluZm87XG4gIGNvbnN0IHsgd29ya2Zsb3dUeXBlLCB0YXNrUXVldWUsIC4uLnJlc3QgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJlcXVpcmVkT3B0aW9ucyA9IHtcbiAgICB3b3JrZmxvd1R5cGU6IHdvcmtmbG93VHlwZSA/PyBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB0YXNrUXVldWU6IHRhc2tRdWV1ZSA/PyBpbmZvLnRhc2tRdWV1ZSxcbiAgICAuLi5yZXN0LFxuICB9O1xuXG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICBjb25zdCBmbiA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2NvbnRpbnVlQXNOZXcnLCBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHsgaGVhZGVycywgYXJncywgb3B0aW9ucyB9ID0gaW5wdXQ7XG4gICAgICB0aHJvdyBuZXcgQ29udGludWVBc05ldyh7XG4gICAgICAgIHdvcmtmbG93VHlwZTogb3B0aW9ucy53b3JrZmxvd1R5cGUsXG4gICAgICAgIGFyZ3VtZW50czogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4uYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUsXG4gICAgICAgIG1lbW86IG9wdGlvbnMubWVtbyAmJiBtYXBUb1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLm1lbW8pLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA/IHsgaW5kZXhlZEZpZWxkczogZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMob3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzLCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcykgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcihvcHRpb25zLmluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZuKHtcbiAgICAgIGFyZ3MsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIG9wdGlvbnM6IHJlcXVpcmVkT3B0aW9ucyxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtY29udGludWUtYXMtbmV3LyB8IENvbnRpbnVlcy1Bcy1OZXd9IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvblxuICogd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogU2hvcnRoYW5kIGZvciBgbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEY+KCkoLi4uYXJncylgLiAoU2VlOiB7QGxpbmsgbWFrZUNvbnRpbnVlQXNOZXdGdW5jfS4pXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY29udGludWVBc05ldyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KG46IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICogICAvLyAuLi4gV29ya2Zsb3cgbG9naWNcbiAqICAgYXdhaXQgY29udGludWVBc05ldzx0eXBlb2YgbXlXb3JrZmxvdz4obiArIDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250aW51ZUFzTmV3PEYgZXh0ZW5kcyBXb3JrZmxvdz4oLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIG1ha2VDb250aW51ZUFzTmV3RnVuYygpKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIFJGQyBjb21wbGlhbnQgVjQgdXVpZC5cbiAqIFVzZXMgdGhlIHdvcmtmbG93J3MgZGV0ZXJtaW5pc3RpYyBQUk5HIG1ha2luZyBpdCBzYWZlIGZvciB1c2Ugd2l0aGluIGEgd29ya2Zsb3cuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGluc2VjdXJlLlxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQgfCBzdGFja292ZXJmbG93IGRpc2N1c3Npb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKTogc3RyaW5nIHtcbiAgLy8gUmV0dXJuIHRoZSBoZXhhZGVjaW1hbCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIG51bWJlciBgbmAsIHBhZGRlZCB3aXRoIHplcm9lcyB0byBiZSBvZiBsZW5ndGggYHBgXG4gIGNvbnN0IGhvID0gKG46IG51bWJlciwgcDogbnVtYmVyKSA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydChwLCAnMCcpO1xuICAvLyBDcmVhdGUgYSB2aWV3IGJhY2tlZCBieSBhIDE2LWJ5dGUgYnVmZmVyXG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7XG4gIC8vIEZpbGwgYnVmZmVyIHdpdGggcmFuZG9tIHZhbHVlc1xuICB2aWV3LnNldFVpbnQzMigwLCAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDQsIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoOCwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQzMigxMiwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICAvLyBQYXRjaCB0aGUgNnRoIGJ5dGUgdG8gcmVmbGVjdCBhIHZlcnNpb24gNCBVVUlEXG4gIHZpZXcuc2V0VWludDgoNiwgKHZpZXcuZ2V0VWludDgoNikgJiAweGYpIHwgMHg0MCk7XG4gIC8vIFBhdGNoIHRoZSA4dGggYnl0ZSB0byByZWZsZWN0IGEgdmFyaWFudCAxIFVVSUQgKHZlcnNpb24gNCBVVUlEcyBhcmUpXG4gIHZpZXcuc2V0VWludDgoOCwgKHZpZXcuZ2V0VWludDgoOCkgJiAweDNmKSB8IDB4ODApO1xuICAvLyBDb21waWxlIHRoZSBjYW5vbmljYWwgdGV4dHVhbCBmb3JtIGZyb20gdGhlIGFycmF5IGRhdGFcbiAgcmV0dXJuIGAke2hvKHZpZXcuZ2V0VWludDMyKDApLCA4KX0tJHtobyh2aWV3LmdldFVpbnQxNig0KSwgNCl9LSR7aG8odmlldy5nZXRVaW50MTYoNiksIDQpfS0ke2hvKFxuICAgIHZpZXcuZ2V0VWludDE2KDgpLFxuICAgIDRcbiAgKX0tJHtobyh2aWV3LmdldFVpbnQzMigxMCksIDgpfSR7aG8odmlldy5nZXRVaW50MTYoMTQpLCA0KX1gO1xufVxuXG4vKipcbiAqIFBhdGNoIG9yIHVwZ3JhZGUgd29ya2Zsb3cgY29kZSBieSBjaGVja2luZyBvciBzdGF0aW5nIHRoYXQgdGhpcyB3b3JrZmxvdyBoYXMgYSBjZXJ0YWluIHBhdGNoLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvdmVyc2lvbmluZyB8IGRvY3MgcGFnZX0gZm9yIGluZm8uXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIHJlcGxheWluZyBhbiBleGlzdGluZyBoaXN0b3J5LCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoYXRcbiAqIGhpc3Rvcnkgd2FzIHByb2R1Y2VkIGJ5IGEgd29ya2VyIHdoaWNoIGFsc28gaGFkIGEgYHBhdGNoZWRgIGNhbGwgd2l0aCB0aGUgc2FtZSBgcGF0Y2hJZGAuXG4gKiBJZiB0aGUgaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgKndpdGhvdXQqIHN1Y2ggYSBjYWxsLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIElmIHRoZSB3b3JrZmxvdyBpcyBub3QgY3VycmVudGx5IHJlcGxheWluZywgdGhlbiB0aGlzIGNhbGwgKmFsd2F5cyogcmV0dXJucyB0cnVlLlxuICpcbiAqIFlvdXIgd29ya2Zsb3cgY29kZSBzaG91bGQgcnVuIHRoZSBcIm5ld1wiIGNvZGUgaWYgdGhpcyByZXR1cm5zIHRydWUsIGlmIGl0IHJldHVybnMgZmFsc2UsIHlvdVxuICogc2hvdWxkIHJ1biB0aGUgXCJvbGRcIiBjb2RlLiBCeSBkb2luZyB0aGlzLCB5b3UgY2FuIG1haW50YWluIGRldGVybWluaXNtLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hlZChwYXRjaElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIHJldHVybiBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCBmYWxzZSk7XG59XG5cbi8qKlxuICogSW5kaWNhdGUgdGhhdCBhIHBhdGNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBXb3JrZmxvd3Mgd2l0aCB0aGlzIGNhbGwgbWF5IGJlIGRlcGxveWVkIGFsb25nc2lkZSB3b3JrZmxvd3Mgd2l0aCBhIHtAbGluayBwYXRjaGVkfSBjYWxsLCBidXRcbiAqIHRoZXkgbXVzdCAqbm90KiBiZSBkZXBsb3llZCB3aGlsZSBhbnkgd29ya2VycyBzdGlsbCBleGlzdCBydW5uaW5nIG9sZCBjb2RlIHdpdGhvdXQgYVxuICoge0BsaW5rIHBhdGNoZWR9IGNhbGwsIG9yIGFueSBydW5zIHdpdGggaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IHN1Y2ggd29ya2VycyBleGlzdC4gSWYgZWl0aGVyIGtpbmRcbiAqIG9mIHdvcmtlciBlbmNvdW50ZXJzIGEgaGlzdG9yeSBwcm9kdWNlZCBieSB0aGUgb3RoZXIsIHRoZWlyIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBPbmNlIGFsbCBsaXZlIHdvcmtmbG93IHJ1bnMgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5IHdvcmtlcnMgd2l0aCB0aGlzIGNhbGwsIHlvdSBjYW4gZGVwbG95IHdvcmtlcnNcbiAqIHdoaWNoIGFyZSBmcmVlIG9mIGVpdGhlciBraW5kIG9mIHBhdGNoIGNhbGwgZm9yIHRoaXMgSUQuIFdvcmtlcnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIGNhbGxcbiAqIG1heSBjb2V4aXN0LCBhcyBsb25nIGFzIHRoZXkgYXJlIGJvdGggcnVubmluZyB0aGUgXCJuZXdcIiBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlUGF0Y2gocGF0Y2hJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5wYXRjaCguLi4pIGFuZCBXb3JrZmxvdy5kZXByZWNhdGVQYXRjaCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgIG9yIGB0aW1lb3V0YCBleHBpcmVzLCBwcm92aWRpbmdcbiAqIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSB0aW1lciAoaS5lLiBwcm92aWRlIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAqXG4gKiBAcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25kaXRpb24gd2FzIHRydWUgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRpbWVyT3B0aW9ucyBpcyBhIG5ldyBhZGRpdGlvbiBhbmQgc3ViamVjdCB0byBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dDogRHVyYXRpb24sIG9wdGlvbnM6IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYCBvciBgdGltZW91dGAgZXhwaXJlcy5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gKlxuICogQHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIHdhcyB0cnVlIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ6IER1cmF0aW9uKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dD86IER1cmF0aW9uLCBvcHRzPzogVGltZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY29uZGl0aW9uKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICAvLyBQcmlvciB0byAxLjUuMCwgYGNvbmRpdGlvbihmbiwgMClgIHdhcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYGNvbmRpdGlvbihmbiwgdW5kZWZpbmVkKWBcbiAgaWYgKHRpbWVvdXQgPT09IDAgJiYgIXBhdGNoZWQoQ09ORElUSU9OXzBfUEFUQ0gpKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbiAgfVxuICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aW1lb3V0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDYW5jZWxsYXRpb25TY29wZS5jYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtzbGVlcCh0aW1lb3V0LCBvcHRzKS50aGVuKCgpID0+IGZhbHNlKSwgY29uZGl0aW9uSW5uZXIoZm4pLnRoZW4oKCkgPT4gdHJ1ZSldKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25Jbm5lcihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jb25kaXRpb24rKztcbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWFnZXIgZXZhbHVhdGlvblxuICAgIGlmIChmbigpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLnNldChzZXEsIHsgZm4sIHJlc29sdmUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiB1cGRhdGUgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gdXBkYXRlIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVXBkYXRlPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgIG5hbWUsXG4gIH0gYXMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHNpZ25hbCBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBzaWduYWwgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc2lnbmFsJyxcbiAgICBuYW1lLFxuICB9IGFzIFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcXVlcnkgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gcXVlcnkgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVRdWVyeTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdxdWVyeScsXG4gICAgbmFtZSxcbiAgfSBhcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBTZXQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhIFdvcmtmbG93IHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeS5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gZGVmIGFuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSwge0BsaW5rIFNpZ25hbERlZmluaXRpb259LCBvciB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSBhcyByZXR1cm5lZCBieSB7QGxpbmsgZGVmaW5lVXBkYXRlfSwge0BsaW5rIGRlZmluZVNpZ25hbH0sIG9yIHtAbGluayBkZWZpbmVRdWVyeX0gcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGhhbmRsZXIgYSBjb21wYXRpYmxlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBkZWZpbml0aW9uIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgYW4gb3B0aW9uYWwgYGRlc2NyaXB0aW9uYCBvZiB0aGUgaGFuZGxlciBhbmQgYW4gb3B0aW9uYWwgdXBkYXRlIGB2YWxpZGF0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBTaWduYWxIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZDtcblxuLy8gRm9yIFVwZGF0ZXMgYW5kIFNpZ25hbHMgd2Ugd2FudCB0byBtYWtlIGEgcHVibGljIGd1YXJhbnRlZSBzb21ldGhpbmcgbGlrZSB0aGVcbi8vIGZvbGxvd2luZzpcbi8vXG4vLyAgIFwiSWYgYSBXRlQgY29udGFpbnMgYSBTaWduYWwvVXBkYXRlLCBhbmQgaWYgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhhdFxuLy8gICBTaWduYWwvVXBkYXRlLCB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuXCJcIlxuLy9cbi8vIEhvd2V2ZXIsIHRoYXQgc3RhdGVtZW50IGlzIG5vdCB3ZWxsLWRlZmluZWQsIGxlYXZpbmcgc2V2ZXJhbCBxdWVzdGlvbnMgb3Blbjpcbi8vXG4vLyAxLiBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgYSBoYW5kbGVyIHRvIGJlIFwiYXZhaWxhYmxlXCI/IFdoYXQgaGFwcGVucyBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgbm90IHByZXNlbnQgaW5pdGlhbGx5IGJ1dCBpcyBzZXQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlXG4vLyAgICBXb3JrZmxvdyBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhhdCBXRlQ/IFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpc1xuLy8gICAgc2V0IGFuZCB0aGVuIGRlbGV0ZWQsIG9yIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgaGFuZGxlcj9cbi8vXG4vLyAyLiBXaGVuIGlzIHRoZSBoYW5kbGVyIGV4ZWN1dGVkPyAoV2hlbiBpdCBmaXJzdCBiZWNvbWVzIGF2YWlsYWJsZT8gQXQgdGhlIGVuZFxuLy8gICAgb2YgdGhlIGFjdGl2YXRpb24/KSBXaGF0IGFyZSB0aGUgZXhlY3V0aW9uIHNlbWFudGljcyBvZiBXb3JrZmxvdyBhbmRcbi8vICAgIFNpZ25hbC9VcGRhdGUgaGFuZGxlciBjb2RlIGdpdmVuIHRoYXQgdGhleSBhcmUgY29uY3VycmVudD8gQ2FuIHRoZSB1c2VyXG4vLyAgICByZWx5IG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgb3IgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXc/IElmIHRoZSBoYW5kbGVyIGlzIGFuXG4vLyAgICBhc3luYyBmdW5jdGlvbiAvIGNvcm91dGluZSwgaG93IG11Y2ggb2YgaXQgaXMgZXhlY3V0ZWQgYW5kIHdoZW4gaXMgdGhlXG4vLyAgICByZXN0IGV4ZWN1dGVkP1xuLy9cbi8vIDMuIFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpcyBub3QgZXhlY3V0ZWQ/IChpLmUuIGJlY2F1c2UgaXQgd2Fzbid0XG4vLyAgICBhdmFpbGFibGUgaW4gdGhlIHNlbnNlIGRlZmluZWQgYnkgKDEpKVxuLy9cbi8vIDQuIEluIHRoZSBjYXNlIG9mIFVwZGF0ZSwgd2hlbiBpcyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBleGVjdXRlZD9cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzY3JpcHQgaXMgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBzZGstY29yZSBzb3J0cyBTaWduYWwgYW5kIFVwZGF0ZSBqb2JzIChhbmQgUGF0Y2hlcykgYWhlYWQgb2YgYWxsIG90aGVyXG4vLyAgICBqb2JzLiBUaHVzIGlmIHRoZSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlblxuLy8gICAgdGhlIFNpZ25hbC9VcGRhdGUgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgV29ya2Zsb3cgY29kZSBpcyBleGVjdXRlZC4gSWYgaXRcbi8vICAgIGlzIG5vdCwgdGhlbiB0aGUgU2lnbmFsL1VwZGF0ZSBjYWxscyBhcmUgcHVzaGVkIHRvIGEgYnVmZmVyLlxuLy9cbi8vIDIuIE9uIGVhY2ggY2FsbCB0byBzZXRIYW5kbGVyIGZvciBhIGdpdmVuIFNpZ25hbC9VcGRhdGUsIHdlIG1ha2UgYSBwYXNzXG4vLyAgICB0aHJvdWdoIHRoZSBidWZmZXIgbGlzdC4gSWYgYSBidWZmZXJlZCBqb2IgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LXNldFxuLy8gICAgaGFuZGxlciwgdGhlbiB0aGUgam9iIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCB0aGUgaW5pdGlhbFxuLy8gICAgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgaGFuZGxlciBpcyBpbnZva2VkIG9uIHRoYXQgaW5wdXQgKGkuZS5cbi8vICAgIHByZWVtcHRpbmcgd29ya2Zsb3cgY29kZSkuXG4vL1xuLy8gVGh1cyBpbiB0aGUgY2FzZSBvZiBUeXBlc2NyaXB0IHRoZSBxdWVzdGlvbnMgYWJvdmUgYXJlIGFuc3dlcmVkIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gQSBoYW5kbGVyIGlzIFwiYXZhaWxhYmxlXCIgaWYgaXQgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiBvclxuLy8gICAgYmVjb21lcyBzZXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgQWN0aXZhdGlvbi4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHNldFxuLy8gICAgaW5pdGlhbGx5IHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBpcyBzZXQuIFN1YnNlcXVlbnQgZGVsZXRpb24gb3Jcbi8vICAgIHJlcGxhY2VtZW50IGJ5IGEgZGlmZmVyZW50IGhhbmRsZXIgaGFzIG5vIGltcGFjdCBiZWNhdXNlIHRoZSBqb2JzIGl0IHdhc1xuLy8gICAgaGFuZGxpbmcgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhbmQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyLlxuLy9cbi8vIDIuIFRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuIEkuZS4gaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlbiBpdCBpcyBleGVjdXRlZCB3aGVuXG4vLyAgICBmaXJzdCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIFNpZ25hbC9VcGRhdGUgam9iOyBhbHRlcm5hdGl2ZWx5LCBpZiBpdCBpc1xuLy8gICAgc2V0IGJ5IGEgc2V0SGFuZGxlciBjYWxsIG1hZGUgYnkgV29ya2Zsb3cgY29kZSwgdGhlbiBpdCBpcyBleGVjdXRlZCBhc1xuLy8gICAgcGFydCBvZiB0aGF0IGNhbGwgKHByZWVtcHRpbmcgV29ya2Zsb3cgY29kZSkuIFRoZXJlZm9yZSwgYSB1c2VyIGNhbiByZWx5XG4vLyAgICBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gZS5nLiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgYW5kIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3LiBBY3RpdmF0aW9uIGpvYnMgYXJlXG4vLyAgICBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHN1cHBsaWVkIGJ5IHNkay1jb3JlLCBpLmUuIFNpZ25hbHMsIHRoZW4gVXBkYXRlcyxcbi8vICAgIHRoZW4gb3RoZXIgam9icy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZSBvcmRlciBzZW50IGJ5IHRoZSBzZXJ2ZXIgaXNcbi8vICAgIHByZXNlcnZlZC4gSWYgdGhlIGhhbmRsZXIgaXMgYXN5bmMsIGl0IGlzIGV4ZWN1dGVkIHVwIHRvIGl0cyBmaXJzdCB5aWVsZFxuLy8gICAgcG9pbnQuXG4vL1xuLy8gMy4gU2lnbmFsIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhIFNpZ25hbCBqb2IgdGhlblxuLy8gICAgdGhlIGpvYiByZW1haW5zIGluIHRoZSBidWZmZXIuIElmIGEgaGFuZGxlciBmb3IgdGhlIFNpZ25hbCBiZWNvbWVzXG4vLyAgICBhdmFpbGFibGUgaW4gYSBzdWJzZXF1ZW50IEFjdGl2YXRpb24gKG9mIHRoZSBzYW1lIG9yIGEgc3Vic2VxdWVudCBXRlQpXG4vLyAgICB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuIElmIG5vdCwgdGhlbiB0aGUgU2lnbmFsIHdpbGwgbmV2ZXIgYmVcbi8vICAgIHJlc3BvbmRlZCB0byBhbmQgdGhpcyBjYXVzZXMgbm8gZXJyb3IuXG4vL1xuLy8gICAgVXBkYXRlIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhbiBVcGRhdGUgam9iIHRoZW5cbi8vICAgIHRoZSBVcGRhdGUgaXMgcmVqZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgQWN0aXZhdGlvbi4gVGh1cywgaWYgYSB1c2VyIGRvZXNcbi8vICAgIG5vdCB3YW50IGFuIFVwZGF0ZSB0byBiZSByZWplY3RlZCBmb3IgdGhpcyByZWFzb24sIHRoZW4gaXQgaXMgdGhlaXJcbi8vICAgIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIGFuZCB3b3JrZmxvdyBjb2RlIGludGVyYWN0XG4vLyAgICBzdWNoIHRoYXQgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFVwZGF0ZSBkdXJpbmcgYW55IEFjdGl2YXRpb25cbi8vICAgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdGhlaXIgVXBkYXRlIGpvYi4gKE5vdGUgdGhhdCB0aGUgdXNlciBvZnRlbiBoYXNcbi8vICAgIHVuY2VydGFpbnR5IGFib3V0IHdoaWNoIFdGVCB0aGVpciBTaWduYWwvVXBkYXRlIHdpbGwgYXBwZWFyIGluLiBGb3Jcbi8vICAgIGV4YW1wbGUsIGlmIHRoZXkgY2FsbCBzdGFydFdvcmtmbG93KCkgZm9sbG93ZWQgYnkgc3RhcnRVcGRhdGUoKSwgdGhlbiB0aGV5XG4vLyAgICB3aWxsIHR5cGljYWxseSBub3Qga25vdyB3aGV0aGVyIHRoZXNlIHdpbGwgYmUgZGVsaXZlcmVkIGluIG9uZSBvciB0d29cbi8vICAgIFdGVHMuIE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZXkgd291bGQgaGF2ZSByZWFzb25cbi8vICAgIHRvIGJlbGlldmUgdGhleSBhcmUgaW4gdGhlIHNhbWUgV0ZULCBmb3IgZXhhbXBsZSBpZiB0aGV5IGRvIG5vdCBzdGFydFxuLy8gICAgV29ya2VyIHBvbGxpbmcgdW50aWwgYWZ0ZXIgdGhleSBoYXZlIHZlcmlmaWVkIHRoYXQgYm90aCByZXF1ZXN0cyBoYXZlXG4vLyAgICBzdWNjZWVkZWQuKVxuLy9cbi8vIDQuIElmIGFuIFVwZGF0ZSBoYXMgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcbi8vICAgIHByaW9yIHRvIHRoZSBoYW5kbGVyLiAoTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlXG4vLyAgICBzeW5jaHJvbm91cykuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnMgfCBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNldEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIC8vIENhbm5vdCByZWdpc3RlciBoYW5kbGVyIGZvciByZXNlcnZlZCBuYW1lc1xuICB0aHJvd0lmUmVzZXJ2ZWROYW1lKGRlZi50eXBlLCBkZWYubmFtZSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gb3B0aW9ucz8uZGVzY3JpcHRpb247XG4gIGlmIChkZWYudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnMgPSBvcHRpb25zIGFzIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB1cGRhdGVPcHRpb25zPy52YWxpZGF0b3IgYXMgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHVwZGF0ZU9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlciwgdmFsaWRhdG9yLCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAnc2lnbmFsJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgc2lnbmFsT3B0aW9ucyA9IG9wdGlvbnMgYXMgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gc2lnbmFsT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGVmaW5pdGlvbiB0eXBlOiAkeyhkZWYgYXMgYW55KS50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKlxuICogU2lnbmFscyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBzaWduYWwgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTaWduYWxIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRTaWduYWxIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0U2lnbmFsSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgdXBkYXRlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSB1cGRhdGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKlxuICogVXBkYXRlcyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdXBkYXRlcyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRVcGRhdGVIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRVcGRhdGVIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0VXBkYXRlSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0VXBkYXRlSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRVcGRhdGVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgcXVlcnkgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqXG4gKiBRdWVyaWVzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHF1ZXJ5IGhhbmRsZXIgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgcXVlcmllcyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFF1ZXJ5SGFuZGxlcihoYW5kbGVyOiBEZWZhdWx0UXVlcnlIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0UXVlcnlIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nIHx8IGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0UXVlcnlIYW5kbGVyID0gaGFuZGxlcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIFNlYXJjaCBBdHRyaWJ1dGVzIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBzZWFyY2hBdHRyaWJ1dGVzYCB3aXRoIHRoZSBleGlzdGluZyBTZWFyY2hcbiAqIEF0dHJpYnV0ZXMsIGB3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzYC5cbiAqXG4gKiBTZWFyY2ggYXR0cmlidXRlcyBjYW4gYmUgdXBzZXJ0ZWQgdXNpbmcgZWl0aGVyIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpIG9yIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSAocHJlZmVycmVkKVxuICpcbiAqIFVwc2VydGluZyBhIHdvcmtmbG93J3Mgc2VhcmNoIGF0dHJpYnV0ZXMgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBpbnRLZXkgPSBkZWZpbmVTZWFyY2hLZXkoJ0N1c3RvbUludEZpZWxkJywgJ0lOVCcpO1xuICogY29uc3QgYm9vbEtleSA9IGRlZmluZVNlYXJjaEtleSgnQ3VzdG9tQm9vbEZpZWxkJywgJ0JPT0wnKTtcbiAqIGNvbnN0IGtleXdvcmRMaXN0S2V5ID0gZGVmaW5lU2VhcmNoS2V5KCdDdXN0b21LZXl3b3JkRmllbGQnLCAnS0VZV09SRF9MSVNUJyk7XG4gKlxuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhbXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGludEtleSwgMSksXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGJvb2xLZXksIHRydWUpXG4gKiBdKTtcbiAqIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoW1xuICogIGRlZmluZVNlYXJjaEF0dHJpYnV0ZShpbnRLZXksIDQyKSxcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoa2V5d29yZExpc3RLZXksIFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J10pXG4gKiBdKTtcbiAqIGBgYFxuICpcbiAqIFdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIFNlYXJjaCBBdHRyaWJ1dGVzOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIEN1c3RvbUludEZpZWxkOiBbNDJdLFxuICogICBDdXN0b21Cb29sRmllbGQ6IFt0cnVlXSxcbiAqICAgQ3VzdG9tS2V5d29yZEZpZWxkOiBbJ2R1cmFibGUgY29kZScsICdpcyBncmVhdCddXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2VhcmNoQXR0cmlidXRlcyBUaGUgUmVjb3JkIHRvIG1lcmdlLlxuICogSWYgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdIChwcmVmZXJyZWQpLCBzZXQgYSB2YWx1ZSB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAqIElmIHVzaW5nIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpLCBzZXQgYSB2YWx1ZSB0byB1bmRlZmluZWQgb3IgYW4gZW1wdHkgbGlzdCB0byByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyB8IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cudXBzZXJ0U2VhcmNoQXR0cmlidXRlcyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG5cbiAgaWYgKHNlYXJjaEF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VhcmNoQXR0cmlidXRlcyBtdXN0IGJlIGEgbm9uLW51bGwgU2VhcmNoQXR0cmlidXRlcycpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoQXR0cmlidXRlcykpIHtcbiAgICAvLyBUeXBlZCBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKHVuZGVmaW5lZCwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAgICBjb25zdCBuZXdTZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzID0geyAuLi5pbmZvLnNlYXJjaEF0dHJpYnV0ZXMgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHNlYXJjaEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKHBhaXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBudWxsLCByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgbXV0YXRlIHRoZSBleGlzdGluZyBzdGF0ZSAoanVzdCB0aGUgbmV3IG1hcCkgc28gdGhpcyBpcyBzYWZlLlxuICAgICAgICAgIGRlbGV0ZSBuZXdTZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1NlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBBcnJheS5pc0FycmF5KHBhaXIudmFsdWUpXG4gICAgICAgICAgICA/IHBhaXIudmFsdWVcbiAgICAgICAgICAgIDogKFtwYWlyLnZhbHVlXSBhcyBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogbmV3U2VhcmNoQXR0cmlidXRlcyxcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvcHkgYW5kIGFwcGx5IGV4aXN0aW5nIGFuZCBuZXcgdXBkYXRlcy4gS2VlcCBpbiBtaW5kIHRoZSBvcmRlciBtYXR0ZXJzIGhlcmUgKGV4aXN0aW5nIGZpcnN0LCBuZXcgc2Vjb25kIC0gdG8gcG9zc2libHkgb3ZlcndyaXRlIGV4aXN0aW5nKS5cbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzOiBpbmZvLnR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFsuLi5zZWFyY2hBdHRyaWJ1dGVzXSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgbGV0IHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IGluZm8udHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW10pO1xuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcblxuICAgICAgLy8gVXBzZXJ0IGxlZ2FjeSBzZWFyY2ggYXR0cmlidXRlcyBpbnRvIHR5cGVkU2VhcmNoQXR0cmlidXRlcy5cbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvciB1bmRlZmluZWQsIGdvdCAke3Z9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIGFuIGVtcHR5IGxpc3QsIHRoaXMgc2lnbmlmaWVzIGRlbGV0aW9uLlxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBib3RoIHVudHlwZWQgJiB0eXBlZCBzZWFyY2ggYXR0cmlidXRlcy5cbiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAvLyBXZSBjYW5ub3QgZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgZnJvbSB0aGVzZSB2YWx1ZXMuXG4gICAgICAgICAgLy8gSW5zdGVhZCwgd2UgZG8gYSBcImJlc3QgZWZmb3J0XCIgZGVsZXRpb24gZnJvbSB0eXBlZCBzZWFyY2ggYXR0cmlidXRlczpcbiAgICAgICAgICAvLyAtIGNoZWNrIGlmIGEgbWF0Y2hpbmcga2V5IG5hbWUgZXhpc3RzLCBpZiBzbywgcmVtb3ZlIGl0LlxuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSBrKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXG4gICAgICAgICAgICAgIHsga2V5OiBtYXRjaGluZ1BhaXIua2V5LCB2YWx1ZTogbnVsbCB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIG5ld1NlYXJjaEF0dHJpYnV0ZXNba107XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIGZvciB0aGUgdXBkYXRlLlxuICAgICAgICBjb25zdCB0eXBlZEtleSA9IFR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRLZXlGcm9tVW50eXBlZChrLCB2KTtcblxuICAgICAgICAvLyBVbmFibGUgdG8gZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgKG5vIHZhbGlkIHR5cGUgZm9yIGRlZmluZWQgdmFsdWUpLlxuICAgICAgICAvLyBTa2lwIGFwcGx5aW5nIHRoaXMgdXBkYXRlIChuby1vcCkuXG4gICAgICAgIGlmICh0eXBlZEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBURVhUIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSBhIHN0cmluZyB2YWx1ZSwgYnV0IGl0IGNvdWxkIGFsc28gYmUgS0VZV09SRC5cbiAgICAgICAgLy8gSWYgYSBtYXRjaGluZyBwYWlyIGV4aXN0cyB3aXRoIEtFWVdPUkQgdHlwZSwgdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdURVhUJykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSB0eXBlZEtleS5uYW1lKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZEtleS50eXBlID0gbWF0Y2hpbmdQYWlyLmtleS50eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXdWYWx1ZTogdW5rbm93biA9IHY7XG4gICAgICAgIC8vIFVucGFjayB2YWx1ZSBpZiBpdCBpcyBhIHNpbmdsZS1lbGVtZW50IGFycmF5LlxuICAgICAgICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHZbMF07XG4gICAgICAgICAgLy8gQ29udmVydCB2YWx1ZSBiYWNrIHRvIERhdGUuXG4gICAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdEQVRFVElNRScpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3IERhdGUobmV3VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmaW5lZCB2YWx1ZSB3aXRoIHZhbGlkIHR5cGUuIEFwcGx5IHRoZSB1cGRhdGUuXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFtcbiAgICAgICAgICB7IGtleTogdHlwZWRLZXksIHZhbHVlOiBuZXdWYWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgIF0pO1xuICAgICAgICBuZXdTZWFyY2hBdHRyaWJ1dGVzW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmluZm8sXG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IG5ld1NlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoaXMgV29ya2Zsb3cncyBNZW1vcyBieSBtZXJnaW5nIHRoZSBwcm92aWRlZCBgbWVtb2Agd2l0aCBleGlzdGluZ1xuICogTWVtb3MgKGFzIHJldHVybmVkIGJ5IGB3b3JrZmxvd0luZm8oKS5tZW1vYCkuXG4gKlxuICogTmV3IG1lbW8gaXMgbWVyZ2VkIGJ5IHJlcGxhY2luZyBwcm9wZXJ0aWVzIG9mIHRoZSBzYW1lIG5hbWUgX2F0IHRoZSBmaXJzdFxuICogbGV2ZWwgb25seV8uIFNldHRpbmcgYSBwcm9wZXJ0eSB0byB2YWx1ZSBgdW5kZWZpbmVkYCBvciBgbnVsbGAgY2xlYXJzIHRoYXRcbiAqIGtleSBmcm9tIHRoZSBNZW1vLlxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiB1cHNlcnRNZW1vKHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTM6IHsgc3Via2V5MTogdmFsdWUgfVxuICogICBrZXk0OiB2YWx1ZSxcbiAqIH0pO1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTI6IHZhbHVlXG4gKiAgIGtleTM6IHsgc3Via2V5MjogdmFsdWUgfVxuICogICBrZXk0OiB1bmRlZmluZWQsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIHdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIE1lbW86XG4gKlxuICogYGBgdHNcbiAqIHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTI6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH0gIC8vIE5vdGUgdGhpcyBvYmplY3Qgd2FzIGNvbXBsZXRlbHkgcmVwbGFjZWRcbiAqICAgLy8gTm90ZSB0aGF0IGtleTQgd2FzIGNvbXBsZXRlbHkgcmVtb3ZlZFxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG1lbW8gVGhlIFJlY29yZCB0byBtZXJnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydE1lbW8obWVtbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnVwc2VydE1lbW8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG5cbiAgaWYgKG1lbW8gPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWVtbyBtdXN0IGJlIGEgbm9uLW51bGwgUmVjb3JkJyk7XG4gIH1cblxuICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgIG1vZGlmeVdvcmtmbG93UHJvcGVydGllczoge1xuICAgICAgdXBzZXJ0ZWRNZW1vOiB7XG4gICAgICAgIGZpZWxkczogbWFwVG9QYXlsb2FkcyhcbiAgICAgICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICAvLyBDb252ZXJ0IG51bGwgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG1lbW8pLm1hcCgoW2ssIHZdKSA9PiBbaywgdiA/PyB1bmRlZmluZWRdKSlcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIG1lbW86IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgIC4uLmluZm8ubWVtbyxcbiAgICAgICAgICAuLi5tZW1vLFxuICAgICAgICB9KS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPSBudWxsKVxuICAgICAgKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nLlxuICpcbiAqIENvbnNpZGVyIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gYmVmb3JlIHdvcmtmbG93IHJldHVybiBvciBjb250aW51ZS1hcy1uZXcsIHRvIHByZXZlbnRcbiAqIGludGVycnVwdGlvbiBvZiBpbi1wcm9ncmVzcyBoYW5kbGVycyBieSB3b3JrZmxvdyBleGl0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluLXByb2dyZXNzIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsSGFuZGxlcnNGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2FsbEhhbmRsZXJzRmluaXNoZWQoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1NpZ25hbHMuc2l6ZSA9PT0gMCAmJiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1VwZGF0ZXMuc2l6ZSA9PT0gMDtcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBhbHRlciB3b3JrZmxvdyBmdW5jdGlvbnMgd2l0aCBjZXJ0YWluIG9wdGlvbnMgc3BlY2lmaWVkIGF0IGRlZmluaXRpb24gdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGU6XG4gKiBgYGB0c1xuICogc2V0V29ya2Zsb3dPcHRpb25zKHsgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyB9LCBteVdvcmtmbG93KTtcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gKiAgIC8vIFdvcmtmbG93IGNvZGUgaGVyZVxuICogICByZXR1cm4gXCJoaVwiO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFRvIGFubm90YXRlIGEgZGVmYXVsdCBvciBkeW5hbWljIHdvcmtmbG93OlxuICogYGBgdHNcbiAqIGV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICogICAvLyBXb3JrZmxvdyBjb2RlIGhlcmVcbiAqICAgcmV0dXJuIFwiaGlcIjtcbiAqIH1cbiAqIHNldFdvcmtmbG93T3B0aW9ucyh7IHZlcnNpb25pbmdCZWhhdmlvcjogJ1BJTk5FRCcgfSwgbW9kdWxlLmV4cG9ydHMuZGVmYXVsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgZGVmaW50aW9uLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBvcHRpb25zLiBJZiBhXG4gKiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgb25jZSBqdXN0IGJlZm9yZSB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGVcbiAqIGZpcnN0IHRpbWUuIEl0IGlzIHNhZmUgdG8gY2FsbCB7QGxpbmsgd29ya2Zsb3dJbmZvfSBpbnNpZGUgc3VjaCBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZuIFRoZSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdvcmtmbG93T3B0aW9uczxBIGV4dGVuZHMgYW55W10sIFJUPihcbiAgb3B0aW9uczogV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyLFxuICBmbjogKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8UlQ+XG4pOiB2b2lkIHtcbiAgT2JqZWN0LmFzc2lnbihmbiwge1xuICAgIHdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM6IG9wdGlvbnMsXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8c3RyaW5nPignX19zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IGVuaGFuY2VkU3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8RW5oYW5jZWRTdGFja1RyYWNlPignX19lbmhhbmNlZF9zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93TWV0YWRhdGFRdWVyeSA9IGRlZmluZVF1ZXJ5PHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KCdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50RGV0YWlscygpOiBzdHJpbmcge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnZ2V0Q3VycmVudERldGFpbHMoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuY3VycmVudERldGFpbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDdXJyZW50RGV0YWlscyhkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2dldEN1cnJlbnREZXRhaWxzKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBhY3RpdmF0b3IuY3VycmVudERldGFpbHMgPSBkZXRhaWxzO1xufVxuIiwiaW1wb3J0IHsgaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mIH0gZnJvbSBcIi4uL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mXCI7XG5pbXBvcnQgdHlwZSB7IEZhaWx1cmUgfSBmcm9tIFwiLi9mYWlsdXJlXCI7XG5cbi8qKlxuICogQSBOZXh1cyBoYW5kbGVyIGVycm9yLlxuICpcbiAqIFRoaXMgZXJyb3IgY2xhc3MgcmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgaGFuZGxpbmcgb2YgYVxuICogTmV4dXMgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgYXMgYSBoYW5kbGVyIGVycm9yLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqICAgICBpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgYmFkIHJlcXVlc3QgZXJyb3JcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGJhZCByZXF1ZXN0IGVycm9yLCB3aXRoIGEgY2F1c2VcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgcmV0cnlhYmxlIGludGVybmFsIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIklOVEVSTkFMXCIsIFwiRGF0YWJhc2UgdW5hdmFpbGFibGVcIiwgeyByZXRyeWFibGVPdmVycmlkZTogdHJ1ZSB9KTtcbiAqXG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBIYW5kbGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBPbmUgb2YgdGhlIHByZWRlZmluZWQgZXJyb3IgdHlwZXMuXG4gICAqXG4gICAqIElmIHRoZSBjb25zdHJ1Y3RvciByZWNlaXZlZCBhbiB1bmtub3duIHN0cmluZywgdGhpcyB3aWxsIGJlIGBcIlVOS05PV05cImAuXG4gICAqIFVzZSB7QGxpbmsgcmF3RXJyb3JUeXBlfSB0byBhY2Nlc3MgdGhlIG9yaWdpbmFsIHN0cmluZy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBIYW5kbGVyRXJyb3JUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGVycm9yIHR5cGUgc3RyaW5nLlxuICAgKlxuICAgKiBGb3Iga25vd24gdHlwZXMsIHRoaXMgZXF1YWxzIHtAbGluayB0eXBlfS4gRm9yIHVua25vd24gdHlwZXMsIHRoaXMgcHJlc2VydmVzXG4gICAqIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZyB3aGlsZSB7QGxpbmsgdHlwZX0gaXMgc2V0IHRvIGBcIlVOS05PV05cImAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmF3RXJyb3JUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBzaG91bGQgYmUgY29uc2lkZXJlZCByZXRyeWFibGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSByZXRyeSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGVycm9yIHR5cGUuXG4gICAqIEZvciBleGFtcGxlLCBieSBkZWZhdWx0LCBgSU5URVJOQUxgIGlzIHJldHJ5YWJsZSwgYnV0IGBVTkFWQUlMQUJMRWAgaXMgbm9uLXJldHJ5YWJsZS5cbiAgICpcbiAgICogSWYgc3BlY2lmaWVkLCBgcmV0cnlhYmxlT3ZlcnJpZGVgIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZXRyeSBiZWhhdmlvciBkZXRlcm1pbmVkIGJhc2VkIG9uXG4gICAqIHRoZSBlcnJvciB0eXBlLiBVc2Uge0BsaW5rIHJldHJ5YWJsZX0gdG8gZGV0ZXJtaW5lIHRoZSBlZmZlY3RpdmUgcmV0cnkgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHJldHJ5YWJsZX0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlhYmxlT3ZlcnJpZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgSGFuZGxlckVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZXJyb3IuIE11c3QgYmUgYSBrbm93biB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX0uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBlcnJvciwgaW5jbHVkaW5nIHRoZSBjYXVzZSBhbmQgcmV0cnlhYmxlIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlOiBIYW5kbGVyRXJyb3JUeXBlLCBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogSGFuZGxlckVycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IGFjdHVhbE1lc3NhZ2UgPSBtZXNzYWdlIHx8IGBIYW5kbGVyIGVycm9yOiAke3R5cGV9YDtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKEhhbmRsZXJFcnJvclR5cGUsIHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIEhhbmRsZXJFcnJvclR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnJhd0Vycm9yVHlwZSA9IHR5cGUgPT09IFwiVU5LTk9XTlwiID8gKG9wdGlvbnM/LnJhd0Vycm9yVHlwZSA/PyB0eXBlKSA6IHR5cGU7XG4gICAgdGhpcy5yZXRyeWFibGVPdmVycmlkZSA9IG9wdGlvbnM/LnJldHJ5YWJsZU92ZXJyaWRlO1xuICAgIHRoaXMub3JpZ2luYWxGYWlsdXJlID0gb3B0aW9ucz8ub3JpZ2luYWxGYWlsdXJlO1xuICAgIGlmIChvcHRpb25zPy5zdGFja1RyYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBvcHRpb25zLnN0YWNrVHJhY2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBpcyByZXRyeWFibGUuXG4gICAqXG4gICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9IHByb3BlcnR5IGluIHRoYXQgYHJldHJ5YWJsZWAgdGFrZXMgaW50b1xuICAgKiBhY2NvdW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHJlc3VsdGluZyBmcm9tIHRoZSBlcnJvciB0eXBlLCBpZiBubyBvdmVycmlkZSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9LlxuICAgKi9cbiAgcHVibGljIGdldCByZXRyeWFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJldHJ5YWJsZU92ZXJyaWRlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRoaXMucmV0cnlhYmxlT3ZlcnJpZGU7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBcIkJBRF9SRVFVRVNUXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIRU5USUNBVEVEXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIT1JJWkVEXCI6XG4gICAgICBjYXNlIFwiTk9UX0ZPVU5EXCI6XG4gICAgICBjYXNlIFwiTk9UX0lNUExFTUVOVEVEXCI6XG4gICAgICBjYXNlIFwiQ09ORkxJQ1RcIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjYXNlIFwiVU5BVkFJTEFCTEVcIjpcbiAgICAgIGNhc2UgXCJVUFNUUkVBTV9USU1FT1VUXCI6XG4gICAgICBjYXNlIFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCI6XG4gICAgICBjYXNlIFwiSU5URVJOQUxcIjpcbiAgICAgIGNhc2UgXCJSRVFVRVNUX1RJTUVPVVRcIjpcbiAgICAgIGNhc2UgXCJVTktOT1dOXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEZvcmNlIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIG1pc3NpbmcgYSBjYXNlXG4gICAgICAgIGNvbnN0IF9ub01pc3NpbmdDYXNlOiBuZXZlciA9IHRoaXMudHlwZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmluamVjdFN5bWJvbEJhc2VkSW5zdGFuY2VPZihIYW5kbGVyRXJyb3IsIFwiSGFuZGxlckVycm9yXCIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBIYW5kbGVyRXJyb3J9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyRXJyb3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVuZGVybHlpbmcgY2F1c2Ugb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgY2F1c2U/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBJZiBub3Qgc2V0LCB0aGUgcmV0cnkgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlcnJvciB0eXBlLlxuICAgKiBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCwgYElOVEVSTkFMYCBpcyByZXRyeWFibGUsIGJ1dCBgVU5BVkFJTEFCTEVgIGlzIG5vbi1yZXRyeWFibGUuXG4gICAqL1xuICByZXRyeWFibGVPdmVycmlkZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBlcnJvciB0eXBlIHN0cmluZywgcHJlc2VydmluZyB0aGUgcmF3IHdpcmUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBrbm93biB0eXBlcywgdGhpcyBvcHRpb24gaXMgaWdub3JlZC5cbiAgICogV2hlbiB0aGUgZXJyb3IncyB0eXBlIGlzIHNldCB0byBgXCJVTktOT1dOXCJgLCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZy5cbiAgICovXG4gIHJhd0Vycm9yVHlwZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBIYW5kbGVyRXJyb3J9LCBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgTmV4dXMgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJFcnJvclR5cGUgPSAodHlwZW9mIEhhbmRsZXJFcnJvclR5cGUpW2tleW9mIHR5cGVvZiBIYW5kbGVyRXJyb3JUeXBlXTtcbmV4cG9ydCBjb25zdCBIYW5kbGVyRXJyb3JUeXBlID0ge1xuICAvKipcbiAgICogVGhlIGVycm9yIHR5cGUgaXMgdW5rbm93bi5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOS05PV046IFwiVU5LTk9XTlwiLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlciBjYW5ub3Qgb3Igd2lsbCBub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBkdWUgdG8gYW4gYXBwYXJlbnQgY2xpZW50IGVycm9yLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIEJBRF9SRVFVRVNUOiBcIkJBRF9SRVFVRVNUXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZGlkIG5vdCBzdXBwbHkgdmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBVTkFVVEhFTlRJQ0FURUQ6IFwiVU5BVVRIRU5USUNBVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uXG4gICAqXG4gICAqIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgVU5BVVRIT1JJWkVEOiBcIlVOQVVUSE9SSVpFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdGVkIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZCBidXQgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgZnV0dXJlLlxuICAgKi9cbiAgTk9UX0ZPVU5EOiBcIk5PVF9GT1VORFwiLFxuXG4gIC8qKlxuICAgKiBSZXR1cm5lZCBieSB0aGUgc2VydmVyIHdoZW4gaXQgaGFzIGdpdmVuIHVwIGhhbmRsaW5nIGEgcmVxdWVzdC4gVGhpcyBtYXkgb2NjdXIgYnkgZW5mb3JjaW5nXG4gICAqIGEgY2xpZW50IHByb3ZpZGVkIGBSZXF1ZXN0LVRpbWVvdXRgIG9yIGZvciBhbnkgYXJiaXRyYXJ5IHJlYXNvbiBzdWNoIGFzIGVuZm9yY2luZyBzb21lXG4gICAqIGNvbmZpZ3VyYWJsZSBsaW1pdC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFJFUVVFU1RfVElNRU9VVDogXCJSRVFVRVNUX1RJTUVPVVRcIixcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIG1hZGUgZHVlIHRvIGEgY29uZmxpY3QuIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRyeWluZyB0byBjcmVhdGUgYW5cbiAgICogb3BlcmF0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIENPTkZMSUNUOiBcIkNPTkZMSUNUXCIsXG5cbiAgLyoqXG4gICAqIFNvbWUgcmVzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLCBwZXJoYXBzIGEgcGVyLXVzZXIgcXVvdGEsIG9yIHBlcmhhcHMgdGhlIGVudGlyZSBmaWxlIHN5c3RlbVxuICAgKiBpcyBvdXQgb2Ygc3BhY2UuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBSRVNPVVJDRV9FWEhBVVNURUQ6IFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIsXG5cbiAgLyoqXG4gICAqIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgSU5URVJOQUw6IFwiSU5URVJOQUxcIixcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBlaXRoZXIgZG9lcyBub3QgcmVjb2duaXplIHRoZSByZXF1ZXN0IG1ldGhvZCwgb3IgaXQgbGFja3MgdGhlIGFiaWxpdHkgdG8gZnVsZmlsbCB0aGVcbiAgICogcmVxdWVzdC4gQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBOT1RfSU1QTEVNRU5URUQ6IFwiTk9UX0lNUExFTUVOVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOQVZBSUxBQkxFOiBcIlVOQVZBSUxBQkxFXCIsXG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgZ2F0ZXdheXMgdG8gcmVwb3J0IHRoYXQgYSByZXF1ZXN0IHRvIGFuIHVwc3RyZWFtIHNlcnZlciBoYXMgdGltZWQgb3V0LlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgVVBTVFJFQU1fVElNRU9VVDogXCJVUFNUUkVBTV9USU1FT1VUXCIsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IHsgdHlwZSBGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZVwiO1xuZXhwb3J0IHsgSGFuZGxlckVycm9yLCBIYW5kbGVyRXJyb3JUeXBlLCB0eXBlIEhhbmRsZXJFcnJvck9wdGlvbnMgfSBmcm9tIFwiLi9oYW5kbGVyLWVycm9yXCI7XG5leHBvcnQgeyB0eXBlIExpbmsgfSBmcm9tIFwiLi9saW5rXCI7XG5leHBvcnQge1xuICBPcGVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVyYXRpb25FcnJvclN0YXRlLFxuICB0eXBlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWVycm9yXCI7XG4iLCJpbXBvcnQgeyBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YgfSBmcm9tIFwiLi4vaW50ZXJuYWwvc3ltYm9sLWluc3RhbmNlb2ZcIjtcbmltcG9ydCB0eXBlIHsgRmFpbHVyZSB9IGZyb20gXCIuL2ZhaWx1cmVcIjtcblxuLyoqXG4gKiBBIE5leHVzIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGNsYXNzIHJlcHJlc2VudHMgdGhlIGFibm9ybWFsIGNvbXBsZXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24sXG4gKiB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgY2FsbGVyIGFzIGFuIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgaW1wb3J0IHsgT3BlcmF0aW9uRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgZmFpbGVkIG9wZXJhdGlvbiBlcnJvclxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGZhaWxlZCBvcGVyYXRpb24gZXJyb3IsIHdpdGggYSBjYXVzZVxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgY2FuY2VsZWQgb3BlcmF0aW9uIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwiY2FuY2VsZWRcIiwgXCJVc2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb25cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IHJlc3VsdGVkIGluIHRoaXMgb3BlcmF0aW9uIGVycm9yLlxuICAgKi9cbiAgZGVjbGFyZSBwdWJsaWMgcmVhZG9ubHkgY2F1c2U6IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXh0cmEgb3B0aW9ucyBmb3IgdGhlIGVycm9yLCBlLmcuIHRoZSBjYXVzZS5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGUsXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogT3BlcmF0aW9uRXJyb3JPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZSA9IHN0YXRlID09PSBcImNhbmNlbGVkXCIgPyBgT3BlcmF0aW9uIGNhbmNlbGVkYCA6IGBPcGVyYXRpb24gZmFpbGVkYDtcbiAgICBjb25zdCBhY3R1YWxNZXNzYWdlID0gbWVzc2FnZSB8fCBkZWZhdWx0TWVzc2FnZTtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLm9yaWdpbmFsRmFpbHVyZSA9IG9wdGlvbnM/Lm9yaWdpbmFsRmFpbHVyZTtcbiAgICBpZiAob3B0aW9ucz8uc3RhY2tUcmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gb3B0aW9ucy5zdGFja1RyYWNlO1xuICAgIH1cbiAgfVxufVxuXG5pbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YoT3BlcmF0aW9uRXJyb3IsIFwiT3BlcmF0aW9uRXJyb3JcIik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBPcGVyYXRpb25FcnJvcn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQGlubGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNhdXNlPzogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHN0YXRlIG9mIGFuIG9wZXJhdGlvbiB0aGF0IGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uRXJyb3JTdGF0ZSA9IFwiZmFpbGVkXCIgfCBcImNhbmNlbGVkXCI7XG4iLCJleHBvcnQge1xuICB0eXBlIE9wZXJhdGlvbkNvbnRleHQsXG4gIHR5cGUgU3RhcnRPcGVyYXRpb25Db250ZXh0LFxuICB0eXBlIENhbmNlbE9wZXJhdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL29wZXJhdGlvbi1jb250ZXh0XCI7XG5cbmV4cG9ydCB7XG4gIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCxcbiAgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jLFxuICB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jLFxufSBmcm9tIFwiLi9zdGFydC1vcGVyYXRpb24tcmVzdWx0XCI7XG5cbmV4cG9ydCB7XG4gIC8vXG4gIHR5cGUgT3BlcmF0aW9uSGFuZGxlcixcbiAgdHlwZSBTeW5jT3BlcmF0aW9uSGFuZGxlcixcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWhhbmRsZXJcIjtcblxuZXhwb3J0IHtcbiAgU2VydmljZUhhbmRsZXIsXG4gIHNlcnZpY2VIYW5kbGVyLFxuICB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3IsXG4gIHR5cGUgU2VydmljZUhhbmRsZXJGb3IsXG59IGZyb20gXCIuL3NlcnZpY2UtaGFuZGxlclwiO1xuIiwiaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vc3RhcnQtb3BlcmF0aW9uLXJlc3VsdFwiO1xuaW1wb3J0IHsgQ2FuY2VsT3BlcmF0aW9uQ29udGV4dCwgU3RhcnRPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vb3BlcmF0aW9uLWNvbnRleHRcIjtcbmltcG9ydCB7XG4gIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIE9wZXJhdGlvbklucHV0LFxuICBPcGVyYXRpb25LZXksXG4gIE9wZXJhdGlvbk1hcCxcbiAgT3BlcmF0aW9uT3V0cHV0LFxufSBmcm9tIFwiLi4vc2VydmljZVwiO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgYSBOZXh1cyBvcGVyYXRpb24uXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgTmV4dXMgc2VydmljZSBpbXBsZW1lbnRvcnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICAvKipcbiAgICogSGFuZGxlIHJlcXVlc3RzIHRvIHN0YXJ0IGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogUmV0dXJuIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jfSB0byByZXNwb25kIHN1Y2Nlc3NmdWxseSBpbmxpbmUsIG9yXG4gICAqIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luY30gdG8gaW5kaWNhdGUgdGhhdCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdhcyBzdGFydGVkLlxuICAgKiBUaHJvdyBhbiB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9IHRvIGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGNvbXBsZXRlZCBhcyBmYWlsZWQgb3IgY2FuY2VsZWQuXG4gICAqL1xuICBzdGFydChjdHg6IFN0YXJ0T3BlcmF0aW9uQ29udGV4dCwgaW5wdXQ6IEkpOiBQcm9taXNlPEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxPPj47XG5cbiAgLyoqXG4gICAqIEhhbmRsZSByZXF1ZXN0cyB0byBjYW5jZWwgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQ2FuY2VsYXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24gaXM6XG4gICAqIDEuIF9hc3luY2hyb25vdXNfIC0gcmV0dXJuaW5nIGZyb20gdGhpcyBtZXRob2Qgb25seSBjb25maXJtcyB0aGF0IGNhbmNlbGF0aW9uIHdhcyBub3RpZmllZDtcbiAgICogICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBob3dldmVyIGNob29zZSB0byBwcm9jZXNzIHRoZSBjYW5jZWxsYXRpb24gYXQgYSBsYXRlciB0aW1lLCBvciB0b1xuICAgKiAgICBpZ25vcmUgaXQgZW50aXJlbHkuXG4gICAqIDIuIF9pZGVtcG90ZW50XyAtIGltcGxlbWVudGF0aW9ucyBtdXN0IGlnbm9yZSBkdXBsaWNhdGUgY2FuY2VsYXRpb25zIGZvciB0aGUgc2FtZSBvcGVyYXRpb24uXG4gICAqL1xuICBjYW5jZWwoY3R4OiBDYW5jZWxPcGVyYXRpb25Db250ZXh0LCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHNob3J0Y3V0IGZvciBkZWZpbmluZyBhbiBvcGVyYXRpb24gaGFuZGxlciB0aGF0IG9ubHkgaW1wbGVtZW50cyB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9XG4gKiBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm5zIGEge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmN9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gPSAoY3R4OiBTdGFydE9wZXJhdGlvbkNvbnRleHQsIGlucHV0OiBJKSA9PiBQcm9taXNlPE8+O1xuXG4vKipcbiAqIENvbXBpbGVzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGludG8gYSB7QGxpbmsgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyfS4gQSBjb21waWxlZCBvcGVyYXRpb25cbiAqIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYSBmdWxsLWZsZWRnZWQgb3BlcmF0aW9uXG4gKiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVPcGVyYXRpb25IYW5kbGVyPEksIE8+KFxuICBkZWZpbml0aW9uOiBPcGVyYXRpb25EZWZpbml0aW9uPEksIE8+LFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPEksIE8+IHwgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gfCB1bmRlZmluZWQsXG4pOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBObyBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtkZWZpbml0aW9uLm5hbWV9JyAoZXhwZWN0ZWQgcHJvcGVydHkgbmFtZSAnJHtkZWZpbml0aW9uLm5hbWV9JylgLFxuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIE9wZXJhdGlvbiBoYW5kbGVyIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBzaG9ydGN1dCBzeW50YXguIFdyYXAgaXQgaW50byBhIGZ1bGwtZmxlZGdlZCBoYW5kbGVyLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZpbml0aW9uLFxuXG4gICAgICBzdGFydDogYXN5bmMgKGN0eCwgaW5wdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKGF3YWl0IGhhbmRsZXIoY3R4LCBpbnB1dCkpO1xuICAgICAgfSxcbiAgICAgIGNhbmNlbDogbm90SW1wbGVtZW50ZWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5zdGFydCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSGFuZGxlciBmb3Igb3BlcmF0aW9uICcke2RlZmluaXRpb24ubmFtZX0nIGhhcyBubyBzdGFydCBtZXRob2RgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGVmaW5pdGlvbixcblxuICAgIC8vIERlZmVuc2l2ZWx5IGVuc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhbGwgdGhlIHJlcXVpcmVkIG1ldGhvZHMsXG4gICAgLy8gZGVmYXVsdGluZyB0byB0aHJvd2luZyBhIG5vdCBpbXBsZW1lbnRlZCBlcnJvciBpZiBzb21lIG1ldGhvZHMgYXJlIG1pc3NpbmcuXG4gICAgc3RhcnQ6IGhhbmRsZXIuc3RhcnQuYmluZChoYW5kbGVyKSxcbiAgICBjYW5jZWw6IGhhbmRsZXIuY2FuY2VsPy5iaW5kKGhhbmRsZXIpID8/IG5vdEltcGxlbWVudGVkLFxuICB9O1xufVxuXG4vKipcbiAqIEEgY29tcGlsZWQgb3BlcmF0aW9uIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYVxuICogZnVsbC1mbGVkZ2VkIG9wZXJhdGlvbiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPEksIE8+ID0gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiAmIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz47XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+ID0gQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPFxuICBPcGVyYXRpb25JbnB1dDxPcHNbT3BlcmF0aW9uS2V5PE9wcz5dPixcbiAgT3BlcmF0aW9uT3V0cHV0PE9wc1tPcGVyYXRpb25LZXk8T3BzPl0+XG4+O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBub3RJbXBsZW1lbnRlZCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBIYW5kbGVyRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIiwgXCJOb3QgaW1wbGVtZW50ZWRcIik7XG59XG4iLCJpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25EZWZpbml0aW9uLCBPcGVyYXRpb25LZXksIE9wZXJhdGlvbk1hcCwgU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi4vc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yLFxuICBjb21waWxlT3BlcmF0aW9uSGFuZGxlcixcbiAgT3BlcmF0aW9uSGFuZGxlcixcbiAgU3luY09wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCI7XG5cbi8qKlxuICogQSBOZXh1cyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLCB0aGF0IHByb3ZpZGVzIGhhbmRsZXJzIGZvciBlYWNoIG9mIGl0cyBvcGVyYXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VIYW5kbGVyPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICAvKipcbiAgICogQnVpbGQgYSBgU2VydmljZUhhbmRsZXJgIGZyb20gYSBzZXJ2aWNlIGRlZmluaXRpb24gYW5kIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRpb24gaGFuZGxlcnMuXG4gICAqXG4gICAqIFRoZXJlIG11c3QgYmUgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGV2ZXJ5IG9wZXJhdGlvbiBpbiB0aGUgc2VydmljZSBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVycyBUaGUgY29sbGVjdGlvbiBvZiBoYW5kbGVyc1xuICAgKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBoYW5kbGVyXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPihcbiAgICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIGhhbmRsZXJzOiBTZXJ2aWNlSGFuZGxlckZvcjxPcHM+LFxuICApOiBTZXJ2aWNlSGFuZGxlcjxPcHM+IHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gbmV3IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgZGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZS5vcGVyYXRpb25zKSkge1xuICAgICAgY29uc3QgY29tcGlsZWRPcEhhbmRsZXIgPSBjb21waWxlT3BlcmF0aW9uSGFuZGxlcihkZWZpbml0aW9uLCBoYW5kbGVyc1twcm9wTmFtZV0pO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IGNvbXBpbGVkT3BIYW5kbGVyLm5hbWUgYXMgT3BlcmF0aW9uS2V5PE9wcz47XG5cbiAgICAgIGlmIChvcGVyYXRpb25zLmhhcyhvcGVyYXRpb25OYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBPcGVyYXRpb24gd2l0aCBuYW1lICcke29wZXJhdGlvbk5hbWV9JyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNlcnZpY2UgJyR7c2VydmljZS5uYW1lfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcGVyYXRpb25zLnNldChvcGVyYXRpb25OYW1lLCBjb21waWxlZE9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlSGFuZGxlcihzZXJ2aWNlLCBoYW5kbGVycywgb3BlcmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBkZWZpbml0aW9uOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIHB1YmxpYyByZWFkb25seSBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wZXJhdGlvbnNNYXA6IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gYW5kIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZVxuICAgKi9cbiAgcHVibGljIGdldE9wZXJhdGlvbkhhbmRsZXI8SyBleHRlbmRzIE9wZXJhdGlvbktleTxPcHM+PihcbiAgICBvcGVyYXRpb25OYW1lOiBLLFxuICApOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXJGb3I8T3BzPiB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLm9wZXJhdGlvbnNNYXAuZ2V0KG9wZXJhdGlvbk5hbWUpO1xuICAgIGlmIChlbnRyeSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFxuICAgICAgICBcIk5PVF9GT1VORFwiLFxuICAgICAgICBgT3BlcmF0aW9uIGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgaW4gc2VydmljZSAnJHt0aGlzLmRlZmluaXRpb24ubmFtZX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBzZXJ2aWNlIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlSGFuZGxlcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+KFxuICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbik6IFNlcnZpY2VIYW5kbGVyPE9wcz4ge1xuICByZXR1cm4gU2VydmljZUhhbmRsZXIuYnVpbGQoc2VydmljZSwgaGFuZGxlcnMpO1xufVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IGRlZmluZXMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3I8VD4gPVxuICBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiB8IFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+XG4gICAgOiBuZXZlcjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbiBpbnRlcmZhY2VzLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU2VydmljZUhhbmRsZXJGb3I8VCBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBPcGVyYXRpb25IYW5kbGVyRm9yPFRbS10+O1xufTtcbiIsIi8qKiBAaW1wb3J0IHsgT3BlcmF0aW9uSGFuZGxlciB9IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCIgKi9cblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBzeW1ib2wsIHVzZWQgdG8gcHJldmVudCBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlcy5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2wgPSBTeW1ib2woXCJfX25leHVzX2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0XCIpO1xuXG4vKipcbiAqIFRoZSByZXR1cm4gdHlwZSBmcm9tIHRoZSB7QGxpbmsgT3BlcmF0aW9uSGFuZGxlci5zdGFydH0gbWV0aG9kLlxuICpcbiAqIFVzZSBlaXRoZXIge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jfSBvciB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LmFzeW5jfVxuICogdG8gY3JlYXRlIGEgcmVzdWx0IG9iamVjdC4gRG8gbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxUID0gdW5rbm93bj4gPVxuICB8IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmM8VD5cbiAgfCBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYztcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9IG1ldGhvZC5cbiAqXG4gKiBVc2UgZWl0aGVyIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luY30gb3Ige0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY31cbiAqIHRvIGNyZWF0ZSBhIHJlc3VsdCBvYmplY3QuIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0ID0ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgcmVzdWx0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGFjY2VwdGVkIGFuZCB3aWxsIGNvbXBsZXRlIGFzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgYXN5bmModG9rZW46IHN0cmluZyk6IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogdHJ1ZSxcbiAgICAgIHRva2VuLFxuICAgICAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHN5bmM8VD4odmFsdWU6IFQpOiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICAgIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICBbU3ltYm9sLmhhc0luc3RhbmNlXTogZnVuY3Rpb24gKHRoaXM6IGFueSwgdmFsdWU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAodmFsdWUgYXMgYW55KVtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF0gPT09IHRydWVcbiAgICApO1xuICB9LFxufTtcblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIFVzZSB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LnN5bmN9IHRvIGNyZWF0ZSBhIHN5bmMgcmVzdWx0IG9iamVjdC5cbiAqIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKDQyKTtcbiAqIGBgYFxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQgPSB1bmtub3duPiB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkgKGZhbHNlKSBvciB3aWxsIGNvbXBsZXRlXG4gICAqIGFzeW5jaHJvbm91c2x5ICh0cnVlKS5cbiAgICovXG4gIGlzQXN5bmM6IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICB2YWx1ZTogVDtcblxuICAvKipcbiAgICogUHJldmVudHMgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgd2lsbCBjb21wbGV0ZSBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBVc2Uge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY30gdG8gY3JlYXRlIGFuIGFzeW5jIHJlc3VsdCBvYmplY3QuXG4gKiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmMoXCJ1bmlxdWUgdG9rZW5cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmMge1xuICAvKipcbiAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5IChmYWxzZSkgb3Igd2lsbCBjb21wbGV0ZVxuICAgKiBhc3luY2hyb25vdXNseSAodHJ1ZSkuXG4gICAqL1xuICBpc0FzeW5jOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBBIHRva2VuIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gaW4gZm9sbG93dXAgaGFuZGxlciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuZ2V0UmVzdWx0fVxuICAgKiBhbmQge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuY2FuY2VsfS5cbiAgICovXG4gIHRva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS5cbiAgICpcbiAgICogQGhpZGRlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWU7XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb21tb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hhbmRsZXJcIjtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgYnkgbWFwcGluZyBhbGwgc3RyaW5nIHByb3BlcnRpZXMgKGtleXMgYW5kIHZhbHVlcykgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0XG4gKiB0aHJvdWdoIGEgbWFwcGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgc291cmNlIG9iamVjdCwgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJlIG1hcHBlZC5cbiAqIEBwYXJhbSBmbiAtIFRoZSBtYXBwZXIgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHByb3BlcnRpZXMgbWFwcGVkIHRvIHRoZSBuZXcgdHlwZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEtleVZhbHVlczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVT4oXG4gIG9iajogVCxcbiAgZm46IChrZXk6IGtleW9mIFQgJiBzdHJpbmcsIHZhbHVlOiBUW2tleW9mIFQgJiBzdHJpbmddKSA9PiBVLFxuKTogUmVjb3JkPGtleW9mIFQsIFU+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBmbihrZXksIHZhbHVlKV0pLFxuICApIGFzIFJlY29yZDxrZXlvZiBULCBVPjtcbn1cbiIsIi8qKlxuICogSW5qZWN0IGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIG9uIHRoZSBnaXZlbiBjbGFzcywgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2Y8RT4oY2xheno6IENsYXNzPEU+LCBtYXJrZXJOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gSXQgbWF5IHNlZW0gcmVkdW5kYW50IHRvIGhhdmUgYW4gZXhwbGljaXQgbWFya2VyTmFtZSBhcmd1bWVudCBoZXJlLiBDYW4ndCB3ZSBzaW1wbHkgdXNlIHRoZSBjbGFzc1xuICAvLyBmdW5jdGlvbiBuYW1lIGZvciB0aGF0PyBVbmZvcnR1bmF0ZWx5LCBubywgYXMgdGhlIGNsYXNzIG5hbWUgbWF5IGdldCBtYW5nbGVkIGlmIHRoZSBmaWxlIGdldHMgbWluaWZpZWQuXG4gIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fbmV4dXNfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgXCJuYW1lXCIsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIG1hcmtlciwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6eiwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBhbnkpW21hcmtlcl0gPT09IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgLy8gZnJvbSBjbGF6eidzIFtTeW1ib2wuaGFzSW5zdGFuY2VdLiBJZiB3ZSBkb24ndCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhlblxuICAgICAgICAvLyBgeCBpbnN0YW5jZW9mIFN1YmNsYXNzT2ZQYXJlbnRgIHdvdWxkIHJldHVybiB0cnVlIGZvciBhbnkgaW5zdGFuY2Ugb2YgJ1BhcmVudCcsIHdoaWNoIGlzIGNsZWFybHkgd3JvbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElkZWFsbHksIGl0J2QgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGlzIGNhc2UgZW50aXJlbHksIGJ5IG1ha2luZyBzdXJlIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgJ2NsYXp6J1xuICAgICAgICAvLyByZWRlZmluZSBbU3ltYm9sLmhhc0luc3RhbmNlXSwgYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdC4gV2UgdGhlcmVmb3JlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlb2ZcbiAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodmFsdWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBjbGFzcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFzczxFPiB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59XG4iLCJpbXBvcnQgeyBtYXBLZXlWYWx1ZXMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvb2JqZWN0LXV0aWxzXCI7XG5pbXBvcnQgeyBTaW1wbGlmeSB9IGZyb20gXCIuLi9pbnRlcm5hbC90eXBlc1wiO1xuaW1wb3J0IHsgaW5wdXRCcmFuZCwgb3V0cHV0QnJhbmQsIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi9zZXJ2aWNlLWRlZmluaXRpb25cIjtcbmltcG9ydCB7IE9wZXJhdGlvbkRlZmluaXRpb24sIFNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vc2VydmljZS1kZWZpbml0aW9uXCI7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc2VydmljZSBkZWZpbml0aW9uIGZvciBhIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlPE9wcyBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb25NYXA+KFxuICBuYW1lOiBzdHJpbmcsXG4gIG9wZXJhdGlvbnM6IE9wcyxcbik6IFNlcnZpY2VEZWZpbml0aW9uPFNpbXBsaWZ5PE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsPE9wcz4+PiB7XG4gIGNvbnN0IHNlcnZpY2UgPSB7XG4gICAgbmFtZSxcbiAgICBvcGVyYXRpb25zOiBtYXBLZXlWYWx1ZXMob3BlcmF0aW9ucywgKGtleSwgb3A6IFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+KSA9PiAoe1xuICAgICAgLi4ub3AsXG4gICAgICBuYW1lOiBvcC5uYW1lIHx8IGtleSxcbiAgICB9KSksXG4gIH0gYXMgU2VydmljZURlZmluaXRpb248T3BlcmF0aW9uTWFwRnJvbVBhcnRpYWw8T3BzPj47XG5cbiAgdmFsaWRhdGVTZXJ2aWNlRGVmaW5pdGlvbihzZXJ2aWNlKTtcbiAgcmV0dXJuIHNlcnZpY2U7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIG9wZXJhdGlvbiBkZWZpbml0aW9uIGFzIHBhcnQgb2YgYSBzZXJ2aWNlIGNvbnRyYWN0LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZXJhdGlvbjxJLCBPPihvcD86IE9wZXJhdGlvbk9wdGlvbnM8SSwgTz4pOiBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+IHtcbiAgcmV0dXJuIHsgLi4ub3AgfSBhcyBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgb3BlcmF0aW9ufSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uT3B0aW9uczxfSSwgX08+IHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5hbWVkIGNvbGxlY3Rpb24gb2YgcGFydGlhbCBvcGVyYXRpb24gaGFuZGxlcnMuIElucHV0IGZvciB0aGUge0BsaW5rIHNlcnZpY2V9IGZ1bmN0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgUGFydGlhbE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCB0cmFuc2Zvcm1zIGEge0BsaW5rIFBhcnRpYWxPcGVyYXRpb25NYXB9IGludG8gYW4ge0BsaW5rIE9wZXJhdGlvbk1hcH0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NYXBGcm9tUGFydGlhbDxUIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBUW0tdIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPlxuICAgIDogbmV2ZXI7XG59O1xuXG4vKipcbiAqIEEgcGFydGlhbCB7QGxpbmsgT3BlcmF0aW9uRGVmaW5pdGlvbn0gdGhhdCBpcyB1c2VkIHRvIGRlZmluZSBhbiBvcGVyYXRpb24gaW4gYSB7QGxpbmsgU2VydmljZURlZmluaXRpb259LlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQge0BsaW5rIE9wZXJhdGlvbkRlZmluaXRpb259IGlzIHRoYXQgdGhlIG5hbWUgaXMgb3B0aW9uYWwuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpYWxPcGVyYXRpb248SSwgTz4ge1xuICBuYW1lPzogc3RyaW5nO1xuICBbaW5wdXRCcmFuZF06IEk7XG4gIFtvdXRwdXRCcmFuZF06IE87XG59XG4iLCJleHBvcnQge1xuICB0eXBlIFNlcnZpY2VEZWZpbml0aW9uLFxuICB0eXBlIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbklucHV0LFxuICB0eXBlIE9wZXJhdGlvbk91dHB1dCxcbiAgdHlwZSBPcGVyYXRpb25LZXksXG59IGZyb20gXCIuL3NlcnZpY2UtZGVmaW5pdGlvblwiO1xuXG5leHBvcnQge1xuICBzZXJ2aWNlLFxuICBvcGVyYXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uT3B0aW9ucyxcbiAgdHlwZSBQYXJ0aWFsT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsLFxuICB0eXBlIFBhcnRpYWxPcGVyYXRpb24sXG59IGZyb20gXCIuL2hlbHBlcnNcIjtcbiIsImV4cG9ydCBkZWNsYXJlIGNvbnN0IGlucHV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBvdXRwdXRCcmFuZDogdW5pcXVlIHN5bWJvbDtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgTmV4dXMgc2VydmljZSBjb250cmFjdCwgaW5jbHVkaW5nIGl0cyBuYW1lIGFuZCBvcGVyYXRpb25zLlxuICpcbiAqIENhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIGJ5IHRoZSB7QGxpbmsgc2VydmljZX0gZnVuY3Rpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VEZWZpbml0aW9uPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9wZXJhdGlvbnM6IE9wcztcbn1cblxuLyoqXG4gKiBBbiBvcGVyYXRpb24gY29udHJhY3QgdGhhdCBkZXNjcmliZXMgdGhlIG5hbWUsIGFuZCBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgW2lucHV0QnJhbmRdOiBJO1xuICBbb3V0cHV0QnJhbmRdOiBPO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgY29sbGVjdGlvbiBvZiBvcGVyYXRpb25zLCBhcyBkZWZpbmVkIGJ5IGEge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIGlucHV0IHR5cGUgZnJvbSBhbiBvcGVyYXRpb24gaW4gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uSW5wdXQ8VD4gPSBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBhbnk+ID8gSSA6IGFueTtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIG91dHB1dCB0eXBlIGZyb20gYW4gb3BlcmF0aW9uIGluIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk91dHB1dDxUPiA9IFQgZXh0ZW5kcyBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgaW5mZXIgTz4gPyBPIDogYW55O1xuXG4vKipcbiAqIEEgbWFwcGVkIHR5cGUgdGhhdCBleHRyYWN0cyBhbGwgb3BlcmF0aW9uIG5hbWVzIGZyb20gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uS2V5PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtLXSBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+ID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUICYgc3RyaW5nXTtcblxuLyoqXG4gKiBDb25maXJtIHRoYXQgYSBzZXJ2aWNlIGRlZmluaXRpb24gaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHNlcnZpY2UgLSBUaGUgc2VydmljZSBkZWZpbml0aW9uIHRvIHZhbGlkYXRlLlxuICpcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbiBpcyBpbnZhbGlkLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24oc2VydmljZTogU2VydmljZURlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBzZXJ2aWNlLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIXNlcnZpY2UubmFtZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZXJ2aWNlIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIik7XG4gIH1cblxuICBjb25zdCBvcGVyYXRpb25OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgb3BlcmF0aW9uXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlLm9wZXJhdGlvbnMpKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5uYW1lO1xuICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCAhb3BlcmF0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT3BlcmF0aW9uIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGZvciBwcm9wZXJ0eSAnJHtwcm9wTmFtZX0nYCk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb25OYW1lcy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYER1cGxpY2F0ZSBvcGVyYXRpb24gZGVmaW5pdGlvbiBmb3IgbmFtZTogJyR7b3BlcmF0aW9uTmFtZX0nYCk7XG4gICAgfVxuICAgIG9wZXJhdGlvbk5hbWVzLmFkZChvcGVyYXRpb25OYW1lKTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnQHNodW1haS90cmFuc2NvZGUvc3JjL3dvcmtmbG93cy90cmFuc2NvZGUnXG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93VGFzayB9IGZyb20gJ0BzaHVtYWkvZGInXG5pbXBvcnQgeyBleGVjdXRlQWN0aXZpdHksIGdldEFjdGl2aXRpZXMsIFRhc2tRdWV1ZVRyYW5zY29kZSB9IGZyb20gJ0BzaHVtYWkvd29ya2Zsb3ctY29yZSdcblxuaW1wb3J0IHsgQXBwbGljYXRpb25GYWlsdXJlIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2NvZGVNZWRpYSh0YXNrOiBXb3JrZmxvd1Rhc2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSxcbiAgICB1cGRhdGVBc3NldFN0YXR1c0FjdGl2aXR5LFxuICAgIGdldEFzc2V0QWN0aXZpdHksXG4gICAgZ2V0TWVkaWFJbmZvQWN0aXZpdHksXG4gICAgdHJhbnNjb2RlVmlkZW9BY3Rpdml0eSxcbiAgICB0cmFuc2NvZGVBdWRpb0FjdGl2aXR5LFxuICAgIHRyYW5zY29kZUltYWdlQWN0aXZpdHksXG4gICAgZ2VuZXJhdGVTcHJpdGVBY3Rpdml0eSxcbiAgICB1cGRhdGVBc3NldE1lZGlhQWN0aXZpdHksXG4gICAgZ2V0VHJhbnNjb2RlV29ya2VyUXVldWVBY3Rpdml0eSxcbiAgICBkb3dubG9hZE1lZGlhVG9UbXBBY3Rpdml0eSxcbiAgICBjbGVhbnVwVG1wRGlyQWN0aXZpdHksXG4gICAgdGFrZVNjcmVlbnNob3RzQWN0aXZpdHksXG4gICAgb3ZlcmxheUFubm90YXRpb25zQWN0aXZpdHksXG4gICAgY3JlYXRlRW1iZWRkaW5nVGFza0lmRW5hYmxlZEFjdGl2aXR5LFxuICB9ID0gZ2V0QWN0aXZpdGllcygpXG5cbiAgbGV0IHRtcERpcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGxldCB3b3JrZXJRdWV1ZSA9ICcnXG5cbiAgdHJ5IHtcbiAgICAvLyAwLiBHZXQgV29ya2VyLVNwZWNpZmljIFF1ZXVlIGZvciBUcmFuc2NvZGVcbiAgICB3b3JrZXJRdWV1ZSA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eShUYXNrUXVldWVUcmFuc2NvZGUsIGdldFRyYW5zY29kZVdvcmtlclF1ZXVlQWN0aXZpdHkpXG5cbiAgICAvLyAxLiBVcGRhdGUgc3RhdHVzIHRvIHByb2Nlc3NpbmdcbiAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgdGFza0lkOiB0YXNrLmlkLFxuICAgICAgc3RhdHVzOiAncHJvY2Vzc2luZycsXG4gICAgfSlcblxuICAgIGNvbnN0IHBheWxvYWQgPSB0YXNrLnBheWxvYWRcblxuICAgIGlmIChwYXlsb2FkPy5zY3JlZW5zaG90KSB7XG4gICAgICBjb25zdCBhc3NldCA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgZ2V0QXNzZXRBY3Rpdml0eSwgdGFzay5hc3NldElkKVxuICAgICAgY29uc3Qga2V5ID0gYXNzZXQ/LnN0b3JhZ2VLZXk/LmtleVxuICAgICAgaWYgKCFhc3NldCB8fCAha2V5KSB7XG4gICAgICAgIHRocm93IEFwcGxpY2F0aW9uRmFpbHVyZS5jcmVhdGUoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdBc3NldCBub3QgZm91bmQgb3IgaGFzIG5vIGtleScsXG4gICAgICAgICAgbm9uUmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JlZW5zaG90cyA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgdGFrZVNjcmVlbnNob3RzQWN0aXZpdHksIHtcbiAgICAgICAgYXNzZXRLZXk6IGtleSxcbiAgICAgICAgYXNzZXRJZDogYXNzZXQuaWQsXG4gICAgICAgIHN0YXJ0OiBwYXlsb2FkLnNjcmVlbnNob3Quc3RhcnQsXG4gICAgICAgIGVuZDogcGF5bG9hZC5zY3JlZW5zaG90LmVuZCxcbiAgICAgICAgY291bnQ6IHBheWxvYWQuc2NyZWVuc2hvdC5jb3VudCxcbiAgICAgICAgY29tbWVudFRpbWVzdGFtcDogcGF5bG9hZC5zY3JlZW5zaG90LmNvbW1lbnRUaW1lc3RhbXAsXG4gICAgICAgIGFubm90YXRpb25zOiBwYXlsb2FkLnNjcmVlbnNob3QuYW5ub3RhdGlvbnMsXG4gICAgICB9KVxuXG4gICAgICAvLyBVcGRhdGUgVGFzayBTdGF0dXMgdG8gY29tcGxldGVkIHdpdGggb3V0cHV0XG4gICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgICB0YXNrSWQ6IHRhc2suaWQsXG4gICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dDogeyBzY3JlZW5zaG90cyB9LFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChwYXlsb2FkPy5pbWFnZUFubm90YXRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCBnZXRBc3NldEFjdGl2aXR5LCB0YXNrLmFzc2V0SWQpXG4gICAgICBsZXQga2V5ID0gYXNzZXQ/LnN0b3JhZ2VLZXk/LmtleVxuICAgICAgaWYgKGFzc2V0Py5tZWRpYSkge1xuICAgICAgICBjb25zdCBtZWRpYUluZm8gPSBhc3NldC5tZWRpYSBhcyB1bmtub3duIGFzIFByaXNtYUpzb24uTWVkaWFJbmZvXG4gICAgICAgIGlmIChtZWRpYUluZm8uaW1hZ2VUcmFuc2NvZGVzICYmIG1lZGlhSW5mby5pbWFnZVRyYW5zY29kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGtleSA9IG1lZGlhSW5mby5pbWFnZVRyYW5zY29kZXNbMF0ua2V5IHx8IGtleVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXNzZXQgfHwgIWtleSkge1xuICAgICAgICB0aHJvdyBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHtcbiAgICAgICAgICBtZXNzYWdlOiAnQXNzZXQgbm90IGZvdW5kIG9yIGhhcyBubyBrZXknLFxuICAgICAgICAgIG5vblJldHJ5YWJsZTogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5V2l0aE92ZXJsYXkgPSBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIG92ZXJsYXlBbm5vdGF0aW9uc0FjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgICBhbm5vdGF0aW9uczogcGF5bG9hZC5pbWFnZUFubm90YXRpb24uYW5ub3RhdGlvbnMsXG4gICAgICB9KVxuXG4gICAgICAvLyBVcGRhdGUgVGFzayBTdGF0dXMgdG8gY29tcGxldGVkIHdpdGggb3V0cHV0XG4gICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgICB0YXNrSWQ6IHRhc2suaWQsXG4gICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dDogeyBrZXk6IGtleVdpdGhPdmVybGF5IH0sXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB1cGRhdGVBc3NldFN0YXR1c0FjdGl2aXR5LCB7XG4gICAgICBhc3NldElkOiB0YXNrLmFzc2V0SWQsXG4gICAgICBzdGF0dXM6ICdwcm9jZXNzaW5nJyxcbiAgICB9KVxuXG4gICAgLy8gMi4gR2V0IEFzc2V0XG4gICAgY29uc3QgYXNzZXQgPSBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIGdldEFzc2V0QWN0aXZpdHksIHRhc2suYXNzZXRJZClcbiAgICBjb25zdCBrZXkgPSBhc3NldD8uc3RvcmFnZUtleT8ua2V5XG4gICAgaWYgKCFhc3NldCB8fCAha2V5KSB7XG4gICAgICB0aHJvdyBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHtcbiAgICAgICAgbWVzc2FnZTogJ0Fzc2V0IG5vdCBmb3VuZCBvciBoYXMgbm8ga2V5JyxcbiAgICAgICAgbm9uUmV0cnlhYmxlOiB0cnVlLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA0LiBEb3dubG9hZCBNZWRpYSB0byBUbXBcbiAgICBjb25zdCBkb3dubG9hZCA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgZG93bmxvYWRNZWRpYVRvVG1wQWN0aXZpdHksIHtcbiAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgfSlcbiAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSBkb3dubG9hZFxuICAgIHRtcERpciA9IGRvd25sb2FkLnRtcERpclxuXG4gICAgLy8gNS4gR2V0IE1lZGlhIEluZm9cbiAgICBjb25zdCBzcGVjID0gdGFzay5wYXlsb2FkPy50cmFuc2NvZGUgfHwge31cbiAgICBjb25zdCBtZWRpYUluZm8gPSBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIGdldE1lZGlhSW5mb0FjdGl2aXR5LCB7XG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgbWVkaWFUeXBlOiBhc3NldC5tZWRpYVR5cGUgfHwgJycsXG4gICAgfSlcblxuICAgIG1lZGlhSW5mby5vcmlnaW5hbCA9IHtcbiAgICAgIGtleSxcbiAgICAgIGRvd25sb2FkVXJsOiAnJyxcbiAgICAgIGZpbGVzaXplSW5CeXRlczogMCxcbiAgICAgIGNvZGVjOiAnJyxcbiAgICB9XG5cbiAgICBjb25zdCBtaW1lVHlwZSA9IG1lZGlhSW5mby5taW1lVHlwZVxuICAgIGNvbnN0IG1ldGFkYXRhID0gbWVkaWFJbmZvLm1ldGFkYXRhXG5cbiAgICAvLyA2LiBWaWRlbyBUcmFuc2NvZGluZ1xuICAgIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCd2aWRlby8nKSAmJiBtZXRhZGF0YSkge1xuICAgICAgY29uc3QgdmlkZW9SZXNvbHV0aW9ucyA9IGdldFRhcmdldFZpZGVvUmVzb2x1dGlvbnMoXG4gICAgICAgIHNwZWMudmlkZW9TdHJhdGVneSB8fCAnYmVzdF9tYXRjaCcsXG4gICAgICAgIG1ldGFkYXRhLm9yaWdpbmFsV2lkdGgsXG4gICAgICAgIG1ldGFkYXRhLm9yaWdpbmFsSGVpZ2h0LFxuICAgICAgKVxuICAgICAgZm9yIChjb25zdCByZXMgb2YgdmlkZW9SZXNvbHV0aW9ucykge1xuICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSByZXNvbHV0aW9uVG9EaW1lbnNpb25zKFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICBtZXRhZGF0YS5vcmlnaW5hbFdpZHRoLFxuICAgICAgICAgIG1ldGFkYXRhLm9yaWdpbmFsSGVpZ2h0LFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgdmlkZW9TcGVjOiBQcmlzbWFKc29uLlZpZGVvVHJhbnNjb2RlID0ge1xuICAgICAgICAgIHJlc29sdXRpb246IHJlcyxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aWRlb1RyYW5zY29kZSA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgdHJhbnNjb2RlVmlkZW9BY3Rpdml0eSwge1xuICAgICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgdmlkZW9TcGVjLFxuICAgICAgICAgIGR1cmF0aW9uOiBtZXRhZGF0YS5kdXJhdGlvbixcbiAgICAgICAgICBvcmlnaW5hbEZwczogbWV0YWRhdGEuZnJhbWVSYXRlLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChyZXMgPT09ICcxODBwJykge1xuICAgICAgICAgIG1lZGlhSW5mby52aWRlb1ByZXZpZXcgPSB2aWRlb1RyYW5zY29kZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lZGlhSW5mby52aWRlb1RyYW5zY29kZXMucHVzaCh2aWRlb1RyYW5zY29kZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMga2VlcCByYXdcbiAgICAgIG1lZGlhSW5mby52aWRlb1RyYW5zY29kZXMucHVzaCh7XG4gICAgICAgIGtleTogbWVkaWFJbmZvLm9yaWdpbmFsPy5rZXksXG4gICAgICAgIHdpZHRoOiBtZXRhZGF0YS5vcmlnaW5hbFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IG1ldGFkYXRhLm9yaWdpbmFsSGVpZ2h0LFxuICAgICAgICBpc1JhdzogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNi41IEF1ZGlvIFRyYW5zY29kaW5nXG4gICAgY29uc3QgaXNBdWRpbyA9IG1pbWVUeXBlLnN0YXJ0c1dpdGgoJ2F1ZGlvLycpXG4gICAgaWYgKGlzQXVkaW8gJiYgbWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IGF1ZGlvVHJhbnNjb2RlID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB0cmFuc2NvZGVBdWRpb0FjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgfSlcbiAgICAgIG1lZGlhSW5mby52aWRlb1RyYW5zY29kZXMucHVzaChhdWRpb1RyYW5zY29kZSlcbiAgICB9XG5cbiAgICAvLyA3LiBJbWFnZSBUcmFuc2NvZGluZ1xuICAgIGNvbnN0IGlzSW1hZ2UgPSBtaW1lVHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKVxuICAgIGNvbnN0IGlzUHNkID0gaXNNaW1lUHNkKG1pbWVUeXBlKVxuICAgIGlmICgoaXNJbWFnZSB8fCBpc1BzZCkgJiYgbWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IGltYWdlU3BlYzogUHJpc21hSnNvbi5JbWFnZVRyYW5zY29kZSA9IHtcbiAgICAgICAgd2lkdGg6IG1ldGFkYXRhLm9yaWdpbmFsV2lkdGgsXG4gICAgICAgIGhlaWdodDogbWV0YWRhdGEub3JpZ2luYWxIZWlnaHQsXG4gICAgICAgIHF1YWxpdHk6IDkwLFxuICAgICAgICBmb3JtYXQ6ICd3ZWJwJyxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltYWdlVHJhbnNjb2RlID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB0cmFuc2NvZGVJbWFnZUFjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBpbWFnZVNwZWMsXG4gICAgICB9KVxuICAgICAgbWVkaWFJbmZvLmltYWdlVHJhbnNjb2Rlcy5wdXNoKGltYWdlVHJhbnNjb2RlKVxuICAgIH1cblxuICAgIC8vIDkuIFN5c3RlbTogVGh1bWJuYWlsXG4gICAgaWYgKHNwZWMudGh1bWJuYWlsKSB7XG4gICAgICBjb25zdCB0aHVtYlRyYW5zY29kZSA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgdHJhbnNjb2RlSW1hZ2VBY3Rpdml0eSwge1xuICAgICAgICBhc3NldEtleToga2V5LFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgaW1hZ2VTcGVjOiB7IHdpZHRoOiA0ODAsIGhlaWdodDogMCwgcXVhbGl0eTogODAsIGZvcm1hdDogJ3dlYnAnIH0sXG4gICAgICB9KVxuICAgICAgbWVkaWFJbmZvLnRodW1ibmFpbCA9IHRodW1iVHJhbnNjb2RlXG4gICAgfVxuXG4gICAgLy8gMTAuIFN5c3RlbTogU3ByaXRlL1Bvc3RlciAoVmlkZW8gb25seSB1c3VhbGx5KVxuICAgIGlmIChzcGVjLnNwcml0ZSB8fCBzcGVjLnBvc3Rlcikge1xuICAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSBrZXkubGFzdEluZGV4T2YoJy8nKVxuICAgICAgY29uc3QgYXNzZXREaXIgPSBsYXN0U2xhc2hJbmRleCA9PT0gLTEgPyAnJyA6IGtleS5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoSW5kZXgpXG5cbiAgICAgIGNvbnN0IHNwcml0ZVNwZWM6IFByaXNtYUpzb24uU3ByaXRlSW5mbyA9IHtcbiAgICAgICAga2V5OiBhc3NldERpciA/IGAke2Fzc2V0RGlyfS9zcHJpdGUud2VicGAgOiAnc3ByaXRlLndlYnAnLFxuICAgICAgICBmcmFtZXM6IDEwMCxcbiAgICAgICAgdGlsZVg6IDEwLFxuICAgICAgICB0aWxlWTogMTAsXG4gICAgICB9XG4gICAgICBjb25zdCBwb3N0ZXJTcGVjOiBQcmlzbWFKc29uLlBvc3RlckluZm8gPSB7XG4gICAgICAgIGtleTogYXNzZXREaXIgPyBgJHthc3NldERpcn0vcG9zdGVyLndlYnBgIDogJ3Bvc3Rlci53ZWJwJyxcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3ByaXRlUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCBnZW5lcmF0ZVNwcml0ZUFjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBzcHJpdGVTcGVjLFxuICAgICAgICBwb3N0ZXJTcGVjLFxuICAgICAgICBtZWRpYUluZm8sXG4gICAgICB9KVxuICAgICAgbWVkaWFJbmZvLnNwcml0ZSA9IHNwcml0ZVJlc3VsdC5zcHJpdGVcbiAgICAgIG1lZGlhSW5mby5wb3N0ZXIgPSBzcHJpdGVSZXN1bHQucG9zdGVyXG4gICAgfVxuXG4gICAgLy8gMTEuIFVwZGF0ZSBBc3NldCBNZWRpYSBhbmQgU3RhdHVzXG4gICAgYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB1cGRhdGVBc3NldE1lZGlhQWN0aXZpdHksIHtcbiAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgbWVkaWFJbmZvLFxuICAgIH0pXG5cbiAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZUFzc2V0U3RhdHVzQWN0aXZpdHksIHtcbiAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgc3RhdHVzOiAncHJvY2Vzc2VkJyxcbiAgICB9KVxuXG4gICAgLy8gMTEuNSBDcmVhdGUgQUkgZW1iZWRkaW5nIHRhc2sgaWYgZW5hYmxlZFxuICAgIGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgY3JlYXRlRW1iZWRkaW5nVGFza0lmRW5hYmxlZEFjdGl2aXR5LCB7XG4gICAgICBhc3NldElkOiBhc3NldC5pZCxcbiAgICAgIHRlYW1JZDogdGFzay50ZWFtSWQsXG4gICAgICBwcm9qZWN0SWQ6IHRhc2sucHJvamVjdElkLFxuICAgIH0pXG5cbiAgICAvLyAxMi4gVXBkYXRlIFRhc2sgU3RhdHVzXG4gICAgYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB1cGRhdGVUYXNrU3RhdHVzQWN0aXZpdHksIHtcbiAgICAgIHRhc2tJZDogdGFzay5pZCxcbiAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihgVHJhbnNjb2RlTWVkaWEgZmFpbGVkIGZvciB0YXNrICR7dGFzay5pZH06YCwgZXJyKVxuICAgIC8vIFVwZGF0ZSBzdGF0dXMgdG8gZmFpbGVkXG4gICAgaWYgKHdvcmtlclF1ZXVlKSB7XG4gICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgICB0YXNrSWQ6IHRhc2suaWQsXG4gICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgIG91dHB1dDogeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodG1wRGlyICYmIHdvcmtlclF1ZXVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIGNsZWFudXBUbXBEaXJBY3Rpdml0eSwgeyB0bXBEaXIgfSlcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgdG1wIGRpcjonLCBjbGVhbnVwRXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc01pbWVQc2QobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKG1pbWVUeXBlKSB7XG4gICAgY2FzZSAnaW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcCc6XG4gICAgY2FzZSAnaW1hZ2UveC1waG90b3Nob3AnOlxuICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtcGhvdG9zaG9wJzpcbiAgICBjYXNlICdpbWFnZS9wc2QnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgUkVTT0xVVElPTl9MT05HX1NJREVTOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAnMjE2MHAnOiAzODQwLFxuICAnMTA4MHAnOiAxOTIwLFxuICAnNzIwcCc6IDEyODAsXG4gICc1NDBwJzogOTYwLFxuICAnMzYwcCc6IDY0MCxcbiAgJzE4MHAnOiAzMjAsXG59XG5cbmZ1bmN0aW9uIHJlc29sdXRpb25Ub0RpbWVuc2lvbnMoXG4gIHJlc29sdXRpb246IHN0cmluZyxcbiAgb3JpZ2luYWxXaWR0aDogbnVtYmVyLFxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHRhcmdldExvbmdTaWRlID0gUkVTT0xVVElPTl9MT05HX1NJREVTW3Jlc29sdXRpb25dXG4gIGlmICghdGFyZ2V0TG9uZ1NpZGUpIHJldHVybiBbMCwgMF1cblxuICBsZXQgd2lkdGg6IG51bWJlclxuICBsZXQgaGVpZ2h0OiBudW1iZXJcblxuICBpZiAob3JpZ2luYWxXaWR0aCA+PSBvcmlnaW5hbEhlaWdodCkge1xuICAgIC8vIExhbmRzY2FwZSBvciBzcXVhcmU6IHdpZHRoIGlzIHRoZSBsb25nIHNpZGVcbiAgICB3aWR0aCA9IHRhcmdldExvbmdTaWRlXG4gICAgaGVpZ2h0ID0gTWF0aC5yb3VuZCh3aWR0aCAqIChvcmlnaW5hbEhlaWdodCAvIG9yaWdpbmFsV2lkdGgpKVxuICB9IGVsc2Uge1xuICAgIC8vIFBvcnRyYWl0OiBoZWlnaHQgaXMgdGhlIGxvbmcgc2lkZVxuICAgIGhlaWdodCA9IHRhcmdldExvbmdTaWRlXG4gICAgd2lkdGggPSBNYXRoLnJvdW5kKGhlaWdodCAqIChvcmlnaW5hbFdpZHRoIC8gb3JpZ2luYWxIZWlnaHQpKVxuICB9XG5cbiAgLy8gRW5zdXJlIGV2ZW4gZGltZW5zaW9ucyBmb3IgSC4yNjRcbiAgaWYgKHdpZHRoICUgMiAhPT0gMCkgd2lkdGgrK1xuICBpZiAoaGVpZ2h0ICUgMiAhPT0gMCkgaGVpZ2h0KytcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdXG59XG5cbmNvbnN0IFRBUkdFVF9SRVNPTFVUSU9OUyA9IFtcbiAgeyBuYW1lOiAnMjE2MHAnLCBsb25nU2lkZTogMzg0MCB9LFxuICB7IG5hbWU6ICcxMDgwcCcsIGxvbmdTaWRlOiAxOTIwIH0sXG4gIHsgbmFtZTogJzcyMHAnLCBsb25nU2lkZTogMTI4MCB9LFxuICB7IG5hbWU6ICc1NDBwJywgbG9uZ1NpZGU6IDk2MCB9LFxuICB7IG5hbWU6ICczNjBwJywgbG9uZ1NpZGU6IDY0MCB9LFxuXVxuXG5mdW5jdGlvbiBnZXRCZXN0TWF0Y2hSZXNvbHV0aW9uKFxuICBvcmlnaW5hbFdpZHRoOiBudW1iZXIsXG4gIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXIsXG4pOiB7IG5hbWU6IHN0cmluZzsgbG9uZ1NpZGU6IG51bWJlciB9IHtcbiAgY29uc3QgcmF3TG9uZ1NpZGUgPSBNYXRoLm1heChvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodClcbiAgY29uc3QgbG93ZXIgPSBUQVJHRVRfUkVTT0xVVElPTlMuZmlsdGVyKChyKSA9PiByLmxvbmdTaWRlIDw9IHJhd0xvbmdTaWRlKVxuICBpZiAobG93ZXIubGVuZ3RoID4gMCkge1xuICAgIGxvd2VyLnNvcnQoKGEsIGIpID0+IGIubG9uZ1NpZGUgLSBhLmxvbmdTaWRlKVxuICAgIHJldHVybiBsb3dlclswXVxuICB9XG4gIHJldHVybiBUQVJHRVRfUkVTT0xVVElPTlNbVEFSR0VUX1JFU09MVVRJT05TLmxlbmd0aCAtIDFdIC8vIDM2MHAgKGxvbmdTaWRlIDY0MClcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmlkZW9SZXNvbHV0aW9ucyhcbiAgc3RyYXRlZ3k6IFByaXNtYUpzb24uVmlkZW9UcmFuc2NvZGVTdHJhdGVneSxcbiAgb3JpZ2luYWxXaWR0aDogbnVtYmVyLFxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXNvbHV0aW9ucyA9IFsnMTgwcCddXG5cbiAgLy8gTm9ybWFsaXplIGxlZ2FjeSBzdHJhdGVnaWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGxldCBub3JtYWxpemVkU3RyYXRlZ3k6IHN0cmluZyA9IHN0cmF0ZWd5XG4gIGNvbnN0IHN0cmF0U3RyID0gc3RyYXRlZ3kgYXMgc3RyaW5nXG4gIGlmIChzdHJhdFN0ciA9PT0gJ3NpbmdsZScgfHwgc3RyYXRTdHIgPT09ICdkaXNhYmxlJykge1xuICAgIG5vcm1hbGl6ZWRTdHJhdGVneSA9ICdiZXN0X21hdGNoJ1xuICB9IGVsc2UgaWYgKHN0cmF0U3RyID09PSAnZnVsbCcpIHtcbiAgICBub3JtYWxpemVkU3RyYXRlZ3kgPSAnYWxsJ1xuICB9XG5cbiAgY29uc3QgYmVzdE1hdGNoID0gZ2V0QmVzdE1hdGNoUmVzb2x1dGlvbihvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodClcblxuICBpZiAobm9ybWFsaXplZFN0cmF0ZWd5ID09PSAnYmVzdF9tYXRjaCcpIHtcbiAgICByZXNvbHV0aW9ucy5wdXNoKGJlc3RNYXRjaC5uYW1lKVxuICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICBjb25zdCBiZXN0TWF0Y2hJbmRleCA9IFRBUkdFVF9SRVNPTFVUSU9OUy5maW5kSW5kZXgoKHIpID0+IHIubmFtZSA9PT0gYmVzdE1hdGNoLm5hbWUpXG4gICAgaWYgKGJlc3RNYXRjaEluZGV4ICE9PSAtMSkge1xuICAgICAgZm9yIChsZXQgaSA9IGJlc3RNYXRjaEluZGV4OyBpIDwgVEFSR0VUX1JFU09MVVRJT05TLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc29sdXRpb25zLnB1c2goVEFSR0VUX1JFU09MVVRJT05TW2ldLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc29sdXRpb25zXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2NvZGVXb3JrZmxvdyA9IHRyYW5zY29kZU1lZGlhXG4iLCIvLyBVc2UgdHlwZS1vbmx5IGltcG9ydHMgZm9yIGFjdGl2aXRpZXMgdG8gYXZvaWQgYnVuZGxpbmcgdGhlbSBpbiBUZW1wb3JhbCB3b3JrZmxvd3NcbmltcG9ydCAqIGFzIHdmIGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93J1xuXG4vKipcbiAqIFRhc2sgcXVldWUgY29uc3RhbnRzLlxuICovXG5leHBvcnQgY29uc3QgVGFza1F1ZXVlQWdlbnQgPSAnYWdlbnRfcXVldWUnXG5leHBvcnQgY29uc3QgVGFza1F1ZXVlVHJhbnNjb2RlID0gJ3RyYW5zY29kZV9xdWV1ZSdcblxuLyoqXG4gKiBEZXRlY3RzIGlmIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpcyB3aXRoaW4gYSBUZW1wb3JhbCBXb3JrZmxvdyBpc29sYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZW1wb3JhbCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICAvLyBJbiBUZW1wb3JhbCBUUyBTREssIHdvcmtmbG93SW5mbygpIHRocm93cyBpZiBjYWxsZWQgb3V0c2lkZSBvZiBhIHdvcmtmbG93IGNvbnRleHQuXG4gICAgd2Yud29ya2Zsb3dJbmZvKClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5pbnRlcmZhY2UgTG9jYWxMb2dnZXIge1xuICBkZWJ1ZyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtc2c6IHN0cmluZyk6IHZvaWRcbiAgaW5mbyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtc2c6IHN0cmluZyk6IHZvaWRcbiAgZXJyb3Iob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbXNnOiBzdHJpbmcpOiB2b2lkXG4gIHdhcm4ob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbXNnOiBzdHJpbmcpOiB2b2lkXG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuY29uc3QgZ2xvYmFsT2JqID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgX19sb2NhbEFjdGl2aXRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBfX2xvY2FsTG9nZ2VyPzogTG9jYWxMb2dnZXJcbn1cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5cbi8qKlxuICogQSBwcm94eSB0aGF0IG1pbWljcyBwcm94eUFjdGl2aXRpZXMgZm9yIGxvY2FsIGV4ZWN1dGlvbi5cbiAqL1xuZnVuY3Rpb24gbG9jYWxBY3Rpdml0aWVzUHJveHkoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBhY3RzID0gZ2xvYmFsT2JqLl9fbG9jYWxBY3Rpdml0aWVzXG4gIGlmICghYWN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignTG9jYWwgYWN0aXZpdGllcyBub3QgaW5qZWN0ZWQgaW50byBnbG9iYWxUaGlzLl9fbG9jYWxBY3Rpdml0aWVzJylcbiAgfVxuICByZXR1cm4gYWN0c1xufVxuXG4vKipcbiAqIEVudmlyb25tZW50LWF3YXJlIHNsZWVwIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNUZW1wb3JhbCgpKSB7XG4gICAgYXdhaXQgd2Yuc2xlZXAobXMpXG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuICB9XG59XG5cbi8qKlxuICogRW52aXJvbm1lbnQtYXdhcmUgYWN0aXZpdHkgcHJveHkuXG4gKi9cbi8vIGdldEFjdGl2aXRpZXMgbXVzdCBkZWZhdWx0IHRvIGBhbnlgIHNvIHRoYXQgd29ya2Zsb3dzIGNhbiBkeW5hbWljYWxseVxuLy8gZGVzdHJ1Y3R1cmUgYW5kIGNhbGwgYW55IGFjdGl2aXR5IHdoZW4gdGhleSBkbyBub3Qgc3VwcGx5IGEgcHJlY2lzZSB0eXBlIHBhcmFtZXRlci5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZpdGllczxUID0gYW55PigpOiBUIHtcbiAgLy8gYmFzZVByb3h5IGlzIGR5bmFtaWNhbGx5IHByb3h5aW5nIGFsbCBhY3Rpdml0aWVzLCBzbyB3ZSBtdXN0IHR5cGUgaXQgYXMgYW55LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBsZXQgYmFzZVByb3h5OiBhbnlcbiAgaWYgKGlzVGVtcG9yYWwoKSkge1xuICAgIC8vIFRlbXBvcmFsJ3MgcHJveHlBY3Rpdml0aWVzIHJlcXVpcmVzIGEgdHlwZSBwYXJhbWV0ZXIsIHNvIHdlIHVzZSBhbnkgZm9yIGdlbmVyaWMgYWN0aXZpdGllcy5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGJhc2VQcm94eSA9IHdmLnByb3h5QWN0aXZpdGllczxhbnk+KHtcbiAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICcxMCBtaW51dGVzJyxcbiAgICAgIHJldHJ5OiB7XG4gICAgICAgIG1heGltdW1BdHRlbXB0czogNSxcbiAgICAgICAgaW5pdGlhbEludGVydmFsOiAnMTBzJyxcbiAgICAgIH0sXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBiYXNlUHJveHkgPSBsb2NhbEFjdGl2aXRpZXNQcm94eSgpXG4gIH1cblxuICAvLyBXcmFwIHRoZSBiYXNlIHByb3h5IHRvIGF0dGFjaCB0aGUgYWN0aXZpdHkgbmFtZSB0byB0aGUgcmV0dXJuZWQgZnVuY3Rpb25zXG4gIC8vIFdlIHVzZSBhbnkgaGVyZSBiZWNhdXNlIHdlIGFyZSBkeW5hbWljYWxseSBpbnRlcmNlcHRpbmcgcHJvcGVydGllcyBvbiB0aGUgcHJveHlcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmV0dXJuIG5ldyBQcm94eShiYXNlUHJveHkgYXMgYW55LCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRhcmdldFtwcm9wXVxuICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGhhcyB0aGUgX2FjdGl2aXR5TmFtZSBwcm9wZXJ0eVxuICAgICAgICAgIGNvbnN0IHdyYXBwZWQgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiBvcmlnaW5hbCguLi5hcmdzKVxuICAgICAgICAgIC8vIFdlIGF0dGFjaCBhIGhpZGRlbiBwcm9wZXJ0eSB0byB0cmFjayB0aGUgYWN0aXZpdHkgbmFtZSBmb3IgZXhlY3V0ZUFjdGl2aXR5XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICA7KHdyYXBwZWQgYXMgYW55KS5fYWN0aXZpdHlOYW1lID0gcHJvcFxuICAgICAgICAgIHJldHVybiB3cmFwcGVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsXG4gICAgICB9XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKVxuICAgIH0sXG4gIH0pXG59XG5cbi8qKlxuICogRW52aXJvbm1lbnQtYXdhcmUgbG9nZ2VyIGZvciB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldExvZ2dlcigpIHtcbiAgaWYgKGlzVGVtcG9yYWwoKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkZWJ1ZzogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cuZGVidWcobXNnLCBvYmopLFxuICAgICAgaW5mbzogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cuaW5mbyhtc2csIG9iaiksXG4gICAgICBlcnJvcjogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cuZXJyb3IobXNnLCBvYmopLFxuICAgICAgd2FybjogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cud2Fybihtc2csIG9iaiksXG4gICAgfVxuICB9XG4gIHJldHVybiBnbG9iYWxPYmouX19sb2NhbExvZ2dlciB8fCBjb25zb2xlXG59XG5cbi8qKlxuICogRXhlY3V0ZSBhbiBhY3Rpdml0eSBvbiBhIHNwZWNpZmljIHRhc2sgcXVldWUuXG4gKiBAcGFyYW0gcXVldWUgVGhlIHRhc2sgcXVldWUgdG8gcnVuIHRoZSBhY3Rpdml0eSBvblxuICogQHBhcmFtIGFjdGl2aXR5RnVuYyBUaGUgcHJveHkgZnVuY3Rpb24gb2J0YWluZWQgZnJvbSBgZ2V0QWN0aXZpdGllcygpYFxuICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhY3Rpdml0eVxuICovXG4vLyBPdmVybG9hZCBzaWduYXR1cmUgZm9yIHVudHlwZWQgb3IgZ2VuZXJpYyBhY3Rpdml0eSBjYWxsYmFja3MuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGl2aXR5KFxuICBxdWV1ZTogc3RyaW5nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBhY3Rpdml0eUZ1bmM6IGFueSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLi4uYXJnczogYW55W11cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbik6IFByb21pc2U8YW55PlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpdml0eTxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJldD4oXG4gIHF1ZXVlOiBzdHJpbmcsXG4gIGFjdGl2aXR5RnVuYzogKC4uLmFyZ3M6IFRBcmdzKSA9PiBQcm9taXNlPFRSZXQ+LFxuICAuLi5hcmdzOiBUQXJnc1xuKTogUHJvbWlzZTxUUmV0PlxuLy8gSW1wbGVtZW50YXRpb24gc2lnbmF0dXJlIGZvciBleGVjdXRlQWN0aXZpdHkuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGl2aXR5KFxuICBxdWV1ZTogc3RyaW5nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBhY3Rpdml0eUZ1bmM6IGFueSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLi4uYXJnczogYW55W11cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbik6IFByb21pc2U8YW55PiB7XG4gIC8vIFdlIGV4dHJhY3QgdGhlIGhpZGRlbiBfYWN0aXZpdHlOYW1lIHByb3BlcnR5IGF0dGFjaGVkIGJ5IGdldEFjdGl2aXRpZXMoKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCBhY3Rpdml0eU5hbWUgPSAoYWN0aXZpdHlGdW5jIGFzIGFueSkuX2FjdGl2aXR5TmFtZVxuICBpZiAoIWFjdGl2aXR5TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdleGVjdXRlQWN0aXZpdHkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBhY3Rpdml0eSBmdW5jdGlvbiBvYnRhaW5lZCBmcm9tIGdldEFjdGl2aXRpZXMoKScsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKClcbiAgbG9nZ2VyLmRlYnVnKHsgcXVldWUsIGFjdGl2aXR5TmFtZSB9LCBgRXhlY3V0aW5nIGFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSBvbiBxdWV1ZSAke3F1ZXVlfWApXG5cbiAgdHJ5IHtcbiAgICAvLyByZXN1bHQgaG9sZHMgdGhlIHVudHlwZWQgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgYWN0aXZpdHkgcHJveHksIHNvIHdlIHR5cGUgaXQgYXMgYW55LlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGV0IHJlc3VsdDogYW55XG4gICAgaWYgKGlzVGVtcG9yYWwoKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGhhbmRsZSA9IHdmLnByb3h5QWN0aXZpdGllczxhbnk+KHtcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzEwIG1pbnV0ZXMnLFxuICAgICAgICB0YXNrUXVldWU6IHF1ZXVlLFxuICAgICAgICByZXRyeToge1xuICAgICAgICAgIG1heGltdW1BdHRlbXB0czogNSxcbiAgICAgICAgICBpbml0aWFsSW50ZXJ2YWw6ICcxMHMnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGhhbmRsZVthY3Rpdml0eU5hbWVdKC4uLmFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBsb2NhbCBleGVjdXRpb24sIHF1ZXVlIGlzIGlnbm9yZWQgYW5kIHdlIGp1c3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICAgIHJlc3VsdCA9IGF3YWl0IGFjdGl2aXR5RnVuYyguLi5hcmdzKVxuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICB7IHF1ZXVlLCBhY3Rpdml0eU5hbWUgfSxcbiAgICAgIGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvbiBxdWV1ZSAke3F1ZXVlfWAsXG4gICAgKVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgeyBxdWV1ZSwgYWN0aXZpdHlOYW1lLCBlcnIgfSxcbiAgICAgIGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gZmFpbGVkIG9uIHF1ZXVlICR7cXVldWV9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxuICAgIClcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBhbmQgdmFsaWRhdGVzIGEgY29uY3VycmVuY3kgbGltaXQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBJZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBOYU4sIG9yIDw9IDAsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jdXJyZW5jeUxpbWl0KGVudlZhcjogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghZW52VmFyKSByZXR1cm4gZGVmYXVsdFZhbHVlXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KGVudlZhciwgMTApXG4gIGlmIChpc05hTihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICB9XG4gIHJldHVybiBwYXJzZWRcbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gSGVscGVycy5cbmNvbnN0IHMgPSAxMDAwO1xuY29uc3QgbSA9IHMgKiA2MDtcbmNvbnN0IGggPSBtICogNjA7XG5jb25zdCBkID0gaCAqIDI0O1xuY29uc3QgdyA9IGQgKiA3O1xuY29uc3QgeSA9IGQgKiAzNjUuMjU7XG5mdW5jdGlvbiBtcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zPy5sb25nID8gZm10TG9uZyh2YWx1ZSkgOiBmbXRTaG9ydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBpcyBub3QgYSBzdHJpbmcgb3IgbnVtYmVyLicpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGlzRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICA/IGAke2Vycm9yLm1lc3NhZ2V9LiB2YWx1ZT0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgICAgICA6ICdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cmVkLic7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG59XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy4nKTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICBjb25zdCB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3lyJzpcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHk7XG4gICAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB3O1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGQ7XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hycyc6XG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGg7XG4gICAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIG07XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2VjJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHM7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnbXNlY3MnOlxuICAgICAgICBjYXNlICdtc2VjJzpcbiAgICAgICAgY2FzZSAnbXMnOlxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ci5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHVuaXQgJHt0eXBlfSB3YXMgbWF0Y2hlZCwgYnV0IG5vIG1hdGNoaW5nIGNhc2UgZXhpc3RzLmApO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IG1zO1xuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBkKX1kYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBoKX1oYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBtKX1tYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBzKX1zYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfW1zYDtcbn1cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICBjb25zdCBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfSBtc2A7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgY29uc3QgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbil9ICR7bmFtZX0ke2lzUGx1cmFsID8gJ3MnIDogJyd9YDtcbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnbWVzc2FnZScgaW4gZXJyb3I7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQ7XG4iLCIvLyBHRU5FUkFURUQgRklMRS4gRE8gTk9UIEVESVQuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBmdW5jdGlvbiBwcmVmZXJEZWZhdWx0KGV4cG9ydHMpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5kZWZhdWx0IHx8IGV4cG9ydHM7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXhwb3J0cyA9IHt9O1xuICAgICAgZmFjdG9yeShleHBvcnRzKTtcbiAgICAgIHJldHVybiBwcmVmZXJEZWZhdWx0KGV4cG9ydHMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzKTtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIikgbW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJEZWZhdWx0KGV4cG9ydHMpO1xuICB9IGVsc2Uge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXhwb3J0cyA9IHt9O1xuICAgICAgZmFjdG9yeShleHBvcnRzKTtcbiAgICAgIGdsb2JhbC5Mb25nID0gcHJlZmVyRGVmYXVsdChleHBvcnRzKTtcbiAgICB9KSgpO1xuICB9XG59KShcbiAgdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCJcbiAgICA/IGdsb2JhbFRoaXNcbiAgICA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICA/IHNlbGZcbiAgICAgIDogdGhpcyxcbiAgZnVuY3Rpb24gKF9leHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBfZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IDIwMDkgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzXG4gICAgICogQ29weXJpZ2h0IDIwMjAgRGFuaWVsIFdpcnR6IC8gVGhlIGxvbmcuanMgQXV0aG9ycy5cbiAgICAgKlxuICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgICAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgICAqXG4gICAgICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgICAqXG4gICAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gICAgICpcbiAgICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICAgICAqL1xuXG4gICAgLy8gV2ViQXNzZW1ibHkgb3B0aW1pemF0aW9ucyB0byBkbyBuYXRpdmUgaTY0IG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpZGVcbiAgICB2YXIgd2FzbSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UoXG4gICAgICAgIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgLy8gXFwwYXNtXG4gICAgICAgICAgICAwLCA5NywgMTE1LCAxMDksXG4gICAgICAgICAgICAvLyB2ZXJzaW9uIDFcbiAgICAgICAgICAgIDEsIDAsIDAsIDAsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwidHlwZVwiXG4gICAgICAgICAgICAxLCAxMywgMixcbiAgICAgICAgICAgIC8vIDAsICgpID0+IGkzMlxuICAgICAgICAgICAgOTYsIDAsIDEsIDEyNyxcbiAgICAgICAgICAgIC8vIDEsIChpMzIsIGkzMiwgaTMyLCBpMzIpID0+IGkzMlxuICAgICAgICAgICAgOTYsIDQsIDEyNywgMTI3LCAxMjcsIDEyNywgMSwgMTI3LFxuICAgICAgICAgICAgLy8gc2VjdGlvbiBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgIDMsIDcsIDYsXG4gICAgICAgICAgICAvLyAwLCB0eXBlIDBcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAvLyAxLCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyAyLCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyAzLCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyA0LCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyA1LCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiZ2xvYmFsXCJcbiAgICAgICAgICAgIDYsIDYsIDEsXG4gICAgICAgICAgICAvLyAwLCBcImhpZ2hcIiwgbXV0YWJsZSBpMzJcbiAgICAgICAgICAgIDEyNywgMSwgNjUsIDAsIDExLFxuICAgICAgICAgICAgLy8gc2VjdGlvbiBcImV4cG9ydFwiXG4gICAgICAgICAgICA3LCA1MCwgNixcbiAgICAgICAgICAgIC8vIDAsIFwibXVsXCJcbiAgICAgICAgICAgIDMsIDEwOSwgMTE3LCAxMDgsIDAsIDEsXG4gICAgICAgICAgICAvLyAxLCBcImRpdl9zXCJcbiAgICAgICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTUsIDAsIDIsXG4gICAgICAgICAgICAvLyAyLCBcImRpdl91XCJcbiAgICAgICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTcsIDAsIDMsXG4gICAgICAgICAgICAvLyAzLCBcInJlbV9zXCJcbiAgICAgICAgICAgIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTUsIDAsIDQsXG4gICAgICAgICAgICAvLyA0LCBcInJlbV91XCJcbiAgICAgICAgICAgIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTcsIDAsIDUsXG4gICAgICAgICAgICAvLyA1LCBcImdldF9oaWdoXCJcbiAgICAgICAgICAgIDgsIDEwMywgMTAxLCAxMTYsIDk1LCAxMDQsIDEwNSwgMTAzLCAxMDQsIDAsIDAsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiY29kZVwiXG4gICAgICAgICAgICAxMCwgMTkxLCAxLCA2LFxuICAgICAgICAgICAgLy8gMCwgXCJnZXRfaGlnaFwiXG4gICAgICAgICAgICA0LCAwLCAzNSwgMCwgMTEsXG4gICAgICAgICAgICAvLyAxLCBcIm11bFwiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI2LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICAgIC8vIDIsIFwiZGl2X3NcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgICAvLyAzLCBcImRpdl91XCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjgsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgICAgLy8gNCwgXCJyZW1fc1wiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI5LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICAgIC8vIDUsIFwicmVtX3VcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICAgIHt9LFxuICAgICAgKS5leHBvcnRzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm8gd2FzbSBzdXBwb3J0IDooXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIsIGdpdmVuIGl0cyBsb3cgYW5kIGhpZ2ggMzIgYml0IHZhbHVlcyBhcyAqc2lnbmVkKiBpbnRlZ2Vycy5cbiAgICAgKiAgU2VlIHRoZSBmcm9tKiBmdW5jdGlvbnMgYmVsb3cgZm9yIG1vcmUgY29udmVuaWVudCB3YXlzIG9mIGNvbnN0cnVjdGluZyBMb25ncy5cbiAgICAgKiBAZXhwb3J0cyBMb25nXG4gICAgICogQGNsYXNzIEEgTG9uZyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93IFRoZSBsb3cgKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgbG9uZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9uZyhsb3csIGhpZ2gsIHVuc2lnbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIHRoaXMubG93ID0gbG93IHwgMDtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgaGlnaCAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxuICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAqL1xuICAgICAgdGhpcy5oaWdoID0gaGlnaCB8IDA7XG5cbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXG4gICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAqL1xuICAgICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9uZyBpcyB0aGUgdHdvIGdpdmVuIHNpZ25lZCwgMzItYml0IHZhbHVlcy5cbiAgICAvLyBXZSB1c2UgMzItYml0IHBpZWNlcyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgc2l6ZSBvZiBpbnRlZ2VycyBvbiB3aGljaFxuICAgIC8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxuICAgIC8vIG11bHRpcGxpY2F0aW9uLCB3ZSBzcGxpdCBlYWNoIG51bWJlciBpbnRvIDE2IGJpdCBwaWVjZXMsIHdoaWNoIGNhbiBlYXNpbHkgYmVcbiAgICAvLyBtdWx0aXBsaWVkIHdpdGhpbiBKYXZhc2NyaXB0J3MgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBvdmVyZmxvd1xuICAgIC8vIG9yIGNoYW5nZSBpbiBzaWduLlxuICAgIC8vXG4gICAgLy8gSW4gdGhlIGFsZ29yaXRobXMgYmVsb3csIHdlIGZyZXF1ZW50bHkgcmVkdWNlIHRoZSBuZWdhdGl2ZSBjYXNlIHRvIHRoZVxuICAgIC8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxuICAgIC8vIE5vdGUgdGhhdCB3ZSBtdXN0IEFMV0FZUyBjaGVjayBzcGVjaWFsbHkgd2hldGhlciB0aG9zZSB2YWx1ZXMgYXJlIE1JTl9WQUxVRVxuICAgIC8vICgtMl42MykgYmVjYXVzZSAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRSAoc2luY2UgMl42MyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXNcbiAgICAvLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXG4gICAgLy8gY2FzZSB3b3VsZCBvZnRlbiByZXN1bHQgaW4gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIC8vXG4gICAgLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXG4gICAgLy8gbWV0aG9kcyBvbiB3aGljaCB0aGV5IGRlcGVuZC5cblxuICAgIC8qKlxuICAgICAqIEFuIGluZGljYXRvciB1c2VkIHRvIHJlbGlhYmx5IGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBMb25nIG9yIG5vdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIExvbmcucHJvdG90eXBlLl9faXNMb25nX187XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xvbmcob2JqKSB7XG4gICAgICByZXR1cm4gKG9iaiAmJiBvYmpbXCJfX2lzTG9uZ19fXCJdKSA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIG51bWJlclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3R6MzIodmFsdWUpIHtcbiAgICAgIHZhciBjID0gTWF0aC5jbHozMih2YWx1ZSAmIC12YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWUgPyAzMSAtIGMgOiBjO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgTG9uZy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nLmlzTG9uZyA9IGlzTG9uZztcblxuICAgIC8qKlxuICAgICAqIEEgY2FjaGUgb2YgdGhlIExvbmcgcmVwcmVzZW50YXRpb25zIG9mIHNtYWxsIGludGVnZXIgdmFsdWVzLlxuICAgICAqIEB0eXBlIHshT2JqZWN0fVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBJTlRfQ0FDSEUgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEEgY2FjaGUgb2YgdGhlIExvbmcgcmVwcmVzZW50YXRpb25zIG9mIHNtYWxsIHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLlxuICAgICAqIEB0eXBlIHshT2JqZWN0fVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBVSU5UX0NBQ0hFID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgdmFyIG9iaiwgY2FjaGVkT2JqLCBjYWNoZTtcbiAgICAgIGlmICh1bnNpZ25lZCkge1xuICAgICAgICB2YWx1ZSA+Pj49IDA7XG4gICAgICAgIGlmICgoY2FjaGUgPSAwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xuICAgICAgICAgIGNhY2hlZE9iaiA9IFVJTlRfQ0FDSEVbdmFsdWVdO1xuICAgICAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgICAgIH1cbiAgICAgICAgb2JqID0gZnJvbUJpdHModmFsdWUsIDAsIHRydWUpO1xuICAgICAgICBpZiAoY2FjaGUpIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgfD0gMDtcbiAgICAgICAgaWYgKChjYWNoZSA9IC0xMjggPD0gdmFsdWUgJiYgdmFsdWUgPCAxMjgpKSB7XG4gICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgICAgICBpZiAoY2FjaGVkT2JqKSByZXR1cm4gY2FjaGVkT2JqO1xuICAgICAgICB9XG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcbiAgICAgICAgaWYgKGNhY2hlKSBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSAzMiBiaXQgaW50ZWdlciBpbiBxdWVzdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21JbnQgPSBmcm9tSW50O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgIGlmICh1bnNpZ25lZCkge1xuICAgICAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gVVpFUk87XG4gICAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTCkgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwpIHJldHVybiBNSU5fVkFMVUU7XG4gICAgICAgIGlmICh2YWx1ZSArIDEgPj0gVFdPX1BXUl82M19EQkwpIHJldHVybiBNQVhfVkFMVUU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdmFsdWUgJSBUV09fUFdSXzMyX0RCTCB8IDAsXG4gICAgICAgICh2YWx1ZSAvIFRXT19QV1JfMzJfREJMKSB8IDAsXG4gICAgICAgIHVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgbnVtYmVyIGluIHF1ZXN0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93Qml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCkge1xuICAgICAgcmV0dXJuIG5ldyBMb25nKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXG4gICAgICogIGFzc3VtZWQgdG8gdXNlIDMyIGJpdHMuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzIFRoZSBoaWdoIDMyIGJpdHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tQml0cyA9IGZyb21CaXRzO1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnRcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAgICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWRcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyLCB1bnNpZ25lZCwgcmFkaXgpIHtcbiAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB0aHJvdyBFcnJvcihcImVtcHR5IHN0cmluZ1wiKTtcbiAgICAgIGlmICh0eXBlb2YgdW5zaWduZWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgLy8gRm9yIGdvb2cubWF0aC5sb25nIGNvbXBhdGliaWxpdHlcbiAgICAgICAgcmFkaXggPSB1bnNpZ25lZDtcbiAgICAgICAgdW5zaWduZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVuc2lnbmVkID0gISF1bnNpZ25lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgc3RyID09PSBcIk5hTlwiIHx8XG4gICAgICAgIHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8XG4gICAgICAgIHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fFxuICAgICAgICBzdHIgPT09IFwiLUluZmluaXR5XCJcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgdGhyb3cgUmFuZ2VFcnJvcihcInJhZGl4XCIpO1xuICAgICAgdmFyIHA7XG4gICAgICBpZiAoKHAgPSBzdHIuaW5kZXhPZihcIi1cIikpID4gMCkgdGhyb3cgRXJyb3IoXCJpbnRlcmlvciBoeXBoZW5cIik7XG4gICAgICBlbHNlIGlmIChwID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmcm9tU3RyaW5nKHN0ci5zdWJzdHJpbmcoMSksIHVuc2lnbmVkLCByYWRpeCkubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cbiAgICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICAgICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpO1xuICAgICAgdmFyIHJlc3VsdCA9IFpFUk87XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcoaSwgaSArIHNpemUpLCByYWRpeCk7XG4gICAgICAgIGlmIChzaXplIDwgOCkge1xuICAgICAgICAgIHZhciBwb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgc2l6ZSkpO1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocG93ZXIpLmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChyYWRpeFRvUG93ZXIpO1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHN0cmluZywgd3JpdHRlbiB1c2luZyB0aGUgc3BlY2lmaWVkIHJhZGl4LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcbiAgICAgKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBUaGUgcmFkaXggaW4gd2hpY2ggdGhlIHRleHQgaXMgd3JpdHRlbiAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcIm51bWJlclwiKSByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcbiAgICAgIC8vIFRocm93cyBmb3Igbm9uLW9iamVjdHMsIGNvbnZlcnRzIG5vbi1pbnN0YW5jZW9mIExvbmc6XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHZhbC5sb3csXG4gICAgICAgIHZhbC5oaWdoLFxuICAgICAgICB0eXBlb2YgdW5zaWduZWQgPT09IFwiYm9vbGVhblwiID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmcm9tKiBmdW5jdGlvbiBmb3IgaXRzIHR5cGUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLmZyb21WYWx1ZSA9IGZyb21WYWx1ZTtcblxuICAgIC8vIE5PVEU6IHRoZSBjb21waWxlciBzaG91bGQgaW5saW5lIHRoZXNlIGNvbnN0YW50IHZhbHVlcyBiZWxvdyBhbmQgdGhlbiByZW1vdmUgdGhlc2UgdmFyaWFibGVzLCBzbyB0aGVyZSBzaG91bGQgYmVcbiAgICAvLyBubyBydW50aW1lIHBlbmFsdHkgZm9yIHRoZXNlLlxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8xNl9EQkwgPSAxIDw8IDE2O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8zMl9EQkwgPSBUV09fUFdSXzE2X0RCTCAqIFRXT19QV1JfMTZfREJMO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl82NF9EQkwgPSBUV09fUFdSXzMyX0RCTCAqIFRXT19QV1JfMzJfREJMO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGNvbnN0XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFRXT19QV1JfMjQgPSBmcm9tSW50KFRXT19QV1JfMjRfREJMKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgWkVSTyA9IGZyb21JbnQoMCk7XG5cbiAgICAvKipcbiAgICAgKiBTaWduZWQgemVyby5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5aRVJPID0gWkVSTztcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVVpFUk8gPSBmcm9tSW50KDAsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVW5zaWduZWQgemVyby5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5VWkVSTyA9IFVaRVJPO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBPTkUgPSBmcm9tSW50KDEpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmVkIG9uZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5PTkUgPSBPTkU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVW5zaWduZWQgb25lLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLlVPTkUgPSBVT05FO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBORUdfT05FID0gZnJvbUludCgtMSk7XG5cbiAgICAvKipcbiAgICAgKiBTaWduZWQgbmVnYXRpdmUgb25lLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk5FR19PTkUgPSBORUdfT05FO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBNQVhfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHg3ZmZmZmZmZiB8IDAsIGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gc2lnbmVkIHZhbHVlLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk1BWF9WQUxVRSA9IE1BWF9WQUxVRTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgTUFYX1VOU0lHTkVEX1ZBTFVFID0gZnJvbUJpdHMoMHhmZmZmZmZmZiB8IDAsIDB4ZmZmZmZmZmYgfCAwLCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gdW5zaWduZWQgdmFsdWUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwIHwgMCwgZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBzaWduZWQgdmFsdWUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTUlOX1ZBTFVFID0gTUlOX1ZBTFVFO1xuXG4gICAgLyoqXG4gICAgICogQGFsaWFzIExvbmcucHJvdG90eXBlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgMzIgYml0IGludGVnZXIsIGFzc3VtaW5nIGl0IGlzIGEgMzIgYml0IGludGVnZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIHRoZSBuZWFyZXN0IGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUgKGRvdWJsZSwgNTMgYml0IG1hbnRpc3NhKS5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gICAgICBpZiAodGhpcy51bnNpZ25lZClcbiAgICAgICAgcmV0dXJuICh0aGlzLmhpZ2ggPj4+IDApICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG93ID4+PiAwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSBzdHJpbmcgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIHJhZGl4LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFJhZGl4ICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGByYWRpeGAgaXMgb3V0IG9mIHJhbmdlXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XG4gICAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xuICAgICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIFwiMFwiO1xuICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxuICAgICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIExvbmcgdmFsdWUgYmVmb3JlIGl0IGNhbiBiZSBuZWdhdGVkLCBzbyB3ZSByZW1vdmVcbiAgICAgICAgICAvLyB0aGUgYm90dG9tLW1vc3QgZGlnaXQgaW4gdGhpcyBiYXNlIGFuZCB0aGVuIHJlY3Vyc2UgdG8gZG8gdGhlIHJlc3QuXG4gICAgICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIocmFkaXgpLFxuICAgICAgICAgICAgZGl2ID0gdGhpcy5kaXYocmFkaXhMb25nKSxcbiAgICAgICAgICAgIHJlbTEgPSBkaXYubXVsKHJhZGl4TG9uZykuc3ViKHRoaXMpO1xuICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBcIi1cIiArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBEbyBzZXZlcmFsICg2KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gICAgICAvLyBtaW5pbWl6ZSB0aGUgY2FsbHMgdG8gdGhlIHZlcnkgZXhwZW5zaXZlIGVtdWxhdGVkIGRpdi5cbiAgICAgIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDYpLCB0aGlzLnVuc2lnbmVkKSxcbiAgICAgICAgcmVtID0gdGhpcztcbiAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHJlbURpdiA9IHJlbS5kaXYocmFkaXhUb1Bvd2VyKSxcbiAgICAgICAgICBpbnR2YWwgPSByZW0uc3ViKHJlbURpdi5tdWwocmFkaXhUb1Bvd2VyKSkudG9JbnQoKSA+Pj4gMCxcbiAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xuICAgICAgICByZW0gPSByZW1EaXY7XG4gICAgICAgIGlmIChyZW0uaXNaZXJvKCkpIHJldHVybiBkaWdpdHMgKyByZXN1bHQ7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNikgZGlnaXRzID0gXCIwXCIgKyBkaWdpdHM7XG4gICAgICAgICAgcmVzdWx0ID0gXCJcIiArIGRpZ2l0cyArIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHMgPSBmdW5jdGlvbiBnZXRIaWdoQml0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2g7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBVbnNpZ25lZCBoaWdoIGJpdHNcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGxvdyBiaXRzXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzID0gZnVuY3Rpb24gZ2V0TG93Qml0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvdztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldExvd0JpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldExvd0JpdHNVbnNpZ25lZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvdyA+Pj4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XG4gICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpXG4gICAgICAgIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxuICAgICAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtcbiAgICAgIHZhciB2YWwgPSB0aGlzLmhpZ2ggIT0gMCA/IHRoaXMuaGlnaCA6IHRoaXMubG93O1xuICAgICAgZm9yICh2YXIgYml0ID0gMzE7IGJpdCA+IDA7IGJpdC0tKSBpZiAoKHZhbCAmICgxIDw8IGJpdCkpICE9IDApIGJyZWFrO1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcgY2FuIGJlIHNhZmVseSByZXByZXNlbnRlZCBhcyBhIEphdmFTY3JpcHQgbnVtYmVyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzU2FmZUludGVnZXIgPSBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKCkge1xuICAgICAgLy8gMl41My0xIGlzIHRoZSBtYXhpbXVtIHNhZmUgdmFsdWVcbiAgICAgIHZhciB0b3AxMUJpdHMgPSB0aGlzLmhpZ2ggPj4gMjE7XG4gICAgICAvLyBbMCwgMl41My0xXVxuICAgICAgaWYgKCF0b3AxMUJpdHMpIHJldHVybiB0cnVlO1xuICAgICAgLy8gPiAyXjUzLTFcbiAgICAgIGlmICh0aGlzLnVuc2lnbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBbLTJeNTMsIC0xXSBleGNlcHQgLTJeNTNcbiAgICAgIHJldHVybiB0b3AxMUJpdHMgPT09IC0xICYmICEodGhpcy5sb3cgPT09IDAgJiYgdGhpcy5oaWdoID09PSAtMHgyMDAwMDApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8oKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID09PSAwICYmIHRoaXMubG93ID09PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNpc1plcm99LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZXF6ID0gTG9uZ1Byb3RvdHlwZS5pc1plcm87XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBuZWdhdGl2ZS5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc05lZ2F0aXZlID0gZnVuY3Rpb24gaXNOZWdhdGl2ZSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPCAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZSBvciB6ZXJvLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG9kZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAxO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBldmVuLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbigpIHtcbiAgICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudW5zaWduZWQgIT09IG90aGVyLnVuc2lnbmVkICYmXG4gICAgICAgIHRoaXMuaGlnaCA+Pj4gMzEgPT09IDEgJiZcbiAgICAgICAgb3RoZXIuaGlnaCA+Pj4gMzEgPT09IDFcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gb3RoZXIuaGlnaCAmJiB0aGlzLmxvdyA9PT0gb3RoZXIubG93O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2VxdWFsc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmVxID0gTG9uZ1Byb3RvdHlwZS5lcXVhbHM7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubm90RXF1YWxzID0gZnVuY3Rpb24gbm90RXF1YWxzKG90aGVyKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZXEoLyogdmFsaWRhdGVzICovIG90aGVyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNub3RFcXVhbHN9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5uZXEgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFscztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubmUgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFscztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPCAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubHQgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGxlc3NUaGFuT3JFcXVhbChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDw9IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubHRlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbn0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmd0ZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxuICAgICAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIGlmICh0aGlzLmVxKG90aGVyKSkgcmV0dXJuIDA7XG4gICAgICB2YXIgdGhpc05lZyA9IHRoaXMuaXNOZWdhdGl2ZSgpLFxuICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcbiAgICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZykgcmV0dXJuIC0xO1xuICAgICAgaWYgKCF0aGlzTmVnICYmIG90aGVyTmVnKSByZXR1cm4gMTtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNpZ24gYml0cyBhcmUgdGhlIHNhbWVcbiAgICAgIGlmICghdGhpcy51bnNpZ25lZCkgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XG4gICAgICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcbiAgICAgIHJldHVybiBvdGhlci5oaWdoID4+PiAwID4gdGhpcy5oaWdoID4+PiAwIHx8XG4gICAgICAgIChvdGhlci5oaWdoID09PSB0aGlzLmhpZ2ggJiYgb3RoZXIubG93ID4+PiAwID4gdGhpcy5sb3cgPj4+IDApXG4gICAgICAgID8gLTFcbiAgICAgICAgOiAxO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb21wYXJlfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcbiAgICAgKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xuXG4gICAgLyoqXG4gICAgICogTmVnYXRlcyB0aGlzIExvbmcncyB2YWx1ZS5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpIHJldHVybiBNSU5fVkFMVUU7XG4gICAgICByZXR1cm4gdGhpcy5ub3QoKS5hZGQoT05FKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTmVnYXRlcyB0aGlzIExvbmcncyB2YWx1ZS4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNuZWdhdGV9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5uZWcgPSBMb25nUHJvdG90eXBlLm5lZ2F0ZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGFkZGVuZCBBZGRlbmRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFN1bVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkge1xuICAgICAgaWYgKCFpc0xvbmcoYWRkZW5kKSkgYWRkZW5kID0gZnJvbVZhbHVlKGFkZGVuZCk7XG5cbiAgICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxuXG4gICAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweGZmZmY7XG4gICAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xuICAgICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuICAgICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcbiAgICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4ZmZmZjtcbiAgICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjtcbiAgICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhmZmZmO1xuICAgICAgdmFyIGM0OCA9IDAsXG4gICAgICAgIGMzMiA9IDAsXG4gICAgICAgIGMxNiA9IDAsXG4gICAgICAgIGMwMCA9IDA7XG4gICAgICBjMDAgKz0gYTAwICsgYjAwO1xuICAgICAgYzE2ICs9IGMwMCA+Pj4gMTY7XG4gICAgICBjMDAgJj0gMHhmZmZmO1xuICAgICAgYzE2ICs9IGExNiArIGIxNjtcbiAgICAgIGMzMiArPSBjMTYgPj4+IDE2O1xuICAgICAgYzE2ICY9IDB4ZmZmZjtcbiAgICAgIGMzMiArPSBhMzIgKyBiMzI7XG4gICAgICBjNDggKz0gYzMyID4+PiAxNjtcbiAgICAgIGMzMiAmPSAweGZmZmY7XG4gICAgICBjNDggKz0gYTQ4ICsgYjQ4O1xuICAgICAgYzQ4ICY9IDB4ZmZmZjtcbiAgICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXG4gICAgICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KHN1YnRyYWhlbmQpIHtcbiAgICAgIGlmICghaXNMb25nKHN1YnRyYWhlbmQpKSBzdWJ0cmFoZW5kID0gZnJvbVZhbHVlKHN1YnRyYWhlbmQpO1xuICAgICAgcmV0dXJuIHRoaXMuYWRkKHN1YnRyYWhlbmQubmVnKCkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXG4gICAgICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zdWIgPSBMb25nUHJvdG90eXBlLnN1YnRyYWN0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiBtdWx0aXBseShtdWx0aXBsaWVyKSB7XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSkgbXVsdGlwbGllciA9IGZyb21WYWx1ZShtdWx0aXBsaWVyKTtcblxuICAgICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gICAgICBpZiAod2FzbSkge1xuICAgICAgICB2YXIgbG93ID0gd2FzbVtcIm11bFwiXShcbiAgICAgICAgICB0aGlzLmxvdyxcbiAgICAgICAgICB0aGlzLmhpZ2gsXG4gICAgICAgICAgbXVsdGlwbGllci5sb3csXG4gICAgICAgICAgbXVsdGlwbGllci5oaWdoLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtW1wiZ2V0X2hpZ2hcIl0oKSwgdGhpcy51bnNpZ25lZCk7XG4gICAgICB9XG4gICAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSByZXR1cm4gbXVsdGlwbGllci5pc09kZCgpID8gTUlOX1ZBTFVFIDogWkVSTztcbiAgICAgIGlmIChtdWx0aXBsaWVyLmVxKE1JTl9WQUxVRSkpIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xuICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xuICAgICAgICBlbHNlIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyKS5uZWcoKTtcbiAgICAgIH0gZWxzZSBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpXG4gICAgICAgIHJldHVybiB0aGlzLm11bChtdWx0aXBsaWVyLm5lZygpKS5uZWcoKTtcblxuICAgICAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxuICAgICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSlcbiAgICAgICAgcmV0dXJuIGZyb21OdW1iZXIoXG4gICAgICAgICAgdGhpcy50b051bWJlcigpICogbXVsdGlwbGllci50b051bWJlcigpLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG5cbiAgICAgIC8vIERpdmlkZSBlYWNoIGxvbmcgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBhZGQgdXAgNHg0IHByb2R1Y3RzLlxuICAgICAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cblxuICAgICAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XG4gICAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhmZmZmO1xuICAgICAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcbiAgICAgIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4ZmZmZjtcbiAgICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xuICAgICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4ZmZmZjtcbiAgICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XG4gICAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweGZmZmY7XG4gICAgICB2YXIgYzQ4ID0gMCxcbiAgICAgICAgYzMyID0gMCxcbiAgICAgICAgYzE2ID0gMCxcbiAgICAgICAgYzAwID0gMDtcbiAgICAgIGMwMCArPSBhMDAgKiBiMDA7XG4gICAgICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgICAgIGMwMCAmPSAweGZmZmY7XG4gICAgICBjMTYgKz0gYTE2ICogYjAwO1xuICAgICAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gICAgICBjMTYgJj0gMHhmZmZmO1xuICAgICAgYzE2ICs9IGEwMCAqIGIxNjtcbiAgICAgIGMzMiArPSBjMTYgPj4+IDE2O1xuICAgICAgYzE2ICY9IDB4ZmZmZjtcbiAgICAgIGMzMiArPSBhMzIgKiBiMDA7XG4gICAgICBjNDggKz0gYzMyID4+PiAxNjtcbiAgICAgIGMzMiAmPSAweGZmZmY7XG4gICAgICBjMzIgKz0gYTE2ICogYjE2O1xuICAgICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gICAgICBjMzIgJj0gMHhmZmZmO1xuICAgICAgYzMyICs9IGEwMCAqIGIzMjtcbiAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xuICAgICAgYzMyICY9IDB4ZmZmZjtcbiAgICAgIGM0OCArPSBhNDggKiBiMDAgKyBhMzIgKiBiMTYgKyBhMTYgKiBiMzIgKyBhMDAgKiBiNDg7XG4gICAgICBjNDggJj0gMHhmZmZmO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI211bHRpcGx5fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFByb2R1Y3RcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm11bCA9IExvbmdQcm90b3R5cGUubXVsdGlwbHk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoZSByZXN1bHQgaXMgc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyBzaWduZWQgb3JcbiAgICAgKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiBkaXZpZGUoZGl2aXNvcikge1xuICAgICAgaWYgKCFpc0xvbmcoZGl2aXNvcikpIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG4gICAgICBpZiAoZGl2aXNvci5pc1plcm8oKSkgdGhyb3cgRXJyb3IoXCJkaXZpc2lvbiBieSB6ZXJvXCIpO1xuXG4gICAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgICAgIGlmICh3YXNtKSB7XG4gICAgICAgIC8vIGd1YXJkIGFnYWluc3Qgc2lnbmVkIGRpdmlzaW9uIG92ZXJmbG93OiB0aGUgbGFyZ2VzdFxuICAgICAgICAvLyBuZWdhdGl2ZSBudW1iZXIgLyAtMSB3b3VsZCBiZSAxIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0XG4gICAgICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy51bnNpZ25lZCAmJlxuICAgICAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcbiAgICAgICAgICBkaXZpc29yLmxvdyA9PT0gLTEgJiZcbiAgICAgICAgICBkaXZpc29yLmhpZ2ggPT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGJlIGNvbnNpc3RlbnQgd2l0aCBub24td2FzbSBjb2RlIHBhdGhcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtW1wiZGl2X3VcIl0gOiB3YXNtW1wiZGl2X3NcIl0pKFxuICAgICAgICAgIHRoaXMubG93LFxuICAgICAgICAgIHRoaXMuaGlnaCxcbiAgICAgICAgICBkaXZpc29yLmxvdyxcbiAgICAgICAgICBkaXZpc29yLmhpZ2gsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgIHZhciBhcHByb3gsIHJlbSwgcmVzO1xuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBvbmx5IHJlbGV2YW50IGZvciBzaWduZWQgbG9uZ3MgYW5kIGlzIGRlcml2ZWQgZnJvbSB0aGVcbiAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXG4gICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAvLyByZWNhbGwgdGhhdCAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRVxuICAgICAgICAgIGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE9ORTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgfG90aGVyfCA+PSAyLCBzbyB8dGhpcy9vdGhlcnwgPCB8TUlOX1ZBTFVFfC5cbiAgICAgICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpO1xuICAgICAgICAgICAgYXBwcm94ID0gaGFsZlRoaXMuZGl2KGRpdmlzb3IpLnNobCgxKTtcbiAgICAgICAgICAgIGlmIChhcHByb3guZXEoWkVSTykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpO1xuICAgICAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvcikubmVnKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLmRpdihkaXZpc29yLm5lZygpKS5uZWcoKTtcbiAgICAgICAgcmVzID0gWkVSTztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBhbGdvcml0aG0gYmVsb3cgaGFzIG5vdCBiZWVuIG1hZGUgZm9yIHVuc2lnbmVkIGxvbmdzLiBJdCdzIHRoZXJlZm9yZVxuICAgICAgICAvLyByZXF1aXJlZCB0byB0YWtlIHNwZWNpYWwgY2FyZSBvZiB0aGUgTVNCIHByaW9yIHRvIHJ1bm5pbmcgaXQuXG4gICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZCkgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpO1xuICAgICAgICBpZiAoZGl2aXNvci5ndCh0aGlzKSkgcmV0dXJuIFVaRVJPO1xuICAgICAgICBpZiAoZGl2aXNvci5ndCh0aGlzLnNocnUoMSkpKVxuICAgICAgICAgIC8vIDE1ID4+PiAxID0gNyA7IHdpdGggZGl2aXNvciA9IDggOyB0cnVlXG4gICAgICAgICAgcmV0dXJuIFVPTkU7XG4gICAgICAgIHJlcyA9IFVaRVJPO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXBlYXQgdGhlIGZvbGxvd2luZyB1bnRpbCB0aGUgcmVtYWluZGVyIGlzIGxlc3MgdGhhbiBvdGhlcjogIGZpbmQgYVxuICAgICAgLy8gZmxvYXRpbmctcG9pbnQgdGhhdCBhcHByb3hpbWF0ZXMgcmVtYWluZGVyIC8gb3RoZXIgKmZyb20gYmVsb3cqLCBhZGQgdGhpc1xuICAgICAgLy8gaW50byB0aGUgcmVzdWx0LCBhbmQgc3VidHJhY3QgaXQgZnJvbSB0aGUgcmVtYWluZGVyLiAgSXQgaXMgY3JpdGljYWwgdGhhdFxuICAgICAgLy8gdGhlIGFwcHJveGltYXRlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVhbCB2YWx1ZSBzbyB0aGF0IHRoZVxuICAgICAgLy8gcmVtYWluZGVyIG5ldmVyIGJlY29tZXMgbmVnYXRpdmUuXG4gICAgICByZW0gPSB0aGlzO1xuICAgICAgd2hpbGUgKHJlbS5ndGUoZGl2aXNvcikpIHtcbiAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxuICAgICAgICAvLyBzbWFsbGVyIHRoYW4gdGhlIGFjdHVhbCB2YWx1ZS5cbiAgICAgICAgYXBwcm94ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihyZW0udG9OdW1iZXIoKSAvIGRpdmlzb3IudG9OdW1iZXIoKSkpO1xuXG4gICAgICAgIC8vIFdlIHdpbGwgdHdlYWsgdGhlIGFwcHJveGltYXRlIHJlc3VsdCBieSBjaGFuZ2luZyBpdCBpbiB0aGUgNDgtdGggZGlnaXQgb3JcbiAgICAgICAgLy8gdGhlIHNtYWxsZXN0IG5vbi1mcmFjdGlvbmFsIGRpZ2l0LCB3aGljaGV2ZXIgaXMgbGFyZ2VyLlxuICAgICAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxuICAgICAgICAgIGRlbHRhID0gbG9nMiA8PSA0OCA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXG4gICAgICAgICAgLy8gRGVjcmVhc2UgdGhlIGFwcHJveGltYXRpb24gdW50aWwgaXQgaXMgc21hbGxlciB0aGFuIHRoZSByZW1haW5kZXIuICBOb3RlXG4gICAgICAgICAgLy8gdGhhdCBpZiBpdCBpcyB0b28gbGFyZ2UsIHRoZSBwcm9kdWN0IG92ZXJmbG93cyBhbmQgaXMgbmVnYXRpdmUuXG4gICAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLFxuICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XG4gICAgICAgIHdoaWxlIChhcHByb3hSZW0uaXNOZWdhdGl2ZSgpIHx8IGFwcHJveFJlbS5ndChyZW0pKSB7XG4gICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xuICAgICAgICAgIGFwcHJveFJlcyA9IGZyb21OdW1iZXIoYXBwcm94LCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5zd2VyIGNhbid0IGJlIHplcm8uLi4gYW5kIGFjdHVhbGx5LCB6ZXJvIHdvdWxkIGNhdXNlXG4gICAgICAgIC8vIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB3ZSB3b3VsZCBtYWtlIG5vIHByb2dyZXNzLlxuICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKSBhcHByb3hSZXMgPSBPTkU7XG4gICAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcbiAgICAgICAgcmVtID0gcmVtLnN1YihhcHByb3hSZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2RpdmlkZX0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZGl2ID0gTG9uZ1Byb3RvdHlwZS5kaXZpZGU7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7XG4gICAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcblxuICAgICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gICAgICBpZiAod2FzbSkge1xuICAgICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtW1wicmVtX3VcIl0gOiB3YXNtW1wicmVtX3NcIl0pKFxuICAgICAgICAgIHRoaXMubG93LFxuICAgICAgICAgIHRoaXMuaGlnaCxcbiAgICAgICAgICBkaXZpc29yLmxvdyxcbiAgICAgICAgICBkaXZpc29yLmhpZ2gsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN1Yih0aGlzLmRpdihkaXZpc29yKS5tdWwoZGl2aXNvcikpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5tb2QgPSBMb25nUHJvdG90eXBlLm1vZHVsbztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI21vZHVsb30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBOT1Qgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XG4gICAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb3VudCBsZWFkaW5nIHplcm9zIG9mIHRoaXMgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jb3VudExlYWRpbmdaZXJvcyA9IGZ1bmN0aW9uIGNvdW50TGVhZGluZ1plcm9zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCA/IE1hdGguY2x6MzIodGhpcy5oaWdoKSA6IE1hdGguY2x6MzIodGhpcy5sb3cpICsgMzI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY291bnQgbGVhZGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudExlYWRpbmdaZXJvc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IW51bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNseiA9IExvbmdQcm90b3R5cGUuY291bnRMZWFkaW5nWmVyb3M7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvdW50IHRyYWlsaW5nIHplcm9zIG9mIHRoaXMgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jb3VudFRyYWlsaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudFRyYWlsaW5nWmVyb3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3cgPyBjdHozMih0aGlzLmxvdykgOiBjdHozMih0aGlzLmhpZ2gpICsgMzI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY291bnRUcmFpbGluZ1plcm9zfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshbnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY3R6ID0gTG9uZ1Byb3RvdHlwZS5jb3VudFRyYWlsaW5nWmVyb3M7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB0aGlzLmxvdyAmIG90aGVyLmxvdyxcbiAgICAgICAgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvcihvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHRoaXMubG93IHwgb3RoZXIubG93LFxuICAgICAgICB0aGlzLmhpZ2ggfCBvdGhlci5oaWdoLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBYT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgZ2l2ZW4gb25lLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdGhpcy5sb3cgXiBvdGhlci5sb3csXG4gICAgICAgIHRoaXMuaGlnaCBeIG90aGVyLmhpZ2gsXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgdGhpcy5sb3cgPDwgbnVtQml0cyxcbiAgICAgICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiAoMzIgLSBudW1CaXRzKSksXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIGVsc2UgcmV0dXJuIGZyb21CaXRzKDAsIHRoaXMubG93IDw8IChudW1CaXRzIC0gMzIpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdExlZnR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0KG51bUJpdHMpIHtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgICAgICB0aGlzLmhpZ2ggPj4gbnVtQml0cyxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgdGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLFxuICAgICAgICAgIHRoaXMuaGlnaCA+PSAwID8gMCA6IC0xLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNociA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkID0gZnVuY3Rpb24gc2hpZnRSaWdodFVuc2lnbmVkKG51bUJpdHMpIHtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGlmIChudW1CaXRzIDwgMzIpXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICAodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksXG4gICAgICAgICAgdGhpcy5oaWdoID4+PiBudW1CaXRzLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCA+Pj4gKG51bUJpdHMgLSAzMiksIDAsIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaHJ1ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaHJfdSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucm90YXRlTGVmdCA9IGZ1bmN0aW9uIHJvdGF0ZUxlZnQobnVtQml0cykge1xuICAgICAgdmFyIGI7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgICAgICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+IGIpLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBudW1CaXRzIC09IDMyO1xuICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjcm90YXRlTGVmdH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucm90bCA9IExvbmdQcm90b3R5cGUucm90YXRlTGVmdDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RhdGVSaWdodCA9IGZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KG51bUJpdHMpIHtcbiAgICAgIHZhciBiO1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gICAgICBpZiAobnVtQml0cyA8IDMyKSB7XG4gICAgICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICAodGhpcy5oaWdoIDw8IGIpIHwgKHRoaXMubG93ID4+PiBudW1CaXRzKSxcbiAgICAgICAgICAodGhpcy5sb3cgPDwgYikgfCAodGhpcy5oaWdoID4+PiBudW1CaXRzKSxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbnVtQml0cyAtPSAzMjtcbiAgICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICh0aGlzLmxvdyA8PCBiKSB8ICh0aGlzLmhpZ2ggPj4+IG51bUJpdHMpLFxuICAgICAgICAodGhpcy5oaWdoIDw8IGIpIHwgKHRoaXMubG93ID4+PiBudW1CaXRzKSxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVSaWdodH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucm90ciA9IExvbmdQcm90b3R5cGUucm90YXRlUmlnaHQ7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gc2lnbmVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNpZ25lZCBsb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdywgdGhpcy5oaWdoLCBmYWxzZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byB1bnNpZ25lZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFMb25nfSBVbnNpZ25lZCBsb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcbiAgICAgIGlmICh0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdywgdGhpcy5oaWdoLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMobGUpIHtcbiAgICAgIHJldHVybiBsZSA/IHRoaXMudG9CeXRlc0xFKCkgOiB0aGlzLnRvQnl0ZXNCRSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzTEUgPSBmdW5jdGlvbiB0b0J5dGVzTEUoKSB7XG4gICAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXG4gICAgICAgIGxvID0gdGhpcy5sb3c7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBsbyAmIDB4ZmYsXG4gICAgICAgIChsbyA+Pj4gOCkgJiAweGZmLFxuICAgICAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIGxvID4+PiAyNCxcbiAgICAgICAgaGkgJiAweGZmLFxuICAgICAgICAoaGkgPj4+IDgpICYgMHhmZixcbiAgICAgICAgKGhpID4+PiAxNikgJiAweGZmLFxuICAgICAgICBoaSA+Pj4gMjQsXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzQkUgPSBmdW5jdGlvbiB0b0J5dGVzQkUoKSB7XG4gICAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXG4gICAgICAgIGxvID0gdGhpcy5sb3c7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBoaSA+Pj4gMjQsXG4gICAgICAgIChoaSA+Pj4gMTYpICYgMHhmZixcbiAgICAgICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgICAgIGhpICYgMHhmZixcbiAgICAgICAgbG8gPj4+IDI0LFxuICAgICAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIChsbyA+Pj4gOCkgJiAweGZmLFxuICAgICAgICBsbyAmIDB4ZmYsXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCeXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAgICAgKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUJ5dGVzID0gZnVuY3Rpb24gZnJvbUJ5dGVzKGJ5dGVzLCB1bnNpZ25lZCwgbGUpIHtcbiAgICAgIHJldHVybiBsZVxuICAgICAgICA/IExvbmcuZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKVxuICAgICAgICA6IExvbmcuZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21CeXRlc0xFID0gZnVuY3Rpb24gZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IExvbmcoXG4gICAgICAgIGJ5dGVzWzBdIHwgKGJ5dGVzWzFdIDw8IDgpIHwgKGJ5dGVzWzJdIDw8IDE2KSB8IChieXRlc1szXSA8PCAyNCksXG4gICAgICAgIGJ5dGVzWzRdIHwgKGJ5dGVzWzVdIDw8IDgpIHwgKGJ5dGVzWzZdIDw8IDE2KSB8IChieXRlc1s3XSA8PCAyNCksXG4gICAgICAgIHVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21CeXRlc0JFID0gZnVuY3Rpb24gZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IExvbmcoXG4gICAgICAgIChieXRlc1s0XSA8PCAyNCkgfCAoYnl0ZXNbNV0gPDwgMTYpIHwgKGJ5dGVzWzZdIDw8IDgpIHwgYnl0ZXNbN10sXG4gICAgICAgIChieXRlc1swXSA8PCAyNCkgfCAoYnl0ZXNbMV0gPDwgMTYpIHwgKGJ5dGVzWzJdIDw8IDgpIHwgYnl0ZXNbM10sXG4gICAgICAgIHVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gU3VwcG9ydCBjb252ZXJzaW9uIHRvL2Zyb20gQmlnSW50IHdoZXJlIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8qKlxuICAgICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBiaWcgaW50ZWdlci5cbiAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBiaWcgaW50ZWdlciB2YWx1ZVxuICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICAgKi9cbiAgICAgIExvbmcuZnJvbUJpZ0ludCA9IGZ1bmN0aW9uIGZyb21CaWdJbnQodmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICAgIHZhciBsb3dCaXRzID0gTnVtYmVyKEJpZ0ludC5hc0ludE4oMzIsIHZhbHVlKSk7XG4gICAgICAgIHZhciBoaWdoQml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSA+PiBCaWdJbnQoMzIpKSk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xuICAgICAgfTtcblxuICAgICAgLy8gT3ZlcnJpZGVcbiAgICAgIExvbmcuZnJvbVZhbHVlID0gZnVuY3Rpb24gZnJvbVZhbHVlV2l0aEJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIExvbmcuZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpO1xuICAgICAgICByZXR1cm4gZnJvbVZhbHVlKHZhbHVlLCB1bnNpZ25lZCk7XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGl0cyBiaWcgaW50ZWdlciByZXByZXNlbnRhdGlvbi5cbiAgICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgICAqIEByZXR1cm5zIHtiaWdpbnR9XG4gICAgICAgKi9cbiAgICAgIExvbmdQcm90b3R5cGUudG9CaWdJbnQgPSBmdW5jdGlvbiB0b0JpZ0ludCgpIHtcbiAgICAgICAgdmFyIGxvd0JpZ0ludCA9IEJpZ0ludCh0aGlzLmxvdyA+Pj4gMCk7XG4gICAgICAgIHZhciBoaWdoQmlnSW50ID0gQmlnSW50KHRoaXMudW5zaWduZWQgPyB0aGlzLmhpZ2ggPj4+IDAgOiB0aGlzLmhpZ2gpO1xuICAgICAgICByZXR1cm4gKGhpZ2hCaWdJbnQgPDwgQmlnSW50KDMyKSkgfCBsb3dCaWdJbnQ7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgX2RlZmF1bHQgPSAoX2V4cG9ydHMuZGVmYXVsdCA9IExvbmcpO1xuICB9LFxuKTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIlxuY29uc3QgYXBpID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL3dvcmtlci1pbnRlcmZhY2UuanMnKTtcbmV4cG9ydHMuYXBpID0gYXBpO1xuXG5jb25zdCB7IG92ZXJyaWRlR2xvYmFscyB9ID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL2dsb2JhbC1vdmVycmlkZXMuanMnKTtcbm92ZXJyaWRlR2xvYmFscygpO1xuXG5leHBvcnRzLnByZWxvYWRNb2R1bGVzID0gZnVuY3Rpb24gcHJlbG9hZE1vZHVsZXMoKSB7XG5cbn1cblxuZXhwb3J0cy5pbXBvcnRXb3JrZmxvd3MgPSBmdW5jdGlvbiBpbXBvcnRXb3JrZmxvd3MoKSB7XG4gIHJldHVybiByZXF1aXJlKC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL2FwcHMvdHJhbnNjb2RlL3NyYy93b3JrZmxvd3MudHNcIik7XG59XG5cbmV4cG9ydHMuaW1wb3J0SW50ZXJjZXB0b3JzID0gZnVuY3Rpb24gaW1wb3J0SW50ZXJjZXB0b3JzKCkge1xuICByZXR1cm4gW1xuICAgIFxuICBdO1xufVxuIl0sIm5hbWVzIjpbImV4ZWN1dGVBY3Rpdml0eSIsImdldEFjdGl2aXRpZXMiLCJUYXNrUXVldWVUcmFuc2NvZGUiLCJBcHBsaWNhdGlvbkZhaWx1cmUiLCJ0cmFuc2NvZGVNZWRpYSIsInRhc2siLCJ1cGRhdGVUYXNrU3RhdHVzQWN0aXZpdHkiLCJ1cGRhdGVBc3NldFN0YXR1c0FjdGl2aXR5IiwiZ2V0QXNzZXRBY3Rpdml0eSIsImdldE1lZGlhSW5mb0FjdGl2aXR5IiwidHJhbnNjb2RlVmlkZW9BY3Rpdml0eSIsInRyYW5zY29kZUF1ZGlvQWN0aXZpdHkiLCJ0cmFuc2NvZGVJbWFnZUFjdGl2aXR5IiwiZ2VuZXJhdGVTcHJpdGVBY3Rpdml0eSIsInVwZGF0ZUFzc2V0TWVkaWFBY3Rpdml0eSIsImdldFRyYW5zY29kZVdvcmtlclF1ZXVlQWN0aXZpdHkiLCJkb3dubG9hZE1lZGlhVG9UbXBBY3Rpdml0eSIsImNsZWFudXBUbXBEaXJBY3Rpdml0eSIsInRha2VTY3JlZW5zaG90c0FjdGl2aXR5Iiwib3ZlcmxheUFubm90YXRpb25zQWN0aXZpdHkiLCJjcmVhdGVFbWJlZGRpbmdUYXNrSWZFbmFibGVkQWN0aXZpdHkiLCJ0bXBEaXIiLCJ3b3JrZXJRdWV1ZSIsImFzc2V0IiwidGFza0lkIiwiaWQiLCJzdGF0dXMiLCJwYXlsb2FkIiwic2NyZWVuc2hvdCIsImFzc2V0SWQiLCJrZXkiLCJzdG9yYWdlS2V5IiwiY3JlYXRlIiwibWVzc2FnZSIsIm5vblJldHJ5YWJsZSIsInNjcmVlbnNob3RzIiwiYXNzZXRLZXkiLCJzdGFydCIsImVuZCIsImNvdW50IiwiY29tbWVudFRpbWVzdGFtcCIsImFubm90YXRpb25zIiwib3V0cHV0IiwiaW1hZ2VBbm5vdGF0aW9uIiwibWVkaWEiLCJtZWRpYUluZm8iLCJpbWFnZVRyYW5zY29kZXMiLCJsZW5ndGgiLCJrZXlXaXRoT3ZlcmxheSIsImRvd25sb2FkIiwiZmlsZVBhdGgiLCJzcGVjIiwidHJhbnNjb2RlIiwibWVkaWFUeXBlIiwib3JpZ2luYWwiLCJkb3dubG9hZFVybCIsImZpbGVzaXplSW5CeXRlcyIsImNvZGVjIiwibWltZVR5cGUiLCJtZXRhZGF0YSIsInN0YXJ0c1dpdGgiLCJ2aWRlb1Jlc29sdXRpb25zIiwiZ2V0VGFyZ2V0VmlkZW9SZXNvbHV0aW9ucyIsInZpZGVvU3RyYXRlZ3kiLCJvcmlnaW5hbFdpZHRoIiwib3JpZ2luYWxIZWlnaHQiLCJyZXMiLCJ3aWR0aCIsImhlaWdodCIsInJlc29sdXRpb25Ub0RpbWVuc2lvbnMiLCJ2aWRlb1NwZWMiLCJyZXNvbHV0aW9uIiwidmlkZW9UcmFuc2NvZGUiLCJkdXJhdGlvbiIsIm9yaWdpbmFsRnBzIiwiZnJhbWVSYXRlIiwidmlkZW9QcmV2aWV3IiwidmlkZW9UcmFuc2NvZGVzIiwicHVzaCIsImlzUmF3IiwiaXNBdWRpbyIsImF1ZGlvVHJhbnNjb2RlIiwiaXNJbWFnZSIsImlzUHNkIiwiaXNNaW1lUHNkIiwiaW1hZ2VTcGVjIiwicXVhbGl0eSIsImZvcm1hdCIsImltYWdlVHJhbnNjb2RlIiwidGh1bWJuYWlsIiwidGh1bWJUcmFuc2NvZGUiLCJzcHJpdGUiLCJwb3N0ZXIiLCJsYXN0U2xhc2hJbmRleCIsImxhc3RJbmRleE9mIiwiYXNzZXREaXIiLCJzdWJzdHJpbmciLCJzcHJpdGVTcGVjIiwiZnJhbWVzIiwidGlsZVgiLCJ0aWxlWSIsInBvc3RlclNwZWMiLCJzcHJpdGVSZXN1bHQiLCJ0ZWFtSWQiLCJwcm9qZWN0SWQiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJFcnJvciIsIlN0cmluZyIsImNsZWFudXBFcnIiLCJSRVNPTFVUSU9OX0xPTkdfU0lERVMiLCJ0YXJnZXRMb25nU2lkZSIsIk1hdGgiLCJyb3VuZCIsIlRBUkdFVF9SRVNPTFVUSU9OUyIsIm5hbWUiLCJsb25nU2lkZSIsImdldEJlc3RNYXRjaFJlc29sdXRpb24iLCJyYXdMb25nU2lkZSIsIm1heCIsImxvd2VyIiwiZmlsdGVyIiwiciIsInNvcnQiLCJhIiwiYiIsInN0cmF0ZWd5IiwicmVzb2x1dGlvbnMiLCJub3JtYWxpemVkU3RyYXRlZ3kiLCJzdHJhdFN0ciIsImJlc3RNYXRjaCIsImJlc3RNYXRjaEluZGV4IiwiZmluZEluZGV4IiwiaSIsInRyYW5zY29kZVdvcmtmbG93Iiwid2YiLCJUYXNrUXVldWVBZ2VudCIsImlzVGVtcG9yYWwiLCJ3b3JrZmxvd0luZm8iLCJnbG9iYWxPYmoiLCJnbG9iYWxUaGlzIiwibG9jYWxBY3Rpdml0aWVzUHJveHkiLCJhY3RzIiwiX19sb2NhbEFjdGl2aXRpZXMiLCJzbGVlcCIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiYmFzZVByb3h5IiwicHJveHlBY3Rpdml0aWVzIiwic3RhcnRUb0Nsb3NlVGltZW91dCIsInJldHJ5IiwibWF4aW11bUF0dGVtcHRzIiwiaW5pdGlhbEludGVydmFsIiwiUHJveHkiLCJnZXQiLCJ0YXJnZXQiLCJwcm9wIiwid3JhcHBlZCIsImFyZ3MiLCJfYWN0aXZpdHlOYW1lIiwiUmVmbGVjdCIsImdldExvZ2dlciIsImRlYnVnIiwib2JqIiwibXNnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJfX2xvY2FsTG9nZ2VyIiwicXVldWUiLCJhY3Rpdml0eUZ1bmMiLCJhY3Rpdml0eU5hbWUiLCJsb2dnZXIiLCJyZXN1bHQiLCJoYW5kbGUiLCJ0YXNrUXVldWUiLCJnZXRDb25jdXJyZW5jeUxpbWl0IiwiZW52VmFyIiwiZGVmYXVsdFZhbHVlIiwicGFyc2VkIiwicGFyc2VJbnQiLCJpc05hTiJdLCJzb3VyY2VSb290IjoiIn0=`,sourceMap:`deprecated: this is no longer in use
|
|
11533
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBNEM7WUFDNUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFDaEIsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUNoQixZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ2hCLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FDakIsQ0FBQztZQUNGLElBQUksR0FBRyxHQUFHLEVBQUU7Z0JBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMs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QUFDakI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztB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QTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdELEU7Ozs7Ozs7Ozs7OztBQ0xBLFlBQVksbUJBQU8sQ0FBQywrSkFBOEM7QUFDbEUsV0FBVzs7QUFFWCxRQUFRLGtCQUFrQixFQUFFLG1CQUFPLENBQUMsK0pBQThDO0FBQ2xGOztBQUVBLHNCQUFzQjs7QUFFdEI7O0FBRUEsdUJBQXVCO0FBQ3ZCLFNBQVMsbUJBQU8sNEJBQTRCLDRFQUFpRTtBQUM3Rzs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1jYW5jZWxsYXRpb24tZGV0YWlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9hY3Rpdml0eS1vcHRpb25zLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnRpbnVlLWFzLW5ldy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvZGF0YS1jb252ZXJ0ZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvY29udmVydGVyL2ZhaWx1cmUtY29udmVydGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2NvbnZlcnRlci9wYXlsb2FkLWNvbnZlcnRlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9jb252ZXJ0ZXIvdHlwZXMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvZGVwcmVjYXRlZC10aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2VuY29kaW5nLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2Vycm9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9mYWlsdXJlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVyY2VwdG9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9pbnRlcmZhY2VzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvaW50ZXJuYWwtd29ya2Zsb3cvb2JqZWN0cy1oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL2xvZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9tZXRyaWNzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ByaW9yaXR5LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3Jlc2VydmVkLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3JldHJ5LXBvbGljeS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy9zZWFyY2gtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy90aW1lLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3R5cGUtaGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy91c2VyLW1ldGFkYXRhLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3ZlcnNpb25pbmctaW50ZW50LWVudW0udHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvdmVyc2lvbmluZy1pbnRlbnQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2VyLWRlcGxveW1lbnRzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbytjb21tb25AMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby9jb21tb24vc3JjL3dvcmtmbG93LWRlZmluaXRpb24tb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rY29tbW9uQDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vY29tbW9uL3NyYy93b3JrZmxvdy1oYW5kbGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK2NvbW1vbkAxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL2NvbW1vbi9zcmMvd29ya2Zsb3ctb3B0aW9ucy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvYWxlYS50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvY2FuY2VsbGF0aW9uLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9lcnJvcnMudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ZsYWdzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9nbG9iYWwtYXR0cmlidXRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvZ2xvYmFsLW92ZXJyaWRlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvc3JjL2ludGVyY2VwdG9ycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJmYWNlcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvaW50ZXJuYWxzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9sb2dzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9tZXRyaWNzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9uZXh1cy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvcGtnLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy9zaW5rcy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvc3RhY2staGVscGVycy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdHJpZ2dlci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vQHRlbXBvcmFsaW8rd29ya2Zsb3dAMS4xNy4yL25vZGVfbW9kdWxlcy9AdGVtcG9yYWxpby93b3JrZmxvdy9zcmMvdXBkYXRlLXNjb3BlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZXItaW50ZXJmYWNlLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9AdGVtcG9yYWxpbyt3b3JrZmxvd0AxLjE3LjIvbm9kZV9tb2R1bGVzL0B0ZW1wb3JhbGlvL3dvcmtmbG93L3NyYy93b3JrZmxvdy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2NvbW1vbi9oYW5kbGVyLWVycm9yLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL2luZGV4LnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvY29tbW9uL29wZXJhdGlvbi1lcnJvci50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2hhbmRsZXIvaW5kZXgudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL29wZXJhdGlvbi1oYW5kbGVyLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvaGFuZGxlci9zZXJ2aWNlLWhhbmRsZXIudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9oYW5kbGVyL3N0YXJ0LW9wZXJhdGlvbi1yZXN1bHQudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL25leHVzLXJwY0AwLjAuMi9ub2RlX21vZHVsZXMvbmV4dXMtcnBjL3NyYy9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL29iamVjdC11dGlscy50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9oZWxwZXJzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9uZXh1cy1ycGNAMC4wLjIvbm9kZV9tb2R1bGVzL25leHVzLXJwYy9zcmMvc2VydmljZS9pbmRleC50cyIsIi9ob21lL3J1bm5lci93b3JrL3NodW1haS9zaHVtYWkvbm9kZV9tb2R1bGVzLy5idW4vbmV4dXMtcnBjQDAuMC4yL25vZGVfbW9kdWxlcy9uZXh1cy1ycGMvc3JjL3NlcnZpY2Uvc2VydmljZS1kZWZpbml0aW9uLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9hcHBzL3RyYW5zY29kZS9zcmMvd29ya2Zsb3dzLnRzIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9wYWNrYWdlcy90cmFuc2NvZGUvc3JjL3dvcmtmbG93cy90cmFuc2NvZGUudHMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL3BhY2thZ2VzL3dvcmtmbG93LWNvcmUvc3JjL3dvcmtmbG93LXV0aWxzLnRzIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX2ZhaWx1cmVfY29udmVydGVyIiwiaWdub3JlZHwvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL0B0ZW1wb3JhbGlvK3dvcmtmbG93QDEuMTcuMi9ub2RlX21vZHVsZXMvQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGlifF9fdGVtcG9yYWxfY3VzdG9tX3BheWxvYWRfY29udmVydGVyIiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9ub2RlX21vZHVsZXMvLmJ1bi9tc0AzLjAuMC1jYW5hcnkuMS9ub2RlX21vZHVsZXMvbXMvZGlzdC9pbmRleC5janMiLCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL25vZGVfbW9kdWxlcy8uYnVuL2xvbmdANS4zLjIvbm9kZV9tb2R1bGVzL2xvbmcvdW1kL2luZGV4LmpzIiwid2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0IiwiL2hvbWUvcnVubmVyL3dvcmsvc2h1bWFpL3NodW1haS9hcHBzL3RyYW5zY29kZS9zcmMvd29ya2Zsb3dzLWF1dG9nZW5lcmF0ZWQtZW50cnlwb2ludC5janMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHNIb2xkZXIge1xuICBkZXRhaWxzPzogQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMge1xuICBub3RGb3VuZD86IGJvb2xlYW47XG4gIGNhbmNlbFJlcXVlc3RlZD86IGJvb2xlYW47XG4gIHBhdXNlZD86IGJvb2xlYW47XG4gIHRpbWVkT3V0PzogYm9vbGVhbjtcbiAgd29ya2VyU2h1dGRvd24/OiBib29sZWFuO1xuICByZXNldD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIHJlYXNvbnMgZm9yIHRoZSBhY3Rpdml0eSdzIGNhbmNlbGxhdGlvbi4gQ2FuY2VsbGF0aW9uIGRldGFpbHMgYXJlIHNldCBvbmNlIGFuZCBkbyBub3QgY2hhbmdlIG9uY2Ugc2V0LlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIHtcbiAgcmVhZG9ubHkgbm90Rm91bmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNhbmNlbFJlcXVlc3RlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGF1c2VkOiBib29sZWFuO1xuICByZWFkb25seSB0aW1lZE91dDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgd29ya2VyU2h1dGRvd246IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlc2V0OiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHNPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm5vdEZvdW5kID0gb3B0aW9ucy5ub3RGb3VuZCA/PyBmYWxzZTtcbiAgICB0aGlzLmNhbmNlbFJlcXVlc3RlZCA9IG9wdGlvbnMuY2FuY2VsUmVxdWVzdGVkID8/IGZhbHNlO1xuICAgIHRoaXMucGF1c2VkID0gb3B0aW9ucy5wYXVzZWQgPz8gZmFsc2U7XG4gICAgdGhpcy50aW1lZE91dCA9IG9wdGlvbnMudGltZWRPdXQgPz8gZmFsc2U7XG4gICAgdGhpcy53b3JrZXJTaHV0ZG93biA9IG9wdGlvbnMud29ya2VyU2h1dGRvd24gPz8gZmFsc2U7XG4gICAgdGhpcy5yZXNldCA9IG9wdGlvbnMucmVzZXQgPz8gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgZnJvbVByb3RvKFxuICAgIHByb3RvOiBjb3Jlc2RrLmFjdGl2aXR5X3Rhc2suSUFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB8IG51bGwgfCB1bmRlZmluZWRcbiAgKTogQWN0aXZpdHlDYW5jZWxsYXRpb25EZXRhaWxzIHtcbiAgICBpZiAocHJvdG8gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBY3Rpdml0eUNhbmNlbGxhdGlvbkRldGFpbHMoe1xuICAgICAgbm90Rm91bmQ6IHByb3RvLmlzTm90Rm91bmQgPz8gZmFsc2UsXG4gICAgICBjYW5jZWxSZXF1ZXN0ZWQ6IHByb3RvLmlzQ2FuY2VsbGVkID8/IGZhbHNlLFxuICAgICAgcGF1c2VkOiBwcm90by5pc1BhdXNlZCA/PyBmYWxzZSxcbiAgICAgIHRpbWVkT3V0OiBwcm90by5pc1RpbWVkT3V0ID8/IGZhbHNlLFxuICAgICAgd29ya2VyU2h1dGRvd246IHByb3RvLmlzV29ya2VyU2h1dGRvd24gPz8gZmFsc2UsXG4gICAgICByZXNldDogcHJvdG8uaXNSZXNldCA/PyBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBSZXRyeVBvbGljeSB9IGZyb20gJy4vcmV0cnktcG9saWN5JztcbmltcG9ydCB0eXBlIHsgRHVyYXRpb24gfSBmcm9tICcuL3RpbWUnO1xuaW1wb3J0IHR5cGUgeyBWZXJzaW9uaW5nSW50ZW50IH0gZnJvbSAnLi92ZXJzaW9uaW5nLWludGVudCc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBQcmlvcml0eSB9IGZyb20gJy4vcHJpb3JpdHknO1xuXG4vLyBOb3RlOiBUaGUgdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgYXJlIGhlcmUgZm9yIGxlZ2FjeSByZWFzb25zLiBUaGV5IHNob3VsZCBoYXZlIGJlZW4gZGVmaW5lZFxuLy8gaW4gdGhlICd3b3JrZmxvdycgcGFja2FnZSwgaW5zdGVhZCBvZiAnY29tbW9uJy4gVGhleSBhcmUgbm93IHJlZXhwb3J0ZWQgZnJvbSB0aGUgJ3dvcmtmbG93J1xuLy8gcGFja2FnZSwgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gaW1wb3J0IHRoZW0sIGJ1dCB3ZSB1bmZvcnR1bmF0ZWx5IGNhbid0IHJlbW92ZSB0aGVtIGZyb21cbi8vIGhlcmUgYXMgdGhhdCB3b3VsZCBiZSBhIGJyZWFraW5nIGNoYW5nZS5cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gKiAtIHdoZW4gc2hvdWxkIHRoZSBBY3Rpdml0eSBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgdG8gV29ya2Zsb3cgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGVcbiAqICAgQWN0aXZpdHkgY2FsbCdzIHByb21pc2UgZmFpbCB3aXRoIGFuIGBBY3Rpdml0eUZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBjYW5jZWxsYXRpb24gYmVpbmdcbiAqIGV4dGVybmFsbHkgcmVxdWVzdGVkIG9uIHRoZSBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZVxuICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAqIGFsd2F5cyByZXN1bHRzIGluIGNhbmNlbGxhdGlvbiBvZiBpdHMgb3V0c3RhbmRpbmcgQWN0aXZpdHkgZXhlY3V0aW9ucywgcmVnYXJkbGVzcyBvZiB0aG9zZVxuICogQWN0aXZpdGllcycge0BsaW5rIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZX0gc2V0dGluZ3MuXG4gKlxuICogQGRlZmF1bHQgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRFxuICovXG4vLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlPcHRpb25zLmNhbmNlbGxhdGlvblR5cGVgIGFuZFxuLy8gICAgICAgICAgICAgIGBMb2NhbEFjdGl2aXR5T3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlYCBmaWVsZHMgbGF0ZXIgaW4gdGhpcyBmaWxlLlxuZXhwb3J0IGNvbnN0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBwcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHRvIHRoZSBBY3Rpdml0eSwgYW5kIGltbWVkaWF0ZWx5IHJlcG9ydCBjYW5jZWxsYXRpb25cbiAgICogdG8gdGhlIGNhbGxlci5cbiAgICovXG4gIEFCQU5ET046ICdBQkFORE9OJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eSwgeWV0IF9pbW1lZGlhdGVseV8gcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLCBpLmUuIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHNlcnZlciB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb25cbiAgICogcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgcHJvdmlkZXMgbm8gZ3VhcmFudGVlLCBmcm9tIHRoZSBXb3JrZmxvdy1zaWRlLCB0aGF0IHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCB3aWxsIGFjdHVhbGx5IGJlIGRlbGl2ZXJlZCB0byB0aGUgQWN0aXZpdHk7IGUuZy4gdGhlIGNhbGxpbmcgV29ya2Zsb3dcbiAgICogbWF5IGV4aXQgYmVmb3JlIHRoZSBkZWxpdmVyeSBpcyBjb21wbGV0ZWQsIG9yIHRoZSBBY3Rpdml0eSBtYXkgY29tcGxldGUgKGVpdGhlciBzdWNjZXNzZnVsbHlcbiAgICogb3IgdW5jZXNzZnVsbHkpIGJlZm9yZSB0aGUgY2FuY2VsbGF0aW9uIGlzIGRlbGl2ZXJlZCwgcmVzdWx0aW5nIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZVxuICAgKiB3b3JrZmxvdyB0aGlua3MgdGhlIGFjdGl2aXR5IHdhcyBjYW5jZWxsZWQsIGJ1dCB0aGUgYWN0aXZpdHkgYWN0dWFsbHkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICpcbiAgICogVG8gZW5zdXJlIHRoYXQgdGhlIFdvcmtmbG93IGlzIHByb3Blcmx5IGluZm9ybWVkIG9mIHRoZSBBY3Rpdml0eSdzIGZpbmFsIHN0YXRlIChpLmUuIGVpdGhlclxuICAgKiBjb21wbGV0aW9uIG9yIGNhbmNlbGxhdGlvbiksIHVzZSB7QGxpbmsgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEfS5cbiAgICovXG4gIFRSWV9DQU5DRUw6ICdUUllfQ0FOQ0VMJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eSwgYW5kIHdhaXQgZm9yIHRoZSBhY3Rpdml0eVxuICAgKiB0byBjb21wbGV0ZSBpdHMgZXhlY3V0aW9uIChlaXRoZXIgc3VjY2Vzc2Z1bGx5LCB1bmNlc3NmdWxseSwgb3IgYXMgY2FuY2VsbGVkKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBBY3Rpdml0eSBtdXN0IGhlYXJ0YmVhdCB0byByZWNlaXZlIGEgY2FuY2VsbGF0aW9uIG5vdGlmaWNhdGlvbi4gVGhpcyBjYW4gYmxvY2tcbiAgICogdGhlIFdvcmtmbG93J3MgY2FuY2VsbGF0aW9uIGZvciBhIGxvbmcgdGltZSBpZiB0aGUgQWN0aXZpdHkgZG9lc24ndCBoZWFydGJlYXQgb3IgY2hvb3NlcyB0b1xuICAgKiBpZ25vcmUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUgPSAodHlwZW9mIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLCBkZWNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5BY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLkFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAwLFxuICAgIFtBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXTogMSxcbiAgICBbQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlLkFCQU5ET05dOiAyLFxuICB9IGFzIGNvbnN0LFxuICAnJ1xuKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBub24tbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvbiBpbnNpZGUgYSB3b3JrZmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIHRvIHVzZSBmb3IgdHJhY2tpbmcgdGhlIGFjdGl2aXR5IGluIFdvcmtmbG93IGhpc3RvcnkuXG4gICAqIFRoZSBgYWN0aXZpdHlJZGAgY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZSBhY3Rpdml0eSBmdW5jdGlvbi5cbiAgICogRG9lcyBub3QgbmVlZCB0byBiZSB1bmlxdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGFuIGluY3JlbWVudGFsIHNlcXVlbmNlIG51bWJlclxuICAgKi9cbiAgYWN0aXZpdHlJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBjdXJyZW50IHdvcmtlciB0YXNrIHF1ZXVlXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhlYXJ0YmVhdCBpbnRlcnZhbC4gQWN0aXZpdHkgbXVzdCBoZWFydGJlYXQgYmVmb3JlIHRoaXMgaW50ZXJ2YWwgcGFzc2VzIGFmdGVyIGEgbGFzdCBoZWFydGJlYXQgb3IgYWN0aXZpdHkgc3RhcnQuXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgaGVhcnRiZWF0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBSZXRyeVBvbGljeSB0aGF0IGRlZmluZSBob3cgYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgc2VydmVyLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLiBUbyBlbnN1cmUgemVybyByZXRyaWVzLCBzZXQgbWF4aW11bSBhdHRlbXB0cyB0byAxLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIG9mIGEgc2luZ2xlIEFjdGl2aXR5IGV4ZWN1dGlvbiBhdHRlbXB0LiBOb3RlIHRoYXQgdGhlIFRlbXBvcmFsIFNlcnZlciBkb2Vzbid0IGRldGVjdCBXb3JrZXIgcHJvY2Vzc1xuICAgKiBmYWlsdXJlcyBkaXJlY3RseTogaW5zdGVhZCwgaXQgcmVsaWVzIG9uIHRoaXMgdGltZW91dCB0byBkZXRlY3QgdGhhdCBhbiBBY3Rpdml0eSBkaWRuJ3QgY29tcGxldGUgb24gdGltZS4gVGhlcmVmb3JlLCB0aGlzXG4gICAqIHRpbWVvdXQgc2hvdWxkIGJlIGFzIHNob3J0IGFzIHRoZSBsb25nZXN0IHBvc3NpYmxlIGV4ZWN1dGlvbiBvZiB0aGUgQWN0aXZpdHkgYm9keS4gUG90ZW50aWFsbHkgbG9uZy1ydW5uaW5nXG4gICAqIEFjdGl2aXRpZXMgbXVzdCBzcGVjaWZ5IHtAbGluayBoZWFydGJlYXRUaW1lb3V0fSBhbmQgY2FsbCB7QGxpbmsgYWN0aXZpdHkuQ29udGV4dC5oZWFydGJlYXR9IHBlcmlvZGljYWxseSBmb3JcbiAgICogdGltZWx5IGZhaWx1cmUgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBFaXRoZXIgdGhpcyBvcHRpb24gb3Ige0BsaW5rIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXR9IGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgb3IgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc3RhcnRUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaW1lIHRoYXQgdGhlIEFjdGl2aXR5IFRhc2sgY2FuIHN0YXkgaW4gdGhlIFRhc2sgUXVldWUgYmVmb3JlIGl0IGlzIHBpY2tlZCB1cCBieSBhIFdvcmtlci4gRG8gbm90IHNwZWNpZnkgdGhpcyB0aW1lb3V0IHVubGVzcyB1c2luZyBob3N0LXNwZWNpZmljIFRhc2sgUXVldWVzIGZvciBBY3Rpdml0eSBUYXNrcyBhcmUgYmVpbmcgdXNlZCBmb3Igcm91dGluZy5cbiAgICogYHNjaGVkdWxlVG9TdGFydFRpbWVvdXRgIGlzIGFsd2F5cyBub24tcmV0cnlhYmxlLiBSZXRyeWluZyBhZnRlciB0aGlzIHRpbWVvdXQgZG9lc24ndCBtYWtlIHNlbnNlIGFzIGl0IHdvdWxkIGp1c3QgcHV0IHRoZSBBY3Rpdml0eSBUYXNrIGJhY2sgaW50byB0aGUgc2FtZSBUYXNrIFF1ZXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgc2NoZWR1bGVUb0Nsb3NlVGltZW91dGAgb3IgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUb3RhbCB0aW1lIHRoYXQgYSB3b3JrZmxvdyBpcyB3aWxsaW5nIHRvIHdhaXQgZm9yIHRoZSBBY3Rpdml0eSB0byBjb21wbGV0ZS5cbiAgICogYHNjaGVkdWxlVG9DbG9zZVRpbWVvdXRgIGxpbWl0cyB0aGUgdG90YWwgdGltZSBvZiBhbiBBY3Rpdml0eSdzIGV4ZWN1dGlvbiBpbmNsdWRpbmcgcmV0cmllcyAodXNlIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSB0byBsaW1pdCB0aGUgdGltZSBvZiBhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIGN1cnJlbnQgV29ya2Zsb3cgdG8gdGhlIEFjdGl2aXR5OyBhbmRcbiAgICogLSB3aGVuIHNob3VsZCB0aGUgQWN0aXZpdHkgY2FuY2VsbGF0aW9uIGJlIHJlcG9ydGVkIHRvIFdvcmtmbG93IChpLmUuIGF0IHdoaWNoIG1vbWVudCBzaG91bGQgdGhlXG4gICAqICAgQWN0aXZpdHkgY2FsbCdzIHByb21pc2UgZmFpbCB3aXRoIGFuIGBBY3Rpdml0eUZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gY2FuY2VsbGF0aW9uIGJlaW5nXG4gICAqIGV4dGVybmFsbHkgcmVxdWVzdGVkIG9uIHRoZSBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZVxuICAgKiBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZSBBY3Rpdml0eSBjYWxsIHdhcyBtYWRlLiBUZXJtaW5hdGlvbiBvZiBhIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKiBhbHdheXMgcmVzdWx0cyBpbiBjYW5jZWxsYXRpb24gb2YgaXRzIG91dHN0YW5kaW5nIEFjdGl2aXR5IGV4ZWN1dGlvbnMsIHJlZ2FyZGxlc3Mgb2YgdGhvc2VcbiAgICogQWN0aXZpdGllcycge0BsaW5rIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZX0gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgY2FuY2VsbGF0aW9uVHlwZT86IEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogRWFnZXIgZGlzcGF0Y2ggaXMgYW4gb3B0aW1pemF0aW9uIHRoYXQgaW1wcm92ZXMgdGhlIHRocm91Z2hwdXQgYW5kIGxvYWQgb24gdGhlIHNlcnZlciBmb3Igc2NoZWR1bGluZyBBY3Rpdml0aWVzLlxuICAgKiBXaGVuIHVzZWQsIHRoZSBzZXJ2ZXIgd2lsbCBoYW5kIG91dCBBY3Rpdml0eSB0YXNrcyBiYWNrIHRvIHRoZSBXb3JrZXIgd2hlbiBpdCBjb21wbGV0ZXMgYSBXb3JrZmxvdyB0YXNrLlxuICAgKiBJdCBpcyBhdmFpbGFibGUgZnJvbSBzZXJ2ZXIgdmVyc2lvbiAxLjE3IGJlaGluZCB0aGUgYHN5c3RlbS5lbmFibGVBY3Rpdml0eUVhZ2VyRXhlY3V0aW9uYCBmZWF0dXJlIGZsYWcuXG4gICAqXG4gICAqIEVhZ2VyIGRpc3BhdGNoIHdpbGwgb25seSBiZSB1c2VkIGlmIGBhbGxvd0VhZ2VyRGlzcGF0Y2hgIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSBhbmQge0BsaW5rIHRhc2tRdWV1ZX0gaXMgZWl0aGVyXG4gICAqIG9taXR0ZWQgb3IgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgV29ya2Zsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGFsbG93RWFnZXJEaXNwYXRjaD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgQWN0aXZpdHkgc2hvdWxkIHJ1biBvbiBhXG4gICAqIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgYWN0aXZpdHlcbiAgICovXG4gIHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9jYWwgYWN0aXZpdHkgaW52b2NhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsQWN0aXZpdHlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJldHJ5UG9saWN5IHRoYXQgZGVmaW5lcyBob3cgYW4gYWN0aXZpdHkgaXMgcmV0cmllZCBpbiBjYXNlIG9mIGZhaWx1cmUuIElmIHRoaXMgaXMgbm90IHNldCwgdGhlbiB0aGUgU0RLLWRlZmluZWQgZGVmYXVsdCBhY3Rpdml0eSByZXRyeSBwb2xpY3kgd2lsbCBiZSB1c2VkLlxuICAgKiBOb3RlIHRoYXQgbG9jYWwgYWN0aXZpdGllcyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2UsIGV2ZW4gaWYgbWF4aW11bSBhdHRlbXB0cyBpcyBzZXQgdG8gMSBkdWUgdG8gV29ya2Zsb3cgdGFzayByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBpcyBhbGxvd2VkIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIHRhc2sgaXMgZGlzcGF0Y2hlZC4gVGhpc1xuICAgKiB0aW1lb3V0IGlzIGFsd2F5cyByZXRyeWFibGUuXG4gICAqXG4gICAqIEVpdGhlciB0aGlzIG9wdGlvbiBvciB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gaXMgcmVxdWlyZWQuXG4gICAqIElmIHNldCwgdGhpcyBtdXN0IGJlIDw9IHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGNsYW1wZWQgZG93bi5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpbWl0cyB0aW1lIHRoZSBsb2NhbCBhY3Rpdml0eSBjYW4gaWRsZSBpbnRlcm5hbGx5IGJlZm9yZSBiZWluZyBleGVjdXRlZC4gVGhhdCBjYW4gaGFwcGVuIGlmXG4gICAqIHRoZSB3b3JrZXIgaXMgY3VycmVudGx5IGF0IG1heCBjb25jdXJyZW50IGxvY2FsIGFjdGl2aXR5IGV4ZWN1dGlvbnMuIFRoaXMgdGltZW91dCBpcyBhbHdheXNcbiAgICogbm9uIHJldHJ5YWJsZSBhcyBhbGwgYSByZXRyeSB3b3VsZCBhY2hpZXZlIGlzIHRvIHB1dCBpdCBiYWNrIGludG8gdGhlIHNhbWUgcXVldWUuIERlZmF1bHRzXG4gICAqIHRvIHtAbGluayBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fSBpZiBub3Qgc3BlY2lmaWVkIGFuZCB0aGF0IGlzIHNldC4gTXVzdCBiZSA8PVxuICAgKiB7QGxpbmsgc2NoZWR1bGVUb0Nsb3NlVGltZW91dH0gd2hlbiBzZXQsIG90aGVyd2lzZSwgaXQgd2lsbCBiZSBjbGFtcGVkIGRvd24uXG4gICAqXG4gICAqIEBkZWZhdWx0IHVubGltaXRlZFxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHNjaGVkdWxlVG9TdGFydFRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGhvdyBsb25nIHRoZSBjYWxsZXIgaXMgd2lsbGluZyB0byB3YWl0IGZvciBsb2NhbCBhY3Rpdml0eSBjb21wbGV0aW9uLiBMaW1pdHMgaG93XG4gICAqIGxvbmcgcmV0cmllcyB3aWxsIGJlIGF0dGVtcHRlZC5cbiAgICpcbiAgICogRWl0aGVyIHRoaXMgb3B0aW9uIG9yIHtAbGluayBzdGFydFRvQ2xvc2VUaW1lb3V0fSBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5saW1pdGVkXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWN0aXZpdHkgaXMgcmV0cnlpbmcgYW5kIGJhY2tvZmYgd291bGQgZXhjZWVkIHRoaXMgdmFsdWUsIGEgc2VydmVyIHNpZGUgdGltZXIgd2lsbCBiZSBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0IGF0dGVtcHQuXG4gICAqIE90aGVyd2lzZSwgYmFja29mZiB3aWxsIGhhcHBlbiBpbnRlcm5hbGx5IGluIHRoZSBTREsuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEgbWludXRlXG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKiovXG4gIGxvY2FsUmV0cnlUaHJlc2hvbGQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lczpcbiAgICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIHRoZSBBY3Rpdml0eTsgYW5kXG4gICAqIC0gd2hlbiBzaG91bGQgdGhlIEFjdGl2aXR5IGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCB0byBXb3JrZmxvdyAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZVxuICAgKiAgIEFjdGl2aXR5IGNhbGwncyBwcm9taXNlIGZhaWwgd2l0aCBhbiBgQWN0aXZpdHlGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGNhbmNlbGxhdGlvbiBiZWluZ1xuICAgKiBleHRlcm5hbGx5IHJlcXVlc3RlZCBvbiB0aGUgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGVcbiAgICogYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGUgQWN0aXZpdHkgY2FsbCB3YXMgbWFkZS4gVGVybWluYXRpb24gb2YgYSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICogYWx3YXlzIHJlc3VsdHMgaW4gY2FuY2VsbGF0aW9uIG9mIGl0cyBvdXRzdGFuZGluZyBBY3Rpdml0eSBleGVjdXRpb25zLCByZWdhcmRsZXNzIG9mIHRob3NlXG4gICAqIEFjdGl2aXRpZXMnIHtAbGluayBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGV9IHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlYCBlbnVtXG4gIGNhbmNlbGxhdGlvblR5cGU/OiBBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEEgZml4ZWQsIHNpbmdsZS1saW5lIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN1bW1hcnk/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuLyoqXG4gKiBSZWFzb24ocykgd2h5IGNvbnRpbnVlIGFzIG5ldyBpcyBzdWdnZXN0ZWQuIENhbiBwb3RlbnRpYWxseSBiZSBtdWx0aXBsZSByZWFzb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgTWF5IGJlIHJlbW92ZWQgb3IgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gPSB7XG4gIEhJU1RPUllfU0laRV9UT09fTEFSR0U6ICdISVNUT1JZX1NJWkVfVE9PX0xBUkdFJyxcbiAgVE9PX01BTllfSElTVE9SWV9FVkVOVFM6ICdUT09fTUFOWV9ISVNUT1JZX0VWRU5UUycsXG4gIFRPT19NQU5ZX1VQREFURVM6ICdUT09fTUFOWV9VUERBVEVTJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbiA9ICh0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24pW2tleW9mIHR5cGVvZiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLCBkZWNvZGVTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbl0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uLFxuICB0eXBlb2YgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24sXG4gICdTVUdHRVNUX0NPTlRJTlVFX0FTX05FV19SRUFTT05fJ1xuPihcbiAge1xuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5ISVNUT1JZX1NJWkVfVE9PX0xBUkdFXTogMSxcbiAgICBbU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24uVE9PX01BTllfSElTVE9SWV9FVkVOVFNdOiAyLFxuICAgIFtTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbi5UT09fTUFOWV9VUERBVEVTXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1NVR0dFU1RfQ09OVElOVUVfQVNfTkVXX1JFQVNPTl8nXG4pO1xuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uc0Zyb21Qcm90byhcbiAgcmVhc29uczogdGVtcG9yYWwuYXBpLmVudW1zLnYxLlN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlYXNvbnMgPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZXM6IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlYXNvbnMpIHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24ocik7XG4gICAgaWYgKGRlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzLnB1c2goZGVjb2RlZCk7XG4gICAgfVxuICB9XG4gIGlmIChyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBGYWlsdXJlQ29udmVydGVyIH0gZnJvbSAnLi9mYWlsdXJlLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciB9IGZyb20gJy4vZmFpbHVyZS1jb252ZXJ0ZXInO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29kZWMgfSBmcm9tICcuL3BheWxvYWQtY29kZWMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBkZWZhdWx0UGF5bG9hZENvbnZlcnRlciB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFdoZW4geW91ciBkYXRhIChhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMpIGlzIHNlbnQgb3ZlciB0aGUgd2lyZSBhbmQgc3RvcmVkIGJ5IFRlbXBvcmFsIFNlcnZlciwgaXQgaXMgZW5jb2RlZCBpblxuICogYmluYXJ5IGluIGEge0BsaW5rIFBheWxvYWR9IFByb3RvYnVmIG1lc3NhZ2UuXG4gKlxuICogVGhlIGRlZmF1bHQgYERhdGFDb252ZXJ0ZXJgIHN1cHBvcnRzIGB1bmRlZmluZWRgLCBgVWludDhBcnJheWAsIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgZGF0YSBjb252ZXJ0ZXIgd2lsbCB3b3JrKS4gUHJvdG9idWZzIGFyZSBzdXBwb3J0ZWQgdmlhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGF0YS1jb252ZXJ0ZXJzI3Byb3RvYnVmcyB8IHRoaXMgQVBJfS5cbiAqXG4gKiBVc2UgYSBjdXN0b20gYERhdGFDb252ZXJ0ZXJgIHRvIGNvbnRyb2wgdGhlIGNvbnRlbnRzIG9mIHlvdXIge0BsaW5rIFBheWxvYWR9cy4gQ29tbW9uIHJlYXNvbnMgZm9yIHVzaW5nIGEgY3VzdG9tXG4gKiBgRGF0YUNvbnZlcnRlcmAgYXJlOlxuICogLSBDb252ZXJ0aW5nIHZhbHVlcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGBEYXRhQ29udmVydGVyYCAoZm9yIGV4YW1wbGUsIGBKU09OLnN0cmluZ2lmeSgpYCBkb2Vzbid0XG4gKiAgIGhhbmRsZSBgQmlnSW50YHMsIHNvIGlmIHlvdSB3YW50IHRvIHJldHVybiBgeyB0b3RhbDogMTAwMG4gfWAgZnJvbSBhIFdvcmtmbG93LCBTaWduYWwsIG9yIEFjdGl2aXR5LCB5b3UgbmVlZCB5b3VyXG4gKiAgIG93biBgRGF0YUNvbnZlcnRlcmApLlxuICogLSBFbmNyeXB0aW5nIHZhbHVlcyB0aGF0IG1heSBjb250YWluIHByaXZhdGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgZG9uJ3Qgd2FudCBzdG9yZWQgaW4gcGxhaW50ZXh0IGluIFRlbXBvcmFsIFNlcnZlcidzXG4gKiAgIGRhdGFiYXNlLlxuICogLSBDb21wcmVzc2luZyB2YWx1ZXMgdG8gcmVkdWNlIGRpc2sgb3IgbmV0d29yayB1c2FnZS5cbiAqXG4gKiBUbyB1c2UgeW91ciBjdXN0b20gYERhdGFDb252ZXJ0ZXJgLCBwcm92aWRlIGl0IHRvIHRoZSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9LCB7QGxpbmsgV29ya2VyfSwgYW5kXG4gKiB7QGxpbmsgYnVuZGxlV29ya2Zsb3dDb2RlfSAoaWYgeW91IHVzZSBpdCk6XG4gKiAtIGBuZXcgV29ya2Zsb3dDbGllbnQoeyAuLi4sIGRhdGFDb252ZXJ0ZXIgfSlgXG4gKiAtIGBXb3JrZXIuY3JlYXRlKHsgLi4uLCBkYXRhQ29udmVydGVyIH0pYFxuICogLSBgYnVuZGxlV29ya2Zsb3dDb2RlKHsgLi4uLCBwYXlsb2FkQ29udmVydGVyUGF0aCB9KWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYHBheWxvYWRDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYHBheWxvYWRDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgcGF5bG9hZENvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgYSBmaWxlIHRoYXQgaGFzIGEgYGZhaWx1cmVDb252ZXJ0ZXJgIG5hbWVkIGV4cG9ydC5cbiAgICogYGZhaWx1cmVDb252ZXJ0ZXJgIHNob3VsZCBiZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHtAbGluayBGYWlsdXJlQ29udmVydGVyfS5cbiAgICogSWYgbm8gcGF0aCBpcyBwcm92aWRlZCwge0BsaW5rIGRlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpcyB1c2VkLlxuICAgKi9cbiAgZmFpbHVyZUNvbnZlcnRlclBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkQ29kZWN9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUGF5bG9hZHMgYXJlIGVuY29kZWQgaW4gdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBhbmQgZGVjb2RlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhXG4gICAqIGNvbXByZXNzaW9uIGNvZGVjIGFuZCBhbiBlbmNyeXB0aW9uIGNvZGVjLCB0aGVuIHlvdSB3YW50IGRhdGEgdG8gYmUgZW5jb2RlZCB3aXRoIHRoZSBjb21wcmVzc2lvbiBjb2RlYyBmaXJzdCwgc29cbiAgICogeW91J2QgZG8gYHBheWxvYWRDb2RlY3M6IFtjb21wcmVzc2lvbkNvZGVjLCBlbmNyeXB0aW9uQ29kZWNdYC5cbiAgICovXG4gIHBheWxvYWRDb2RlY3M/OiBQYXlsb2FkQ29kZWNbXTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBEYXRhQ29udmVydGVyfSB0aGF0IGhhcyBiZWVuIGxvYWRlZCB2aWEge0BsaW5rIGxvYWREYXRhQ29udmVydGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkZWREYXRhQ29udmVydGVyIHtcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcjtcbiAgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlcjtcbiAgcGF5bG9hZENvZGVjczogUGF5bG9hZENvZGVjW107XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEZhaWx1cmVDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy5cbiAqXG4gKiBFcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFyZSBzZXJpemFsaXplZCBhcyBwbGFpbiB0ZXh0LlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXI6IEZhaWx1cmVDb252ZXJ0ZXIgPSBuZXcgRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBBIFwibG9hZGVkXCIgZGF0YSBjb252ZXJ0ZXIgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IHNldCBvZiBmYWlsdXJlIGFuZCBwYXlsb2FkIGNvbnZlcnRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0RGF0YUNvbnZlcnRlcjogTG9hZGVkRGF0YUNvbnZlcnRlciA9IHtcbiAgcGF5bG9hZENvbnZlcnRlcjogZGVmYXVsdFBheWxvYWRDb252ZXJ0ZXIsXG4gIGZhaWx1cmVDb252ZXJ0ZXI6IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyLFxuICBwYXlsb2FkQ29kZWNzOiBbXSxcbn07XG4iLCJpbXBvcnQgKiBhcyBuZXh1cyBmcm9tICduZXh1cy1ycGMnO1xuaW1wb3J0IExvbmcgZnJvbSAnbG9uZyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQcm90b0ZhaWx1cmUgfSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7XG4gIEFjdGl2aXR5RmFpbHVyZSxcbiAgQXBwbGljYXRpb25GYWlsdXJlLFxuICBDYW5jZWxsZWRGYWlsdXJlLFxuICBDaGlsZFdvcmtmbG93RmFpbHVyZSxcbiAgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnksXG4gIGRlY29kZVJldHJ5U3RhdGUsXG4gIGRlY29kZVRpbWVvdXRUeXBlLFxuICBlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSxcbiAgZW5jb2RlUmV0cnlTdGF0ZSxcbiAgZW5jb2RlVGltZW91dFR5cGUsXG4gIEZBSUxVUkVfU09VUkNFLFxuICBOZXh1c09wZXJhdGlvbkZhaWx1cmUsXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICcuLi9mYWlsdXJlJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHsgaXNFcnJvciB9IGZyb20gJy4uL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9UcyB9IGZyb20gJy4uL3RpbWUnO1xuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBhcnJheUZyb21QYXlsb2FkcywgZnJvbVBheWxvYWRzQXRJbmRleCwgdG9QYXlsb2FkcyB9IGZyb20gJy4vcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vLyBDYW4ndCBpbXBvcnQgcHJvdG8gZW51bXMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgdXNlIHRoaXMgaGVscGVyIHR5cGUgYW5kIGVudW0gY29udmVydGVyIGluc3RlYWQuXG5jb25zdCBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgPSB7XG4gIFJFVFJZQUJMRTogJ1JFVFJZQUJMRScsXG4gIE5PTl9SRVRSWUFCTEU6ICdOT05fUkVUUllBQkxFJyxcbn0gYXMgY29uc3Q7XG50eXBlIE5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciA9XG4gICh0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yKVtrZXlvZiB0eXBlb2YgTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXTtcblxuY29uc3QgW2VuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvciwgZGVjb2RlTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLFxuICB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLk5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcixcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gIHR5cGVvZiBOZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IsXG4gICdORVhVU19IQU5ETEVSX0VSUk9SX1JFVFJZX0JFSEFWSU9SXydcbj4oXG4gIHtcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgICBbTmV4dXNIYW5kbGVyRXJyb3JSZXRyeUJlaGF2aW9yLlJFVFJZQUJMRV06IDEsXG4gICAgW05leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvci5OT05fUkVUUllBQkxFXTogMixcbiAgfSBhcyBjb25zdCxcbiAgJ05FWFVTX0hBTkRMRVJfRVJST1JfUkVUUllfQkVIQVZJT1JfJ1xuKTtcblxuZnVuY3Rpb24gY29tYmluZVJlZ0V4cCguLi5yZWdleHBzOiBSZWdFeHBbXSk6IFJlZ0V4cCB7XG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cHMubWFwKCh4KSA9PiBgKD86JHt4LnNvdXJjZX0pYCkuam9pbignfCcpKTtcbn1cblxuLyoqXG4gKiBTdGFjayB0cmFjZXMgd2lsbCBiZSBjdXRvZmYgd2hlbiBvbiBvZiB0aGVzZSBwYXR0ZXJucyBpcyBtYXRjaGVkXG4gKi9cbmNvbnN0IENVVE9GRl9TVEFDS19QQVRURVJOUyA9IGNvbWJpbmVSZWdFeHAoXG4gIC8qKiBBY3Rpdml0eSBleGVjdXRpb24gKi9cbiAgL1xccythdCAoQWN0aXZpdHlcXC4pP2V4ZWN1dGUgXFwoLipbXFxcXC9dd29ya2VyW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWFjdGl2aXR5XFwuW2p0XXM6XFxkKzpcXGQrXFwpLyxcbiAgLyoqIE5leHVzIGV4ZWN1dGlvbiAqL1xuICAvXFxzK2F0KCBhc3luYyk/IChOZXh1c0hhbmRsZXJcXC4pP2ludm9rZVVzZXJDb2RlIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11uZXh1c1tcXFxcL11pbmRleFxcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBXb3JrZmxvdyBhY3RpdmF0aW9uIChpbmJvdW5kIGhhbmRsZXJzIG9ubHkpICovXG4gIC9cXHMrYXQoIGFzeW5jKT8gKEFjdGl2YXRvclxcLik/KHN0YXJ0V29ya2Zsb3d8cXVlcnlXb3JrZmxvd3xzaWduYWxXb3JrZmxvd3x1cGRhdGV8dmFsaWRhdGVVcGRhdGUpTmV4dEhhbmRsZXIgXFwoLipcXC5banRdczpcXGQrOlxcZCtcXCkvLFxuICAvKiogV29ya2Zsb3cgcnVuIGFueXRoaW5nIGluIGNvbnRleHQgKi9cbiAgL1xccythdCAoU2NyaXB0XFwuKT9ydW5JbkNvbnRleHQgXFwobmF0aXZlfHVua25vd258KD86KD86bm9kZTp2bXx2bVxcLmpzKTpcXGQrOlxcZCspXFwpL1xuKTtcblxuLyoqXG4gKiBBbnkgc3RhY2sgdHJhY2UgZnJhbWVzIHRoYXQgbWF0Y2ggYW55IG9mIHRob3NlIHdpbCBiZSBkb3BwZWQuXG4gKiBUaGUgXCJudWxsLlwiIHByZWZpeCBvbiBzb21lIGNhc2VzIGlzIHRvIGF2b2lkIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDI0MTdcbiAqL1xuY29uc3QgRFJPUFBFRF9TVEFDS19GUkFNRVNfUEFUVEVSTlMgPSBjb21iaW5lUmVnRXhwKFxuICAvKiogSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2hhaW4gaW50ZXJjZXB0b3JzICovXG4gIC9cXHMrYXQgKG51bGxcXC4pP25leHQgXFwoLipbXFxcXC9dY29tbW9uW1xcXFwvXSg/OnNyY3xsaWIpW1xcXFwvXWludGVyY2VwdG9yc1xcLltqdF1zOlxcZCs6XFxkK1xcKS8sXG4gIC8qKiBJbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byByZWN1cnNpdmVseSBjaGFpbiBpbnRlcmNlcHRvcnMgKi9cbiAgL1xccythdCAobnVsbFxcLik/ZXhlY3V0ZU5leHRIYW5kbGVyIFxcKC4qW1xcXFwvXXdvcmtlcltcXFxcL10oPzpzcmN8bGliKVtcXFxcL11hY3Rpdml0eVxcLltqdF1zOlxcZCs6XFxkK1xcKS9cbik7XG5cbi8qKlxuICogQ3V0cyBvdXQgdGhlIGZyYW1ld29yayBwYXJ0IG9mIGEgc3RhY2sgdHJhY2UsIGxlYXZpbmcgb25seSB1c2VyIGNvZGUgZW50cmllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3V0b2ZmU3RhY2tUcmFjZShzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gKHN0YWNrID8/ICcnKS5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBhY2MgPSBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChDVVRPRkZfU1RBQ0tfUEFUVEVSTlMudGVzdChsaW5lKSkgYnJlYWs7XG4gICAgaWYgKCFEUk9QUEVEX1NUQUNLX0ZSQU1FU19QQVRURVJOUy50ZXN0KGxpbmUpKSBhY2MucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gYWNjLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEEgYEZhaWx1cmVDb252ZXJ0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGZyb20gcHJvdG8gYEZhaWx1cmVgIGluc3RhbmNlcyB0byBKUyBgRXJyb3JzYCBhbmQgYmFjay5cbiAqXG4gKiBXZSByZWNvbW1lbmRlZCB1c2luZyB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBpbnN0ZWFkIG9mIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGluIG9yZGVyXG4gKiB0byBtYWludGFpbiBjcm9zcy1sYW5ndWFnZSBGYWlsdXJlIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWlsdXJlQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY2F1Z2h0IGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlLlxuICAgKi9cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIGVycm9yIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYFRlbXBvcmFsRmFpbHVyZWAuXG4gICAqL1xuICBmYWlsdXJlVG9FcnJvcihlcnI6IFByb3RvRmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IEVycm9yO1xufVxuXG4vKipcbiAqIFRoZSBcInNoYXBlXCIgb2YgdGhlIGF0dHJpYnV0ZXMgc2V0IGFzIHRoZSB7QGxpbmsgUHJvdG9GYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzfSBwYXlsb2FkIGluIGNhc2VcbiAqIHtAbGluayBEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzLmVuY29kZUNvbW1vbkF0dHJpYnV0ZXN9IGlzIHNldCB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEVuY29kZWRGYWlsdXJlQXR0cmlidXRlcyB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2tfdHJhY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIERlZmF1bHRGYWlsdXJlQ29udmVydGVyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBlbmNvZGUgZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcyAoZm9yIGVuY3J5cHRpbmcgdGhlc2UgYXR0cmlidXRlcyB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfSkuXG4gICAqL1xuICBlbmNvZGVDb21tb25BdHRyaWJ1dGVzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlZmF1bHQsIGNyb3NzLWxhbmd1YWdlLWNvbXBhdGlibGUgRmFpbHVyZSBjb252ZXJ0ZXIuXG4gKlxuICogQnkgZGVmYXVsdCwgaXQgd2lsbCBsZWF2ZSBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGFzIHBsYWluIHRleHQuIEluIG9yZGVyIHRvIGVuY3J5cHQgdGhlbSwgc2V0XG4gKiBgZW5jb2RlQ29tbW9uQXR0cmlidXRlc2AgdG8gYHRydWVgIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfSB0aGF0IGNhbiBlbmNyeXB0IC9cbiAqIGRlY3J5cHQgUGF5bG9hZHMgaW4geW91ciB7QGxpbmsgV29ya2VyT3B0aW9ucy5kYXRhQ29udmVydGVyIHwgV29ya2VyfSBhbmRcbiAqIHtAbGluayBDbGllbnRPcHRpb25zLmRhdGFDb252ZXJ0ZXIgfCBDbGllbnQgb3B0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RmFpbHVyZUNvbnZlcnRlciBpbXBsZW1lbnRzIEZhaWx1cmVDb252ZXJ0ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogRGVmYXVsdEZhaWx1cmVDb252ZXJ0ZXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBQYXJ0aWFsPERlZmF1bHRGYWlsdXJlQ29udmVydGVyT3B0aW9ucz4pIHtcbiAgICBjb25zdCB7IGVuY29kZUNvbW1vbkF0dHJpYnV0ZXMgfSA9IG9wdGlvbnMgPz8ge307XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgZW5jb2RlQ29tbW9uQXR0cmlidXRlczogZW5jb2RlQ29tbW9uQXR0cmlidXRlcyA/PyBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIHRvIGEgSlMgRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBEb2VzIG5vdCBzZXQgY29tbW9uIHByb3BlcnRpZXMsIHRoYXQgaXMgZG9uZSBpbiB7QGxpbmsgZmFpbHVyZVRvRXJyb3J9LlxuICAgKi9cbiAgZmFpbHVyZVRvRXJyb3JJbm5lcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBFcnJvciB7XG4gICAgaWYgKGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby50eXBlLFxuICAgICAgICBCb29sZWFuKGZhaWx1cmUuYXBwbGljYXRpb25GYWlsdXJlSW5mby5ub25SZXRyeWFibGUpLFxuICAgICAgICBhcnJheUZyb21QYXlsb2FkcyhwYXlsb2FkQ29udmVydGVyLCBmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8uZGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBkZWNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeShmYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8uY2F0ZWdvcnkpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5zZXJ2ZXJGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBCb29sZWFuKGZhaWx1cmUuc2VydmVyRmFpbHVyZUluZm8ubm9uUmV0cnlhYmxlKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBUaW1lb3V0RmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZnJvbVBheWxvYWRzQXRJbmRleChwYXlsb2FkQ29udmVydGVyLCAwLCBmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mby5sYXN0SGVhcnRiZWF0RGV0YWlscz8ucGF5bG9hZHMpLFxuICAgICAgICBkZWNvZGVUaW1lb3V0VHlwZShmYWlsdXJlLnRpbWVvdXRGYWlsdXJlSW5mby50aW1lb3V0VHlwZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnRlcm1pbmF0ZWRGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBUZXJtaW5hdGVkRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLmNhbmNlbGVkRmFpbHVyZUluZm8pIHtcbiAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGVkRmFpbHVyZShcbiAgICAgICAgZmFpbHVyZS5tZXNzYWdlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgYXJyYXlGcm9tUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZmFpbHVyZS5jYW5jZWxlZEZhaWx1cmVJbmZvLmRldGFpbHM/LnBheWxvYWRzKSxcbiAgICAgICAgdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlLnJlc2V0V29ya2Zsb3dGYWlsdXJlSW5mbykge1xuICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkZhaWx1cmUoXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICdSZXNldFdvcmtmbG93JyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGFycmF5RnJvbVBheWxvYWRzKHBheWxvYWRDb252ZXJ0ZXIsIGZhaWx1cmUucmVzZXRXb3JrZmxvd0ZhaWx1cmVJbmZvLmxhc3RIZWFydGJlYXREZXRhaWxzPy5wYXlsb2FkcyksXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5jaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbHVyZUluZm8pIHtcbiAgICAgIGNvbnN0IHsgbmFtZXNwYWNlLCB3b3JrZmxvd1R5cGUsIHdvcmtmbG93RXhlY3V0aW9uLCByZXRyeVN0YXRlIH0gPSBmYWlsdXJlLmNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbztcbiAgICAgIGlmICghKHdvcmtmbG93VHlwZT8ubmFtZSAmJiB3b3JrZmxvd0V4ZWN1dGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhdHRyaWJ1dGVzIG9uIGNoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsdXJlSW5mbycpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBDaGlsZFdvcmtmbG93RmFpbHVyZShcbiAgICAgICAgbmFtZXNwYWNlID8/IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dFeGVjdXRpb24sXG4gICAgICAgIHdvcmtmbG93VHlwZS5uYW1lLFxuICAgICAgICBkZWNvZGVSZXRyeVN0YXRlKHJldHJ5U3RhdGUpLFxuICAgICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mbykge1xuICAgICAgaWYgKCFmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlUeXBlPy5uYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgYWN0aXZpdHlUeXBlPy5uYW1lIG9uIGFjdGl2aXR5RmFpbHVyZUluZm8nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgQWN0aXZpdHlGYWlsdXJlKFxuICAgICAgICBmYWlsdXJlLm1lc3NhZ2UgPz8gdW5kZWZpbmVkLFxuICAgICAgICBmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8uYWN0aXZpdHlUeXBlLm5hbWUsXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5hY3Rpdml0eUlkID8/IHVuZGVmaW5lZCxcbiAgICAgICAgZGVjb2RlUmV0cnlTdGF0ZShmYWlsdXJlLmFjdGl2aXR5RmFpbHVyZUluZm8ucmV0cnlTdGF0ZSksXG4gICAgICAgIGZhaWx1cmUuYWN0aXZpdHlGYWlsdXJlSW5mby5pZGVudGl0eSA/PyB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5uZXh1c0hhbmRsZXJGYWlsdXJlSW5mbykge1xuICAgICAgbGV0IHJldHJ5YWJsZU92ZXJyaWRlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmV0cnlCZWhhdmlvciA9IGRlY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcihmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvLnJldHJ5QmVoYXZpb3IpO1xuICAgICAgc3dpdGNoIChyZXRyeUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgJ1JFVFJZQUJMRSc6XG4gICAgICAgICAgcmV0cnlhYmxlT3ZlcnJpZGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdOT05fUkVUUllBQkxFJzpcbiAgICAgICAgICByZXRyeWFibGVPdmVycmlkZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByYXdFcnJvclR5cGUgPSBmYWlsdXJlLm5leHVzSGFuZGxlckZhaWx1cmVJbmZvLnR5cGUgfHwgJyc7XG4gICAgICBjb25zdCByZXNvbHZlZFR5cGU6IG5leHVzLkhhbmRsZXJFcnJvclR5cGUgPSBPYmplY3QuaGFzT3duKG5leHVzLkhhbmRsZXJFcnJvclR5cGUsIHJhd0Vycm9yVHlwZSlcbiAgICAgICAgPyBuZXh1cy5IYW5kbGVyRXJyb3JUeXBlW3Jhd0Vycm9yVHlwZSBhcyBrZXlvZiB0eXBlb2YgbmV4dXMuSGFuZGxlckVycm9yVHlwZV1cbiAgICAgICAgOiAnVU5LTk9XTic7XG5cbiAgICAgIHJldHVybiBuZXcgbmV4dXMuSGFuZGxlckVycm9yKHJlc29sdmVkVHlwZSwgZmFpbHVyZS5tZXNzYWdlID8/ICdOZXh1cyBoYW5kbGVyIGVycm9yJywge1xuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEZhaWx1cmVUb09wdGlvbmFsRXJyb3IoZmFpbHVyZS5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciksXG4gICAgICAgIHJldHJ5YWJsZU92ZXJyaWRlLFxuICAgICAgICByYXdFcnJvclR5cGUsXG4gICAgICAgIG9yaWdpbmFsRmFpbHVyZTogdGhpcy50ZW1wb3JhbEZhaWx1cmVUb05leHVzRmFpbHVyZShmYWlsdXJlKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvKSB7XG4gICAgICByZXR1cm4gbmV3IE5leHVzT3BlcmF0aW9uRmFpbHVyZShcbiAgICAgICAgLy8gVE9ETyhuZXh1cy9lcnJvcik6IE1heWJlIHNldCBhIGRlZmF1bHQgbWVzc2FnZSBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG4gICAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5zY2hlZHVsZWRFdmVudElkPy50b051bWJlcigpLFxuICAgICAgICAvLyBXZSBhc3N1bWUgdGhlc2Ugd2lsbCBhbHdheXMgYmUgc2V0IG9yIGdyYWNlZnVsbHkgc2V0IHRvIGVtcHR5IHN0cmluZ3MuXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5lbmRwb2ludCA/PyAnJyxcbiAgICAgICAgZmFpbHVyZS5uZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvLnNlcnZpY2UgPz8gJycsXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5vcGVyYXRpb24gPz8gJycsXG4gICAgICAgIGZhaWx1cmUubmV4dXNPcGVyYXRpb25FeGVjdXRpb25GYWlsdXJlSW5mby5vcGVyYXRpb25Ub2tlbiA/PyB1bmRlZmluZWQsXG4gICAgICAgIHRoaXMub3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKGZhaWx1cmUuY2F1c2UsIHBheWxvYWRDb252ZXJ0ZXIpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlbXBvcmFsRmFpbHVyZShcbiAgICAgIGZhaWx1cmUubWVzc2FnZSA/PyB1bmRlZmluZWQsXG4gICAgICB0aGlzLm9wdGlvbmFsRmFpbHVyZVRvT3B0aW9uYWxFcnJvcihmYWlsdXJlLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKVxuICAgICk7XG4gIH1cblxuICBmYWlsdXJlVG9FcnJvcihmYWlsdXJlOiBQcm90b0ZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBFcnJvciB7XG4gICAgaWYgKGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGF0dHJzID0gcGF5bG9hZENvbnZlcnRlci5mcm9tUGF5bG9hZDxEZWZhdWx0RW5jb2RlZEZhaWx1cmVBdHRyaWJ1dGVzPihmYWlsdXJlLmVuY29kZWRBdHRyaWJ1dGVzKTtcbiAgICAgIC8vIERvbid0IGFwcGx5IGVuY29kZWRBdHRyaWJ1dGVzIHVubGVzcyB0aGV5IGNvbmZvcm0gdG8gYW4gZXhwZWN0ZWQgc2NoZW1hXG4gICAgICBpZiAodHlwZW9mIGF0dHJzID09PSAnb2JqZWN0JyAmJiBhdHRycyAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlIH0gPSBhdHRycztcbiAgICAgICAgLy8gQXZvaWQgbXV0YXRpbmcgdGhlIGFyZ3VtZW50XG4gICAgICAgIGZhaWx1cmUgPSB7IC4uLmZhaWx1cmUgfTtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGZhaWx1cmUubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzdGFja190cmFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSBzdGFja190cmFjZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlcnIgPSB0aGlzLmZhaWx1cmVUb0Vycm9ySW5uZXIoZmFpbHVyZSwgcGF5bG9hZENvbnZlcnRlcik7XG4gICAgZXJyLnN0YWNrID0gZmFpbHVyZS5zdGFja1RyYWNlID8/ICcnO1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgIGVyci5mYWlsdXJlID0gZmFpbHVyZTtcbiAgICB9XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlKGVycjogdW5rbm93biwgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcik6IFByb3RvRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IHRoaXMuZXJyb3JUb0ZhaWx1cmVJbm5lcihlcnIsIHBheWxvYWRDb252ZXJ0ZXIpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5jb2RlQ29tbW9uQXR0cmlidXRlcykge1xuICAgICAgY29uc3QgeyBtZXNzYWdlLCBzdGFja1RyYWNlIH0gPSBmYWlsdXJlO1xuICAgICAgZmFpbHVyZS5tZXNzYWdlID0gJ0VuY29kZWQgZmFpbHVyZSc7XG4gICAgICBmYWlsdXJlLnN0YWNrVHJhY2UgPSAnJztcbiAgICAgIGZhaWx1cmUuZW5jb2RlZEF0dHJpYnV0ZXMgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh7IG1lc3NhZ2UsIHN0YWNrX3RyYWNlOiBzdGFja1RyYWNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbHVyZTtcbiAgfVxuXG4gIGVycm9yVG9GYWlsdXJlSW5uZXIoZXJyOiB1bmtub3duLCBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyKTogUHJvdG9GYWlsdXJlIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlIHx8IGVyciBpbnN0YW5jZW9mIG5leHVzLkhhbmRsZXJFcnJvcikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSAmJiBlcnIuZmFpbHVyZSkgcmV0dXJuIGVyci5mYWlsdXJlO1xuICAgICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrVHJhY2U6IGN1dG9mZlN0YWNrVHJhY2UoZXJyLnN0YWNrKSxcbiAgICAgICAgY2F1c2U6IHRoaXMub3B0aW9uYWxFcnJvclRvT3B0aW9uYWxGYWlsdXJlKGVyci5jYXVzZSwgcGF5bG9hZENvbnZlcnRlciksXG4gICAgICAgIHNvdXJjZTogRkFJTFVSRV9TT1VSQ0UsXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgQWN0aXZpdHlGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBhY3Rpdml0eUZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICAuLi5lcnIsXG4gICAgICAgICAgICByZXRyeVN0YXRlOiBlbmNvZGVSZXRyeVN0YXRlKGVyci5yZXRyeVN0YXRlKSxcbiAgICAgICAgICAgIGFjdGl2aXR5VHlwZTogeyBuYW1lOiBlcnIuYWN0aXZpdHlUeXBlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBDaGlsZFdvcmtmbG93RmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgY2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICAuLi5lcnIsXG4gICAgICAgICAgICByZXRyeVN0YXRlOiBlbmNvZGVSZXRyeVN0YXRlKGVyci5yZXRyeVN0YXRlKSxcbiAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiBlcnIuZXhlY3V0aW9uLFxuICAgICAgICAgICAgd29ya2Zsb3dUeXBlOiB7IG5hbWU6IGVyci53b3JrZmxvd1R5cGUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgYXBwbGljYXRpb25GYWlsdXJlSW5mbzoge1xuICAgICAgICAgICAgdHlwZTogZXJyLnR5cGUsXG4gICAgICAgICAgICBub25SZXRyeWFibGU6IGVyci5ub25SZXRyeWFibGUsXG4gICAgICAgICAgICBkZXRhaWxzOlxuICAgICAgICAgICAgICBlcnIuZGV0YWlscyAmJiBlcnIuZGV0YWlscy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgLi4uZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5leHRSZXRyeURlbGF5OiBtc09wdGlvbmFsVG9UcyhlcnIubmV4dFJldHJ5RGVsYXkpLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGVuY29kZUFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5KGVyci5jYXRlZ29yeSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBjYW5jZWxlZEZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICBkZXRhaWxzOlxuICAgICAgICAgICAgICBlcnIuZGV0YWlscyAmJiBlcnIuZGV0YWlscy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgLi4uZXJyLmRldGFpbHMpIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFRpbWVvdXRGYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICB0aW1lb3V0RmFpbHVyZUluZm86IHtcbiAgICAgICAgICAgIHRpbWVvdXRUeXBlOiBlbmNvZGVUaW1lb3V0VHlwZShlcnIudGltZW91dFR5cGUpLFxuICAgICAgICAgICAgbGFzdEhlYXJ0YmVhdERldGFpbHM6IGVyci5sYXN0SGVhcnRiZWF0RGV0YWlsc1xuICAgICAgICAgICAgICA/IHsgcGF5bG9hZHM6IHRvUGF5bG9hZHMocGF5bG9hZENvbnZlcnRlciwgZXJyLmxhc3RIZWFydGJlYXREZXRhaWxzKSB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgU2VydmVyRmFpbHVyZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgc2VydmVyRmFpbHVyZUluZm86IHsgbm9uUmV0cnlhYmxlOiBlcnIubm9uUmV0cnlhYmxlIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVGVybWluYXRlZEZhaWx1cmUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHRlcm1pbmF0ZWRGYWlsdXJlSW5mbzoge30sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgbmV4dXMuSGFuZGxlckVycm9yKSB7XG4gICAgICAgIGlmIChlcnIub3JpZ2luYWxGYWlsdXJlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUoZXJyLm9yaWdpbmFsRmFpbHVyZSwgZXJyLnJldHJ5YWJsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHJldHJ5QmVoYXZpb3I6IHRlbXBvcmFsLmFwaS5lbnVtcy52MS5OZXh1c0hhbmRsZXJFcnJvclJldHJ5QmVoYXZpb3IgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgc3dpdGNoIChlcnIucmV0cnlhYmxlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvciA9IGVuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcignUkVUUllBQkxFJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgICAgcmV0cnlCZWhhdmlvciA9IGVuY29kZU5leHVzSGFuZGxlckVycm9yUmV0cnlCZWhhdmlvcignTk9OX1JFVFJZQUJMRScpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICAgIG5leHVzSGFuZGxlckZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICAgIHR5cGU6IGVyci50eXBlLFxuICAgICAgICAgICAgICByZXRyeUJlaGF2aW9yLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTmV4dXNPcGVyYXRpb25GYWlsdXJlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBuZXh1c09wZXJhdGlvbkV4ZWN1dGlvbkZhaWx1cmVJbmZvOiB7XG4gICAgICAgICAgICBzY2hlZHVsZWRFdmVudElkOiBlcnIuc2NoZWR1bGVkRXZlbnRJZCA/IExvbmcuZnJvbU51bWJlcihlcnIuc2NoZWR1bGVkRXZlbnRJZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbmRwb2ludDogZXJyLmVuZHBvaW50LFxuICAgICAgICAgICAgc2VydmljZTogZXJyLnNlcnZpY2UsXG4gICAgICAgICAgICBvcGVyYXRpb246IGVyci5vcGVyYXRpb24sXG4gICAgICAgICAgICBvcGVyYXRpb25Ub2tlbjogZXJyLm9wZXJhdGlvblRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBKdXN0IGEgVGVtcG9yYWxGYWlsdXJlXG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlID0ge1xuICAgICAgc291cmNlOiBGQUlMVVJFX1NPVVJDRSxcbiAgICB9O1xuXG4gICAgaWYgKGlzRXJyb3IoZXJyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgbWVzc2FnZTogU3RyaW5nKGVyci5tZXNzYWdlID8/ICcnKSxcbiAgICAgICAgc3RhY2tUcmFjZTogY3V0b2ZmU3RhY2tUcmFjZShlcnIuc3RhY2spLFxuICAgICAgICBjYXVzZTogdGhpcy5vcHRpb25hbEVycm9yVG9PcHRpb25hbEZhaWx1cmUoKGVyciBhcyBhbnkpLmNhdXNlLCBwYXlsb2FkQ29udmVydGVyKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb21tZW5kYXRpb24gPSBgIFtBIG5vbi1FcnJvciB2YWx1ZSB3YXMgdGhyb3duIGZyb20geW91ciBjb2RlLiBXZSByZWNvbW1lbmQgdGhyb3dpbmcgRXJyb3Igb2JqZWN0cyBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIGEgc3RhY2sgdHJhY2VdYDtcblxuICAgIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgbWVzc2FnZTogZXJyICsgcmVjb21tZW5kYXRpb24gfTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KGVycik7XG4gICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IG1lc3NhZ2UgKyByZWNvbW1lbmRhdGlvbiB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLmJhc2UsIG1lc3NhZ2U6IFN0cmluZyhlcnIpICsgcmVjb21tZW5kYXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEZhaWx1cmUgcHJvdG8gbWVzc2FnZSB0byBhIEpTIEVycm9yIG9iamVjdCBpZiBkZWZpbmVkIG9yIHJldHVybnMgdW5kZWZpbmVkLlxuICAgKi9cbiAgb3B0aW9uYWxGYWlsdXJlVG9PcHRpb25hbEVycm9yKFxuICAgIGZhaWx1cmU6IFByb3RvRmFpbHVyZSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlclxuICApOiBFcnJvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZhaWx1cmUgPyB0aGlzLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHBheWxvYWRDb252ZXJ0ZXIpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGVycm9yIHRvIGEgRmFpbHVyZSBwcm90byBtZXNzYWdlIGlmIGRlZmluZWQgb3IgcmV0dXJucyB1bmRlZmluZWRcbiAgICovXG4gIG9wdGlvbmFsRXJyb3JUb09wdGlvbmFsRmFpbHVyZShlcnI6IHVua25vd24sIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIpOiBQcm90b0ZhaWx1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBlcnIgPyB0aGlzLmVycm9yVG9GYWlsdXJlKGVyciwgcGF5bG9hZENvbnZlcnRlcikgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIG5leHVzRmFpbHVyZVRvVGVtcG9yYWxGYWlsdXJlKGZhaWx1cmU6IG5leHVzLkZhaWx1cmUsIHJldHJ5YWJsZTogYm9vbGVhbik6IFByb3RvRmFpbHVyZSB7XG4gICAgaWYgKGZhaWx1cmUubWV0YWRhdGE/LnR5cGUgPT09ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJykge1xuICAgICAgaWYgKGZhaWx1cmUuZGV0YWlscyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJtaXNzaW5nIGRldGFpbHMgZm9yIE5leHVzIEZhaWx1cmUgb2YgdHlwZSAndGVtcG9yYWwuYXBpLmZhaWx1cmUudjEuRmFpbHVyZSdcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbHVyZS5kZXRhaWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0ZW1wb3JhbEZhaWx1cmU6IFByb3RvRmFpbHVyZSA9IHt9O1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLmFwcGxpY2F0aW9uRmFpbHVyZUluZm8gPSB7XG4gICAgICAgIHR5cGU6ICdOZXh1c0ZhaWx1cmUnLFxuICAgICAgICBub25SZXRyeWFibGU6ICFyZXRyeWFibGUsXG4gICAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgICBwYXlsb2FkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXRhZGF0YTogeyBlbmNvZGluZzogZW5jb2RlKCdqc29uL3BsYWluJykgfSxcbiAgICAgICAgICAgICAgZGF0YTogZW5jb2RlKEpTT04uc3RyaW5naWZ5KHsgLi4uZmFpbHVyZSwgbWVzc2FnZTogJycgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHRlbXBvcmFsRmFpbHVyZS5tZXNzYWdlID0gZmFpbHVyZS5tZXNzYWdlO1xuICAgICAgdGVtcG9yYWxGYWlsdXJlLnN0YWNrVHJhY2UgPSBmYWlsdXJlLnN0YWNrVHJhY2UgPz8gJyc7XG4gICAgICByZXR1cm4gdGVtcG9yYWxGYWlsdXJlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGVtcG9yYWxGYWlsdXJlVG9OZXh1c0ZhaWx1cmUoZmFpbHVyZTogUHJvdG9GYWlsdXJlKTogbmV4dXMuRmFpbHVyZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IGZhaWx1cmUubWVzc2FnZSA/PyAnJyxcbiAgICAgIG1ldGFkYXRhOiB7IHR5cGU6ICd0ZW1wb3JhbC5hcGkuZmFpbHVyZS52MS5GYWlsdXJlJyB9LFxuICAgICAgLy8gU3RvcmUgdGhlIGZ1bGwgUHJvdG9GYWlsdXJlIGFzIHRoZSBOZXh1cyBmYWlsdXJlIGRldGFpbHMgc28gaXQgY2FuIGJlIHJvdW5kLXRyaXBwZWRcbiAgICAgIC8vIGxvc3NsZXNzbHkgYmFjayB0byBhIFByb3RvRmFpbHVyZSB2aWEgbmV4dXNGYWlsdXJlVG9UZW1wb3JhbEZhaWx1cmUuXG4gICAgICBkZXRhaWxzOiB7IC4uLmZhaWx1cmUgfSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBgUGF5bG9hZENvZGVjYCBpcyBhbiBvcHRpb25hbCBzdGVwIHRoYXQgaGFwcGVucyBiZXR3ZWVuIHRoZSB3aXJlIGFuZCB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIFRlbXBvcmFsIFNlcnZlciA8LS0+IFdpcmUgPC0tPiBgUGF5bG9hZENvZGVjYCA8LS0+IGBQYXlsb2FkQ29udmVydGVyYCA8LS0+IFVzZXIgY29kZVxuICpcbiAqIEltcGxlbWVudCB0aGlzIHRvIHRyYW5zZm9ybSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHRvL2Zyb20gdGhlIGZvcm1hdCBzZW50IG92ZXIgdGhlIHdpcmUgYW5kIHN0b3JlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuXG4gKiBDb21tb24gdHJhbnNmb3JtYXRpb25zIGFyZSBlbmNyeXB0aW9uIGFuZCBjb21wcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29kZWMge1xuICAvKipcbiAgICogRW5jb2RlIGFuIGFycmF5IG9mIHtAbGluayBQYXlsb2FkfXMgZm9yIHNlbmRpbmcgb3ZlciB0aGUgd2lyZS5cbiAgICogQHBhcmFtIHBheWxvYWRzIE1heSBoYXZlIGxlbmd0aCAwLlxuICAgKi9cbiAgZW5jb2RlKHBheWxvYWRzOiBQYXlsb2FkW10pOiBQcm9taXNlPFBheWxvYWRbXT47XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhcnJheSBvZiB7QGxpbmsgUGF5bG9hZH1zIHJlY2VpdmVkIGZyb20gdGhlIHdpcmUuXG4gICAqL1xuICBkZWNvZGUocGF5bG9hZHM6IFBheWxvYWRbXSk6IFByb21pc2U8UGF5bG9hZFtdPjtcbn1cbiIsImltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHsgUGF5bG9hZENvbnZlcnRlckVycm9yLCBWYWx1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGF5bG9hZCB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZW5jb2RpbmdLZXlzLCBlbmNvZGluZ1R5cGVzLCBNRVRBREFUQV9FTkNPRElOR19LRVkgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGRhdGEgbGlrZSBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWVzLlxuICpcbiAqIFRoaXMgaXMgY2FsbGVkIGluc2lkZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2RldGVybWluaXNtIHwgV29ya2Zsb3cgaXNvbGF0ZX0uXG4gKiBUbyB3cml0ZSBhc3luYyBjb2RlIG9yIHVzZSBOb2RlIEFQSXMgKG9yIHVzZSBwYWNrYWdlcyB0aGF0IHVzZSBOb2RlIEFQSXMpLCB1c2UgYSB7QGxpbmsgUGF5bG9hZENvZGVjfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmFsdWUgdG8gYSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4gRXhhbXBsZSB2YWx1ZXMgaW5jbHVkZSB0aGUgV29ya2Zsb3cgYXJncyBzZW50IGZyb20gdGhlIENsaWVudCBhbmQgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIFdvcmtmbG93IG9yIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBheWxvYWR9LlxuICAgKlxuICAgKiBTaG91bGQgdGhyb3cge0BsaW5rIFZhbHVlRXJyb3J9IGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZDtcblxuICAvKipcbiAgICogQ29udmVydHMgYSB7QGxpbmsgUGF5bG9hZH0gYmFjayB0byBhIHZhbHVlLlxuICAgKi9cbiAgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQ7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBjb252ZXJzaW9uIG9mIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlclxuICogQHBhcmFtIHZhbHVlcyBKUyB2YWx1ZXMgdG8gY29udmVydCB0byBQYXlsb2Fkc1xuICogQHJldHVybiBsaXN0IG9mIHtAbGluayBQYXlsb2FkfXNcbiAqIEB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgdGhlIHZhbHVlIHBhc3NlZCBhcyBwYXJhbWV0ZXIgZmFpbGVkIGZvciBhbnlcbiAqICAgICByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1BheWxvYWRzKGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciwgLi4udmFsdWVzOiB1bmtub3duW10pOiBQYXlsb2FkW10gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzLm1hcCgodmFsdWUpID0+IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUpKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkfSBvbiBhbiBvcHRpb25hbCB2YWx1ZSwgYW5kIHRoZW4gZW5jb2RlIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydE9wdGlvbmFsVG9QYXlsb2FkKFxuICBwYXlsb2FkQ29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLFxuICB2YWx1ZTogdW5rbm93blxuKTogUGF5bG9hZCB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHZhbHVlO1xuXG4gIHJldHVybiBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSk7XG59XG5cbi8qKlxuICogUnVuIHtAbGluayBQYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZH0gb24gZWFjaCB2YWx1ZSBpbiB0aGUgbWFwLlxuICpcbiAqIEB0aHJvd3Mge0BsaW5rIFZhbHVlRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgYW55IHZhbHVlIGluIHRoZSBtYXAgZmFpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvUGF5bG9hZHM8SyBleHRlbmRzIHN0cmluZywgVCA9IGFueT4oXG4gIGNvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgbWFwOiBSZWNvcmQ8SywgVD5cbik6IFJlY29yZDxLLCBQYXlsb2FkPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMobWFwKS5tYXAoKFtrLCB2XSk6IFtLLCBQYXlsb2FkXSA9PiBbayBhcyBLLCBjb252ZXJ0ZXIudG9QYXlsb2FkKHYpXSlcbiAgKSBhcyBSZWNvcmQ8SywgUGF5bG9hZD47XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBjb252ZXJzaW9uIG9mIGFuIGFycmF5IG9mIHZhbHVlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIFVzZWZ1bCBmb3IgZGVzZXJpYWxpemluZ1xuICogYXJndW1lbnRzIG9mIGZ1bmN0aW9uIGludm9jYXRpb25zLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIHBheWxvYWRzXG4gKiBAcGFyYW0gcGF5bG9hZHMgc2VyaWFsaXplZCB2YWx1ZSB0byBjb252ZXJ0IHRvIEpTIHZhbHVlcy5cbiAqIEByZXR1cm4gY29udmVydGVkIEpTIHZhbHVlXG4gKiBAdGhyb3dzIHtAbGluayBQYXlsb2FkQ29udmVydGVyRXJyb3J9IGlmIGNvbnZlcnNpb24gb2YgdGhlIGRhdGEgcGFzc2VkIGFzIHBhcmFtZXRlciBmYWlsZWQgZm9yIGFueVxuICogICAgIHJlYXNvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21QYXlsb2Fkc0F0SW5kZXg8VD4oY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBpbmRleDogbnVtYmVyLCBwYXlsb2Fkcz86IFBheWxvYWRbXSB8IG51bGwpOiBUIHtcbiAgLy8gVG8gbWFrZSBhZGRpbmcgYXJndW1lbnRzIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlXG4gIGlmIChwYXlsb2FkcyA9PT0gdW5kZWZpbmVkIHx8IHBheWxvYWRzID09PSBudWxsIHx8IGluZGV4ID49IHBheWxvYWRzLmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBwYXlsb2Fkcz8uW2luZGV4XTtcbiAgaWYgKCFwYXlsb2FkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcbn1cblxuLyoqXG4gKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWR9IG9uIGVhY2ggdmFsdWUgaW4gdGhlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlGcm9tUGF5bG9hZHMoY29udmVydGVyOiBQYXlsb2FkQ29udmVydGVyLCBwYXlsb2Fkcz86IFBheWxvYWRbXSB8IG51bGwpOiB1bmtub3duW10ge1xuICBpZiAoIXBheWxvYWRzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBwYXlsb2Fkcy5tYXAoKHBheWxvYWQ6IFBheWxvYWQpID0+IGNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBGcm9tUGF5bG9hZHM8SyBleHRlbmRzIHN0cmluZywgVCA9IHVua25vd24+KFxuICBjb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIsXG4gIG1hcD86IFJlY29yZDxLLCBQYXlsb2FkPiB8IG51bGwgfCB1bmRlZmluZWRcbik6IFJlY29yZDxLLCBUPiB8IHVuZGVmaW5lZCB7XG4gIGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXApLm1hcCgoW2ssIHBheWxvYWRdKTogW0ssIHVua25vd25dID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udmVydGVyLmZyb21QYXlsb2FkKHBheWxvYWQgYXMgUGF5bG9hZCk7XG4gICAgICByZXR1cm4gW2sgYXMgSywgdmFsdWVdO1xuICAgIH0pXG4gICkgYXMgUmVjb3JkPEssIFQ+O1xufVxuXG5leHBvcnQgZGVjbGFyZSBjb25zdCByYXdQYXlsb2FkVHlwZUJyYW5kOiB1bmlxdWUgc3ltYm9sO1xuLyoqXG4gKiBSYXdWYWx1ZSBpcyBhIHdyYXBwZXIgb3ZlciBhIHBheWxvYWQuXG4gKiBBIHBheWxvYWQgdGhhdCBiZWxvbmdzIHRvIGEgUmF3VmFsdWUgaXMgc3BlY2lhbCBpbiB0aGF0IGl0IGJ5cGFzc2VzIHVzZXItZGVmaW5lZCBwYXlsb2FkIGNvbnZlcnRlcnMsXG4gKiBpbnN0ZWFkIHVzaW5nIHRoZSBkZWZhdWx0IHBheWxvYWQgY29udmVydGVyLiBUaGUgcGF5bG9hZCBzdGlsbCB1bmRlcmdvZXMgY29kZWMgY29udmVyc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJhd1ZhbHVlPFQgPSB1bmtub3duPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BheWxvYWQ6IFBheWxvYWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgW3Jhd1BheWxvYWRUeXBlQnJhbmRdOiBUID0gdW5kZWZpbmVkIGFzIFQ7XG5cbiAgY29uc3RydWN0b3IodmFsdWU6IFQsIHBheWxvYWRDb252ZXJ0ZXI6IFBheWxvYWRDb252ZXJ0ZXIgPSBkZWZhdWx0UGF5bG9hZENvbnZlcnRlcikge1xuICAgIHRoaXMuX3BheWxvYWQgPSBwYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZCh2YWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVBheWxvYWQocDogUGF5bG9hZCk6IFJhd1ZhbHVlIHtcbiAgICByZXR1cm4gbmV3IFJhd1ZhbHVlKHAsIGlkZW50aXR5UGF5bG9hZENvbnZlcnRlcik7XG4gIH1cblxuICBnZXQgcGF5bG9hZCgpOiBQYXlsb2FkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bG9hZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICAvKipcbiAgICogQ29udmVydHMgYSB2YWx1ZSB0byBhIHtAbGluayBQYXlsb2FkfS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LiBFeGFtcGxlIHZhbHVlcyBpbmNsdWRlIHRoZSBXb3JrZmxvdyBhcmdzIHNlbnQgZnJvbSB0aGUgQ2xpZW50IGFuZCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgV29ya2Zsb3cgb3IgQWN0aXZpdHkuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGF5bG9hZH0sIG9yIGB1bmRlZmluZWRgIGlmIHVuYWJsZSB0byBjb252ZXJ0LlxuICAgKi9cbiAgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ29udmVydHMgYSB7QGxpbmsgUGF5bG9hZH0gYmFjayB0byBhIHZhbHVlLlxuICAgKi9cbiAgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQ7XG5cbiAgcmVhZG9ubHkgZW5jb2RpbmdUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJpZXMgdG8gY29udmVydCB2YWx1ZXMgdG8ge0BsaW5rIFBheWxvYWR9cyB1c2luZyB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmd9cyBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IsIGluIHRoZSBvcmRlciBwcm92aWRlZC5cbiAqXG4gKiBDb252ZXJ0cyBQYXlsb2FkcyB0byB2YWx1ZXMgYmFzZWQgb24gdGhlIGBQYXlsb2FkLm1ldGFkYXRhLmVuY29kaW5nYCBmaWVsZCwgd2hpY2ggbWF0Y2hlcyB0aGUge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZW5jb2RpbmdUeXBlfVxuICogb2YgdGhlIGNvbnZlcnRlciB0aGF0IGNyZWF0ZWQgdGhlIFBheWxvYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlciB7XG4gIHJlYWRvbmx5IGNvbnZlcnRlcnM6IFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmdbXTtcbiAgcmVhZG9ubHkgY29udmVydGVyQnlFbmNvZGluZzogTWFwPHN0cmluZywgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZz4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoLi4uY29udmVydGVyczogUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZ1tdKSB7XG4gICAgaWYgKGNvbnZlcnRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUGF5bG9hZENvbnZlcnRlckVycm9yKCdNdXN0IHByb3ZpZGUgYXQgbGVhc3Qgb25lIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzO1xuICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIHRoaXMuY29udmVydGVyQnlFbmNvZGluZy5zZXQoY29udmVydGVyLmVuY29kaW5nVHlwZSwgY29udmVydGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdG8gcnVuIGAudG9QYXlsb2FkKHZhbHVlKWAgb24gZWFjaCBjb252ZXJ0ZXIgaW4gdGhlIG9yZGVyIHByb3ZpZGVkIGF0IGNvbnN0cnVjdGlvbi5cbiAgICogUmV0dXJucyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHQsIHRocm93cyB7QGxpbmsgVmFsdWVFcnJvcn0gaWYgdGhlcmUgaXMgbm8gY29udmVydGVyIHRoYXQgY2FuIGhhbmRsZSB0aGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgdG9QYXlsb2FkPFQ+KHZhbHVlOiBUKTogUGF5bG9hZCB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmF3VmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5wYXlsb2FkO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci50b1BheWxvYWQodmFsdWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuYWJsZSB0byBjb252ZXJ0ICR7dmFsdWV9IHRvIHBheWxvYWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4ge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2RpbmcuZnJvbVBheWxvYWR9IGJhc2VkIG9uIHRoZSBgZW5jb2RpbmdgIG1ldGFkYXRhIG9mIHRoZSB7QGxpbmsgUGF5bG9hZH0uXG4gICAqL1xuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4ocGF5bG9hZDogUGF5bG9hZCk6IFQge1xuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09PSB1bmRlZmluZWQgfHwgcGF5bG9hZC5tZXRhZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ01pc3NpbmcgcGF5bG9hZCBtZXRhZGF0YScpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY29kaW5nID0gZGVjb2RlKHBheWxvYWQubWV0YWRhdGFbTUVUQURBVEFfRU5DT0RJTkdfS0VZXSEpO1xuICAgIGNvbnN0IGNvbnZlcnRlciA9IHRoaXMuY29udmVydGVyQnlFbmNvZGluZy5nZXQoZW5jb2RpbmcpO1xuICAgIGlmIChjb252ZXJ0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVua25vd24gZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIEpTIHVuZGVmaW5lZCBhbmQgTlVMTCBQYXlsb2FkXG4gKi9cbmV4cG9ydCBjbGFzcyBVbmRlZmluZWRQYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX05VTEw7XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBbTUVUQURBVEFfRU5DT0RJTkdfS0VZXTogZW5jb2RpbmdLZXlzLk1FVEFEQVRBX0VOQ09ESU5HX05VTEwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oX2NvbnRlbnQ6IFBheWxvYWQpOiBUIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTsgLy8gSnVzdCByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIGJpbmFyeSBkYXRhIHR5cGVzIGFuZCBSQVcgUGF5bG9hZFxuICovXG5leHBvcnQgY2xhc3MgQmluYXJ5UGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXJXaXRoRW5jb2Rpbmcge1xuICBwdWJsaWMgZW5jb2RpbmdUeXBlID0gZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19SQVc7XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfUkFXLFxuICAgICAgfSxcbiAgICAgIGRhdGE6IHZhbHVlLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZnJvbVBheWxvYWQ8VD4oY29udGVudDogUGF5bG9hZCk6IFQge1xuICAgIHJldHVybiAoXG4gICAgICAvLyBXcmFwIHdpdGggVWludDhBcnJheSBmcm9tIHRoaXMgY29udGV4dCB0byBlbnN1cmUgYGluc3RhbmNlb2ZgIHdvcmtzXG4gICAgICAoXG4gICAgICAgIGNvbnRlbnQuZGF0YSA/IG5ldyBVaW50OEFycmF5KGNvbnRlbnQuZGF0YS5idWZmZXIsIGNvbnRlbnQuZGF0YS5ieXRlT2Zmc2V0LCBjb250ZW50LmRhdGEubGVuZ3RoKSA6IGNvbnRlbnQuZGF0YVxuICAgICAgKSBhcyBhbnlcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYmV0d2VlbiBub24tdW5kZWZpbmVkIHZhbHVlcyBhbmQgc2VyaWFsaXplZCBKU09OIFBheWxvYWRcbiAqL1xuZXhwb3J0IGNsYXNzIEpzb25QYXlsb2FkQ29udmVydGVyIGltcGxlbWVudHMgUGF5bG9hZENvbnZlcnRlcldpdGhFbmNvZGluZyB7XG4gIHB1YmxpYyBlbmNvZGluZ1R5cGUgPSBlbmNvZGluZ1R5cGVzLk1FVEFEQVRBX0VOQ09ESU5HX0pTT047XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IFBheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCBqc29uO1xuICAgIHRyeSB7XG4gICAgICBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIFtNRVRBREFUQV9FTkNPRElOR19LRVldOiBlbmNvZGluZ0tleXMuTUVUQURBVEFfRU5DT0RJTkdfSlNPTixcbiAgICAgIH0sXG4gICAgICBkYXRhOiBlbmNvZGUoanNvbiksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmcm9tUGF5bG9hZDxUPihjb250ZW50OiBQYXlsb2FkKTogVCB7XG4gICAgaWYgKGNvbnRlbnQuZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGNvbnRlbnQuZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0dvdCBwYXlsb2FkIHdpdGggbm8gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGUoY29udGVudC5kYXRhKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRQYXlsb2FkQ29udmVydGVyIGV4dGVuZHMgQ29tcG9zaXRlUGF5bG9hZENvbnZlcnRlciB7XG4gIC8vIE1hdGNoIHRoZSBvcmRlciB1c2VkIGluIG90aGVyIFNES3MsIGJ1dCBleGNsdWRlIFByb3RvYnVmIGNvbnZlcnRlcnMgc28gdGhhdCB0aGUgY29kZSwgaW5jbHVkaW5nXG4gIC8vIGBwcm90bzMtanNvbi1zZXJpYWxpemVyYCwgZG9lc24ndCB0YWtlIHNwYWNlIGluIFdvcmtmbG93IGJ1bmRsZXMgdGhhdCBkb24ndCB1c2UgUHJvdG9idWZzLiBUbyB1c2UgUHJvdG9idWZzLCB1c2VcbiAgLy8ge0BsaW5rIERlZmF1bHRQYXlsb2FkQ29udmVydGVyV2l0aFByb3RvYnVmc30uXG4gIC8vXG4gIC8vIEdvIFNESzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbXBvcmFsaW8vc2RrLWdvL2Jsb2IvNWU1NjQ1ZjBjNTUwZGNmNzE3YzA5NWFlMzJjNzZhNzA4N2QyZTk4NS9jb252ZXJ0ZXIvZGVmYXVsdF9kYXRhX2NvbnZlcnRlci5nbyNMMjhcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIobmV3IFVuZGVmaW5lZFBheWxvYWRDb252ZXJ0ZXIoKSwgbmV3IEJpbmFyeVBheWxvYWRDb252ZXJ0ZXIoKSwgbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCkpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9IHVzZWQgYnkgdGhlIFNESy4gU3VwcG9ydHMgYFVpbnQ4QXJyYXlgIGFuZCBKU09OIHNlcmlhbGl6YWJsZXMgKHNvIGlmXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkjZGVzY3JpcHRpb24gfCBgSlNPTi5zdHJpbmdpZnkoeW91ckFyZ09yUmV0dmFsKWB9XG4gKiB3b3JrcywgdGhlIGRlZmF1bHQgcGF5bG9hZCBjb252ZXJ0ZXIgd2lsbCB3b3JrKS5cbiAqXG4gKiBUbyBhbHNvIHN1cHBvcnQgUHJvdG9idWZzLCBjcmVhdGUgYSBjdXN0b20gcGF5bG9hZCBjb252ZXJ0ZXIgd2l0aCB7QGxpbmsgRGVmYXVsdFBheWxvYWRDb252ZXJ0ZXJ9OlxuICpcbiAqIGBjb25zdCBteUNvbnZlcnRlciA9IG5ldyBEZWZhdWx0UGF5bG9hZENvbnZlcnRlcih7IHByb3RvYnVmUm9vdCB9KWBcbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyID0gbmV3IERlZmF1bHRQYXlsb2FkQ29udmVydGVyKCk7XG5cbi8qKlxuICogVGhlIGlkZW50aXR5IHBheWxvYWQgY29udmVydGVyIHJldHVybnMgdGhlIGlucHV0cyBpdCB3YXMgZ2l2ZW4uXG4gKi9cbmNsYXNzIElkZW50aXR5UGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICB0b1BheWxvYWQ8VD4odmFsdWU6IFQpOiBQYXlsb2FkIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgUGF5bG9hZDtcbiAgfVxuXG4gIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICByZXR1cm4gcGF5bG9hZCBhcyBUO1xuICB9XG59XG5cbmNvbnN0IGlkZW50aXR5UGF5bG9hZENvbnZlcnRlciA9IG5ldyBJZGVudGl0eVBheWxvYWRDb252ZXJ0ZXIoKTtcbiIsImltcG9ydCB7IGRlY29kZSwgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgU2VhcmNoQXR0cmlidXRlcywgU2VhcmNoQXR0cmlidXRlUGFpciwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpciB9IGZyb20gJy4uL3NlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7XG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgU2VhcmNoQXR0cmlidXRlVHlwZSxcbiAgaXNWYWxpZFZhbHVlRm9yVHlwZSxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZSxcbiAgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZSxcbn0gZnJvbSAnLi4vc2VhcmNoLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBKc29uUGF5bG9hZENvbnZlcnRlciwgbWFwRnJvbVBheWxvYWRzLCBtYXBUb1BheWxvYWRzIH0gZnJvbSAnLi9wYXlsb2FkLWNvbnZlcnRlcic7XG5cbi8qKlxuICogQ29udmVydHMgU2VhcmNoIEF0dHJpYnV0ZSB2YWx1ZXMgdXNpbmcgSnNvblBheWxvYWRDb252ZXJ0ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXlsb2FkQ29udmVydGVyIHtcbiAganNvbkNvbnZlcnRlciA9IG5ldyBKc29uUGF5bG9hZENvbnZlcnRlcigpO1xuICB2YWxpZE5vbkRhdGVUeXBlcyA9IFsnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJ107XG5cbiAgcHVibGljIHRvUGF5bG9hZCh2YWx1ZXM6IHVua25vd24pOiBQYXlsb2FkIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFNlYXJjaEF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGFuIGFycmF5YCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaXJzdFZhbHVlID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgZmlyc3RUeXBlID0gdHlwZW9mIGZpcnN0VmFsdWU7XG4gICAgICBpZiAoZmlyc3RUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IFtpZHgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBTZWFyY2hBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYXJyYXlzIG9mIHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zLCBvciBEYXRlcy4gVGhlIHZhbHVlICR7dmFsdWV9IGF0IGluZGV4ICR7aWR4fSBpcyBvZiB0eXBlICR7dHlwZW9mIHZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWROb25EYXRlVHlwZXMuaW5jbHVkZXMoZmlyc3RUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBTZWFyY2hBdHRyaWJ1dGUgYXJyYXkgdmFsdWVzIG11c3QgYmU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlYCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtpZHgsIHZhbHVlXSBvZiB2YWx1ZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gZmlyc3RUeXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYEFsbCBTZWFyY2hBdHRyaWJ1dGUgYXJyYXkgdmFsdWVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGZpcnN0IHZhbHVlICR7Zmlyc3RWYWx1ZX0gb2YgdHlwZSAke2ZpcnN0VHlwZX0gZG9lc24ndCBtYXRjaCB2YWx1ZSAke3ZhbHVlfSBvZiB0eXBlICR7dHlwZW9mIHZhbHVlfSBhdCBpbmRleCAke2lkeH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEpTT04uc3RyaW5naWZ5IHRha2VzIGNhcmUgb2YgY29udmVydGluZyBEYXRlcyB0byBJU08gc3RyaW5nc1xuICAgIGNvbnN0IHJldCA9IHRoaXMuanNvbkNvbnZlcnRlci50b1BheWxvYWQodmFsdWVzKTtcbiAgICBpZiAocmV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBzZWFyY2ggYXR0cmlidXRlcyB0byBwYXlsb2FkcycpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIERhdGV0aW1lIFNlYXJjaCBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gYERhdGVgc1xuICAgKi9cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmpzb25Db252ZXJ0ZXIuZnJvbVBheWxvYWQocGF5bG9hZCk7XG4gICAgbGV0IGFycmF5V3JhcHBlZFZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgY29uc3Qgc2VhcmNoQXR0cmlidXRlVHlwZSA9IHBheWxvYWQubWV0YWRhdGEudHlwZSA/IGRlY29kZShwYXlsb2FkLm1ldGFkYXRhLnR5cGUpIDogdW5kZWZpbmVkO1xuICAgIGlmIChzZWFyY2hBdHRyaWJ1dGVUeXBlID09PSAnRGF0ZXRpbWUnKSB7XG4gICAgICBhcnJheVdyYXBwZWRWYWx1ZSA9IGFycmF5V3JhcHBlZFZhbHVlLm1hcCgoZGF0ZVN0cmluZykgPT4gbmV3IERhdGUoZGF0ZVN0cmluZykpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlXcmFwcGVkVmFsdWUgYXMgdW5rbm93biBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyID0gbmV3IFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIoKTtcblxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciBpbXBsZW1lbnRzIFBheWxvYWRDb252ZXJ0ZXIge1xuICBqc29uQ29udmVydGVyID0gbmV3IEpzb25QYXlsb2FkQ29udmVydGVyKCk7XG5cbiAgcHVibGljIHRvUGF5bG9hZDxUPihhdHRyOiBUKTogUGF5bG9hZCB7XG4gICAgaWYgKCEoYXR0ciBpbnN0YW5jZW9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWUgfHwgYXR0ciBpbnN0YW5jZW9mIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYEV4cGVjdCBpbnB1dCB0byBiZSBpbnN0YW5jZSBvZiBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlIG9yIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWUsIGdvdDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBhdHRyXG4gICAgICAgICl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXZSBjaGVjayBmb3IgZGVsZXRpb24gYXMgd2VsbCBhcyByZWd1bGFyIHR5cGVkIHNlYXJjaCBhdHRyaWJ1dGVzLlxuICAgIGlmIChhdHRyLnZhbHVlICE9PSBudWxsICYmICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHIudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHNlYXJjaCBhdHRyaWJ1dGUgdmFsdWUgJHthdHRyLnZhbHVlfSBmb3IgZ2l2ZW4gdHlwZSAke2F0dHIudHlwZX1gKTtcbiAgICB9XG5cbiAgICAvLyBGb3Igc2VydmVyIHNlYXJjaCBhdHRyaWJ1dGVzIHRvIHdvcmsgcHJvcGVybHksIHdlIGNhbm5vdCBzZXQgdGhlIG1ldGFkYXRhXG4gICAgLy8gdHlwZSB3aGVuIHdlIHNldCBudWxsXG4gICAgaWYgKGF0dHIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmpzb25Db252ZXJ0ZXIudG9QYXlsb2FkKGF0dHIudmFsdWUpO1xuICAgICAgaWYgKHBheWxvYWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZSB0byBwYXlsb2FkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG5cbiAgICAvLyBKU09OLnN0cmluZ2lmeSB0YWtlcyBjYXJlIG9mIGNvbnZlcnRpbmcgRGF0ZXMgdG8gSVNPIHN0cmluZ3NcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5qc29uQ29udmVydGVyLnRvUGF5bG9hZChhdHRyLnZhbHVlKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgdHlwZWQgc2VhcmNoIGF0dHJpYnV0ZSB0byBwYXlsb2FkJyk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgdGhlIGNhc2UgYnV0IHRoZSBjb21waWxlciBjb21wbGFpbnMgd2l0aG91dCB0aGlzIGNoZWNrLlxuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdNaXNzaW5nIHBheWxvYWQgbWV0YWRhdGEnKTtcbiAgICB9XG4gICAgLy8gQWRkIGVuY29kZWQgdHlwZSBvZiBzZWFyY2ggYXR0cmlidXRlIHRvIG1ldGF0ZGF0YVxuICAgIHBheWxvYWQubWV0YWRhdGFbJ3R5cGUnXSA9IGVuY29kZShUeXBlZFNlYXJjaEF0dHJpYnV0ZXMudG9NZXRhZGF0YVR5cGUoYXR0ci50eXBlKSk7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICAvLyBOb3RlOiB0eXBlIGNhc3RpbmcgdW5kZWZpbmVkIHZhbHVlcyBpcyBub3QgY2xlYXIgdG8gY2FsbGVyLlxuICAvLyBXZSBjYW4ndCBjaGFuZ2UgdGhlIHR5cGluZyBvZiB0aGUgbWV0aG9kIHRvIHJldHVybiB1bmRlZmluZWQsIGl0J3Mgbm90IGFsbG93ZWQgYnkgdGhlIGludGVyZmFjZS5cbiAgcHVibGljIGZyb21QYXlsb2FkPFQ+KHBheWxvYWQ6IFBheWxvYWQpOiBUIHtcbiAgICBpZiAocGF5bG9hZC5tZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignTWlzc2luZyBwYXlsb2FkIG1ldGFkYXRhJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gJ3R5cGUnIG1ldGFkYXRhIGZpZWxkIG9yIG5vIGdpdmVuIHZhbHVlLCB3ZSBza2lwLlxuICAgIGlmIChwYXlsb2FkLm1ldGFkYXRhLnR5cGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cbiAgICBjb25zdCB0eXBlID0gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnRvU2VhcmNoQXR0cmlidXRlVHlwZShkZWNvZGUocGF5bG9hZC5tZXRhZGF0YS50eXBlKSk7XG4gICAgLy8gVW5yZWNvZ25pemVkIG1ldGFkYXRhIHR5cGUgKHNhbml0eSBjaGVjaykuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cblxuICAgIGxldCB2YWx1ZSA9IHRoaXMuanNvbkNvbnZlcnRlci5mcm9tUGF5bG9hZChwYXlsb2FkKTtcblxuICAgIC8vIEhhbmRsZSBsZWdhY3kgdmFsdWVzIHdpdGhvdXQgS0VZV09SRF9MSVNUIHR5cGUuXG4gICAgaWYgKHR5cGUgIT09IFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRF9MSVNUICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBDYW5ub3QgaGF2ZSBhbiBhcnJheSB3aXRoIG11bHRpcGxlIHZhbHVlcyBmb3Igbm9uLUtFWVdPUkRfTElTVCB0eXBlLlxuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgICAgfVxuICAgICAgLy8gVW5wYWNrIHNpbmdsZSB2YWx1ZSBhcnJheS5cbiAgICAgIHZhbHVlID0gdmFsdWVbMF07XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FICYmIHZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIGZvciB0aGUgZ2l2ZW4gdHlwZS4gSWYgbm90LCBza2lwLlxuICAgIGlmICghaXNWYWxpZFZhbHVlRm9yVHlwZSh0eXBlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKHR5cGUsIHZhbHVlKSBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0eXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVQYXlsb2FkQ29udmVydGVyKCk7XG5cbi8vIElmIGJvdGggcGFyYW1zIGFyZSBwcm92aWRlZCwgY29uZmxpY3Rpbmcga2V5cyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyhcbiAgc2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZXMsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHwgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdXG4pOiBSZWNvcmQ8c3RyaW5nLCBQYXlsb2FkPiB7XG4gIHJldHVybiB7XG4gICAgLi4uKHNlYXJjaEF0dHJpYnV0ZXMgPyBtYXBUb1BheWxvYWRzKHNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsIHNlYXJjaEF0dHJpYnV0ZXMpIDoge30pLFxuICAgIC4uLih0eXBlZFNlYXJjaEF0dHJpYnV0ZXNcbiAgICAgID8gbWFwVG9QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+KFxuICAgICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh0eXBlZFNlYXJjaEF0dHJpYnV0ZXMpID8gdHlwZWRTZWFyY2hBdHRyaWJ1dGVzIDogdHlwZWRTZWFyY2hBdHRyaWJ1dGVzLmdldEFsbCgpKS5tYXAoXG4gICAgICAgICAgICAgIChwYWlyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtwYWlyLmtleS5uYW1lLCBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVVcGRhdGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVTZWFyY2hBdHRyaWJ1dGVzKGluZGV4ZWRGaWVsZHM6IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+IHwgdW5kZWZpbmVkIHwgbnVsbCk6IFNlYXJjaEF0dHJpYnV0ZXMge1xuICBpZiAoIWluZGV4ZWRGaWVsZHMpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICBPYmplY3QuZW50cmllcyhtYXBGcm9tUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgaW5kZXhlZEZpZWxkcykgYXMgU2VhcmNoQXR0cmlidXRlcykuZmlsdGVyKFxuICAgICAgKFtfLCB2XSkgPT4gdiAmJiB2Lmxlbmd0aCA+IDBcbiAgICApIC8vIEZpbHRlciBvdXQgZW1wdHkgYXJyYXlzIHJldHVybmVkIGJ5IHByZSAxLjE4IHNlcnZlcnNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgaW5kZXhlZEZpZWxkczogUmVjb3JkPHN0cmluZywgUGF5bG9hZD4gfCB1bmRlZmluZWQgfCBudWxsXG4pOiBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICByZXR1cm4gbmV3IFR5cGVkU2VhcmNoQXR0cmlidXRlcyhcbiAgICBPYmplY3QuZW50cmllcyhcbiAgICAgIG1hcEZyb21QYXlsb2FkczxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4gfCB1bmRlZmluZWQ+KFxuICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZVBheWxvYWRDb252ZXJ0ZXIsXG4gICAgICAgIGluZGV4ZWRGaWVsZHNcbiAgICAgICkgPz8ge31cbiAgICApLnJlZHVjZTxTZWFyY2hBdHRyaWJ1dGVQYWlyW10+KChhY2MsIFtrLCBhdHRyXSkgPT4ge1xuICAgICAgLy8gRmlsdGVyIG91dCB1bmRlZmluZWQgdmFsdWVzIGZyb20gY29udmVydGVyLlxuICAgICAgaWYgKCFhdHRyKSB7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB7IG5hbWU6IGssIHR5cGU6IGF0dHIudHlwZSB9O1xuICAgICAgLy8gRW5zdXJlIGlzIHZhbGlkIHBhaXIuXG4gICAgICBpZiAoaXNWYWxpZFZhbHVlRm9yVHlwZShrZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgYWNjLnB1c2goeyBrZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKVxuICApO1xufVxuIiwiaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfRU5DT0RJTkdfS0VZID0gJ2VuY29kaW5nJztcbmV4cG9ydCBjb25zdCBlbmNvZGluZ1R5cGVzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiAnYmluYXJ5L251bGwnLFxuICBNRVRBREFUQV9FTkNPRElOR19SQVc6ICdiaW5hcnkvcGxhaW4nLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiAnanNvbi9wbGFpbicsXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGX0pTT046ICdqc29uL3Byb3RvYnVmJyxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUY6ICdiaW5hcnkvcHJvdG9idWYnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEVuY29kaW5nVHlwZSA9ICh0eXBlb2YgZW5jb2RpbmdUeXBlcylba2V5b2YgdHlwZW9mIGVuY29kaW5nVHlwZXNdO1xuXG5leHBvcnQgY29uc3QgZW5jb2RpbmdLZXlzID0ge1xuICBNRVRBREFUQV9FTkNPRElOR19OVUxMOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19OVUxMKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUkFXOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19SQVcpLFxuICBNRVRBREFUQV9FTkNPRElOR19KU09OOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19KU09OKSxcbiAgTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTjogZW5jb2RlKGVuY29kaW5nVHlwZXMuTUVUQURBVEFfRU5DT0RJTkdfUFJPVE9CVUZfSlNPTiksXG4gIE1FVEFEQVRBX0VOQ09ESU5HX1BST1RPQlVGOiBlbmNvZGUoZW5jb2RpbmdUeXBlcy5NRVRBREFUQV9FTkNPRElOR19QUk9UT0JVRiksXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgTUVUQURBVEFfTUVTU0FHRV9UWVBFX0tFWSA9ICdtZXNzYWdlVHlwZSc7XG4iLCJpbXBvcnQgKiBhcyB0aW1lIGZyb20gJy4vdGltZSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IHR5cGUgVGltZXN0YW1wIH0gZnJvbSAnLi90aW1lJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGltZS5vcHRpb25hbFRzVG9Ncyh0cyk7XG59XG5cbi8qKlxuICogTG9zc3kgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIFRpbWVzdGFtcCB0byBudW1iZXIgZHVlIHRvIHBvc3NpYmxlIG92ZXJmbG93XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0c1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICByZXR1cm4gdGltZS50c1RvTXModHMpO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc051bWJlclRvVHMobWlsbGlzKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gdGltZS5tc1RvVHMoc3RyKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gbXNPcHRpb25hbFRvVHMoc3RyOiBEdXJhdGlvbiB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0aW1lLm1zT3B0aW9uYWxUb1RzKHN0cik7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUubXNPcHRpb25hbFRvTnVtYmVyKHZhbCk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1zVG9OdW1iZXIodmFsOiBEdXJhdGlvbik6IG51bWJlciB7XG4gIHJldHVybiB0aW1lLm1zVG9OdW1iZXIodmFsKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKiBAZGVwcmVjYXRlZCAtIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb0RhdGUodHM6IFRpbWVzdGFtcCk6IERhdGUge1xuICByZXR1cm4gdGltZS50c1RvRGF0ZSh0cyk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb0RhdGUodHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRpbWUub3B0aW9uYWxUc1RvRGF0ZSh0cyk7XG59XG4iLCIvLyBQYXN0ZWQgd2l0aCBtb2RpZmljYXRpb25zIGZyb206IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbm9ueWNvL0Zhc3Rlc3RTbWFsbGVzdFRleHRFbmNvZGVyRGVjb2Rlci9tYXN0ZXIvRW5jb2RlckRlY29kZXJUb2dldGhlci5zcmMuanNcbi8qIGVzbGludCBuby1mYWxsdGhyb3VnaDogMCAqL1xuXG5jb25zdCBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuY29uc3QgZW5jb2RlclJlZ2V4cCA9IC9bXFx4ODAtXFx1RDdmZlxcdURDMDAtXFx1RkZGRl18W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXT8vZztcbmNvbnN0IHRtcEJ1ZmZlclUxNiA9IG5ldyBVaW50MTZBcnJheSgzMik7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RGVjb2RlciB7XG4gIGRlY29kZShpbnB1dEFycmF5T3JCdWZmZXI6IFVpbnQ4QXJyYXkgfCBBcnJheUJ1ZmZlciB8IFNoYXJlZEFycmF5QnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbnB1dEFzOCA9IGlucHV0QXJyYXlPckJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBpbnB1dEFycmF5T3JCdWZmZXIgOiBuZXcgVWludDhBcnJheShpbnB1dEFycmF5T3JCdWZmZXIpO1xuXG4gICAgbGV0IHJlc3VsdGluZ1N0cmluZyA9ICcnLFxuICAgICAgdG1wU3RyID0gJycsXG4gICAgICBpbmRleCA9IDAsXG4gICAgICBuZXh0RW5kID0gMCxcbiAgICAgIGNwMCA9IDAsXG4gICAgICBjb2RlUG9pbnQgPSAwLFxuICAgICAgbWluQml0cyA9IDAsXG4gICAgICBjcDEgPSAwLFxuICAgICAgcG9zID0gMCxcbiAgICAgIHRtcCA9IC0xO1xuICAgIGNvbnN0IGxlbiA9IGlucHV0QXM4Lmxlbmd0aCB8IDA7XG4gICAgY29uc3QgbGVuTWludXMzMiA9IChsZW4gLSAzMikgfCAwO1xuICAgIC8vIE5vdGUgdGhhdCB0bXAgcmVwcmVzZW50cyB0aGUgMm5kIGhhbGYgb2YgYSBzdXJyb2dhdGUgcGFpciBpbmNhc2UgYSBzdXJyb2dhdGUgZ2V0cyBkaXZpZGVkIGJldHdlZW4gYmxvY2tzXG4gICAgZm9yICg7IGluZGV4IDwgbGVuOyApIHtcbiAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgIGZvciAoOyBwb3MgPCBuZXh0RW5kOyBpbmRleCA9IChpbmRleCArIDEpIHwgMCwgcG9zID0gKHBvcyArIDEpIHwgMCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICBjcDAgPSBpbnB1dEFzOFtpbmRleF0gJiAweGZmO1xuICAgICAgICBzd2l0Y2ggKGNwMCA+PiA0KSB7XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JpbmcgdW5jaGVja2VkIGluZGV4XG4gICAgICAgICAgICBjcDEgPSBpbnB1dEFzOFsoaW5kZXggPSAoaW5kZXggKyAxKSB8IDApXSAmIDB4ZmY7XG4gICAgICAgICAgICBpZiAoY3AxID4+IDYgIT09IDBiMTAgfHwgMGIxMTExMDExMSA8IGNwMCkge1xuICAgICAgICAgICAgICBpbmRleCA9IChpbmRleCAtIDEpIHwgMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSAoKGNwMCAmIDBiMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSA1OyAvLyAyMCBlbnN1cmVzIGl0IG5ldmVyIHBhc3NlcyAtPiBhbGwgaW52YWxpZCByZXBsYWNlbWVudHNcbiAgICAgICAgICAgIGNwMCA9IDB4MTAwOyAvLyAga2VlcCB0cmFjayBvZiB0aCBiaXQgc2l6ZVxuICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICAgICAgY3AxID0gaW5wdXRBczhbKGluZGV4ID0gKGluZGV4ICsgMSkgfCAwKV0gJiAweGZmO1xuICAgICAgICAgICAgY29kZVBvaW50IDw8PSA2O1xuICAgICAgICAgICAgY29kZVBvaW50IHw9ICgoY3AwICYgMGIxMTExKSA8PCA2KSB8IChjcDEgJiAwYjAwMTExMTExKTtcbiAgICAgICAgICAgIG1pbkJpdHMgPSBjcDEgPj4gNiA9PT0gMGIxMCA/IChtaW5CaXRzICsgNCkgfCAwIDogMjQ7IC8vIDI0IGVuc3VyZXMgaXQgbmV2ZXIgcGFzc2VzIC0+IGFsbCBpbnZhbGlkIHJlcGxhY2VtZW50c1xuICAgICAgICAgICAgY3AwID0gKGNwMCArIDB4MTAwKSAmIDB4MzAwOyAvLyBrZWVwIHRyYWNrIG9mIHRoIGJpdCBzaXplXG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmluZyB1bmNoZWNrZWQgaW5kZXhcbiAgICAgICAgICAgIGNwMSA9IGlucHV0QXM4WyhpbmRleCA9IChpbmRleCArIDEpIHwgMCldICYgMHhmZjtcbiAgICAgICAgICAgIGNvZGVQb2ludCA8PD0gNjtcbiAgICAgICAgICAgIGNvZGVQb2ludCB8PSAoKGNwMCAmIDBiMTExMTEpIDw8IDYpIHwgKGNwMSAmIDBiMDAxMTExMTEpO1xuICAgICAgICAgICAgbWluQml0cyA9IChtaW5CaXRzICsgNykgfCAwO1xuXG4gICAgICAgICAgICAvLyBOb3csIHByb2Nlc3MgdGhlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGlmIChpbmRleCA8IGxlbiAmJiBjcDEgPj4gNiA9PT0gMGIxMCAmJiBjb2RlUG9pbnQgPj4gbWluQml0cyAmJiBjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjcDAgPSBjb2RlUG9pbnQ7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IChjb2RlUG9pbnQgLSAweDEwMDAwKSB8IDA7XG4gICAgICAgICAgICAgIGlmICgwIDw9IGNvZGVQb2ludCAvKjB4ZmZmZiA8IGNvZGVQb2ludCovKSB7XG4gICAgICAgICAgICAgICAgLy8gQk1QIGNvZGUgcG9pbnRcbiAgICAgICAgICAgICAgICAvL25leHRFbmQgPSBuZXh0RW5kIC0gMXwwO1xuXG4gICAgICAgICAgICAgICAgdG1wID0gKChjb2RlUG9pbnQgPj4gMTApICsgMHhkODAwKSB8IDA7IC8vIGhpZ2hTdXJyb2dhdGVcbiAgICAgICAgICAgICAgICBjcDAgPSAoKGNvZGVQb2ludCAmIDB4M2ZmKSArIDB4ZGMwMCkgfCAwOyAvLyBsb3dTdXJyb2dhdGUgKHdpbGwgYmUgaW5zZXJ0ZWQgbGF0ZXIgaW4gdGhlIHN3aXRjaC1zdGF0ZW1lbnQpXG5cbiAgICAgICAgICAgICAgICBpZiAocG9zIDwgMzEpIHtcbiAgICAgICAgICAgICAgICAgIC8vIG5vdGljZSAzMSBpbnN0ZWFkIG9mIDMyXG4gICAgICAgICAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IHRtcDtcbiAgICAgICAgICAgICAgICAgIHBvcyA9IChwb3MgKyAxKSB8IDA7XG4gICAgICAgICAgICAgICAgICB0bXAgPSAtMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gZWxzZSwgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0QXM4IGFuZCBsZXQgdG1wMCBiZSBmaWxsZWQgaW4gbGF0ZXIgb25cbiAgICAgICAgICAgICAgICAgIC8vIE5PVEUgdGhhdCBjcDEgaXMgYmVpbmcgdXNlZCBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSBmb3IgdGhlIHN3YXBwaW5nIG9mIHRtcCB3aXRoIGNwMFxuICAgICAgICAgICAgICAgICAgY3AxID0gdG1wO1xuICAgICAgICAgICAgICAgICAgdG1wID0gY3AwO1xuICAgICAgICAgICAgICAgICAgY3AwID0gY3AxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIG5leHRFbmQgPSAobmV4dEVuZCArIDEpIHwgMDsgLy8gYmVjYXVzZSB3ZSBhcmUgYWR2YW5jaW5nIGkgd2l0aG91dCBhZHZhbmNpbmcgcG9zXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBpbnZhbGlkIGNvZGUgcG9pbnQgbWVhbnMgcmVwbGFjaW5nIHRoZSB3aG9sZSB0aGluZyB3aXRoIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgICBjcDAgPj49IDg7XG4gICAgICAgICAgICAgIGluZGV4ID0gKGluZGV4IC0gY3AwIC0gMSkgfCAwOyAvLyByZXNldCBpbmRleCAgYmFjayB0byB3aGF0IGl0IHdhcyBiZWZvcmVcbiAgICAgICAgICAgICAgY3AwID0gMHhmZmZkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaW5hbGx5LCByZXNldCB0aGUgdmFyaWFibGVzIGZvciB0aGUgbmV4dCBnby1hcm91bmRcbiAgICAgICAgICAgIG1pbkJpdHMgPSAwO1xuICAgICAgICAgICAgY29kZVBvaW50ID0gMDtcbiAgICAgICAgICAgIG5leHRFbmQgPSBpbmRleCA8PSBsZW5NaW51czMyID8gMzIgOiAobGVuIC0gaW5kZXgpIHwgMDtcbiAgICAgICAgICAvKmNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIGNvZGVQb2ludCA/IGNvZGVQb2ludCA9IDAgOiBjcDAgPSAweGZmZmQ7IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IGNwMDtcbiAgICAgICAgICBjb250aW51ZTsqL1xuICAgICAgICAgIGRlZmF1bHQ6IC8vIGZpbGwgd2l0aCBpbnZhbGlkIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuICAgICAgICAgICAgdG1wQnVmZmVyVTE2W3Bvc10gPSBjcDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgfVxuICAgICAgICB0bXBCdWZmZXJVMTZbcG9zXSA9IDB4ZmZmZDsgLy8gZmlsbCB3aXRoIGludmFsaWQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICB9XG4gICAgICB0bXBTdHIgKz0gZnJvbUNoYXJDb2RlKFxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yaW5nIHVuY2hlY2tlZCBpbmRleFxuICAgICAgICB0bXBCdWZmZXJVMTZbMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxXSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzJdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls0XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzVdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNls3XSxcbiAgICAgICAgdG1wQnVmZmVyVTE2WzhdLFxuICAgICAgICB0bXBCdWZmZXJVMTZbOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsxOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyMl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyM10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyNl0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyN10sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlsyOV0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMF0sXG4gICAgICAgIHRtcEJ1ZmZlclUxNlszMV1cbiAgICAgICk7XG4gICAgICBpZiAocG9zIDwgMzIpIHRtcFN0ciA9IHRtcFN0ci5zbGljZSgwLCAocG9zIC0gMzIpIHwgMCk7IC8vLSgzMi1wb3MpKTtcbiAgICAgIGlmIChpbmRleCA8IGxlbikge1xuICAgICAgICAvL2Zyb21DaGFyQ29kZS5hcHBseSgwLCB0bXBCdWZmZXJVMTYgOiBVaW50OEFycmF5ID8gIHRtcEJ1ZmZlclUxNi5zdWJhcnJheSgwLHBvcykgOiB0bXBCdWZmZXJVMTYuc2xpY2UoMCxwb3MpKTtcbiAgICAgICAgdG1wQnVmZmVyVTE2WzBdID0gdG1wO1xuICAgICAgICBwb3MgPSB+dG1wID4+PiAzMTsgLy90bXAgIT09IC0xID8gMSA6IDA7XG4gICAgICAgIHRtcCA9IC0xO1xuXG4gICAgICAgIGlmICh0bXBTdHIubGVuZ3RoIDwgcmVzdWx0aW5nU3RyaW5nLmxlbmd0aCkgY29udGludWU7XG4gICAgICB9IGVsc2UgaWYgKHRtcCAhPT0gLTEpIHtcbiAgICAgICAgdG1wU3RyICs9IGZyb21DaGFyQ29kZSh0bXApO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRpbmdTdHJpbmcgKz0gdG1wU3RyO1xuICAgICAgdG1wU3RyID0gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ1N0cmluZztcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gZW5jb2RlclJlcGxhY2VyKG5vbkFzY2lpQ2hhcnM6IHN0cmluZykge1xuICAvLyBtYWtlIHRoZSBVVEYgc3RyaW5nIGludG8gYSBiaW5hcnkgVVRGLTggZW5jb2RlZCBzdHJpbmdcbiAgbGV0IHBvaW50ID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDApIHwgMDtcbiAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgIGlmIChwb2ludCA8PSAweGRiZmYpIHtcbiAgICAgIGNvbnN0IG5leHRjb2RlID0gbm9uQXNjaWlDaGFycy5jaGFyQ29kZUF0KDEpIHwgMDsgLy8gZGVmYXVsdHMgdG8gMCB3aGVuIE5hTiwgY2F1c2luZyBudWxsIHJlcGxhY2VtZW50IGNoYXJhY3RlclxuXG4gICAgICBpZiAoMHhkYzAwIDw9IG5leHRjb2RlICYmIG5leHRjb2RlIDw9IDB4ZGZmZikge1xuICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICBwb2ludCA9ICgocG9pbnQgPDwgMTApICsgbmV4dGNvZGUgLSAweDM1ZmRjMDApIHwgMDtcbiAgICAgICAgaWYgKHBvaW50ID4gMHhmZmZmKVxuICAgICAgICAgIHJldHVybiBmcm9tQ2hhckNvZGUoXG4gICAgICAgICAgICAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCksXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiAxMikgJiAweDNmKSAvKjBiMDAxMTExMTEqLyxcbiAgICAgICAgICAgICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDYpICYgMHgzZikgLyowYjAwMTExMTExKi8sXG4gICAgICAgICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi9cbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgIHBvaW50ID0gNjU1MzMgLyowYjExMTExMTExMTExMTExMDEqLzsgLy9yZXR1cm4gJ1xceEVGXFx4QkZcXHhCRCc7Ly9mcm9tQ2hhckNvZGUoMHhlZiwgMHhiZiwgMHhiZCk7XG4gICAgfVxuICB9XG4gIC8qaWYgKHBvaW50IDw9IDB4MDA3ZikgcmV0dXJuIG5vbkFzY2lpQ2hhcnM7XG4gIGVsc2UgKi8gaWYgKHBvaW50IDw9IDB4MDdmZikge1xuICAgIHJldHVybiBmcm9tQ2hhckNvZGUoKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KSwgKDB4MiA8PCA2KSB8IChwb2ludCAmIDB4M2YpKTtcbiAgfSBlbHNlXG4gICAgcmV0dXJuIGZyb21DaGFyQ29kZShcbiAgICAgICgweGUgLyowYjExMTAqLyA8PCA0KSB8IChwb2ludCA+PiAxMiksXG4gICAgICAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovLFxuICAgICAgKDB4MiAvKjBiMTAqLyA8PCA2KSB8IChwb2ludCAmIDB4M2YpIC8qMGIwMDExMTExMSovXG4gICAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRFbmNvZGVyIHtcbiAgcHVibGljIGVuY29kZShpbnB1dFN0cmluZzogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgLy8gMHhjMCA9PiAwYjExMDAwMDAwOyAweGZmID0+IDBiMTExMTExMTE7IDB4YzAtMHhmZiA9PiAwYjExeHh4eHh4XG4gICAgLy8gMHg4MCA9PiAwYjEwMDAwMDAwOyAweGJmID0+IDBiMTAxMTExMTE7IDB4ODAtMHhiZiA9PiAwYjEweHh4eHh4XG4gICAgY29uc3QgZW5jb2RlZFN0cmluZyA9IGlucHV0U3RyaW5nID09PSB2b2lkIDAgPyAnJyA6ICcnICsgaW5wdXRTdHJpbmcsXG4gICAgICBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDA7XG4gICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KCgobGVuIDw8IDEpICsgOCkgfCAwKTtcbiAgICBsZXQgdG1wUmVzdWx0OiBVaW50OEFycmF5O1xuICAgIGxldCBpID0gMCxcbiAgICAgIHBvcyA9IDAsXG4gICAgICBwb2ludCA9IDAsXG4gICAgICBuZXh0Y29kZSA9IDA7XG4gICAgbGV0IHVwZ3JhZGVkZWRBcnJheVNpemUgPSAhVWludDhBcnJheTsgLy8gbm9ybWFsIGFycmF5cyBhcmUgYXV0by1leHBhbmRpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpID0gKGkgKyAxKSB8IDAsIHBvcyA9IChwb3MgKyAxKSB8IDApIHtcbiAgICAgIHBvaW50ID0gZW5jb2RlZFN0cmluZy5jaGFyQ29kZUF0KGkpIHwgMDtcbiAgICAgIGlmIChwb2ludCA8PSAweDAwN2YpIHtcbiAgICAgICAgcmVzdWx0W3Bvc10gPSBwb2ludDtcbiAgICAgIH0gZWxzZSBpZiAocG9pbnQgPD0gMHgwN2ZmKSB7XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4NiA8PCA1KSB8IChwb2ludCA+PiA2KTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIDw8IDYpIHwgKHBvaW50ICYgMHgzZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWRlbkNoZWNrOiB7XG4gICAgICAgICAgaWYgKDB4ZDgwMCA8PSBwb2ludCkge1xuICAgICAgICAgICAgaWYgKHBvaW50IDw9IDB4ZGJmZikge1xuICAgICAgICAgICAgICBuZXh0Y29kZSA9IGVuY29kZWRTdHJpbmcuY2hhckNvZGVBdCgoaSA9IChpICsgMSkgfCAwKSkgfCAwOyAvLyBkZWZhdWx0cyB0byAwIHdoZW4gTmFOLCBjYXVzaW5nIG51bGwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG5cbiAgICAgICAgICAgICAgaWYgKDB4ZGMwMCA8PSBuZXh0Y29kZSAmJiBuZXh0Y29kZSA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgICAvL3BvaW50ID0gKChwb2ludCAtIDB4RDgwMCk8PDEwKSArIG5leHRjb2RlIC0gMHhEQzAwICsgMHgxMDAwMHwwO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gKChwb2ludCA8PCAxMCkgKyBuZXh0Y29kZSAtIDB4MzVmZGMwMCkgfCAwO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludCA+IDB4ZmZmZikge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0W3Bvc10gPSAoMHgxZSAvKjBiMTExMTAqLyA8PCAzKSB8IChwb2ludCA+PiAxOCk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAoKHBvaW50ID4+IDEyKSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKHBvaW50ICYgMHgzZikgLyowYjAwMTExMTExKi87XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWsgd2lkZW5DaGVjaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwb2ludCA9IDY1NTMzIC8qMGIxMTExMTExMTExMTExMTAxKi87IC8vcmV0dXJuICdcXHhFRlxceEJGXFx4QkQnOy8vZnJvbUNoYXJDb2RlKDB4ZWYsIDB4YmYsIDB4YmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb2ludCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAgICAgcG9pbnQgPSA2NTUzMyAvKjBiMTExMTExMTExMTExMTEwMSovOyAvL3JldHVybiAnXFx4RUZcXHhCRlxceEJEJzsvL2Zyb21DaGFyQ29kZSgweGVmLCAweGJmLCAweGJkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF1cGdyYWRlZGVkQXJyYXlTaXplICYmIGkgPDwgMSA8IHBvcyAmJiBpIDw8IDEgPCAoKHBvcyAtIDcpIHwgMCkpIHtcbiAgICAgICAgICAgIHVwZ3JhZGVkZWRBcnJheVNpemUgPSB0cnVlO1xuICAgICAgICAgICAgdG1wUmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuICogMyk7XG4gICAgICAgICAgICB0bXBSZXN1bHQuc2V0KHJlc3VsdCk7XG4gICAgICAgICAgICByZXN1bHQgPSB0bXBSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtwb3NdID0gKDB4ZSAvKjBiMTExMCovIDw8IDQpIHwgKHBvaW50ID4+IDEyKTtcbiAgICAgICAgcmVzdWx0Wyhwb3MgPSAocG9zICsgMSkgfCAwKV0gPSAoMHgyIC8qMGIxMCovIDw8IDYpIHwgKChwb2ludCA+PiA2KSAmIDB4M2YpIC8qMGIwMDExMTExMSovO1xuICAgICAgICByZXN1bHRbKHBvcyA9IChwb3MgKyAxKSB8IDApXSA9ICgweDIgLyowYjEwKi8gPDwgNikgfCAocG9pbnQgJiAweDNmKSAvKjBiMDAxMTExMTEqLztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkgPyByZXN1bHQuc3ViYXJyYXkoMCwgcG9zKSA6IHJlc3VsdC5zbGljZSgwLCBwb3MpO1xuICB9XG5cbiAgcHVibGljIGVuY29kZUludG8oaW5wdXRTdHJpbmc6IHN0cmluZywgdThBcnI6IFVpbnQ4QXJyYXkpOiB7IHdyaXR0ZW46IG51bWJlcjsgcmVhZDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IGVuY29kZWRTdHJpbmcgPSBpbnB1dFN0cmluZyA9PT0gdm9pZCAwID8gJycgOiAoJycgKyBpbnB1dFN0cmluZykucmVwbGFjZShlbmNvZGVyUmVnZXhwLCBlbmNvZGVyUmVwbGFjZXIpO1xuICAgIGxldCBsZW4gPSBlbmNvZGVkU3RyaW5nLmxlbmd0aCB8IDAsXG4gICAgICBpID0gMCxcbiAgICAgIGNoYXIgPSAwLFxuICAgICAgcmVhZCA9IDA7XG4gICAgY29uc3QgdThBcnJMZW4gPSB1OEFyci5sZW5ndGggfCAwO1xuICAgIGNvbnN0IGlucHV0TGVuZ3RoID0gaW5wdXRTdHJpbmcubGVuZ3RoIHwgMDtcbiAgICBpZiAodThBcnJMZW4gPCBsZW4pIGxlbiA9IHU4QXJyTGVuO1xuICAgIHB1dENoYXJzOiB7XG4gICAgICBmb3IgKDsgaSA8IGxlbjsgaSA9IChpICsgMSkgfCAwKSB7XG4gICAgICAgIGNoYXIgPSBlbmNvZGVkU3RyaW5nLmNoYXJDb2RlQXQoaSkgfCAwO1xuICAgICAgICBzd2l0Y2ggKGNoYXIgPj4gNCkge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgLy8gZXh0ZW5zaW9uIHBvaW50czpcbiAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGlmICgoKGkgKyAxKSB8IDApIDwgdThBcnJMZW4pIHtcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgaWYgKCgoaSArIDIpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICAvL2lmICghKGNoYXIgPT09IDB4RUYgJiYgZW5jb2RlZFN0cmluZy5zdWJzdHIoaSsxfDAsMikgPT09IFwiXFx4QkZcXHhCRFwiKSlcbiAgICAgICAgICAgICAgcmVhZCA9IChyZWFkICsgMSkgfCAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgaWYgKCgoaSArIDMpIHwgMCkgPCB1OEFyckxlbikge1xuICAgICAgICAgICAgICByZWFkID0gKHJlYWQgKyAxKSB8IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhayBwdXRDaGFycztcbiAgICAgICAgfVxuICAgICAgICAvL3JlYWQgPSByZWFkICsgKChjaGFyID4+IDYpICE9PSAyKSB8MDtcbiAgICAgICAgdThBcnJbaV0gPSBjaGFyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB3cml0dGVuOiBpLCByZWFkOiBpbnB1dExlbmd0aCA8IHJlYWQgPyBpbnB1dExlbmd0aCA6IHJlYWQgfTtcbiAgfVxufVxuXG4vKipcbiAqIEVuY29kZSBhIFVURi04IHN0cmluZyBpbnRvIGEgVWludDhBcnJheVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZShzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBVaW50OEFycmF5IGludG8gYSBVVEYtOCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShhOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIFRleHREZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUoYSk7XG59XG4iLCJpbXBvcnQgeyBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvciB9IGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuLyoqXG4gKiBUaHJvd24gZnJvbSBjb2RlIHRoYXQgcmVjZWl2ZXMgYSB2YWx1ZSB0aGF0IGlzIHVuZXhwZWN0ZWQgb3IgdGhhdCBpdCdzIHVuYWJsZSB0byBoYW5kbGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignVmFsdWVFcnJvcicpXG5leHBvcnQgY2xhc3MgVmFsdWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSA/PyB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBQYXlsb2FkIENvbnZlcnRlciBpcyBtaXNjb25maWd1cmVkLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1BheWxvYWRDb252ZXJ0ZXJFcnJvcicpXG5leHBvcnQgY2xhc3MgUGF5bG9hZENvbnZlcnRlckVycm9yIGV4dGVuZHMgVmFsdWVFcnJvciB7fVxuXG4vKipcbiAqIFNpZ25hbHMgdGhhdCBhIHJlcXVlc3RlZCBvcGVyYXRpb24gY2FuJ3QgYmUgY29tcGxldGVkIGJlY2F1c2UgaXQgaXMgaWxsZWdhbCBnaXZlbiB0aGVcbiAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9iamVjdDsgZS5nLiB0cnlpbmcgdG8gdXNlIGEgcmVzb3VyY2UgYWZ0ZXIgaXQgaGFzIGJlZW4gY2xvc2VkLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0lsbGVnYWxTdGF0ZUVycm9yJylcbmV4cG9ydCBjbGFzcyBJbGxlZ2FsU3RhdGVFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBXb3JrZmxvdyB3aXRoIHRoZSBnaXZlbiBJZCBpcyBub3Qga25vd24gdG8gVGVtcG9yYWwgU2VydmVyLlxuICogSXQgY291bGQgYmUgYmVjYXVzZTpcbiAqIC0gSWQgcGFzc2VkIGlzIGluY29ycmVjdFxuICogLSBXb3JrZmxvdyBpcyBjbG9zZWQgKGZvciBzb21lIGNhbGxzLCBlLmcuIGB0ZXJtaW5hdGVgKVxuICogLSBXb3JrZmxvdyB3YXMgZGVsZXRlZCBmcm9tIHRoZSBTZXJ2ZXIgYWZ0ZXIgcmVhY2hpbmcgaXRzIHJldGVudGlvbiBsaW1pdFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1dvcmtmbG93Tm90Rm91bmRFcnJvcicpXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIGlzIG5vdCBrbm93biB0byBUZW1wb3JhbCBTZXJ2ZXIuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignTmFtZXNwYWNlTm90Rm91bmRFcnJvcicpXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYE5hbWVzcGFjZSBub3QgZm91bmQ6ICcke25hbWVzcGFjZX0nYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdyB0aGlzIGVycm9yIGZyb20gYW4gQWN0aXZpdHkgaW4gb3JkZXIgdG8gbWFrZSB0aGUgV29ya2VyIGZvcmdldCBhYm91dCB0aGlzIEFjdGl2aXR5LlxuICpcbiAqIFRoZSBBY3Rpdml0eSBjYW4gdGhlbiBiZSBjb21wbGV0ZWQgYXN5bmNocm9ub3VzbHkgKGZyb20gYW55d2hlcmXigJR1c3VhbGx5IG91dHNpZGUgdGhlIFdvcmtlcikgdXNpbmdcbiAqIHRoZSBDbGllbnQncyBhY3Rpdml0eSBoYW5kbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICppbXBvcnQgeyBDb21wbGV0ZUFzeW5jRXJyb3IgfSBmcm9tICdAdGVtcG9yYWxpby9hY3Rpdml0eSc7XG4gKlxuICpleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlBY3Rpdml0eSgpOiBQcm9taXNlPG5ldmVyPiB7XG4gKiAgLy8gLi4uXG4gKiAgdGhyb3cgbmV3IENvbXBsZXRlQXN5bmNFcnJvcigpO1xuICp9XG4gKiBgYGBcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdDb21wbGV0ZUFzeW5jRXJyb3InKVxuZXhwb3J0IGNsYXNzIENvbXBsZXRlQXN5bmNFcnJvciBleHRlbmRzIEVycm9yIHt9XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBpc1JlY29yZCwgU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzIH0gZnJvbSAnLi9pbnRlcm5hbC13b3JrZmxvdyc7XG5cbmV4cG9ydCBjb25zdCBGQUlMVVJFX1NPVVJDRSA9ICdUeXBlU2NyaXB0U0RLJztcbmV4cG9ydCB0eXBlIFByb3RvRmFpbHVyZSA9IHRlbXBvcmFsLmFwaS5mYWlsdXJlLnYxLklGYWlsdXJlO1xuXG5leHBvcnQgY29uc3QgVGltZW91dFR5cGUgPSB7XG4gIFNUQVJUX1RPX0NMT1NFOiAnU1RBUlRfVE9fQ0xPU0UnLFxuICBTQ0hFRFVMRV9UT19TVEFSVDogJ1NDSEVEVUxFX1RPX1NUQVJUJyxcbiAgU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG4gIEhFQVJUQkVBVDogJ0hFQVJUQkVBVCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU1RBUlRfVE9fQ0xPU0V9IGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9TVEFSVF9UT19DTE9TRTogJ1NUQVJUX1RPX0NMT1NFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBTQ0hFRFVMRV9UT19TVEFSVH0gaW5zdGVhZC4gKi9cbiAgVElNRU9VVF9UWVBFX1NDSEVEVUxFX1RPX1NUQVJUOiAnU0NIRURVTEVfVE9fU1RBUlQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFNDSEVEVUxFX1RPX0NMT1NFfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfU0NIRURVTEVfVE9fQ0xPU0U6ICdTQ0hFRFVMRV9UT19DTE9TRScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSEVBUlRCRUFUfSBpbnN0ZWFkLiAqL1xuICBUSU1FT1VUX1RZUEVfSEVBUlRCRUFUOiAnSEVBUlRCRUFUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGB1bmRlZmluZWRgIGluc3RlYWQuICovXG4gIFRJTUVPVVRfVFlQRV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFRpbWVvdXRUeXBlID0gKHR5cGVvZiBUaW1lb3V0VHlwZSlba2V5b2YgdHlwZW9mIFRpbWVvdXRUeXBlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVUaW1lb3V0VHlwZSwgZGVjb2RlVGltZW91dFR5cGVdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAga2V5b2YgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5UaW1lb3V0VHlwZSxcbiAgdHlwZW9mIFRpbWVvdXRUeXBlLFxuICAnVElNRU9VVF9UWVBFXydcbj4oXG4gIHtcbiAgICBbVGltZW91dFR5cGUuU1RBUlRfVE9fQ0xPU0VdOiAxLFxuICAgIFtUaW1lb3V0VHlwZS5TQ0hFRFVMRV9UT19TVEFSVF06IDIsXG4gICAgW1RpbWVvdXRUeXBlLlNDSEVEVUxFX1RPX0NMT1NFXTogMyxcbiAgICBbVGltZW91dFR5cGUuSEVBUlRCRUFUXTogNCxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1RJTUVPVVRfVFlQRV8nXG4pO1xuXG5leHBvcnQgY29uc3QgUmV0cnlTdGF0ZSA9IHtcbiAgSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG4gIE5PTl9SRVRSWUFCTEVfRkFJTFVSRTogJ05PTl9SRVRSWUFCTEVfRkFJTFVSRScsXG4gIFRJTUVPVVQ6ICdUSU1FT1VUJyxcbiAgTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEOiAnTUFYSU1VTV9BVFRFTVBUU19SRUFDSEVEJyxcbiAgUkVUUllfUE9MSUNZX05PVF9TRVQ6ICdSRVRSWV9QT0xJQ1lfTk9UX1NFVCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gIENBTkNFTF9SRVFVRVNURUQ6ICdDQU5DRUxfUkVRVUVTVEVEJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBJTl9QUk9HUkVTU30gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5fUFJPR1JFU1M6ICdJTl9QUk9HUkVTUycsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTk9OX1JFVFJZQUJMRV9GQUlMVVJFfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9OT05fUkVUUllBQkxFX0ZBSUxVUkU6ICdOT05fUkVUUllBQkxFX0ZBSUxVUkUnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFRJTUVPVVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1RJTUVPVVQ6ICdUSU1FT1VUJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNQVhJTVVNX0FUVEVNUFRTX1JFQUNIRUR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRDogJ01BWElNVU1fQVRURU1QVFNfUkVBQ0hFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUkVUUllfUE9MSUNZX05PVF9TRVR9IGluc3RlYWQuICovXG4gIFJFVFJZX1NUQVRFX1JFVFJZX1BPTElDWV9OT1RfU0VUOiAnUkVUUllfUE9MSUNZX05PVF9TRVQnLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIElOVEVSTkFMX1NFUlZFUl9FUlJPUn0gaW5zdGVhZC4gKi9cbiAgUkVUUllfU1RBVEVfSU5URVJOQUxfU0VSVkVSX0VSUk9SOiAnSU5URVJOQUxfU0VSVkVSX0VSUk9SJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDQU5DRUxfUkVRVUVTVEVEfSBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9DQU5DRUxfUkVRVUVTVEVEOiAnQ0FOQ0VMX1JFUVVFU1RFRCcsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgdW5kZWZpbmVkYCBpbnN0ZWFkLiAqL1xuICBSRVRSWV9TVEFURV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJldHJ5U3RhdGUgPSAodHlwZW9mIFJldHJ5U3RhdGUpW2tleW9mIHR5cGVvZiBSZXRyeVN0YXRlXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVSZXRyeVN0YXRlLCBkZWNvZGVSZXRyeVN0YXRlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuUmV0cnlTdGF0ZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5SZXRyeVN0YXRlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlJldHJ5U3RhdGUsXG4gIHR5cGVvZiBSZXRyeVN0YXRlLFxuICAnUkVUUllfU1RBVEVfJ1xuPihcbiAge1xuICAgIFtSZXRyeVN0YXRlLklOX1BST0dSRVNTXTogMSxcbiAgICBbUmV0cnlTdGF0ZS5OT05fUkVUUllBQkxFX0ZBSUxVUkVdOiAyLFxuICAgIFtSZXRyeVN0YXRlLlRJTUVPVVRdOiAzLFxuICAgIFtSZXRyeVN0YXRlLk1BWElNVU1fQVRURU1QVFNfUkVBQ0hFRF06IDQsXG4gICAgW1JldHJ5U3RhdGUuUkVUUllfUE9MSUNZX05PVF9TRVRdOiA1LFxuICAgIFtSZXRyeVN0YXRlLklOVEVSTkFMX1NFUlZFUl9FUlJPUl06IDYsXG4gICAgW1JldHJ5U3RhdGUuQ0FOQ0VMX1JFUVVFU1RFRF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdSRVRSWV9TVEFURV8nXG4pO1xuXG4vKipcbiAqIEEgY2F0ZWdvcnkgdG8gZGVzY3JpYmUgdGhlIHNldmVyaXR5IGFuZCBjaGFuZ2UgdGhlIG9ic2VydmFiaWxpdHkgYmVoYXZpb3Igb2YgYW4gYXBwbGljYXRpb24gZmFpbHVyZS5cbiAqXG4gKiBDdXJyZW50bHksIG9ic2VydmFiaWxpdHkgYmVoYXZpb3IgY2hhbmdlcyBhcmUgbGltaXRlZCB0bzpcbiAqIC0gYWN0aXZpdGllcyB0aGF0IGZhaWwgZHVlIHRvIGEgQkVOSUdOIGFwcGxpY2F0aW9uIGZhaWx1cmUgZW1pdCBERUJVRyBsZXZlbCBsb2dzIGFuZCBkbyBub3QgcmVjb3JkIG1ldHJpY3NcbiAqXG4gKiBAZXhwZXJpbWVudGFsIENhdGVnb3J5IGlzIGEgbmV3IGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0ge1xuICBCRU5JR046ICdCRU5JR04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5ID0gKHR5cGVvZiBBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSlba2V5b2YgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeSwgZGVjb2RlQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5BcHBsaWNhdGlvbkVycm9yQ2F0ZWdvcnksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQXBwbGljYXRpb25FcnJvckNhdGVnb3J5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkFwcGxpY2F0aW9uRXJyb3JDYXRlZ29yeSxcbiAgdHlwZW9mIEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuPihcbiAge1xuICAgIFtBcHBsaWNhdGlvbkZhaWx1cmVDYXRlZ29yeS5CRU5JR05dOiAxLFxuICAgIFVOU1BFQ0lGSUVEOiAwLFxuICB9IGFzIGNvbnN0LFxuICAnQVBQTElDQVRJT05fRVJST1JfQ0FURUdPUllfJ1xuKTtcblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dFeGVjdXRpb24gPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklXb3JrZmxvd0V4ZWN1dGlvbjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGZhaWx1cmVzIHRoYXQgY2FuIGNyb3NzIFdvcmtmbG93IGFuZCBBY3Rpdml0eSBib3VuZGFyaWVzLlxuICpcbiAqICoqTmV2ZXIgZXh0ZW5kIHRoaXMgY2xhc3Mgb3IgYW55IG9mIGl0cyBjaGlsZHJlbi4qKlxuICpcbiAqIFRoZSBvbmx5IGNoaWxkIGNsYXNzIHlvdSBzaG91bGQgZXZlciB0aHJvdyBmcm9tIHlvdXIgY29kZSBpcyB7QGxpbmsgQXBwbGljYXRpb25GYWlsdXJlfS5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdUZW1wb3JhbEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIFRlbXBvcmFsRmFpbHVyZSBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBmYWlsdXJlIHRoYXQgY29uc3RydWN0ZWQgdGhpcyBlcnJvci5cbiAgICpcbiAgICogT25seSBwcmVzZW50IGlmIHRoaXMgZXJyb3Igd2FzIGdlbmVyYXRlZCBmcm9tIGFuIGV4dGVybmFsIG9wZXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmYWlsdXJlPzogUHJvdG9GYWlsdXJlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UgPz8gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG4vKiogRXhjZXB0aW9ucyBvcmlnaW5hdGVkIGF0IHRoZSBUZW1wb3JhbCBzZXJ2aWNlLiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdTZXJ2ZXJGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBTZXJ2ZXJGYWlsdXJlIGV4dGVuZHMgVGVtcG9yYWxGYWlsdXJlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU6IGJvb2xlYW4sXG4gICAgY2F1c2U/OiBFcnJvclxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYHMgYXJlIHVzZWQgdG8gY29tbXVuaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgZmFpbHVyZXMgaW4gV29ya2Zsb3dzIGFuZCBBY3Rpdml0aWVzLlxuICpcbiAqIFRoZSB7QGxpbmsgdHlwZX0gcHJvcGVydHkgaXMgbWF0Y2hlZCBhZ2FpbnN0IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSB0byBkZXRlcm1pbmUgaWYgYW4gaW5zdGFuY2VcbiAqIG9mIHRoaXMgZXJyb3IgaXMgcmV0cnlhYmxlLiBBbm90aGVyIHdheSB0byBhdm9pZCByZXRyeWluZyBpcyBieSBzZXR0aW5nIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHRvIGB0cnVlYC5cbiAqXG4gKiBJbiBXb3JrZmxvd3MsIGlmIHlvdSB0aHJvdyBhIG5vbi1gQXBwbGljYXRpb25GYWlsdXJlYCwgdGhlIFdvcmtmbG93IFRhc2sgd2lsbCBmYWlsIGFuZCBiZSByZXRyaWVkLiBJZiB5b3UgdGhyb3cgYW5cbiAqIGBBcHBsaWNhdGlvbkZhaWx1cmVgLCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIHdpbGwgZmFpbC5cbiAqXG4gKiBJbiBBY3Rpdml0aWVzLCB5b3UgY2FuIGVpdGhlciB0aHJvdyBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCBvciBhbm90aGVyIGBFcnJvcmAgdG8gZmFpbCB0aGUgQWN0aXZpdHkgVGFzay4gSW4gdGhlXG4gKiBsYXR0ZXIgY2FzZSwgdGhlIGBFcnJvcmAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAuIFRoZSBjb252ZXJzaW9uIGlzIGRvbmUgYXMgZm9sbG93aW5nOlxuICpcbiAqIC0gYHR5cGVgIGlzIHNldCB0byBgZXJyb3IuY29uc3RydWN0b3I/Lm5hbWUgPz8gZXJyb3IubmFtZWBcbiAqIC0gYG1lc3NhZ2VgIGlzIHNldCB0byBgZXJyb3IubWVzc2FnZWBcbiAqIC0gYG5vblJldHJ5YWJsZWAgaXMgc2V0IHRvIGZhbHNlXG4gKiAtIGBkZXRhaWxzYCBhcmUgc2V0IHRvIG51bGxcbiAqIC0gc3RhY2sgdHJhY2UgaXMgY29waWVkIGZyb20gdGhlIG9yaWdpbmFsIGVycm9yXG4gKlxuICogV2hlbiBhbiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtYW4tYWN0aXZpdHktZXhlY3V0aW9uIHwgQWN0aXZpdHkgRXhlY3V0aW9ufSBmYWlscywgdGhlXG4gKiBgQXBwbGljYXRpb25GYWlsdXJlYCBmcm9tIHRoZSBsYXN0IEFjdGl2aXR5IFRhc2sgd2lsbCBiZSB0aGUgYGNhdXNlYCBvZiB0aGUge0BsaW5rIEFjdGl2aXR5RmFpbHVyZX0gdGhyb3duIGluIHRoZVxuICogV29ya2Zsb3cuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQXBwbGljYXRpb25GYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICAvKipcbiAgICogQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmcm9tRXJyb3J9IG9yIHtAbGluayBjcmVhdGV9LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsLFxuICAgIHB1YmxpYyByZWFkb25seSBub25SZXRyeWFibGU/OiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25bXSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgY2F1c2U/OiBFcnJvcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmV4dFJldHJ5RGVsYXk/OiBEdXJhdGlvbiB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5PzogQXBwbGljYXRpb25GYWlsdXJlQ2F0ZWdvcnkgfCB1bmRlZmluZWQgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgZnJvbSBhbiBFcnJvciBvYmplY3QuXG4gICAqXG4gICAqIEZpcnN0IGNhbGxzIHtAbGluayBlbnN1cmVBcHBsaWNhdGlvbkZhaWx1cmUgfCBgZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycm9yKWB9IGFuZCB0aGVuIG92ZXJyaWRlcyBhbnkgZmllbGRzXG4gICAqIHByb3ZpZGVkIGluIGBvdmVycmlkZXNgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yIHwgdW5rbm93biwgb3ZlcnJpZGVzPzogQXBwbGljYXRpb25GYWlsdXJlT3B0aW9ucyk6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gICAgY29uc3QgZmFpbHVyZSA9IGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcik7XG4gICAgT2JqZWN0LmFzc2lnbihmYWlsdXJlLCBvdmVycmlkZXMpO1xuICAgIHJldHVybiBmYWlsdXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgd2lsbCBiZSByZXRyeWFibGUgKHVubGVzcyBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBBcHBsaWNhdGlvbkZhaWx1cmVPcHRpb25zKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIHR5cGUsIG5vblJldHJ5YWJsZSA9IGZhbHNlLCBkZXRhaWxzLCBuZXh0UmV0cnlEZWxheSwgY2F1c2UsIGNhdGVnb3J5IH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlLCBub25SZXRyeWFibGUsIGRldGFpbHMsIGNhdXNlLCBuZXh0UmV0cnlEZWxheSwgY2F0ZWdvcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoIHRoZSB7QGxpbmsgbm9uUmV0cnlhYmxlfSBmbGFnIHNldCB0byBmYWxzZS4gTm90ZSB0aGF0IHRoaXMgZXJyb3Igd2lsbCBzdGlsbFxuICAgKiBub3QgYmUgcmV0cmllZCBpZiBpdHMgYHR5cGVgIGlzIGluY2x1ZGVkIGluIHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlICh1c2VkIGJ5IHtAbGluayBSZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzfSlcbiAgICogQHBhcmFtIGRldGFpbHMgT3B0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZS4gU2VyaWFsaXplZCBieSB0aGUgV29ya2VyJ3Mge0BsaW5rIFBheWxvYWRDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXRyeWFibGUobWVzc2FnZT86IHN0cmluZyB8IG51bGwsIHR5cGU/OiBzdHJpbmcgfCBudWxsLCAuLi5kZXRhaWxzOiB1bmtub3duW10pOiBBcHBsaWNhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiBuZXcgdGhpcyhtZXNzYWdlLCB0eXBlID8/ICdFcnJvcicsIGZhbHNlLCBkZXRhaWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBuZXcgYEFwcGxpY2F0aW9uRmFpbHVyZWAgd2l0aCB0aGUge0BsaW5rIG5vblJldHJ5YWJsZX0gZmxhZyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogV2hlbiB0aHJvd24gZnJvbSBhbiBBY3Rpdml0eSBvciBXb3JrZmxvdywgdGhlIEFjdGl2aXR5IG9yIFdvcmtmbG93IHdpbGwgbm90IGJlIHJldHJpZWQgKGV2ZW4gaWYgYHR5cGVgIGlzIG5vdFxuICAgKiBsaXN0ZWQgaW4ge0BsaW5rIFJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXN9KS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgT3B0aW9uYWwgZXJyb3IgbWVzc2FnZVxuICAgKiBAcGFyYW0gdHlwZSBPcHRpb25hbCBlcnJvciB0eXBlXG4gICAqIEBwYXJhbSBkZXRhaWxzIE9wdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUuIFNlcmlhbGl6ZWQgYnkgdGhlIFdvcmtlcidzIHtAbGluayBQYXlsb2FkQ29udmVydGVyfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbm9uUmV0cnlhYmxlKG1lc3NhZ2U/OiBzdHJpbmcgfCBudWxsLCB0eXBlPzogc3RyaW5nIHwgbnVsbCwgLi4uZGV0YWlsczogdW5rbm93bltdKTogQXBwbGljYXRpb25GYWlsdXJlIHtcbiAgICByZXR1cm4gbmV3IHRoaXMobWVzc2FnZSwgdHlwZSA/PyAnRXJyb3InLCB0cnVlLCBkZXRhaWxzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRmFpbHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogRXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogRXJyb3IgdHlwZSAodXNlZCBieSB7QGxpbmsgUmV0cnlQb2xpY3kubm9uUmV0cnlhYmxlRXJyb3JUeXBlc30pXG4gICAqL1xuICB0eXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IEFjdGl2aXR5IG9yIFdvcmtmbG93IGNhbiBiZSByZXRyaWVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub25SZXRyeWFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlLiBTZXJpYWxpemVkIGJ5IHRoZSBXb3JrZXIncyB7QGxpbmsgUGF5bG9hZENvbnZlcnRlcn0uXG4gICAqL1xuICBkZXRhaWxzPzogdW5rbm93bltdO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIG92ZXJyaWRlcyB0aGUgZGVsYXkgdW50aWwgdGhlIG5leHQgcmV0cnkgb2YgdGhpcyBBY3Rpdml0eSAvIFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFJldHJ5IGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgc3ViamVjdCB0byB0aGUgbWF4aW11bSByZXRyaWVzIGxpbWl0IGFuZCB0b3RhbCB0aW1lIGxpbWl0IGRlZmluZWRcbiAgICogYnkgdGhlIHBvbGljeS5cbiAgICovXG4gIG5leHRSZXRyeURlbGF5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIENhdXNlIG9mIHRoZSBmYWlsdXJlXG4gICAqL1xuICBjYXVzZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXZlcml0eSBjYXRlZ29yeSBvZiB0aGUgYXBwbGljYXRpb24gZXJyb3IuXG4gICAqIEFmZmVjdHMgd29ya2VyLXNpZGUgbG9nZ2luZyBhbmQgbWV0cmljcyBiZWhhdmlvciBvZiB0aGlzIGZhaWx1cmUuXG4gICAqL1xuICBjYXRlZ29yeT86IEFwcGxpY2F0aW9uRmFpbHVyZUNhdGVnb3J5O1xufVxuXG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gQ2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC4gVG8gYWxsb3cgQ2FuY2VsbGF0aW9uIHRvIGhhcHBlbiwgbGV0IGl0IHByb3BhZ2F0ZS4gVG9cbiAqIGlnbm9yZSBDYW5jZWxsYXRpb24sIGNhdGNoIGl0IGFuZCBjb250aW51ZSBleGVjdXRpbmcuIE5vdGUgdGhhdCBDYW5jZWxsYXRpb24gY2FuIG9ubHkgYmUgcmVxdWVzdGVkIGEgc2luZ2xlIHRpbWUsIHNvXG4gKiB5b3VyIFdvcmtmbG93L0FjdGl2aXR5IEV4ZWN1dGlvbiB3aWxsIG5vdCByZWNlaXZlIGZ1cnRoZXIgQ2FuY2VsbGF0aW9uIHJlcXVlc3RzLlxuICpcbiAqIFdoZW4gYSBXb3JrZmxvdyBvciBBY3Rpdml0eSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCBhIGBDYW5jZWxsZWRGYWlsdXJlYCB3aWxsIGJlIHRoZSBgY2F1c2VgLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NhbmNlbGxlZEZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIENhbmNlbGxlZEZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGRldGFpbHM6IHVua25vd25bXSA9IFtdLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgYGNhdXNlYCB3aGVuIGEgV29ya2Zsb3cgaGFzIGJlZW4gdGVybWluYXRlZFxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1Rlcm1pbmF0ZWRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUZXJtaW5hdGVkRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F1c2U/OiBFcnJvcikge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgdG8gcmVwcmVzZW50IHRpbWVvdXRzIG9mIEFjdGl2aXRpZXMgYW5kIFdvcmtmbG93c1xuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ1RpbWVvdXRGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBUaW1lb3V0RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdEhlYXJ0YmVhdERldGFpbHM6IHVua25vd24sXG4gICAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXRUeXBlOiBUaW1lb3V0VHlwZVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIEFjdGl2aXR5IGZhaWx1cmUuIEFsd2F5cyBjb250YWlucyB0aGUgb3JpZ2luYWwgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBhcyBpdHMgYGNhdXNlYC5cbiAqIEZvciBleGFtcGxlLCBpZiBhbiBBY3Rpdml0eSB0aW1lZCBvdXQsIHRoZSBjYXVzZSB3aWxsIGJlIGEge0BsaW5rIFRpbWVvdXRGYWlsdXJlfS5cbiAqXG4gKiBUaGlzIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gb25seSBieSB0aGUgZnJhbWV3b3JrIGNvZGUuXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQWN0aXZpdHlGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUZhaWx1cmUgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWN0aXZpdHlJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIHB1YmxpYyByZWFkb25seSBpZGVudGl0eTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xuICB9XG59XG5cbi8qKlxuICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBDaGlsZCBXb3JrZmxvdyBmYWlsdXJlLiBBbHdheXMgY29udGFpbnMgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgYXMgaXRzIHtAbGluayBjYXVzZX0uXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIENoaWxkIHdhcyBUZXJtaW5hdGVkLCB0aGUgYGNhdXNlYCBpcyBhIHtAbGluayBUZXJtaW5hdGVkRmFpbHVyZX0uXG4gKlxuICogVGhpcyBleGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIG9ubHkgYnkgdGhlIGZyYW1ld29yayBjb2RlLlxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0NoaWxkV29ya2Zsb3dGYWlsdXJlJylcbmV4cG9ydCBjbGFzcyBDaGlsZFdvcmtmbG93RmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvbjogV29ya2Zsb3dFeGVjdXRpb24sXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZXRyeVN0YXRlOiBSZXRyeVN0YXRlLFxuICAgIGNhdXNlPzogRXJyb3JcbiAgKSB7XG4gICAgc3VwZXIoJ0NoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBmYWlsZWQnLCBjYXVzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIE5leHVzIE9wZXJhdGlvbiBleGVjdXRlZCBpbnNpZGUgYSBXb3JrZmxvdyBmYWlscy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdOZXh1c09wZXJhdGlvbkZhaWx1cmUnKVxuZXhwb3J0IGNsYXNzIE5leHVzT3BlcmF0aW9uRmFpbHVyZSBleHRlbmRzIFRlbXBvcmFsRmFpbHVyZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlZEV2ZW50SWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjYXVzZT86IEVycm9yXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgfVxufVxuXG4vLyBUT0RPKG5leHVzL2Vycm9yKTogTWF5YmUgYWRkIGEgTmV4dXNIYW5kbGVyRmFpbHVyZSBjbGFzcyBoZXJlLCBvbmNlIHdlJ3ZlIGRlY2lkZWQgb24gZXJyb3IgaGFuZGxpbmcuXG5cbi8qKlxuICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gKiAgLSBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIFdvcmtmbG93IElEIGlzIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3l9IGlzIGBXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfRkFJTGBcbiAqICAtIFRoZXJlIGlzIGEgY2xvc2VkIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgV29ya2Zsb3cgSWQgYW5kIHRoZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRSZXVzZVBvbGljeX1cbiAqICAgIGlzIGBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfUkVKRUNUX0RVUExJQ0FURWBcbiAqICAtIFRoZXJlIGlzIGNsb3NlZCBXb3JrZmxvdyBpbiB0aGUgYENvbXBsZXRlZGAgc3RhdGUgd2l0aCB0aGUgc2FtZSBXb3JrZmxvdyBJZCBhbmQgdGhlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fVxuICogICAgaXMgYFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFlgXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignV29ya2Zsb3dFeGVjdXRpb25BbHJlYWR5U3RhcnRlZEVycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IgZXh0ZW5kcyBUZW1wb3JhbEZhaWx1cmUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBgZXJyb3JgIGlzIGFscmVhZHkgYW4gYEFwcGxpY2F0aW9uRmFpbHVyZWAsIHJldHVybnMgYGVycm9yYC5cbiAqXG4gKiBPdGhlcndpc2UsIGNvbnZlcnRzIGBlcnJvcmAgaW50byBhbiBgQXBwbGljYXRpb25GYWlsdXJlYCB3aXRoOlxuICpcbiAqIC0gYG1lc3NhZ2VgOiBgZXJyb3IubWVzc2FnZWAgb3IgYFN0cmluZyhlcnJvcilgXG4gKiAtIGB0eXBlYDogYGVycm9yLmNvbnN0cnVjdG9yLm5hbWVgIG9yIGBlcnJvci5uYW1lYFxuICogLSBgc3RhY2tgOiBgZXJyb3Iuc3RhY2tgIG9yIGAnJ2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUFwcGxpY2F0aW9uRmFpbHVyZShlcnJvcjogdW5rbm93bik6IEFwcGxpY2F0aW9uRmFpbHVyZSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSAoaXNSZWNvcmQoZXJyb3IpICYmIFN0cmluZyhlcnJvci5tZXNzYWdlKSkgfHwgU3RyaW5nKGVycm9yKTtcbiAgY29uc3QgdHlwZSA9IChpc1JlY29yZChlcnJvcikgJiYgKGVycm9yLmNvbnN0cnVjdG9yPy5uYW1lID8/IGVycm9yLm5hbWUpKSB8fCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZhaWx1cmUgPSBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHsgbWVzc2FnZSwgdHlwZSwgbm9uUmV0cnlhYmxlOiBmYWxzZSB9KTtcbiAgZmFpbHVyZS5zdGFjayA9IChpc1JlY29yZChlcnJvcikgJiYgU3RyaW5nKGVycm9yLnN0YWNrKSkgfHwgJyc7XG4gIHJldHVybiBmYWlsdXJlO1xufVxuXG4vKipcbiAqIElmIGBlcnJgIGlzIGFuIEVycm9yIGl0IGlzIHR1cm5lZCBpbnRvIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgLlxuICpcbiAqIElmIGBlcnJgIHdhcyBhbHJlYWR5IGEgYFRlbXBvcmFsRmFpbHVyZWAsIHJldHVybnMgdGhlIG9yaWdpbmFsIGVycm9yLlxuICpcbiAqIE90aGVyd2lzZSByZXR1cm5zIGFuIGBBcHBsaWNhdGlvbkZhaWx1cmVgIHdpdGggYFN0cmluZyhlcnIpYCBhcyB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnI6IHVua25vd24pOiBUZW1wb3JhbEZhaWx1cmUge1xuICBpZiAoZXJyIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICByZXR1cm4gZW5zdXJlQXBwbGljYXRpb25GYWlsdXJlKGVycik7XG59XG5cbi8qKlxuICogR2V0IHRoZSByb290IGNhdXNlIG1lc3NhZ2Ugb2YgZ2l2ZW4gYGVycm9yYC5cbiAqXG4gKiBJbiBjYXNlIGBlcnJvcmAgaXMgYSB7QGxpbmsgVGVtcG9yYWxGYWlsdXJlfSwgcmVjdXJzZSB0aGUgYGNhdXNlYCBjaGFpbiBhbmQgcmV0dXJuIHRoZSByb290IGBjYXVzZS5tZXNzYWdlYC5cbiAqIE90aGVyd2lzZSwgcmV0dXJuIGBlcnJvci5tZXNzYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvb3RDYXVzZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIFRlbXBvcmFsRmFpbHVyZSkge1xuICAgIHJldHVybiBlcnJvci5jYXVzZSA/IHJvb3RDYXVzZShlcnJvci5jYXVzZSkgOiBlcnJvci5tZXNzYWdlO1xuICB9XG4gIHJldHVybiBlcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuIiwiLyoqXG4gKiBDb21tb24gbGlicmFyeSBmb3IgY29kZSB0aGF0J3MgdXNlZCBhY3Jvc3MgdGhlIENsaWVudCwgV29ya2VyLCBhbmQvb3IgV29ya2Zsb3dcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0ICogYXMgZW5jb2RpbmcgZnJvbSAnLi9lbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gJy4vdHlwZS1oZWxwZXJzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hY3Rpdml0eS1vcHRpb25zJztcbmV4cG9ydCB7IEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlsc09wdGlvbnMsIEFjdGl2aXR5Q2FuY2VsbGF0aW9uRGV0YWlscyB9IGZyb20gJy4vYWN0aXZpdHktY2FuY2VsbGF0aW9uLWRldGFpbHMnO1xuZXhwb3J0IHsgU3VnZ2VzdENvbnRpbnVlQXNOZXdSZWFzb24gfSBmcm9tICcuL2NvbnRpbnVlLWFzLW5ldyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9kYXRhLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9mYWlsdXJlLWNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnZlcnRlci9wYXlsb2FkLWNvZGVjJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3BheWxvYWQtY29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udmVydGVyL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZGVwcmVjYXRlZC10aW1lJztcbmV4cG9ydCAqIGZyb20gJy4vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZmFpbHVyZSc7XG5leHBvcnQgeyBIZWFkZXJzLCBOZXh0IH0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpb3JpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWNzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktcG9saWN5JztcbmV4cG9ydCB0eXBlIHsgVGltZXN0YW1wLCBEdXJhdGlvbiwgU3RyaW5nVmFsdWUgfSBmcm9tICcuL3RpbWUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZXItZGVwbG95bWVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1kZWZpbml0aW9uLW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy1pbnRlbnQnO1xuZXhwb3J0IHtcbiAgU2VhcmNoQXR0cmlidXRlcywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICBTZWFyY2hBdHRyaWJ1dGVQYWlyLFxuICBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyLFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlZmluZVNlYXJjaEF0dHJpYnV0ZUtleSxcbn0gZnJvbSAnLi9zZWFyY2gtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogRW5jb2RlIGEgVVRGLTggc3RyaW5nIGludG8gYSBVaW50OEFycmF5XG4gKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgLSBtZWFudCBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHU4KHM6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICByZXR1cm4gZW5jb2RpbmcuZW5jb2RlKHMpO1xufVxuXG4vKipcbiAqIERlY29kZSBhIFVpbnQ4QXJyYXkgaW50byBhIFVURi04IHN0cmluZ1xuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYXJyOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGVuY29kaW5nLmRlY29kZShhcnIpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IubWVzc2FnZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvck1lc3NhZ2UoZXJyb3IpO1xufVxuXG4vKipcbiAqIEdldCBgZXJyb3IuY29kZWAgKG9yIGB1bmRlZmluZWRgIGlmIG5vdCBwcmVzZW50KVxuICpcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIC0gbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckNvZGUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaGVscGVycy5lcnJvckNvZGUoZXJyb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBBbnlGdW5jLCBPbWl0TGFzdFBhcmFtIH0gZnJvbSAnLi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBUeXBlIG9mIHRoZSBuZXh0IGZ1bmN0aW9uIGZvciBhIGdpdmVuIGludGVyY2VwdG9yIGZ1bmN0aW9uXG4gKlxuICogQ2FsbGVkIGZyb20gYW4gaW50ZXJjZXB0b3IgdG8gY29udGludWUgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG5leHBvcnQgdHlwZSBOZXh0PElGLCBGTiBleHRlbmRzIGtleW9mIElGPiA9IFJlcXVpcmVkPElGPltGTl0gZXh0ZW5kcyBBbnlGdW5jID8gT21pdExhc3RQYXJhbTxSZXF1aXJlZDxJRj5bRk5dPiA6IG5ldmVyO1xuXG4vKiogSGVhZGVycyBhcmUganVzdCBhIG1hcHBpbmcgb2YgaGVhZGVyIG5hbWUgdG8gUGF5bG9hZCAqL1xuZXhwb3J0IHR5cGUgSGVhZGVycyA9IFJlY29yZDxzdHJpbmcsIFBheWxvYWQ+O1xuXG4vKipcbiAqIENvbXBvc2UgYWxsIGludGVyY2VwdG9yIG1ldGhvZHMgaW50byBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBDYWxsaW5nIHRoZSBjb21wb3NlZCBmdW5jdGlvbiByZXN1bHRzIGluIGNhbGxpbmcgZWFjaCBvZiB0aGUgcHJvdmlkZWQgaW50ZXJjZXB0b3IsIGluIG9yZGVyIChmcm9tIHRoZSBmaXJzdCB0b1xuICogdGhlIGxhc3QpLCBmb2xsb3dlZCBieSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gcHJvdmlkZWQgYXMgYXJndW1lbnQgdG8gYGNvbXBvc2VJbnRlcmNlcHRvcnMoKWAuXG4gKlxuICogQHBhcmFtIGludGVyY2VwdG9ycyBhIGxpc3Qgb2YgaW50ZXJjZXB0b3JzXG4gKiBAcGFyYW0gbWV0aG9kIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmNlcHRvciBtZXRob2QgdG8gY29tcG9zZVxuICogQHBhcmFtIG5leHQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgdGhlIGludGVyY2VwdGlvbiBjaGFpblxuICovXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dCAoaW1wb3J0ZWQgdmlhIGxpYi9pbnRlcmNlcHRvcnMpXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUludGVyY2VwdG9yczxJLCBNIGV4dGVuZHMga2V5b2YgST4oaW50ZXJjZXB0b3JzOiBJW10sIG1ldGhvZDogTSwgbmV4dDogTmV4dDxJLCBNPik6IE5leHQ8SSwgTT4ge1xuICBmb3IgKGxldCBpID0gaW50ZXJjZXB0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgY29uc3QgaW50ZXJjZXB0b3IgPSBpbnRlcmNlcHRvcnNbaV07XG4gICAgaWYgKGludGVyY2VwdG9yPy5bbWV0aG9kXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcmV2ID0gbmV4dDtcbiAgICAgIC8vIFdlIGxvc2UgdHlwZSBzYWZldHkgaGVyZSBiZWNhdXNlIFR5cGVzY3JpcHQgY2FuJ3QgZGVkdWNlIHRoYXQgaW50ZXJjZXB0b3JbbWV0aG9kXSBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAgLy8gdGhlIHNhbWUgdHlwZSBhcyBOZXh0PEksIE0+XG4gICAgICBuZXh0ID0gKChpbnB1dDogYW55KSA9PiAoaW50ZXJjZXB0b3JbbWV0aG9kXSBhcyBhbnkpKGlucHV0LCBwcmV2KSkgYXMgYW55O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbmV4cG9ydCB0eXBlIFBheWxvYWQgPSB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklQYXlsb2FkO1xuXG4vKiogVHlwZSB0aGF0IGNhbiBiZSByZXR1cm5lZCBmcm9tIGEgV29ya2Zsb3cgYGV4ZWN1dGVgIGZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JldHVyblR5cGUgPSBQcm9taXNlPGFueT47XG5leHBvcnQgdHlwZSBXb3JrZmxvd1VwZGF0ZVR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55PiB8IGFueTtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSA9IHtcbiAgaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgdmFsaWRhdG9yPzogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1NpZ25hbFR5cGUgPSAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dTaWduYWxBbm5vdGF0ZWRUeXBlID0ge1xuICBoYW5kbGVyOiBXb3JrZmxvd1NpZ25hbFR5cGU7XG4gIHVuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXb3JrZmxvd1F1ZXJ5VHlwZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dRdWVyeUFubm90YXRlZFR5cGUgPSB7IGhhbmRsZXI6IFdvcmtmbG93UXVlcnlUeXBlOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEJyb2FkIFdvcmtmbG93IGZ1bmN0aW9uIGRlZmluaXRpb24sIHNwZWNpZmljIFdvcmtmbG93cyB3aWxsIHR5cGljYWxseSB1c2UgYSBuYXJyb3dlciB0eXBlIGRlZmluaXRpb24sIGUuZzpcbiAqIGBgYHRzXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlXb3JrZmxvdyhhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvdyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlO1xuXG5kZWNsYXJlIGNvbnN0IGFyZ3NCcmFuZDogdW5pcXVlIHN5bWJvbDtcbmRlY2xhcmUgY29uc3QgcmV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHVwZGF0ZSBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVVcGRhdGV9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSB1cGRhdGUgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3VwZGF0ZSc7XG4gIG5hbWU6IE5hbWU7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCBhcmdzLlxuICAgKiBUaGlzIGZpZWxkIGlzIG5vdCBwcmVzZW50IGF0IHJ1bi10aW1lLlxuICAgKi9cbiAgW2FyZ3NCcmFuZF06IEFyZ3M7XG4gIC8qKlxuICAgKiBWaXJ0dWFsIHR5cGUgYnJhbmQgdG8gbWFpbnRhaW4gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIFdvcmtmbG93IHNpZ25hbCBkZWZpbml0aW9uLCBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gKlxuICogQHJlbWFya3MgYEFyZ3NgIGNhbiBiZSB1c2VkIGZvciBwYXJhbWV0ZXIgdHlwZSBpbmZlcmVuY2UgaW4gaGFuZGxlciBmdW5jdGlvbnMgYW5kIFdvcmtmbG93SGFuZGxlIG1ldGhvZHMuXG4gKiBgTmFtZWAgY2FuIG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIHByZXNlcnZlIHR5cGUtbGV2ZWwga25vd2xlZGdlIG9mIHRoZSBzaWduYWwgbmFtZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWZpbml0aW9uPEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHR5cGU6ICdzaWduYWwnO1xuICBuYW1lOiBOYW1lO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgU2lnbmFsRGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgYSBXb3JrZmxvdyBxdWVyeSBkZWZpbml0aW9uIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIGRlZmluZVF1ZXJ5fVxuICpcbiAqIEByZW1hcmtzIGBBcmdzYCBhbmQgYFJldGAgY2FuIGJlIHVzZWQgZm9yIHBhcmFtZXRlciB0eXBlIGluZmVyZW5jZSBpbiBoYW5kbGVyIGZ1bmN0aW9ucyBhbmQgV29ya2Zsb3dIYW5kbGUgbWV0aG9kcy5cbiAqIGBOYW1lYCBjYW4gb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgd2l0aCBhIHN0cmluZyBsaXRlcmFsIHR5cGUgdG8gcHJlc2VydmUgdHlwZS1sZXZlbCBrbm93bGVkZ2Ugb2YgdGhlIHF1ZXJ5IG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgdHlwZTogJ3F1ZXJ5JztcbiAgbmFtZTogTmFtZTtcbiAgLyoqXG4gICAqIFZpcnR1YWwgdHlwZSBicmFuZCB0byBtYWludGFpbiBhIGRpc3RpbmN0aW9uIGJldHdlZW4ge0BsaW5rIFF1ZXJ5RGVmaW5pdGlvbn0gdHlwZXMgd2l0aCBkaWZmZXJlbnQgYXJncy5cbiAgICogVGhpcyBmaWVsZCBpcyBub3QgcHJlc2VudCBhdCBydW4tdGltZS5cbiAgICovXG4gIFthcmdzQnJhbmRdOiBBcmdzO1xuICAvKipcbiAgICogVmlydHVhbCB0eXBlIGJyYW5kIHRvIG1haW50YWluIGEgZGlzdGluY3Rpb24gYmV0d2VlbiB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSB0eXBlcyB3aXRoIGRpZmZlcmVudCByZXR1cm4gdHlwZXMuXG4gICAqIFRoaXMgZmllbGQgaXMgbm90IHByZXNlbnQgYXQgcnVuLXRpbWUuXG4gICAqL1xuICBbcmV0QnJhbmRdOiBSZXQ7XG59XG5cbi8qKiBHZXQgdGhlIFwidW53cmFwcGVkXCIgcmV0dXJuIHR5cGUgKHdpdGhvdXQgUHJvbWlzZSkgb2YgdGhlIGV4ZWN1dGUgaGFuZGxlciBmcm9tIFdvcmtmbG93IHR5cGUgYFdgICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdFR5cGU8VyBleHRlbmRzIFdvcmtmbG93PiA9IFJldHVyblR5cGU8Vz4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIFI+ID8gUiA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5RnVuY3Rpb248UCBleHRlbmRzIGFueVtdID0gYW55W10sIFIgPSBhbnk+IHtcbiAgKC4uLmFyZ3M6IFApOiBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIE1hcHBpbmcgb2YgQWN0aXZpdHkgbmFtZSB0byBmdW5jdGlvblxuICogQGRlcHJlY2F0ZWQgbm90IHJlcXVpcmVkIGFueW1vcmUsIGZvciB1bnR5cGVkIGFjdGl2aXRpZXMgdXNlIHtAbGluayBVbnR5cGVkQWN0aXZpdGllc31cbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZpdHlJbnRlcmZhY2UgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIEFjdGl2aXR5IG5hbWUgdG8gZnVuY3Rpb25cbiAqL1xuZXhwb3J0IHR5cGUgVW50eXBlZEFjdGl2aXRpZXMgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpdml0eUZ1bmN0aW9uPjtcblxuLyoqXG4gKiBBIHdvcmtmbG93J3MgaGlzdG9yeSBhbmQgSUQuIFVzZWZ1bCBmb3IgcmVwbGF5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBbmRXb3JrZmxvd0lkIHtcbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICBoaXN0b3J5OiB0ZW1wb3JhbC5hcGkuaGlzdG9yeS52MS5IaXN0b3J5IHwgdW5rbm93biB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQb2xpY3kgZGVmaW5pbmcgYWN0aW9ucyB0YWtlbiB3aGVuIGEgd29ya2Zsb3cgZXhpdHMgd2hpbGUgdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVubmluZy5cbiAqIFRoZSB3b3JrZmxvdyBleGl0IG1heSBiZSBkdWUgdG8gc3VjY2Vzc2Z1bCByZXR1cm4sIGZhaWx1cmUsIGNhbmNlbGxhdGlvbiwgb3IgY29udGludWUtYXMtbmV3LlxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaW4gYWRkaXRpb24gdG8gYWJhbmRvbmluZyB0aGUgaGFuZGxlciBleGVjdXRpb24uIFRoZSB3YXJuaW5nIHdpbGwgbm90IGJlIGlzc3VlZCBpZiB0aGUgd29ya2Zsb3cgZmFpbHMuXG4gICAqL1xuICBXQVJOX0FORF9BQkFORE9OOiAnV0FSTl9BTkRfQUJBTkRPTicsXG5cbiAgLyoqXG4gICAqIEFiYW5kb24gdGhlIGhhbmRsZXIgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBJbiB0aGUgY2FzZSBvZiBhbiB1cGRhdGUgaGFuZGxlciB0aGlzIG1lYW5zIHRoYXQgdGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW5cbiAgICogdGhlIHVwZGF0ZSByZXN1bHQuXG4gICAqL1xuICBBQkFORE9OOiAnQUJBTkRPTicsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgPSAodHlwZW9mIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5KVtrZXlvZiB0eXBlb2YgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ldO1xuIiwiaW1wb3J0IHsgVmFsdWVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEV4YWN0LCBSZW1vdmVQcmVmaXgsIFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuLi90eXBlLWhlbHBlcnMnO1xuXG4vKipcbiAqIENyZWF0ZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgbnVtZXJpYyBgZW51bWAgdHlwZXMgcHJvZHVjZWQgYnkgb3VyXG4gKiBQcm90b2J1ZiBjb21waWxlciBhbmQgXCJjb25zdCBvYmplY3Qgb2Ygc3RyaW5nc1wiIGVudW0gdmFsdWVzIHRoYXQgd2UgZXhwb3NlIGluIG91ciBwdWJsaWMgQVBJcy5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBOZXdseSBpbnRyb2R1Y2VkIGVudW1zIHNob3VsZCBmb2xsb3cgdGhlIGZvbGxvd2luZyBwYXR0ZXJuOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgY29uc3QgUGFyZW50Q2xvc2VQb2xpY3kgPSB7XG4gKiAgICAgICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuICogICAgICAgQUJBTkRPTjogJ0FCQU5ET04nLFxuICogICAgICAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG4gKiAgICAgfSBhcyBjb25zdDtcbiAqICAgICB0eXBlIFBhcmVudENsb3NlUG9saWN5ID0gKHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeSlba2V5b2YgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5XTtcbiAqXG4gKiAgICAgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSAvL1xuICogICAgICAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gKiAgICAgICAgIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gKiAgICAgICAgIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAqICAgICAgICAgdHlwZW9mIFBhcmVudENsb3NlUG9saWN5LFxuICogICAgICAgICAnUEFSRU5UX0NMT1NFX1BPTElDWV8nICAvLyBUaGlzIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3RvIGVudW0gZG9lc24ndCBhZGQgYSByZXBlYXRlZCBwcmVmaXggb24gdmFsdWVzXG4gKiAgICAgICA+KFxuICogICAgICAgICB7XG4gKiAgICAgICAgICAgW1BhcmVudENsb3NlUG9saWN5LlRFUk1JTkFURV06IDEsIC8vIFRoZXNlIG51bWJlcnMgbXVzdCBtYXRjaCB0aGUgb25lcyBpbiB0aGUgcHJvdG8gZW51bVxuICogICAgICAgICAgIFtQYXJlbnRDbG9zZVBvbGljeS5BQkFORE9OXTogMixcbiAqICAgICAgICAgICBbUGFyZW50Q2xvc2VQb2xpY3kuUkVRVUVTVF9DQU5DRUxdOiAzLFxuICpcbiAqICAgICAgICAgICBVTlNQRUNJRklFRDogMCxcbiAqICAgICAgICAgfSBhcyBjb25zdCxcbiAqICAgICAgICAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuICogICAgICAgKTtcbiAqIGBgYFxuICpcbiAqIGBtYWtlUHJvdG9FbnVtQ29udmVydGVyc2Agc3VwcG9ydHMgb3RoZXIgdXNhZ2UgcGF0dGVybnMsIGJ1dCB0aGV5IGFyZSBvbmx5IG1lYW50IGZvclxuICogYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGZvcm1lciBlbnVtIGRlZmluaXRpb25zIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG5ldyBlbnVtcy5cbiAqXG4gKiAjIyMgQ29udGV4dFxuICpcbiAqIFRlbXBvcmFsJ3MgUHJvdG9idWYgQVBJcyBkZWZpbmUgc2V2ZXJhbCBgZW51bWAgdHlwZXM7IG91ciBQcm90b2J1ZiBjb21waWxlciB0cmFuc2Zvcm1zIHRoZXNlIHRvXG4gKiB0cmFkaXRpb25hbCAoaS5lLiBub24tY29uc3QpIFtUeXBlU2NyaXB0IG51bWVyaWMgYGVudW1gc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svZW51bXMuaHRtbCNudW1lcmljLWVudW1zKS5cbiAqXG4gKiBGb3IgdmFyaW91cyByZWFzb25zLCB0aGlzIGlzIGZhciBmcm9tIGlkZWFsOlxuICpcbiAqICAtIER1ZSB0byB0aGUgZHVhbCBuYXR1cmUgb2Ygbm9uLWNvbnN0IFR5cGVTY3JpcHQgYGVudW1gcyAodGhleSBhcmUgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUpLFxuICogICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlZmVyIHRvIGFuIGVudW0gdmFsdWUgZnJvbSBjb2RlIHdpdGhvdXQgYSBcInJlYWxcIiBpbXBvcnQgb2YgdGhlIGVudW0gdHlwZVxuICogICAgKGkuZS4gY2FuJ3Qgc2ltcGx5IGRvIGBpbXBvcnQgdHlwZSAuLi5gKS4gSW4gV29ya2Zsb3cgY29kZSwgc3VjaCBhbiBpbXBvcnQgd291bGQgcmVzdWx0IGluXG4gKiAgICBsb2FkaW5nIG91ciBlbnRpcmUgUHJvdG9idWYgZGVmaW5pdGlvbnMgaW50byB0aGUgd29ya2Zsb3cgc2FuZGJveCwgYWRkaW5nIHNldmVyYWwgbWVnYWJ5dGVzIHRvXG4gKiAgICB0aGUgcGVyLXdvcmtmbG93IG1lbW9yeSBmb290cHJpbnQsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZTsgdG8gYXZvaWQgdGhhdCwgd2UgbmVlZCB0byBtYWludGFpblxuICogICAgYSBtaXJyb3IgY29weSBvZiBlYWNoIGVudW0gdHlwZXMgdXNlZCBieSBpbi13b3JrZmxvdyBBUElzLCBhbmQgZXhwb3J0IHRoZXNlIGZyb20gZWl0aGVyXG4gKiAgICBgQHRlbXBvcmFsaW8vY29tbW9uYCBvciBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgLlxuICogIC0gSXQgaXMgbm90IGRlc2lyYWJsZSBmb3IgdXNlcnMgdG8gbmVlZCBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IG9uIGBAdGVtcG9yYWxpby9wcm90b2AganVzdCB0b1xuICogICAgZ2V0IGFjY2VzcyB0byB0aGVzZSBlbnVtIHR5cGVzOyB3ZSB0aGVyZWZvcmUgbWFkZSBpdCBhIGNvbW1vbiBwcmFjdGljZSB0byByZWV4cG9ydCB0aGVzZSBlbnVtc1xuICogICAgZnJvbSBvdXIgcHVibGljIGZhY2luZyBwYWNrYWdlcy4gSG93ZXZlciwgZXhwZXJpZW5jZSBkZW1vbnRyYXRlZCB0aGF0IHRoZXNlIHJlZXhwb3J0cyBlZmZlY3RpdmVseVxuICogICAgcmVzdWx0ZWQgaW4gcG9vciBhbmQgaW5jb25zaXN0ZW50IGRvY3VtZW50YXRpb24gY292ZXJhZ2UgY29tcGFyZWQgdG8gbWlycm9yZWQgZW51bXMgdHlwZXMuXG4gKiAgLSBPdXIgUHJvdG9idWYgZW51bSB0eXBlcyB0ZW5kIHRvIGZvbGxvdyBhIHZlcmJvc2UgYW5kIHJlZHVuZGFudCBuYW1pbmcgY29udmVudGlvbiwgd2hpY2ggZmVlbHNcbiAqICAgIHVuYXR1cmFsIGFuZCBleGNlc3NpdmUgYWNjb3JkaW5nIHRvIG1vc3QgVHlwZVNjcmlwdCBzdHlsZSBndWlkZXM7IGUuZy4gaW5zdGVhZCBvZlxuICogICAgYHdvcmtmbG93SWRSZXVzZVBvbGljeTogV29ya2Zsb3dJZFJldXNlUG9saWN5LldPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFYCxcbiAqICAgIGEgVHlwZVNjcmlwdCBkZXZlbG9wZXIgd291bGQgZ2VuZXJhbGx5IGV4cGVjdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWV0aGluZyBzaW1pbGFyIHRvXG4gKiAgICBgd29ya2Zsb3dJZFJldXNlUG9saWN5OiAnUkVKRUNUX0RVUExJQ0FURSdgLlxuICogIC0gQmVjYXVzZSBvZiB0aGUgd2F5IFByb3RvYnVmIHdvcmtzLCBtYW55IG9mIG91ciBlbnVtIHR5cGVzIGNvbnRhaW4gYW4gYFVOU1BFQ0lGSUVEYCB2YWx1ZSwgd2hpY2hcbiAqICAgIGlzIHVzZWQgdG8gZXhwbGljaXRseSBpZGVudGlmeSBhIHZhbHVlIHRoYXQgaXMgdW5zZXQuIEluIFR5cGVTY3JpcHQgY29kZSwgdGhlIGB1bmRlZmluZWRgIHZhbHVlXG4gKiAgICBhbHJlYWR5IHNlcnZlcyB0aGF0IHB1cnBvc2UsIGFuZCBpcyBkZWZpbml0ZWx5IG1vcmUgaWRpb21hdGljIHRvIFRTIGRldmVsb3BlcnMsIHdoZXJlYXMgdGhlc2VcbiAqICAgIGBVTlNQRUNJRklFRGAgdmFsdWVzIGNyZWF0ZSBub2lzZSBhbmQgY29uZnVzaW9uIGluIG91ciBBUElzLlxuICogIC0gVHlwZVNjcmlwdCBlZGl0b3JzIGdlbmVyYWxseSBkbyBhIHZlcnkgYmFkIGpvYiBhdCBwcm92aWRpbmcgYXV0b2NvbXBsZXRpb24gdGhhdCBpbXBsaWVzIHJlYWNoaW5nXG4gKiAgICBmb3IgdmFsdWVzIG9mIGEgVHlwZVNjcmlwdCBlbnVtIHR5cGUsIGZvcmNpbmcgZGV2ZWxvcGVycyB0byBleHBsaWNpdGx5IHR5cGUgaW4gYXQgbGVhc3QgcGFydFxuICogICAgb2YgdGhlIG5hbWUgb2YgdGhlIGVudW0gdHlwZSBiZWZvcmUgdGhleSBjYW4gZ2V0IGF1dG9jb21wbGV0aW9uIGZvciBpdHMgdmFsdWVzLiBPbiB0aGUgb3RoZXJcbiAqICAgIGhhbmQsIGFsbCBUUyBlZGl0b3JzIGltbWVkaWF0ZWx5IHByb3ZpZGUgYXV0b2NvbXBsZXRpb24gZm9yIHN0cmluZyB1bmlvbiB0eXBlcy5cbiAqICAtIFRoZSBbVHlwZVNjcmlwdCdzIG9mZmljaWFsIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2VudW1zLmh0bWwjb2JqZWN0cy12cy1lbnVtcylcbiAqICAgIGl0c2VsZiBzdWdnZXN0cyB0aGF0LCBpbiBtb2Rlcm4gVHlwZVNjcmlwdCwgdGhlIHVzZSBvZiBgYXMgY29uc3RgIG9iamVjdHMgbWF5IGdlbmVyYWxseSBzdWZmaWNlXG4gKiAgICBhbmQgbWF5IGJlIGFkdmFudGFnZW91cyBvdmVyIHRoZSB1c2Ugb2YgYGVudW1gIHR5cGVzLlxuICpcbiAqIEEgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MsIGNvbWJpbmVkIHdpdGggYSB1bmlvbiB0eXBlIG9mIHBvc3NpYmxlIHN0cmluZyB2YWx1ZXMsIHByb3ZpZGVzIGEgbXVjaFxuICogbW9yZSBpZGlvbWF0aWMgc3ludGF4IGFuZCBhIGJldHRlciBEWCBmb3IgVHlwZVNjcmlwdCBkZXZlbG9wZXJzLiBUaGlzIGhvd2V2ZXIgcmVxdWlyZXMgYSB3YXkgdG9cbiAqIGNvbnZlcnQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgYGVudW1gIHZhbHVlcyBwcm9kdWNlZCBieSB0aGUgUHJvdG9idWYgY29tcGlsZXIgYW5kIHRoZVxuICogZXF1aXZhbGVudCBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIFRoaXMgaGVscGVyIGR5bmFtaWNhbGx5IGNyZWF0ZXMgdGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgZm9yIGEgZ2l2ZW4gUHJvdG9idWYgZW51bSB0eXBlLFxuICogc3Ryb25nbHkgYnVpbGRpbmcgdXBvbiBzcGVjaWZpYyBjb252ZW50aW9ucyB0aGF0IHdlIGhhdmUgYWRvcHRlZCBpbiBvdXIgUHJvdG9idWYgZGVmaW5pdGlvbnMuXG4gKlxuICogIyMjIFZhbGlkYXRpb25zXG4gKlxuICogVGhlIGNvbXBsZXggdHlwZSBzaWduYXR1cmUgb2YgdGhpcyBoZWxwZXIgaXMgdGhlcmUgdG8gcHJldmVudCBtb3N0IHBvdGVudGlhbCBpbmNvaGVyZW5jaWVzXG4gKiB0aGF0IGNvdWxkIHJlc3VsdCBmcm9tIGhhdmluZyB0byBtYW51YWxseSBzeW5jaHJvbml6ZSB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSBhbmQgdGhlXG4gKiBjb252ZXJzaW9uIHRhYmxlIHdpdGggdGhlIHByb3RvIGVudW0sIHdoaWxlIG5vdCByZXF1aXJpbmcgYSByZWd1bGFyIGltcG9ydCBvbiB0aGUgUHJvdG9idWYgZW51bVxuICogaXRzZWxmIChzbyBpdCBjYW4gYmUgdXNlZCBzYWZlbHkgZm9yIGVudW1zIG1lYW50IHRvIGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb2RlKS5cbiAqXG4gKiBJbiBwYXJ0aWN1bGFyLCBmYWlsaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGludmFyaWFudHMgd2lsbCByZXN1bHQgaW4gYnVpbGQgdGltZSBlcnJvcnM6XG4gKlxuICogLSBGb3IgZXZlcnkga2V5IG9mIHRoZSBmb3JtIGBQUkVGSVhfS0VZOiBudW1iZXJgIGluIHRoZSBwcm90byBlbnVtLCBleGNsdWRpbmcgdGhlIGBVTlNQRUNJRklFRGAga2V5OlxuICogICAtIFRoZXJlIE1VU1QgYmUgYSBjb3JyZXNwb25kaW5nIGBLRVk6ICdLRVknYCBlbnRyeSBpbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bTtcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfS0VZOiAnS0VZJ2AgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW1cbiAqICAgICAodGhpcyBpcyBtZWFudCB0byBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHN1Y2ggYWxpYXNlcyBzaG91bGRcbiAqICAgICBub3QgYmUgYWRkZWQgZm9yIG5ldyBlbnVtcyBhbmQgZW51bSBlbnRyaWVzIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZCk7XG4gKiAgIC0gVGhlcmUgTVVTVCBiZSBhIGNvcnJlc3BvbmRpbmcgYEtFWTogbnVtYmVyYCBpbiB0aGUgbWFwcGluZyB0YWJsZS5cbiAqIC0gSWYgdGhlIHByb3RvIGVudW0gY29udGFpbnMgYSBgUFJFRklYX1VOU1BFQ0lGSUVEYCBlbnRyeSwgdGhlbjpcbiAqICAgLSBUaGVyZSBNQVkgYmUgYSBjb3JyZXNwb25kaW5nIGBQUkVGSVhfVU5TUEVDSUZJRUQ6IHVuZGVmaW5lZGAgYW5kL29yIGBVTlNQRUNJRklFRDogdW5kZWZpbmVkYFxuICogICAgIGVudHJpZXMgaW4gdGhlIGNvbnN0IG9iamVjdCBvZiBzdHJpbmdzIGVudW0g4oCUIHRoaXMgaXMgbWVhbnQgdG8gcHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICogICAgIHdpdGggdGhlIGZvcm1lciBzeW50YXg7IHRoaXMgYWxpYXMgc2hvdWxkIG5vdCBiZSBhZGRlZCBmb3IgbmV3IGVudW1zIGludHJvZHVjZWQgZ29pbmcgZm9yd2FyZDtcbiAqICAgLSBUaGVyZSBNVVNUIGJlIGFuIGBVTlNQRUNJRklFRDogMGAgaW4gdGhlIG1hcHBpbmcgdGFibGUuXG4gKiAtIFRoZSBjb25zdCBvYmplY3Qgb2Ygc3RyaW5ncyBlbnVtIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBvclxuICogICBvcHRpb25hbGx5IGFsbG93ZWQgYmUgdGhlIHByZWNlZWRpbmcgcnVsZXMuXG4gKiAtIFRoZSBtYXBwaW5nIHRhYmxlIE1VU1QgTk9UIGNvbnRhaW4gYW55IG90aGVyIGtleXMgdGhhbiB0aGUgb25lcyBtYW5kYXRlZCBhYm92ZS5cbiAqXG4gKiBUaGVzZSBydWxlcyBub3RhYmx5IGVuc3VyZSB0aGF0IHdoZW5ldmVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIFByb3RvIGVudW0sIHRoZSBjb2RlXG4gKiB3aWxsIGZhaWwgdG8gY29tcGlsZSB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpcyBhZGRlZCBvbiB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bVxuICogYW5kIHRoZSBtYXBwaW5nIHRhYmxlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIFByb3RvRW51bVZhbHVlIGV4dGVuZHMgbnVtYmVyLFxuICBQcm90b0VudW0gZXh0ZW5kcyB7IFtrIGluIFByb3RvRW51bUtleV06IFByb3RvRW51bVZhbHVlIH0sXG4gIFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH0ke3N0cmluZ31gLFxuICBTdHJpbmdFbnVtVHlwZUFjdHVhbCBleHRlbmRzIEV4YWN0PFN0cmluZ0VudW1UeXBlLCBTdHJpbmdFbnVtVHlwZUFjdHVhbD4sXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgLy9cbiAgLy8gUGFyYW1ldGVycyBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgaW5mZXJyZWQ7IHRoZXkncmUgbm90IG1lYW50IG5vdCB0byBiZSBzcGVjaWZpZWQgYnkgZGV2ZWxvcGVyc1xuICBVbnNwZWNpZmllZCA9IFByb3RvRW51bUtleSBleHRlbmRzIGAke1ByZWZpeH1VTlNQRUNJRklFRGAgPyAnVU5TUEVDSUZJRUQnIDogbmV2ZXIsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4gPSBFeGNsdWRlPFxuICAgIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4gICAgVW5zcGVjaWZpZWRcbiAgPixcbiAgU3RyaW5nRW51bVR5cGUgZXh0ZW5kcyBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxcbiAgICBTaG9ydFN0cmluZ0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkXG4gID4gPSBQcm90b0NvbnN0T2JqZWN0T2ZTdHJpbmdzRW51bTxTaG9ydFN0cmluZ0VudW1LZXksIFByZWZpeCwgVW5zcGVjaWZpZWQ+LFxuICBNYXBUYWJsZSBleHRlbmRzIFByb3RvRW51bVRvQ29uc3RPYmplY3RPZlN0cmluZ01hcFRhYmxlPFxuICAgIFN0cmluZ0VudW1UeXBlLFxuICAgIFByb3RvRW51bVZhbHVlLFxuICAgIFByb3RvRW51bSxcbiAgICBQcm90b0VudW1LZXksXG4gICAgUHJlZml4LFxuICAgIFVuc3BlY2lmaWVkLFxuICAgIFNob3J0U3RyaW5nRW51bUtleVxuICA+ID0gUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gICAgU3RyaW5nRW51bVR5cGUsXG4gICAgUHJvdG9FbnVtVmFsdWUsXG4gICAgUHJvdG9FbnVtLFxuICAgIFByb3RvRW51bUtleSxcbiAgICBQcmVmaXgsXG4gICAgVW5zcGVjaWZpZWQsXG4gICAgU2hvcnRTdHJpbmdFbnVtS2V5XG4gID4sXG4+KFxuICBtYXBUYWJsZTogTWFwVGFibGUsXG4gIHByZWZpeDogUHJlZml4XG4pOiBbXG4gIChcbiAgICBpbnB1dDogU2hvcnRTdHJpbmdFbnVtS2V5IHwgYCR7UHJlZml4fSR7U2hvcnRTdHJpbmdFbnVtS2V5fWAgfCBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcbiAgKSA9PiBQcm90b0VudW1WYWx1ZSB8IHVuZGVmaW5lZCwgLy9cbiAgKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpID0+IFNob3J0U3RyaW5nRW51bUtleSB8IHVuZGVmaW5lZCwgLy9cbl0ge1xuICBjb25zdCByZXZlcnNlVGFibGU6IFJlY29yZDxQcm90b0VudW1WYWx1ZSwgU2hvcnRTdHJpbmdFbnVtS2V5PiA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhtYXBUYWJsZSkubWFwKChbaywgdl0pID0+IFt2LCBrXSlcbiAgKTtcbiAgY29uc3QgaGFzVW5zcGVjaWZpZWQgPSAobWFwVGFibGUgYXMgYW55KVsnVU5TUEVDSUZJRUQnXSA9PT0gMCB8fCAobWFwVGFibGUgYXMgYW55KVtgJHtwcmVmaXh9VU5TUEVDSUZJRURgXSA9PT0gMDtcblxuICBmdW5jdGlvbiBpc1Nob3J0U3RyaW5nRW51bUtleXMoeDogdW5rbm93bik6IHggaXMgU2hvcnRTdHJpbmdFbnVtS2V5IHtcbiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHggaW4gbWFwVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBpc051bWVyaWNFbnVtVmFsdWUoeDogdW5rbm93bik6IHggaXMgUHJvdG9FbnVtW2tleW9mIFByb3RvRW51bV0ge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgeCBpbiByZXZlcnNlVGFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBlbmNvZGUoXG4gICAgaW5wdXQ6IFNob3J0U3RyaW5nRW51bUtleSB8IGAke1ByZWZpeH0ke1Nob3J0U3RyaW5nRW51bUtleX1gIHwgUHJvdG9FbnVtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IFByb3RvRW51bVZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBzaG9ydGVuOiBzdHJpbmcgPSBpbnB1dDtcbiAgICAgIGlmIChzaG9ydGVuLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICBzaG9ydGVuID0gc2hvcnRlbi5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Nob3J0U3RyaW5nRW51bUtleXMoc2hvcnRlbikpIHtcbiAgICAgICAgcmV0dXJuIG1hcFRhYmxlW3Nob3J0ZW5dO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEludmFsaWQgZW51bSB2YWx1ZTogJyR7aW5wdXR9J2ApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGlucHV0OiBQcm90b0VudW1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBTaG9ydFN0cmluZ0VudW1LZXkgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKGhhc1Vuc3BlY2lmaWVkICYmIGlucHV0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc051bWVyaWNFbnVtVmFsdWUoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiByZXZlcnNlVGFibGVbaW5wdXRdO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBnb3QgYSBwcm90byBlbnVtIHZhbHVlIHRoYXQgd2UgZG9uJ3QgeWV0IGtub3cgYWJvdXQgKGkuZS4gaXQgZGlkbid0IGV4aXN0IHdoZW4gdGhpcyBjb2RlXG4gICAgICAvLyB3YXMgY29tcGlsZWQpLiBUaGlzIGlzIGNlcnRhaW5seSBhIHBvc3NpYmlsaXR5LCBidXQgZ2l2ZW4gaG93IG91ciBBUElzIGV2b2x2ZSwgdGhpcyBpcyBpc1xuICAgICAgLy8gdW5saWtlbHkgdG8gYmUgYSB0ZXJyaWJseSBiYWQgdGhpbmcgYnkgaXRzZWxmICh3ZSBhdm9pZCBhZGRpbmcgbmV3IGVudW0gdmFsdWVzIGluIHBsYWNlc1xuICAgICAgLy8gdGhhdCB3b3VsZCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgZGVwbG95ZWQgY29kZSkuIFRoZXJlZm9yZSwgdGhyb3dpbmdcbiAgICAgIC8vIG9uIFwidW5leHBlY3RlZFwiIHZhbHVlcyBpcyBsaWtlbHkgdG8gZW5kIHVwIGNhdXNpbmcgbW9yZSBwcm9ibGVtcyB0aGFuIGl0IG1pZ2h0IGF2b2lkLFxuICAgICAgLy8gZXNwZWNpYWxseSBnaXZlbiB0aGF0IHRoZSBkZWNvZGVkIHZhbHVlIG1heSBhY3R1YWxseSBuZXZlciBnZXQgcmVhZCBhbnd5YXkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBpbnN0ZWFkIGNoZWF0IG9uIHR5cGUgY29uc3RyYWludHMgYW5kIHJldHVybiBhIHN0cmluZyBvZiB0aGUgZm9ybSBcInVua25vd25fMjNcIi5cbiAgICAgIC8vIFRoYXQgc29tZXdoYXQgbWlycm9ycyB0aGUgYmVoYXZpb3Igd2UnZCBnZXQgd2l0aCB0aGUgcHVyZSBudW1lcmljYWwgYXBwcm9hY2guXG4gICAgICByZXR1cm4gYHVua25vd25fJHtpbnB1dH1gIGFzIFNob3J0U3RyaW5nRW51bUtleTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBwcm90byBlbnVtIHZhbHVlOiAnJHtpbnB1dH0nIG9mIHR5cGUgJHt0eXBlb2YgaW5wdXR9YCk7XG4gIH1cblxuICByZXR1cm4gW2VuY29kZSwgZGVjb2RlXSBhcyBjb25zdDtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZXhwbG9kZWQgcGFyYW1ldGVycyBvZiBhIHByb3RvIGVudW0gKGkuZS4gc2hvcnQga2V5cywgcHJlZml4LCBhbmQgc2hvcnQga2V5IG9mIHRoZVxuICogdW5zcGVjaWZpZWQgdmFsdWUpLCBtYWtlIGEgdHlwZSB0aGF0IF9leGFjdGx5XyBjb3JyZXNwb25kcyB0byB0aGUgY29uc3Qgb2JqZWN0IG9mIHN0cmluZ3MgZW51bSxcbiAqIGUuZy4gdGhlIHR5cGUgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIGV4cGVjdGVkIHRvIHdyaXRlLlxuICpcbiAqIEZvciBleGFtcGxlLCBmb3IgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSwgdGhpcyBldmFsdWF0ZXMgdG86XG4gKlxuICoge1xuICogICBURVJNSU5BVEU6IFwiVEVSTUlOQVRFXCI7XG4gKiAgIEFCQU5ET046IFwiQUJBTkRPTlwiO1xuICogICBSRVFVRVNUX0NBTkNFTDogXCJSRVFVRVNUX0NBTkNFTFwiO1xuICpcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEU/OiBcIlRFUk1JTkFURVwiO1xuICogICBQQVJFTlRfQ0xPU0VfUE9MSUNZX0FCQU5ET04/OiBcIkFCQU5ET05cIjtcbiAqICAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTD86IFwiUkVRVUVTVF9DQU5DRUxcIjtcbiAqXG4gKiAgIFBBUkVOVF9DTE9TRV9QT0xJQ1lfVU5TUEVDSUZJRUQ/OiB1bmRlZmluZWQ7XG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08XG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIHN0cmluZyxcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuICBVbnNwZWNpZmllZCwgLy8gZS5nLiAnVU5TUEVDSUZJRUQnXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAgfCB7XG4gICAgICAvLyBlLmcuOiBcIlRFUk1JTkFURVwiOiBcIlRFUk1JTkFURVwiXG4gICAgICByZWFkb25seSBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBrO1xuICAgIH1cbiAgfCB7XG4gICAgICBbayBpbiBTaG9ydFN0cmluZ0VudW1LZXldOiBQcmVmaXggZXh0ZW5kcyAnJ1xuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC8vIGUuZy46IFwiUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcIj86IFwiVEVSTUlOQVRFXCJcbiAgICAgICAgICAgIHJlYWRvbmx5IFtrayBpbiBgJHtQcmVmaXh9JHtrfWBdPzogaztcbiAgICAgICAgICB9O1xuICAgIH1bU2hvcnRTdHJpbmdFbnVtS2V5XVxuICB8IChVbnNwZWNpZmllZCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyB7XG4gICAgICAgICAgLy8gZS5nLjogXCJQQVJFTlRfQ0xPU0VfUE9MSUNZX1VOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtQcmVmaXh9JHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4gIHwgKFVuc3BlY2lmaWVkIGV4dGVuZHMgc3RyaW5nXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBlLmcuOiBcIlVOU1BFQ0lGSUVEXCI/OiB1bmRlZmluZWRcbiAgICAgICAgICBbayBpbiBgJHtVbnNwZWNpZmllZH1gXT86IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgOiBvYmplY3QpXG4+O1xuXG4vKipcbiAqIEdpdmVuIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIG9mIGEgcHJvdG8gZW51bSAoaS5lLiBzaG9ydCBrZXlzLCBwcmVmaXgsIGFuZCBzaG9ydCBrZXkgb2YgdGhlXG4gKiB1bnNwZWNpZmllZCB2YWx1ZSksIG1ha2UgYSB0eXBlIHRoYXQgX2V4YWN0bHlfIGNvcnJlc3BvbmRzIHRvIHRoZSBtYXBwaW5nIHRhYmxlIHRoYXQgdGhlIHVzZXIgaXNcbiAqIGV4cGVjdGVkIHRvIHByb3ZpZGUuXG4gKlxuICogRm9yIGV4YW1wbGUsIGZvciBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LCB0aGlzIGV2YWx1YXRlcyB0bzpcbiAqXG4gKiB7XG4gKiAgVU5TUEVDSUZJRUQ6IDAsXG4gKiAgVEVSTUlOQVRFOiAxLFxuICogIEFCQU5ET046IDIsXG4gKiAgUkVRVUVTVF9DQU5DRUw6IDMsXG4gKiB9XG4gKi9cbnR5cGUgUHJvdG9FbnVtVG9Db25zdE9iamVjdE9mU3RyaW5nTWFwVGFibGU8XG4gIF9TdHJpbmdFbnVtIGV4dGVuZHMgUHJvdG9Db25zdE9iamVjdE9mU3RyaW5nc0VudW08U2hvcnRTdHJpbmdFbnVtS2V5LCBQcmVmaXgsIFVuc3BlY2lmaWVkPixcbiAgUHJvdG9FbnVtVmFsdWUgZXh0ZW5kcyBudW1iZXIsXG4gIFByb3RvRW51bSBleHRlbmRzIHsgW2sgaW4gUHJvdG9FbnVtS2V5XTogUHJvdG9FbnVtVmFsdWUgfSxcbiAgUHJvdG9FbnVtS2V5IGV4dGVuZHMgYCR7UHJlZml4fSR7c3RyaW5nfWAsXG4gIFByZWZpeCBleHRlbmRzIHN0cmluZyxcbiAgVW5zcGVjaWZpZWQsXG4gIFNob3J0U3RyaW5nRW51bUtleSBleHRlbmRzIFJlbW92ZVByZWZpeDxQcmVmaXgsIFByb3RvRW51bUtleT4sXG4+ID0gVW5pb25Ub0ludGVyc2VjdGlvbjxcbiAge1xuICAgIFtrIGluIFByb3RvRW51bUtleV06IHtcbiAgICAgIFtrayBpbiBSZW1vdmVQcmVmaXg8UHJlZml4LCBrPl06IFByb3RvRW51bVtrXSBleHRlbmRzIG51bWJlciA/IFByb3RvRW51bVtrXSA6IG5ldmVyO1xuICAgIH07XG4gIH1bUHJvdG9FbnVtS2V5XVxuPjtcbiIsImV4cG9ydCAqIGZyb20gJy4vZW51bXMtaGVscGVycyc7XG5leHBvcnQge1xuICBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLFxuICBtZXJnZU9iamVjdHMsXG4gIC8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG4gIGRlZXBNZXJnZSxcbn0gZnJvbSAnLi9vYmplY3RzLWhlbHBlcnMnO1xuIiwiLyoqXG4gKiBIZWxwZXIgdG8gcHJldmVudCBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIHZhbHVlcyBvdmVycmlkaW5nIGRlZmF1bHRzIHdoZW4gbWVyZ2luZyBtYXBzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTnVsbEFuZFVuZGVmaW5lZDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob2JqOiBUKTogVCB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5maWx0ZXIoKFtfaywgdl0pID0+IHYgIT0gbnVsbCkpIGFzIGFueTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb2JqZWN0cywgcG9zc2libHkgcmVtb3Zpbmcga2V5cy5cbiAqXG4gKiBNb3JlIHNwZWNpZmljYWxseTpcbiAqIC0gQW55IGtleS92YWx1ZSBwYWlyIGluIGBkZWx0YWAgb3ZlcnJpZGVzIHRoZSBjb3JyZXNwb25kaW5nIGtleS92YWx1ZSBwYWlyIGluIGBvcmlnaW5hbGA7XG4gKiAtIEEga2V5IHByZXNlbnQgaW4gYGRlbHRhYCB3aXRoIHZhbHVlIGB1bmRlZmluZWRgIHJlbW92ZXMgdGhlIGtleSBmcm9tIHRoZSByZXN1bHRpbmcgb2JqZWN0O1xuICogLSBJZiBgb3JpZ2luYWxgIGlzIGB1bmRlZmluZWRgIG9yIGVtcHR5LCByZXR1cm4gYGRlbHRhYDtcbiAqIC0gSWYgYGRlbHRhYCBpcyBgdW5kZWZpbmVkYCBvciBlbXB0eSwgcmV0dXJuIGBvcmlnaW5hbGAgKG9yIHVuZGVmaW5lZCBpZiBgb3JpZ2luYWxgIGlzIGFsc28gdW5kZWZpbmVkKTtcbiAqIC0gSWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMsIHRoZW4gcmV0dXJuIGBvcmlnaW5hbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9iamVjdHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9yaWdpbmFsOiBULCBkZWx0YTogVCB8IHVuZGVmaW5lZCk6IFQ7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPYmplY3RzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb3JpZ2luYWw6IFQgfCB1bmRlZmluZWQsXG4gIGRlbHRhOiBUIHwgdW5kZWZpbmVkXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9yaWdpbmFsID09IG51bGwpIHJldHVybiBkZWx0YTtcbiAgaWYgKGRlbHRhID09IG51bGwpIHJldHVybiBvcmlnaW5hbDtcblxuICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLm9yaWdpbmFsIH07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGRlbHRhKSkge1xuICAgIGlmICh2ICE9PSBtZXJnZWRba10pIHtcbiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSBtZXJnZWRba107XG4gICAgICBlbHNlIG1lcmdlZFtrXSA9IHY7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlZCA/IChtZXJnZWQgYXMgVCkgOiBvcmlnaW5hbDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogaXRlbSBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGl0ZW0pO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlcyB0d28gb2JqZWN0cywgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC5cbiAqXG4gKiBQcm9wZXJ0aWVzIGZyb20gYHNvdXJjZWAgd2lsbCBvdmVyd3JpdGUgcHJvcGVydGllcyBvbiBgdGFyZ2V0YC5cbiAqIE5lc3RlZCBvYmplY3RzIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuXG4gKlxuICogT2JqZWN0IGZpZWxkcyBpbiB0aGUgcmV0dXJuZWQgb2JqZWN0IGFyZSByZWZlcmVuY2VzLCBhcyBpbixcbiAqIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2U8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBQYXJ0aWFsPFQ+KTogVCB7XG4gIGNvbnN0IG91dHB1dCA9IHsgLi4udGFyZ2V0IH07XG5cbiAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNvdXJjZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gc291cmNlW2tleV07XG4gICAgICBpZiAoaXNPYmplY3Qoc291cmNlVmFsdWUpICYmIGtleSBpbiB0YXJnZXQgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0gYXMgYW55KSkge1xuICAgICAgICBvdXRwdXRba2V5IGFzIGtleW9mIFRdID0gZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2VWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAob3V0cHV0IGFzIGFueSlba2V5XSA9IHNvdXJjZVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkLCBtZXJnZU9iamVjdHMgfSBmcm9tICcuL2ludGVybmFsLXdvcmtmbG93JztcblxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAnVFJBQ0UnIHwgJ0RFQlVHJyB8ICdJTkZPJyB8ICdXQVJOJyB8ICdFUlJPUic7XG5cbmV4cG9ydCB0eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55PjtcblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaW4gb3JkZXIgdG8gY3VzdG9taXplIHdvcmtlciBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IExvZ01ldGFkYXRhKTogYW55O1xuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBMb2dNZXRhZGF0YSk6IGFueTtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogTG9nTWV0YWRhdGEpOiBhbnk7XG59XG5cbi8qKlxuICogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgc2RrQ29tcG9uZW50YCBtZXRhIGF0dHJpYnV0ZXMgb24gbG9nIG1lc3NhZ2VzLiBUaGlzXG4gKiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIHN1YnN5c3RlbSBlbWl0dGVkIHRoZSBsb2cgbWVzc2FnZTsgdGhpcyBtYXkgZm9yXG4gKiBleGFtcGxlIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZpbmUtZ3JhaW5lZCBmaWx0ZXJpbmcgb2YgbG9nIG1lc3NhZ2VzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIGxpc3Qgd2lsbCByZW1haW4gc3RhYmxlIGluIHRoZVxuICogZnV0dXJlOyB2YWx1ZXMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQsIGFuZCBtZXNzYWdlcyB0aGF0IGFyZSBjdXJyZW50bHlcbiAqIGVtaXR0ZWQgd2l0aCBzb21lIGBzZGtDb21wb25lbnRgIHZhbHVlIG1heSB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGVudW0gU2RrQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2luZyB0aGUge0BsaW5rIFdvcmtmbG93IGNvbnRleHQgbG9nZ2VyfHdvcmtmbG93LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICB3b3JrZmxvdyA9ICd3b3JrZmxvdycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhbiBhY3Rpdml0eSwgdXNpbmcgdGhlIHtAbGluayBhY3Rpdml0eSBjb250ZXh0IGxvZ2dlcnxDb250ZXh0LmxvZ30uXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBhY3Rpdml0eSA9ICdhY3Rpdml0eScsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIE5leHVzIE9wZXJhdGlvbiBIYW5kbGVyLCB1c2luZyB0aGUgTmV4dXMgY29udGV4dCBsb2dnZXIuXG4gICAqIFRoZSBTREsgaXRzZWxmIG5ldmVyIHB1Ymxpc2hlcyBtZXNzYWdlcyB3aXRoIHRoaXMgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBuZXh1cyA9ICduZXh1cycsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBtZXNzYWdlcyBlbWl0ZWQgZnJvbSBhIFRlbXBvcmFsIFdvcmtlciBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyBub3RhYmx5IGluY2x1ZGVzOlxuICAgKiAtIElzc3VlcyB3aXRoIFdvcmtlciBvciBydW50aW1lIGNvbmZpZ3VyYXRpb24sIG9yIHRoZSBKUyBleGVjdXRpb24gZW52aXJvbm1lbnQ7XG4gICAqIC0gV29ya2VyJ3MsIEFjdGl2aXR5J3MsIGFuZCBXb3JrZmxvdydzIGxpZmVjeWNsZSBldmVudHM7XG4gICAqIC0gV29ya2Zsb3cgQWN0aXZhdGlvbiBhbmQgQWN0aXZpdHkgVGFzayBwcm9jZXNzaW5nIGV2ZW50cztcbiAgICogLSBXb3JrZmxvdyBidW5kbGluZyBtZXNzYWdlcztcbiAgICogLSBTaW5rIHByb2Nlc3NpbmcgaXNzdWVzLlxuICAgKi9cbiAgd29ya2VyID0gJ3dvcmtlcicsXG5cbiAgLyoqXG4gICAqIENvbXBvbmVudCBuYW1lIGZvciBhbGwgbWVzc2FnZXMgZW1pdHRlZCBieSB0aGUgUnVzdCBDb3JlIFNESyBsaWJyYXJ5LlxuICAgKi9cbiAgY29yZSA9ICdjb3JlJyxcbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBMb2dNZXRhT3JGdW5jID0gTG9nTWV0YWRhdGEgfCAoKCkgPT4gTG9nTWV0YWRhdGEpO1xuXG4vKipcbiAqIEEgbG9nZ2VyIGltcGxlbWVudGF0aW9uIHRoYXQgYWRkcyBtZXRhZGF0YSBiZWZvcmUgZGVsZWdhdGluZyBjYWxscyB0byBhIHBhcmVudCBsb2dnZXIuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXJXaXRoQ29tcG9zZWRNZXRhZGF0YSBpbXBsZW1lbnRzIExvZ2dlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTG9nZ2VyfSB0aGF0IGFkZHMgbWV0YWRhdGEgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbG9nZ2VyLlxuICAgKlxuICAgKiBOZXcgbWV0YWRhdGEgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvbiBldmFsdWF0ZWRcbiAgICogZXZlcnkgdGltZSBhIGxvZyBpcyBlbWl0dGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIG1ldGFkYXRhIGFzIGxvdyBhcyBwb3NzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29tcG9zZShsb2dnZXI6IExvZ2dlciwgbWV0YU9yRnVuYzogTG9nTWV0YU9yRnVuYyk6IExvZ2dlciB7XG4gICAgLy8gRmxhdHRlbiByZWN1cnNpdmUgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEgaW5zdGFuY2VzXG4gICAgaWYgKGxvZ2dlciBpbnN0YW5jZW9mIExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKGxvZ2dlci5jb250cmlidXRvcnMsIG1ldGFPckZ1bmMpO1xuICAgICAgLy8gSWYgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluLCB0aGVuIHdlIGRvbid0IG5lZWQgYSBuZXcgbG9nZ2VyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiBsb2dnZXI7XG4gICAgICByZXR1cm4gbmV3IExvZ2dlcldpdGhDb21wb3NlZE1ldGFkYXRhKGxvZ2dlci5wYXJlbnRMb2dnZXIsIGNvbnRyaWJ1dG9ycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odW5kZWZpbmVkLCBtZXRhT3JGdW5jKTtcbiAgICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGxvZ2dlcjtcbiAgICAgIHJldHVybiBuZXcgTG9nZ2VyV2l0aENvbXBvc2VkTWV0YWRhdGEobG9nZ2VyLCBjb250cmlidXRvcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TG9nZ2VyOiBMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250cmlidXRvcnM6IExvZ01ldGFPckZ1bmNbXVxuICApIHt9XG5cbiAgbG9nKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmxvZyhsZXZlbCwgbWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxuXG4gIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci50cmFjZShtZXNzYWdlLCByZXNvbHZlTWV0YWRhdGEodGhpcy5jb250cmlidXRvcnMsIGV4dHJhTWV0YSkpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBleHRyYU1ldGE/OiBMb2dNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50TG9nZ2VyLmRlYnVnKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci5pbmZvKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXh0cmFNZXRhPzogTG9nTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudExvZ2dlci53YXJuKG1lc3NhZ2UsIHJlc29sdmVNZXRhZGF0YSh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFNZXRhKSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRMb2dnZXIuZXJyb3IobWVzc2FnZSwgcmVzb2x2ZU1ldGFkYXRhKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYU1ldGEpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTWV0YWRhdGEoY29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10sIGV4dHJhTWV0YT86IExvZ01ldGFkYXRhKTogTG9nTWV0YWRhdGEge1xuICBjb25zdCByZXNvbHZlZCA9IHt9O1xuICBmb3IgKGNvbnN0IGNvbnRyaWJ1dG9yIG9mIGNvbnRyaWJ1dG9ycykge1xuICAgIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIHR5cGVvZiBjb250cmlidXRvciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRyaWJ1dG9yKCkgOiBjb250cmlidXRvcik7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihyZXNvbHZlZCwgZXh0cmFNZXRhKTtcbiAgcmV0dXJuIGZpbHRlck51bGxBbmRVbmRlZmluZWQocmVzb2x2ZWQpO1xufVxuXG4vKipcbiAqIEFwcGVuZCBhIG1ldGFkYXRhIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBib3RoIGFyZSBwbGFpbiBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZFRvQ2hhaW4oXG4gIGV4aXN0aW5nQ29udHJpYnV0b3JzOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQsXG4gIG5ld0NvbnRyaWJ1dG9yOiBMb2dNZXRhT3JGdW5jXG4pOiBMb2dNZXRhT3JGdW5jW10gfCB1bmRlZmluZWQge1xuICAvLyBJZiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIGFuIGVtcHR5IG9iamVjdCwgdGhlbiBpdCByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluXG4gIGlmICh0eXBlb2YgbmV3Q29udHJpYnV0b3IgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKG5ld0NvbnRyaWJ1dG9yKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZXhpc3RpbmdDb250cmlidXRvcnM7XG4gIH1cblxuICAvLyBJZiBleGlzdGluZyBjaGFpbiBpcyBlbXB0eSwgdGhlbiB0aGUgbmV3IGNvbnRyaWJ1dG9yIGlzIHRoZSBjaGFpblxuICBpZiAoZXhpc3RpbmdDb250cmlidXRvcnMgPT0gbnVsbCB8fCBleGlzdGluZ0NvbnRyaWJ1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW25ld0NvbnRyaWJ1dG9yXTtcbiAgfVxuXG4gIC8vIElmIGJvdGggbGFzdCBjb250cmlidXRvciBhbmQgbmV3IGNvbnRyaWJ1dG9yIGFyZSBwbGFpbiBvYmplY3RzLCBtZXJnZSB0aGVtIHRvIGEgc2luZ2xlIG9iamVjdC5cbiAgY29uc3QgbGFzdCA9IGV4aXN0aW5nQ29udHJpYnV0b3JzW2V4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCAtIDFdO1xuICBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZU9iamVjdHMobGFzdCwgbmV3Q29udHJpYnV0b3IpO1xuICAgIGlmIChtZXJnZWQgPT09IGxhc3QpIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgICByZXR1cm4gWy4uLmV4aXN0aW5nQ29udHJpYnV0b3JzLnNsaWNlKDAsIC0xKSwgbWVyZ2VkXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB7IGZpbHRlck51bGxBbmRVbmRlZmluZWQsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIEEgbWV0ZXIgZm9yIGNyZWF0aW5nIG1ldHJpY3MgdG8gcmVjb3JkIHZhbHVlcyBvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljTWV0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBmb3IgdGhlIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaGlzdG9ncmFtIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHJlY29yZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gcmVjb3JkLiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGhpc3RvZ3JhbSBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gZm9yIHRoZSBoaXN0b2dyYW0gbWV0cmljLiBPcHRpb25hbC5cbiAgICovXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlPzogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0hpc3RvZ3JhbTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGdhdWdlIG1ldHJpYyB0aGF0IHN1cHBvcnRzIHNldHRpbmcgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIGZvciB0aGUgZ2F1Z2UgbWV0cmljLlxuICAgKiBAcGFyYW0gdmFsdWVUeXBlIFR5cGUgb2YgdmFsdWUgdG8gc2V0LiBEZWZhdWx0cyB0byBgaW50YC5cbiAgICogQHBhcmFtIHVuaXQgVW5pdCBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIGdhdWdlIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqL1xuICBjcmVhdGVHYXVnZShuYW1lOiBzdHJpbmcsIHZhbHVlVHlwZT86IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsIHVuaXQ/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogTWV0cmljR2F1Z2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB1cC1kb3duIGNvdW50ZXIgbWV0cmljIHRoYXQgc3VwcG9ydHMgYWRkaW5nIHNpZ25lZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgZm9yIHRoZSB1cC1kb3duIGNvdW50ZXIgbWV0cmljLlxuICAgKiBAcGFyYW0gdW5pdCBVbml0IGZvciB0aGUgdXAtZG93biBjb3VudGVyIG1ldHJpYy4gT3B0aW9uYWwuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBmb3IgdGhlIHVwLWRvd24gY291bnRlciBtZXRyaWMuIE9wdGlvbmFsLlxuICAgKi9cbiAgY3JlYXRlVXBEb3duQ291bnRlcj8obmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXI7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgbWV0ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLiBBbGwgbWV0cmljcyBjcmVhdGVkIG9mZiB0aGUgbWV0ZXIgd2lsbFxuICAgKiBoYXZlIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZC5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlcjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIG1ldHJpY3MuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0cmljLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pdCBvZiB0aGUgbWV0cmljLCBpZiBhbnkuXG4gICAqL1xuICB1bml0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldHJpYywgaWYgYW55LlxuICAgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIHRoZSBtZXRyaWMgKGUuZy4gYGNvdW50ZXJgLCBgaGlzdG9ncmFtYCwgYGdhdWdlYCkuXG4gICAqL1xuICBraW5kOiBNZXRyaWNLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB2YWx1ZSByZWNvcmRlZCBieSB0aGUgbWV0cmljLiBFaXRoZXIgYGludGAgb3IgYGZsb2F0YC5cbiAgICovXG4gIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZTtcbn1cblxuLyoqXG4gKiBUYWdzIHRvIGJlIGF0dGFjaGVkIHRvIHNvbWUgbWV0cmljcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3MgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcblxuLyoqXG4gKiBUeXBlIG9mIG51bWVyaWNhbCB2YWx1ZXMgcmVjb3JkZWQgYnkgYSBtZXRyaWMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgcmVwcmVzZW50cyB0aGUgX2NvbmZpZ3VyYXRpb25fIG9mIHRoZSBtZXRyaWM7IGhvd2V2ZXIsIHNpbmNlIEphdmFTY3JpcHQgZG9lc24ndFxuICogaGF2ZSBkaWZmZXJlbnQgcnVudGltZSByZXByZXNlbnRhdGlvbiBmb3IgaW50ZWdlcnMgYW5kIGZsb2F0cywgdGhlIGFjdHVhbCB2YWx1ZSB0eXBlIGlzIGFsd2F5c1xuICogYSBKUyAnbnVtYmVyJy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyB8ICdmbG9hdCc7XG5cbi8qKlxuICogVGhlIGtpbmQgb2YgYSBtZXRyaWMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgdHlwZSBNZXRyaWNLaW5kID0gJ2NvdW50ZXInIHwgJ2hpc3RvZ3JhbScgfCAnZ2F1Z2UnIHwgJ3VwLWRvd24tY291bnRlcic7XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgdmFsdWVzIGFzIGEgY291bnRlci5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljQ291bnRlciBleHRlbmRzIE1ldHJpYyB7XG4gIC8qKlxuICAgKiBBZGQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBjb3VudGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYWRkLlxuICAgKiBAcGFyYW0gZXh0cmFUYWdzIEV4dHJhIHRhZ3MgaWYgYW55LlxuICAgKi9cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBjbG9uZSBvZiB0aGlzIGNvdW50ZXIsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0NvdW50ZXI7XG5cbiAga2luZDogJ2NvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vKipcbiAqIEEgbWV0cmljIHRoYXQgc3VwcG9ydHMgcmVjb3JkaW5nIHZhbHVlcyBvbiBhIGhpc3RvZ3JhbS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljSGlzdG9ncmFtIGV4dGVuZHMgTWV0cmljIHtcbiAgLyoqXG4gICAqIFJlY29yZCB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIGhpc3RvZ3JhbS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHJlY29yZC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFZhbHVlIHdpbGwgYmUgY2FzdGVkIHRvIHRoZSBnaXZlblxuICAgKiAgICAgICAgICAgICAge0BsaW5rIHZhbHVlVHlwZX0uIExvc3Mgb2YgcHJlY2lzaW9uIG1heSBvY2N1ciBpZiB0aGUgdmFsdWUgaXMgbm90IGFscmVhZHkgb2YgdGhlXG4gICAqICAgICAgICAgICAgICBjb3JyZWN0IHR5cGUuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgaGlzdG9ncmFtLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNIaXN0b2dyYW07XG5cbiAga2luZDogJ2hpc3RvZ3JhbSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBzZXR0aW5nIHZhbHVlcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRoZSBNZXRyaWMgQVBJIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBtYXkgYmUgc3ViamVjdCB0byBjaGFuZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0cmljR2F1Z2UgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogU2V0IHRoZSBnaXZlbiB2YWx1ZSBvbiB0aGUgZ2F1Z2UuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBzZXQuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBzZXQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgZ2F1Z2UsIHdpdGggYWRkaXRpb25hbCB0YWdzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFncyBUYWdzIHRvIGFwcGVuZCB0byBleGlzdGluZyB0YWdzLlxuICAgKi9cbiAgd2l0aFRhZ3ModGFnczogTWV0cmljVGFncyk6IE1ldHJpY0dhdWdlO1xuXG4gIGtpbmQ6ICdnYXVnZSc7XG59XG5cbi8qKlxuICogQSBtZXRyaWMgdGhhdCBzdXBwb3J0cyBhZGRpbmcgc2lnbmVkIHZhbHVlcyBhcyBhbiB1cC1kb3duIGNvdW50ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1VwRG93bkNvdW50ZXIgZXh0ZW5kcyBNZXRyaWMge1xuICAvKipcbiAgICogQWRkIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgdXAtZG93biBjb3VudGVyLiBWYWx1ZSBtYXkgYmUgbmVnYXRpdmUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byBhZGQgKGNhbiBiZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSkuXG4gICAqIEBwYXJhbSBleHRyYVRhZ3MgRXh0cmEgdGFncyBpZiBhbnkuXG4gICAqL1xuICBhZGQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgdXAtZG93biBjb3VudGVyLCB3aXRoIGFkZGl0aW9uYWwgdGFncy5cbiAgICpcbiAgICogQHBhcmFtIHRhZ3MgVGFncyB0byBhcHBlbmQgdG8gZXhpc3RpbmcgdGFncy5cbiAgICovXG4gIHdpdGhUYWdzKHRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNVcERvd25Db3VudGVyO1xuXG4gIGtpbmQ6ICd1cC1kb3duLWNvdW50ZXInO1xuICB2YWx1ZVR5cGU6ICdpbnQnO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQSBtZXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90aGluZy5cbiAqL1xuY2xhc3MgTm9vcE1ldHJpY01ldGVyIGltcGxlbWVudHMgTWV0cmljTWV0ZXIge1xuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2NvdW50ZXInLFxuICAgICAgdmFsdWVUeXBlOiAnaW50JyxcblxuICAgICAgYWRkKF92YWx1ZSwgX2V4dHJhVGFncykge30sXG5cbiAgICAgIHdpdGhUYWdzKF9leHRyYVRhZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHVuaXQsXG4gICAgICBkZXNjcmlwdGlvbixcblxuICAgICAga2luZDogJ2hpc3RvZ3JhbScsXG4gICAgICB2YWx1ZVR5cGUsXG5cbiAgICAgIHJlY29yZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY3JlYXRlR2F1Z2UoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljR2F1Z2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAnZ2F1Z2UnLFxuICAgICAgdmFsdWVUeXBlLFxuXG4gICAgICBzZXQoX3ZhbHVlLCBfZXh0cmFUYWdzKSB7fSxcblxuICAgICAgd2l0aFRhZ3MoX2V4dHJhVGFncykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgdW5pdCxcbiAgICAgIGRlc2NyaXB0aW9uLFxuXG4gICAgICBraW5kOiAndXAtZG93bi1jb3VudGVyJyxcbiAgICAgIHZhbHVlVHlwZTogJ2ludCcsXG5cbiAgICAgIGFkZChfdmFsdWUsIF9leHRyYVRhZ3MpIHt9LFxuXG4gICAgICB3aXRoVGFncyhfZXh0cmFUYWdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgd2l0aFRhZ3MoX2V4dHJhVGFnczogTWV0cmljVGFncyk6IE1ldHJpY01ldGVyIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgbm9vcE1ldHJpY01ldGVyID0gbmV3IE5vb3BNZXRyaWNNZXRlcigpO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCB0eXBlIE1ldHJpY1RhZ3NPckZ1bmMgPSBNZXRyaWNUYWdzIHwgKCgpID0+IE1ldHJpY1RhZ3MpO1xuXG4vKipcbiAqIEEgbWV0ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhZGRzIHRhZ3MgYmVmb3JlIGRlbGVnYXRpbmcgY2FsbHMgdG8gYSBwYXJlbnQgbWV0ZXIuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNNZXRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSB7QGxpbmsgTWV0cmljTWV0ZXJ9IHRoYXQgYWRkcyB0YWdzIGJlZm9yZSBkZWxlZ2F0aW5nIGNhbGxzIHRvIGEgcGFyZW50IG1ldGVyLlxuICAgKlxuICAgKiBOZXcgdGFncyBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBzdGF0aWNhbGx5IGFzIGEgZGVsdGEgb2JqZWN0LCBvciBhcyBhIGZ1bmN0aW9uIGV2YWx1YXRlZFxuICAgKiBldmVyeSB0aW1lIGEgbWV0cmljIGlzIHJlY29yZGVkIHRoYXQgd2lsbCByZXR1cm4gYSBkZWx0YSBvYmplY3QuXG4gICAqXG4gICAqIFNvbWUgb3B0aW1pemF0aW9ucyBhcmUgcGVyZm9ybWVkIHRvIGF2b2lkIGNyZWF0aW5nIHVubmVjZXNzYXJ5IG9iamVjdHMgYW5kIHRvIGtlZXAgcnVudGltZVxuICAgKiBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggcmVzb2x2aW5nIHRhZ3MgYXMgbG93IGFzIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0ZXIgVGhlIHBhcmVudCBtZXRlciB0byBkZWxlZ2F0ZSBjYWxscyB0by5cbiAgICogQHBhcmFtIHRhZ3NPckZ1bmMgTmV3IHRhZ3MgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgc3RhdGljYWxseSBhcyBhIGRlbHRhIG9iamVjdCwgb3IgYXMgYSBmdW5jdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICBldmFsdWF0ZWQgZXZlcnkgdGltZSBhIG1ldHJpYyBpcyByZWNvcmRlZCB0aGF0IHdpbGwgcmV0dXJuIGEgZGVsdGEgb2JqZWN0LlxuICAgKiBAcGFyYW0gZm9yY2UgaWYgYHRydWVgLCB0aGVuIGEgYE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFnc2Agd2lsbCBiZSBjcmVhdGVkIGV2ZW4gaWYgdGhlcmVcbiAgICogICAgICAgICAgICAgIGlzIG5vIHRhZ3MgdG8gYWRkLiBUaGlzIGlzIHVzZWZ1bCB0byBhZGQgdGFncyBzdXBwb3J0IHRvIGFuIHVuZGVybHlpbmcgbWV0ZXJcbiAgICogICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0YWdzIGRpcmVjdGx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjb21wb3NlKG1ldGVyOiBNZXRyaWNNZXRlciwgdGFnc09yRnVuYzogTWV0cmljVGFnc09yRnVuYywgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IE1ldHJpY01ldGVyIHtcbiAgICBpZiAobWV0ZXIgaW5zdGFuY2VvZiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MpIHtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4obWV0ZXIuY29udHJpYnV0b3JzLCB0YWdzT3JGdW5jKTtcbiAgICAgIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgcmVzdWx0cyBpbiBubyBhY3R1YWwgY2hhbmdlIHRvIHRoZSBjaGFpbiwgdGhlbiB3ZSBkb24ndCBuZWVkIGEgbmV3IG1ldGVyXG4gICAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQgJiYgIWZvcmNlKSByZXR1cm4gbWV0ZXI7XG4gICAgICByZXR1cm4gbmV3IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyhtZXRlci5wYXJlbnRNZXRlciwgY29udHJpYnV0b3JzID8/IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih1bmRlZmluZWQsIHRhZ3NPckZ1bmMpO1xuICAgICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkICYmICFmb3JjZSkgcmV0dXJuIG1ldGVyO1xuICAgICAgcmV0dXJuIG5ldyBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MobWV0ZXIsIGNvbnRyaWJ1dG9ycyA/PyBbXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudE1ldGVyOiBNZXRyaWNNZXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICBjcmVhdGVDb3VudGVyKG5hbWU6IHN0cmluZywgdW5pdD86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBwYXJlbnRDb3VudGVyID0gdGhpcy5wYXJlbnRNZXRlci5jcmVhdGVDb3VudGVyKG5hbWUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgICByZXR1cm4gbmV3IE1ldHJpY0NvdW50ZXJXaXRoQ29tcG9zZWRUYWdzKHBhcmVudENvdW50ZXIsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUhpc3RvZ3JhbShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlID0gJ2ludCcsXG4gICAgdW5pdD86IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICApOiBNZXRyaWNIaXN0b2dyYW0ge1xuICAgIGNvbnN0IHBhcmVudEhpc3RvZ3JhbSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlSGlzdG9ncmFtKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICAgIHJldHVybiBuZXcgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyhwYXJlbnRIaXN0b2dyYW0sIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBjb25zdCBwYXJlbnRHYXVnZSA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlR2F1Z2UobmFtZSwgdmFsdWVUeXBlLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNHYXVnZVdpdGhDb21wb3NlZFRhZ3MocGFyZW50R2F1Z2UsIHRoaXMuY29udHJpYnV0b3JzKTtcbiAgfVxuXG4gIGNyZWF0ZVVwRG93bkNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcyBndWFyZCBvbmNlIHVwLWRvd24tY291bnRlciBzdXBwb3J0IGlzIGNvbXBsZXRlIG9uIGFsbCBNZXRyaWNNZXRlclxuICAgIC8vIGltcGxlbWVudGF0aW9ucyBhbmQgYGNyZWF0ZVVwRG93bkNvdW50ZXJgIGlzIG5vIGxvbmdlciBvcHRpb25hbCBvbiBNZXRyaWNNZXRlci5cbiAgICBpZiAoIXRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVVcERvd25Db3VudGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgbWV0ZXInKTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50Q291bnRlciA9IHRoaXMucGFyZW50TWV0ZXIuY3JlYXRlVXBEb3duQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyhwYXJlbnRDb3VudGVyLCB0aGlzLmNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICB3aXRoVGFncyh0YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljTWV0ZXIge1xuICAgIHJldHVybiBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3MuY29tcG9zZSh0aGlzLCB0YWdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljQ291bnRlcldpdGhDb21wb3NlZFRhZ3MgaW1wbGVtZW50cyBNZXRyaWNDb3VudGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnY291bnRlcic7XG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGUgPSAnaW50JztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhcmVudENvdW50ZXI6IE1ldHJpY0NvdW50ZXIsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudENvdW50ZXIuYWRkKHZhbHVlLCByZXNvbHZlVGFncyh0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKSk7XG4gIH1cblxuICB3aXRoVGFncyhleHRyYVRhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNDb3VudGVyV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudENvdW50ZXIsIGNvbnRyaWJ1dG9ycyk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIubmFtZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci51bml0O1xuICB9XG5cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Q291bnRlci5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBleHBlcmltZW50YWwgVGhlIE1ldHJpYyBBUEkgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIG1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqL1xuY2xhc3MgTWV0cmljSGlzdG9ncmFtV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY0hpc3RvZ3JhbSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2hpc3RvZ3JhbSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRIaXN0b2dyYW06IE1ldHJpY0hpc3RvZ3JhbSxcbiAgICBwcml2YXRlIGNvbnRyaWJ1dG9yczogTWV0cmljVGFnc09yRnVuY1tdXG4gICkge31cblxuICByZWNvcmQodmFsdWU6IG51bWJlciwgZXh0cmFUYWdzPzogTWV0cmljVGFncyk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50SGlzdG9ncmFtLnJlY29yZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBjb25zdCBjb250cmlidXRvcnMgPSBhcHBlbmRUb0NoYWluKHRoaXMuY29udHJpYnV0b3JzLCBleHRyYVRhZ3MpO1xuICAgIGlmIChjb250cmlidXRvcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWNIaXN0b2dyYW1XaXRoQ29tcG9zZWRUYWdzKHRoaXMucGFyZW50SGlzdG9ncmFtLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0ubmFtZTtcbiAgfVxuXG4gIGdldCB2YWx1ZVR5cGUoKTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnZhbHVlVHlwZTtcbiAgfVxuXG4gIGdldCB1bml0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50SGlzdG9ncmFtLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRIaXN0b2dyYW0uZGVzY3JpcHRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuY2xhc3MgTWV0cmljR2F1Z2VXaXRoQ29tcG9zZWRUYWdzIGltcGxlbWVudHMgTWV0cmljR2F1Z2Uge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdnYXVnZSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRHYXVnZTogTWV0cmljR2F1Z2UsXG4gICAgcHJpdmF0ZSBjb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXVxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudEdhdWdlLnNldCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIGNvbnN0IGNvbnRyaWJ1dG9ycyA9IGFwcGVuZFRvQ2hhaW4odGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncyk7XG4gICAgaWYgKGNvbnRyaWJ1dG9ycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gbmV3IE1ldHJpY0dhdWdlV2l0aENvbXBvc2VkVGFncyh0aGlzLnBhcmVudEdhdWdlLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5uYW1lO1xuICB9XG5cbiAgZ2V0IHZhbHVlVHlwZSgpOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS52YWx1ZVR5cGU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudEdhdWdlLnVuaXQ7XG4gIH1cblxuICBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRHYXVnZS5kZXNjcmlwdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5jbGFzcyBNZXRyaWNVcERvd25Db3VudGVyV2l0aENvbXBvc2VkVGFncyBpbXBsZW1lbnRzIE1ldHJpY1VwRG93bkNvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICd1cC1kb3duLWNvdW50ZXInO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWVUeXBlID0gJ2ludCc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJlbnRDb3VudGVyOiBNZXRyaWNVcERvd25Db3VudGVyLFxuICAgIHByaXZhdGUgY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW11cbiAgKSB7fVxuXG4gIGFkZCh2YWx1ZTogbnVtYmVyLCBleHRyYVRhZ3M/OiBNZXRyaWNUYWdzIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wYXJlbnRDb3VudGVyLmFkZCh2YWx1ZSwgcmVzb2x2ZVRhZ3ModGhpcy5jb250cmlidXRvcnMsIGV4dHJhVGFncykpO1xuICB9XG5cbiAgd2l0aFRhZ3MoZXh0cmFUYWdzOiBNZXRyaWNUYWdzKTogTWV0cmljVXBEb3duQ291bnRlciB7XG4gICAgY29uc3QgY29udHJpYnV0b3JzID0gYXBwZW5kVG9DaGFpbih0aGlzLmNvbnRyaWJ1dG9ycywgZXh0cmFUYWdzKTtcbiAgICBpZiAoY29udHJpYnV0b3JzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBuZXcgTWV0cmljVXBEb3duQ291bnRlcldpdGhDb21wb3NlZFRhZ3ModGhpcy5wYXJlbnRDb3VudGVyLCBjb250cmlidXRvcnMpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnRDb3VudGVyLm5hbWU7XG4gIH1cblxuICBnZXQgdW5pdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIudW5pdDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBhcmVudENvdW50ZXIuZGVzY3JpcHRpb247XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZ3MoY29udHJpYnV0b3JzOiBNZXRyaWNUYWdzT3JGdW5jW10sIGV4dHJhVGFncz86IE1ldHJpY1RhZ3MpOiBNZXRyaWNUYWdzIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSB7fTtcbiAgZm9yIChjb25zdCBjb250cmlidXRvciBvZiBjb250cmlidXRvcnMpIHtcbiAgICBPYmplY3QuYXNzaWduKHJlc29sdmVkLCB0eXBlb2YgY29udHJpYnV0b3IgPT09ICdmdW5jdGlvbicgPyBjb250cmlidXRvcigpIDogY29udHJpYnV0b3IpO1xuICB9XG4gIE9iamVjdC5hc3NpZ24ocmVzb2x2ZWQsIGV4dHJhVGFncyk7XG4gIHJldHVybiBmaWx0ZXJOdWxsQW5kVW5kZWZpbmVkKHJlc29sdmVkKTtcbn1cblxuLyoqXG4gKiBBcHBlbmQgYSB0YWdzIGNvbnRyaWJ1dG9yIHRvIHRoZSBjaGFpbiwgbWVyZ2luZyBpdCB3aXRoIHRoZSBmb3JtZXIgbGFzdCBjb250cmlidXRvciBpZiBwb3NzaWJsZS5cbiAqXG4gKiBJZiBhcHBlbmRpbmcgdGhlIG5ldyBjb250cmlidXRvciByZXN1bHRzIGluIG5vIGFjdHVhbCBjaGFuZ2UgdG8gdGhlIGNoYWluIG9mIGNvbnRyaWJ1dG9ycywgcmV0dXJuXG4gKiBgZXhpc3RpbmdDb250cmlidXRvcnNgOyBpbiB0aGF0IGNhc2UsIHRoZSBjYWxsZXIgc2hvdWxkIGF2b2lkIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBpZiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9DaGFpbihcbiAgZXhpc3RpbmdDb250cmlidXRvcnM6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCxcbiAgbmV3Q29udHJpYnV0b3I6IE1ldHJpY1RhZ3NPckZ1bmNcbik6IE1ldHJpY1RhZ3NPckZ1bmNbXSB8IHVuZGVmaW5lZCB7XG4gIC8vIElmIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgYW4gZW1wdHkgb2JqZWN0LCB0aGVuIGl0IHJlc3VsdHMgaW4gbm8gYWN0dWFsIGNoYW5nZSB0byB0aGUgY2hhaW5cbiAgaWYgKHR5cGVvZiBuZXdDb250cmlidXRvciA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMobmV3Q29udHJpYnV0b3IpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBleGlzdGluZ0NvbnRyaWJ1dG9ycztcbiAgfVxuXG4gIC8vIElmIGV4aXN0aW5nIGNoYWluIGlzIGVtcHR5LCB0aGVuIHRoZSBuZXcgY29udHJpYnV0b3IgaXMgdGhlIGNoYWluXG4gIGlmIChleGlzdGluZ0NvbnRyaWJ1dG9ycyA9PSBudWxsIHx8IGV4aXN0aW5nQ29udHJpYnV0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbbmV3Q29udHJpYnV0b3JdO1xuICB9XG5cbiAgLy8gSWYgYm90aCBsYXN0IGNvbnRyaWJ1dG9yIGFuZCBuZXcgY29udHJpYnV0b3IgYXJlIHBsYWluIG9iamVjdHMsIG1lcmdlIHRoZW0gdG8gYSBzaW5nbGUgb2JqZWN0LlxuICBjb25zdCBsYXN0ID0gZXhpc3RpbmdDb250cmlidXRvcnNbZXhpc3RpbmdDb250cmlidXRvcnMubGVuZ3RoIC0gMV07XG4gIGlmICh0eXBlb2YgbGFzdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5ld0NvbnRyaWJ1dG9yID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlT2JqZWN0cyhsYXN0LCBuZXdDb250cmlidXRvcik7XG4gICAgaWYgKG1lcmdlZCA9PT0gbGFzdCkgcmV0dXJuIGV4aXN0aW5nQ29udHJpYnV0b3JzO1xuICAgIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMuc2xpY2UoMCwgLTEpLCBtZXJnZWQhXTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwganVzdCBhcHBlbmQgdGhlIG5ldyBjb250cmlidXRvciB0byB0aGUgY2hhaW4uXG4gIHJldHVybiBbLi4uZXhpc3RpbmdDb250cmlidXRvcnMsIG5ld0NvbnRyaWJ1dG9yXTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5cbi8qKlxuICogUHJpb3JpdHkgY29udGFpbnMgbWV0YWRhdGEgdGhhdCBjb250cm9scyByZWxhdGl2ZSBvcmRlcmluZyBvZiB0YXNrIHByb2Nlc3Npbmcgd2hlbiB0YXNrcyBhcmVcbiAqIGJhY2tsb2dnZWQgaW4gYSBxdWV1ZS4gSW5pdGlhbGx5LCBQcmlvcml0eSB3aWxsIGJlIHVzZWQgaW4gYWN0aXZpdHkgYW5kIHdvcmtmbG93IHRhc2sgcXVldWVzLFxuICogd2hpY2ggYXJlIHR5cGljYWxseSB3aGVyZSBiYWNrbG9ncyBleGlzdC5cbiAqIFByaW9yaXR5IGlzIChmb3Igbm93KSBhdHRhY2hlZCB0byB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuIEFjdGl2aXRpZXMgYW5kIGNoaWxkIHdvcmtmbG93c1xuICogaW5oZXJpdCBQcmlvcml0eSBmcm9tIHRoZSB3b3JrZmxvdyB0aGF0IGNyZWF0ZWQgdGhlbSwgYnV0IG1heSBvdmVycmlkZSBmaWVsZHMgd2hlbiB0aGV5IGFyZVxuICogc3RhcnRlZCBvciBtb2RpZmllZC4gRm9yIGVhY2ggZmllbGQgb2YgYSBQcmlvcml0eSBvbiBhbiBhY3Rpdml0eS93b3JrZmxvdywgbm90IHByZXNlbnQgb3IgZXF1YWxcbiAqIHRvIHplcm8vZW1wdHkgc3RyaW5nIG1lYW5zIHRvIGluaGVyaXQgdGhlIHZhbHVlIGZyb20gdGhlIGNhbGxpbmcgd29ya2Zsb3csIG9yIGlmIHRoZXJlIGlzIG5vXG4gKiBjYWxsaW5nIHdvcmtmbG93LCB0aGVuIHVzZSB0aGUgZGVmYXVsdCAoZG9jdW1lbnRlZCBvbiB0aGUgZmllbGQpLlxuICogVGhlIG92ZXJhbGwgc2VtYW50aWNzIG9mIFByaW9yaXR5IGFyZTpcbiAqIDEuIEZpcnN0LCBjb25zaWRlciBcInByaW9yaXR5X2tleVwiOiBsb3dlciBudW1iZXIgZ29lcyBmaXJzdC5cbiAqIDIuIFRoZW4sIGNvbnNpZGVyIGZhaXJuZXNzOiB0aGUgZmFpcm5lc3MgbWVjaGFuaXNtIGF0dGVtcHRzIHRvIGRpc3BhdGNoIHRhc2tzIGZvciBhIGdpdmVuIGtleSBpblxuICogICAgcHJvcG9ydGlvbiB0byBpdHMgd2VpZ2h0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaW9yaXR5IHtcbiAgLyoqXG4gICAqIFByaW9yaXR5IGtleSBpcyBhIHBvc2l0aXZlIGludGVnZXIgZnJvbSAxIHRvIG4sIHdoZXJlIHNtYWxsZXIgaW50ZWdlcnNcbiAgICogY29ycmVzcG9uZCB0byBoaWdoZXIgcHJpb3JpdGllcyAodGFza3MgcnVuIHNvb25lcikuIEluIGdlbmVyYWwsIHRhc2tzIGluXG4gICAqIGEgcXVldWUgc2hvdWxkIGJlIHByb2Nlc3NlZCBpbiBjbG9zZSB0byBwcmlvcml0eSBvcmRlciwgYWx0aG91Z2ggc21hbGxcbiAgICogZGV2aWF0aW9ucyBhcmUgcG9zc2libGUuXG4gICAqXG4gICAqIFRoZSBtYXhpbXVtIHByaW9yaXR5IHZhbHVlIChtaW5pbXVtIHByaW9yaXR5KSBpcyBkZXRlcm1pbmVkIGJ5IHNlcnZlciBjb25maWd1cmF0aW9uLCBhbmRcbiAgICogZGVmYXVsdHMgdG8gNS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgKG1pbittYXgpLzIuIFdpdGggdGhlIGRlZmF1bHQgbWF4IG9mIDUgYW5kIG1pbiBvZiAxLCB0aGF0IGNvbWVzIG91dCB0byAzLlxuICAgKi9cbiAgcHJpb3JpdHlLZXk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZhaXJuZXNzS2V5IGlzIGEgc2hvcnQgc3RyaW5nIHRoYXQncyB1c2VkIGFzIGEga2V5IGZvciBhIGZhaXJuZXNzXG4gICAqIGJhbGFuY2luZyBtZWNoYW5pc20uIEl0IG1heSBjb3JyZXNwb25kIHRvIGEgdGVuYW50IGlkLCBvciB0byBhIGZpeGVkXG4gICAqIHN0cmluZyBsaWtlIFwiaGlnaFwiIG9yIFwibG93XCIuIFRoZSBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAqXG4gICAqIFRoZSBmYWlybmVzcyBtZWNoYW5pc20gYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGFza3MgZm9yIGEgZ2l2ZW4ga2V5IGluXG4gICAqIHByb3BvcnRpb24gdG8gaXRzIHdlaWdodC4gRm9yIGV4YW1wbGUsIHVzaW5nIGEgdGhvdXNhbmQgZGlzdGluY3QgdGVuYW50XG4gICAqIGlkcywgZWFjaCB3aXRoIGEgd2VpZ2h0IG9mIDEuMCAodGhlIGRlZmF1bHQpIHdpbGwgcmVzdWx0IGluIGVhY2ggdGVuYW50XG4gICAqIGdldHRpbmcgYSByb3VnaGx5IGVxdWFsIHNoYXJlIG9mIHRhc2sgZGlzcGF0Y2ggdGhyb3VnaHB1dC5cbiAgICpcbiAgICogRmFpcm5lc3Mga2V5cyBhcmUgbGltaXRlZCB0byA2NCBieXRlcy5cbiAgICovXG4gIGZhaXJuZXNzS2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlybmVzc1dlaWdodCBmb3IgYSB0YXNrIGNhbiBjb21lIGZyb20gbXVsdGlwbGUgc291cmNlcyBmb3JcbiAgICogZmxleGliaWxpdHkuIEZyb20gaGlnaGVzdCB0byBsb3dlc3QgcHJlY2VkZW5jZTpcbiAgICogMS4gV2VpZ2h0cyBmb3IgYSBzbWFsbCBzZXQgb2Yga2V5cyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0YXNrIHF1ZXVlXG4gICAqICAgIGNvbmZpZ3VyYXRpb24gd2l0aCBhbiBBUEkuXG4gICAqIDIuIEl0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgd29ya2Zsb3cvYWN0aXZpdHkgaW4gdGhpcyBmaWVsZC5cbiAgICogMy4gVGhlIGRlZmF1bHQgd2VpZ2h0IG9mIDEuMCB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIFdlaWdodCB2YWx1ZXMgYXJlIGNsYW1wZWQgdG8gdGhlIHJhbmdlIFswLjAwMSwgMTAwMF0uXG4gICAqL1xuICBmYWlybmVzc1dlaWdodD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUdXJuIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eSBpbnRvIGEgVFMgUHJpb3JpdHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVByaW9yaXR5KHByaW9yaXR5PzogdGVtcG9yYWwuYXBpLmNvbW1vbi52MS5JUHJpb3JpdHkgfCBudWxsKTogUHJpb3JpdHkge1xuICByZXR1cm4ge1xuICAgIHByaW9yaXR5S2V5OiBwcmlvcml0eT8ucHJpb3JpdHlLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzS2V5OiBwcmlvcml0eT8uZmFpcm5lc3NLZXkgPz8gdW5kZWZpbmVkLFxuICAgIGZhaXJuZXNzV2VpZ2h0OiBwcmlvcml0eT8uZmFpcm5lc3NXZWlnaHQgPz8gdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBQcmlvcml0eSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBQcmlvcml0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByaW9yaXR5KHByaW9yaXR5OiBQcmlvcml0eSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVByaW9yaXR5IHtcbiAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5ICE9PSB1bmRlZmluZWQgJiYgcHJpb3JpdHkucHJpb3JpdHlLZXkgIT09IG51bGwpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIocHJpb3JpdHkucHJpb3JpdHlLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmlvcml0eUtleSBtdXN0IGJlIGFuIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHByaW9yaXR5LnByaW9yaXR5S2V5IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3ByaW9yaXR5S2V5IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwcmlvcml0eUtleTogcHJpb3JpdHkucHJpb3JpdHlLZXkgPz8gMCxcbiAgICBmYWlybmVzc0tleTogcHJpb3JpdHkuZmFpcm5lc3NLZXkgPz8gJycsXG4gICAgZmFpcm5lc3NXZWlnaHQ6IHByaW9yaXR5LmZhaXJuZXNzV2VpZ2h0ID8/IDAsXG4gIH07XG59XG4iLCJleHBvcnQgY29uc3QgVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYID0gJ19fdGVtcG9yYWxfJztcbmV4cG9ydCBjb25zdCBTVEFDS19UUkFDRV9RVUVSWV9OQU1FID0gJ19fc3RhY2tfdHJhY2UnO1xuZXhwb3J0IGNvbnN0IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUgPSAnX19lbmhhbmNlZF9zdGFja190cmFjZSc7XG5cbi8qKlxuICogVmFsaWQgZW50aXR5IHR5cGVzIHRoYXQgY2FuIGJlIGNoZWNrZWQgZm9yIHJlc2VydmVkIG5hbWUgdmlvbGF0aW9uc1xuICovXG5leHBvcnQgdHlwZSBSZXNlcnZlZE5hbWVFbnRpdHlUeXBlID0gJ3F1ZXJ5JyB8ICdzaWduYWwnIHwgJ3VwZGF0ZScgfCAnYWN0aXZpdHknIHwgJ3Rhc2sgcXVldWUnIHwgJ3NpbmsnIHwgJ3dvcmtmbG93JztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgaWYgdGhlIHByb3ZpZGVkIG5hbWUgY29udGFpbnMgYW55IHJlc2VydmVkIHByZWZpeGVzIG9yIG1hdGNoZXMgYW55IHJlc2VydmVkIG5hbWVzLlxuICogVGhyb3dzIGEgVHlwZUVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHMsIHdpdGggYSBzcGVjaWZpYyBtZXNzYWdlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaXNzdWVcbiAqIGlzIHdpdGggYSByZXNlcnZlZCBwcmVmaXggb3IgYW4gZXhhY3QgbWF0Y2ggdG8gYSByZXNlcnZlZCBuYW1lLlxuICpcbiAqIEBwYXJhbSB0eXBlIFRoZSBlbnRpdHkgdHlwZSBiZWluZyBjaGVja2VkXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBjaGVjayBhZ2FpbnN0IHJlc2VydmVkIHByZWZpeGVzL25hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd0lmUmVzZXJ2ZWROYW1lKHR5cGU6IFJlc2VydmVkTmFtZUVudGl0eVR5cGUsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAobmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlICR7dHlwZX0gbmFtZTogJyR7bmFtZX0nLCB3aXRoIHJlc2VydmVkIHByZWZpeDogJyR7VEVNUE9SQUxfUkVTRVJWRURfUFJFRklYfSdgKTtcbiAgfVxuXG4gIGlmIChuYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8IG5hbWUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlICR7dHlwZX0gbmFtZTogJyR7bmFtZX0nLCB3aGljaCBpcyBhIHJlc2VydmVkIG5hbWVgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyB0ZW1wb3JhbCB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnLi90aW1lJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb051bWJlciwgbXNPcHRpb25hbFRvVHMsIG1zVG9OdW1iZXIsIG1zVG9Ucywgb3B0aW9uYWxUc1RvTXMgfSBmcm9tICcuL3RpbWUnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJldHJ5aW5nIFdvcmtmbG93cyBhbmQgQWN0aXZpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5UG9saWN5IHtcbiAgLyoqXG4gICAqIENvZWZmaWNpZW50IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuZXh0IHJldHJ5IGludGVydmFsLlxuICAgKiBUaGUgbmV4dCByZXRyeSBpbnRlcnZhbCBpcyBwcmV2aW91cyBpbnRlcnZhbCBtdWx0aXBsaWVkIGJ5IHRoaXMgY29lZmZpY2llbnQuXG4gICAqIEBtaW5pbXVtIDFcbiAgICogQGRlZmF1bHQgMlxuICAgKi9cbiAgYmFja29mZkNvZWZmaWNpZW50PzogbnVtYmVyO1xuICAvKipcbiAgICogSW50ZXJ2YWwgb2YgdGhlIGZpcnN0IHJldHJ5LlxuICAgKiBJZiBjb2VmZmljaWVudCBpcyAxIHRoZW4gaXQgaXMgdXNlZCBmb3IgYWxsIHJldHJpZXNcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqIEBkZWZhdWx0IDEgc2Vjb25kXG4gICAqL1xuICBpbml0aWFsSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzLiBXaGVuIGV4Y2VlZGVkLCByZXRyaWVzIHN0b3AgKGV2ZW4gaWYge0BsaW5rIEFjdGl2aXR5T3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0fVxuICAgKiBoYXNuJ3QgYmVlbiByZWFjaGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgSW5maW5pdHlcbiAgICovXG4gIG1heGltdW1BdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gaW50ZXJ2YWwgYmV0d2VlbiByZXRyaWVzLlxuICAgKiBFeHBvbmVudGlhbCBiYWNrb2ZmIGxlYWRzIHRvIGludGVydmFsIGluY3JlYXNlLlxuICAgKiBUaGlzIHZhbHVlIGlzIHRoZSBjYXAgb2YgdGhlIGluY3JlYXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDB4IG9mIHtAbGluayBpbml0aWFsSW50ZXJ2YWx9XG4gICAqIEBmb3JtYXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgbWF4aW11bUludGVydmFsPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgYXBwbGljYXRpb24gZmFpbHVyZXMgdHlwZXMgdG8gbm90IHJldHJ5LlxuICAgKi9cbiAgbm9uUmV0cnlhYmxlRXJyb3JUeXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFR1cm4gYSBUUyBSZXRyeVBvbGljeSBpbnRvIGEgcHJvdG8gY29tcGF0aWJsZSBSZXRyeVBvbGljeVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVJldHJ5UG9saWN5KHJldHJ5UG9saWN5OiBSZXRyeVBvbGljeSk6IHRlbXBvcmFsLmFwaS5jb21tb24udjEuSVJldHJ5UG9saWN5IHtcbiAgaWYgKHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCAhPSBudWxsICYmIHJldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5LmJhY2tvZmZDb2VmZmljaWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gIH1cbiAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyAhPSBudWxsKSB7XG4gICAgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7XG4gICAgICAvLyBkcm9wIGZpZWxkIChJbmZpbml0eSBpcyB0aGUgZGVmYXVsdClcbiAgICAgIGNvbnN0IHsgbWF4aW11bUF0dGVtcHRzOiBfLCAuLi53aXRob3V0IH0gPSByZXRyeVBvbGljeTtcbiAgICAgIHJldHJ5UG9saWN5ID0gd2l0aG91dDtcbiAgICB9IGVsc2UgaWYgKHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfSBlbHNlIGlmICghTnVtYmVyLmlzSW50ZWdlcihyZXRyeVBvbGljeS5tYXhpbXVtQXR0ZW1wdHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgIH1cbiAgfVxuICBjb25zdCBtYXhpbXVtSW50ZXJ2YWwgPSBtc09wdGlvbmFsVG9OdW1iZXIocmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsKTtcbiAgY29uc3QgaW5pdGlhbEludGVydmFsID0gbXNUb051bWJlcihyZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgPz8gMTAwMCk7XG4gIGlmIChtYXhpbXVtSW50ZXJ2YWwgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignUmV0cnlQb2xpY3kubWF4aW11bUludGVydmFsIGNhbm5vdCBiZSAwJyk7XG4gIH1cbiAgaWYgKGluaXRpYWxJbnRlcnZhbCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdSZXRyeVBvbGljeS5pbml0aWFsSW50ZXJ2YWwgY2Fubm90IGJlIDAnKTtcbiAgfVxuICBpZiAobWF4aW11bUludGVydmFsICE9IG51bGwgJiYgbWF4aW11bUludGVydmFsIDwgaW5pdGlhbEludGVydmFsKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1JldHJ5UG9saWN5Lm1heGltdW1JbnRlcnZhbCBjYW5ub3QgYmUgbGVzcyB0aGFuIGl0cyBpbml0aWFsSW50ZXJ2YWwnKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1heGltdW1BdHRlbXB0czogcmV0cnlQb2xpY3kubWF4aW11bUF0dGVtcHRzLFxuICAgIGluaXRpYWxJbnRlcnZhbDogbXNUb1RzKGluaXRpYWxJbnRlcnZhbCksXG4gICAgbWF4aW11bUludGVydmFsOiBtc09wdGlvbmFsVG9UcyhtYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50LFxuICAgIG5vblJldHJ5YWJsZUVycm9yVHlwZXM6IHJldHJ5UG9saWN5Lm5vblJldHJ5YWJsZUVycm9yVHlwZXMsXG4gIH07XG59XG5cbi8qKlxuICogVHVybiBhIHByb3RvIGNvbXBhdGlibGUgUmV0cnlQb2xpY3kgaW50byBhIFRTIFJldHJ5UG9saWN5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvbXBpbGVSZXRyeVBvbGljeShcbiAgcmV0cnlQb2xpY3k/OiB0ZW1wb3JhbC5hcGkuY29tbW9uLnYxLklSZXRyeVBvbGljeSB8IG51bGxcbik6IFJldHJ5UG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyZXRyeVBvbGljeSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhY2tvZmZDb2VmZmljaWVudDogcmV0cnlQb2xpY3kuYmFja29mZkNvZWZmaWNpZW50ID8/IHVuZGVmaW5lZCxcbiAgICBtYXhpbXVtQXR0ZW1wdHM6IHJldHJ5UG9saWN5Lm1heGltdW1BdHRlbXB0cyA/PyB1bmRlZmluZWQsXG4gICAgbWF4aW11bUludGVydmFsOiBvcHRpb25hbFRzVG9NcyhyZXRyeVBvbGljeS5tYXhpbXVtSW50ZXJ2YWwpLFxuICAgIGluaXRpYWxJbnRlcnZhbDogb3B0aW9uYWxUc1RvTXMocmV0cnlQb2xpY3kuaW5pdGlhbEludGVydmFsKSxcbiAgICBub25SZXRyeWFibGVFcnJvclR5cGVzOiByZXRyeVBvbGljeS5ub25SZXRyeWFibGVFcnJvclR5cGVzID8/IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHsgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKiogQGRlcHJlY2F0ZWQ6IFVzZSB7QGxpbmsgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBpbnN0ZWFkICovXG5leHBvcnQgdHlwZSBTZWFyY2hBdHRyaWJ1dGVWYWx1ZU9yUmVhZG9ubHkgPSBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSB8IFJlYWRvbmx5PFNlYXJjaEF0dHJpYnV0ZVZhbHVlPiB8IHVuZGVmaW5lZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuLyoqIEBkZXByZWNhdGVkOiBVc2Uge0BsaW5rIFR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZCAqL1xuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlcyA9IFJlY29yZDxzdHJpbmcsIFNlYXJjaEF0dHJpYnV0ZVZhbHVlT3JSZWFkb25seT47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbi8qKiBAZGVwcmVjYXRlZDogVXNlIHtAbGluayBUeXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQgKi9cbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVZhbHVlID0gc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXSB8IERhdGVbXTtcblxuZXhwb3J0IGNvbnN0IFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSB7XG4gIFRFWFQ6ICdURVhUJyxcbiAgS0VZV09SRDogJ0tFWVdPUkQnLFxuICBJTlQ6ICdJTlQnLFxuICBET1VCTEU6ICdET1VCTEUnLFxuICBCT09MOiAnQk9PTCcsXG4gIERBVEVUSU1FOiAnREFURVRJTUUnLFxuICBLRVlXT1JEX0xJU1Q6ICdLRVlXT1JEX0xJU1QnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNlYXJjaEF0dHJpYnV0ZVR5cGUgPSAodHlwZW9mIFNlYXJjaEF0dHJpYnV0ZVR5cGUpW2tleW9mIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuLy8gTm90ZTogZW5jb2RlU2VhcmNoQXR0cmlidXRlSW5kZXhlZFZhbHVlVHlwZSBleHBvcnRlZCBmb3IgdXNlIGluIHRlc3RzIHRvIHJlZ2lzdGVyIHNlYXJjaCBhdHRyaWJ1dGVzXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNvbnN0IFtlbmNvZGVTZWFyY2hBdHRyaWJ1dGVJbmRleGVkVmFsdWVUeXBlLCBfXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuSW5kZXhlZFZhbHVlVHlwZSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5JbmRleGVkVmFsdWVUeXBlLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkluZGV4ZWRWYWx1ZVR5cGUsXG4gIHR5cGVvZiBTZWFyY2hBdHRyaWJ1dGVUeXBlLFxuICAnSU5ERVhFRF9WQUxVRV9UWVBFXydcbj4oXG4gIHtcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5URVhUXTogMSxcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEXTogMixcbiAgICBbU2VhcmNoQXR0cmlidXRlVHlwZS5JTlRdOiAzLFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRV06IDQsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTF06IDUsXG4gICAgW1NlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUVdOiA2LFxuICAgIFtTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVF06IDcsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdJTkRFWEVEX1ZBTFVFX1RZUEVfJ1xuKTtcblxuaW50ZXJmYWNlIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nIHtcbiAgVEVYVDogc3RyaW5nO1xuICBLRVlXT1JEOiBzdHJpbmc7XG4gIElOVDogbnVtYmVyO1xuICBET1VCTEU6IG51bWJlcjtcbiAgQk9PTDogYm9vbGVhbjtcbiAgREFURVRJTUU6IERhdGU7XG4gIEtFWVdPUkRfTElTVDogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVmFsdWVGb3JUeXBlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlPihcbiAgdHlwZTogVCxcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIEluZGV4ZWRWYWx1ZVR5cGVNYXBwaW5nW1RdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkQ6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UOlxuICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDpcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUU6XG4gICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaEF0dHJpYnV0ZUtleTxUIGV4dGVuZHMgU2VhcmNoQXR0cmlidXRlVHlwZT4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTZWFyY2hBdHRyaWJ1dGVLZXk8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KG5hbWU6IHN0cmluZywgdHlwZTogVCk6IFNlYXJjaEF0dHJpYnV0ZUtleTxUPiB7XG4gIHJldHVybiB7IG5hbWUsIHR5cGUgfTtcbn1cblxuY2xhc3MgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQgZXh0ZW5kcyBTZWFyY2hBdHRyaWJ1dGVUeXBlLCBWID0gSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdHlwZTogVDtcbiAgcHJpdmF0ZSByZWFkb25seSBfdmFsdWU6IFY7XG5cbiAgY29uc3RydWN0b3IodHlwZTogVCwgdmFsdWU6IFYpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogViB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG59XG5cbi8vIEludGVybmFsIHR5cGUgZm9yIGNsYXNzIHByaXZhdGUgZGF0YS5cbi8vIEV4cG9ydGVkIGZvciB1c2UgaW4gcGF5bG9hZCBjb252ZXJzaW9uLlxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFQ+IHt9XG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dFxuZXhwb3J0IGNsYXNzIFR5cGVkU2VhcmNoQXR0cmlidXRlVXBkYXRlVmFsdWU8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+IGV4dGVuZHMgQmFzZVNlYXJjaEF0dHJpYnV0ZVZhbHVlPFxuICBULFxuICBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGxcbj4ge31cblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB9O1xufVtTZWFyY2hBdHRyaWJ1dGVUeXBlXTtcblxuZXhwb3J0IHR5cGUgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpciA9IHtcbiAgW1QgaW4gU2VhcmNoQXR0cmlidXRlVHlwZV06IHsga2V5OiBTZWFyY2hBdHRyaWJ1dGVLZXk8VD47IHZhbHVlOiBJbmRleGVkVmFsdWVUeXBlTWFwcGluZ1tUXSB8IG51bGwgfTtcbn1bU2VhcmNoQXR0cmlidXRlVHlwZV07XG5cbmV4cG9ydCBjbGFzcyBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMge1xuICBwcml2YXRlIHNlYXJjaEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVkU2VhcmNoQXR0cmlidXRlVmFsdWU8U2VhcmNoQXR0cmlidXRlVHlwZT4+ID0ge307XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbEF0dHJpYnV0ZXM/OiBTZWFyY2hBdHRyaWJ1dGVQYWlyW10pIHtcbiAgICBpZiAoaW5pdGlhbEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcGFpciBvZiBpbml0aWFsQXR0cmlidXRlcykge1xuICAgICAgaWYgKHBhaXIua2V5Lm5hbWUgaW4gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHNlYXJjaCBhdHRyaWJ1dGUga2V5OiAke3BhaXIua2V5Lm5hbWV9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQ8VCBleHRlbmRzIFNlYXJjaEF0dHJpYnV0ZVR5cGU+KGtleTogU2VhcmNoQXR0cmlidXRlS2V5PFQ+KTogSW5kZXhlZFZhbHVlVHlwZU1hcHBpbmdbVF0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNba2V5Lm5hbWVdO1xuICAgIC8vIEtleSBub3QgZm91bmQgb3IgdHlwZSBtaXNtYXRjaC5cbiAgICBpZiAoYXR0ciA9PT0gdW5kZWZpbmVkIHx8ICFpc1ZhbGlkVmFsdWVGb3JUeXBlKGtleS50eXBlLCBhdHRyLnZhbHVlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF0dHIudmFsdWU7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIGluc3RhbmNlICovXG4gIGNvcHkoKTogVHlwZWRTZWFyY2hBdHRyaWJ1dGVzIHtcbiAgICBjb25zdCBzdGF0ZTogUmVjb3JkPHN0cmluZywgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZTxTZWFyY2hBdHRyaWJ1dGVUeXBlPj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHNhbWUgcHJvcGVydGllc1xuICAgICAgbGV0IHZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICAgIC8vIEZvciBub24tcHJpbWl0aXZlIHR5cGVzLCBjcmVhdGUgYSBkZWVwIGNvcHlcbiAgICAgIGlmIChhdHRyLnZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKGF0dHIudmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGF0dHIudmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gWy4uLmF0dHIudmFsdWVdO1xuICAgICAgfVxuICAgICAgc3RhdGVba2V5XSA9IG5ldyBUeXBlZFNlYXJjaEF0dHJpYnV0ZVZhbHVlKGF0dHIudHlwZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSByZXR1cm4gdmFsdWUgd2l0aCBtYW51YWxseSBhc3NpZ25lZCBzdGF0ZS5cbiAgICBjb25zdCByZXMgPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzKCk7XG4gICAgcmVzLnNlYXJjaEF0dHJpYnV0ZXMgPSBzdGF0ZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBoaWRkZW5cbiAgICogUmV0dXJuIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjbGFzcyBhcyBTZWFyY2hBdHRyaWJ1dGVQYWlyW11cbiAgICogRGVmYXVsdCB0b0pTT04gbWV0aG9kIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQncyBKU09OIHJlcHJlc2VudGF0aW9uIGluY2x1ZGVzIHByaXZhdGUgc3RhdGUuXG4gICAqL1xuICB0b0pTT04oKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgY3VycmVudCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgaW5zdGFuY2Ugd2l0aCB0aGUgdXBkYXRlZCBhdHRyaWJ1dGVzLiAqL1xuICB1cGRhdGVDb3B5KHVwZGF0ZXM6IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IFR5cGVkU2VhcmNoQXR0cmlidXRlcyB7XG4gICAgLy8gQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgIGNvbnN0IHJlcyA9IHRoaXMuY29weSgpO1xuICAgIC8vIEFwcGx5IHVwZGF0ZXMuXG4gICAgcmVzLnVwZGF0ZSh1cGRhdGVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLy8gUGVyZm9ybXMgZGlyZWN0IG11dGF0aW9uIG9uIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICBwcml2YXRlIHVwZGF0ZSh1cGRhdGVzOiBTZWFyY2hBdHRyaWJ1dGVVcGRhdGVQYWlyW10pIHtcbiAgICAvLyBBcHBseSB1cGRhdGVzLlxuICAgIGZvciAoY29uc3QgcGFpciBvZiB1cGRhdGVzKSB7XG4gICAgICAvLyBEZWxldGUgYXR0cmlidXRlLlxuICAgICAgaWYgKHBhaXIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgLy8gRGVsZXRlIG9ubHkgaWYgdGhlIHVwZGF0ZSBtYXRjaGVzIGEga2V5IGFuZCB0eXBlLlxuICAgICAgICBjb25zdCBhdHRyVmFsID0gdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICBpZiAoYXR0clZhbCAmJiBhdHRyVmFsLnR5cGUgPT09IHBhaXIua2V5LnR5cGUpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5zZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gQWRkIG9yIHVwZGF0ZSBhdHRyaWJ1dGUuXG4gICAgICB0aGlzLnNlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBuZXcgVHlwZWRTZWFyY2hBdHRyaWJ1dGVWYWx1ZShwYWlyLmtleS50eXBlLCBwYWlyLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRBbGwoKTogU2VhcmNoQXR0cmlidXRlUGFpcltdIHtcbiAgICBjb25zdCByZXM6IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgYXR0cl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZWFyY2hBdHRyaWJ1dGVzKSkge1xuICAgICAgY29uc3QgYXR0cktleSA9IHsgbmFtZToga2V5LCB0eXBlOiBhdHRyLnR5cGUgfTtcbiAgICAgIC8vIFNhbml0eSBjaGVjaywgc2hvdWxkIGFsd2F5cyBiZSBsZWdhbC5cbiAgICAgIGlmIChpc1ZhbGlkVmFsdWVGb3JUeXBlKGF0dHJLZXkudHlwZSwgYXR0ci52YWx1ZSkpIHtcbiAgICAgICAgcmVzLnB1c2goeyBrZXk6IGF0dHJLZXksIHZhbHVlOiBhdHRyLnZhbHVlIH0gYXMgU2VhcmNoQXR0cmlidXRlUGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBzdGF0aWMgZ2V0S2V5RnJvbVVudHlwZWQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFNlYXJjaEF0dHJpYnV0ZVZhbHVlT3JSZWFkb25seSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICk6IFNlYXJjaEF0dHJpYnV0ZUtleTxTZWFyY2hBdHRyaWJ1dGVUeXBlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVbnBhY2sgc2luZ2xlLWVsZW1lbnQgYXJyYXlzLlxuICAgIGNvbnN0IHZhbCA9IHZhbHVlLmxlbmd0aCA9PT0gMSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAvLyBDaGVjayBpZiB2YWwgaXMgYW4gSVNPIHN0cmluZywgaWYgc28sIHJldHVybiBhIERBVEVUSU1FIGtleS5cbiAgICAgICAgaWYgKCFpc05hTihEYXRlLnBhcnNlKHZhbCkpICYmIERhdGUucGFyc2UodmFsKSA9PT0gbmV3IERhdGUodmFsKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuVEVYVCB9O1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgdHlwZTogTnVtYmVyLmlzSW50ZWdlcih2YWwpID8gU2VhcmNoQXR0cmlidXRlVHlwZS5JTlQgOiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRPVUJMRSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTCB9O1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICByZXR1cm4geyBuYW1lOiBrZXksIHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUuREFURVRJTUUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgIHJldHVybiB7IG5hbWU6IGtleSwgdHlwZTogU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1QgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHRvTWV0YWRhdGFUeXBlKHR5cGU6IFNlYXJjaEF0dHJpYnV0ZVR5cGUpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ6XG4gICAgICAgIHJldHVybiAnVGV4dCc7XG4gICAgICBjYXNlIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRDpcbiAgICAgICAgcmV0dXJuICdLZXl3b3JkJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5JTlQ6XG4gICAgICAgIHJldHVybiAnSW50JztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU6XG4gICAgICAgIHJldHVybiAnRG91YmxlJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5CT09MOlxuICAgICAgICByZXR1cm4gJ0Jvb2wnO1xuICAgICAgY2FzZSBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FOlxuICAgICAgICByZXR1cm4gJ0RhdGV0aW1lJztcbiAgICAgIGNhc2UgU2VhcmNoQXR0cmlidXRlVHlwZS5LRVlXT1JEX0xJU1Q6XG4gICAgICAgIHJldHVybiAnS2V5d29yZExpc3QnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNlYXJjaCBhdHRyaWJ1dGUgdHlwZTogJHt0eXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b1NlYXJjaEF0dHJpYnV0ZVR5cGUodHlwZTogc3RyaW5nKTogU2VhcmNoQXR0cmlidXRlVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhlIHR5cGUgbWV0YWRhdGEgaXMgdXN1YWxseSBpbiBQYXNjYWxDYXNlIChlLmcuIFwiS2V5d29yZExpc3RcIikgYnV0IGluXG4gICAgLy8gcmFyZSBjYXNlcyBtYXkgYmUgaW4gU0NSRUFNSU5HX1NOQUtFX0NBU0UgKGUuZy4gXCJJTkRFWEVEX1ZBTFVFX1RZUEVfS0VZV09SRF9MSVNUXCIpLlxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnVGV4dCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfVEVYVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLlRFWFQ7XG4gICAgICBjYXNlICdLZXl3b3JkJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9LRVlXT1JEJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuS0VZV09SRDtcbiAgICAgIGNhc2UgJ0ludCc6XG4gICAgICBjYXNlICdJTkRFWEVEX1ZBTFVFX1RZUEVfSU5UJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuSU5UO1xuICAgICAgY2FzZSAnRG91YmxlJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9ET1VCTEUnOlxuICAgICAgICByZXR1cm4gU2VhcmNoQXR0cmlidXRlVHlwZS5ET1VCTEU7XG4gICAgICBjYXNlICdCb29sJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9CT09MJzpcbiAgICAgICAgcmV0dXJuIFNlYXJjaEF0dHJpYnV0ZVR5cGUuQk9PTDtcbiAgICAgIGNhc2UgJ0RhdGV0aW1lJzpcbiAgICAgIGNhc2UgJ0lOREVYRURfVkFMVUVfVFlQRV9EQVRFVElNRSc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLkRBVEVUSU1FO1xuICAgICAgY2FzZSAnS2V5d29yZExpc3QnOlxuICAgICAgY2FzZSAnSU5ERVhFRF9WQUxVRV9UWVBFX0tFWVdPUkRfTElTVCc6XG4gICAgICAgIHJldHVybiBTZWFyY2hBdHRyaWJ1dGVUeXBlLktFWVdPUkRfTElTVDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBMb25nIGZyb20gJ2xvbmcnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCBtcyBmcm9tICdtcyc7XG5pbXBvcnQgdHlwZSB7IGdvb2dsZSB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB7IFZhbHVlRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIE5PVEU6IHRoZXNlIGFyZSB0aGUgc2FtZSBpbnRlcmZhY2UgaW4gSlNcbi8vIGdvb2dsZS5wcm90b2J1Zi5JRHVyYXRpb247XG4vLyBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcbi8vIFRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBiZWxvdyBzaG91bGQgd29yayBmb3IgYm90aFxuXG5leHBvcnQgdHlwZSBUaW1lc3RhbXAgPSBnb29nbGUucHJvdG9idWYuSVRpbWVzdGFtcDtcblxuLyoqXG4gKiBBIGR1cmF0aW9uLCBleHByZXNzZWQgZWl0aGVyIGFzIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgb3IgYXMgYSB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqL1xuZXhwb3J0IHR5cGUgRHVyYXRpb24gPSBTdHJpbmdWYWx1ZSB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcblxuLyoqXG4gKiBMb3NzeSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gVGltZXN0YW1wIHRvIG51bWJlciBkdWUgdG8gcG9zc2libGUgb3ZlcmZsb3cuXG4gKiBJZiB0cyBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvdy5cbiAqIElmIHRzIGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aHJvd3MgYSBUeXBlRXJyb3IsIHdpdGggZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZWRUc1RvTXModHM6IFRpbWVzdGFtcCB8IG51bGwgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAke2ZpZWxkTmFtZX0gdG8gYmUgYSB0aW1lc3RhbXAsIGdvdCAke3RzfWApO1xuICB9XG4gIHJldHVybiB0c1RvTXModHMpO1xufVxuXG4vKipcbiAqIExvc3N5IGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbSBUaW1lc3RhbXAgdG8gbnVtYmVyIGR1ZSB0byBwb3NzaWJsZSBvdmVyZmxvd1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHNUb01zKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKHRzID09PSB1bmRlZmluZWQgfHwgdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRpbWVzdGFtcCwgZ290ICR7dHN9YCk7XG4gIH1cbiAgY29uc3QgeyBzZWNvbmRzLCBuYW5vcyB9ID0gdHM7XG4gIHJldHVybiAoc2Vjb25kcyB8fCBMb25nLlVaRVJPKVxuICAgIC5tdWwoMTAwMClcbiAgICAuYWRkKE1hdGguZmxvb3IoKG5hbm9zIHx8IDApIC8gMTAwMDAwMCkpXG4gICAgLnRvTnVtYmVyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc051bWJlclRvVHMobWlsbGlzOiBudW1iZXIpOiBUaW1lc3RhbXAge1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTtcbiAgY29uc3QgbmFub3MgPSAobWlsbGlzICUgMTAwMCkgKiAxMDAwMDAwO1xuICBpZiAoTnVtYmVyLmlzTmFOKHNlY29uZHMpIHx8IE51bWJlci5pc05hTihuYW5vcykpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBtaWxsaXMgJHttaWxsaXN9YCk7XG4gIH1cbiAgcmV0dXJuIHsgc2Vjb25kczogTG9uZy5mcm9tTnVtYmVyKHNlY29uZHMpLCBuYW5vcyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb1RzKHN0cjogRHVyYXRpb24pOiBUaW1lc3RhbXAge1xuICByZXR1cm4gbXNOdW1iZXJUb1RzKG1zVG9OdW1iZXIoc3RyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtc09wdGlvbmFsVG9UcyhzdHI6IER1cmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHIgPyBtc1RvVHMoc3RyKSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1zT3B0aW9uYWxUb051bWJlcih2YWw6IER1cmF0aW9uIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbXNUb051bWJlcih2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXNUb051bWJlcih2YWw6IER1cmF0aW9uKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICByZXR1cm4gbXNXaXRoVmFsaWRhdGlvbih2YWwpO1xufVxuXG5mdW5jdGlvbiBtc1dpdGhWYWxpZGF0aW9uKHN0cjogU3RyaW5nVmFsdWUpOiBudW1iZXIge1xuICBjb25zdCBtaWxsaXMgPSBtcyhzdHIpO1xuICBpZiAobWlsbGlzID09IG51bGwgfHwgaXNOYU4obWlsbGlzKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZHVyYXRpb24gc3RyaW5nOiAnJHtzdHJ9J2ApO1xuICB9XG4gIHJldHVybiBtaWxsaXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0c1RvRGF0ZSh0czogVGltZXN0YW1wKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZSh0c1RvTXModHMpKTtcbn1cblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZFRzVG9EYXRlKHRzOiBUaW1lc3RhbXAgfCBudWxsIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyk6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUocmVxdWlyZWRUc1RvTXModHMsIGZpZWxkTmFtZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxUc1RvRGF0ZSh0czogVGltZXN0YW1wIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCB1bmRlZmluZWQge1xuICBpZiAodHMgPT09IHVuZGVmaW5lZCB8fCB0cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBEYXRlKHRzVG9Ncyh0cykpO1xufVxuXG4vLyB0cy1wcnVuZS1pZ25vcmUtbmV4dCAoaW1wb3J0ZWQgdmlhIHNjaGVkdWxlLWhlbHBlcnMudHMpXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxEYXRlVG9UcyhkYXRlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFRpbWVzdGFtcCB8IHVuZGVmaW5lZCB7XG4gIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1zVG9UcyhkYXRlLmdldFRpbWUoKSk7XG59XG4iLCJleHBvcnQgdHlwZSBOb25OdWxsYWJsZU9iamVjdDxUPiA9IHsgW1AgaW4ga2V5b2YgVF0tPzogTm9uTnVsbGFibGU8VFtQXT4gfTtcblxuLyoqIFNob3J0aGFuZCBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgQW55RnVuYyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4vKiogQSB0dXBsZSB3aXRob3V0IGl0cyBsYXN0IGVsZW1lbnQgKi9cbmV4cG9ydCB0eXBlIE9taXRMYXN0PFQ+ID0gVCBleHRlbmRzIFsuLi5pbmZlciBSRVNULCBhbnldID8gUkVTVCA6IG5ldmVyO1xuXG4vKiogRiB3aXRoIGFsbCBhcmd1bWVudHMgYnV0IHRoZSBsYXN0ICovXG5leHBvcnQgdHlwZSBPbWl0TGFzdFBhcmFtPEYgZXh0ZW5kcyBBbnlGdW5jPiA9ICguLi5hcmdzOiBPbWl0TGFzdDxQYXJhbWV0ZXJzPEY+PikgPT4gUmV0dXJuVHlwZTxGPjtcblxuZXhwb3J0IHR5cGUgT21pdEZpcnN0PFQ+ID0gVCBleHRlbmRzIFthbnksIC4uLmluZmVyIFJFU1RdID8gUkVTVCA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBPbWl0Rmlyc3RQYXJhbTxUPiA9IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueVxuICA/ICguLi5hcmdzOiBPbWl0Rmlyc3Q8UGFyYW1ldGVyczxUPj4pID0+IFJldHVyblR5cGU8VD5cbiAgOiBuZXZlcjtcblxuLyoqIFJlcXVpcmUgdGhhdCBUIGhhcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgZGVmaW5lZCAqL1xuZXhwb3J0IHR5cGUgUmVxdWlyZUF0TGVhc3RPbmU8VCwgS2V5cyBleHRlbmRzIGtleW9mIFQgPSBrZXlvZiBUPiA9IFBpY2s8VCwgRXhjbHVkZTxrZXlvZiBULCBLZXlzPj4gJlxuICB7XG4gICAgW0sgaW4gS2V5c10tPzogUmVxdWlyZWQ8UGljazxULCBLPj4gJiBQYXJ0aWFsPFBpY2s8VCwgRXhjbHVkZTxLZXlzLCBLPj4+O1xuICB9W0tleXNdO1xuXG4vKiogVmVyaWZ5IHRoYXQgYW4gdHlwZSBfQ29weSBleHRlbmRzIF9PcmlnICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFeHRlbmRzPF9PcmlnLCBfQ29weSBleHRlbmRzIF9PcmlnPigpOiB2b2lkIHtcbiAgLy8gbm9vcCwganVzdCB0eXBlIGNoZWNrXG59XG5cbmV4cG9ydCB0eXBlIFJlcGxhY2U8QmFzZSwgTmV3PiA9IE9taXQ8QmFzZSwga2V5b2YgTmV3PiAmIE5ldztcblxuLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3VuaW9uLXRvLWludGVyc2VjdGlvbi5kLnRzXG4vLyBNSVQgb3IgQ0MwLTEuMCDigJQgSXQgaXMgbWVhbnQgdG8gYmUgY29waWVkIGludG8geW91ciBjb2RlYmFzZSByYXRoZXIgdGhhbiBiZWluZyB1c2VkIGFzIGEgZGVwZW5kZW5jeS5cbmV4cG9ydCB0eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VW5pb24+ID1cbiAgLy8gYGV4dGVuZHMgdW5rbm93bmAgaXMgYWx3YXlzIGdvaW5nIHRvIGJlIHRoZSBjYXNlIGFuZCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGBVbmlvbmAgaW50byBhXG4gIC8vIFtkaXN0cmlidXRpdmUgY29uZGl0aW9uYWwgdHlwZV0oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svcmVsZWFzZS1ub3Rlcy90eXBlc2NyaXB0LTItOC5odG1sI2Rpc3RyaWJ1dGl2ZS1jb25kaXRpb25hbC10eXBlcykuXG4gIChcbiAgICBVbmlvbiBleHRlbmRzIHVua25vd25cbiAgICAgID8gLy8gVGhlIHVuaW9uIHR5cGUgaXMgdXNlZCBhcyB0aGUgb25seSBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIHNpbmNlIHRoZSB1bmlvblxuICAgICAgICAvLyBvZiBmdW5jdGlvbiBhcmd1bWVudHMgaXMgYW4gaW50ZXJzZWN0aW9uLlxuICAgICAgICAoZGlzdHJpYnV0ZWRVbmlvbjogVW5pb24pID0+IHZvaWRcbiAgICAgIDogLy8gVGhpcyB3b24ndCBoYXBwZW4uXG4gICAgICAgIG5ldmVyXG4gICkgZXh0ZW5kcyAvLyBJbmZlciB0aGUgYEludGVyc2VjdGlvbmAgdHlwZSBzaW5jZSBUeXBlU2NyaXB0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uYWxcbiAgLy8gYXJndW1lbnRzIG9mIHVuaW9ucyBvZiBmdW5jdGlvbnMgYXMgYW4gaW50ZXJzZWN0aW9uIG9mIHRoZSB1bmlvbi5cbiAgKG1lcmdlZEludGVyc2VjdGlvbjogaW5mZXIgSW50ZXJzZWN0aW9uKSA9PiB2b2lkXG4gICAgPyAvLyBUaGUgYCYgVW5pb25gIGlzIHRvIGFsbG93IGluZGV4aW5nIGJ5IHRoZSByZXN1bHRpbmcgdHlwZVxuICAgICAgSW50ZXJzZWN0aW9uICYgVW5pb25cbiAgICA6IG5ldmVyO1xuXG50eXBlIElzRXF1YWw8QSwgQj4gPSAoPEc+KCkgPT4gRyBleHRlbmRzIEEgPyAxIDogMikgZXh0ZW5kcyA8Rz4oKSA9PiBHIGV4dGVuZHMgQiA/IDEgOiAyID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFByaW1pdGl2ZSA9IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3ltYm9sIHwgYmlnaW50O1xuXG50eXBlIElzTnVsbDxUPiA9IFtUXSBleHRlbmRzIFtudWxsXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Vua25vd248VD4gPSB1bmtub3duIGV4dGVuZHMgVCAvLyBgVGAgY2FuIGJlIGB1bmtub3duYCBvciBgYW55YFxuICA/IElzTnVsbDxUPiBleHRlbmRzIGZhbHNlIC8vIGBhbnlgIGNhbiBiZSBgbnVsbGAsIGJ1dCBgdW5rbm93bmAgY2FuJ3QgYmVcbiAgICA/IHRydWVcbiAgICA6IGZhbHNlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0VmFsdWU8VCwgSz4gPSBLIGV4dGVuZHMga2V5b2YgVFxuICA/IFRbS11cbiAgOiBUb1N0cmluZzxLPiBleHRlbmRzIGtleW9mIFRcbiAgICA/IFRbVG9TdHJpbmc8Sz5dXG4gICAgOiBLIGV4dGVuZHMgYCR7aW5mZXIgTnVtYmVySyBleHRlbmRzIG51bWJlcn1gXG4gICAgICA/IE51bWJlcksgZXh0ZW5kcyBrZXlvZiBUXG4gICAgICAgID8gVFtOdW1iZXJLXVxuICAgICAgICA6IG5ldmVyXG4gICAgICA6IG5ldmVyO1xuXG50eXBlIFRvU3RyaW5nPFQ+ID0gVCBleHRlbmRzIHN0cmluZyB8IG51bWJlciA/IGAke1R9YCA6IG5ldmVyO1xuXG50eXBlIEtleXNPZlVuaW9uPE9iamVjdFR5cGU+ID0gT2JqZWN0VHlwZSBleHRlbmRzIHVua25vd24gPyBrZXlvZiBPYmplY3RUeXBlIDogbmV2ZXI7XG5cbnR5cGUgQXJyYXlFbGVtZW50PFQ+ID0gVCBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXSA/IFRbMF0gOiBuZXZlcjtcblxudHlwZSBFeGFjdE9iamVjdDxQYXJhbWV0ZXJUeXBlLCBJbnB1dFR5cGU+ID0ge1xuICBbS2V5IGluIGtleW9mIFBhcmFtZXRlclR5cGVdOiBFeGFjdDxQYXJhbWV0ZXJUeXBlW0tleV0sIE9iamVjdFZhbHVlPElucHV0VHlwZSwgS2V5Pj47XG59ICYgUmVjb3JkPEV4Y2x1ZGU8a2V5b2YgSW5wdXRUeXBlLCBLZXlzT2ZVbmlvbjxQYXJhbWV0ZXJUeXBlPj4sIG5ldmVyPjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8UGFyYW1ldGVyVHlwZSwgSW5wdXRUeXBlPiA9XG4gIC8vIEJlZm9yZSBkaXN0cmlidXRpbmcsIGNoZWNrIGlmIHRoZSB0d28gdHlwZXMgYXJlIGVxdWFsIGFuZCBpZiBzbywgcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbW1lZGlhdGVseVxuICBJc0VxdWFsPFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT4gZXh0ZW5kcyB0cnVlXG4gICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgOiAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGEgcHJpbWl0aXZlLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gICAgICA/IFBhcmFtZXRlclR5cGVcbiAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhbiB1bmtub3duLCByZXR1cm4gaXQgYXMgaXMgaW1tZWRpYXRlbHkgdG8gYXZvaWQgaXQgYmVpbmcgY29udmVydGVkIHRvIGEgY29tcGxleCB0eXBlXG4gICAgICAgIElzVW5rbm93bjxQYXJhbWV0ZXJUeXBlPiBleHRlbmRzIHRydWVcbiAgICAgICAgPyB1bmtub3duXG4gICAgICAgIDogLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIEZ1bmN0aW9uLCByZXR1cm4gaXQgYXMgaXMgYmVjYXVzZSB0aGlzIHR5cGUgaXMgbm90IGNhcGFibGUgb2YgaGFuZGxpbmcgZnVuY3Rpb24sIGxlYXZlIGl0IHRvIFR5cGVTY3JpcHRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gICAgICAgICAgUGFyYW1ldGVyVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gICAgICAgICAgPyBQYXJhbWV0ZXJUeXBlXG4gICAgICAgICAgOiAvLyBDb252ZXJ0IHVuaW9uIG9mIGFycmF5IHRvIGFycmF5IG9mIHVuaW9uOiBBW10gJiBCW10gPT4gKEEgJiBCKVtdXG4gICAgICAgICAgICBQYXJhbWV0ZXJUeXBlIGV4dGVuZHMgdW5rbm93bltdXG4gICAgICAgICAgICA/IEFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgOiAvLyBJbiBUeXBlU2NyaXB0LCBBcnJheSBpcyBhIHN1YnR5cGUgb2YgUmVhZG9ubHlBcnJheSwgc28gYWx3YXlzIHRlc3QgQXJyYXkgYmVmb3JlIFJlYWRvbmx5QXJyYXkuXG4gICAgICAgICAgICAgIFBhcmFtZXRlclR5cGUgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW11cbiAgICAgICAgICAgICAgPyBSZWFkb25seUFycmF5PEV4YWN0PEFycmF5RWxlbWVudDxQYXJhbWV0ZXJUeXBlPiwgQXJyYXlFbGVtZW50PElucHV0VHlwZT4+PlxuICAgICAgICAgICAgICA6IEV4YWN0T2JqZWN0PFBhcmFtZXRlclR5cGUsIElucHV0VHlwZT47XG4vLyBFbmQgb2YgYm9ycm93IGZyb20gIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2UvdW5pb24tdG8taW50ZXJzZWN0aW9uLmQudHNcblxuZXhwb3J0IHR5cGUgUmVtb3ZlUHJlZml4PFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5cyBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrIGluIEtleXNdOiBrIGV4dGVuZHMgYCR7UHJlZml4fSR7aW5mZXIgU3VmZml4fWAgPyBTdWZmaXggOiBuZXZlcjtcbn1bS2V5c107XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eTxYIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFkgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHJlY29yZDogWCxcbiAgcHJvcDogWVxuKTogcmVjb3JkIGlzIFggJiBSZWNvcmQ8WSwgdW5rbm93bj4ge1xuICByZXR1cm4gcHJvcCBpbiByZWNvcmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0aWVzPFggZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgWSBleHRlbmRzIFByb3BlcnR5S2V5PihcbiAgcmVjb3JkOiBYLFxuICBwcm9wczogWVtdXG4pOiByZWNvcmQgaXMgWCAmIFJlY29yZDxZLCB1bmtub3duPiB7XG4gIHJldHVybiBwcm9wcy5ldmVyeSgocHJvcCkgPT4gcHJvcCBpbiByZWNvcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yIHtcbiAgcmV0dXJuIChcbiAgICBpc1JlY29yZChlcnJvcikgJiZcbiAgICB0eXBlb2YgZXJyb3IubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAoZXJyb3Iuc3RhY2sgPT0gbnVsbCB8fCB0eXBlb2YgZXJyb3Iuc3RhY2sgPT09ICdzdHJpbmcnKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBYm9ydEVycm9yKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgRXJyb3IgJiB7IG5hbWU6ICdBYm9ydEVycm9yJyB9IHtcbiAgcmV0dXJuIGlzRXJyb3IoZXJyb3IpICYmIGVycm9yLm5hbWUgPT09ICdBYm9ydEVycm9yJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLm1lc3NhZ2VgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIEVycm9yV2l0aENvZGUge1xuICBjb2RlOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzRXJyb3JXaXRoQ29kZShlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEVycm9yV2l0aENvZGUge1xuICByZXR1cm4gaXNSZWNvcmQoZXJyb3IpICYmIHR5cGVvZiBlcnJvci5jb2RlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBHZXQgYGVycm9yLmNvZGVgIChvciBgdW5kZWZpbmVkYCBpZiBub3QgcHJlc2VudClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBzb21lIHR5cGUgaXMgdGhlIG5ldmVyIHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKG1zZzogc3RyaW5nLCB4OiBuZXZlcik6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihtc2cgKyAnOiAnICsgeCk7XG59XG5cbmV4cG9ydCB0eXBlIENsYXNzPEUgZXh0ZW5kcyBFcnJvcj4gPSB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59O1xuXG4vKipcbiAqIEEgZGVjb3JhdG9yIHRvIGJlIHVzZWQgb24gZXJyb3IgY2xhc3Nlcy4gSXQgYWRkcyB0aGUgJ25hbWUnIHByb3BlcnR5IEFORCBwcm92aWRlcyBhIGN1c3RvbVxuICogJ2luc3RhbmNlb2YnIGhhbmRsZXIgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcjxFIGV4dGVuZHMgRXJyb3I+KG1hcmtlck5hbWU6IHN0cmluZyk6IChjbGF6ejogQ2xhc3M8RT4pID0+IHZvaWQge1xuICByZXR1cm4gKGNsYXp6OiBDbGFzczxFPik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fdGVtcG9yYWxfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenoucHJvdG90eXBlLCAnbmFtZScsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgbWFya2VyLCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhenosIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9iamVjdC1zaG9ydGhhbmRcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiAodGhpczogYW55LCBlcnJvcjogb2JqZWN0KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICAgIHJldHVybiBpc1JlY29yZChlcnJvcikgJiYgKGVycm9yIGFzIGFueSlbbWFya2VyXSA9PT0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgICAvLyBmcm9tIGNsYXp6J3MgW1N5bWJvbC5oYXNJbnN0YW5jZV0uIElmIHdlIGRvbid0IGhhbmRsZSB0aGlzIHBhcnRpY3VsYXIgc2l0dWF0aW9uLCB0aGVuXG4gICAgICAgICAgLy8gYHggaW5zdGFuY2VvZiBTdWJjbGFzc09mUGFyZW50YCB3b3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW55IGluc3RhbmNlIG9mICdQYXJlbnQnLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSWRlYWxseSwgaXQnZCBiZSBwcmVmZXJhYmxlIHRvIGF2b2lkIHRoaXMgY2FzZSBlbnRpcmVseSwgYnkgbWFraW5nIHN1cmUgdGhhdCBhbGwgc3ViY2xhc3NlcyBvZiAnY2xhenonXG4gICAgICAgICAgLy8gcmVkZWZpbmUgW1N5bWJvbC5oYXNJbnN0YW5jZV0sIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQuIFdlIHRoZXJlZm9yZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZW9mXG4gICAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlcnJvcik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkQ29udmVydGVyIH0gZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXInO1xuaW1wb3J0IHsgY29udmVydE9wdGlvbmFsVG9QYXlsb2FkIH0gZnJvbSAnLi9jb252ZXJ0ZXIvcGF5bG9hZC1jb252ZXJ0ZXInO1xuXG4vKipcbiAqIFVzZXIgbWV0YWRhdGEgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gd29ya2Zsb3cgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1ldGFkYXRhIHtcbiAgLyoqIEBleHBlcmltZW50YWwgQSBmaXhlZCwgc2luZ2xlIGxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCdzIHB1cnBvc2UgKi9cbiAgc3RhdGljU3VtbWFyeT86IHN0cmluZztcbiAgLyoqIEBleHBlcmltZW50YWwgRml4ZWQgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoZSBjb21tYW5kIGZvciBsb25nZXItdGV4dCBkZXNjcmlwdGlvbiwgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKi9cbiAgc3RhdGljRGV0YWlscz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZXJNZXRhZGF0YVRvUGF5bG9hZChcbiAgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlcixcbiAgc3RhdGljU3VtbWFyeTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzdGF0aWNEZXRhaWxzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHRlbXBvcmFsLmFwaS5zZGsudjEuSVVzZXJNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGlmIChzdGF0aWNTdW1tYXJ5ID09IG51bGwgJiYgc3RhdGljRGV0YWlscyA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN1bW1hcnkgPSBjb252ZXJ0T3B0aW9uYWxUb1BheWxvYWQocGF5bG9hZENvbnZlcnRlciwgc3RhdGljU3VtbWFyeSk7XG4gIGNvbnN0IGRldGFpbHMgPSBjb252ZXJ0T3B0aW9uYWxUb1BheWxvYWQocGF5bG9hZENvbnZlcnRlciwgc3RhdGljRGV0YWlscyk7XG5cbiAgaWYgKHN1bW1hcnkgPT0gbnVsbCAmJiBkZXRhaWxzID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHsgc3VtbWFyeSwgZGV0YWlscyB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBWZXJzaW9uaW5nSW50ZW50IGFzIFZlcnNpb25pbmdJbnRlbnRTdHJpbmcgfSBmcm9tICcuL3ZlcnNpb25pbmctaW50ZW50JztcbmltcG9ydCB7IGFzc2VydE5ldmVyLCBjaGVja0V4dGVuZHMgfSBmcm9tICcuL3R5cGUtaGVscGVycyc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkICovXG5cbi8vIEF2b2lkIGltcG9ydGluZyB0aGUgcHJvdG8gaW1wbGVtZW50YXRpb24gdG8gcmVkdWNlIHdvcmtmbG93IGJ1bmRsZSBzaXplXG4vLyBDb3BpZWQgZnJvbSBjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50XG4vKipcbiAqIFByb3RvYnVmIGVudW0gcmVwcmVzZW50YXRpb24gb2Yge0BsaW5rIFZlcnNpb25pbmdJbnRlbnRTdHJpbmd9LlxuICpcbiAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICovXG5leHBvcnQgZW51bSBWZXJzaW9uaW5nSW50ZW50IHtcbiAgVU5TUEVDSUZJRUQgPSAwLFxuICBDT01QQVRJQkxFID0gMSxcbiAgREVGQVVMVCA9IDIsXG59XG5cbmNoZWNrRXh0ZW5kczxjb3Jlc2RrLmNvbW1vbi5WZXJzaW9uaW5nSW50ZW50LCBWZXJzaW9uaW5nSW50ZW50PigpO1xuY2hlY2tFeHRlbmRzPFZlcnNpb25pbmdJbnRlbnQsIGNvcmVzZGsuY29tbW9uLlZlcnNpb25pbmdJbnRlbnQ+KCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgV29ya2VyIFZlcnNpb25pbmcgaXMgbm93IGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIFdvcmtlciBEZXBsb3ltZW50IEFQSSBpbnN0ZWFkOiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vd29ya2VyLWRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJzaW9uaW5nSW50ZW50VG9Qcm90byhpbnRlbnQ6IFZlcnNpb25pbmdJbnRlbnRTdHJpbmcgfCB1bmRlZmluZWQpOiBWZXJzaW9uaW5nSW50ZW50IHtcbiAgc3dpdGNoIChpbnRlbnQpIHtcbiAgICBjYXNlICdERUZBVUxUJzpcbiAgICAgIHJldHVybiBWZXJzaW9uaW5nSW50ZW50LkRFRkFVTFQ7XG4gICAgY2FzZSAnQ09NUEFUSUJMRSc6XG4gICAgICByZXR1cm4gVmVyc2lvbmluZ0ludGVudC5DT01QQVRJQkxFO1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgcmV0dXJuIFZlcnNpb25pbmdJbnRlbnQuVU5TUEVDSUZJRUQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKCdVbmV4cGVjdGVkIFZlcnNpb25pbmdJbnRlbnQnLCBpbnRlbnQpO1xuICB9XG59XG4iLCIvKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB1c2VyIGludGVuZHMgY2VydGFpbiBjb21tYW5kcyB0byBiZSBydW4gb24gYSBjb21wYXRpYmxlIHdvcmtlciBCdWlsZCBJZCB2ZXJzaW9uIG9yIG5vdC5cbiAqXG4gKiBgQ09NUEFUSUJMRWAgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgc2hvdWxkIHJ1biBvbiBhIHdvcmtlciB3aXRoIGNvbXBhdGlibGUgdmVyc2lvbiBpZiBwb3NzaWJsZS4gSXQgbWF5IG5vdCBiZVxuICogcG9zc2libGUgaWYgdGhlIHRhcmdldCB0YXNrIHF1ZXVlIGRvZXMgbm90IGFsc28gaGF2ZSBrbm93bGVkZ2Ugb2YgdGhlIGN1cnJlbnQgd29ya2VyJ3MgQnVpbGQgSWQuXG4gKlxuICogYERFRkFVTFRgIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIHNob3VsZCBydW4gb24gdGhlIHRhcmdldCB0YXNrIHF1ZXVlJ3MgY3VycmVudCBvdmVyYWxsLWRlZmF1bHQgQnVpbGQgSWQuXG4gKlxuICogV2hlcmUgdGhpcyB0eXBlIGlzIGFjY2VwdGVkIG9wdGlvbmFsbHksIGFuIHVuc2V0IHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBTREsgc2hvdWxkIGNob29zZSB0aGUgbW9zdCBzZW5zaWJsZSBkZWZhdWx0XG4gKiBiZWhhdmlvciBmb3IgdGhlIHR5cGUgb2YgY29tbWFuZCwgYWNjb3VudGluZyBmb3Igd2hldGhlciB0aGUgY29tbWFuZCB3aWxsIGJlIHJ1biBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIHRoZVxuICogY3VycmVudCB3b3JrZXIuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBzdGFydGluZyBXb3JrZmxvd3MgaXMgYERFRkFVTFRgLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgV29ya2Zsb3dzIHN0YXJ0aW5nXG4gKiBBY3Rpdml0aWVzLCBzdGFydGluZyBDaGlsZCBXb3JrZmxvd3MsIG9yIENvbnRpbnVpbmcgQXMgTmV3IGlzIGBDT01QQVRJQkxFYC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IHR5cGUgVmVyc2lvbmluZ0ludGVudCA9ICdDT01QQVRJQkxFJyB8ICdERUZBVUxUJztcbiIsImltcG9ydCB0eXBlIHsgY29yZXNkaywgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHZlcnNpb24gb2YgYSBzcGVjaWZpYyB3b3JrZXIgZGVwbG95bWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbiB7XG4gIHJlYWRvbmx5IGJ1aWxkSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgZGVwbG95bWVudE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgZGVwbG95bWVudCB2ZXJzaW9uLCB3aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybWF0XG4gKiBgZGVwbG95bWVudE5hbWUuYnVpbGRJZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Nhbm9uaWNhbFN0cmluZyh2ZXJzaW9uOiBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHt2ZXJzaW9uLmRlcGxveW1lbnROYW1lfS4ke3ZlcnNpb24uYnVpbGRJZH1gO1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB3aGVuIGEgd29ya2Zsb3cgbWlnaHQgbW92ZSBmcm9tIGEgd29ya2VyIG9mIG9uZSBCdWlsZCBJZCB0byBhbm90aGVyLlxuICpcbiAqICogJ1BJTk5FRCcgLSBUaGUgd29ya2Zsb3cgd2lsbCBiZSBwaW5uZWQgdG8gdGhlIGN1cnJlbnQgQnVpbGQgSUQgdW5sZXNzIG1hbnVhbGx5IG1vdmVkLlxuICogKiAnQVVUT19VUEdSQURFJyAtIFRoZSB3b3JrZmxvdyB3aWxsIGF1dG9tYXRpY2FsbHkgbW92ZSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gKGRlZmF1bHQgQnVpbGQgSURcbiAqICAgIG9mIHRoZSB0YXNrIHF1ZXVlKSB3aGVuIHRoZSBuZXh0IHRhc2sgaXMgZGlzcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFZlcnNpb25pbmdCZWhhdmlvciA9IHtcbiAgUElOTkVEOiAnUElOTkVEJyxcbiAgQVVUT19VUEdSQURFOiAnQVVUT19VUEdSQURFJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nQmVoYXZpb3IgPSAodHlwZW9mIFZlcnNpb25pbmdCZWhhdmlvcilba2V5b2YgdHlwZW9mIFZlcnNpb25pbmdCZWhhdmlvcl07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yLCBkZWNvZGVWZXJzaW9uaW5nQmVoYXZpb3JdID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5WZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuVmVyc2lvbmluZ0JlaGF2aW9yLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLlZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIFZlcnNpb25pbmdCZWhhdmlvcixcbiAgJ1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuPihcbiAge1xuICAgIFtWZXJzaW9uaW5nQmVoYXZpb3IuUElOTkVEXTogMSxcbiAgICBbVmVyc2lvbmluZ0JlaGF2aW9yLkFVVE9fVVBHUkFERV06IDIsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdWRVJTSU9OSU5HX0JFSEFWSU9SXydcbik7XG5cbi8qKlxuICogUmVwcmVzZW50cyB2ZXJzaW9uaW5nIG92ZXJyaWRlcy4gRm9yIGV4YW1wbGUsIHdoZW4gc3RhcnRpbmcgd29ya2Zsb3dzLlxuICovXG5leHBvcnQgdHlwZSBWZXJzaW9uaW5nT3ZlcnJpZGUgPSBQaW5uZWRWZXJzaW9uaW5nT3ZlcnJpZGUgfCAnQVVUT19VUEdSQURFJztcblxuLyoqXG4gKiBXb3JrZmxvdyB3aWxsIGJlIHBpbm5lZCB0byBhIHNwZWNpZmljIGRlcGxveW1lbnQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaW5uZWRWZXJzaW9uaW5nT3ZlcnJpZGUge1xuICAvKipcbiAgICogVGhlIHdvcmtlciBkZXBsb3ltZW50IHZlcnNpb24gdG8gcGluIHRoZSB3b3JrZmxvdyB0by5cbiAgICovXG4gIHBpbm5lZFRvOiBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBUaGUgd29ya2Zsb3cgd2lsbCBhdXRvLXVwZ3JhZGUgdG8gdGhlIGN1cnJlbnQgZGVwbG95bWVudCB2ZXJzaW9uIG9uIHRoZSBuZXh0IHdvcmtmbG93IHRhc2suXG4gKi9cbmV4cG9ydCB0eXBlIEF1dG9VcGdyYWRlVmVyc2lvbmluZ092ZXJyaWRlID0gJ0FVVE9fVVBHUkFERSc7XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgdmVyc2lvbmluZyBiZWhhdmlvciB0byBiZSB1c2VkIGJ5IHRoZSBmaXJzdCB0YXNrIG9mIGEgbmV3IHdvcmtmbG93IHJ1biBpbiBhIGNvbnRpbnVlLWFzLW5ldyBjaGFpbi5cbiAqXG4gKiBBVVRPX1VQR1JBREUgLSBTdGFydCB0aGUgbmV3IHJ1biB3aXRoIEF1dG9VcGdyYWRlIGJlaGF2aW9yLiBVc2UgdGhlIFRhcmdldCBWZXJzaW9uIG9mIHRoZSB3b3JrZmxvdydzIHRhc2sgcXVldWUgYXRcbiAqICAgc3RhcnQtdGltZSwgYXMgQXV0b1VwZ3JhZGUgd29ya2Zsb3dzIGRvLiBBZnRlciB0aGUgZmlyc3Qgd29ya2Zsb3cgdGFzayBjb21wbGV0ZXMsIHVzZSB3aGF0ZXZlclxuICogICBWZXJzaW9uaW5nIEJlaGF2aW9yIHRoZSB3b3JrZmxvdyBpcyBhbm5vdGF0ZWQgd2l0aCBpbiB0aGUgd29ya2Zsb3cgY29kZS5cbiAqXG4gKiAgIE5vdGUgdGhhdCBpZiB0aGUgcHJldmlvdXMgd29ya2Zsb3cgaGFkIGEgUGlubmVkIG92ZXJyaWRlLCB0aGF0IG92ZXJyaWRlIHdpbGwgYmUgaW5oZXJpdGVkIGJ5IHRoZVxuICogICBuZXcgd29ya2Zsb3cgcnVuIHJlZ2FyZGxlc3Mgb2YgdGhlIENvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3Igc3BlY2lmaWVkIGluIHRoZSBjb250aW51ZS1hcy1uZXdcbiAqICAgY29tbWFuZC4gSWYgYSBQaW5uZWQgb3ZlcnJpZGUgaXMgaW5oZXJpdGVkIGJ5IHRoZSBuZXcgcnVuLCBhbmQgdGhlIG5ldyBydW4gc3RhcnRzIHdpdGggQXV0b1VwZ3JhZGVcbiAqICAgYmVoYXZpb3IsIHRoZSBiYXNlIHZlcnNpb24gb2YgdGhlIG5ldyBydW4gd2lsbCBiZSB0aGUgVGFyZ2V0IFZlcnNpb24gYXMgZGVzY3JpYmVkIGFib3ZlLCBidXQgdGhlXG4gKiAgIGVmZmVjdGl2ZSB2ZXJzaW9uIHdpbGwgYmUgd2hhdGV2ZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBWZXJzaW9uaW5nIE92ZXJyaWRlIHVudGlsIHRoZSBvdmVycmlkZSBpcyByZW1vdmVkLlxuICpcbiAqIFVTRV9SQU1QSU5HX1ZFUlNJT04gLSBVc2UgdGhlIFJhbXBpbmcgVmVyc2lvbiBvZiB0aGUgd29ya2Zsb3cncyB0YXNrIHF1ZXVlIGF0IHN0YXJ0IHRpbWUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHdvcmtmbG93J3NcbiAqICAgVGFyZ2V0IFZlcnNpb24gKGFjY29yZGluZyB0byBmKHdvcmtmbG93X2lkLCByYW1wX3BlcmNlbnRhZ2UpKS4gQWZ0ZXIgdGhlIGZpcnN0IHdvcmtmbG93IHRhc2sgY29tcGxldGVzLFxuICogICB0aGUgd29ya2Zsb3cgd2lsbCB1c2Ugd2hhdGV2ZXIgVmVyc2lvbmluZyBCZWhhdmlvciBpdCBpcyBhbm5vdGF0ZWQgd2l0aC4gSWYgdGhlcmUgaXMgbm8gUmFtcGluZ1xuICogICBWZXJzaW9uIGJ5IHRoZSB0aW1lIHRoYXQgdGhlIGZpcnN0IHdvcmtmbG93IHRhc2sgaXMgZGlzcGF0Y2hlZCwgaXQgd2lsbCBiZSBzZW50IHRvIHRoZSBDdXJyZW50IFZlcnNpb24uXG4gKlxuICogICBJdCBpcyBoaWdobHkgZGlzY291cmFnZWQgdG8gdXNlIHRoaXMgaWYgdGhlIHdvcmtmbG93IGlzIGFubm90YXRlZCB3aXRoIEF1dG9VcGdyYWRlIGJlaGF2aW9yLCBiZWNhdXNlXG4gKiAgIHRoaXMgc2V0dGluZyBPTkxZIGFwcGxpZXMgdG8gdGhlIGZpcnN0IHRhc2sgb2YgdGhlIHdvcmtmbG93LiBJZiwgYWZ0ZXIgdGhlIGZpcnN0IHRhc2ssIHRoZSB3b3JrZmxvd1xuICogICBpcyBBdXRvVXBncmFkZSwgaXQgd2lsbCBiZWhhdmUgbGlrZSBhIG5vcm1hbCBBdXRvVXBncmFkZSB3b3JrZmxvdyBhbmQgZ28gdG8gdGhlIFRhcmdldCBWZXJzaW9uLCB3aGljaFxuICogICBtYXkgYmUgdGhlIEN1cnJlbnQgVmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBSYW1waW5nIFZlcnNpb24uXG4gKlxuICogICBOb3RlIHRoYXQgaWYgdGhlIHdvcmtmbG93IGJlaW5nIGNvbnRpbnVlZCBoYXMgYSBQaW5uZWQgb3ZlcnJpZGUsIHRoYXQgb3ZlcnJpZGUgd2lsbCBiZSBpbmhlcml0ZWQgYnkgdGhlXG4gKiAgIG5ldyB3b3JrZmxvdyBydW4gcmVnYXJkbGVzcyBvZiB0aGUgQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvciBzcGVjaWZpZWQgaW4gdGhlIGNvbnRpbnVlLWFzLW5ld1xuICogICBjb21tYW5kLiBWZXJzaW9uaW5nIE92ZXJyaWRlIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlIHVudGlsIGl0J3MgcmVtb3ZlZCBtYW51YWxseSB2aWEgVXBkYXRlV29ya2Zsb3dFeGVjdXRpb25PcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWwgVmVyc2lvbmluZyBzZW1hbnRpY3Mgd2l0aCBjb250aW51ZS1hcy1uZXcgYXJlIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgY29uc3QgSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvciA9IHtcbiAgQVVUT19VUEdSQURFOiAnQVVUT19VUEdSQURFJyxcbiAgVVNFX1JBTVBJTkdfVkVSU0lPTjogJ1VTRV9SQU1QSU5HX1ZFUlNJT04nLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IgPSAodHlwZW9mIEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IpW2tleW9mIHR5cGVvZiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yXTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLCBkZWNvZGVJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICB0ZW1wb3JhbC5hcGkuZW51bXMudjEuQ29udGludWVBc05ld1ZlcnNpb25pbmdCZWhhdmlvcixcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Db250aW51ZUFzTmV3VmVyc2lvbmluZ0JlaGF2aW9yLFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLkNvbnRpbnVlQXNOZXdWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIHR5cGVvZiBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLFxuICAnQ09OVElOVUVfQVNfTkVXX1ZFUlNJT05JTkdfQkVIQVZJT1JfJ1xuPihcbiAge1xuICAgIFtJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLkFVVE9fVVBHUkFERV06IDEsXG4gICAgW0luaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IuVVNFX1JBTVBJTkdfVkVSU0lPTl06IDIsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdDT05USU5VRV9BU19ORVdfVkVSU0lPTklOR19CRUhBVklPUl8nXG4pO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydERlcGxveW1lbnRWZXJzaW9uKFxuICB2OiBjb3Jlc2RrLmNvbW1vbi5JV29ya2VyRGVwbG95bWVudFZlcnNpb24gfCBudWxsIHwgdW5kZWZpbmVkXG4pOiBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghdiB8fCAhdi5idWlsZElkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYnVpbGRJZDogdi5idWlsZElkLFxuICAgIGRlcGxveW1lbnROYW1lOiB2LmRlcGxveW1lbnROYW1lID8/ICcnLFxuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBWZXJzaW9uaW5nQmVoYXZpb3IgfSBmcm9tICcuL3dvcmtlci1kZXBsb3ltZW50cyc7XG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gZGVmaW5pbmcgYSB3b3JrZmxvdyB2aWEge0BsaW5rIHNldFdvcmtmbG93T3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyB7XG4gIHZlcnNpb25pbmdCZWhhdmlvcj86IFZlcnNpb25pbmdCZWhhdmlvcjtcbn1cblxudHlwZSBBc3luY0Z1bmN0aW9uPEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0dXJuVHlwZT4gPSAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPjtcbmV4cG9ydCB0eXBlIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlciA9IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMgfCAoKCkgPT4gV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKiBBIHdvcmtmbG93IGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4gZGVmaW5lZCB3aXRoIG9wdGlvbnMgZnJvbSB7QGxpbmsgV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0dXJuVHlwZT4gZXh0ZW5kcyBBc3luY0Z1bmN0aW9uPEFyZ3MsIFJldHVyblR5cGU+IHtcbiAgd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uczogV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBXb3JrZmxvdywgV29ya2Zsb3dSZXN1bHRUeXBlLCBTaWduYWxEZWZpbml0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBCYXNlIFdvcmtmbG93SGFuZGxlIGludGVyZmFjZSwgZXh0ZW5kZWQgaW4gd29ya2Zsb3cgYW5kIGNsaWVudCBsaWJzLlxuICpcbiAqIFRyYW5zZm9ybXMgYSB3b3JrZmxvdyBpbnRlcmZhY2UgYFRgIGludG8gYSBjbGllbnQgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VXb3JrZmxvd0hhbmRsZTxUIGV4dGVuZHMgV29ya2Zsb3c+IHtcbiAgLyoqXG4gICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIFdvcmtmbG93IGV4ZWN1dGlvbiBjb21wbGV0ZXNcbiAgICovXG4gIHJlc3VsdCgpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbiAgLyoqXG4gICAqIFNpZ25hbCBhIHJ1bm5pbmcgV29ya2Zsb3cuXG4gICAqXG4gICAqIEBwYXJhbSBkZWYgYSBzaWduYWwgZGVmaW5pdGlvbiBhcyByZXR1cm5lZCBmcm9tIHtAbGluayBkZWZpbmVTaWduYWx9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGF3YWl0IGhhbmRsZS5zaWduYWwoaW5jcmVtZW50U2lnbmFsLCAzKTtcbiAgICogYGBgXG4gICAqL1xuICBzaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIGRlZjogU2lnbmFsRGVmaW5pdGlvbjxBcmdzLCBOYW1lPiB8IHN0cmluZyxcbiAgICAuLi5hcmdzOiBBcmdzXG4gICk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSB3b3JrZmxvd0lkIG9mIHRoZSBjdXJyZW50IFdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSB3b3JrZmxvd0lkOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvdyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5UG9saWN5IH0gZnJvbSAnLi9yZXRyeS1wb2xpY3knO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJy4vdGltZSc7XG5pbXBvcnQgeyBtYWtlUHJvdG9FbnVtQ29udmVydGVycyB9IGZyb20gJy4vaW50ZXJuYWwtd29ya2Zsb3cnO1xuaW1wb3J0IHR5cGUgeyBTZWFyY2hBdHRyaWJ1dGVQYWlyLCBTZWFyY2hBdHRyaWJ1dGVzLCBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMgfSBmcm9tICcuL3NlYXJjaC1hdHRyaWJ1dGVzJztcbmltcG9ydCB0eXBlIHsgUHJpb3JpdHkgfSBmcm9tICcuL3ByaW9yaXR5JztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zIH0gZnJvbSAnLi93b3JrZmxvdy1kZWZpbml0aW9uLW9wdGlvbnMnO1xuXG4vKipcbiAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICpcbiAqIFNlZSB7QGxpbmsgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeX0gZm9yIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhXG4gKiBXb3JrZmxvdyB3aXRoIHRoZSBzYW1lIElEIGFzIGEgKlJ1bm5pbmcqIFdvcmtmbG93LlxuICpcbiAqIENvbmNlcHQ6IHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hLXdvcmtmbG93LWlkLXJldXNlLXBvbGljeS8gfCBXb3JrZmxvdyBJZCBSZXVzZSBQb2xpY3l9XG4gKlxuICogKk5vdGU6IEl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYXZlIHR3byBhY3RpdmVseSBydW5uaW5nIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSB7XG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2FuIGJlIHN0YXJ0ZWQgaWYgdGhlIHByZXZpb3VzIFdvcmtmbG93IGlzIGluIGEgQ2xvc2VkIHN0YXRlLlxuICAgKiBAZGVmYXVsdFxuICAgKi9cbiAgQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKipcbiAgICogVGhlIFdvcmtmbG93IGNhbiBiZSBzdGFydGVkIGlmIHRoZSBwcmV2aW91cyBXb3JrZmxvdyBpcyBpbiBhIENsb3NlZCBzdGF0ZSB0aGF0IGlzIG5vdCBDb21wbGV0ZWQuXG4gICAqL1xuICBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKlxuICAgKiBUaGUgV29ya2Zsb3cgY2Fubm90IGJlIHN0YXJ0ZWQuXG4gICAqL1xuICBSRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBXb3JrZmxvdyBpZiBvbmUgaXMgYWxyZWFkeSBydW5uaW5nOyBvdGhlcndpc2UgYWxsb3cgcmV1c2luZyB0aGUgV29ya2Zsb3cgSUQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURX0gaW5zdGVhZCwgYW5kXG4gICAqICAgICAgICAgICAgIHNldCBgV29ya2Zsb3dPcHRpb25zLndvcmtmbG93SWRDb25mbGljdFBvbGljeWAgdG9cbiAgICogICAgICAgICAgICAge0BsaW5rIFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVEVSTUlOQVRFX0VYSVNUSU5HfS5cbiAgICogICAgICAgICAgICAgV2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgYFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0lkQ29uZmxpY3RQb2xpY3lgIG11c3QgYmUgbGVmdCB1bnNwZWNpZmllZC5cbiAgICovXG4gIFRFUk1JTkFURV9JRl9SVU5OSU5HOiAnVEVSTUlOQVRFX0lGX1JVTk5JTkcnLFxuXG4gIC8vLyBBbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBObyBuZWVkIHRvIHVzZSB0aGlzLiBJZiBhIGBXb3JrZmxvd0lkUmV1c2VQb2xpY3lgIGlzIHNldCB0byB0aGlzLCBvciBpcyBub3Qgc2V0IGF0IGFsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBFaXRoZXIgbGVhdmUgcHJvcGVydHkgYHVuZGVmaW5lZGAsIG9yIHVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLlxuICAgKi9cbiAgV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX1VOU1BFQ0lGSUVEOiB1bmRlZmluZWQsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQUxMT1dfRFVQTElDQVRFfSBpbnN0ZWFkLiAqL1xuICBXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfQUxMT1dfRFVQTElDQVRFOiAnQUxMT1dfRFVQTElDQVRFJyxcblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFl9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9BTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFk6ICdBTExPV19EVVBMSUNBVEVfRkFJTEVEX09OTFknLFxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFJFSkVDVF9EVVBMSUNBVEV9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9SRUpFQ1RfRFVQTElDQVRFOiAnUkVKRUNUX0RVUExJQ0FURScsXG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVEVSTUlOQVRFX0lGX1JVTk5JTkd9IGluc3RlYWQuICovXG4gIFdPUktGTE9XX0lEX1JFVVNFX1BPTElDWV9URVJNSU5BVEVfSUZfUlVOTklORzogJ1RFUk1JTkFURV9JRl9SVU5OSU5HJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBXb3JrZmxvd0lkUmV1c2VQb2xpY3kgPSAodHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSlba2V5b2YgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeV07XG5cbmV4cG9ydCBjb25zdCBbZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5LCBkZWNvZGVXb3JrZmxvd0lkUmV1c2VQb2xpY3ldID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkUmV1c2VQb2xpY3ksXG4gIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZFJldXNlUG9saWN5LFxuICBrZXlvZiB0eXBlb2YgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgdHlwZW9mIFdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgJ1dPUktGTE9XX0lEX1JFVVNFX1BPTElDWV8nXG4+KFxuICB7XG4gICAgW1dvcmtmbG93SWRSZXVzZVBvbGljeS5BTExPV19EVVBMSUNBVEVdOiAxLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuQUxMT1dfRFVQTElDQVRFX0ZBSUxFRF9PTkxZXTogMixcbiAgICBbV29ya2Zsb3dJZFJldXNlUG9saWN5LlJFSkVDVF9EVVBMSUNBVEVdOiAzLFxuICAgIFtXb3JrZmxvd0lkUmV1c2VQb2xpY3kuVEVSTUlOQVRFX0lGX1JVTk5JTkddOiA0LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9SRVVTRV9QT0xJQ1lfJ1xuKTtcblxuLyoqXG4gKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gKlxuICogU2VlIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5fSBmb3Igd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3dcbiAqIHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqQ2xvc2VkKiBXb3JrZmxvdy5cbiAqXG4gKiAqTm90ZTogSXQgaXMgbmV2ZXIgcG9zc2libGUgdG8gaGF2ZSB0d28gX2FjdGl2ZWx5IHJ1bm5pbmdfIFdvcmtmbG93cyB3aXRoIHRoZSBzYW1lIElELipcbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9IHtcbiAgLyoqXG4gICAqIERvIG5vdCBzdGFydCBhIG5ldyBXb3JrZmxvdy4gSW5zdGVhZCByYWlzZSBhIGBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3JgLlxuICAgKi9cbiAgRkFJTDogJ0ZBSUwnLFxuXG4gIC8qKlxuICAgKiBEbyBub3Qgc3RhcnQgYSBuZXcgV29ya2Zsb3cuIEluc3RlYWQgcmV0dXJuIGEgV29ya2Zsb3cgSGFuZGxlIGZvciB0aGUgYWxyZWFkeSBSdW5uaW5nIFdvcmtmbG93LlxuICAgKi9cbiAgVVNFX0VYSVNUSU5HOiAnVVNFX0VYSVNUSU5HJyxcblxuICAvKipcbiAgICogU3RhcnQgYSBuZXcgV29ya2Zsb3csIHRlcm1pbmF0aW5nIHRoZSBjdXJyZW50IHdvcmtmbG93IGlmIG9uZSBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4gICAqL1xuICBURVJNSU5BVEVfRVhJU1RJTkc6ICdURVJNSU5BVEVfRVhJU1RJTkcnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFdvcmtmbG93SWRDb25mbGljdFBvbGljeSA9ICh0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5KVtrZXlvZiB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5XTtcblxuZXhwb3J0IGNvbnN0IFtlbmNvZGVXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksIGRlY29kZVdvcmtmbG93SWRDb25mbGljdFBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgdGVtcG9yYWwuYXBpLmVudW1zLnYxLldvcmtmbG93SWRDb25mbGljdFBvbGljeSxcbiAgdHlwZW9mIHRlbXBvcmFsLmFwaS5lbnVtcy52MS5Xb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiB0ZW1wb3JhbC5hcGkuZW51bXMudjEuV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICB0eXBlb2YgV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LFxuICAnV09SS0ZMT1dfSURfQ09ORkxJQ1RfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LkZBSUxdOiAxLFxuICAgIFtXb3JrZmxvd0lkQ29uZmxpY3RQb2xpY3kuVVNFX0VYSVNUSU5HXTogMixcbiAgICBbV29ya2Zsb3dJZENvbmZsaWN0UG9saWN5LlRFUk1JTkFURV9FWElTVElOR106IDMsXG4gICAgVU5TUEVDSUZJRUQ6IDAsXG4gIH0gYXMgY29uc3QsXG4gICdXT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlV29ya2Zsb3dPcHRpb25zIHtcbiAgLyoqXG4gICAqIERlZmluZXMgd2hhdCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvIHN0YXJ0IGEgV29ya2Zsb3cgd2l0aCB0aGUgc2FtZSBJRCBhcyBhICpDbG9zZWQqIFdvcmtmbG93LlxuICAgKlxuICAgKiAqTm90ZTogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgdHdvIGFjdGl2ZWx5IHJ1bm5pbmcgV29ya2Zsb3dzIHdpdGggdGhlIHNhbWUgSUQuKlxuICAgKlxuICAgKiBAZGVmYXVsdCBXb3JrZmxvd0lkUmV1c2VQb2xpY3kuV09SS0ZMT1dfSURfUkVVU0VfUE9MSUNZX0FMTE9XX0RVUExJQ0FURVxuICAgKi9cbiAgd29ya2Zsb3dJZFJldXNlUG9saWN5PzogV29ya2Zsb3dJZFJldXNlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoYXQgaGFwcGVucyB3aGVuIHRyeWluZyB0byBzdGFydCBhIFdvcmtmbG93IHdpdGggdGhlIHNhbWUgSUQgYXMgYSAqUnVubmluZyogV29ya2Zsb3cuXG4gICAqXG4gICAqICpOb3RlOiBJdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0d28gYWN0aXZlbHkgcnVubmluZyBXb3JrZmxvd3Mgd2l0aCB0aGUgc2FtZSBJRC4qXG4gICAqXG4gICAqIEBkZWZhdWx0IFdvcmtmbG93SWRDb25mbGljdFBvbGljeS5XT1JLRkxPV19JRF9DT05GTElDVF9QT0xJQ1lfVU5TUEVDSUZJRURcbiAgICovXG4gIHdvcmtmbG93SWRDb25mbGljdFBvbGljeT86IFdvcmtmbG93SWRDb25mbGljdFBvbGljeTtcblxuICAvKipcbiAgICogQ29udHJvbHMgaG93IGEgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIHJldHJpZWQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIFdvcmtmbG93IEV4ZWN1dGlvbnMgYXJlIG5vdCByZXRyaWVkLiBEbyBub3Qgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gICAqIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hLXJldHJ5LXBvbGljeS8gfCBNb3JlIGluZm9ybWF0aW9ufS5cbiAgICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNyb24gc2NoZWR1bGUgZm9yIFdvcmtmbG93LiBJZiBhIGNyb24gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgV29ya2Zsb3cgd2lsbCBydW4gYXMgYSBjcm9uIGJhc2VkIG9uIHRoZVxuICAgKiBzY2hlZHVsZS4gVGhlIHNjaGVkdWxpbmcgd2lsbCBiZSBiYXNlZCBvbiBVVEMgdGltZS4gVGhlIHNjaGVkdWxlIGZvciB0aGUgbmV4dCBydW4gb25seSBoYXBwZW5zIGFmdGVyIHRoZSBjdXJyZW50XG4gICAqIHJ1biBpcyBjb21wbGV0ZWQvZmFpbGVkL3RpbWVvdXQuIElmIGEgUmV0cnlQb2xpY3kgaXMgYWxzbyBzdXBwbGllZCwgYW5kIHRoZSBXb3JrZmxvdyBmYWlsZWQgb3IgdGltZWQgb3V0LCB0aGVcbiAgICogV29ya2Zsb3cgd2lsbCBiZSByZXRyaWVkIGJhc2VkIG9uIHRoZSByZXRyeSBwb2xpY3kuIFdoaWxlIHRoZSBXb3JrZmxvdyBpcyByZXRyeWluZywgaXQgd29uJ3Qgc2NoZWR1bGUgaXRzIG5leHQgcnVuLlxuICAgKiBJZiB0aGUgbmV4dCBzY2hlZHVsZSBpcyBkdWUgd2hpbGUgdGhlIFdvcmtmbG93IGlzIHJ1bm5pbmcgKG9yIHJldHJ5aW5nKSwgdGhlbiBpdCB3aWxsIHNraXAgdGhhdCBzY2hlZHVsZS4gQ3JvblxuICAgKiBXb3JrZmxvdyB3aWxsIG5vdCBzdG9wIHVudGlsIGl0IGlzIHRlcm1pbmF0ZWQgb3IgY2FuY2VsbGVkIChieSByZXR1cm5pbmcgdGVtcG9yYWwuQ2FuY2VsZWRFcnJvcikuXG4gICAqIGh0dHBzOi8vY3JvbnRhYi5ndXJ1LyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgeW91ciBjcm9uIGV4cHJlc3Npb25zLlxuICAgKi9cbiAgY3JvblNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBub24taW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gVGhlIHZhbHVlcyBjYW4gYmUgYW55dGhpbmcgdGhhdFxuICAgKiBpcyBzZXJpYWxpemFibGUgYnkge0BsaW5rIERhdGFDb252ZXJ0ZXJ9LlxuICAgKi9cbiAgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBpbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBNb3JlIGluZm86XG4gICAqIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kb2NzL3R5cGVzY3JpcHQvc2VhcmNoLWF0dHJpYnV0ZXNcbiAgICpcbiAgICogVmFsdWVzIGFyZSBhbHdheXMgY29udmVydGVkIHVzaW5nIHtAbGluayBKc29uUGF5bG9hZENvbnZlcnRlcn0sIGV2ZW4gd2hlbiBhIGN1c3RvbSBkYXRhIGNvbnZlcnRlciBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYWRkaXRpb25hbCBpbmRleGVkIGluZm9ybWF0aW9uIHRvIGF0dGFjaCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLiBNb3JlIGluZm86XG4gICAqIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby9kb2NzL3R5cGVzY3JpcHQvc2VhcmNoLWF0dHJpYnV0ZXNcbiAgICpcbiAgICogVmFsdWVzIGFyZSBhbHdheXMgY29udmVydGVkIHVzaW5nIHtAbGluayBKc29uUGF5bG9hZENvbnZlcnRlcn0sIGV2ZW4gd2hlbiBhIGN1c3RvbSBkYXRhIGNvbnZlcnRlciBpcyBwcm92aWRlZC5cbiAgICogTm90ZSB0aGF0IHNlYXJjaCBhdHRyaWJ1dGVzIGFyZSBub3QgZW5jb2RlZCwgYXMgc3VjaCwgZG8gbm90IGluY2x1ZGUgYW55IHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogSWYgYm90aCB7QGxpbmsgc2VhcmNoQXR0cmlidXRlc30gYW5kIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGFyZSBwcm92aWRlZCwgY29uZmxpY3Rpbmcga2V5cyB3aWxsIGJlIG92ZXJ3cml0dGVuXG4gICAqIGJ5IHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9LlxuICAgKi9cbiAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlUGFpcltdIHwgVHlwZWRTZWFyY2hBdHRyaWJ1dGVzO1xuXG4gIC8qKlxuICAgKiBHZW5lcmFsIGZpeGVkIGRldGFpbHMgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdCBhbmQgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN0YXRpY0RldGFpbHM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIHNpbmdsZS1saW5lIGZpeGVkIHN1bW1hcnkgZm9yIHRoaXMgd29ya2Zsb3cgZXhlY3V0aW9uIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgVUkvQ0xJLlxuICAgKiBUaGlzIGNhbiBiZSBpbiBzaW5nbGUtbGluZSBUZW1wb3JhbCBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVXNlciBtZXRhZGF0YSBpcyBhIG5ldyBBUEkgYW5kIHN1c2NlcHRpYmxlIHRvIGNoYW5nZS5cbiAgICovXG4gIHN0YXRpY1N1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIGEgd29ya2Zsb3dcbiAgICovXG4gIHByaW9yaXR5PzogUHJpb3JpdHk7XG59XG5cbmV4cG9ydCB0eXBlIFdpdGhXb3JrZmxvd0FyZ3M8VyBleHRlbmRzIFdvcmtmbG93LCBUPiA9IFQgJlxuICAoUGFyYW1ldGVyczxXPiBleHRlbmRzIFthbnksIC4uLmFueVtdXVxuICAgID8ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIFdvcmtmbG93XG4gICAgICAgICAqL1xuICAgICAgICBhcmdzOiBQYXJhbWV0ZXJzPFc+IHwgUmVhZG9ubHk8UGFyYW1ldGVyczxXPj47XG4gICAgICB9XG4gICAgOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV29ya2Zsb3dcbiAgICAgICAgICovXG4gICAgICAgIGFyZ3M/OiBQYXJhbWV0ZXJzPFc+IHwgUmVhZG9ubHk8UGFyYW1ldGVyczxXPj47XG4gICAgICB9KTtcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB3b3JrZmxvdyBydW4gaXMgYXV0b21hdGljYWxseSB0ZXJtaW5hdGVkIGJ5IFRlbXBvcmFsIHNlcnZpY2UuIERvIG5vdFxuICAgKiByZWx5IG9uIHJ1biB0aW1lb3V0IGZvciBidXNpbmVzcyBsZXZlbCB0aW1lb3V0cy4gSXQgaXMgcHJlZmVycmVkIHRvIHVzZSBpbiB3b3JrZmxvdyB0aW1lcnNcbiAgICogZm9yIHRoaXMgcHVycG9zZS5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICpcbiAgICogVGhlIHRpbWUgYWZ0ZXIgd2hpY2ggd29ya2Zsb3cgZXhlY3V0aW9uICh3aGljaCBpbmNsdWRlcyBydW4gcmV0cmllcyBhbmQgY29udGludWUgYXMgbmV3KSBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgc2VydmljZS4gRG8gbm90IHJlbHkgb24gZXhlY3V0aW9uIHRpbWVvdXQgZm9yIGJ1c2luZXNzXG4gICAqIGxldmVsIHRpbWVvdXRzLiBJdCBpcyBwcmVmZXJyZWQgdG8gdXNlIGluIHdvcmtmbG93IHRpbWVycyBmb3IgdGhpcyBwdXJwb3NlLlxuICAgKlxuICAgKiBAZm9ybWF0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAgICovXG4gIHdvcmtmbG93RXhlY3V0aW9uVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGV4ZWN1dGlvbiB0aW1lIG9mIGEgc2luZ2xlIHdvcmtmbG93IHRhc2suIERlZmF1bHQgaXMgMTAgc2Vjb25kcy5cbiAgICpcbiAgICogQGZvcm1hdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1Rhc2tUaW1lb3V0PzogRHVyYXRpb247XG59XG5cbmV4cG9ydCB0eXBlIENvbW1vbldvcmtmbG93T3B0aW9ucyA9IEJhc2VXb3JrZmxvd09wdGlvbnMgJiBXb3JrZmxvd0R1cmF0aW9uT3B0aW9ucztcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RXb3JrZmxvd1R5cGU8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlT3JGdW5jOiBzdHJpbmcgfCBUIHwgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zPGFueVtdLCBhbnk+XG4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuYyA9PT0gJ3N0cmluZycpIHJldHVybiB3b3JrZmxvd1R5cGVPckZ1bmMgYXMgc3RyaW5nO1xuICBpZiAodHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICh3b3JrZmxvd1R5cGVPckZ1bmM/Lm5hbWUpIHJldHVybiB3b3JrZmxvd1R5cGVPckZ1bmMubmFtZTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHdvcmtmbG93IHR5cGU6IHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBhbm9ueW1vdXMnKTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBJbnZhbGlkIHdvcmtmbG93IHR5cGU6IGV4cGVjdGVkIGVpdGhlciBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLCBnb3QgJyR7dHlwZW9mIHdvcmtmbG93VHlwZU9yRnVuY30nYFxuICApO1xufVxuIiwiLy8gQSBwb3J0IG9mIGFuIGFsZ29yaXRobSBieSBKb2hhbm5lcyBCYWFnw7hlIDxiYWFnb2VAYmFhZ29lLmNvbT4sIDIwMTBcbi8vIGh0dHA6Ly9iYWFnb2UuY29tL2VuL1JhbmRvbU11c2luZ3MvamF2YXNjcmlwdC9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucXVpbmxhbi9iZXR0ZXItcmFuZG9tLW51bWJlcnMtZm9yLWphdmFzY3JpcHQtbWlycm9yXG4vLyBPcmlnaW5hbCB3b3JrIGlzIHVuZGVyIE1JVCBsaWNlbnNlIC1cblxuLy8gQ29weXJpZ2h0IChDKSAyMDEwIGJ5IEpvaGFubmVzIEJhYWfDuGUgPGJhYWdvZUBiYWFnb2Uub3JnPlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbi8vIFRha2VuIGFuZCBtb2RpZmllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZpZGJhdS9zZWVkcmFuZG9tL2Jsb2IvcmVsZWFzZWQvbGliL2FsZWEuanNcblxuY2xhc3MgQWxlYSB7XG4gIHB1YmxpYyBjOiBudW1iZXI7XG4gIHB1YmxpYyBzMDogbnVtYmVyO1xuICBwdWJsaWMgczE6IG51bWJlcjtcbiAgcHVibGljIHMyOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc2VlZDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBtYXNoID0gbmV3IE1hc2goKTtcbiAgICAvLyBBcHBseSB0aGUgc2VlZGluZyBhbGdvcml0aG0gZnJvbSBCYWFnb2UuXG4gICAgdGhpcy5jID0gMTtcbiAgICB0aGlzLnMwID0gbWFzaC5tYXNoKFszMl0pO1xuICAgIHRoaXMuczEgPSBtYXNoLm1hc2goWzMyXSk7XG4gICAgdGhpcy5zMiA9IG1hc2gubWFzaChbMzJdKTtcbiAgICB0aGlzLnMwIC09IG1hc2gubWFzaChzZWVkKTtcbiAgICBpZiAodGhpcy5zMCA8IDApIHtcbiAgICAgIHRoaXMuczAgKz0gMTtcbiAgICB9XG4gICAgdGhpcy5zMSAtPSBtYXNoLm1hc2goc2VlZCk7XG4gICAgaWYgKHRoaXMuczEgPCAwKSB7XG4gICAgICB0aGlzLnMxICs9IDE7XG4gICAgfVxuICAgIHRoaXMuczIgLT0gbWFzaC5tYXNoKHNlZWQpO1xuICAgIGlmICh0aGlzLnMyIDwgMCkge1xuICAgICAgdGhpcy5zMiArPSAxO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZXh0KCk6IG51bWJlciB7XG4gICAgY29uc3QgdCA9IDIwOTE2MzkgKiB0aGlzLnMwICsgdGhpcy5jICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcbiAgICB0aGlzLnMwID0gdGhpcy5zMTtcbiAgICB0aGlzLnMxID0gdGhpcy5zMjtcbiAgICByZXR1cm4gKHRoaXMuczIgPSB0IC0gKHRoaXMuYyA9IHQgfCAwKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUk5HID0gKCkgPT4gbnVtYmVyO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxlYShzZWVkOiBudW1iZXJbXSk6IFJORyB7XG4gIGNvbnN0IHhnID0gbmV3IEFsZWEoc2VlZCk7XG4gIHJldHVybiB4Zy5uZXh0LmJpbmQoeGcpO1xufVxuXG5leHBvcnQgY2xhc3MgTWFzaCB7XG4gIHByaXZhdGUgbiA9IDB4ZWZjODI0OWQ7XG5cbiAgcHVibGljIG1hc2goZGF0YTogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIGxldCB7IG4gfSA9IHRoaXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuICs9IGRhdGFbaV0hO1xuICAgICAgbGV0IGggPSAwLjAyNTE5NjAzMjgyNDE2OTM4ICogbjtcbiAgICAgIG4gPSBoID4+PiAwO1xuICAgICAgaCAtPSBuO1xuICAgICAgaCAqPSBuO1xuICAgICAgbiA9IGggPj4+IDA7XG4gICAgICBoIC09IG47XG4gICAgICBuICs9IGggKiAweDEwMDAwMDAwMDsgLy8gMl4zMlxuICAgIH1cbiAgICB0aGlzLm4gPSBuO1xuICAgIHJldHVybiAobiA+Pj4gMCkgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFzeW5jTG9jYWxTdG9yYWdlIGFzIEFMUyB9IGZyb20gJ25vZGU6YXN5bmNfaG9va3MnO1xuaW1wb3J0IHR5cGUgeyBEdXJhdGlvbiB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBDYW5jZWxsZWRGYWlsdXJlLCBJbGxlZ2FsU3RhdGVFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBtc09wdGlvbmFsVG9OdW1iZXIgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL3RpbWUnO1xuaW1wb3J0IHsgdW50cmFja1Byb21pc2UgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBTZGtGbGFncyB9IGZyb20gJy4vZmxhZ3MnO1xuXG4vLyBBc3luY0xvY2FsU3RvcmFnZSBpcyBpbmplY3RlZCB2aWEgdm0gbW9kdWxlIGludG8gZ2xvYmFsIHNjb3BlLlxuLy8gSW4gY2FzZSBXb3JrZmxvdyBjb2RlIGlzIGltcG9ydGVkIGluIE5vZGUuanMgY29udGV4dCwgcmVwbGFjZSB3aXRoIGFuIGVtcHR5IGNsYXNzLlxuZXhwb3J0IGNvbnN0IEFzeW5jTG9jYWxTdG9yYWdlOiBuZXcgPFQ+KCkgPT4gQUxTPFQ+ID0gKGdsb2JhbFRoaXMgYXMgYW55KS5Bc3luY0xvY2FsU3RvcmFnZSA/PyBjbGFzcyB7fTtcblxuLyoqIE1hZ2ljIHN5bWJvbCB1c2VkIHRvIGNyZWF0ZSB0aGUgcm9vdCBzY29wZSAtIGludGVudGlvbmFsbHkgbm90IGV4cG9ydGVkICovXG5jb25zdCBOT19QQVJFTlQgPSBTeW1ib2woJ05PX1BBUkVOVCcpO1xuXG4vKipcbiAqIE9wdGlvbiBmb3IgY29uc3RydWN0aW5nIGEgQ2FuY2VsbGF0aW9uU2NvcGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsYXRpb25TY29wZU9wdGlvbnMge1xuICAvKipcbiAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzY29wZSBjYW5jZWxsYXRpb24gaXMgYXV0b21hdGljYWxseSByZXF1ZXN0ZWRcbiAgICovXG4gIHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIHByZXZlbnQgb3V0ZXIgY2FuY2VsbGF0aW9uIGZyb20gcHJvcGFnYXRpbmcgdG8gaW5uZXIgc2NvcGVzLCBBY3Rpdml0aWVzLCB0aW1lcnMsIGFuZCBUcmlnZ2VycywgZGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogKFNjb3BlIHN0aWxsIHByb3BhZ2F0ZXMgQ2FuY2VsbGVkRmFpbHVyZSB0aHJvd24gZnJvbSB3aXRoaW4pLlxuICAgKi9cbiAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBDYW5jZWxsYXRpb25TY29wZSAodXNlZnVsIGZvciBydW5uaW5nIGJhY2tncm91bmQgdGFza3MpLlxuICAgKiBUaGUgYE5PX1BBUkVOVGAgc3ltYm9sIGlzIHJlc2VydmVkIGZvciB0aGUgcm9vdCBzY29wZS5cbiAgICovXG4gIHBhcmVudD86IENhbmNlbGxhdGlvblNjb3BlIHwgdHlwZW9mIE5PX1BBUkVOVDtcbn1cblxuLyoqXG4gKiBDYW5jZWxsYXRpb24gU2NvcGVzIHByb3ZpZGUgdGhlIG1lY2hhbmljIGJ5IHdoaWNoIGEgV29ya2Zsb3cgbWF5IGdyYWNlZnVsbHkgaGFuZGxlIGluY29taW5nIHJlcXVlc3RzIGZvciBjYW5jZWxsYXRpb25cbiAqIChlLmcuIGluIHJlc3BvbnNlIHRvIHtAbGluayBXb3JrZmxvd0hhbmRsZS5jYW5jZWx9IG9yIHRocm91Z2ggdGhlIFVJIG9yIENMSSksIGFzIHdlbGwgYXMgcmVxdWVzdCBjYW5jZWxsYXRpb24gb2ZcbiAqIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgaXQgb3ducyAoZS5nLiBBY3Rpdml0aWVzLCBUaW1lcnMsIENoaWxkIFdvcmtmbG93cywgZXRjKS5cbiAqXG4gKiBDYW5jZWxsYXRpb24gU2NvcGVzIGZvcm0gYSB0cmVlLCB3aXRoIHRoZSBXb3JrZmxvdydzIG1haW4gZnVuY3Rpb24gcnVubmluZyBpbiB0aGUgcm9vdCBzY29wZSBvZiB0aGF0IHRyZWUuXG4gKiBCeSBkZWZhdWx0LCBjYW5jZWxsYXRpb24gcHJvcGFnYXRlcyBkb3duIGZyb20gYSBwYXJlbnQgc2NvcGUgdG8gaXRzIGNoaWxkcmVuIGFuZCBpdHMgY2FuY2VsbGFibGUgb3BlcmF0aW9ucy5cbiAqIEEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGNhbiByZWNlaXZlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cywgYnV0IGlzIG5ldmVyIGVmZmVjdGl2ZWx5IGNvbnNpZGVyZWQgYXMgY2FuY2VsbGVkLFxuICogdGh1cyBzaGllbGRkaW5nIGl0cyBjaGlsZHJlbiBhbmQgY2FuY2VsbGFibGUgb3BlcmF0aW9ucyBmcm9tIHByb3BhZ2F0aW9uIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBpdCByZWNlaXZlcy5cbiAqXG4gKiBTY29wZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgY29uc3RydWN0b3Igb3IgdGhlIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyB7QGxpbmsgY2FuY2VsbGFibGV9LFxuICoge0BsaW5rIG5vbkNhbmNlbGxhYmxlfSBhbmQge0BsaW5rIHdpdGhUaW1lb3V0fS4gYHdpdGhUaW1lb3V0YCBjcmVhdGVzIGEgc2NvcGUgdGhhdCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgaXRzZWxmIGFmdGVyXG4gKiBzb21lIGR1cmF0aW9uLlxuICpcbiAqIENhbmNlbGxhdGlvbiBvZiBhIGNhbmNlbGxhYmxlIHNjb3BlIHJlc3VsdHMgaW4gYWxsIG9wZXJhdGlvbnMgY3JlYXRlZCBkaXJlY3RseSBpbiB0aGF0IHNjb3BlIHRvIHRocm93IGFcbiAqIHtAbGluayBDYW5jZWxsZWRGYWlsdXJlfSAoZWl0aGVyIGRpcmVjdGx5LCBvciBhcyB0aGUgYGNhdXNlYCBvZiBhbiB7QGxpbmsgQWN0aXZpdHlGYWlsdXJlfSBvciBhXG4gKiB7QGxpbmsgQ2hpbGRXb3JrZmxvd0ZhaWx1cmV9KS4gRnVydGhlciBhdHRlbXB0IHRvIGNyZWF0ZSBuZXcgY2FuY2VsbGFibGUgc2NvcGVzIG9yIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgd2l0aGluIGFcbiAqIHNjb3BlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWQgd2lsbCBhbHNvIGltbWVkaWF0ZWx5IHRocm93IGEge0BsaW5rIENhbmNlbGxlZEZhaWx1cmV9IGV4Y2VwdGlvbi4gSXQgaXMgaG93ZXZlclxuICogcG9zc2libGUgdG8gY3JlYXRlIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGF0IHRoYXQgcG9pbnQ7IHRoaXMgaXMgb2Z0ZW4gdXNlZCB0byBleGVjdXRlIHJvbGxiYWNrIG9yIGNsZWFudXBcbiAqIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KC4uLik6IFByb21pc2U8dm9pZD4ge1xuICogICB0cnkge1xuICogICAgIC8vIFRoaXMgYWN0aXZpdHkgcnVucyBpbiB0aGUgcm9vdCBjYW5jZWxsYXRpb24gc2NvcGUuIFRoZXJlZm9yZSwgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBvblxuICogICAgIC8vIHRoZSBXb3JrZmxvdyBleGVjdXRpb24gKGUuZy4gdGhyb3VnaCB0aGUgVUkgb3IgQ0xJKSBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZXMgdG8gdGhpc1xuICogICAgIC8vIGFjdGl2aXR5LiBBc3N1bWluZyB0aGF0IHRoZSBhY3Rpdml0eSBwcm9wZXJseSBoYW5kbGUgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LCB0aGVuIHRoZVxuICogICAgIC8vIGNhbGwgYmVsb3cgd2lsbCB0aHJvdyBhbiBgQWN0aXZpdHlGYWlsdXJlYCBleGNlcHRpb24sIHdpdGggYGNhdXNlYCBzZXRzIHRvIGFuXG4gKiAgICAgLy8gaW5zdGFuY2Ugb2YgYENhbmNlbGxlZEZhaWx1cmVgLlxuICogICAgIGF3YWl0IHNvbWVBY3Rpdml0eSgpO1xuICogICB9IGNhdGNoIChlKSB7XG4gKiAgICAgaWYgKGlzQ2FuY2VsbGF0aW9uKGUpKSB7XG4gKiAgICAgICAvLyBSdW4gY2xlYW51cCBhY3Rpdml0eSBpbiBhIG5vbi1jYW5jZWxsYWJsZSBzY29wZVxuICogICAgICAgYXdhaXQgQ2FuY2VsbGF0aW9uU2NvcGUubm9uQ2FuY2VsbGFibGUoYXN5bmMgKCkgPT4ge1xuICogICAgICAgICBhd2FpdCBjbGVhbnVwQWN0aXZpdHkoKTtcbiAqICAgICAgIH1cbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgdGhyb3cgZTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEEgY2FuY2VsbGFibGUgc2NvcGUgbWF5IGJlIHByb2dyYW1hdGljYWxseSBjYW5jZWxsZWQgYnkgY2FsbGluZyB7QGxpbmsgY2FuY2VsfGBzY29wZS5jYW5jZWwoKWB9YC4gVGhpcyBtYXkgYmUgdXNlZCxcbiAqIGZvciBleGFtcGxlLCB0byBleHBsaWNpdGx5IHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIEFjdGl2aXR5IG9yIENoaWxkIFdvcmtmbG93OlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBjYW5jZWxsYWJsZUFjdGl2aXR5U2NvcGUgPSBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoKTtcbiAqIGNvbnN0IGFjdGl2aXR5UHJvbWlzZSA9IGNhbmNlbGxhYmxlQWN0aXZpdHlTY29wZS5ydW4oKCkgPT4gc29tZUFjdGl2aXR5KCkpO1xuICogY2FuY2VsbGFibGVBY3Rpdml0eVNjb3BlLmNhbmNlbCgpOyAvLyBDYW5jZWxzIHRoZSBhY3Rpdml0eVxuICogYXdhaXQgYWN0aXZpdHlQcm9taXNlOyAvLyBUaHJvd3MgYEFjdGl2aXR5RmFpbHVyZWAgd2l0aCBgY2F1c2VgIHNldCB0byBgQ2FuY2VsbGVkRmFpbHVyZWBcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ2FuY2VsbGF0aW9uU2NvcGUge1xuICAvKipcbiAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBzY29wZSBjYW5jZWxsYXRpb24gaXMgYXV0b21hdGljYWxseSByZXF1ZXN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBmYWxzZSwgdGhlbiB0aGlzIHNjb3BlIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCBjYW5jZWxsZWQsIGV2ZW4gaWYgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBpcyByZWNlaXZlZCAoZWl0aGVyXG4gICAqIGRpcmVjdGx5IGJ5IGNhbGxpbmcgYHNjb3BlLmNhbmNlbCgpYCBvciBpbmRpcmVjdGx5IGJ5IGNhbmNlbGxpbmcgYSBjYW5jZWxsYWJsZSBwYXJlbnQgc2NvcGUpLiBUaGlzIGVmZmVjdGl2ZWx5XG4gICAqIHNoaWVsZHMgdGhlIHNjb3BlJ3MgY2hpbGRyZW4gYW5kIGNhbmNlbGxhYmxlIG9wZXJhdGlvbnMgZnJvbSBwcm9wYWdhdGlvbiBvZiBjYW5jZWxsYXRpb24gcmVxdWVzdHMgbWFkZSBvbiB0aGVcbiAgICogbm9uLWNhbmNlbGxhYmxlIHNjb3BlLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIFByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGBydW5gIGZ1bmN0aW9uIG9mIG5vbi1jYW5jZWxsYWJsZSBzY29wZSBtYXkgc3RpbGwgdGhyb3cgYSBgQ2FuY2VsbGVkRmFpbHVyZWBcbiAgICogaWYgc3VjaCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gd2l0aGluIHRoYXQgc2NvcGUgKGUuZy4gYnkgZGlyZWN0bHkgY2FuY2VsbGluZyBhIGNhbmNlbGxhYmxlIGNoaWxkIHNjb3BlKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjYW5jZWxsYWJsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgQ2FuY2VsbGF0aW9uU2NvcGUgKHVzZWZ1bCBmb3IgcnVubmluZyBiYWNrZ3JvdW5kIHRhc2tzKSwgZGVmYXVsdHMgdG8ge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnR9KClcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXJlbnQ/OiBDYW5jZWxsYXRpb25TY29wZTtcblxuICAvKipcbiAgICogQSBQcm9taXNlIHRoYXQgdGhyb3dzIHdoZW4gYSBjYW5jZWxsYWJsZSBzY29wZSByZWNlaXZlcyBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0LCBlaXRoZXIgZGlyZWN0bHlcbiAgICogKGkuZS4gYHNjb3BlLmNhbmNlbCgpYCksIG9yIGluZGlyZWN0bHkgKGJ5IGNhbmNlbGxpbmcgYSBjYW5jZWxsYWJsZSBwYXJlbnQgc2NvcGUpLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYSBub24tY2FuY2VsbGFibGUgc2NvcGUgbWF5IHJlY2VpdmUgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLCByZXN1bHRpbmcgaW4gdGhlIGBjYW5jZWxSZXF1ZXN0ZWRgIHByb21pc2UgZm9yXG4gICAqIHRoYXQgc2NvcGUgdG8gdGhyb3csIHRob3VnaCB0aGUgc2NvcGUgd2lsbCBub3QgZWZmZWN0aXZlbHkgZ2V0IGNhbmNlbGxlZCAoaS5lLiBgY29uc2lkZXJlZENhbmNlbGxlZGAgd2lsbCBzdGlsbFxuICAgKiByZXR1cm4gYGZhbHNlYCwgYW5kIGNhbmNlbGxhdGlvbiB3aWxsIG5vdCBiZSBwcm9wYWdhdGVkIHRvIGNoaWxkIHNjb3BlcyBhbmQgY29udGFpbmVkIG9wZXJhdGlvbnMpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNhbmNlbFJlcXVlc3RlZDogUHJvbWlzZTxuZXZlcj47XG5cbiAgI2NhbmNlbFJlcXVlc3RlZCA9IGZhbHNlO1xuXG4gIC8vIFR5cGVzY3JpcHQgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGF0IHRoZSBQcm9taXNlIGV4ZWN1dG9yIHJ1bnMgc3luY2hyb25vdXNseSBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHByb3RlY3RlZCByZWFkb25seSByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IENhbmNlbGxhdGlvblNjb3BlT3B0aW9ucykge1xuICAgIHRoaXMudGltZW91dCA9IG1zT3B0aW9uYWxUb051bWJlcihvcHRpb25zPy50aW1lb3V0KTtcbiAgICB0aGlzLmNhbmNlbGxhYmxlID0gb3B0aW9ucz8uY2FuY2VsbGFibGUgPz8gdHJ1ZTtcbiAgICB0aGlzLmNhbmNlbFJlcXVlc3RlZCA9IG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVFNDIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoZSBQcm9taXNlIGV4ZWN1dG9yIHJ1bnMgc3luY2hyb25vdXNseVxuICAgICAgdGhpcy5yZWplY3QgPSAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMuI2NhbmNlbFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICB1bnRyYWNrUHJvbWlzZSh0aGlzLmNhbmNlbFJlcXVlc3RlZCk7XG4gICAgLy8gQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbnNcbiAgICB1bnRyYWNrUHJvbWlzZSh0aGlzLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgICBpZiAob3B0aW9ucz8ucGFyZW50ICE9PSBOT19QQVJFTlQpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gb3B0aW9ucz8ucGFyZW50IHx8IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsbGFibGUgfHxcbiAgICAgICAgKHRoaXMucGFyZW50LiNjYW5jZWxSZXF1ZXN0ZWQgJiZcbiAgICAgICAgICAhZ2V0QWN0aXZhdG9yKCkuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLiNjYW5jZWxSZXF1ZXN0ZWQgPSB0aGlzLnBhcmVudC4jY2FuY2VsUmVxdWVzdGVkO1xuICAgICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgICB0aGlzLnBhcmVudC5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgICAgdGhpcy5wYXJlbnQuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmICghZ2V0QWN0aXZhdG9yKCkuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKSkge1xuICAgICAgICAgICAgICB0aGlzLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNjb3BlIHdhcyBlZmZlY3RpdmVseSBjYW5jZWxsZWQuIEEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIGNhbiBuZXZlciBiZSBjb25zaWRlcmVkIGNhbmNlbGxlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uc2lkZXJlZENhbmNlbGxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2FuY2VsUmVxdWVzdGVkICYmIHRoaXMuY2FuY2VsbGFibGU7XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHNjb3BlIGFzIGN1cnJlbnQgYW5kIHJ1biAgYGZuYFxuICAgKlxuICAgKiBBbnkgdGltZXJzLCBBY3Rpdml0aWVzLCBUcmlnZ2VycyBhbmQgQ2FuY2VsbGF0aW9uU2NvcGVzIGNyZWF0ZWQgaW4gdGhlIGJvZHkgb2YgYGZuYFxuICAgKiBhdXRvbWF0aWNhbGx5IGxpbmsgdGhlaXIgY2FuY2VsbGF0aW9uIHRvIHRoaXMgc2NvcGUuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBgZm5gXG4gICAqL1xuICBydW48VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gc3RvcmFnZS5ydW4odGhpcywgdGhpcy5ydW5JbkNvbnRleHQuYmluZCh0aGlzLCBmbikgYXMgKCkgPT4gUHJvbWlzZTxUPik7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRoYXQgcnVucyBhIGZ1bmN0aW9uIGluIEFzeW5jTG9jYWxTdG9yYWdlIGNvbnRleHQuXG4gICAqXG4gICAqIENvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGFzIGFub255bW91cyBmdW5jdGlvbiwgbWFkZSBpbnRvIGEgbWV0aG9kIGZvciBpbXByb3ZlZCBzdGFjayB0cmFjZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcnVuSW5Db250ZXh0PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IHRpbWVyU2NvcGU6IENhbmNlbGxhdGlvblNjb3BlIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIHRpbWVyU2NvcGUgPSBuZXcgQ2FuY2VsbGF0aW9uU2NvcGUoKTtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICB0aW1lclNjb3BlXG4gICAgICAgICAgLnJ1bigoKSA9PiBzbGVlcCh0aGlzLnRpbWVvdXQgYXMgbnVtYmVyKSlcbiAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICgpID0+IHRoaXMuY2FuY2VsKCksXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHNjb3BlIHdhcyBhbHJlYWR5IGNhbmNlbGxlZCwgaWdub3JlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRpbWVyU2NvcGUgJiZcbiAgICAgICAgIXRpbWVyU2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCAmJlxuICAgICAgICBnZXRBY3RpdmF0b3IoKS5oYXNGbGFnKFNka0ZsYWdzLk5vbkNhbmNlbGxhYmxlU2NvcGVzQXJlU2hpZWxkZWRGcm9tUHJvcGFnYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgdGltZXJTY29wZS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0byBjYW5jZWwgdGhlIHNjb3BlIGFuZCBsaW5rZWQgY2hpbGRyZW5cbiAgICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChuZXcgQ2FuY2VsbGVkRmFpbHVyZSgnQ2FuY2VsbGF0aW9uIHNjb3BlIGNhbmNlbGxlZCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgXCJhY3RpdmVcIiBzY29wZVxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKTogQ2FuY2VsbGF0aW9uU2NvcGUge1xuICAgIC8vIFVzaW5nIGdsb2JhbHMgZGlyZWN0bHkgaW5zdGVhZCBvZiBhIGhlbHBlciBmdW5jdGlvbiB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRcbiAgICByZXR1cm4gc3RvcmFnZS5nZXRTdG9yZSgpID8/IChnbG9iYWxUaGlzIGFzIGFueSkuX19URU1QT1JBTF9BQ1RJVkFUT1JfXy5yb290U2NvcGU7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlIH0pLnJ1bihmbilgICovXG4gIHN0YXRpYyBjYW5jZWxsYWJsZTxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiB0cnVlIH0pLnJ1bihmbik7XG4gIH1cblxuICAvKiogQWxpYXMgdG8gYG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiBmYWxzZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgbm9uQ2FuY2VsbGFibGU8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gbmV3IHRoaXMoeyBjYW5jZWxsYWJsZTogZmFsc2UgfSkucnVuKGZuKTtcbiAgfVxuXG4gIC8qKiBBbGlhcyB0byBgbmV3IENhbmNlbGxhdGlvblNjb3BlKHsgY2FuY2VsbGFibGU6IHRydWUsIHRpbWVvdXQgfSkucnVuKGZuKWAgKi9cbiAgc3RhdGljIHdpdGhUaW1lb3V0PFQ+KHRpbWVvdXQ6IER1cmF0aW9uLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGNhbmNlbGxhYmxlOiB0cnVlLCB0aW1lb3V0IH0pLnJ1bihmbik7XG4gIH1cbn1cblxuY29uc3Qgc3RvcmFnZTogQUxTPENhbmNlbGxhdGlvblNjb3BlPiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuXG5leHBvcnQgY2xhc3MgUm9vdENhbmNlbGxhdGlvblNjb3BlIGV4dGVuZHMgQ2FuY2VsbGF0aW9uU2NvcGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7IGNhbmNlbGxhYmxlOiB0cnVlLCBwYXJlbnQ6IE5PX1BBUkVOVCB9KTtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChuZXcgQ2FuY2VsbGVkRmFpbHVyZSgnV29ya2Zsb3cgY2FuY2VsbGVkJykpO1xuICB9XG59XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgdG8gYXZvaWQgYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gdGhpcyBtb2R1bGUgYW5kIHdvcmtmbG93LnRzICovXG5sZXQgc2xlZXAgPSAoXzogRHVyYXRpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBoYXMgbm90IGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQnKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclNsZWVwSW1wbGVtZW50YXRpb24oZm46IHR5cGVvZiBzbGVlcCk6IHZvaWQge1xuICBzbGVlcCA9IGZuO1xufVxuIiwiaW1wb3J0IHsgQWN0aXZpdHlGYWlsdXJlLCBDYW5jZWxsZWRGYWlsdXJlLCBDaGlsZFdvcmtmbG93RmFpbHVyZSwgTmV4dXNPcGVyYXRpb25GYWlsdXJlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCB3b3JrZmxvdyBlcnJvcnNcbiAqL1xuQFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yKCdXb3JrZmxvd0Vycm9yJylcbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Vycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBUaHJvd24gaW4gd29ya2Zsb3cgd2hlbiBpdCB0cmllcyB0byBkbyBzb21ldGhpbmcgdGhhdCBub24tZGV0ZXJtaW5pc3RpYyBzdWNoIGFzIGNvbnN0cnVjdCBhIFdlYWtSZWYoKVxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0RldGVybWluaXNtVmlvbGF0aW9uRXJyb3InKVxuZXhwb3J0IGNsYXNzIERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd0Vycm9yIHt9XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGFjdHMgYXMgYSBtYXJrZXIgZm9yIHRoaXMgc3BlY2lhbCByZXN1bHQgdHlwZVxuICovXG5AU3ltYm9sQmFzZWRJbnN0YW5jZU9mRXJyb3IoJ0xvY2FsQWN0aXZpdHlEb0JhY2tvZmYnKVxuZXhwb3J0IGNsYXNzIExvY2FsQWN0aXZpdHlEb0JhY2tvZmYgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBiYWNrb2ZmOiBjb3Jlc2RrLmFjdGl2aXR5X3Jlc3VsdC5JRG9CYWNrb2ZmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBwcm92aWRlZCBgZXJyYCBpcyBjYXVzZWQgYnkgY2FuY2VsbGF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhbmNlbGxhdGlvbihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBlcnIgaW5zdGFuY2VvZiBDYW5jZWxsZWRGYWlsdXJlIHx8XG4gICAgKChlcnIgaW5zdGFuY2VvZiBBY3Rpdml0eUZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUgfHwgZXJyIGluc3RhbmNlb2YgTmV4dXNPcGVyYXRpb25GYWlsdXJlKSAmJlxuICAgICAgZXJyLmNhdXNlIGluc3RhbmNlb2YgQ2FuY2VsbGVkRmFpbHVyZSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHR5cGUgU2RrRmxhZyA9IHtcbiAgZ2V0IGlkKCk6IG51bWJlcjtcbiAgZ2V0IGRlZmF1bHQoKTogYm9vbGVhbjtcbiAgZ2V0IGFsdGVybmF0aXZlQ29uZGl0aW9ucygpOiBBbHRDb25kaXRpb25GbltdIHwgdW5kZWZpbmVkO1xufTtcblxuY29uc3QgZmxhZ3NSZWdpc3RyeTogTWFwPG51bWJlciwgU2RrRmxhZz4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBTZGtGbGFncyA9IHtcbiAgLyoqXG4gICAqIFRoaXMgZmxhZyBnYXRlcyBtdWx0aXBsZSBmaXhlcyByZWxhdGVkIHRvIGNhbmNlbGxhdGlvbiBzY29wZXMgYW5kIHRpbWVycyBpbnRyb2R1Y2VkIGluIDEuMTAuMi8xLjExLjA6XG4gICAqIC0gQ2FuY2VsbGF0aW9uIG9mIGEgbm9uLWNhbmNlbGxhYmxlIHNjb3BlIG5vIGxvbmdlciBwcm9wYWdhdGVzIHRvIGNoaWxkcmVuIHNjb3Blc1xuICAgKiAgIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbXBvcmFsaW8vc2RrLXR5cGVzY3JpcHQvaXNzdWVzLzE0MjMpLlxuICAgKiAtIENhbmNlbGxhdGlvblNjb3BlLndpdGhUaW1lb3V0KGZuKSBub3cgY2FuY2VsIHRoZSB0aW1lciBpZiBgZm5gIGNvbXBsZXRlcyBiZWZvcmUgZXhwaXJhdGlvblxuICAgKiAgIG9mIHRoZSB0aW1lb3V0LCBzaW1pbGFyIHRvIGhvdyBgY29uZGl0aW9uKGZuLCB0aW1lb3V0KWAgd29ya3MuXG4gICAqIC0gVGltZXJzIGNyZWF0ZWQgdXNpbmcgc2V0VGltZW91dCBjYW4gbm93IGJlIGludGVyY2VwdGVkLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEwLjIvMS4xMS4wLiBIb3dldmVyLCBkdWUgdG8gYW4gU0RLIGJ1ZywgU0RLcyB2MS4xMS4wIGFuZCB2MS4xMS4xIHdlcmUgbm90XG4gICAqICAgICAgICBwcm9wZXJseSB3cml0aW5nIGJhY2sgdGhlIGZsYWdzIHRvIGhpc3RvcnksIHBvc3NpYmx5IHJlc3VsdGluZyBpbiBOREUgb24gcmVwbGF5LiBXZSB0aGVyZWZvcmVcbiAgICogICAgICAgIGNvbnNpZGVyIHRoYXQgYSBXRlQgZW1pdHRlZCBieSBXb3JrZXIgdjEuMTEuMCBvciB2MS4xMS4xIHRvIGltcGxpY2l0bHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBOb25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uOiBkZWZpbmVGbGFnKDEsIHRydWUsIFtidWlsZElkU2RrVmVyc2lvbk1hdGNoZXMoLzFcXC4xMVxcLlswMV0vKV0pLFxuXG4gIC8qKlxuICAgKiBQcmlvciB0byAxLjExLjAsIHdoZW4gcHJvY2Vzc2luZyBhIFdvcmtmbG93IGFjdGl2YXRpb24sIHRoZSBTREsgd291bGQgZXhlY3V0ZSBgbm90aWZ5SGFzUGF0Y2hgXG4gICAqIGFuZCBgc2lnbmFsV29ya2Zsb3dgIGpvYnMgaW4gZGlzdGluY3QgcGhhc2VzLCBiZWZvcmUgb3RoZXIgdHlwZXMgb2Ygam9icy4gVGhlIHByaW1hcnkgcmVhc29uXG4gICAqIGJlaGluZCB0aGF0IG11bHRpLXBoYXNlIGFsZ29yaXRobSB3YXMgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IHRoYXQgYSBXb3JrZmxvdyBleGVjdXRpb24gbWlnaHRcbiAgICogY29tcGxldGUgYmVmb3JlIGFsbCBpbmNvbWluZyBzaWduYWxzIGhhdmUgYmVlbiBkaXNwYXRjaGVkIChhdCBsZWFzdCB0byB0aGUgcG9pbnQgdGhhdCB0aGVcbiAgICogX3N5bmNocm9ub3VzXyBwYXJ0IG9mIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkKS5cbiAgICpcbiAgICogVGhpcyBmbGFnIHJlcGxhY2VzIHRoYXQgbXVsdGktcGhhc2UgYWxnb3JpdGhtIHdpdGggYSBzaW1wbGVyIG9uZSB3aGVyZSBqb2JzIGFyZSBzaW1wbHkgc29ydGVkIGFzXG4gICAqIGAoc2lnbmFscyBhbmQgdXBkYXRlcykgLT4gb3RoZXJzYCwgYnV0IHdpdGhvdXQgcHJvY2Vzc2luZyB0aGVtIGFzIGRpc3RpbmN0IGJhdGNoZXMgKGkuZS4gd2l0aG91dFxuICAgKiBsZWF2aW5nL3JlZW50ZXJpbmcgdGhlIFZNIGNvbnRleHQgYmV0d2VlbiBlYWNoIGdyb3VwLCB3aGljaCBhdXRvbWF0aWNhbGx5IHRyaWdnZXJzIHRoZSBleGVjdXRpb25cbiAgICogb2YgYWxsIG91dHN0YW5kaW5nIG1pY3JvdGFza3MpLiBUaGF0IHNpbmdsZS1waGFzZSBhcHByb2FjaCByZXNvbHZlcyBhIG51bWJlciBvZiBxdWlya3Mgb2YgdGhlXG4gICAqIGZvcm1lciBhbGdvcml0aG0sIGFuZCB5ZXQgc3RpbGwgc2F0aXNmaWVzIHRvIHRoZSBvcmlnaW5hbCByZXF1aXJlbWVudCBvZiBlbnN1cmluZyB0aGF0IGV2ZXJ5XG4gICAqIGBzaWduYWxXb3JrZmxvd2Agam9icyAtIGFuZCBub3cgYGRvVXBkYXRlYCBqb2JzIGFzIHdlbGwgLSBoYXZlIGJlZW4gZ2l2ZW4gYSBwcm9wZXIgY2hhbmNlIHRvXG4gICAqIGV4ZWN1dGUgYmVmb3JlIHRoZSBXb3JrZmxvdyBtYWluIGZ1bmN0aW9uIG1pZ2h0IGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMS4wLiBUaGlzIGNoYW5nZSBpcyBub3Qgcm9sbGJhY2stc2FmZS4gSG93ZXZlciwgZHVlIHRvIGFuIFNESyBidWcsIFNES3NcbiAgICogICAgICAgIHYxLjExLjAgYW5kIHYxLjExLjEgd2VyZSBub3QgcHJvcGVybHkgd3JpdGluZyBiYWNrIHRoZSBmbGFncyB0byBoaXN0b3J5LCBwb3NzaWJseSByZXN1bHRpbmdcbiAgICogICAgICAgIGluIE5ERSBvbiByZXBsYXkuIFdlIHRoZXJlZm9yZSBjb25zaWRlciB0aGF0IGEgV0ZUIGVtaXR0ZWQgYnkgV29ya2VyIHYxLjExLjAgb3IgdjEuMTEuMVxuICAgKiAgICAgICAgdG8gaW1wbGljaXRlbHkgaGF2ZSB0aGlzIGZsYWcgb24uXG4gICAqL1xuICBQcm9jZXNzV29ya2Zsb3dBY3RpdmF0aW9uSm9ic0FzU2luZ2xlQmF0Y2g6IGRlZmluZUZsYWcoMiwgdHJ1ZSwgW2J1aWxkSWRTZGtWZXJzaW9uTWF0Y2hlcygvMVxcLjExXFwuWzAxXS8pXSksXG5cbiAgLyoqXG4gICAqIEluIDEuMTEuNSB0aGUgYGhhbmRsZVNpZ25hbGAgaW50ZXJjZXB0b3Igd2FzIGFkZGVkIHRvIEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5XG4gICAqIHdoaWNoIGFkZGVkIGEgeWllbGQgcG9pbnQuIFRoZSBhZGRlZCB5aWVsZCBwb2ludCBjYW4gY2F1c2UgTkRFIGlmIHRoZXJlIHdhcyBhIHNpZ25hbCBoYW5kbGVyIGFuZFxuICAgKiB0aGUgd29ya2Zsb3cgd2FzIHN0YXJ0ZWQgd2l0aCBhIHNpZ25hbC5cbiAgICpcbiAgICogVGhpcyB5aWVsZCBwb2ludCB3YXMgcmVtb3ZlZCBpbiAxLjEzLjIsIGJ1dCBpbiBvcmRlciB0byBwcmV2ZW50IHdvcmtmbG93cyBmcm9tIHRoZVxuICAgKiBhZmZlY3RlZCB2ZXJzaW9ucyByZXN1bHRpbmcgaW4gTkRFLCB3ZSBoYXZlIHRvIGluamVjdCB0aGUgeWllbGQgcG9pbnQgb24gcmVwbGF5LlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjIuXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzVHJhY2VzSW5ib3VuZFNpZ25hbHM6IGRlZmluZUZsYWcoMywgdHJ1ZSwgW2lzQXRMZWFzdCh7IG1ham9yOiAxLCBtaW5vcjogMTEsIHBhdGNoOiA1IH0pXSksXG5cbiAgLyoqXG4gICAqIEluIDEuMTEuNiwgdGhlIGBzY2hlZHVsZUxvY2FsQWN0aXZpdHlgIGludGVyY2VwdG9yIHdhcyBhZGRlZCB0b1xuICAgKiBgQHRlbXBvcmFsaW8vaW50ZXJjZXB0b3JzLW9wZW50ZWxlbWV0cnlgIHdoaWNoIGFkZGVkIGEgeWllbGQgcG9pbnQgdG8gdGhlXG4gICAqIG91dGJvdW5kIGludGVyY2VwdG9yLiBUaGlzIHlpZWxkIHBvaW50IHdhcyByZW1vdmVkIGluIDEuMTMuMi5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4yXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzVHJhY2VzTG9jYWxBY3Rpdml0aWVzOiBkZWZpbmVGbGFnKDQsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDExLCBwYXRjaDogNiB9KV0pLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJjZXB0b3JzIHByb3ZpZGVkIGJ5IEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5IGluaXRpYWxseSBoYWQgdW5uZWNlc3NhcnlcbiAgICogeWllbGQgcG9pbnRzIG9uIGNhbGxpbmcgdG8gYGV4dHJhY3RDb250ZXh0RnJvbUhlYWRlcnNgLlxuICAgKiBJZiByZXBsYXlpbmcgYSB3b3JrZmxvdyBjcmVhdGVkIGZyb20gdGhlc2UgdmVyc2lvbnMgYSB5aWVsZCBwb2ludCBpcyBpbmplY3RlZCB0byBwcmV2ZW50IGFueSBOREUuXG4gICAqXG4gICAqIElmIHRoZSBoaXN0b3J5IGRvZXMgbm90IGluY2x1ZGUgdGhlIFNESyB2ZXJzaW9uLCBkZWZhdWx0IHRvIGV4dHJhIHlpZWxkcyBzaW5jZSB0aGUgeWllbGRzIHdlcmUgcHJlc2VudCBzaW5jZSB0aGUgT1RFTFxuICAgKiBwYWNrYWdlIHdhcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAc2luY2UgSW50cm9kdWNlZCBpbiAxLjEzLjJcbiAgICovXG4gIE9wZW5UZWxlbWV0cnlJbnRlcmNlcG9yc0F2b2lkc0V4dHJhWWllbGRzOiBkZWZpbmVGbGFnKDUsIHRydWUsIFtpc0F0TGVhc3QoeyBtYWpvcjogMSwgbWlub3I6IDEzLCBwYXRjaDogMiB9KV0pLFxuXG4gIC8qKlxuICAgKiBJbiAxLjEzLjMsIGFsbCByZW1haW5pbmcgaW50ZXJjZXB0b3IgbWV0aG9kcyB3ZXJlIGltcGxlbWVudGVkIGluIEB0ZW1wb3JhbGlvL2ludGVyY2VwdG9ycy1vcGVudGVsZW1ldHJ5XG4gICAqIGluY2x1ZGluZyBgaGFuZGxlVXBkYXRlYCwgYHZhbGlkYXRlVXBkYXRlYCwgYGhhbmRsZVF1ZXJ5YCwgYHN0YXJ0VGltZXJgLCBhbmQgYHN0YXJ0TmV4dXNPcGVyYXRpb25gLlxuICAgKiBUaGVzZSBhZGQgaW5zdHJ1bWVudGF0aW9uIGFuZCB5aWVsZCBwb2ludHMgdGhhdCB3ZXJlIG5vdCBwcmVzZW50IGluIGVhcmxpZXIgdmVyc2lvbnMuXG4gICAqIFRoaXMgZmxhZyBnYXRlcyB0aGVzZSBuZXcgaW50ZXJjZXB0b3IgbWV0aG9kcyB0byBwcmV2ZW50IE5ERSBvbiByZXBsYXkgb2Ygd29ya2Zsb3dzIGZyb20gZWFybGllciB2ZXJzaW9ucy5cbiAgICpcbiAgICogQHNpbmNlIEludHJvZHVjZWQgaW4gMS4xMy4zXG4gICAqL1xuICBPcGVuVGVsZW1ldHJ5SW50ZXJjZXB0b3JzSW5zdHJ1bWVudHNBbGxNZXRob2RzOiBkZWZpbmVGbGFnKDYsIHRydWUpLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZGVmaW5lRmxhZyhpZDogbnVtYmVyLCBkZWY6IGJvb2xlYW4sIGFsdGVybmF0aXZlQ29uZGl0aW9ucz86IEFsdENvbmRpdGlvbkZuW10pOiBTZGtGbGFnIHtcbiAgY29uc3QgZmxhZyA9IHsgaWQsIGRlZmF1bHQ6IGRlZiwgYWx0ZXJuYXRpdmVDb25kaXRpb25zIH07XG4gIGZsYWdzUmVnaXN0cnkuc2V0KGlkLCBmbGFnKTtcbiAgcmV0dXJuIGZsYWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZEZsYWcoaWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWZsYWdzUmVnaXN0cnkuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBTREsgZmxhZzogJHtpZH1gKTtcbn1cblxuLyoqXG4gKiBBbiBTREsgRmxhZyBBbHRlcm5hdGUgQ29uZGl0aW9uIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgZmxhZ1xuICogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV0ZUOyBlLmcuIGJ5IGxvb2tpbmcgYXQgdGhlIHZlcnNpb24gb2YgdGhlIFNES1xuICogdGhhdCBlbWl0dGVkIGEgV0ZULiBUaGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0byByZXRyb2FjdGl2ZWx5IHR1cm4gb24gc29tZSBmbGFncyBmb3IgV0ZUXG4gKiBlbWl0dGVkIGJ5IHByZXZpb3VzIFNES3MgdGhhdCBjb250YWluZWQgYSBidWcuXG4gKlxuICogTm90ZSB0aGF0IGNvbmRpdGlvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIHdoaWxlIHJlcGxheWluZywgYW5kIG9ubHkgaWYgdGhlIGNvcnJlc3BvbmluZyBmbGFnIGlzXG4gKiBub3QgYWxyZWFkeSBzZXQuIEFsc28sIGFsdGVybmF0ZSBjb25kaXRpb25zIHdpbGwgbm90IGNhdXNlIHRoZSBmbGFnIHRvIGJlIHBlcnNpc3RlZCB0byB0aGVcbiAqIFwidXNlZCBmbGFnc1wiIHNldCwgd2hpY2ggbWVhbnMgdGhhdCBmdXJ0aGVyIFdvcmtmbG93IFRhc2tzIG1heSBub3QgcmVmbGVjdCB0aGlzIGZsYWcgaWYgdGhlXG4gKiBjb25kaXRpb24gbm8gbG9uZ2VyIGhvbGRzLiBUaGlzIGlzIHNvIHRvIGF2b2lkIGluY29ycmVjdCBiZWhhdmlvcnMgaW4gY2FzZSB3aGVyZSBhIFdvcmtmbG93XG4gKiBFeGVjdXRpb24gaGFzIGdvbmUgdGhyb3VnaCBhIG5ld2VyIFNESyB2ZXJzaW9uIHRoZW4gYWdhaW4gdGhyb3VnaCBhbiBvbGRlciBvbmUuXG4gKi9cbnR5cGUgQWx0Q29uZGl0aW9uRm4gPSAoY3R4OiB7IGluZm86IFdvcmtmbG93SW5mbzsgc2RrVmVyc2lvbj86IHN0cmluZyB9KSA9PiBib29sZWFuO1xuXG5mdW5jdGlvbiBidWlsZElkU2RrVmVyc2lvbk1hdGNoZXModmVyc2lvbjogUmVnRXhwKTogQWx0Q29uZGl0aW9uRm4ge1xuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF5AdGVtcG9yYWxpby93b3JrZXJAKCR7dmVyc2lvbi5zb3VyY2V9KVsrXWApO1xuICByZXR1cm4gKHsgaW5mbyB9KSA9PiBpbmZvLmN1cnJlbnRCdWlsZElkICE9IG51bGwgJiYgcmVnZXgudGVzdChpbmZvLmN1cnJlbnRCdWlsZElkKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxufVxuXG50eXBlIFNlbVZlciA9IHtcbiAgbWFqb3I6IG51bWJlcjtcbiAgbWlub3I6IG51bWJlcjtcbiAgcGF0Y2g6IG51bWJlcjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBgQWx0Q29uZGl0aW9uRm5gIHRoYXQgY2hlY2tzIGlmIHRoZSBTREsgdmVyc2lvbiBpcyBlcXVhbCB0byBvciBhZnRlciB0aGUgcHJvdmlkZWQgdmVyc2lvbi5cbiAqIEFuIG9wdGlvbmFsIGRlZmF1bHQgY2FuIGJlIHByb3ZpZGVkIGluIGNhc2UgdGhlIFNESyB2ZXJzaW9uIGlzIG5vdCBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIGlzQXRMZWFzdChjb21wYXJlOiBTZW1WZXIsIG1pc3NpbmdEZWZhdWx0PzogYm9vbGVhbik6IEFsdENvbmRpdGlvbkZuIHtcbiAgcmV0dXJuIChjdHgpID0+IHtcbiAgICByZXR1cm4gaXNDb21wYXJlZChjb21wYXJlLCAtMSwgbWlzc2luZ0RlZmF1bHQpKGN0eCkgfHwgaXNDb21wYXJlZChjb21wYXJlLCAwLCBtaXNzaW5nRGVmYXVsdCkoY3R4KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNDb21wYXJlZChjb21wYXJlOiBTZW1WZXIsIGNvbXBhcmlzb246IC0xIHwgMCB8IDEsIG1pc3NpbmdEZWZhdWx0OiBib29sZWFuID0gZmFsc2UpOiBBbHRDb25kaXRpb25GbiB7XG4gIHJldHVybiAoeyBzZGtWZXJzaW9uIH0pID0+IHtcbiAgICBpZiAoIXNka1ZlcnNpb24pIHJldHVybiBtaXNzaW5nRGVmYXVsdDtcbiAgICBjb25zdCB2ZXJzaW9uID0gcGFyc2VTZW12ZXIoc2RrVmVyc2lvbik7XG4gICAgaWYgKCF2ZXJzaW9uKSByZXR1cm4gbWlzc2luZ0RlZmF1bHQ7XG4gICAgcmV0dXJuIGNvbXBhcmVTZW12ZXIoY29tcGFyZSwgdmVyc2lvbikgPT09IGNvbXBhcmlzb247XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2VtdmVyKHZlcnNpb246IHN0cmluZyk6IFNlbVZlciB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgW18sIG1ham9yLCBtaW5vciwgcGF0Y2hdID0gdmVyc2lvbi5tYXRjaCgvKFxcZCspXFwuKFxcZCspXFwuKFxcZCspLykhO1xuICAgIHJldHVybiB7XG4gICAgICBtYWpvcjogTnVtYmVyLnBhcnNlSW50KG1ham9yISksXG4gICAgICBtaW5vcjogTnVtYmVyLnBhcnNlSW50KG1pbm9yISksXG4gICAgICBwYXRjaDogTnVtYmVyLnBhcnNlSW50KHBhdGNoISksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlU2VtdmVyKGE6IFNlbVZlciwgYjogU2VtVmVyKTogLTEgfCAwIHwgMSB7XG4gIGlmIChhLm1ham9yIDwgYi5tYWpvcikgcmV0dXJuIC0xO1xuICBpZiAoYS5tYWpvciA+IGIubWFqb3IpIHJldHVybiArMTtcbiAgaWYgKGEubWlub3IgPCBiLm1pbm9yKSByZXR1cm4gLTE7XG4gIGlmIChhLm1pbm9yID4gYi5taW5vcikgcmV0dXJuICsxO1xuICBpZiAoYS5wYXRjaCA8IGIucGF0Y2gpIHJldHVybiAtMTtcbiAgaWYgKGEucGF0Y2ggPiBiLnBhdGNoKSByZXR1cm4gKzE7XG4gIHJldHVybiAwO1xufVxuIiwiaW1wb3J0IHsgSWxsZWdhbFN0YXRlRXJyb3IsIHR5cGUgV29ya2Zsb3cgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmF0b3IgfSBmcm9tICcuL2ludGVybmFscyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93SW50ZXJjZXB0b3JzRmFjdG9yeSB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAvLyBUaGUgX19URU1QT1JBTF9fIG9iamVjdCB3aWxsIGJlIGFzc2lnbmVkIGJ5IFdlYnBhY2sgdG8gdGhlIGV4cG9ydHMgb2YgdGhlIGVudHJ5cG9pbnQgbW9kdWxlXG4gIC8vIGZpbGUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBidW5kbGVyIChzZWUgd29ya2Zsb3cvYnVuZGxlci50cyNnZW5FbnRyeXBvaW50KCkpLlxuICAvL1xuICAvLyBGSVhNRTogUmVuYW1lIHRvIGxvd2VyY2FzZSBzeW50YXggYmVmb3JlIDEuMTUuMC4gSSBwcmVzZXJ2ZWQgdGhlIHVwcGVyY2FzZSBuYW1lIGZvciBiYWNrd2FyZFxuICAvLyBjb21wYXRpYmlsaXR5IHdpdGggYnVuZGxlcyBnZW5lcmF0ZWQgYnkgMS4xNC4wLiBXZSBnZW5lcmFsbHkgZG8gbm90IGd1YXJhbnRlZSBjb21wYXRpYmlsaXR5IG9mXG4gIC8vIGJ1bmRsZXMgd2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIFNESywgYnV0IGluIHRoaXMgc3BlY2lmaWMgY2FzZSwgdGhlcmUncyByZWFsbHkgbm9cbiAgLy8gdXNlci1zaWRlIHZhbHVlIGluIHJlbmFtaW5nIHRoaXMsIHNvIG1ha2luZyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgdGhhdCB3b3VsZCBub3QgYmUganVzdGlmaWVkLlxuICAvL1xuXG4gIHZhciBfX1RFTVBPUkFMX186IHtcbiAgICBhcGk6IHR5cGVvZiBpbXBvcnQoJy4vd29ya2VyLWludGVyZmFjZS50cycpO1xuICAgIHByZWxvYWRNb2R1bGVzPzogKCkgPT4gdm9pZDtcbiAgICBpbXBvcnRXb3JrZmxvd3M6ICgpID0+IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PjtcbiAgICBpbXBvcnRJbnRlcmNlcHRvcnM6ICgpID0+IFt7IGludGVyY2VwdG9yczogV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5IH1dO1xuICB9O1xuXG4gIC8vIERlc3RydWN0b3JzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzaGFyZWQgc2FuZGJveCBpcyBkZXN0cm95ZWQuXG5cbiAgdmFyIF9fdGVtcG9yYWxfZ2xvYmFsU2FuZGJveERlc3RydWN0b3JzOiAoKCkgPT4gdm9pZClbXSB8IHVuZGVmaW5lZDtcblxuICAvLyBGSVhNRTogUmVuYW1lIHRvIGxvd2VyY2FzZSBzeW50YXggYmVmb3JlIDEuMTUuMC5cblxuICB2YXIgX19URU1QT1JBTF9BQ1RJVkFUT1JfXzogQWN0aXZhdG9yIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aXZhdG9yKGFjdGl2YXRvcjogQWN0aXZhdG9yIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGdsb2JhbFRoaXMuX19URU1QT1JBTF9BQ1RJVkFUT1JfXyA9IGFjdGl2YXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1heWJlR2V0QWN0aXZhdG9yKCk6IEFjdGl2YXRvciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnbG9iYWxUaGlzLl9fVEVNUE9SQUxfQUNUSVZBVE9SX187XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbldvcmtmbG93Q29udGV4dCh1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlOiBzdHJpbmcpOiBBY3RpdmF0b3Ige1xuICBjb25zdCBhY3RpdmF0b3IgPSBtYXliZUdldEFjdGl2YXRvcigpO1xuICBpZiAoYWN0aXZhdG9yID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcih1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlKTtcbiAgcmV0dXJuIGFjdGl2YXRvcjtcbn1cblxuLy8gVGhpcyBpcyByZWFsbHkganVzdCBhbiBhbGlhcyBmb3IgYGFzc2VydEluV29ya2Zsb3dDb250ZXh0YCB3aXRoIGEgZGVmYXVsdCBlcnJvciBtZXNzYWdlLFxuLy8gYmVjYXVzZSB0aGF0IG5hbWUgYmV0dGVyIGNvbnZleXMgdGhlIGludGVudCBpbiBzb21lIHZlcnkgY29tbW9uIHVzZSBjYXNlcy5cbmV4cG9ydCBjb25zdCBnZXRBY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dC5iaW5kKG51bGwsICdXb3JrZmxvdyB1bmluaXRpYWxpemVkJyk7XG4iLCIvKipcbiAqIE92ZXJyaWRlcyBzb21lIGdsb2JhbCBvYmplY3RzIHRvIG1ha2UgdGhlbSBkZXRlcm1pbmlzdGljLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgbXNUb1RzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IENhbmNlbGxhdGlvblNjb3BlIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgRGV0ZXJtaW5pc21WaW9sYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgU2RrRmxhZ3MgfSBmcm9tICcuL2ZsYWdzJztcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi93b3JrZmxvdyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXMgYXMgYW55O1xuY29uc3QgT3JpZ2luYWxEYXRlID0gZ2xvYmFsVGhpcy5EYXRlO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcnJpZGVHbG9iYWxzKCk6IHZvaWQge1xuICAvLyBNb2NrIGFueSB3ZWFrIHJlZmVyZW5jZSBiZWNhdXNlIEdDIGlzIG5vbi1kZXRlcm1pbmlzdGljIGFuZCB0aGUgZWZmZWN0IGlzIG9ic2VydmFibGUgZnJvbSB0aGUgV29ya2Zsb3cuXG4gIC8vIFdvcmtmbG93IGRldmVsb3BlciB3aWxsIGdldCBhIG1lYW5pbmdmdWwgZXhjZXB0aW9uIGlmIHRoZXkgdHJ5IHRvIHVzZSB0aGVzZS5cbiAgZ2xvYmFsLldlYWtSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IoJ1dlYWtSZWYgY2Fubm90IGJlIHVzZWQgaW4gV29ya2Zsb3dzIGJlY2F1c2UgdjggR0MgaXMgbm9uLWRldGVybWluaXN0aWMnKTtcbiAgfTtcbiAgZ2xvYmFsLkZpbmFsaXphdGlvblJlZ2lzdHJ5ID0gZnVuY3Rpb24gKCkge1xuICAgIHRocm93IG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKFxuICAgICAgJ0ZpbmFsaXphdGlvblJlZ2lzdHJ5IGNhbm5vdCBiZSB1c2VkIGluIFdvcmtmbG93cyBiZWNhdXNlIHY4IEdDIGlzIG5vbi1kZXRlcm1pbmlzdGljJ1xuICAgICk7XG4gIH07XG5cbiAgZ2xvYmFsLkRhdGUgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIG5ldyAoT3JpZ2luYWxEYXRlIGFzIGFueSkoLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgT3JpZ2luYWxEYXRlKGdldEFjdGl2YXRvcigpLm5vdyk7XG4gIH07XG5cbiAgZ2xvYmFsLkRhdGUubm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRBY3RpdmF0b3IoKS5ub3c7XG4gIH07XG5cbiAgZ2xvYmFsLkRhdGUucGFyc2UgPSBPcmlnaW5hbERhdGUucGFyc2UuYmluZChPcmlnaW5hbERhdGUpO1xuICBnbG9iYWwuRGF0ZS5VVEMgPSBPcmlnaW5hbERhdGUuVVRDLmJpbmQoT3JpZ2luYWxEYXRlKTtcblxuICBnbG9iYWwuRGF0ZS5wcm90b3R5cGUgPSBPcmlnaW5hbERhdGUucHJvdG90eXBlO1xuXG4gIGNvbnN0IHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMgPSBuZXcgTWFwPG51bWJlciwgQ2FuY2VsbGF0aW9uU2NvcGU+KCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtcyBzbGVlcCBkdXJhdGlvbiAtICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLiBJZiBnaXZlbiBhIG5lZ2F0aXZlIG51bWJlciwgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMS5cbiAgICovXG4gIGdsb2JhbC5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKGNiOiAoLi4uYXJnczogYW55W10pID0+IGFueSwgbXM6IG51bWJlciwgLi4uYXJnczogYW55W10pOiBudW1iZXIge1xuICAgIG1zID0gTWF0aC5tYXgoMSwgbXMpO1xuICAgIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICAgIGlmIChhY3RpdmF0b3IuaGFzRmxhZyhTZGtGbGFncy5Ob25DYW5jZWxsYWJsZVNjb3Blc0FyZVNoaWVsZGVkRnJvbVByb3BhZ2F0aW9uKSkge1xuICAgICAgLy8gQ2FwdHVyZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHRoYXQgc2xlZXAgd2lsbCBhbGxvY2F0ZVxuICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyO1xuICAgICAgY29uc3QgdGltZXJTY29wZSA9IG5ldyBDYW5jZWxsYXRpb25TY29wZSh7IGNhbmNlbGxhYmxlOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgc2xlZXBQcm9taXNlID0gdGltZXJTY29wZS5ydW4oKCkgPT4gc2xlZXAobXMpKTtcbiAgICAgIHNsZWVwUHJvbWlzZS50aGVuKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoc2VxKTtcbiAgICAgICAgICBjYiguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXRDYW5jZWxsYXRpb25TY29wZXMuZGVsZXRlKHNlcSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzbGVlcFByb21pc2UpO1xuICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5zZXQoc2VxLCB0aW1lclNjb3BlKTtcbiAgICAgIHJldHVybiBzZXE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrO1xuICAgICAgLy8gQ3JlYXRlIGEgUHJvbWlzZSBmb3IgQXN5bmNMb2NhbFN0b3JhZ2UgdG8gYmUgYWJsZSB0byB0cmFjayB0aGlzIGNvbXBsZXRpb24gdXNpbmcgcHJvbWlzZSBob29rcy5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgYWN0aXZhdG9yLmNvbXBsZXRpb25zLnRpbWVyLnNldChzZXEsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICAgIHN0YXJ0VGltZXI6IHtcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKG1zKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRoZW4oXG4gICAgICAgICgpID0+IGNiKC4uLmFyZ3MpLFxuICAgICAgICAoKSA9PiB1bmRlZmluZWQgLyogaWdub3JlIGNhbmNlbGxhdGlvbiAqL1xuICAgICAgKTtcbiAgICAgIHJldHVybiBzZXE7XG4gICAgfVxuICB9O1xuXG4gIGdsb2JhbC5jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoaGFuZGxlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICBjb25zdCB0aW1lclNjb3BlID0gdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5nZXQoaGFuZGxlKTtcbiAgICBpZiAodGltZXJTY29wZSkge1xuICAgICAgdGltZW91dENhbmNlbGxhdGlvblNjb3Blcy5kZWxldGUoaGFuZGxlKTtcbiAgICAgIHRpbWVyU2NvcGUuY2FuY2VsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGl2YXRvci5uZXh0U2Vxcy50aW1lcisrOyAvLyBTaG91bGRuJ3QgaW5jcmVhc2Ugc2VxIG51bWJlciwgYnV0IHRoYXQncyB0aGUgbGVnYWN5IGJlaGF2aW9yXG4gICAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuZGVsZXRlKGhhbmRsZSk7XG4gICAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgICBjYW5jZWxUaW1lcjoge1xuICAgICAgICAgIHNlcTogaGFuZGxlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGFjdGl2YXRvci5yYW5kb20gaXMgbXV0YWJsZSwgZG9uJ3QgaGFyZGNvZGUgaXRzIHJlZmVyZW5jZVxuICBNYXRoLnJhbmRvbSA9ICgpID0+IGdldEFjdGl2YXRvcigpLnJhbmRvbSgpO1xufVxuIiwiLyoqXG4gKiBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgdG9vbHMgcmVxdWlyZWQgZm9yIGF1dGhvcmluZyB3b3JrZmxvd3MuXG4gKlxuICogIyMgVXNhZ2VcbiAqIFNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby90eXBlc2NyaXB0L2hlbGxvLXdvcmxkI3dvcmtmbG93cyB8IHR1dG9yaWFsfSBmb3Igd3JpdGluZyB5b3VyIGZpcnN0IHdvcmtmbG93LlxuICpcbiAqICMjIyBUaW1lcnNcbiAqXG4gKiBUaGUgcmVjb21tZW5kZWQgd2F5IG9mIHNjaGVkdWxpbmcgdGltZXJzIGlzIGJ5IHVzaW5nIHRoZSB7QGxpbmsgc2xlZXB9IGZ1bmN0aW9uLiBXZSd2ZSByZXBsYWNlZCBgc2V0VGltZW91dGAgYW5kXG4gKiBgY2xlYXJUaW1lb3V0YCB3aXRoIGRldGVybWluaXN0aWMgdmVyc2lvbnMgc28gdGhlc2UgYXJlIGFsc28gdXNhYmxlIGJ1dCBoYXZlIGEgbGltaXRhdGlvbiB0aGF0IHRoZXkgZG9uJ3QgcGxheSB3ZWxsXG4gKiB3aXRoIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC9jYW5jZWxsYXRpb24tc2NvcGVzIHwgY2FuY2VsbGF0aW9uIHNjb3Blc30uXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHNsZWVwIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcGVyKG1zID0gMTAwKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGF3YWl0IHNsZWVwKG1zKTtcbiAqICAgY29uc29sZS5sb2coJ3NsZXB0Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyMgQWN0aXZpdGllc1xuICpcbiAqIFRvIHNjaGVkdWxlIEFjdGl2aXRpZXMsIHVzZSB7QGxpbmsgcHJveHlBY3Rpdml0aWVzfSB0byBvYnRhaW4gYW4gQWN0aXZpdHkgZnVuY3Rpb24gYW5kIGNhbGwuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHByb3h5QWN0aXZpdGllcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB0eXBlICogYXMgYWN0aXZpdGllcyBmcm9tICcuL2FjdGl2aXRpZXMnO1xuICpcbiAqIGNvbnN0IHsgc2VuZEVtYWlsIH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzEgbWludXRlJyxcbiAqIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FtcGxlV29ya2Zsb3coKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgc2VuZEVtYWlsKFwidG9AZXhhbXBsZS5jb21cIixcIkhlbGxvLCBUZW1wb3JhbCFcIik7XG59XG5cbiAqIGBgYFxuICogXG4gKiAjIyMgVXBkYXRlcywgU2lnbmFscyBhbmQgUXVlcmllc1xuICpcbiAqIFVzZSB7QGxpbmsgc2V0SGFuZGxlcn0gdG8gc2V0IGhhbmRsZXJzIGZvciBVcGRhdGVzLCBTaWduYWxzLCBhbmQgUXVlcmllcy5cbiAqXG4gKiBVcGRhdGUgYW5kIFNpZ25hbCBoYW5kbGVycyBjYW4gYmUgZWl0aGVyIGFzeW5jIG9yIG5vbi1hc3luYyBmdW5jdGlvbnMuIFVwZGF0ZSBoYW5kbGVycyBtYXkgcmV0dXJuIGEgdmFsdWUsIGJ1dCBzaWduYWxcbiAqIGhhbmRsZXJzIG1heSBub3QgKHJldHVybiBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gKS4gWW91IG1heSB1c2UgQWN0aXZpdGllcywgVGltZXJzLCBjaGlsZCBXb3JrZmxvd3MsIGV0YyBpbiBVcGRhdGVcbiAqIGFuZCBTaWduYWwgaGFuZGxlcnMsIGJ1dCB0aGlzIHNob3VsZCBiZSBkb25lIGNhdXRpb3VzbHk6IGZvciBleGFtcGxlLCBub3RlIHRoYXQgaWYgeW91IGF3YWl0IGFzeW5jIG9wZXJhdGlvbnMgc3VjaCBhc1xuICogdGhlc2UgaW4gYW4gVXBkYXRlIG9yIFNpZ25hbCBoYW5kbGVyLCB0aGVuIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIHdvcmtmbG93IGRvZXMgbm90IGNvbXBsZXRlIGZpcnN0LlxuICpcbiAqIFF1ZXJ5IGhhbmRsZXJzIG1heSAqKm5vdCoqIGJlIGFzeW5jIGZ1bmN0aW9ucywgYW5kIG1heSAqKm5vdCoqIG11dGF0ZSBhbnkgdmFyaWFibGVzIG9yIHVzZSBBY3Rpdml0aWVzLCBUaW1lcnMsXG4gKiBjaGlsZCBXb3JrZmxvd3MsIGV0Yy5cbiAqXG4gKiAjIyMjIEltcGxlbWVudGF0aW9uXG4gKlxuICogYGBgdHNcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRTaWduYWwgPSB3Zi5kZWZpbmVTaWduYWw8W251bWJlcl0+KCdpbmNyZW1lbnQnKTtcbiAqIGV4cG9ydCBjb25zdCBnZXRWYWx1ZVF1ZXJ5ID0gd2YuZGVmaW5lUXVlcnk8bnVtYmVyPignZ2V0VmFsdWUnKTtcbiAqIGV4cG9ydCBjb25zdCBpbmNyZW1lbnRBbmRHZXRWYWx1ZVVwZGF0ZSA9IHdmLmRlZmluZVVwZGF0ZTxudW1iZXIsIFtudW1iZXJdPignaW5jcmVtZW50QW5kR2V0VmFsdWUnKTtcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnRlcldvcmtmbG93KGluaXRpYWxWYWx1ZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gKiAgIGxldCBjb3VudCA9IGluaXRpYWxWYWx1ZTtcbiAqICAgd2Yuc2V0SGFuZGxlcihpbmNyZW1lbnRTaWduYWwsIChhcmc6IG51bWJlcikgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgfSk7XG4gKiAgIHdmLnNldEhhbmRsZXIoZ2V0VmFsdWVRdWVyeSwgKCkgPT4gY291bnQpO1xuICogICB3Zi5zZXRIYW5kbGVyKGluY3JlbWVudEFuZEdldFZhbHVlVXBkYXRlLCAoYXJnOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICogICAgIGNvdW50ICs9IGFyZztcbiAqICAgICByZXR1cm4gY291bnQ7XG4gKiAgIH0pO1xuICogICBhd2FpdCB3Zi5jb25kaXRpb24oKCkgPT4gZmFsc2UpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIE1vcmVcbiAqXG4gKiAtIFtEZXRlcm1pbmlzdGljIGJ1aWx0LWluc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvZGV0ZXJtaW5pc20jc291cmNlcy1vZi1ub24tZGV0ZXJtaW5pc20pXG4gKiAtIFtDYW5jZWxsYXRpb24gYW5kIHNjb3Blc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvY2FuY2VsbGF0aW9uLXNjb3BlcylcbiAqICAgLSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9XG4gKiAgIC0ge0BsaW5rIFRyaWdnZXJ9XG4gKiAtIFtTaW5rc10oaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2FwcGxpY2F0aW9uLWRldmVsb3BtZW50L29ic2VydmFiaWxpdHkvP2xhbmc9dHMjbG9nZ2luZylcbiAqICAgLSB7QGxpbmsgU2lua3N9XG4gKlxuICogQG1vZHVsZVxuICovXG5cbmV4cG9ydCB7XG4gIEFjdGl2aXR5Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQWN0aXZpdHlGYWlsdXJlLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgQ2FuY2VsbGVkRmFpbHVyZSxcbiAgQ2hpbGRXb3JrZmxvd0ZhaWx1cmUsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBQYXlsb2FkQ29udmVydGVyLFxuICBSZXRyeVBvbGljeSxcbiAgcm9vdENhdXNlLFxuICBTZWFyY2hBdHRyaWJ1dGVzLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gIFNlcnZlckZhaWx1cmUsXG4gIFRlbXBvcmFsRmFpbHVyZSxcbiAgVGVybWluYXRlZEZhaWx1cmUsXG4gIFRpbWVvdXRGYWlsdXJlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9lcnJvcnMnO1xuZXhwb3J0IHtcbiAgQWN0aXZpdHlGdW5jdGlvbixcbiAgQWN0aXZpdHlJbnRlcmZhY2UsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgUGF5bG9hZCxcbiAgUXVlcnlEZWZpbml0aW9uLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UXVlcnlUeXBlLFxuICBXb3JrZmxvd1Jlc3VsdFR5cGUsXG4gIFdvcmtmbG93UmV0dXJuVHlwZSxcbiAgV29ya2Zsb3dTaWduYWxUeXBlLFxufSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0ICogZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi93b3JrZmxvdy1vcHRpb25zJztcbmV4cG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlLCBDYW5jZWxsYXRpb25TY29wZSwgQ2FuY2VsbGF0aW9uU2NvcGVPcHRpb25zIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuZXhwb3J0IHtcbiAgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIENoaWxkV29ya2Zsb3dPcHRpb25zLFxuICBDb250aW51ZUFzTmV3LFxuICBDb250aW51ZUFzTmV3T3B0aW9ucyxcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBTdGFja1RyYWNlRmlsZUxvY2F0aW9uLFxuICBTdGFja1RyYWNlRmlsZVNsaWNlLFxuICBQYXJlbnRDbG9zZVBvbGljeSxcbiAgUGFyZW50V29ya2Zsb3dJbmZvLFxuICBSb290V29ya2Zsb3dJbmZvLFxuICBTdGFja1RyYWNlU0RLSW5mbyxcbiAgU3RhY2tUcmFjZSxcbiAgVW5zYWZlV29ya2Zsb3dJbmZvLFxuICBXb3JrZmxvd0luZm8sXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgeyBwcm94eVNpbmtzLCBTaW5rLCBTaW5rQ2FsbCwgU2lua0Z1bmN0aW9uLCBTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuZXhwb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2dzJztcbmV4cG9ydCB7IFRyaWdnZXIgfSBmcm9tICcuL3RyaWdnZXInO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZmxvdyc7XG5leHBvcnQgeyBDaGlsZFdvcmtmbG93SGFuZGxlLCBFeHRlcm5hbFdvcmtmbG93SGFuZGxlIH0gZnJvbSAnLi93b3JrZmxvdy1oYW5kbGUnO1xuZXhwb3J0IHsgbWV0cmljTWV0ZXIgfSBmcm9tICcuL21ldHJpY3MnO1xuZXhwb3J0IHtcbiAgY3JlYXRlTmV4dXNTZXJ2aWNlQ2xpZW50LFxuICBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zLFxuICBOZXh1c1NlcnZpY2VDbGllbnQsXG4gIE5leHVzT3BlcmF0aW9uSGFuZGxlLFxuICBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG59IGZyb20gJy4vbmV4dXMnO1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIERlcHJlY2F0ZWQgQVBJc1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIExvZ2dlclNpbmtzIGRpcmVjdGx5LiBUbyBsb2cgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2UgdGhlIGBsb2dgIG9iamVjdFxuICAgKiAgICAgICAgICAgICBleHBvcnRlZCBieSB0aGUgYEB0ZW1wb3JhbGlvL3dvcmtmbG93YCBwYWNrYWdlLiBUbyBjYXB0dXJlIGxvZyBtZXNzYWdlcyBlbWl0dGVkXG4gICAqICAgICAgICAgICAgIGJ5IFdvcmtmbG93IGNvZGUsIHNldCB0aGUge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBwcm9wZXJ0eS5cbiAgICovXG5cbiAgTG9nZ2VyU2lua3NEZXByZWNhdGVkIGFzIExvZ2dlclNpbmtzLFxufSBmcm9tICcuL2xvZ3MnO1xuIiwiLyoqXG4gKiBUeXBlIGRlZmluaXRpb25zIGZvciBXb3JrZmxvdyBpbnRlcmNlcHRvcnMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQWN0aXZpdHlPcHRpb25zLFxuICBEdXJhdGlvbixcbiAgTG9jYWxBY3Rpdml0eU9wdGlvbnMsXG4gIE1ldHJpY1RhZ3MsXG4gIFRpbWVzdGFtcCxcbiAgV29ya2Zsb3dFeGVjdXRpb24sXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBIZWFkZXJzLCBOZXh0IH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgY29yZXNkayB9IGZyb20gJ0B0ZW1wb3JhbGlvL3Byb3RvJztcbmltcG9ydCB0eXBlIHsgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMsIENvbnRpbnVlQXNOZXdPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB0eXBlIHsgTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlIH0gZnJvbSAnLi9uZXh1cyc7XG5cbmV4cG9ydCB7IE5leHQsIEhlYWRlcnMgfTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgaW5zdGFudGlhdGVzIHtAbGluayBXb3JrZmxvd0ludGVyY2VwdG9yc30uXG4gKlxuICogV29ya2Zsb3cgaW50ZXJjZXB0b3IgbW9kdWxlcyBzaG91bGQgZXhwb3J0IGFuIGBpbnRlcmNlcHRvcnNgIGZ1bmN0aW9uIG9mIHRoaXMgdHlwZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBleHBvcnQgZnVuY3Rpb24gaW50ZXJjZXB0b3JzKCk6IFdvcmtmbG93SW50ZXJjZXB0b3JzIHtcbiAqICAgcmV0dXJuIHtcbiAqICAgICBpbmJvdW5kOiBbXSwgICAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2YgaW5ib3VuZCBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgICBvdXRib3VuZDogW10sICAvLyBQb3B1bGF0ZSB3aXRoIGxpc3Qgb2Ygb3V0Ym91bmQgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKiAgICAgaW50ZXJuYWxzOiBbXSwgLy8gUG9wdWxhdGUgd2l0aCBsaXN0IG9mIGludGVybmFscyBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbnNcbiAqICAgfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgPSAoKSA9PiBXb3JrZmxvd0ludGVyY2VwdG9ycztcblxuLyoqXG4gKiBBIG1hcHBpbmcgZnJvbSBpbnRlcmNlcHRvciB0eXBlIHRvIGFuIG9wdGlvbmFsIGxpc3Qgb2YgaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbnRlcmNlcHRvcnMge1xuICBpbmJvdW5kPzogV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvcltdO1xuICBvdXRib3VuZD86IFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yW107XG4gIGludGVybmFscz86IFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3JbXTtcbn1cblxuLy8gV29ya2Zsb3cgSW5ib3VuZCBDYWxscyBJbnRlcmNlcHRvcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogSW1wbGVtZW50IGFueSBvZiB0aGVzZSBtZXRob2RzIHRvIGludGVyY2VwdCBXb3JrZmxvdyBpbmJvdW5kIGNhbGxzIGxpa2UgZXhlY3V0aW9uLCBhbmQgc2lnbmFsIGFuZCBxdWVyeSBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IGV4ZWN1dGUgbWV0aG9kIGlzIGNhbGxlZFxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgV29ya2Zsb3cgZXhlY3V0aW9uXG4gICAqL1xuICBleGVjdXRlPzogKGlucHV0OiBXb3JrZmxvd0V4ZWN1dGVJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnZXhlY3V0ZSc+KSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBVcGRhdGUgaGFuZGxlciBpcyBjYWxsZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIFVwZGF0ZVxuICAgKi9cbiAgaGFuZGxlVXBkYXRlPzogKGlucHV0OiBVcGRhdGVJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnaGFuZGxlVXBkYXRlJz4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHVwZGF0ZSB2YWxpZGF0b3IgY2FsbGVkXG4gICAqL1xuICB2YWxpZGF0ZVVwZGF0ZT86IChpbnB1dDogVXBkYXRlSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3ZhbGlkYXRlVXBkYXRlJz4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHNpZ25hbCBpcyBkZWxpdmVyZWQgdG8gYSBXb3JrZmxvdyBleGVjdXRpb25cbiAgICovXG4gIGhhbmRsZVNpZ25hbD86IChpbnB1dDogU2lnbmFsSW5wdXQsIG5leHQ6IE5leHQ8V29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2hhbmRsZVNpZ25hbCc+KSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIFdvcmtmbG93IGlzIHF1ZXJpZWRcbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIHF1ZXJ5XG4gICAqL1xuICBoYW5kbGVRdWVyeT86IChpbnB1dDogUXVlcnlJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLCAnaGFuZGxlUXVlcnknPikgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW5ib3VuZENhbGxzSW50ZXJjZXB0b3IuZXhlY3V0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dFeGVjdXRlSW5wdXQge1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVVwZGF0ZX0gYW5kIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLnZhbGlkYXRlVXBkYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbnB1dCB7XG4gIHJlYWRvbmx5IHVwZGF0ZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbmJvdW5kQ2FsbHNJbnRlcmNlcHRvci5oYW5kbGVTaWduYWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbElucHV0IHtcbiAgcmVhZG9ubHkgc2lnbmFsTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd0luYm91bmRDYWxsc0ludGVyY2VwdG9yLmhhbmRsZVF1ZXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUlucHV0IHtcbiAgcmVhZG9ubHkgcXVlcnlJZDogc3RyaW5nO1xuICByZWFkb25seSBxdWVyeU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xufVxuXG4vLyBXb3JrZmxvdyBPdXRib3VuZCBDYWxscyBJbnRlcmNlcHRvcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogSW1wbGVtZW50IGFueSBvZiB0aGVzZSBtZXRob2RzIHRvIGludGVyY2VwdCBXb3JrZmxvdyBjb2RlIGNhbGxzIHRvIHRoZSBUZW1wb3JhbCBBUElzLCBsaWtlIHNjaGVkdWxpbmcgYW4gYWN0aXZpdHlcbiAqIGFuZCBzdGFydGluZyBhIHRpbWVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yIHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IHN0YXJ0cyBhIHRpbWVyLlxuICAgKi9cbiAgc3RhcnRUaW1lcj86IChpbnB1dDogVGltZXJJbnB1dCwgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3N0YXJ0VGltZXInPikgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc2NoZWR1bGVzIGFuIEFjdGl2aXR5LlxuICAgKlxuICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgYWN0aXZpdHkgZXhlY3V0aW9uXG4gICAqL1xuICBzY2hlZHVsZUFjdGl2aXR5PzogKFxuICAgIGlucHV0OiBBY3Rpdml0eUlucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzY2hlZHVsZUFjdGl2aXR5Jz5cbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzY2hlZHVsZXMgYSBsb2NhbCBBY3Rpdml0eS5cbiAgICpcbiAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGFjdGl2aXR5IGV4ZWN1dGlvblxuICAgKi9cbiAgc2NoZWR1bGVMb2NhbEFjdGl2aXR5PzogKFxuICAgIGlucHV0OiBMb2NhbEFjdGl2aXR5SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ3NjaGVkdWxlTG9jYWxBY3Rpdml0eSc+XG4gICkgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgTmV4dXMgT3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIHN0YXJ0TmV4dXNPcGVyYXRpb24/OiAoXG4gICAgaW5wdXQ6IFN0YXJ0TmV4dXNPcGVyYXRpb25JbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc3RhcnROZXh1c09wZXJhdGlvbic+XG4gICkgPT4gUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gV29ya2Zsb3cgc3RhcnRzIGEgY2hpbGQgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBUaGUgaW50ZXJjZXB0b3IgZnVuY3Rpb24gcmV0dXJucyAyIHByb21pc2VzOlxuICAgKiAtIFRoZSBmaXJzdCByZXNvbHZlcyB3aXRoIHRoZSBgcnVuSWRgIHdoZW4gdGhlIGNoaWxkIHdvcmtmbG93IGhhcyBzdGFydGVkIG9yIHJlamVjdHMgaWYgZmFpbGVkIHRvIHN0YXJ0LlxuICAgKiAtIFRoZSBzZWNvbmQgcmVzb2x2ZXMgd2l0aCB0aGUgd29ya2Zsb3cgcmVzdWx0IHdoZW4gdGhlIGNoaWxkIHdvcmtmbG93IGNvbXBsZXRlcyBvciByZWplY3RzIG9uIGZhaWx1cmUuXG4gICAqL1xuICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24/OiAoXG4gICAgaW5wdXQ6IFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb24nPlxuICApID0+IFByb21pc2U8W1Byb21pc2U8c3RyaW5nPiwgUHJvbWlzZTx1bmtub3duPl0+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBXb3JrZmxvdyBzaWduYWxzIGEgY2hpbGQgb3IgZXh0ZXJuYWwgV29ya2Zsb3cuXG4gICAqL1xuICBzaWduYWxXb3JrZmxvdz86IChcbiAgICBpbnB1dDogU2lnbmFsV29ya2Zsb3dJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnc2lnbmFsV29ya2Zsb3cnPlxuICApID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFdvcmtmbG93IGNhbGxzIGNvbnRpbnVlQXNOZXcuXG4gICAqL1xuICBjb250aW51ZUFzTmV3PzogKFxuICAgIGlucHV0OiBDb250aW51ZUFzTmV3SW5wdXQsXG4gICAgbmV4dDogTmV4dDxXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvciwgJ2NvbnRpbnVlQXNOZXcnPlxuICApID0+IFByb21pc2U8bmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBgd29ya2Zsb3cubG9nYCBtZXRob2RzLlxuICAgKlxuICAgKiBUaGUgYXR0cmlidXRlcyByZXR1cm5lZCBpbiB0aGlzIGNhbGwgYXJlIGF0dGFjaGVkIHRvIGV2ZXJ5IGxvZyBtZXNzYWdlLlxuICAgKi9cbiAgZ2V0TG9nQXR0cmlidXRlcz86IChcbiAgICBpbnB1dDogR2V0TG9nQXR0cmlidXRlc0lucHV0LFxuICAgIG5leHQ6IE5leHQ8V29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IsICdnZXRMb2dBdHRyaWJ1dGVzJz5cbiAgKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgZXZlcnkgdGltZSBhIG1ldHJpYyBpcyBlbWl0dGVkIGZyb20gYSBXb3JrZmxvdyBtZXRyaWMgKGllLiBhIG1ldHJpYyBjcmVhdGVkXG4gICAqIGZyb20ge0BsaW5rIHdvcmtmbG93Lm1ldHJpY01ldGVyfSkuXG4gICAqXG4gICAqIFRhZ3MgcmV0dXJuZWQgYnkgdGhpcyBob29rIGFyZSBfcHJlcGVuZGVkXyB0byB0YWdzIGRlZmluZWQgYXQgdGhlIG1ldHJpYyBsZXZlbCBhbmQgdGFnc1xuICAgKiBkZWZpbmVkIG9uIHRoZSBlbWl0dGVyIGZ1bmN0aW9uIGl0c2VsZi5cbiAgICovXG4gIGdldE1ldHJpY1RhZ3M/OiAoXG4gICAgaW5wdXQ6IEdldE1ldHJpY1RhZ3NJbnB1dCxcbiAgICBuZXh0OiBOZXh0PFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLCAnZ2V0TWV0cmljVGFncyc+XG4gICkgPT4gTWV0cmljVGFncztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnN0YXJ0VGltZXJ9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZXJJbnB1dCB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG9wdGlvbnM/OiBUaW1lck9wdGlvbnM7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSB0aW1lciAoaS5lLiBzbGVlcClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lck9wdGlvbnMge1xuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlIGxpbmUgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCdzIHB1cnBvc2VcbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnNjaGVkdWxlQWN0aXZpdHl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2aXR5SW5wdXQge1xuICByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnM7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3Iuc2NoZWR1bGVMb2NhbEFjdGl2aXR5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbEFjdGl2aXR5SW5wdXQge1xuICByZWFkb25seSBhY3Rpdml0eVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucztcbiAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IG9yaWdpbmFsU2NoZWR1bGVUaW1lPzogVGltZXN0YW1wO1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydE5leHVzT3BlcmF0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydE5leHVzT3BlcmF0aW9uSW5wdXQge1xuICByZWFkb25seSBpbnB1dDogdW5rbm93bjtcbiAgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuICByZWFkb25seSBvcHRpb25zOiBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucztcbiAgcmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcTogbnVtYmVyO1xuICByZWFkb25seSBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBlbmQgdG8gZW5kIHRpbWVvdXQgZm9yIHRoZSBOZXh1cyBPcGVyYXRpb24uXG4gICAqXG4gICAqIE9wdGlvbmFsOiBkZWZhdWx0cyB0byB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBUZW1wb3JhbCBzZXJ2ZXIuXG4gICAqL1xuICByZWFkb25seSBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbWF5IHdhaXQgYmVmb3JlIGl0IGJlZ2lucyBleGVjdXRpbmcuIElmIHRoZSBvcGVyYXRpb24gaGFzIG5vdCBzdGFydGVkXG4gICAqIHdpdGhpbiB0aGlzIHdpbmRvdywgYSB0aW1lb3V0IGVycm9yIHdpdGggdHlwZSBTQ0hFRFVMRV9UT19TVEFSVCBpcyByYWlzZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsOiBkZWZhdWx0cyB0byBubyB0aW1lb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGVUb1N0YXJ0VGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyBhbiBhc3luYyBvcGVyYXRpb24gbWF5IHRha2UgdG8gY29tcGxldGUgYWZ0ZXIgaXQgaGFzIHN0YXJ0ZWQuIElmIHRoZSBvcGVyYXRpb24gZG9lc1xuICAgKiBub3QgY29tcGxldGUgd2l0aGluIHRoaXMgd2luZG93LCBhIHRpbWVvdXQgZXJyb3Igd2l0aCB0eXBlIFNUQVJUX1RPX0NMT1NFIGlzIHJhaXNlZC5cbiAgICpcbiAgICogT3B0aW9uYWw6IGRlZmF1bHRzIHRvIG5vIHRpbWVvdXQuXG4gICAqL1xuICByZWFkb25seSBzdGFydFRvQ2xvc2VUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXM6XG4gICAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE5leHVzIE9wZXJhdGlvblxuICAgKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBPcGVyYXRpb24ncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgV29ya2Zsb3dcbiAgICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSBvcGVyYXRpb24ncyByZXN1bHQgcHJvbWlzZSBmYWlsIHdpdGggYSBgTmV4dXNPcGVyYXRpb25GYWlsdXJlYCxcbiAgICogICB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgdG8gY2FuY2VsbGF0aW9uIG9yaWdpbmF0aW5nIGZyb20gYW4gZXh0ZXJuYWwgcmVxdWVzdCBmb3IgdGhlXG4gICAqIFdvcmtmbG93IGl0c2VsZiwgb3IgZnJvbSBpbnRlcm5hbCBjYW5jZWxsYXRpb24gb2YgdGhlIGBDYW5jZWxsYXRpb25TY29wZWAgaW4gd2hpY2ggdGhlXG4gICAqIE9wZXJhdGlvbiBjYWxsIHdhcyBtYWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURcbiAgICovXG4gIC8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgcmVhZG9ubHkgY2FuY2VsbGF0aW9uVHlwZT86IE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZTtcblxuICAvKipcbiAgICogQSBmaXhlZCwgc2luZ2xlLWxpbmUgc3VtbWFyeSBmb3IgdGhpcyBOZXh1cyBPcGVyYXRpb24gdGhhdCBtYXkgYXBwZWFyIGluIHRoZSBVSS9DTEkuXG4gICAqIFRoaXMgY2FuIGJlIGluIHNpbmdsZS1saW5lIFRlbXBvcmFsIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBVc2VyIG1ldGFkYXRhIGlzIGEgbmV3IEFQSSBhbmQgc3VzY2VwdGlibGUgdG8gY2hhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRwdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydE5leHVzT3BlcmF0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0IHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiBmb3IgdGhlIE5leHVzIE9wZXJhdGlvbi5cbiAgICpcbiAgICogVW5kZWZpbmVkIGlmIHRoZSBOZXh1cyBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHksIGluIHdoaWNoIGNhc2UgdGhlIHtAbGluayByZXN1bHR9XG4gICAqIHdpbGwgYmUgaW1tZWRpYXRlbHkgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdoZW4gdGhlIE5leHVzIE9wZXJhdGlvbiBjb21wbGV0ZXMsIGVpdGhlciB3aXRoIHRoZSByZXN1bHQgb2YgdGhlXG4gICAqIE9wZXJhdGlvbiBpZiBpdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvciBhIGZhaWx1cmUgaWYgdGhlIE5leHVzIE9wZXJhdGlvbiBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ6IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5zdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbklucHV0IHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dUeXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9wdGlvbnM6IENoaWxkV29ya2Zsb3dPcHRpb25zV2l0aERlZmF1bHRzO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBzZXE6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yLnNpZ25hbFdvcmtmbG93fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxXb3JrZmxvd0lucHV0IHtcbiAgcmVhZG9ubHkgc2VxOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNpZ25hbE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSB0YXJnZXQ6XG4gICAgfCB7XG4gICAgICAgIHJlYWRvbmx5IHR5cGU6ICdleHRlcm5hbCc7XG4gICAgICAgIHJlYWRvbmx5IHdvcmtmbG93RXhlY3V0aW9uOiBXb3JrZmxvd0V4ZWN1dGlvbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgcmVhZG9ubHkgdHlwZTogJ2NoaWxkJztcbiAgICAgICAgcmVhZG9ubHkgY2hpbGRXb3JrZmxvd0lkOiBzdHJpbmc7XG4gICAgICB9O1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuY29udGludWVBc05ld30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld0lucHV0IHtcbiAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICByZWFkb25seSBoZWFkZXJzOiBIZWFkZXJzO1xuICByZWFkb25seSBvcHRpb25zOiBDb250aW51ZUFzTmV3SW5wdXRPcHRpb25zO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dPdXRib3VuZENhbGxzSW50ZXJjZXB0b3IuY29udGludWVBc05ld30uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRpbnVlQXNOZXdJbnB1dE9wdGlvbnMgPSBDb250aW51ZUFzTmV3T3B0aW9ucyAmIFJlcXVpcmVkPFBpY2s8Q29udGludWVBc05ld09wdGlvbnMsICd3b3JrZmxvd1R5cGUnPj47XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5nZXRMb2dBdHRyaWJ1dGVzfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0TG9nQXR0cmlidXRlc0lucHV0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogSW5wdXQgZm9yIHtAbGluayBXb3JrZmxvd091dGJvdW5kQ2FsbHNJbnRlcmNlcHRvci5nZXRNZXRyaWNUYWdzfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0TWV0cmljVGFnc0lucHV0ID0gTWV0cmljVGFncztcblxuLy8gV29ya2Zsb3cgSW50ZXJuYWxzIEludGVyY2VwdG9ycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogSW50ZXJjZXB0b3IgZm9yIHRoZSBpbnRlcm5hbHMgb2YgdGhlIFdvcmtmbG93IHJ1bnRpbWUuXG4gKlxuICogVXNlIHRvIG1hbmlwdWxhdGUgb3IgdHJhY2UgV29ya2Zsb3cgYWN0aXZhdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGlzIEFQSSBpcyBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgV29ya2Zsb3cgcnVudGltZSBydW5zIGEgV29ya2Zsb3dBY3RpdmF0aW9uSm9iLlxuICAgKi9cbiAgYWN0aXZhdGU/KGlucHV0OiBBY3RpdmF0ZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdhY3RpdmF0ZSc+KTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIGFsbCBgV29ya2Zsb3dBY3RpdmF0aW9uSm9iYHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBmb3IgYW4gYWN0aXZhdGlvbi5cbiAgICpcbiAgICogQ2FuIG1hbmlwdWxhdGUgdGhlIGNvbW1hbmRzIGdlbmVyYXRlZCBieSB0aGUgV29ya2Zsb3dcbiAgICovXG4gIGNvbmNsdWRlQWN0aXZhdGlvbj8oaW5wdXQ6IENvbmNsdWRlQWN0aXZhdGlvbklucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdjb25jbHVkZUFjdGl2YXRpb24nPik6IENvbmNsdWRlQWN0aXZhdGlvbk91dHB1dDtcblxuICAvKipcbiAgICogQ2FsbGVkIGJlZm9yZSBkaXNwb3NpbmcgdGhlIFdvcmtmbG93IGlzb2xhdGUgY29udGV4dC5cbiAgICpcbiAgICogSW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAuXG4gICAqL1xuICBkaXNwb3NlPyhpbnB1dDogRGlzcG9zZUlucHV0LCBuZXh0OiBOZXh0PHRoaXMsICdkaXNwb3NlJz4pOiB2b2lkO1xufVxuXG4vKipcbiAqIElucHV0IGZvciB7QGxpbmsgV29ya2Zsb3dJbnRlcm5hbHNJbnRlcmNlcHRvci5hY3RpdmF0ZX1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmF0ZUlucHV0IHtcbiAgcmVhZG9ubHkgYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb247XG4gIHJlYWRvbmx5IGJhdGNoSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuZGlzcG9zZX1cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVxuZXhwb3J0IGludGVyZmFjZSBEaXNwb3NlSW5wdXQge31cblxuLyoqXG4gKiBJbnB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuY29uY2x1ZGVBY3RpdmF0aW9ufVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmNsdWRlQWN0aXZhdGlvbklucHV0IHtcbiAgcmVhZG9ubHkgY29tbWFuZHM6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZFtdO1xufVxuXG4vKipcbiAqIE91dHB1dCBmb3Ige0BsaW5rIFdvcmtmbG93SW50ZXJuYWxzSW50ZXJjZXB0b3IuY29uY2x1ZGVBY3RpdmF0aW9ufVxuICovXG5leHBvcnQgdHlwZSBDb25jbHVkZUFjdGl2YXRpb25PdXRwdXQgPSBDb25jbHVkZUFjdGl2YXRpb25JbnB1dDtcbiIsImltcG9ydCB0eXBlIHsgUmF3U291cmNlTWFwIH0gZnJvbSAnc291cmNlLW1hcCc7XG5pbXBvcnQgdHlwZSB7XG4gIFJldHJ5UG9saWN5LFxuICBDb21tb25Xb3JrZmxvd09wdGlvbnMsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBTZWFyY2hBdHRyaWJ1dGVzLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVcGRhdGVEZWZpbml0aW9uLFxuICBRdWVyeURlZmluaXRpb24sXG4gIER1cmF0aW9uLFxuICBWZXJzaW9uaW5nSW50ZW50LFxuICBUeXBlZFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVBhaXIsXG4gIFByaW9yaXR5LFxuICBXb3JrZXJEZXBsb3ltZW50VmVyc2lvbixcbiAgVmVyc2lvbmluZ0JlaGF2aW9yLFxuICBJbml0aWFsVmVyc2lvbmluZ0JlaGF2aW9yLFxuICBTdWdnZXN0Q29udGludWVBc05ld1JlYXNvbixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IFN5bWJvbEJhc2VkSW5zdGFuY2VPZkVycm9yIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90eXBlLWhlbHBlcnMnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuXG4vKipcbiAqIFdvcmtmbG93IEV4ZWN1dGlvbiBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93SW5mbyB7XG4gIC8qKlxuICAgKiBJRCBvZiB0aGUgV29ya2Zsb3csIHRoaXMgY2FuIGJlIHNldCBieSB0aGUgY2xpZW50IGR1cmluZyBXb3JrZmxvdyBjcmVhdGlvbi5cbiAgICogQSBzaW5nbGUgV29ya2Zsb3cgbWF5IHJ1biBtdWx0aXBsZSB0aW1lcyBlLmcuIHdoZW4gc2NoZWR1bGVkIHdpdGggY3Jvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93SWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSUQgb2YgYSBzaW5nbGUgV29ya2Zsb3cgcnVuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXb3JrZmxvdyBmdW5jdGlvbidzIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93VHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRleGVkIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHRoZSBXb3JrZmxvdyBFeGVjdXRpb25cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBtYXkgY2hhbmdlIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHR5cGVkU2VhcmNoQXR0cmlidXRlc30gaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaEF0dHJpYnV0ZXM6IFNlYXJjaEF0dHJpYnV0ZXM7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcblxuICAvKipcbiAgICogSW5kZXhlZCBpbmZvcm1hdGlvbiBhdHRhY2hlZCB0byB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uLCBleHBvc2VkIHRocm91Z2ggYW4gaW50ZXJmYWNlLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqL1xuICByZWFkb25seSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcblxuICAvKipcbiAgICogTm9uLWluZGV4ZWQgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWVtbz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaW5mbyAocHJlc2VudCBpZiB0aGlzIGlzIGEgQ2hpbGQgV29ya2Zsb3cpXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBQYXJlbnRXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFRoZSByb290IHdvcmtmbG93IGV4ZWN1dGlvbiwgZGVmaW5lZCBhcyBmb2xsb3dzOlxuICAgKiAxLiBBIHdvcmtmbG93IHdpdGhvdXQgYSBwYXJlbnQgd29ya2Zsb3cgaXMgaXRzIG93biByb290IHdvcmtmbG93LlxuICAgKiAyLiBBIHdvcmtmbG93IHdpdGggYSBwYXJlbnQgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXNcbiAgICogaXRzIHBhcmVudC5cbiAgICpcbiAgICogV2hlbiB0aGVyZSBpcyBubyBwYXJlbnQgd29ya2Zsb3csIGkuZS4sIHRoZSB3b3JrZmxvdyBpcyBpdHMgb3duIHJvb3Qgd29ya2Zsb3csXG4gICAqIHRoaXMgZmllbGQgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBDb250aW51ZS1hcy1OZXcgKG9yIHJlc2V0KSBwcm9wYWdhdGVzIHRoZSB3b3JrZmxvdyBwYXJlbnRhZ2UgcmVsYXRpb25zaGlwLFxuICAgKiBhbmQgdGhlcmVmb3JlLCB3aGV0aGVyIHRoZSBuZXcgd29ya2Zsb3cgaGFzIHRoZSBzYW1lIHJvb3Qgd29ya2Zsb3cgYXMgdGhlIG9yaWdpbmFsIG9uZVxuICAgKiBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaGFkIGEgcGFyZW50LlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdD86IFJvb3RXb3JrZmxvd0luZm87XG5cbiAgLyoqXG4gICAqIFJlc3VsdCBmcm9tIHRoZSBwcmV2aW91cyBSdW4gKHByZXNlbnQgaWYgdGhpcyBpcyBhIENyb24gV29ya2Zsb3cgb3Igd2FzIENvbnRpbnVlZCBBcyBOZXcpLlxuICAgKlxuICAgKiBBbiBhcnJheSBvZiB2YWx1ZXMsIHNpbmNlIG90aGVyIFNES3MgbWF5IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgZnJvbSBhIFdvcmtmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFJlc3VsdD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIEZhaWx1cmUgZnJvbSB0aGUgcHJldmlvdXMgUnVuIChwcmVzZW50IHdoZW4gdGhpcyBSdW4gaXMgYSByZXRyeSwgb3IgdGhlIGxhc3QgUnVuIG9mIGEgQ3JvbiBXb3JrZmxvdyBmYWlsZWQpXG4gICAqL1xuICByZWFkb25seSBsYXN0RmFpbHVyZT86IEVycm9yO1xuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgV29ya2Zsb3cgaGlzdG9yeSB1cCB1bnRpbCB0aGUgY3VycmVudCBXb3JrZmxvdyBUYXNrLlxuICAgKlxuICAgKiBUaGlzIHZhbHVlIGNoYW5nZXMgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbiBFeGVjdXRpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgc2FmZWx5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGRlY2lkZSB3aGVuIHRvIHtAbGluayBjb250aW51ZUFzTmV3fS5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3RvcnlMZW5ndGg6IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiBXb3JrZmxvdyBoaXN0b3J5IGluIGJ5dGVzIHVudGlsIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgemVybyBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKlxuICAgKiBZb3UgbWF5IHNhZmVseSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBkZWNpZGUgd2hlbiB0byB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgV29ya2Zsb3dUYXNrU3RhcnRlZCBldmVudCByZWNvbW1lbmRpbmcgd2hldGhlciB0b1xuICAgKiB7QGxpbmsgY29udGludWVBc05ld30uXG4gICAqXG4gICAqIFRoaXMgdmFsdWUgY2hhbmdlcyBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFuIEV4ZWN1dGlvbi5cbiAgICpcbiAgICogU3VwcG9ydGVkIG9ubHkgb24gVGVtcG9yYWwgU2VydmVyIDEuMjArLCBhbHdheXMgYGZhbHNlYCBvbiBvbGRlciBzZXJ2ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVBc05ld1N1Z2dlc3RlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgd29ya2Zsb3cncyBUYXJnZXQgV29ya2VyIERlcGxveW1lbnQgVmVyc2lvbiBoYXMgY2hhbmdlZCBmcm9tIGl0cyBQaW5uZWQgVmVyc2lvbi5cbiAgICogV2hlbiB0cnVlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGNvbnNpZGVyIGNvbnRpbnVpbmctYXMtbmV3IHdpdGhcbiAgICogYGluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I6ICdBVVRPX1VQR1JBREUnYCB0byBtb3ZlIHRvIHRoZSBuZXcgdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyB2YWx1ZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgYW4gRXhlY3V0aW9uLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIFVwZ3JhZGUtb24tQ29udGludWUtYXMtTmV3IGlzIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFdvcmtlckRlcGxveW1lbnRWZXJzaW9uQ2hhbmdlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVhc29uKHMpIHdoeSBjb250aW51ZSBhcyBuZXcgaXMgc3VnZ2VzdGVkLiBDYW4gcG90ZW50aWFsbHkgYmUgbXVsdGlwbGUgcmVhc29ucy5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBNYXkgYmUgcmVtb3ZlZCBvciBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRDb250aW51ZUFzTmV3UmVhc29ucz86IFN1Z2dlc3RDb250aW51ZUFzTmV3UmVhc29uW107XG5cbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgb25cbiAgICovXG4gIHJlYWRvbmx5IHRhc2tRdWV1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lc3BhY2UgdGhpcyBXb3JrZmxvdyBpcyBleGVjdXRpbmcgaW5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW4gSWQgb2YgdGhlIGZpcnN0IFJ1biBpbiB0aGlzIEV4ZWN1dGlvbiBDaGFpblxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RFeGVjdXRpb25SdW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFzdCBSdW4gSWQgaW4gdGhpcyBFeGVjdXRpb24gQ2hhaW5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRpbnVlZEZyb21FeGVjdXRpb25SdW5JZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZSBhdCB3aGljaCB0aGlzIFtXb3JrZmxvdyBFeGVjdXRpb24gQ2hhaW5dKGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZmxvd3Mjd29ya2Zsb3ctZXhlY3V0aW9uLWNoYWluKSB3YXMgc3RhcnRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRUaW1lOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBjdXJyZW50IFdvcmtmbG93IFJ1biBzdGFydGVkXG4gICAqL1xuICByZWFkb25seSBydW5TdGFydFRpbWU6IERhdGU7XG5cbiAgLyoqXG4gICAqIE1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgV29ya2Zsb3cgRXhlY3V0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZCBieSBUZW1wb3JhbCBTZXJ2ZXIuIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy53b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXR9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVGltZW91dE1zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lIGF0IHdoaWNoIHRoZSBXb3JrZmxvdyBFeGVjdXRpb24gZXhwaXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uRXhwaXJhdGlvblRpbWU/OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIFdvcmtmbG93IFJ1biBpcyBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZWQgYnkgVGVtcG9yYWwgU2VydmVyLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dSdW5UaW1lb3V0fS5cbiAgICovXG4gIHJlYWRvbmx5IHJ1blRpbWVvdXRNcz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBleGVjdXRpb24gdGltZSBvZiBhIFdvcmtmbG93IFRhc2sgaW4gbWlsbGlzZWNvbmRzLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dH0uXG4gICAqL1xuICByZWFkb25seSB0YXNrVGltZW91dE1zOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldHJ5IFBvbGljeSBmb3IgdGhpcyBFeGVjdXRpb24uIFNldCB2aWEge0BsaW5rIFdvcmtmbG93T3B0aW9ucy5yZXRyeX0uXG4gICAqL1xuICByZWFkb25seSByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xuXG4gIC8qKlxuICAgKiBTdGFydHMgYXQgMSBhbmQgaW5jcmVtZW50cyBmb3IgZXZlcnkgcmV0cnkgaWYgdGhlcmUgaXMgYSBgcmV0cnlQb2xpY3lgXG4gICAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyb24gU2NoZWR1bGUgZm9yIHRoaXMgRXhlY3V0aW9uLiBTZXQgdmlhIHtAbGluayBXb3JrZmxvd09wdGlvbnMuY3JvblNjaGVkdWxlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNyb25TY2hlZHVsZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIGJldHdlZW4gQ3JvbiBSdW5zXG4gICAqL1xuICByZWFkb25seSBjcm9uU2NoZWR1bGVUb1NjaGVkdWxlSW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBCdWlsZCBJRCBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWQgaWYgdGhlXG4gICAqIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgQnVpbGQgSUQuIElmIHRoaXMgd29ya2VyIGlzIHRoZSBvbmUgZXhlY3V0aW5nIHRoaXNcbiAgICogdGFzayBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIGhhcyBhIEJ1aWxkIElEIHNldCwgdGhlbiBpdHMgSUQgd2lsbCBiZSB1c2VkLiBUaGlzIHZhbHVlIG1heSBjaGFuZ2VcbiAgICogb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhlIHdvcmtmbG93IHJ1biwgYnV0IGlzIGRldGVybWluaXN0aWMgYW5kIHNhZmUgdG8gdXNlIGZvciBicmFuY2hpbmcuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgY3VycmVudERlcGxveW1lbnRWZXJzaW9uYCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50QnVpbGRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIERlcGxveW1lbnQgVmVyc2lvbiBvZiB0aGUgd29ya2VyIHdoaWNoIGV4ZWN1dGVkIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suIE1heSBiZSB1bmRlZmluZWRcbiAgICogaWYgdGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBieSBhIHdvcmtlciB3aXRob3V0IGEgRGVwbG95bWVudCBWZXJzaW9uLiBJZiB0aGlzIHdvcmtlciBpcyB0aGUgb25lXG4gICAqIGV4ZWN1dGluZyB0aGlzIHRhc2sgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBoYXMgYSBEZXBsb3ltZW50IFZlcnNpb24gc2V0LCB0aGVuIGl0cyBJRCB3aWxsIGJlXG4gICAqIHVzZWQuIFRoaXMgdmFsdWUgbWF5IGNoYW5nZSBvdmVyIHRoZSBsaWZldGltZSBvZiB0aGUgd29ya2Zsb3cgcnVuLCBidXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmRcbiAgICogc2FmZSB0byB1c2UgZm9yIGJyYW5jaGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnREZXBsb3ltZW50VmVyc2lvbj86IFdvcmtlckRlcGxveW1lbnRWZXJzaW9uO1xuXG4gIHJlYWRvbmx5IHVuc2FmZTogVW5zYWZlV29ya2Zsb3dJbmZvO1xuXG4gIC8qKlxuICAgKiBQcmlvcml0eSBvZiB0aGlzIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eT86IFByaW9yaXR5O1xufVxuXG4vKipcbiAqIFVuc2FmZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24uXG4gKlxuICogTmV2ZXIgcmVseSBvbiB0aGlzIGluZm9ybWF0aW9uIGluIFdvcmtmbG93IGxvZ2ljIGFzIGl0IHdpbGwgY2F1c2Ugbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5zYWZlV29ya2Zsb3dJbmZvIHtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqXG4gICAqIFRoZSBzYWZlIHZlcnNpb24gb2YgdGltZSBpcyBgbmV3IERhdGUoKWAgYW5kIGBEYXRlLm5vdygpYCwgd2hpY2ggYXJlIHNldCBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBhIFdvcmtmbG93XG4gICAqIFRhc2sgYW5kIHN0YXkgY29uc3RhbnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgVGFzayBhbmQgZHVyaW5nIHJlcGxheS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdzogKCkgPT4gbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3b3JrZmxvdyBpcyBjdXJyZW50bHkgcmVwbGF5aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNSZXBsYXlpbmc6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGN1cnJlbnRseSByZXBsYXlpbmcgaGlzdG9yeSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byB7QGxpbmsgaXNSZXBsYXlpbmd9LCBidXQgcmV0dXJucyBgZmFsc2VgIGR1cmluZyBxdWVyeSBoYW5kbGVycyBhbmQgdXBkYXRlXG4gICAqIHZhbGlkYXRvcnMsIHdoaWNoIGFyZSBsaXZlIHJlYWQtb25seSBvcGVyYXRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIHJlcGxheWluZ1xuICAgKiBoaXN0b3J5IGV2ZW50cy5cbiAgICpcbiAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHRydWUsIHdvcmtmbG93IGxvZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZCBhbmQgc2lua3MgZGVmaW5lZCB3aXRoXG4gICAqIGNhbGxEdXJpbmdSZXBsYXk9ZmFsc2Ugd29uJ3QgZ2V0IHByb2Nlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzUmVwbGF5aW5nSGlzdG9yeUV2ZW50czogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIHdvcmtmbG93IHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmZvIHtcbiAgLyoqXG4gICAqICBBIHdvcmtmbG93LXVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHVwZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RXb3JrZmxvd0luZm8ge1xuICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm90IGFuIGFjdHVhbCBlcnJvciwgdXNlZCBieSB0aGUgV29ya2Zsb3cgcnVudGltZSB0byBhYm9ydCBleGVjdXRpb24gd2hlbiB7QGxpbmsgY29udGludWVBc05ld30gaXMgY2FsbGVkXG4gKi9cbkBTeW1ib2xCYXNlZEluc3RhbmNlT2ZFcnJvcignQ29udGludWVBc05ldycpXG5leHBvcnQgY2xhc3MgQ29udGludWVBc05ldyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSUNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbikge1xuICAgIHN1cGVyKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb250aW51aW5nIGEgV29ya2Zsb3cgYXMgbmV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGludWVBc05ld09wdGlvbnMge1xuICAvKipcbiAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBXb3JrZmxvdyB0eXBlIG5hbWUsIGUuZy4gdGhlIGZpbGVuYW1lIGluIHRoZSBOb2RlLmpzIFNESyBvciBjbGFzcyBuYW1lIGluIEphdmFcbiAgICovXG4gIHdvcmtmbG93VHlwZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhc2sgcXVldWUgdG8gY29udGludWUgdGhlIFdvcmtmbG93IGluXG4gICAqL1xuICB0YXNrUXVldWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGZvciB0aGUgZW50aXJlIFdvcmtmbG93IHJ1blxuICAgKiBAZm9ybWF0IHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gICAqL1xuICB3b3JrZmxvd1J1blRpbWVvdXQ/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRpbWVvdXQgZm9yIGEgc2luZ2xlIFdvcmtmbG93IHRhc2tcbiAgICogQGZvcm1hdCB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfVxuICAgKi9cbiAgd29ya2Zsb3dUYXNrVGltZW91dD86IER1cmF0aW9uO1xuICAvKipcbiAgICogTm9uLXNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICovXG4gIG1lbW8/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFNlYXJjaGFibGUgYXR0cmlidXRlcyB0byBhdHRhY2ggdG8gbmV4dCBXb3JrZmxvdyBydW5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayB0eXBlZFNlYXJjaEF0dHJpYnV0ZXN9IGluc3RlYWQuXG4gICAqL1xuICBzZWFyY2hBdHRyaWJ1dGVzPzogU2VhcmNoQXR0cmlidXRlczsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAvKipcbiAgICogU3BlY2lmaWVzIGFkZGl0aW9uYWwgaW5kZXhlZCBpbmZvcm1hdGlvbiB0byBhdHRhY2ggdG8gdGhlIFdvcmtmbG93IEV4ZWN1dGlvbi4gTW9yZSBpbmZvOlxuICAgKiBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vZG9jcy90eXBlc2NyaXB0L3NlYXJjaC1hdHRyaWJ1dGVzXG4gICAqXG4gICAqIFZhbHVlcyBhcmUgYWx3YXlzIGNvbnZlcnRlZCB1c2luZyB7QGxpbmsgSnNvblBheWxvYWRDb252ZXJ0ZXJ9LCBldmVuIHdoZW4gYSBjdXN0b20gZGF0YSBjb252ZXJ0ZXIgaXMgcHJvdmlkZWQuXG4gICAqIE5vdGUgdGhhdCBzZWFyY2ggYXR0cmlidXRlcyBhcmUgbm90IGVuY29kZWQsIGFzIHN1Y2gsIGRvIG5vdCBpbmNsdWRlIGFueSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIElmIGJvdGgge0BsaW5rIHNlYXJjaEF0dHJpYnV0ZXN9IGFuZCB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfSBhcmUgcHJvdmlkZWQsIGNvbmZsaWN0aW5nIGtleXMgd2lsbCBiZSBvdmVyd3JpdHRlblxuICAgKiBieSB7QGxpbmsgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzfS5cbiAgICovXG4gIHR5cGVkU2VhcmNoQXR0cmlidXRlcz86IFNlYXJjaEF0dHJpYnV0ZVBhaXJbXSB8IFR5cGVkU2VhcmNoQXR0cmlidXRlcztcbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgV29ya2Zsb3cgc2hvdWxkXG4gICAqIENvbnRpbnVlLWFzLU5ldyBvbnRvIGEgd29ya2VyIHdpdGggYSBjb21wYXRpYmxlIEJ1aWxkIElkIG9yIG5vdC4gU2VlIHtAbGluayBWZXJzaW9uaW5nSW50ZW50fS5cbiAgICpcbiAgICogQGRlZmF1bHQgJ0NPTVBBVElCTEUnXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFdvcmtlciBWZXJzaW9uaW5nIGlzIG5vdyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBXb3JrZXIgRGVwbG95bWVudCBBUEkgaW5zdGVhZDogaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3dvcmtlci1kZXBsb3ltZW50c1xuICAgKi9cbiAgdmVyc2lvbmluZ0ludGVudD86IFZlcnNpb25pbmdJbnRlbnQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIHZlcnNpb25pbmcgYmVoYXZpb3IgdG8gYmUgdXNlZCBieSB0aGUgZmlyc3QgdGFzayBvZiBhIG5ldyB3b3JrZmxvdyBydW4gaW4gYSBjb250aW51ZS1hcy1uZXcgY2hhaW4uXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgVmVyc2lvbmluZyBzZW1hbnRpY3Mgd2l0aCBjb250aW51ZS1hcy1uZXcgYXJlIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuICAgKi9cbiAgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcj86IEluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3I7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lczpcbiAqIC0gd2hldGhlciBjYW5jZWxsYXRpb24gcmVxdWVzdHMgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgYW5kXG4gKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBDaGlsZCdzIGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3dcbiAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUge0BsaW5rIGV4ZWN1dGVDaGlsZH0ncyBvciB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZS5yZXN1bHR9J3NcbiAqICAgcHJvbWlzZSBmYWlsIHdpdGggYSBgQ2hpbGRXb3JrZmxvd0ZhaWx1cmVgLCB3aXRoIGBjYXVzZWAgc2V0IHRvIGEgYENhbmNlbGxlZEZhaWx1cmVgKS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyB0byBjYW5jZWxsYXRpb24gb3JpZ2luYXRpbmcgZnJvbSBhbiBleHRlcm5hbCByZXF1ZXN0IGZvciB0aGVcbiAqIFBhcmVudCBXb3JrZmxvdyBpdHNlbGYsIG9yIGZyb20gaW50ZXJuYWwgY2FuY2VsbGF0aW9uIG9mIHRoZSBgQ2FuY2VsbGF0aW9uU2NvcGVgIGluIHdoaWNoIHRoZVxuICogQ2hpbGQgV29ya2Zsb3cgY2FsbCB3YXMgbWFkZS4gRXZlbnR1YWwgQ2FuY2VsbGF0aW9uIG9mIGEgQ2hpbGQgV29ya2Zsb3cgb24gY29tcGxldGlvbiBvZiB0aGVcbiAqIFBhcmVudCBXb3JrZmxvdyBpcyBjb250cm9sbGVkIGJ5IHRoZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3l9IHNldHRpbmcuXG4gKlxuICogQGRlZmF1bHQgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gKi9cbi8vIE1BSU5URU5BTkNFOiBLZWVwIHRoaXMgdHlwZWRvYyBpbiBzeW5jIHdpdGggdGhlIGBDaGlsZFdvcmtmbG93T3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlYCBmaWVsZFxuZXhwb3J0IGNvbnN0IENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlID0ge1xuICAvKipcbiAgICogRG8gbm90IHByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdHMgdG8gdGhlIENoaWxkLCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0IGNhbmNlbGxhdGlvblxuICAgKiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgeWV0IF9pbW1lZGlhdGVseV8gcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLCBpLmUuIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIHNlcnZlciB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb25cbiAgICogcmVxdWVzdC5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgcHJvdmlkZXMgbm8gZ3VhcmFudGVlLCBmcm9tIHRoZSBQYXJlbnQtc2lkZSwgdGhhdCB0aGVcbiAgICogY2FuY2VsbGF0aW9uIHJlcXVlc3Qgd2lsbCBhY3R1YWxseSBiZSBhdG9taWNhbGx5IGFkZGVkIHRvIHRoZSBDaGlsZCB3b3JrZmxvdydzIGhpc3RvcnkuXG4gICAqIEluIHBhcnRpY3VsYXIsIHRoZSBDaGlsZCBtYXkgY29tcGxldGUgKGVpdGhlciBzdWNjZXNzZnVsbHkgb3IgdW5jZXNzZnVsbHkpIGJlZm9yZSB0aGVcbiAgICogY2FuY2VsbGF0aW9uIGlzIGRlbGl2ZXJlZCwgcmVzdWx0aW5nIGluIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBQYXJlbnQgd29ya2Zsb3cgdGhpbmtzIGl0cyBjaGlsZFxuICAgKiB3YXMgY2FuY2VsbGVkLCBidXQgdGhlIGNoaWxkIGFjdHVhbGx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqXG4gICAqIFRvIGd1YXJhbnRlZSB0aGF0IHRoZSBDaGlsZCB3aWxsIGV2ZW50dWFsbHkgYmUgbm90aWZpZWQgb2YgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0LFxuICAgKiB1c2Uge0BsaW5rIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRH0uXG4gICAqL1xuICBUUllfQ0FOQ0VMOiAnVFJZX0NBTkNFTCcsXG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBQYXJlbnQgV29ya2Zsb3cgdG8gdGhlIENoaWxkLCB0aGVuIHdhaXQgZm9yIHRoZSBzZXJ2ZXJcbiAgICogdG8gY29uZmlybSB0aGF0IHRoZSBDaGlsZCBXb3JrZmxvdyBjYW5jZWxsYXRpb24gcmVxdWVzdCB3YXMgcmVjb3JkZWQgaW4gaXRzIGhpc3RvcnkuXG4gICAqXG4gICAqIFRoaXMgY2FuY2VsbGF0aW9uIHR5cGUgZ3VhcmFudGVlcyB0aGF0IHRoZSBDaGlsZCB3aWxsIGV2ZW50dWFsbHkgYmUgbm90aWZpZWQgb2YgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0ICh0aGF0IGlzLCB1bmxlc3MgdGhlIENoaWxkIHRlcm1pbmF0ZXMgaW5iZXR3ZWVuIGR1ZSB0byB1bmV4cGVjdGVkIGNhdXNlcykuXG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUQnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgUGFyZW50IFdvcmtmbG93IHRvIHRoZSBDaGlsZCwgdGhlbiB3YWl0IGZvciBjb21wbGV0aW9uXG4gICAqIG9mIHRoZSBDaGlsZCBXb3JrZmxvdy5cbiAgICpcbiAgICogVGhlIENoaWxkIG1heSByZXNwZWN0IGNhbmNlbGxhdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgUGFyZW50J3MgYGV4ZWN1dGVDaGlsZGAgb3JcbiAgICogYENoaWxkV29ya2Zsb3dIYW5kbGUucmVzdWx0YCBwcm9taXNlIHdpbGwgZmFpbCB3aXRoIGEgYENoaWxkV29ya2Zsb3dGYWlsdXJlYCwgd2l0aCBgY2F1c2VgXG4gICAqIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYC4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBDaGlsZCBtYXkgaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCxcbiAgICogaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVzcG9uZGluZyBwcm9taXNlIHdpbGwgZWl0aGVyIHJlc29sdmUgd2l0aCBhIHJlc3VsdCAoaWYgQ2hpbGQgY29tcGxldGVkXG4gICAqIHN1Y2Nlc3NmdWxseSkgb3IgcmVqZWN0IHdpdGggYSBkaWZmZXJlbnQgY2F1c2UgKGlmIENoaWxkIGNvbXBsZXRlZCB1bmNlc3NmdWxseSkuXG4gICAqXG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQ6ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlID1cbiAgKHR5cGVvZiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlXTtcblxuLy8gdHMtcHJ1bmUtaWdub3JlLW5leHRcbmV4cG9ydCBjb25zdCBbZW5jb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsIGRlY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlXSA9IG1ha2VQcm90b0VudW1Db252ZXJ0ZXJzPFxuICBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LkNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5DaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAga2V5b2YgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIHR5cGVvZiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuQUJBTkRPTl06IDAsXG4gICAgW0NoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAxLFxuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURURdOiAyLFxuICAgIFtDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURURdOiAzLFxuICB9IGFzIGNvbnN0LFxuICAnJ1xuKTtcblxuLyoqXG4gKiBIb3cgYSBDaGlsZCBXb3JrZmxvdyByZWFjdHMgdG8gdGhlIFBhcmVudCBXb3JrZmxvdyByZWFjaGluZyBhIENsb3NlZCBzdGF0ZS5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vY29uY2VwdHMvd2hhdC1pcy1hLXBhcmVudC1jbG9zZS1wb2xpY3kvIHwgUGFyZW50IENsb3NlIFBvbGljeX1cbiAqL1xuZXhwb3J0IGNvbnN0IFBhcmVudENsb3NlUG9saWN5ID0ge1xuICAvKipcbiAgICogV2hlbiB0aGUgUGFyZW50IGlzIENsb3NlZCwgdGhlIENoaWxkIGlzIFRlcm1pbmF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0XG4gICAqL1xuICBURVJNSU5BVEU6ICdURVJNSU5BVEUnLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCBub3RoaW5nIGlzIGRvbmUgdG8gdGhlIENoaWxkLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgQ2FuY2VsbGVkLlxuICAgKi9cbiAgUkVRVUVTVF9DQU5DRUw6ICdSRVFVRVNUX0NBTkNFTCcsXG5cbiAgLy8vIEFueXRoaW5nIGJlbG93IHRoaXMgbGluZSBoYXMgYmVlbiBkZXByZWNhdGVkXG5cbiAgLyoqXG4gICAqIElmIGEgYFBhcmVudENsb3NlUG9saWN5YCBpcyBzZXQgdG8gdGhpcywgb3IgaXMgbm90IHNldCBhdCBhbGwsIHRoZSBzZXJ2ZXIgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEVpdGhlciBsZWF2ZSBwcm9wZXJ0eSBgdW5kZWZpbmVkYCwgb3Igc2V0IGFuIGV4cGxpY2l0IHBvbGljeSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9VTlNQRUNJRklFRDogdW5kZWZpbmVkLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgVGVybWluYXRlZC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeS5URVJNSU5BVEV9IGluc3RlYWQuXG4gICAqL1xuICBQQVJFTlRfQ0xPU0VfUE9MSUNZX1RFUk1JTkFURTogJ1RFUk1JTkFURScsXG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIFBhcmVudCBpcyBDbG9zZWQsIG5vdGhpbmcgaXMgZG9uZSB0byB0aGUgQ2hpbGQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgUGFyZW50Q2xvc2VQb2xpY3kuQUJBTkRPTn0gaW5zdGVhZC5cbiAgICovXG4gIFBBUkVOVF9DTE9TRV9QT0xJQ1lfQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBQYXJlbnQgaXMgQ2xvc2VkLCB0aGUgQ2hpbGQgaXMgQ2FuY2VsbGVkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhcmVudENsb3NlUG9saWN5LlJFUVVFU1RfQ0FOQ0VMfSBpbnN0ZWFkLlxuICAgKi9cbiAgUEFSRU5UX0NMT1NFX1BPTElDWV9SRVFVRVNUX0NBTkNFTDogJ1JFUVVFU1RfQ0FOQ0VMJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBQYXJlbnRDbG9zZVBvbGljeSA9ICh0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3kpW2tleW9mIHR5cGVvZiBQYXJlbnRDbG9zZVBvbGljeV07XG5cbi8vIHRzLXBydW5lLWlnbm9yZS1uZXh0XG5leHBvcnQgY29uc3QgW2VuY29kZVBhcmVudENsb3NlUG9saWN5LCBkZWNvZGVQYXJlbnRDbG9zZVBvbGljeV0gPSBtYWtlUHJvdG9FbnVtQ29udmVydGVyczxcbiAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5QYXJlbnRDbG9zZVBvbGljeSxcbiAgdHlwZW9mIGNvcmVzZGsuY2hpbGRfd29ya2Zsb3cuUGFyZW50Q2xvc2VQb2xpY3ksXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLmNoaWxkX3dvcmtmbG93LlBhcmVudENsb3NlUG9saWN5LFxuICB0eXBlb2YgUGFyZW50Q2xvc2VQb2xpY3ksXG4gICdQQVJFTlRfQ0xPU0VfUE9MSUNZXydcbj4oXG4gIHtcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuVEVSTUlOQVRFXTogMSxcbiAgICBbUGFyZW50Q2xvc2VQb2xpY3kuQUJBTkRPTl06IDIsXG4gICAgW1BhcmVudENsb3NlUG9saWN5LlJFUVVFU1RfQ0FOQ0VMXTogMyxcbiAgICBVTlNQRUNJRklFRDogMCxcbiAgfSBhcyBjb25zdCxcbiAgJ1BBUkVOVF9DTE9TRV9QT0xJQ1lfJ1xuKTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGlsZFdvcmtmbG93T3B0aW9ucyBleHRlbmRzIE9taXQ8Q29tbW9uV29ya2Zsb3dPcHRpb25zLCAnd29ya2Zsb3dJZENvbmZsaWN0UG9saWN5Jz4ge1xuICAvKipcbiAgICogV29ya2Zsb3cgaWQgdG8gdXNlIHdoZW4gc3RhcnRpbmcuIElmIG5vdCBzcGVjaWZpZWQgYSBVVUlEIGlzIGdlbmVyYXRlZC4gTm90ZSB0aGF0IGl0IGlzXG4gICAqIGRhbmdlcm91cyBhcyBpbiBjYXNlIG9mIGNsaWVudCBzaWRlIHJldHJpZXMgbm8gZGVkdXBsaWNhdGlvbiB3aWxsIGhhcHBlbiBiYXNlZCBvbiB0aGVcbiAgICogZ2VuZXJhdGVkIGlkLiBTbyBwcmVmZXIgYXNzaWduaW5nIGJ1c2luZXNzIG1lYW5pbmdmdWwgaWRzIGlmIHBvc3NpYmxlLlxuICAgKi9cbiAgd29ya2Zsb3dJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGFzayBxdWV1ZSB0byB1c2UgZm9yIFdvcmtmbG93IHRhc2tzLiBJdCBzaG91bGQgbWF0Y2ggYSB0YXNrIHF1ZXVlIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGFcbiAgICogYFdvcmtlcmAgdGhhdCBob3N0cyB0aGUgV29ya2Zsb3cgY29kZS5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgYSBjaGlsZCBpcyBzY2hlZHVsZWQgb24gdGhlIHNhbWUgVGFzayBRdWV1ZSBhcyB0aGUgcGFyZW50LlxuICAgKi9cbiAgdGFza1F1ZXVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzOlxuICAgKiAtIHdoZXRoZXIgY2FuY2VsbGF0aW9uIHJlcXVlc3RzIHNob3VsZCBiZSBwcm9wYWdhdGVkIGZyb20gdGhlIFBhcmVudCBXb3JrZmxvdyB0byB0aGUgQ2hpbGQsIGFuZFxuICAgKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBDaGlsZCdzIGNhbmNlbGxhdGlvbiBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBQYXJlbnQgV29ya2Zsb3dcbiAgICogICAoaS5lLiBhdCB3aGljaCBtb21lbnQgc2hvdWxkIHRoZSB7QGxpbmsgZXhlY3V0ZUNoaWxkfSdzIG9yIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlLnJlc3VsdH0nc1xuICAgKiAgIHByb21pc2UgZmFpbCB3aXRoIGEgYENoaWxkV29ya2Zsb3dGYWlsdXJlYCwgd2l0aCBgY2F1c2VgIHNldCB0byBhIGBDYW5jZWxsZWRGYWlsdXJlYCkuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICAgKiBQYXJlbnQgV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAgICogQ2hpbGQgV29ya2Zsb3cgY2FsbCB3YXMgbWFkZS4gRXZlbnR1YWwgQ2FuY2VsbGF0aW9uIG9mIGEgQ2hpbGQgV29ya2Zsb3cgb24gY29tcGxldGlvbiBvZiB0aGVcbiAgICogUGFyZW50IFdvcmtmbG93IGlzIGNvbnRyb2xsZWQgYnkgdGhlIHtAbGluayBQYXJlbnRDbG9zZVBvbGljeX0gc2V0dGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEXG4gICAqL1xuICAvLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGVgIGVudW1cbiAgY2FuY2VsbGF0aW9uVHlwZT86IENoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRoZSBDaGlsZCByZWFjdHMgdG8gdGhlIFBhcmVudCBXb3JrZmxvdyByZWFjaGluZyBhIENsb3NlZCBzdGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgUGFyZW50Q2xvc2VQb2xpY3kuUEFSRU5UX0NMT1NFX1BPTElDWV9URVJNSU5BVEVcbiAgICovXG4gIHBhcmVudENsb3NlUG9saWN5PzogUGFyZW50Q2xvc2VQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgdGhlIFdvcmtlciBWZXJzaW9uaW5nIGZlYXR1cmUsIHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgQ2hpbGQgV29ya2Zsb3cgc2hvdWxkIHJ1biBvblxuICAgKiBhIHdvcmtlciB3aXRoIGEgY29tcGF0aWJsZSBCdWlsZCBJZCBvciBub3QuIFNlZSB7QGxpbmsgVmVyc2lvbmluZ0ludGVudH0uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdDT01QQVRJQkxFJ1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBXb3JrZXIgVmVyc2lvbmluZyBpcyBub3cgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgV29ya2VyIERlcGxveW1lbnQgQVBJIGluc3RlYWQ6IGh0dHBzOi8vZG9jcy50ZW1wb3JhbC5pby93b3JrZXItZGVwbG95bWVudHNcbiAgICovXG4gIHZlcnNpb25pbmdJbnRlbnQ/OiBWZXJzaW9uaW5nSW50ZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG59XG5cbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnMgPSBSZXF1aXJlZDxQaWNrPENoaWxkV29ya2Zsb3dPcHRpb25zLCAnd29ya2Zsb3dJZCcgfCAnY2FuY2VsbGF0aW9uVHlwZSc+PiAmIHtcbiAgYXJnczogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMgPSBDaGlsZFdvcmtmbG93T3B0aW9ucyAmIFJlcXVpcmVkQ2hpbGRXb3JrZmxvd09wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUcmFjZVNES0luZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2xpY2Ugb2YgYSBmaWxlIHN0YXJ0aW5nIGF0IGxpbmVPZmZzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlRmlsZVNsaWNlIHtcbiAgLyoqXG4gICAqIE9ubHkgdXNlZCBwb3NzaWJsZSB0byB0cmltIHRoZSBmaWxlIHdpdGhvdXQgYnJlYWtpbmcgc3ludGF4IGhpZ2hsaWdodGluZy5cbiAgICovXG4gIGxpbmVfb2Zmc2V0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBzbGljZSBvZiBhIGZpbGUgd2l0aCBgXFxuYCAobmV3bGluZSkgbGluZSB0ZXJtaW5hdG9yLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcG9pbnRlciB0byBhIGxvY2F0aW9uIGluIGEgZmlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24ge1xuICAvKipcbiAgICogUGF0aCB0byBzb3VyY2UgZmlsZSAoYWJzb2x1dGUgb3IgcmVsYXRpdmUpLlxuICAgKiBXaGVuIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCwgbWFrZSBzdXJlIGFsbCBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIHNhbWUgcm9vdC5cbiAgICovXG4gIGZpbGVfcGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIElmIHBvc3NpYmxlLCBTREsgc2hvdWxkIHNlbmQgdGhpcywgcmVxdWlyZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGNvZGUgbG9jYXRpb24uXG4gICAqL1xuICBsaW5lPzogbnVtYmVyO1xuICAvKipcbiAgICogSWYgcG9zc2libGUsIFNESyBzaG91bGQgc2VuZCB0aGlzLlxuICAgKi9cbiAgY29sdW1uPzogbnVtYmVyO1xuICAvKipcbiAgICogRnVuY3Rpb24gbmFtZSB0aGlzIGxpbmUgYmVsb25ncyB0byAoaWYgYXBwbGljYWJsZSkuXG4gICAqIFVzZWQgZm9yIGZhbGxpbmcgYmFjayB0byBzdGFjayB0cmFjZSB2aWV3LlxuICAgKi9cbiAgZnVuY3Rpb25fbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEZsYWcgdG8gbWFyayB0aGlzIGFzIGludGVybmFsIFNESyBjb2RlIGFuZCBoaWRlIGJ5IGRlZmF1bHQgaW4gdGhlIFVJLlxuICAgKi9cbiAgaW50ZXJuYWxfY29kZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1RyYWNlIHtcbiAgbG9jYXRpb25zOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogVXNlZCBhcyB0aGUgcmVzdWx0IGZvciB0aGUgZW5oYW5jZWQgc3RhY2sgdHJhY2UgcXVlcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFN0YWNrVHJhY2Uge1xuICBzZGs6IFN0YWNrVHJhY2VTREtJbmZvO1xuICAvKipcbiAgICogTWFwcGluZyBvZiBmaWxlIHBhdGggdG8gZmlsZSBjb250ZW50cy5cbiAgICogU0RLIG1heSBjaG9vc2UgdG8gc2VuZCBubywgc29tZSBvciBhbGwgc291cmNlcy5cbiAgICogU291cmNlcyBtaWdodCBiZSB0cmltbWVkLCBhbmQgc29tZSB0aW1lIG9ubHkgdGhlIGZpbGUocykgb2YgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSB0cmFjZSB3aWxsIGJlIHNlbnQuXG4gICAqL1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+O1xuICBzdGFja3M6IFN0YWNrVHJhY2VbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnMge1xuICBpbmZvOiBXb3JrZmxvd0luZm87XG4gIHJhbmRvbW5lc3NTZWVkOiBudW1iZXJbXTtcbiAgbm93OiBudW1iZXI7XG4gIHNob3dTdGFja1RyYWNlU291cmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCBleHRlbmRzIFdvcmtmbG93Q3JlYXRlT3B0aW9ucyB7XG4gIHNvdXJjZU1hcDogUmF3U291cmNlTWFwO1xuICByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG4gIGdldFRpbWVPZkRheSgpOiBiaWdpbnQ7XG4gIHN0YWNrVHJhY2VzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gY2FwYWJsZSBvZiBhY2NlcHRpbmcgdGhlIGFyZ3VtZW50cyBmb3IgYSBnaXZlbiBVcGRhdGVEZWZpbml0aW9uLCBTaWduYWxEZWZpbml0aW9uIG9yIFF1ZXJ5RGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgSGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+ID0gVCBleHRlbmRzIFVwZGF0ZURlZmluaXRpb248aW5mZXIgUiwgaW5mZXIgQT5cbiAgPyAoLi4uYXJnczogQSkgPT4gUiB8IFByb21pc2U8Uj5cbiAgOiBUIGV4dGVuZHMgU2lnbmFsRGVmaW5pdGlvbjxpbmZlciBBPlxuICAgID8gKC4uLmFyZ3M6IEEpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+XG4gICAgOiBUIGV4dGVuZHMgUXVlcnlEZWZpbml0aW9uPGluZmVyIFIsIGluZmVyIEE+XG4gICAgICA/ICguLi5hcmdzOiBBKSA9PiBSXG4gICAgICA6IG5ldmVyO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmdW5jdGlvbiBhY2NlcHRpbmcgc2lnbmFsIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRTaWduYWxIYW5kbGVyID0gKHNpZ25hbE5hbWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBBIGhhbmRsZXIgZnVuY3Rpb24gYWNjZXB0aW5nIHVwZGF0ZSBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLlxuICovXG5leHBvcnQgdHlwZSBEZWZhdWx0VXBkYXRlSGFuZGxlciA9ICh1cGRhdGVOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPiB8IHVua25vd247XG5cbi8qKlxuICogQSBoYW5kbGVyIGZ1bmN0aW9uIGFjY2VwdGluZyBxdWVyeSBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIERlZmF1bHRRdWVyeUhhbmRsZXIgPSAocXVlcnlOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcblxuLyoqXG4gKiBBIHZhbGlkYXRpb24gZnVuY3Rpb24gY2FwYWJsZSBvZiBhY2NlcHRpbmcgdGhlIGFyZ3VtZW50cyBmb3IgYSBnaXZlbiBVcGRhdGVEZWZpbml0aW9uLlxuICovXG5leHBvcnQgdHlwZSBVcGRhdGVWYWxpZGF0b3I8QXJncyBleHRlbmRzIGFueVtdPiA9ICguLi5hcmdzOiBBcmdzKSA9PiB2b2lkO1xuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBxdWVyeSBoYW5kbGVyLlxuICovXG5leHBvcnQgdHlwZSBRdWVyeUhhbmRsZXJPcHRpb25zID0geyBkZXNjcmlwdGlvbj86IHN0cmluZyB9O1xuXG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBzaWduYWwgaGFuZGxlci5cbiAqL1xuZXhwb3J0IHR5cGUgU2lnbmFsSGFuZGxlck9wdGlvbnMgPSB7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyB1bmZpbmlzaGVkUG9saWN5PzogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kgfTtcblxuLyoqXG4gKiBBIHZhbGlkYXRvciBhbmQgZGVzY3JpcHRpb24gb2YgYW4gdXBkYXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXT4gPSB7XG4gIHZhbGlkYXRvcj86IFVwZGF0ZVZhbGlkYXRvcjxBcmdzPjtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHVuZmluaXNoZWRQb2xpY3k/OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb21tYW5kczogY29yZXNkay53b3JrZmxvd19jb21tYW5kcy5JV29ya2Zsb3dDb21tYW5kW107XG4gIHVzZWRJbnRlcm5hbEZsYWdzOiBudW1iZXJbXTtcbiAgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSYXdTb3VyY2VNYXAgfSBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCB0eXBlIHtcbiAgRmFpbHVyZUNvbnZlcnRlcixcbiAgUGF5bG9hZENvbnZlcnRlcixcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UXVlcnlBbm5vdGF0ZWRUeXBlLFxuICBXb3JrZmxvd1NpZ25hbEFubm90YXRlZFR5cGUsXG4gIFdvcmtmbG93VXBkYXRlQW5ub3RhdGVkVHlwZSxcbiAgUHJvdG9GYWlsdXJlLFxuICBXb3JrZmxvd1VwZGF0ZVR5cGUsXG4gIFdvcmtmbG93VXBkYXRlVmFsaWRhdG9yVHlwZSxcbiAgV29ya2Zsb3dGdW5jdGlvbldpdGhPcHRpb25zLFxuICBWZXJzaW9uaW5nQmVoYXZpb3IsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnMsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQge1xuICBkZWZhdWx0RmFpbHVyZUNvbnZlcnRlcixcbiAgYXJyYXlGcm9tUGF5bG9hZHMsXG4gIGRlZmF1bHRQYXlsb2FkQ29udmVydGVyLFxuICBlbnN1cmVUZW1wb3JhbEZhaWx1cmUsXG4gIEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LFxuICBJbGxlZ2FsU3RhdGVFcnJvcixcbiAgVGVtcG9yYWxGYWlsdXJlLFxuICBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IsXG4gIEFwcGxpY2F0aW9uRmFpbHVyZSxcbiAgbWFwRnJvbVBheWxvYWRzLFxuICBmcm9tUGF5bG9hZHNBdEluZGV4LFxuICBSYXdWYWx1ZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGRlY29kZVNlYXJjaEF0dHJpYnV0ZXMsXG4gIGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93JztcbmltcG9ydCB0eXBlIHsgY29yZXNkaywgdGVtcG9yYWwgfSBmcm9tICdAdGVtcG9yYWxpby9wcm90byc7XG5pbXBvcnQge1xuICBURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgsXG4gIFNUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gIEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG59IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvcmVzZXJ2ZWQnO1xuaW1wb3J0IHR5cGUgeyBSTkcgfSBmcm9tICcuL2FsZWEnO1xuaW1wb3J0IHsgYWxlYSB9IGZyb20gJy4vYWxlYSc7XG5pbXBvcnQgeyBSb290Q2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBVcGRhdGVTY29wZSB9IGZyb20gJy4vdXBkYXRlLXNjb3BlJztcbmltcG9ydCB7IERldGVybWluaXNtVmlvbGF0aW9uRXJyb3IsIExvY2FsQWN0aXZpdHlEb0JhY2tvZmYsIGlzQ2FuY2VsbGF0aW9uIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBRdWVyeUlucHV0LFxuICBTaWduYWxJbnB1dCxcbiAgU3RhcnROZXh1c09wZXJhdGlvbk91dHB1dCxcbiAgVXBkYXRlSW5wdXQsXG4gIFdvcmtmbG93RXhlY3V0ZUlucHV0LFxuICBXb3JrZmxvd0ludGVyY2VwdG9ycyxcbn0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBEZWZhdWx0U2lnbmFsSGFuZGxlcixcbiAgU3RhY2tUcmFjZVNES0luZm8sXG4gIFN0YWNrVHJhY2VGaWxlU2xpY2UsXG4gIFN0YWNrVHJhY2VGaWxlTG9jYXRpb24sXG4gIFdvcmtmbG93SW5mbyxcbiAgV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwsXG4gIEFjdGl2YXRpb25Db21wbGV0aW9uLFxuICBEZWZhdWx0VXBkYXRlSGFuZGxlcixcbiAgRGVmYXVsdFF1ZXJ5SGFuZGxlcixcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29udGludWVBc05ldyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0eXBlIFNpbmtDYWxsIH0gZnJvbSAnLi9zaW5rcyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgcGtnIGZyb20gJy4vcGtnJztcbmltcG9ydCB0eXBlIHsgU2RrRmxhZyB9IGZyb20gJy4vZmxhZ3MnO1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRGbGFnIH0gZnJvbSAnLi9mbGFncyc7XG5pbXBvcnQgeyBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcsIGxvZyB9IGZyb20gJy4vbG9ncyc7XG5cbmNvbnN0IFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlID0ge1xuICBXT1JLRkxPV19BTFJFQURZX0VYSVNUUzogJ1dPUktGTE9XX0FMUkVBRFlfRVhJU1RTJyxcbn0gYXMgY29uc3Q7XG50eXBlIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlID1cbiAgKHR5cGVvZiBTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSlba2V5b2YgdHlwZW9mIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlXTtcblxuY29uc3QgW19lbmNvZGVTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSwgZGVjb2RlU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2VdID1cbiAgbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gICAgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICBrZXlvZiB0eXBlb2YgY29yZXNkay5jaGlsZF93b3JrZmxvdy5TdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZSxcbiAgICB0eXBlb2YgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uRmFpbGVkQ2F1c2UsXG4gICAgJ1NUQVJUX0NISUxEX1dPUktGTE9XX0VYRUNVVElPTl9GQUlMRURfQ0FVU0VfJ1xuICA+KFxuICAgIHtcbiAgICAgIFtTdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25GYWlsZWRDYXVzZS5XT1JLRkxPV19BTFJFQURZX0VYSVNUU106IDEsXG4gICAgICBVTlNQRUNJRklFRDogMCxcbiAgICB9IGFzIGNvbnN0LFxuICAgICdTVEFSVF9DSElMRF9XT1JLRkxPV19FWEVDVVRJT05fRkFJTEVEX0NBVVNFXydcbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFjayB7XG4gIGZvcm1hdHRlZDogc3RyaW5nO1xuICBzdHJ1Y3R1cmVkOiBTdGFja1RyYWNlRmlsZUxvY2F0aW9uW107XG59XG5cbi8qKlxuICogR2xvYmFsIHN0b3JlIHRvIHRyYWNrIHByb21pc2Ugc3RhY2tzIGZvciBzdGFjayB0cmFjZSBxdWVyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb21pc2VTdGFja1N0b3JlIHtcbiAgY2hpbGRUb1BhcmVudDogTWFwPFByb21pc2U8dW5rbm93bj4sIFNldDxQcm9taXNlPHVua25vd24+Pj47XG4gIHByb21pc2VUb1N0YWNrOiBNYXA8UHJvbWlzZTx1bmtub3duPiwgU3RhY2s+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBsZXRpb248U3VjY2Vzcz4ge1xuICByZXNvbHZlKHZhbDogU3VjY2Vzcyk6IHZvaWQ7XG4gIHJlamVjdChyZWFzb246IEVycm9yKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25kaXRpb24ge1xuICBmbigpOiBib29sZWFuO1xuXG4gIHJlc29sdmUoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aXZhdGlvbkhhbmRsZXJGdW5jdGlvbjxLIGV4dGVuZHMga2V5b2YgY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb25Kb2I+ID0gKFxuICBhY3RpdmF0aW9uOiBOb25OdWxsYWJsZTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkpvYltLXT5cbikgPT4gdm9pZDtcblxuLyoqXG4gKiBWZXJpZmllcyBhbGwgYWN0aXZhdGlvbiBqb2IgaGFuZGxpbmcgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWRcbiAqL1xuZXhwb3J0IHR5cGUgQWN0aXZhdGlvbkhhbmRsZXIgPSB7XG4gIFtQIGluIGtleW9mIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JV29ya2Zsb3dBY3RpdmF0aW9uSm9iXTogQWN0aXZhdGlvbkhhbmRsZXJGdW5jdGlvbjxQPjtcbn07XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gdXBkYXRlIG9yIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbi5cbiAqL1xuaW50ZXJmYWNlIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uIHtcbiAgbmFtZTogc3RyaW5nO1xuICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeTtcbiAgaWQ/OiBzdHJpbmc7XG59XG5cbnR5cGUgSW5mZXJNYXBWYWx1ZTxUPiA9IFQgZXh0ZW5kcyBNYXA8bnVtYmVyLCBpbmZlciBWPiA/IFYgOiBuZXZlcjtcblxuLyoqXG4gKiBLZWVwcyBhbGwgb2YgdGhlIFdvcmtmbG93IHJ1bnRpbWUgc3RhdGUgbGlrZSBwZW5kaW5nIGNvbXBsZXRpb25zIGZvciBhY3Rpdml0aWVzIGFuZCB0aW1lcnMuXG4gKlxuICogSW1wbGVtZW50cyBoYW5kbGVycyBmb3IgYWxsIHdvcmtmbG93IGFjdGl2YXRpb24gam9icy5cbiAqXG4gKiBOb3RlIHRoYXQgbW9zdCBtZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIG1lYW50IHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gd2l0aGluIHRoZSBWTS5cbiAqXG4gKiBIb3dldmVyLCBhIGZldyBtZXRob2RzIG1heSBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBvdXRzaWRlIHRoZSBWTSAoZXNzZW50aWFsbHkgZnJvbSBgdm0tc2hhcmVkLnRzYCkuXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBzcGVjaWZpY2FsbHkgbWFya2VkIHdpdGggYSBjb21tZW50IGFuZCByZXF1aXJlIGNhcmVmdWwgY29uc2lkZXJhdGlvbiwgYXMgdGhlXG4gKiBleGVjdXRpb24gY29udGV4dCBtYXkgbm90IHByb3Blcmx5IHJlZmxlY3QgdGhhdCBvZiB0aGUgdGFyZ2V0IHdvcmtmbG93IGV4ZWN1dGlvbiAoZS5nLjogd2l0aCBSZXVzYWJsZVxuICogVk1zLCB0aGUgYGdsb2JhbGAgbWF5IG5vdCBoYXZlIGJlZW4gc3dhcHBlZCB0byB0aG9zZSBvZiB0aGF0IHdvcmtmbG93IGV4ZWN1dGlvbjsgdGhlIGFjdGl2ZSBtaWNyb3Rhc2tcbiAqIHF1ZXVlIG1heSBiZSB0aGF0IG9mIHRoZSB0aHJlYWQvcHJvY2VzcywgcmF0aGVyIHRoYW4gdGhlIHF1ZXVlIG9mIHRoYXQgVk0gY29udGV4dDsgZXRjKS4gQ29uc2VxdWVudGx5LFxuICogbWV0aG9kcyB0aGF0IGFyZSBtZWFudCB0byBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBWTSBtdXN0IG5vdCBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAtIEFjY2VzcyBhbnkgZ2xvYmFsIHZhcmlhYmxlO1xuICogLSBDcmVhdGUgUHJvbWlzZSBvYmplY3RzLCB1c2UgYXN5bmMvYXdhaXQsIG9yIG90aGVyd2lzZSBzY2hlZHVsZSBtaWNyb3Rhc2tzO1xuICogLSBDYWxsIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMsIGluY2x1ZGluZyBhbnkgZm9ybSBvZiBpbnRlcmNlcHRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEFjdGl2YXRpb25IYW5kbGVyIHtcbiAgLyoqXG4gICAqIENhY2hlIGZvciBtb2R1bGVzIC0gcmVmZXJlbmNlZCBpbiByZXVzYWJsZS12bS50c1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcblxuICAvKipcbiAgICogTWFwIG9mIHRhc2sgc2VxdWVuY2UgdG8gYSBDb21wbGV0aW9uXG4gICAqL1xuICByZWFkb25seSBjb21wbGV0aW9ucyA9IHtcbiAgICB0aW1lcjogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dm9pZD4+KCksXG4gICAgYWN0aXZpdHk6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHVua25vd24+PigpLFxuICAgIG5leHVzT3BlcmF0aW9uU3RhcnQ6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPFN0YXJ0TmV4dXNPcGVyYXRpb25PdXRwdXQ+PigpLFxuICAgIG5leHVzT3BlcmF0aW9uQ29tcGxldGU6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHVua25vd24+PigpLFxuICAgIGNoaWxkV29ya2Zsb3dTdGFydDogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248c3RyaW5nPj4oKSxcbiAgICBjaGlsZFdvcmtmbG93Q29tcGxldGU6IG5ldyBNYXA8bnVtYmVyLCBDb21wbGV0aW9uPHVua25vd24+PigpLFxuICAgIHNpZ25hbFdvcmtmbG93OiBuZXcgTWFwPG51bWJlciwgQ29tcGxldGlvbjx2b2lkPj4oKSxcbiAgICBjYW5jZWxXb3JrZmxvdzogbmV3IE1hcDxudW1iZXIsIENvbXBsZXRpb248dm9pZD4+KCksXG4gIH07XG5cbiAgLyoqXG4gICAqIEhvbGRzIGJ1ZmZlcmVkIFVwZGF0ZSBjYWxscyB1bnRpbCBhIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnVmZmVyZWRVcGRhdGVzID0gQXJyYXk8Y29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZT4oKTtcblxuICAvKipcbiAgICogSG9sZHMgYnVmZmVyZWQgc2lnbmFsIGNhbGxzIHVudGlsIGEgaGFuZGxlciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICByZWFkb25seSBidWZmZXJlZFNpZ25hbHMgPSBBcnJheTxjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVNpZ25hbFdvcmtmbG93PigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHVwZGF0ZSBuYW1lIHRvIGhhbmRsZXIgYW5kIHZhbGlkYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlSGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgV29ya2Zsb3dVcGRhdGVBbm5vdGF0ZWRUeXBlPigpO1xuXG4gIC8qKlxuICAgKiBNYXBwaW5nIG9mIHNpZ25hbCBuYW1lIHRvIGhhbmRsZXJcbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93U2lnbmFsQW5ub3RhdGVkVHlwZT4oKTtcblxuICAvKipcbiAgICogTWFwcGluZyBvZiBpbi1wcm9ncmVzcyB1cGRhdGVzIHRvIGhhbmRsZXIgZXhlY3V0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Qcm9ncmVzc1VwZGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgTWVzc2FnZUhhbmRsZXJFeGVjdXRpb24+KCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgaW4tcHJvZ3Jlc3Mgc2lnbmFscyB0byBoYW5kbGVyIGV4ZWN1dGlvbiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGluUHJvZ3Jlc3NTaWduYWxzID0gbmV3IE1hcDxudW1iZXIsIE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBBIHNlcXVlbmNlIG51bWJlciBwcm92aWRpbmcgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNpZ25hbEhhbmRsZXJFeGVjdXRpb25TZXEgPSAwO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCBoYW5kbGVyIHRoYXQgY2F0Y2hlcyBjYWxscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFNpZ25hbEhhbmRsZXI/OiBEZWZhdWx0U2lnbmFsSGFuZGxlcjtcblxuICAvKipcbiAgICogQSB1cGRhdGUgaGFuZGxlciB0aGF0IGNhdGNoZXMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHVwZGF0ZSBuYW1lcy5cbiAgICovXG4gIGRlZmF1bHRVcGRhdGVIYW5kbGVyPzogRGVmYXVsdFVwZGF0ZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEEgcXVlcnkgaGFuZGxlciB0aGF0IGNhdGNoZXMgY2FsbHMgZm9yIG5vbi1yZWdpc3RlcmVkIHF1ZXJ5IG5hbWVzLlxuICAgKi9cbiAgZGVmYXVsdFF1ZXJ5SGFuZGxlcj86IERlZmF1bHRRdWVyeUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFNvdXJjZSBtYXAgZmlsZSBmb3IgbG9va2luZyB1cCB0aGUgc291cmNlIGZpbGVzIGluIHJlc3BvbnNlIHRvIF9fZW5oYW5jZWRfc3RhY2tfdHJhY2VcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzb3VyY2VNYXA6IFJhd1NvdXJjZU1hcDtcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gc2VuZCB0aGUgc291cmNlcyBpbiBlbmhhbmNlZCBzdGFjayB0cmFjZSBxdWVyeSByZXNwb25zZXNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG93U3RhY2tUcmFjZVNvdXJjZXM7XG5cbiAgcmVhZG9ubHkgcHJvbWlzZVN0YWNrU3RvcmU6IFByb21pc2VTdGFja1N0b3JlID0ge1xuICAgIHByb21pc2VUb1N0YWNrOiBuZXcgTWFwKCksXG4gICAgY2hpbGRUb1BhcmVudDogbmV3IE1hcCgpLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGN1cnJlbnQgV29ya2Zsb3cgVGFzayB0byBmYWlsLiBTZXRzIGlmIGEgbm9uLWBUZW1wb3JhbEZhaWx1cmVgXG4gICAqIGVycm9yIGJ1YmJsZXMgdXAgb3V0IG9mIHRoZSBXb3JrZmxvdyBmdW5jdGlvbiwgb3Igb3V0IG9mIGEgU2lnbmFsIG9yIFVwZGF0ZSBoYW5kbGVyLiBXZVxuICAgKiBjYXB0dXJlIGVycm9ycyB0aGlzIHdheSBiZWNhdXNlIHRob3NlIGZ1bmN0aW9ucyBhcmUgbm90IHRlY2huaWNhbGx5IGF3YWl0ZWQgd2hlbiBzdGFydGVkLFxuICAgKiBidXQgbGVmdCB0byBydW4gYXN5bmNocm9ub3VzbHkuIFRoZXJlIGlzIHRoZXJlZm9yZSBubyByZWFsIFwicGFyZW50XCIgZnVuY3Rpb24gdGhhdCBjYW5cbiAgICogZGlyZWN0bHkgaGFuZGxlIHRob3NlIGVycm9ycywgYW5kIG5vdCBjYXB0dXJpbmcgaXQgd291bGQgcmVzdWx0IGluIGFuIFVuaGFuZGxlZCBQcm9taXNlXG4gICAqIFJlamVjdGlvbi4gU28gaW5zdGVhZCwgd2UgYnVmZmVyIHRoZSBlcnJvciBoZXJlLCB0byB0aGVuIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29udGV4dFxuICAgKiBvZiBvdXIgb3duIHN5bmNocm9ub3VzIEFjdGl2YXRpb24gaGFuZGxpbmcgZXZlbnQgbG9vcC5cbiAgICpcbiAgICogT3VyIGNvZGUgZG9lcyBhIGJlc3QgZWZmb3J0IHRvIHN0b3AgcHJvY2Vzc2luZyB0aGUgY3VycmVudCBhY3RpdmF0aW9uIGFzIHNvb24gYXMgcG9zc2libGVcbiAgICogYWZ0ZXIgdGhpcyBmaWVsZCBpcyBzZXQ6XG4gICAqICAtIElmIGFuIGVycm9yIGlzIHRocm93biB3aGlsZSBleGVjdXRpbmcgY29kZSBzeW5jaHJvbm91c2x5IChlLmcuIGFueXRoaW5nIGJlZm9yZSB0aGVcbiAgICogICAgZmlyc3QgYGF3YWl0YCBzdGF0ZW1lbnQgaW4gYSBXb3JrZmxvdyBmdW5jdGlvbiBvciBhIHNpZ25hbC91cGRhdGUgaGFuZGxlciksIHRoZSBlcnJvclxuICAgKiAgICB3aWxsIGJlIF9pbW1lZGlhdGVseV8gcmV0aHJvd24sIHdoaWNoIHdpbGwgcHJldmVudCBleGVjdXRpb24gb2YgZnVydGhlciBqb2JzIGluIHRoZVxuICAgKiAgICBjdXJyZW50IGFjdGl2YXRpb24uIFdlIGtub3cgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgY29kZSBzeW5jaHJvbm91c2x5IHRoYW5rcyB0byB0aGVcbiAgICogICAgYHJldGhyb3dTeW5jaHJvbm91c2x5YCBmbGFnIGJlbG93LlxuICAgKiAgLSBJdCBhbiBlcnJvciBpcyB0aHJvd24gd2hpbGUgZXhlY3V0aW5nIG1pY3JvdGFza3MsIHRoZW4gdGhlIGVycm9yIHdpbGwgYmUgcmV0aHJvd24gb25cbiAgICogICAgdGhlIG5leHQgY2FsbCB0byBgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKWAuXG4gICAqXG4gICAqIFVuZm9ydHVuYXRlbHksIHRoZXJlJ3Mgbm8gd2F5IGZvciB1cyB0byBwcmV2ZW50IGZ1cnRoZXIgZXhlY3V0aW9uIG9mIG1pY3JvdGFza3MgdGhhdCBoYXZlXG4gICAqIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQsIG5vciB0aG9zZSB0aGF0IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2NoZWR1bGVkIGZyb20gdGhvc2UgbWljcm90YXNrcy5cbiAgICogU2hvdWxkIG1vcmUgZXJyb3JzIGdldCB0aHJvd24gd2hpbGUgc2V0dGxpbmcgbWljcm90YXNrcywgdGhvc2Ugd2lsbCBiZSBpZ25vcmVkIChpLmUuIG9ubHlcbiAgICogdGhlIGZpcnN0IGNhcHR1cmVkIGVycm9yIGlzIHByZXNlcnZlZCkuXG4gICAqL1xuICBwdWJsaWMgd29ya2Zsb3dUYXNrRXJyb3I6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHdoZW4gcnVubmluZyBzeW5jaHJvbm91cyBjb2RlIChlLmcuIHdoaWxlIHByb2Nlc3NpbmcgYWN0aXZhdGlvbiBqb2JzIGFuZCB3aGVuIGNhbGxpbmdcbiAgICogYHRyeVVuYmxvY2tDb25kaXRpb25zKClgKS4gV2hpbGUgdGhpcyBmbGFnIGlzIHNldCwgaXQgaXMgc2FmZSB0byBsZXQgZXJyb3JzIGJ1YmJsZSB1cC5cbiAgICovXG4gIHB1YmxpYyByZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gIHB1YmxpYyByZWFkb25seSByb290U2NvcGUgPSBuZXcgUm9vdENhbmNlbGxhdGlvblNjb3BlKCk7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgcXVlcnkgbmFtZSB0byBoYW5kbGVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXVlcnlIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBXb3JrZmxvd1F1ZXJ5QW5ub3RhdGVkVHlwZT4oW1xuICAgIFtcbiAgICAgIFNUQUNLX1RSQUNFX1FVRVJZX05BTUUsXG4gICAgICB7XG4gICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJhd1ZhbHVlPHN0cmluZz4oXG4gICAgICAgICAgICB0aGlzLmdldFN0YWNrVHJhY2VzKClcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy5mb3JtYXR0ZWQpXG4gICAgICAgICAgICAgIC5qb2luKCdcXG5cXG4nKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHNlbnNpYmxlIHN0YWNrIHRyYWNlLicsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAgRU5IQU5DRURfU1RBQ0tfVFJBQ0VfUVVFUllfTkFNRSxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IFJhd1ZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNvdXJjZU1hcCB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBzZGs6IFN0YWNrVHJhY2VTREtJbmZvID0geyBuYW1lOiAndHlwZXNjcmlwdCcsIHZlcnNpb246IHBrZy52ZXJzaW9uIH07XG4gICAgICAgICAgY29uc3Qgc3RhY2tzID0gdGhpcy5nZXRTdGFja1RyYWNlcygpLm1hcCgoeyBzdHJ1Y3R1cmVkOiBsb2NhdGlvbnMgfSkgPT4gKHsgbG9jYXRpb25zIH0pKTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBTdGFja1RyYWNlRmlsZVNsaWNlW10+ID0ge307XG4gICAgICAgICAgaWYgKHRoaXMuc2hvd1N0YWNrVHJhY2VTb3VyY2VzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgbG9jYXRpb25zIH0gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgeyBmaWxlX3BhdGggfSBvZiBsb2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbGVfcGF0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHNvdXJjZU1hcD8uc291cmNlc0NvbnRlbnQ/Lltzb3VyY2VNYXA/LnNvdXJjZXMuaW5kZXhPZihmaWxlX3BhdGgpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZXNbZmlsZV9wYXRoXSA9IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZV9vZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBSYXdWYWx1ZTxFbmhhbmNlZFN0YWNrVHJhY2U+KHsgc2RrLCBzdGFja3MsIHNvdXJjZXMgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBhIHN0YWNrIHRyYWNlIGFubm90YXRlZCB3aXRoIHNvdXJjZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFtcbiAgICAgICdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyxcbiAgICAgIHtcbiAgICAgICAgaGFuZGxlcjogKCk6IFJhd1ZhbHVlID0+IHtcbiAgICAgICAgICBjb25zdCB3b3JrZmxvd1R5cGUgPSB0aGlzLmluZm8ud29ya2Zsb3dUeXBlO1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5RGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlIYW5kbGVycy5lbnRyaWVzKCkpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGNvbnN0IHNpZ25hbERlZmluaXRpb25zID0gQXJyYXkuZnJvbSh0aGlzLnNpZ25hbEhhbmRsZXJzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWx1ZS5kZXNjcmlwdGlvbixcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlRGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKHRoaXMudXBkYXRlSGFuZGxlcnMuZW50cmllcygpKS5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHZhbHVlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFJhd1ZhbHVlPHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KHtcbiAgICAgICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICAgICAgdHlwZTogd29ya2Zsb3dUeXBlLFxuICAgICAgICAgICAgICBxdWVyeURlZmluaXRpb25zLFxuICAgICAgICAgICAgICBzaWduYWxEZWZpbml0aW9ucyxcbiAgICAgICAgICAgICAgdXBkYXRlRGVmaW5pdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VycmVudERldGFpbHM6IHRoaXMuY3VycmVudERldGFpbHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUmV0dXJucyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3b3JrZmxvdy4nLFxuICAgICAgfSxcbiAgICBdLFxuICBdKTtcblxuICAvKipcbiAgICogTG9hZGVkIGluIHtAbGluayBpbml0UnVudGltZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnM6IFJlcXVpcmVkPFdvcmtmbG93SW50ZXJjZXB0b3JzPiA9IHtcbiAgICBpbmJvdW5kOiBbXSxcbiAgICBvdXRib3VuZDogW10sXG4gICAgaW50ZXJuYWxzOiBbXSxcbiAgfTtcblxuICAvKipcbiAgICogQnVmZmVyIHRoYXQgc3RvcmVzIGFsbCBnZW5lcmF0ZWQgY29tbWFuZHMsIHJlc2V0IGFmdGVyIGVhY2ggYWN0aXZhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbW1hbmRzOiBjb3Jlc2RrLndvcmtmbG93X2NvbW1hbmRzLklXb3JrZmxvd0NvbW1hbmRbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTdG9yZXMgYWxsIHtAbGluayBjb25kaXRpb259cyB0aGF0IGhhdmVuJ3QgYmVlbiB1bmJsb2NrZWQgeWV0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tlZENvbmRpdGlvbnMgPSBuZXcgTWFwPG51bWJlciwgQ29uZGl0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBJcyB0aGlzIFdvcmtmbG93IGNvbXBsZXRlZD9cbiAgICpcbiAgICogQSBXb3JrZmxvdyB3aWxsIGJlIGNvbnNpZGVyZWQgY29tcGxldGVkIGlmIGl0IGdlbmVyYXRlcyBhIGNvbW1hbmQgdGhhdCB0aGVcbiAgICogc3lzdGVtIGNvbnNpZGVycyBhcyBhIGZpbmFsIFdvcmtmbG93IGNvbW1hbmQgKGUuZy5cbiAgICogY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbiBvciBmYWlsV29ya2Zsb3dFeGVjdXRpb24pLlxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXYXMgdGhpcyBXb3JrZmxvdyBjYW5jZWxsZWQ/XG4gICAqL1xuICBwcm90ZWN0ZWQgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXh0IChpbmNyZW1lbnRhbCkgc2VxdWVuY2UgdG8gYXNzaWduIHdoZW4gZ2VuZXJhdGluZyBjb21wbGV0YWJsZSBjb21tYW5kc1xuICAgKi9cbiAgcHVibGljIG5leHRTZXFzID0ge1xuICAgIHRpbWVyOiAxLFxuICAgIGFjdGl2aXR5OiAxLFxuICAgIGNoaWxkV29ya2Zsb3c6IDEsXG4gICAgc2lnbmFsV29ya2Zsb3c6IDEsXG4gICAgY2FuY2VsV29ya2Zsb3c6IDEsXG4gICAgY29uZGl0aW9uOiAxLFxuICAgIG5leHVzT3BlcmF0aW9uOiAxLFxuICAgIC8vIFVzZWQgaW50ZXJuYWxseSB0byBrZWVwIHRyYWNrIG9mIGFjdGl2ZSBzdGFjayB0cmFjZXNcbiAgICBzdGFjazogMSxcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBpcyBzZXQgZXZlcnkgdGltZSB0aGUgd29ya2Zsb3cgZXhlY3V0ZXMgYW4gYWN0aXZhdGlvblxuICAgKiBNYXkgYmUgYWNjZXNzZWQgYW5kIG1vZGlmaWVkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBub3c6IG51bWJlcjtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IFdvcmtmbG93LCBpbml0aWFsaXplZCB3aGVuIGEgV29ya2Zsb3cgaXMgc3RhcnRlZFxuICAgKi9cbiAgcHVibGljIHdvcmtmbG93PzogV29ya2Zsb3cgfCBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT47XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93XG4gICAqIE1heSBiZSBhY2Nlc3NlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGluZm86IFdvcmtmbG93SW5mbztcblxuICAvKipcbiAgICogQSBkZXRlcm1pbmlzdGljIFJORywgdXNlZCBieSB0aGUgaXNvbGF0ZSdzIG92ZXJyaWRkZW4gTWF0aC5yYW5kb21cbiAgICovXG4gIHB1YmxpYyByYW5kb206IFJORztcblxuICBwdWJsaWMgcGF5bG9hZENvbnZlcnRlcjogUGF5bG9hZENvbnZlcnRlciA9IGRlZmF1bHRQYXlsb2FkQ29udmVydGVyO1xuICBwdWJsaWMgZmFpbHVyZUNvbnZlcnRlcjogRmFpbHVyZUNvbnZlcnRlciA9IGRlZmF1bHRGYWlsdXJlQ29udmVydGVyO1xuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHdlIGtub3cgdGhlIHN0YXR1cyBvZiBmb3IgdGhpcyB3b3JrZmxvdywgYXMgaW4ge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duUHJlc2VudFBhdGNoZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGF0Y2hlcyB3ZSBzZW50IHRvIGNvcmUge0BsaW5rIHBhdGNoZWR9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbnRQYXRjaGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBrbm93bkZsYWdzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgc2RrVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQnVmZmVyZWQgc2luayBjYWxscyBwZXIgYWN0aXZhdGlvblxuICAgKi9cbiAgc2lua0NhbGxzID0gQXJyYXk8U2lua0NhbGw+KCk7XG5cbiAgLyoqXG4gICAqIEEgbmFub3NlY29uZCByZXNvbHV0aW9uIHRpbWUgZnVuY3Rpb24sIGV4dGVybmFsbHkgaW5qZWN0ZWQuIFRoaXMgaXMgdXNlZCB0b1xuICAgKiBwcmVjaXNlbHkgc29ydCBsb2dzIGVudHJpZXMgZW1pdHRlZCBmcm9tIHRoZSBXb3JrZmxvdyBDb250ZXh0IHZzIHRob3NlIGVtaXR0ZWRcbiAgICogZnJvbSBvdGhlciBzb3VyY2VzIChlLmcuIG1haW4gdGhyZWFkLCBDb3JlLCBldGMpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdldFRpbWVPZkRheTogKCkgPT4gYmlnaW50O1xuXG4gIHB1YmxpYyByZWFkb25seSByZWdpc3RlcmVkQWN0aXZpdHlOYW1lczogU2V0PHN0cmluZz47XG5cbiAgcHVibGljIGN1cnJlbnREZXRhaWxzOiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgdmVyc2lvbmluZ0JlaGF2aW9yPzogVmVyc2lvbmluZ0JlaGF2aW9yO1xuICBwdWJsaWMgd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcj86ICgpID0+IFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93U2FuZGJveERlc3RydWN0b3JzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdGFja1RyYWNlc0VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGluZm8sXG4gICAgbm93LFxuICAgIHNob3dTdGFja1RyYWNlU291cmNlcyxcbiAgICBzb3VyY2VNYXAsXG4gICAgZ2V0VGltZU9mRGF5LFxuICAgIHJhbmRvbW5lc3NTZWVkLFxuICAgIHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLFxuICAgIHN0YWNrVHJhY2VzRW5hYmxlZCxcbiAgfTogV29ya2Zsb3dDcmVhdGVPcHRpb25zSW50ZXJuYWwpIHtcbiAgICB0aGlzLmdldFRpbWVPZkRheSA9IGdldFRpbWVPZkRheTtcbiAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIHRoaXMubm93ID0gbm93O1xuICAgIHRoaXMuc2hvd1N0YWNrVHJhY2VTb3VyY2VzID0gc2hvd1N0YWNrVHJhY2VTb3VyY2VzO1xuICAgIHRoaXMuc291cmNlTWFwID0gc291cmNlTWFwO1xuICAgIHRoaXMucmFuZG9tID0gYWxlYShyYW5kb21uZXNzU2VlZCk7XG4gICAgdGhpcy5yZWdpc3RlcmVkQWN0aXZpdHlOYW1lcyA9IHJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzO1xuICAgIHRoaXMuc3RhY2tUcmFjZXNFbmFibGVkID0gc3RhY2tUcmFjZXNFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBtdXRhdGVXb3JrZmxvd0luZm8oZm46IChpbmZvOiBXb3JrZmxvd0luZm8pID0+IFdvcmtmbG93SW5mbyk6IHZvaWQge1xuICAgIHRoaXMuaW5mbyA9IGZuKHRoaXMuaW5mbyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U3RhY2tUcmFjZXMoKTogU3RhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrVHJhY2VzRW5hYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdXb3JrZmxvdyBzdGFjayB0cmFjZXMgYXJlIG5vdCBlbmFibGVkIG9uIHRoaXMgd29ya2VyJyk7XG4gICAgfVxuICAgIGNvbnN0IHsgY2hpbGRUb1BhcmVudCwgcHJvbWlzZVRvU3RhY2sgfSA9IHRoaXMucHJvbWlzZVN0YWNrU3RvcmU7XG4gICAgY29uc3QgaW50ZXJuYWxOb2RlcyA9IFsuLi5jaGlsZFRvUGFyZW50LnZhbHVlcygpXS5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgZm9yIChjb25zdCBwIG9mIGN1cnIpIHtcbiAgICAgICAgYWNjLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IFNldCgpKTtcbiAgICBjb25zdCBzdGFja3MgPSBuZXcgTWFwPHN0cmluZywgU3RhY2s+KCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZFRvUGFyZW50LmtleXMoKSkge1xuICAgICAgaWYgKCFpbnRlcm5hbE5vZGVzLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBwcm9taXNlVG9TdGFjay5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAoIXN0YWNrIHx8ICFzdGFjay5mb3JtYXR0ZWQpIGNvbnRpbnVlO1xuICAgICAgICBzdGFja3Muc2V0KHN0YWNrLmZvcm1hdHRlZCwgc3RhY2spO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3QgMTAwJSBzdXJlIHdoZXJlIHRoaXMgY29tZXMgZnJvbSwganVzdCBmaWx0ZXIgaXQgb3V0XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pJyk7XG4gICAgc3RhY2tzLmRlbGV0ZSgnICAgIGF0IFByb21pc2UudGhlbiAoPGFub255bW91cz4pXFxuJyk7XG4gICAgcmV0dXJuIFsuLi5zdGFja3NdLm1hcCgoW18sIHN0YWNrXSkgPT4gc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBnZXRBbmRSZXNldFNpbmtDYWxscygpOiBTaW5rQ2FsbFtdIHtcbiAgICBjb25zdCB7IHNpbmtDYWxscyB9ID0gdGhpcztcbiAgICB0aGlzLnNpbmtDYWxscyA9IFtdO1xuICAgIHJldHVybiBzaW5rQ2FsbHM7XG4gIH1cblxuICAvKipcbiAgICogQnVmZmVyIGEgV29ya2Zsb3cgY29tbWFuZCB0byBiZSBjb2xsZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBhY3RpdmF0aW9uLlxuICAgKlxuICAgKiBQcmV2ZW50cyBjb21tYW5kcyBmcm9tIGJlaW5nIGFkZGVkIGFmdGVyIFdvcmtmbG93IGNvbXBsZXRpb24uXG4gICAqL1xuICBwdXNoQ29tbWFuZChjbWQ6IGNvcmVzZGsud29ya2Zsb3dfY29tbWFuZHMuSVdvcmtmbG93Q29tbWFuZCwgY29tcGxldGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZHMucHVzaChjbWQpO1xuICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBBY3RpdmF0aW9uQ29tcGxldGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbW1hbmRzOiB0aGlzLmNvbW1hbmRzLnNwbGljZSgwKSxcbiAgICAgIHVzZWRJbnRlcm5hbEZsYWdzOiBbLi4udGhpcy5rbm93bkZsYWdzXSxcbiAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydFdvcmtmbG93TmV4dEhhbmRsZXIoeyBhcmdzIH06IFdvcmtmbG93RXhlY3V0ZUlucHV0KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IHdvcmtmbG93IH0gPSB0aGlzO1xuICAgIGlmICh3b3JrZmxvdyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IHVuaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHdvcmtmbG93KC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0V29ya2Zsb3coYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklJbml0aWFsaXplV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyh0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kLCAnZXhlY3V0ZScsIHRoaXMuc3RhcnRXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuXG4gICAgdW50cmFja1Byb21pc2UoXG4gICAgICBleGVjdXRlV2l0aExpZmVjeWNsZUxvZ2dpbmcoKCkgPT5cbiAgICAgICAgZXhlY3V0ZSh7XG4gICAgICAgICAgaGVhZGVyczogYWN0aXZhdGlvbi5oZWFkZXJzID8/IHt9LFxuICAgICAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMpLFxuICAgICAgICB9KVxuICAgICAgKS50aGVuKHRoaXMuY29tcGxldGVXb3JrZmxvdy5iaW5kKHRoaXMpLCB0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZS5iaW5kKHRoaXMpKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JSW5pdGlhbGl6ZVdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBjb250aW51ZWRGYWlsdXJlLCBsYXN0Q29tcGxldGlvblJlc3VsdCwgbWVtbywgc2VhcmNoQXR0cmlidXRlcyB9ID0gYWN0aXZhdGlvbjtcblxuICAgIC8vIE1vc3QgdGhpbmdzIHJlbGF0ZWQgdG8gaW5pdGlhbGl6YXRpb24gaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBpbiB0aGUgY29uc3RydWN0b3JcbiAgICB0aGlzLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbykgPT4gKHtcbiAgICAgIC4uLmluZm8sXG5cbiAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IGRlY29kZVNlYXJjaEF0dHJpYnV0ZXMoc2VhcmNoQXR0cmlidXRlcz8uaW5kZXhlZEZpZWxkcyksXG4gICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXM6IGRlY29kZVR5cGVkU2VhcmNoQXR0cmlidXRlcyhzZWFyY2hBdHRyaWJ1dGVzPy5pbmRleGVkRmllbGRzKSxcblxuICAgICAgbWVtbzogbWFwRnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgbWVtbz8uZmllbGRzKSxcbiAgICAgIGxhc3RSZXN1bHQ6IGZyb21QYXlsb2Fkc0F0SW5kZXgodGhpcy5wYXlsb2FkQ29udmVydGVyLCAwLCBsYXN0Q29tcGxldGlvblJlc3VsdD8ucGF5bG9hZHMpLFxuICAgICAgbGFzdEZhaWx1cmU6XG4gICAgICAgIGNvbnRpbnVlZEZhaWx1cmUgIT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGNvbnRpbnVlZEZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlcilcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG4gICAgaWYgKHRoaXMud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc0dldHRlcikge1xuICAgICAgdGhpcy52ZXJzaW9uaW5nQmVoYXZpb3IgPSB0aGlzLndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNHZXR0ZXIoKS52ZXJzaW9uaW5nQmVoYXZpb3I7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbmNlbFdvcmtmbG93KF9hY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUNhbmNlbFdvcmtmbG93KTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMucm9vdFNjb3BlLmNhbmNlbCgpO1xuICB9XG5cbiAgcHVibGljIGZpcmVUaW1lcihhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUZpcmVUaW1lcik6IHZvaWQge1xuICAgIC8vIFRpbWVycyBhcmUgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlaXIgY29tcGxldGlvbiBtaWdodCBub3QgYmUgaW4gV29ya2Zsb3cgc3RhdGUsXG4gICAgLy8gdGhpcyBpcyBkdWUgdG8gaW1tZWRpYXRlIHRpbWVyIGNhbmNlbGxhdGlvbiB0aGF0IGRvZXNuJ3QgZ28gd2FpdCBmb3IgQ29yZS5cbiAgICBjb25zdCBjb21wbGV0aW9uID0gdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCd0aW1lcicsIGdldFNlcShhY3RpdmF0aW9uKSk7XG4gICAgY29tcGxldGlvbj8ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVBY3Rpdml0eShhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVBY3Rpdml0eSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQWN0aXZpdHkgYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignYWN0aXZpdHknLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlZCA9IGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXRlZC5yZXN1bHQgPyB0aGlzLnBheWxvYWRDb252ZXJ0ZXIuZnJvbVBheWxvYWQoY29tcGxldGVkLnJlc3VsdCkgOiB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZmFpbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5jYW5jZWxsZWQpIHtcbiAgICAgIGNvbnN0IHsgZmFpbHVyZSB9ID0gYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkO1xuICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgY2FuY2VsbGVkIHJlc3VsdCB3aXRoIG5vIGZhaWx1cmUgYXR0cmlidXRlJyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihmYWlsdXJlKSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdC5iYWNrb2ZmKSB7XG4gICAgICByZWplY3QobmV3IExvY2FsQWN0aXZpdHlEb0JhY2tvZmYoYWN0aXZhdGlvbi5yZXN1bHQuYmFja29mZikpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0KFxuICAgIGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb25TdGFydFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd1N0YXJ0JywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5zdWNjZWVkZWQpIHtcbiAgICAgIGlmICghYWN0aXZhdGlvbi5zdWNjZWVkZWQucnVuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IFJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uU3RhcnQgd2l0aCBubyBydW5JZCcpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShhY3RpdmF0aW9uLnN1Y2NlZWRlZC5ydW5JZCk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLmZhaWxlZCkge1xuICAgICAgaWYgKGRlY29kZVN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlKGFjdGl2YXRpb24uZmFpbGVkLmNhdXNlKSAhPT0gJ1dPUktGTE9XX0FMUkVBRFlfRVhJU1RTJykge1xuICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ0dvdCB1bmtub3duIFN0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbkZhaWxlZENhdXNlJyk7XG4gICAgICB9XG4gICAgICBpZiAoIShhY3RpdmF0aW9uLnNlcSAmJiBhY3RpdmF0aW9uLmZhaWxlZC53b3JrZmxvd0lkICYmIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93VHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhdHRyaWJ1dGVzIGluIGFjdGl2YXRpb24gam9iJyk7XG4gICAgICB9XG4gICAgICByZWplY3QoXG4gICAgICAgIG5ldyBXb3JrZmxvd0V4ZWN1dGlvbkFscmVhZHlTdGFydGVkRXJyb3IoXG4gICAgICAgICAgJ1dvcmtmbG93IGV4ZWN1dGlvbiBhbHJlYWR5IHN0YXJ0ZWQnLFxuICAgICAgICAgIGFjdGl2YXRpb24uZmFpbGVkLndvcmtmbG93SWQsXG4gICAgICAgICAgYWN0aXZhdGlvbi5mYWlsZWQud29ya2Zsb3dUeXBlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLmNhbmNlbGxlZCkge1xuICAgICAgaWYgKCFhY3RpdmF0aW9uLmNhbmNlbGxlZC5mYWlsdXJlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBubyBmYWlsdXJlIGluIGNhbmNlbGxlZCB2YXJpYW50Jyk7XG4gICAgICB9XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmNhbmNlbGxlZC5mYWlsdXJlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0dvdCBSZXNvbHZlQ2hpbGRXb3JrZmxvd0V4ZWN1dGlvblN0YXJ0IHdpdGggbm8gc3RhdHVzJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVDaGlsZFdvcmtmbG93RXhlY3V0aW9uKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2YXRpb24ucmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgUmVzb2x2ZUNoaWxkV29ya2Zsb3dFeGVjdXRpb24gYWN0aXZhdGlvbiB3aXRoIG5vIHJlc3VsdCcpO1xuICAgIH1cbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2hpbGRXb3JrZmxvd0NvbXBsZXRlJywgZ2V0U2VxKGFjdGl2YXRpb24pKTtcbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY29tcGxldGVkKSB7XG4gICAgICBjb25zdCBjb21wbGV0ZWQgPSBhY3RpdmF0aW9uLnJlc3VsdC5jb21wbGV0ZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBjb21wbGV0ZWQucmVzdWx0ID8gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGNvbXBsZXRlZC5yZXN1bHQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuZmFpbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmZhaWxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGZhaWxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSkpO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCB7IGZhaWx1cmUgfSA9IGFjdGl2YXRpb24ucmVzdWx0LmNhbmNlbGxlZDtcbiAgICAgIGlmIChmYWlsdXJlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGNhbmNlbGxlZCByZXN1bHQgd2l0aCBubyBmYWlsdXJlIGF0dHJpYnV0ZScpO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHRoaXMuZmFpbHVyZVRvRXJyb3IoZmFpbHVyZSkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlTmV4dXNPcGVyYXRpb25TdGFydChhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0KTogdm9pZCB7XG4gICAgY29uc3Qgc2VxID0gZ2V0U2VxKGFjdGl2YXRpb24pO1xuICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvblN0YXJ0Jywgc2VxKTtcblxuICAgIGlmICghYWN0aXZhdGlvbi5mYWlsZWQpIHtcbiAgICAgIGNvbnN0IGNvbXBsZXRlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvbkNvbXBsZXRlLnNldChzZXEsIHtcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlUHJvbWlzZSk7XG4gICAgICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG5cbiAgICAgIHJlc29sdmUoeyB0b2tlbjogYWN0aXZhdGlvbi5vcGVyYXRpb25Ub2tlbiEsIHJlc3VsdDogY29tcGxldGVQcm9taXNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3QodGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLmZhaWxlZCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlTmV4dXNPcGVyYXRpb24oYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklSZXNvbHZlTmV4dXNPcGVyYXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBzZXEgPSBnZXRTZXEoYWN0aXZhdGlvbik7XG5cbiAgICBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LmNvbXBsZXRlZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXlsb2FkQ29udmVydGVyLmZyb21QYXlsb2FkKGFjdGl2YXRpb24ucmVzdWx0LmNvbXBsZXRlZCk7XG5cbiAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGZvciBSZXNvbHZlTmV4dXNPcGVyYXRpb24gdG8gYmUgcmVjZWl2ZWQgd2l0aG91dCBhIHByaW9yIFJlc29sdmVOZXh1c09wZXJhdGlvblN0YXJ0LFxuICAgICAgLy8gZS5nLiBiZWNhdXNlIHRoZSBoYW5kbGVyIGNvbXBsZXRlZCB0aGUgT3BlcmF0aW9uIHN5bmNocm9ub3VzbHkuXG4gICAgICBjb25zdCBzdGFydENvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24oJ25leHVzT3BlcmF0aW9uU3RhcnQnLCBzZXEpO1xuICAgICAgaWYgKHN0YXJ0Q29tcGxldGlvbikge1xuICAgICAgICBzdGFydENvbXBsZXRpb24ucmVzb2x2ZSh7IHJlc3VsdDogUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlcnI6IEVycm9yO1xuICAgICAgaWYgKGFjdGl2YXRpb24ucmVzdWx0Py5mYWlsZWQpIHtcbiAgICAgICAgZXJyID0gdGhpcy5mYWlsdXJlVG9FcnJvcihhY3RpdmF0aW9uLnJlc3VsdC5mYWlsZWQpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmF0aW9uLnJlc3VsdD8uY2FuY2VsbGVkKSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQuY2FuY2VsbGVkKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aXZhdGlvbi5yZXN1bHQ/LnRpbWVkT3V0KSB7XG4gICAgICAgIGVyciA9IHRoaXMuZmFpbHVyZVRvRXJyb3IoYWN0aXZhdGlvbi5yZXN1bHQudGltZWRPdXQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21wbGV0aW9uID1cbiAgICAgICAgdGhpcy5tYXliZUNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvblN0YXJ0Jywgc2VxKSA/P1xuICAgICAgICB0aGlzLmNvbnN1bWVDb21wbGV0aW9uKCduZXh1c09wZXJhdGlvbkNvbXBsZXRlJywgc2VxKTtcbiAgICAgIGNvbXBsZXRpb24ucmVqZWN0KGVyciEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEludGVudGlvbmFsbHkgbm9uLWFzeW5jIGZ1bmN0aW9uIHNvIHRoaXMgaGFuZGxlciBkb2Vzbid0IHNob3cgdXAgaW4gdGhlIHN0YWNrIHRyYWNlXG4gIHByb3RlY3RlZCBxdWVyeVdvcmtmbG93TmV4dEhhbmRsZXIoeyBxdWVyeU5hbWUsIGFyZ3MgfTogUXVlcnlJbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGxldCBmbiA9IHRoaXMucXVlcnlIYW5kbGVycy5nZXQocXVlcnlOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm4gPSB0aGlzLmRlZmF1bHRRdWVyeUhhbmRsZXIuYmluZCh1bmRlZmluZWQsIHF1ZXJ5TmFtZSk7XG4gICAgfVxuICAgIC8vIE5vIGhhbmRsZXIgb3IgZGVmYXVsdCByZWdpc3RlcmVkLCBmYWlsLlxuICAgIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBrbm93blF1ZXJ5VHlwZXMgPSBbLi4udGhpcy5xdWVyeUhhbmRsZXJzLmtleXMoKV0uam9pbignICcpO1xuICAgICAgLy8gRmFpbCB0aGUgcXVlcnlcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgIGBXb3JrZmxvdyBkaWQgbm90IHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgJHtxdWVyeU5hbWV9LiBSZWdpc3RlcmVkIHF1ZXJpZXM6IFske2tub3duUXVlcnlUeXBlc31dYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBFeGVjdXRlIGhhbmRsZXIuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGZuKC4uLmFyZ3MpO1xuICAgICAgaWYgKHJldCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBEZXRlcm1pbmlzbVZpb2xhdGlvbkVycm9yKCdRdWVyeSBoYW5kbGVycyBzaG91bGQgbm90IHJldHVybiBhIFByb21pc2UnKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcXVlcnlXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVF1ZXJ5V29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHF1ZXJ5VHlwZSwgcXVlcnlJZCwgaGVhZGVycyB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIShxdWVyeVR5cGUgJiYgcXVlcnlJZCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01pc3NpbmcgcXVlcnkgYWN0aXZhdGlvbiBhdHRyaWJ1dGVzJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgcXVlcnkgaGFzIF9fdGVtcG9yYWxfIHByZWZpeCBidXQgbm8gaGFuZGxlciBleGlzdHMsIHRocm93IGVycm9yXG4gICAgaWYgKHF1ZXJ5VHlwZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiYgIXRoaXMucXVlcnlIYW5kbGVycy5oYXMocXVlcnlUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHVzZSBxdWVyeSBuYW1lOiAnJHtxdWVyeVR5cGV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYCk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpbnRlcmNlcHRvcnMgaWYgaXQncyBhbiBpbnRlcm5hbCBxdWVyeS5cbiAgICBjb25zdCBpc0ludGVybmFsUXVlcnkgPVxuICAgICAgcXVlcnlUeXBlLnN0YXJ0c1dpdGgoVEVNUE9SQUxfUkVTRVJWRURfUFJFRklYKSB8fFxuICAgICAgcXVlcnlUeXBlID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBxdWVyeVR5cGUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUU7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gaXNJbnRlcm5hbFF1ZXJ5ID8gW10gOiB0aGlzLmludGVyY2VwdG9ycy5pbmJvdW5kO1xuICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGludGVyY2VwdG9ycywgJ2hhbmRsZVF1ZXJ5JywgdGhpcy5xdWVyeVdvcmtmbG93TmV4dEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgZXhlY3V0ZSh7XG4gICAgICBxdWVyeU5hbWU6IHF1ZXJ5VHlwZSxcbiAgICAgIGFyZ3M6IGFycmF5RnJvbVBheWxvYWRzKHRoaXMucGF5bG9hZENvbnZlcnRlciwgYWN0aXZhdGlvbi5hcmd1bWVudHMpLFxuICAgICAgcXVlcnlJZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSkudGhlbihcbiAgICAgIChyZXN1bHQpID0+IHRoaXMuY29tcGxldGVRdWVyeShxdWVyeUlkLCByZXN1bHQpLFxuICAgICAgKHJlYXNvbikgPT4gdGhpcy5mYWlsUXVlcnkocXVlcnlJZCwgcmVhc29uKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZG9VcGRhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklEb1VwZGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHsgaWQ6IHVwZGF0ZUlkLCBwcm90b2NvbEluc3RhbmNlSWQsIG5hbWUsIGhlYWRlcnMsIHJ1blZhbGlkYXRvciB9ID0gYWN0aXZhdGlvbjtcbiAgICBpZiAoIXVwZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIGlkJyk7XG4gICAgfVxuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHVwZGF0ZSBuYW1lJyk7XG4gICAgfVxuICAgIGlmICghcHJvdG9jb2xJbnN0YW5jZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIGFjdGl2YXRpb24gdXBkYXRlIHByb3RvY29sSW5zdGFuY2VJZCcpO1xuICAgIH1cblxuICAgIC8vIElmIHVwZGF0ZSBoYXMgX190ZW1wb3JhbF8gcHJlZml4IGJ1dCBubyBoYW5kbGVyIGV4aXN0cywgdGhyb3cgZXJyb3JcbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgJiYgIXRoaXMudXBkYXRlSGFuZGxlcnMuZ2V0KG5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3QgdXNlIHVwZGF0ZSBuYW1lOiAnJHtuYW1lfScsIHdpdGggcmVzZXJ2ZWQgcHJlZml4OiAnJHtURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVh9J2ApO1xuICAgIH1cblxuICAgIC8vIFNraXAgaW50ZXJjZXB0b3JzIGlmIGl0J3MgYW4gaW50ZXJuYWwgdXBkYXRlLlxuICAgIGNvbnN0IGlzSW50ZXJuYWxVcGRhdGUgPVxuICAgICAgbmFtZS5zdGFydHNXaXRoKFRFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWCkgfHxcbiAgICAgIG5hbWUgPT09IFNUQUNLX1RSQUNFX1FVRVJZX05BTUUgfHxcbiAgICAgIG5hbWUgPT09IEVOSEFOQ0VEX1NUQUNLX1RSQUNFX1FVRVJZX05BTUU7XG4gICAgY29uc3QgaW50ZXJjZXB0b3JzID0gaXNJbnRlcm5hbFVwZGF0ZSA/IFtdIDogdGhpcy5pbnRlcmNlcHRvcnMuaW5ib3VuZDtcblxuICAgIGNvbnN0IGVudHJ5ID1cbiAgICAgIHRoaXMudXBkYXRlSGFuZGxlcnMuZ2V0KG5hbWUpID8/XG4gICAgICAodGhpcy5kZWZhdWx0VXBkYXRlSGFuZGxlclxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMuZGVmYXVsdFVwZGF0ZUhhbmRsZXIuYmluZCh1bmRlZmluZWQsIG5hbWUpLFxuICAgICAgICAgICAgdmFsaWRhdG9yOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBEZWZhdWx0IHRvIGEgd2FybmluZyBwb2xpY3kuXG4gICAgICAgICAgICB1bmZpbmlzaGVkUG9saWN5OiBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsKTtcblxuICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gZW50cnkgZnJvbSBlaXRoZXIgc291cmNlLCBidWZmZXIgYW5kIHJldHVyblxuICAgIGlmIChlbnRyeSA9PSBudWxsKSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1ha2VJbnB1dCA9ICgpOiBVcGRhdGVJbnB1dCA9PiAoe1xuICAgICAgdXBkYXRlSWQsXG4gICAgICBhcmdzOiBhcnJheUZyb21QYXlsb2Fkcyh0aGlzLnBheWxvYWRDb252ZXJ0ZXIsIGFjdGl2YXRpb24uaW5wdXQpLFxuICAgICAgbmFtZSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gYmVsb3cgaXMgcmVzcG9uc2libGUgZm9yIHVwaG9sZGluZywgYW5kIGNvbnN0cmFpbmVkXG4gICAgLy8gYnksIHRoZSBmb2xsb3dpbmcgY29udHJhY3Q6XG4gICAgLy9cbiAgICAvLyAxLiBJZiBubyB2YWxpZGF0b3IgaXMgcHJlc2VudCB0aGVuIHZhbGlkYXRpb24gaW50ZXJjZXB0b3JzIHdpbGwgbm90IGJlIHJ1bi5cbiAgICAvL1xuICAgIC8vIDIuIER1cmluZyB2YWxpZGF0aW9uLCBhbnkgZXJyb3IgbXVzdCBmYWlsIHRoZSBVcGRhdGU7IGR1cmluZyB0aGUgVXBkYXRlXG4gICAgLy8gICAgaXRzZWxmLCBUZW1wb3JhbCBlcnJvcnMgZmFpbCB0aGUgVXBkYXRlIHdoZXJlYXMgb3RoZXIgZXJyb3JzIGZhaWwgdGhlXG4gICAgLy8gICAgYWN0aXZhdGlvbi5cbiAgICAvL1xuICAgIC8vIDMuIFRoZSBoYW5kbGVyIG11c3Qgbm90IHNlZSBhbnkgbXV0YXRpb25zIG9mIHRoZSBhcmd1bWVudHMgbWFkZSBieSB0aGVcbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA0LiBBbnkgZXJyb3Igd2hlbiBkZWNvZGluZy9kZXNlcmlhbGl6aW5nIGlucHV0IG11c3QgYmUgY2F1Z2h0IGFuZCByZXN1bHRcbiAgICAvLyAgICBpbiByZWplY3Rpb24gb2YgdGhlIFVwZGF0ZSBiZWZvcmUgaXQgaXMgYWNjZXB0ZWQsIGV2ZW4gaWYgdGhlcmUgaXMgbm9cbiAgICAvLyAgICB2YWxpZGF0b3IuXG4gICAgLy9cbiAgICAvLyA1LiBUaGUgaW5pdGlhbCBzeW5jaHJvbm91cyBwb3J0aW9uIG9mIHRoZSAoYXN5bmMpIFVwZGF0ZSBoYW5kbGVyIHNob3VsZFxuICAgIC8vICAgIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSAoc3luYykgdmFsaWRhdG9yIGNvbXBsZXRlcyBzdWNoIHRoYXQgdGhlcmUgaXNcbiAgICAvLyAgICBtaW5pbWFsIG9wcG9ydHVuaXR5IGZvciBhIGRpZmZlcmVudCBjb25jdXJyZW50IHRhc2sgdG8gYmUgc2NoZWR1bGVkXG4gICAgLy8gICAgYmV0d2VlbiB0aGVtLlxuICAgIC8vXG4gICAgLy8gNi4gVGhlIHN0YWNrIHRyYWNlIHZpZXcgcHJvdmlkZWQgaW4gdGhlIFRlbXBvcmFsIFVJIG11c3Qgbm90IGJlIHBvbGx1dGVkXG4gICAgLy8gICAgYnkgcHJvbWlzZXMgdGhhdCBkbyBub3QgZGVyaXZlIGZyb20gdXNlciBjb2RlLiBUaGlzIGltcGxpZXMgdGhhdFxuICAgIC8vICAgIGFzeW5jL2F3YWl0IHN5bnRheCBtYXkgbm90IGJlIHVzZWQuXG4gICAgLy9cbiAgICAvLyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBkZWxpYmVyYXRlbHkgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGJlbG93LlxuICAgIC8vIFRoZXNlIGFyZSBjYXVnaHQgZWxzZXdoZXJlIGFuZCBmYWlsIHRoZSBjb3JyZXNwb25kaW5nIGFjdGl2YXRpb24uXG4gICAgY29uc3QgZG9VcGRhdGVJbXBsID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGlucHV0OiBVcGRhdGVJbnB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChydW5WYWxpZGF0b3IgJiYgZW50cnkudmFsaWRhdG9yKSB7XG4gICAgICAgICAgLy8gVGVtcG9yYXJpbHkgbWFyayBhcyBub3QgcmVwbGF5aW5nIGhpc3RvcnkgZXZlbnRzIGR1cmluZyB2YWxpZGF0b3IgZXhlY3V0aW9uXG4gICAgICAgICAgLy8gc28gdGhhdCBsb2dnaW5nIGlzIHBlcm1pdHRlZC4gVmFsaWRhdG9ycyBhcmUgbGl2ZSByZWFkLW9ubHkgb3BlcmF0aW9ucy5cbiAgICAgICAgICBjb25zdCB3YXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzID0gdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZ0hpc3RvcnlFdmVudHM7XG4gICAgICAgICAgdGhpcy5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm8pID0+ICh7XG4gICAgICAgICAgICAuLi5pbmZvLFxuICAgICAgICAgICAgdW5zYWZlOiB7IC4uLmluZm8udW5zYWZlLCBpc1JlcGxheWluZ0hpc3RvcnlFdmVudHM6IGZhbHNlIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgICAgICAgICAgIGludGVyY2VwdG9ycyxcbiAgICAgICAgICAgICAgJ3ZhbGlkYXRlVXBkYXRlJyxcbiAgICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkudmFsaWRhdG9yKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhbGlkYXRlKG1ha2VJbnB1dCgpKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5tdXRhdGVXb3JrZmxvd0luZm8oKGluZm8pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmluZm8sXG4gICAgICAgICAgICAgIHVuc2FmZTogeyAuLi5pbmZvLnVuc2FmZSwgaXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzOiB3YXNSZXBsYXlpbmdIaXN0b3J5RXZlbnRzIH0sXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gbWFrZUlucHV0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnJlamVjdFVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hY2NlcHRVcGRhdGUocHJvdG9jb2xJbnN0YW5jZUlkKTtcbiAgICAgIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgICAgICBpbnRlcmNlcHRvcnMsXG4gICAgICAgICdoYW5kbGVVcGRhdGUnLFxuICAgICAgICB0aGlzLnVwZGF0ZU5leHRIYW5kbGVyLmJpbmQodGhpcywgZW50cnkuaGFuZGxlcilcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHVuZmluaXNoZWRQb2xpY3kgfSA9IGVudHJ5O1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5zZXQodXBkYXRlSWQsIHsgbmFtZSwgdW5maW5pc2hlZFBvbGljeSwgaWQ6IHVwZGF0ZUlkIH0pO1xuICAgICAgY29uc3QgcmVzID0gZXhlY3V0ZShpbnB1dClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4gdGhpcy5jb21wbGV0ZVVwZGF0ZShwcm90b2NvbEluc3RhbmNlSWQsIHJlc3VsdCkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUZW1wb3JhbEZhaWx1cmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZCwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVdvcmtmbG93RmFpbHVyZShlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLmRlbGV0ZSh1cGRhdGVJZCkpO1xuICAgICAgdW50cmFja1Byb21pc2UocmVzKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICB1bnRyYWNrUHJvbWlzZShVcGRhdGVTY29wZS51cGRhdGVXaXRoSW5mbyh1cGRhdGVJZCwgbmFtZSwgZG9VcGRhdGVJbXBsKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdXBkYXRlTmV4dEhhbmRsZXIoaGFuZGxlcjogV29ya2Zsb3dVcGRhdGVUeXBlLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXdhaXQgaGFuZGxlciguLi5hcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVVwZGF0ZU5leHRIYW5kbGVyKHZhbGlkYXRvcjogV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkLCB7IGFyZ3MgfTogVXBkYXRlSW5wdXQpOiB2b2lkIHtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICB2YWxpZGF0b3IoLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkVXBkYXRlcyA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzO1xuICAgIHdoaWxlIChidWZmZXJlZFVwZGF0ZXMubGVuZ3RoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciwgc28gYWxsIHVwZGF0ZXMgYXJlIGRpc3BhdGNoYWJsZS5cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRVcGRhdGVIYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZSA9IGJ1ZmZlcmVkVXBkYXRlcy5zaGlmdCgpO1xuICAgICAgICAvLyBMb2dpY2FsbHksIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGFzIHdlJ3JlIGluIHRoZSBsb29wLlxuICAgICAgICAvLyBCdXQgVHlwZXNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBzbyB3ZSB1c2UgYSBub24tbnVsbCBhc3NlcnRpb24gKCEpLlxuICAgICAgICB0aGlzLmRvVXBkYXRlKHVwZGF0ZSEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGJ1ZmZlcmVkVXBkYXRlcy5maW5kSW5kZXgoKHVwZGF0ZSkgPT4gdGhpcy51cGRhdGVIYW5kbGVycy5oYXModXBkYXRlLm5hbWUgYXMgc3RyaW5nKSk7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkge1xuICAgICAgICAgIC8vIE5vIGJ1ZmZlcmVkIFVwZGF0ZXMgaGF2ZSBhIGhhbmRsZXIgeWV0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IFt1cGRhdGVdID0gYnVmZmVyZWRVcGRhdGVzLnNwbGljZShmb3VuZEluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5kb1VwZGF0ZSh1cGRhdGUhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk6IHZvaWQge1xuICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkVXBkYXRlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMuYnVmZmVyZWRVcGRhdGVzLnNoaWZ0KCk7XG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHRoaXMucmVqZWN0VXBkYXRlKFxuICAgICAgICAgIHVwZGF0ZS5wcm90b2NvbEluc3RhbmNlSWQhLFxuICAgICAgICAgIEFwcGxpY2F0aW9uRmFpbHVyZS5ub25SZXRyeWFibGUoYE5vIHJlZ2lzdGVyZWQgaGFuZGxlciBmb3IgdXBkYXRlOiAke3VwZGF0ZS5uYW1lfWApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzaWduYWxOYW1lLCBhcmdzIH06IFNpZ25hbElucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8uaGFuZGxlcjtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBhd2FpdCBmbiguLi5hcmdzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdFNpZ25hbEhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKHNpZ25hbE5hbWUsIC4uLmFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoYE5vIHJlZ2lzdGVyZWQgc2lnbmFsIGhhbmRsZXIgZm9yIHNpZ25hbDogJHtzaWduYWxOYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzaWduYWxXb3JrZmxvdyhhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVNpZ25hbFdvcmtmbG93KTogdm9pZCB7XG4gICAgY29uc3QgeyBzaWduYWxOYW1lLCBoZWFkZXJzIH0gPSBhY3RpdmF0aW9uO1xuICAgIGlmICghc2lnbmFsTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWlzc2luZyBhY3RpdmF0aW9uIHNpZ25hbE5hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBzaWduYWwgaGFzIF9fdGVtcG9yYWxfIHByZWZpeCBidXQgbm8gaGFuZGxlciBleGlzdHMsIHRocm93IGVycm9yXG4gICAgaWYgKHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpICYmICF0aGlzLnNpZ25hbEhhbmRsZXJzLmhhcyhzaWduYWxOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYENhbm5vdCB1c2Ugc2lnbmFsIG5hbWU6ICcke3NpZ25hbE5hbWV9Jywgd2l0aCByZXNlcnZlZCBwcmVmaXg6ICcke1RFTVBPUkFMX1JFU0VSVkVEX1BSRUZJWH0nYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGludGVyY2VwdG9ycyBpZiBpdCdzIGFuIGludGVybmFsIHNpZ25hbC5cbiAgICBjb25zdCBpc0ludGVybmFsU2lnbmFsID1cbiAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChURU1QT1JBTF9SRVNFUlZFRF9QUkVGSVgpIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBTVEFDS19UUkFDRV9RVUVSWV9OQU1FIHx8XG4gICAgICBzaWduYWxOYW1lID09PSBFTkhBTkNFRF9TVEFDS19UUkFDRV9RVUVSWV9OQU1FO1xuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGlzSW50ZXJuYWxTaWduYWwgPyBbXSA6IHRoaXMuaW50ZXJjZXB0b3JzLmluYm91bmQ7XG5cbiAgICBpZiAoIXRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbE5hbWUpICYmICF0aGlzLmRlZmF1bHRTaWduYWxIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJ1ZmZlcmVkU2lnbmFscy5wdXNoKGFjdGl2YXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciB0aGVuIHRoZSB1bmZpbmlzaGVkXG4gICAgLy8gcG9saWN5IGlzIFdBUk5fQU5EX0FCQU5ET047IHVzZXJzIGN1cnJlbnRseSBoYXZlIG5vIHdheSB0byBzaWxlbmNlIGFueVxuICAgIC8vIGVuc3Vpbmcgd2FybmluZ3MuXG4gICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9XG4gICAgICB0aGlzLnNpZ25hbEhhbmRsZXJzLmdldChzaWduYWxOYW1lKT8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuXG4gICAgY29uc3Qgc2lnbmFsRXhlY3V0aW9uTnVtID0gdGhpcy5zaWduYWxIYW5kbGVyRXhlY3V0aW9uU2VxKys7XG4gICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5zZXQoc2lnbmFsRXhlY3V0aW9uTnVtLCB7IG5hbWU6IHNpZ25hbE5hbWUsIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3JzLCAnaGFuZGxlU2lnbmFsJywgdGhpcy5zaWduYWxXb3JrZmxvd05leHRIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIGV4ZWN1dGUoe1xuICAgICAgYXJnczogYXJyYXlGcm9tUGF5bG9hZHModGhpcy5wYXlsb2FkQ29udmVydGVyLCBhY3RpdmF0aW9uLmlucHV0KSxcbiAgICAgIHNpZ25hbE5hbWUsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5oYW5kbGVXb3JrZmxvd0ZhaWx1cmUuYmluZCh0aGlzKSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMuaW5Qcm9ncmVzc1NpZ25hbHMuZGVsZXRlKHNpZ25hbEV4ZWN1dGlvbk51bSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcmVkU2lnbmFscyA9IHRoaXMuYnVmZmVyZWRTaWduYWxzO1xuICAgIHdoaWxlIChidWZmZXJlZFNpZ25hbHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5kZWZhdWx0U2lnbmFsSGFuZGxlcikge1xuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmYXVsdCBzaWduYWwgaGFuZGxlciwgc28gYWxsIHNpZ25hbHMgYXJlIGRpc3BhdGNoYWJsZVxuXG4gICAgICAgIHRoaXMuc2lnbmFsV29ya2Zsb3coYnVmZmVyZWRTaWduYWxzLnNoaWZ0KCkhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBidWZmZXJlZFNpZ25hbHMuZmluZEluZGV4KChzaWduYWwpID0+IHRoaXMuc2lnbmFsSGFuZGxlcnMuaGFzKHNpZ25hbC5zaWduYWxOYW1lIGFzIHN0cmluZykpO1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGJyZWFrO1xuICAgICAgICBjb25zdCBbc2lnbmFsXSA9IGJ1ZmZlcmVkU2lnbmFscy5zcGxpY2UoZm91bmRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuc2lnbmFsV29ya2Zsb3coc2lnbmFsISk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVTaWduYWxFeHRlcm5hbFdvcmtmbG93KGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JUmVzb2x2ZVNpZ25hbEV4dGVybmFsV29ya2Zsb3cpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignc2lnbmFsV29ya2Zsb3cnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLmZhaWx1cmUpIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc29sdmVSZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvdyhcbiAgICBhY3RpdmF0aW9uOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSVJlc29sdmVSZXF1ZXN0Q2FuY2VsRXh0ZXJuYWxXb3JrZmxvd1xuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCB9ID0gdGhpcy5jb25zdW1lQ29tcGxldGlvbignY2FuY2VsV29ya2Zsb3cnLCBnZXRTZXEoYWN0aXZhdGlvbikpO1xuICAgIGlmIChhY3RpdmF0aW9uLmZhaWx1cmUpIHtcbiAgICAgIHJlamVjdCh0aGlzLmZhaWx1cmVUb0Vycm9yKGFjdGl2YXRpb24uZmFpbHVyZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgZ2V0V2FybmFibGUgPSAoaGFuZGxlckV4ZWN1dGlvbnM6IEl0ZXJhYmxlPE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uPik6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10gPT4ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oaGFuZGxlckV4ZWN1dGlvbnMpLmZpbHRlcihcbiAgICAgICAgKGV4KSA9PiBleC51bmZpbmlzaGVkUG9saWN5ID09PSBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCB3YXJuYWJsZVVwZGF0ZXMgPSBnZXRXYXJuYWJsZSh0aGlzLmluUHJvZ3Jlc3NVcGRhdGVzLnZhbHVlcygpKTtcbiAgICBpZiAod2FybmFibGVVcGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZy53YXJuKG1ha2VVbmZpbmlzaGVkVXBkYXRlSGFuZGxlck1lc3NhZ2Uod2FybmFibGVVcGRhdGVzKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmFibGVTaWduYWxzID0gZ2V0V2FybmFibGUodGhpcy5pblByb2dyZXNzU2lnbmFscy52YWx1ZXMoKSk7XG4gICAgaWYgKHdhcm5hYmxlU2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cud2FybihtYWtlVW5maW5pc2hlZFNpZ25hbEhhbmRsZXJNZXNzYWdlKHdhcm5hYmxlU2lnbmFscykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSYW5kb21TZWVkKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JVXBkYXRlUmFuZG9tU2VlZCk6IHZvaWQge1xuICAgIGlmICghYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWN0aXZhdGlvbiB3aXRoIHJhbmRvbW5lc3NTZWVkIGF0dHJpYnV0ZScpO1xuICAgIH1cbiAgICB0aGlzLnJhbmRvbSA9IGFsZWEoYWN0aXZhdGlvbi5yYW5kb21uZXNzU2VlZC50b0J5dGVzKCkpO1xuICB9XG5cbiAgcHVibGljIG5vdGlmeUhhc1BhdGNoKGFjdGl2YXRpb246IGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5JTm90aWZ5SGFzUGF0Y2gpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5mby51bnNhZmUuaXNSZXBsYXlpbmcpXG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1VuZXhwZWN0ZWQgbm90aWZ5SGFzUGF0Y2ggam9iIG9uIG5vbi1yZXBsYXkgYWN0aXZhdGlvbicpO1xuICAgIGlmICghYWN0aXZhdGlvbi5wYXRjaElkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3RpZnlIYXNQYXRjaCBtaXNzaW5nIHBhdGNoIGlkJyk7XG4gICAgdGhpcy5rbm93blByZXNlbnRQYXRjaGVzLmFkZChhY3RpdmF0aW9uLnBhdGNoSWQpO1xuICB9XG5cbiAgcHVibGljIHBhdGNoSW50ZXJuYWwocGF0Y2hJZDogc3RyaW5nLCBkZXByZWNhdGVkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud29ya2Zsb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKCdQYXRjaGVzIGNhbm5vdCBiZSB1c2VkIGJlZm9yZSBXb3JrZmxvdyBzdGFydHMnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlUGF0Y2ggPSAhdGhpcy5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyB8fCB0aGlzLmtub3duUHJlc2VudFBhdGNoZXMuaGFzKHBhdGNoSWQpO1xuICAgIC8vIEF2b2lkIHNlbmRpbmcgY29tbWFuZHMgZm9yIHBhdGNoZXMgY29yZSBhbHJlYWR5IGtub3dzIGFib3V0LlxuICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGVuYWJsZXMgZGV2ZWxvcG1lbnQgb2YgYXV0b21hdGljIHBhdGNoaW5nIHRvb2xzLlxuICAgIGlmICh1c2VQYXRjaCAmJiAhdGhpcy5zZW50UGF0Y2hlcy5oYXMocGF0Y2hJZCkpIHtcbiAgICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgICBzZXRQYXRjaE1hcmtlcjogeyBwYXRjaElkLCBkZXByZWNhdGVkIH0sXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VudFBhdGNoZXMuYWRkKHBhdGNoSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlUGF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGVhcmx5IHdoaWxlIGhhbmRsaW5nIGFuIGFjdGl2YXRpb24gdG8gcmVnaXN0ZXIga25vd24gZmxhZ3MuXG4gICAqIE1heSBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSB0aGUgVk0uXG4gICAqL1xuICBwdWJsaWMgYWRkS25vd25GbGFncyhmbGFnczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZsYWcgb2YgZmxhZ3MpIHtcbiAgICAgIGFzc2VydFZhbGlkRmxhZyhmbGFnKTtcbiAgICAgIHRoaXMua25vd25GbGFncy5hZGQoZmxhZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIFNESyBGbGFnIG1heSBiZSBjb25zaWRlcmVkIGFzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IFdvcmtmbG93IFRhc2suXG4gICAqXG4gICAqIFNESyBmbGFncyBwbGF5IGEgcm9sZSBzaW1pbGFyIHRvIHRoZSBgcGF0Y2hlZCgpYCBBUEksIGJ1dCBhcmUgbWVhbnQgZm9yIGludGVybmFsIHVzYWdlIGJ5IHRoZVxuICAgKiBTREsgaXRzZWxmLiBUaGV5IG1ha2UgaXQgcG9zc2libGUgZm9yIHRoZSBTREsgdG8gZXZvbHZlIGl0cyBiZWhhdmlvcnMgb3ZlciB0aW1lLCB3aGlsZSBzdGlsbFxuICAgKiBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggV29ya2Zsb3cgaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IG9sZGVyIFNES3MsIHdpdGhvdXQgY2F1c2luZ1xuICAgKiBkZXRlcm1pbmlzbSB2aW9sYXRpb25zLlxuICAgKlxuICAgKiBNYXkgYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgdGhlIFZNLlxuICAgKi9cbiAgcHVibGljIGhhc0ZsYWcoZmxhZzogU2RrRmxhZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmtub3duRmxhZ3MuaGFzKGZsYWcuaWQpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIElmIG5vdCByZXBsYXlpbmcsIGVuYWJsZSB0aGUgZmxhZyBpZiBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gU2V0dGluZyBhXG4gICAgLy8gZmxhZydzIGRlZmF1bHQgdG8gZmFsc2UgYWxsb3dzIHByb2dyZXNzaXZlIHJvbGxvdXQgb2YgbmV3IGZlYXR1cmUgZmxhZ3MsIHdpdGggdGhlIHBvc3NpYmlsaXR5XG4gICAgLy8gb2YgcmV2ZXJ0aW5nIGJhY2sgdG8gYSB2ZXJzaW9uIG9mIHRoZSBTREsgd2hlcmUgdGhlIGZsYWcgaXMgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgIC8vIEl0IGlzIGFsc28gdXNlZnVsIGZvciB0ZXN0aW5nIHB1cnBvc2UuXG4gICAgaWYgKCF0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuZGVmYXVsdCkge1xuICAgICAgdGhpcy5rbm93bkZsYWdzLmFkZChmbGFnLmlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdoZW4gcmVwbGF5aW5nLCBhIGZsYWcgaXMgY29uc2lkZXJlZCBlbmFibGVkIGlmIGl0IHdhcyBlbmFibGVkIGR1cmluZyB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIG9mXG4gICAgLy8gdGhhdCBXb3JrZmxvdyBUYXNrOyB0aGlzIGlzIG5vcm1hbGx5IGRldGVybWluZWQgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSBmbGFnIElEIGluIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgLy8gV0ZUIENvbXBsZXRlZCdzIGBzZGtNZXRhZGF0YS5sYW5nVXNlZEZsYWdzYC5cbiAgICAvL1xuICAgIC8vIFNESyBGbGFnIEFsdGVybmF0ZSBDb25kaXRpb24gcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGRldGVybWluaW5nIHdoZXRoZXIgYSBmbGFnIHNob3VsZFxuICAgIC8vIGJlIGNvbnNpZGVyZWQgYXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgV0ZUOyBlLmcuIGJ5IGxvb2tpbmcgYXQgdGhlIHZlcnNpb24gb2YgdGhlIFNESyB0aGF0XG4gICAgLy8gZW1pdHRlZCBhIFdGVC4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdG8gcmV0cm9hY3RpdmVseSB0dXJuIG9uIHNvbWUgZmxhZ3MgZm9yIFdGVCBlbWl0dGVkXG4gICAgLy8gYnkgcHJldmlvdXMgU0RLcyB0aGF0IGNvbnRhaW5lZCBhIGJ1Zy4gQWx0IENvbmRpdGlvbnMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vXG4gICAgLy8gTm90ZSB0aGF0IGNvbmRpdGlvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIHdoaWxlIHJlcGxheWluZy4gQWxzbywgYWx0ZXJuYXRlIGNvbmRpdGlvbnMgd2lsbCBub3RcbiAgICAvLyBjYXVzZSB0aGUgZmxhZyB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIFwidXNlZCBmbGFnc1wiIHNldCwgd2hpY2ggbWVhbnMgdGhhdCBmdXJ0aGVyIFdvcmtmbG93IFRhc2tzXG4gICAgLy8gbWF5IG5vdCByZWZsZWN0IHRoaXMgZmxhZyBpZiB0aGUgY29uZGl0aW9uIG5vIGxvbmdlciBob2xkcy4gVGhpcyBpcyBzbyB0byBhdm9pZCBpbmNvcnJlY3RcbiAgICAvLyBiZWhhdmlvcnMgaW4gY2FzZSB3aGVyZSBhIFdvcmtmbG93IEV4ZWN1dGlvbiBoYXMgZ29uZSB0aHJvdWdoIGEgbmV3ZXIgU0RLIHZlcnNpb24gdGhlbiBhZ2FpblxuICAgIC8vIHRocm91Z2ggYW4gb2xkZXIgb25lLlxuICAgIGlmICh0aGlzLmluZm8udW5zYWZlLmlzUmVwbGF5aW5nICYmIGZsYWcuYWx0ZXJuYXRpdmVDb25kaXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmQgb2YgZmxhZy5hbHRlcm5hdGl2ZUNvbmRpdGlvbnMpIHtcbiAgICAgICAgaWYgKGNvbmQoeyBpbmZvOiB0aGlzLmluZm8sIHNka1ZlcnNpb246IHRoaXMuc2RrVmVyc2lvbiB9KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUZyb21DYWNoZSgpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ3JlbW92ZUZyb21DYWNoZSBhY3RpdmF0aW9uIGpvYiBzaG91bGQgbm90IHJlYWNoIHdvcmtmbG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtcyBmYWlsdXJlcyBpbnRvIGEgY29tbWFuZCB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIFVzZWQgdG8gaGFuZGxlIGFueSBmYWlsdXJlIGVtaXR0ZWQgYnkgdGhlIFdvcmtmbG93LlxuICAgKi9cbiAgaGFuZGxlV29ya2Zsb3dGYWlsdXJlKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FuY2VsbGVkICYmIGlzQ2FuY2VsbGF0aW9uKGVycm9yKSkge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNhbmNlbFdvcmtmbG93RXhlY3V0aW9uOiB7fSB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29udGludWVBc05ldykge1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZCh7IGNvbnRpbnVlQXNOZXdXb3JrZmxvd0V4ZWN1dGlvbjogZXJyb3IuY29tbWFuZCB9LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgVGVtcG9yYWxGYWlsdXJlKSB7XG4gICAgICAvLyBGYWlsIHRoZSB3b3JrZmxvdy4gV2UgZG8gbm90IHdhbnQgdG8gaXNzdWUgdW5maW5pc2hlZEhhbmRsZXJzIHdhcm5pbmdzLiBUbyBhY2hpZXZlIHRoYXQsIHdlXG4gICAgICAvLyBtYXJrIGFsbCBoYW5kbGVycyBhcyBjb21wbGV0ZWQgbm93LlxuICAgICAgdGhpcy5pblByb2dyZXNzU2lnbmFscy5jbGVhcigpO1xuICAgICAgdGhpcy5pblByb2dyZXNzVXBkYXRlcy5jbGVhcigpO1xuICAgICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgICAge1xuICAgICAgICAgIGZhaWxXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5lcnJvclRvRmFpbHVyZShlcnJvciksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWNvcmRXb3JrZmxvd1Rhc2tFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcmVjb3JkV29ya2Zsb3dUYXNrRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBPbmx5IGtlZXAgdGhlIGZpcnN0IGVycm9yIHRoYXQgYnViYmxlcyB1cDsgc3Vic2VxdWVudCBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkLlxuICAgIGlmICh0aGlzLndvcmtmbG93VGFza0Vycm9yID09PSB1bmRlZmluZWQpIHRoaXMud29ya2Zsb3dUYXNrRXJyb3IgPSBlcnJvcjtcblxuICAgIC8vIEltbWVkaWF0ZWx5IHJldGhyb3cgdGhlIGVycm9yIGlmIHdlIGtub3cgaXQgaXMgc2FmZSB0byBkbyBzbyAoaS5lLiB3ZSBhcmUgbm90IHJ1bm5pbmcgYXN5bmNcbiAgICAvLyBtaWNyb3Rhc2tzKS4gT3RoZXJ3aXNlLCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biB3aGVuZXZlciB3ZSBnZXQgYW4gb3Bwb3J0dW5pdHkgdG8gZG8gc28sXG4gICAgLy8gZS5nLiB0aGUgbmV4dCB0aW1lIGB0cnlVbmJsb2NrQ29uZGl0aW9ucygpYCBpcyBjYWxsZWQuXG4gICAgaWYgKHRoaXMucmV0aHJvd1N5bmNocm9ub3VzbHkpIHRoaXMubWF5YmVSZXRocm93V29ya2Zsb3dUYXNrRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIFdvcmtmbG93IFRhc2sgZXJyb3Igd2FzIGNhcHR1cmVkLCBhbmQgd2UgYXJlIHJ1bm5pbmcgaW4gc3luY2hyb25vdXMgbW9kZSxcbiAgICogdGhlbiBidWJibGUgaXQgdXAgbm93LiBUaGlzIGlzIHNhZmUgdG8gY2FsbCBldmVuIGlmIHRoZXJlIGlzIG5vIGVycm9yIHRvIHJldGhyb3cuXG4gICAqL1xuICBtYXliZVJldGhyb3dXb3JrZmxvd1Rhc2tFcnJvcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd1Rhc2tFcnJvcikgdGhyb3cgdGhpcy53b3JrZmxvd1Rhc2tFcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGxldGVRdWVyeShxdWVyeUlkOiBzdHJpbmcsIHJlc3VsdDogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgcmVzcG9uZFRvUXVlcnk6IHsgcXVlcnlJZCwgc3VjY2VlZGVkOiB7IHJlc3BvbnNlOiB0aGlzLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHJlc3VsdCkgfSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWlsUXVlcnkocXVlcnlJZDogc3RyaW5nLCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgcmVzcG9uZFRvUXVlcnk6IHtcbiAgICAgICAgcXVlcnlJZCxcbiAgICAgICAgZmFpbGVkOiB0aGlzLmVycm9yVG9GYWlsdXJlKGVuc3VyZVRlbXBvcmFsRmFpbHVyZShlcnJvcikpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWNjZXB0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZCh7IHVwZGF0ZVJlc3BvbnNlOiB7IHByb3RvY29sSW5zdGFuY2VJZCwgYWNjZXB0ZWQ6IHt9IH0gfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlVXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nLCByZXN1bHQ6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hDb21tYW5kKHtcbiAgICAgIHVwZGF0ZVJlc3BvbnNlOiB7IHByb3RvY29sSW5zdGFuY2VJZCwgY29tcGxldGVkOiB0aGlzLnBheWxvYWRDb252ZXJ0ZXIudG9QYXlsb2FkKHJlc3VsdCkgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVqZWN0VXBkYXRlKHByb3RvY29sSW5zdGFuY2VJZDogc3RyaW5nLCBlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucHVzaENvbW1hbmQoe1xuICAgICAgdXBkYXRlUmVzcG9uc2U6IHtcbiAgICAgICAgcHJvdG9jb2xJbnN0YW5jZUlkLFxuICAgICAgICByZWplY3RlZDogdGhpcy5lcnJvclRvRmFpbHVyZShlbnN1cmVUZW1wb3JhbEZhaWx1cmUoZXJyb3IpKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQ29uc3VtZSBhIGNvbXBsZXRpb24gaWYgaXQgZXhpc3RzIGluIFdvcmtmbG93IHN0YXRlICovXG4gIHByaXZhdGUgbWF5YmVDb25zdW1lQ29tcGxldGlvbjxLIGV4dGVuZHMga2V5b2YgQWN0aXZhdG9yWydjb21wbGV0aW9ucyddPihcbiAgICB0eXBlOiBLLFxuICAgIHRhc2tTZXE6IG51bWJlclxuICApOiBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLmNvbXBsZXRpb25zW3R5cGVdLmdldCh0YXNrU2VxKTtcbiAgICBpZiAoY29tcGxldGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbXBsZXRpb25zW3R5cGVdLmRlbGV0ZSh0YXNrU2VxKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBsZXRpb24gYXMgSW5mZXJNYXBWYWx1ZTxBY3RpdmF0b3JbJ2NvbXBsZXRpb25zJ11bS10+IHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIENvbnN1bWUgYSBjb21wbGV0aW9uIGlmIGl0IGV4aXN0cyBpbiBXb3JrZmxvdyBzdGF0ZSwgdGhyb3dzIGlmIGl0IGRvZXNuJ3QgKi9cbiAgcHJpdmF0ZSBjb25zdW1lQ29tcGxldGlvbjxLIGV4dGVuZHMga2V5b2YgQWN0aXZhdG9yWydjb21wbGV0aW9ucyddPihcbiAgICB0eXBlOiBLLFxuICAgIHRhc2tTZXE6IG51bWJlclxuICApOiBJbmZlck1hcFZhbHVlPEFjdGl2YXRvclsnY29tcGxldGlvbnMnXVtLXT4ge1xuICAgIGNvbnN0IGNvbXBsZXRpb24gPSB0aGlzLm1heWJlQ29uc3VtZUNvbXBsZXRpb24odHlwZSwgdGFza1NlcSk7XG4gICAgaWYgKGNvbXBsZXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUVycm9yKGBObyBjb21wbGV0aW9uIGZvciB0YXNrU2VxICR7dGFza1NlcX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBsZXRpb247XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlV29ya2Zsb3cocmVzdWx0OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wdXNoQ29tbWFuZChcbiAgICAgIHtcbiAgICAgICAgY29tcGxldGVXb3JrZmxvd0V4ZWN1dGlvbjoge1xuICAgICAgICAgIHJlc3VsdDogdGhpcy5wYXlsb2FkQ29udmVydGVyLnRvUGF5bG9hZChyZXN1bHQpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgZXJyb3JUb0ZhaWx1cmUoZXJyOiB1bmtub3duKTogUHJvdG9GYWlsdXJlIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ29udmVydGVyLmVycm9yVG9GYWlsdXJlKGVyciwgdGhpcy5wYXlsb2FkQ29udmVydGVyKTtcbiAgfVxuXG4gIGZhaWx1cmVUb0Vycm9yKGZhaWx1cmU6IFByb3RvRmFpbHVyZSk6IEVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlQ29udmVydGVyLmZhaWx1cmVUb0Vycm9yKGZhaWx1cmUsIHRoaXMucGF5bG9hZENvbnZlcnRlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2VxPFQgZXh0ZW5kcyB7IHNlcT86IG51bWJlciB8IG51bGwgfT4oYWN0aXZhdGlvbjogVCk6IG51bWJlciB7XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRpb24uc2VxO1xuICBpZiAoc2VxID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBHb3QgYWN0aXZhdGlvbiB3aXRoIG5vIHNlcSBhdHRyaWJ1dGVgKTtcbiAgfVxuICByZXR1cm4gc2VxO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5maW5pc2hlZFVwZGF0ZUhhbmRsZXJNZXNzYWdlKGhhbmRsZXJFeGVjdXRpb25zOiBNZXNzYWdlSGFuZGxlckV4ZWN1dGlvbltdKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBcbltUTVBSTDExMDJdIFdvcmtmbG93IGZpbmlzaGVkIHdoaWxlIGFuIHVwZGF0ZSBoYW5kbGVyIHdhcyBzdGlsbCBydW5uaW5nLiBUaGlzIG1heSBoYXZlIGludGVycnVwdGVkIHdvcmsgdGhhdCB0aGVcbnVwZGF0ZSBoYW5kbGVyIHdhcyBkb2luZywgYW5kIHRoZSBjbGllbnQgdGhhdCBzZW50IHRoZSB1cGRhdGUgd2lsbCByZWNlaXZlIGEgJ3dvcmtmbG93IGV4ZWN1dGlvblxuYWxyZWFkeSBjb21wbGV0ZWQnIFJQQ0Vycm9yIGluc3RlYWQgb2YgdGhlIHVwZGF0ZSByZXN1bHQuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsXG5oYW5kbGVycyB0byBjb21wbGV0ZSBieSB1c2luZyBcXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuXG5BbHRlcm5hdGl2ZWx5LCBpZiBib3RoIHlvdSBhbmQgdGhlIGNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnNcbndoZW4gdGhlIHdvcmtmbG93IGZpbmlzaGVzLCBhbmQgY2F1c2luZyBjbGllbnRzIHRvIHJlY2VpdmUgZXJyb3JzLCB0aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnlcbnBhc3NpbmcgYW4gb3B0aW9uIHdoZW4gc2V0dGluZyB0aGUgaGFuZGxlcjpcblxcYHdvcmtmbG93LnNldEhhbmRsZXIobXlVcGRhdGUsIG15VXBkYXRlSGFuZGxlciwge3VuZmluaXNoZWRQb2xpY3k6IEhhbmRsZXJVbmZpbmlzaGVkUG9saWN5LkFCQU5ET059KTtcXGAuYFxuICAgIC5yZXBsYWNlKC9cXG4vZywgJyAnKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGAke21lc3NhZ2V9IFRoZSBmb2xsb3dpbmcgdXBkYXRlcyB3ZXJlIHVuZmluaXNoZWQgKGFuZCB3YXJuaW5ncyB3ZXJlIG5vdCBkaXNhYmxlZCBmb3IgdGhlaXIgaGFuZGxlcik6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgaGFuZGxlckV4ZWN1dGlvbnMubWFwKChleCkgPT4gKHsgbmFtZTogZXgubmFtZSwgaWQ6IGV4LmlkIH0pKVxuICApfWA7XG59XG5cbmZ1bmN0aW9uIG1ha2VVbmZpbmlzaGVkU2lnbmFsSGFuZGxlck1lc3NhZ2UoaGFuZGxlckV4ZWN1dGlvbnM6IE1lc3NhZ2VIYW5kbGVyRXhlY3V0aW9uW10pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gYFxuW1RNUFJMMTEwMl0gV29ya2Zsb3cgZmluaXNoZWQgd2hpbGUgYSBzaWduYWwgaGFuZGxlciB3YXMgc3RpbGwgcnVubmluZy4gVGhpcyBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB3b3JrIHRoYXQgdGhlXG5zaWduYWwgaGFuZGxlciB3YXMgZG9pbmcuIFlvdSBjYW4gd2FpdCBmb3IgYWxsIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIHRvIGNvbXBsZXRlIGJ5IHVzaW5nXG5cXGBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcXGAuIEFsdGVybmF0aXZlbHksIGlmIGJvdGggeW91IGFuZCB0aGVcbmNsaWVudHMgc2VuZGluZyB0aGUgdXBkYXRlIGFyZSBva2F5IHdpdGggaW50ZXJydXB0aW5nIHJ1bm5pbmcgaGFuZGxlcnMgd2hlbiB0aGUgd29ya2Zsb3cgZmluaXNoZXMsXG50aGVuIHlvdSBjYW4gZGlzYWJsZSB0aGlzIHdhcm5pbmcgYnkgcGFzc2luZyBhbiBvcHRpb24gd2hlbiBzZXR0aW5nIHRoZSBoYW5kbGVyOlxuXFxgd29ya2Zsb3cuc2V0SGFuZGxlcihteVNpZ25hbCwgbXlTaWduYWxIYW5kbGVyLCB7dW5maW5pc2hlZFBvbGljeTogSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuQUJBTkRPTn0pO1xcYC5gXG5cbiAgICAucmVwbGFjZSgvXFxuL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IG5hbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBleCBvZiBoYW5kbGVyRXhlY3V0aW9ucykge1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZXMuZ2V0KGV4Lm5hbWUpIHx8IDA7XG4gICAgbmFtZXMuc2V0KGV4Lm5hbWUsIGNvdW50ICsgMSk7XG4gIH1cblxuICByZXR1cm4gYCR7bWVzc2FnZX0gVGhlIGZvbGxvd2luZyBzaWduYWxzIHdlcmUgdW5maW5pc2hlZCAoYW5kIHdhcm5pbmdzIHdlcmUgbm90IGRpc2FibGVkIGZvciB0aGVpciBoYW5kbGVyKTogJHtKU09OLnN0cmluZ2lmeShcbiAgICBBcnJheS5mcm9tKG5hbWVzLmVudHJpZXMoKSkubWFwKChbbmFtZSwgY291bnRdKSA9PiAoeyBuYW1lLCBjb3VudCB9KSlcbiAgKX1gO1xufVxuIiwiaW1wb3J0IHsgY29tcG9zZUludGVyY2VwdG9ycyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvaW50ZXJjZXB0b3JzJztcbmltcG9ydCB7IFNka0NvbXBvbmVudCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgeyB0eXBlIFNpbmssIHR5cGUgU2lua3MsIHByb3h5U2lua3MgfSBmcm9tICcuL3NpbmtzJztcbmltcG9ydCB7IGlzQ2FuY2VsbGF0aW9uIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0luZm8gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29udGludWVBc05ldyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgY3VycmVudFVwZGF0ZUluZm8sIGluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi93b3JrZmxvdyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dMb2dnZXIgZXh0ZW5kcyBTaW5rIHtcbiAgdHJhY2UobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgZGVidWcobWVzc2FnZTogc3RyaW5nLCBhdHRycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZDtcbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQ7XG59XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbG9ncyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXJcbiAqXG4gKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIExvZ2dlclNpbmtzIGRpcmVjdGx5LiBUbyBsb2cgZnJvbSBXb3JrZmxvdyBjb2RlLCB1c2UgdGhlIGBsb2dgIG9iamVjdFxuICogICAgICAgICAgICAgZXhwb3J0ZWQgYnkgdGhlIGBAdGVtcG9yYWxpby93b3JrZmxvd2AgcGFja2FnZS4gVG8gY2FwdHVyZSBsb2cgbWVzc2FnZXMgZW1pdHRlZFxuICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclNpbmtzRGVwcmVjYXRlZCBleHRlbmRzIFNpbmtzIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgTG9nZ2VyU2lua3MgZGlyZWN0bHkuIFRvIGxvZyBmcm9tIFdvcmtmbG93IGNvZGUsIHVzZSB0aGUgYGxvZ2Agb2JqZWN0XG4gICAqICAgICAgICAgICAgIGV4cG9ydGVkIGJ5IHRoZSBgQHRlbXBvcmFsaW8vd29ya2Zsb3dgIHBhY2thZ2UuIFRvIGNhcHR1cmUgbG9nIG1lc3NhZ2VzIGVtaXR0ZWRcbiAgICogICAgICAgICAgICAgYnkgV29ya2Zsb3cgY29kZSwgc2V0IHRoZSB7QGxpbmsgUnVudGltZS5sb2dnZXJ9IHByb3BlcnR5LlxuICAgKi9cbiAgZGVmYXVsdFdvcmtlckxvZ2dlcjogV29ya2Zsb3dMb2dnZXI7XG59XG5cbi8qKlxuICogU2luayBpbnRlcmZhY2UgZm9yIGZvcndhcmRpbmcgbG9ncyBmcm9tIHRoZSBXb3JrZmxvdyBzYW5kYm94IHRvIHRoZSBXb3JrZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnZXJTaW5rc0ludGVybmFsIGV4dGVuZHMgU2lua3Mge1xuICBfX3RlbXBvcmFsX2xvZ2dlcjogV29ya2Zsb3dMb2dnZXI7XG59XG5cbmNvbnN0IGxvZ2dlclNpbmsgPSBwcm94eVNpbmtzPExvZ2dlclNpbmtzSW50ZXJuYWw+KCkuX190ZW1wb3JhbF9sb2dnZXI7XG5cbi8qKlxuICogU3ltYm9sIHVzZWQgYnkgdGhlIFNESyBsb2dnZXIgdG8gZXh0cmFjdCBhIHRpbWVzdGFtcCBmcm9tIGxvZyBhdHRyaWJ1dGVzLlxuICogQWxzbyBkZWZpbmVkIGluIGB3b3JrZXIvbG9nZ2VyLnRzYCAtIGludGVudGlvbmFsbHkgbm90IHNoYXJlZC5cbiAqL1xuY29uc3QgTG9nVGltZXN0YW1wID0gU3ltYm9sLmZvcignbG9nX3RpbWVzdGFtcCcpO1xuXG4vKipcbiAqIERlZmF1bHQgd29ya2Zsb3cgbG9nZ2VyLlxuICpcbiAqIFRoaXMgbG9nZ2VyIGlzIHJlcGxheS1hd2FyZSBhbmQgd2lsbCBvbWl0IGxvZyBtZXNzYWdlcyBvbiB3b3JrZmxvdyByZXBsYXkuIE1lc3NhZ2VzIGVtaXR0ZWQgYnkgdGhpcyBsb2dnZXIgYXJlXG4gKiBmdW5uZWxsZWQgdGhyb3VnaCBhIHNpbmsgdGhhdCBmb3J3YXJkcyB0aGVtIHRvIHRoZSBsb2dnZXIgcmVnaXN0ZXJlZCBvbiB7QGxpbmsgUnVudGltZS5sb2dnZXJ9LlxuICpcbiAqIEF0dHJpYnV0ZXMgZnJvbSB0aGUgY3VycmVudCBXb3JrZmxvdyBFeGVjdXRpb24gY29udGV4dCBhcmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBhcyBtZXRhZGF0YSBvbiBldmVyeSBsb2dcbiAqIGVudHJpZXMuIEFuIGV4dHJhIGBzZGtDb21wb25lbnRgIG1ldGFkYXRhIGF0dHJpYnV0ZSBpcyBhbHNvIGFkZGVkLCB3aXRoIHZhbHVlIGB3b3JrZmxvd2A7IHRoaXMgY2FuIGJlIHVzZWQgZm9yXG4gKiBmaW5lLWdyYWluZWQgZmlsdGVyaW5nIG9mIGxvZyBlbnRyaWVzIGZ1cnRoZXIgZG93bnN0cmVhbS5cbiAqXG4gKiBUbyBjdXN0b21pemUgbG9nIGF0dHJpYnV0ZXMsIHJlZ2lzdGVyIGEge0BsaW5rIFdvcmtmbG93T3V0Ym91bmRDYWxsc0ludGVyY2VwdG9yfSB0aGF0IGludGVyY2VwdHMgdGhlXG4gKiBgZ2V0TG9nQXR0cmlidXRlcygpYCBtZXRob2QuXG4gKlxuICogTm90aWNlIHRoYXQgc2luY2Ugc2lua3MgYXJlIHVzZWQgdG8gcG93ZXIgdGhpcyBsb2dnZXIsIGFueSBsb2cgYXR0cmlidXRlcyBtdXN0IGJlIHRyYW5zZmVyYWJsZSB2aWEgdGhlXG4gKiB7QGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS93b3JrZXJfdGhyZWFkcy5odG1sI3dvcmtlcl90aHJlYWRzX3BvcnRfcG9zdG1lc3NhZ2VfdmFsdWVfdHJhbnNmZXJsaXN0IHwgcG9zdE1lc3NhZ2V9XG4gKiBBUEkuXG4gKlxuICogTk9URTogU3BlY2lmeWluZyBhIGN1c3RvbSBsb2dnZXIgdGhyb3VnaCB7QGxpbmsgZGVmYXVsdFNpbmt9IG9yIGJ5IG1hbnVhbGx5IHJlZ2lzdGVyaW5nIGEgc2luayBuYW1lZFxuICogYGRlZmF1bHRXb3JrZXJMb2dnZXJgIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Uge0BsaW5rIFJ1bnRpbWUubG9nZ2VyfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgbG9nOiBXb3JrZmxvd0xvZ2dlciA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgKFsndHJhY2UnLCAnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ10gYXMgQXJyYXk8a2V5b2YgV29ya2Zsb3dMb2dnZXI+KS5tYXAoKGxldmVsKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGxldmVsLFxuICAgICAgKG1lc3NhZ2U6IHN0cmluZywgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cubG9nKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIHdvcmtmbG93IGNvbnRleHQuJyk7XG4gICAgICAgIGNvbnN0IGdldExvZ0F0dHJpYnV0ZXMgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdnZXRMb2dBdHRyaWJ1dGVzJywgKGEpID0+IGEpO1xuICAgICAgICByZXR1cm4gbG9nZ2VyU2lua1tsZXZlbF0hKG1lc3NhZ2UsIHtcbiAgICAgICAgICAvLyBJbmplY3QgdGhlIGNhbGwgdGltZSBpbiBuYW5vc2Vjb25kIHJlc29sdXRpb24gYXMgZXhwZWN0ZWQgYnkgdGhlIHdvcmtlciBsb2dnZXIuXG4gICAgICAgICAgW0xvZ1RpbWVzdGFtcF06IGFjdGl2YXRvci5nZXRUaW1lT2ZEYXkoKSxcbiAgICAgICAgICBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZmxvdyxcbiAgICAgICAgICAuLi5nZXRMb2dBdHRyaWJ1dGVzKHdvcmtmbG93TG9nQXR0cmlidXRlcyhhY3RpdmF0b3IuaW5mbykpLFxuICAgICAgICAgIC4uLmF0dHJzLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgXTtcbiAgfSlcbikgYXMgYW55O1xuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVdpdGhMaWZlY3ljbGVMb2dnaW5nKGZuOiAoKSA9PiBQcm9taXNlPHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGxvZy5kZWJ1ZygnV29ya2Zsb3cgc3RhcnRlZCcsIHsgc2RrQ29tcG9uZW50OiBTZGtDb21wb25lbnQud29ya2VyIH0pO1xuICBjb25zdCBwID0gZm4oKS50aGVuKFxuICAgIChyZXMpID0+IHtcbiAgICAgIGxvZy5kZWJ1ZygnV29ya2Zsb3cgY29tcGxldGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICAvLyBBdm9pZCB1c2luZyBpbnN0YW5jZW9mIGNoZWNrcyBpbiBjYXNlIHRoZSBtb2R1bGVzIHRoZXkncmUgZGVmaW5lZCBpbiBsb2FkZWQgbW9yZSB0aGFuIG9uY2UsXG4gICAgICAvLyBlLmcuIGJ5IGplc3Qgb3Igd2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBhcmUgaW5zdGFsbGVkLlxuICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNDYW5jZWxsYXRpb24oZXJyb3IpKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb21wbGV0ZWQgYXMgY2FuY2VsbGVkJywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb250aW51ZUFzTmV3KSB7XG4gICAgICAgICAgbG9nLmRlYnVnKCdXb3JrZmxvdyBjb250aW51ZWQgYXMgbmV3JywgeyBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKCdXb3JrZmxvdyBmYWlsZWQnLCB7IGVycm9yLCBzZGtDb21wb25lbnQ6IFNka0NvbXBvbmVudC53b3JrZXIgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICk7XG4gIC8vIEF2b2lkIHNob3dpbmcgdGhpcyBpbnRlcmNlcHRvciBpbiBzdGFjayB0cmFjZSBxdWVyeVxuICB1bnRyYWNrUHJvbWlzZShwKTtcbiAgcmV0dXJuIHA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIG1hcCBvZiBhdHRyaWJ1dGVzIHRvIGJlIHNldCBfYnkgZGVmYXVsdF8gb24gbG9nIG1lc3NhZ2VzIGZvciBhIGdpdmVuIFdvcmtmbG93LlxuICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFdvcmtmbG93IGNvbnRleHQgKGVnLiBieSB0aGUgd29ya2VyIGl0c2VsZikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd0xvZ0F0dHJpYnV0ZXMoaW5mbzogV29ya2Zsb3dJbmZvKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBhdHRyaWJ1dGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIG5hbWVzcGFjZTogaW5mby5uYW1lc3BhY2UsXG4gICAgdGFza1F1ZXVlOiBpbmZvLnRhc2tRdWV1ZSxcbiAgICB3b3JrZmxvd0lkOiBpbmZvLndvcmtmbG93SWQsXG4gICAgcnVuSWQ6IGluZm8ucnVuSWQsXG4gICAgd29ya2Zsb3dUeXBlOiBpbmZvLndvcmtmbG93VHlwZSxcbiAgfTtcbiAgaWYgKGluV29ya2Zsb3dDb250ZXh0KCkpIHtcbiAgICBjb25zdCB1cGRhdGVJbmZvID0gY3VycmVudFVwZGF0ZUluZm8oKTtcbiAgICBpZiAodXBkYXRlSW5mbykge1xuICAgICAgLy8gQWRkIHVwZGF0ZSBpbmZvIGlmIGl0IGV4aXN0c1xuICAgICAgYXR0cmlidXRlc1sndXBkYXRlSWQnXSA9IHVwZGF0ZUluZm8uaWQ7XG4gICAgICBhdHRyaWJ1dGVzWyd1cGRhdGVOYW1lJ10gPSB1cGRhdGVJbmZvLm5hbWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBhdHRyaWJ1dGVzO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBNZXRyaWNDb3VudGVyLFxuICBNZXRyaWNHYXVnZSxcbiAgTWV0cmljSGlzdG9ncmFtLFxuICBNZXRyaWNNZXRlcixcbiAgTWV0cmljVGFncyxcbiAgTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBTaW5rLCBTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgcHJveHlTaW5rcyB9IGZyb20gJy4vc2lua3MnO1xuaW1wb3J0IHsgd29ya2Zsb3dJbmZvIH0gZnJvbSAnLi93b3JrZmxvdyc7XG5pbXBvcnQgeyBhc3NlcnRJbldvcmtmbG93Q29udGV4dCB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG5jbGFzcyBXb3JrZmxvd01ldHJpY01ldGVySW1wbCBpbXBsZW1lbnRzIE1ldHJpY01ldGVyIHtcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNyZWF0ZUNvdW50ZXIobmFtZTogc3RyaW5nLCB1bml0Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IE1ldHJpY0NvdW50ZXIge1xuICAgIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFwiV29ya2Zsb3cncyBgbWV0cmljTWV0ZXJgIGNhbiBvbmx5IGJlIHVzZWQgd2hpbGUgaW4gV29ya2Zsb3cgQ29udGV4dFwiKTtcbiAgICByZXR1cm4gbmV3IFdvcmtmbG93TWV0cmljQ291bnRlcihuYW1lLCB1bml0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBjcmVhdGVIaXN0b2dyYW0oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSA9ICdpbnQnLFxuICAgIHVuaXQ/OiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogTWV0cmljSGlzdG9ncmFtIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbShuYW1lLCB2YWx1ZVR5cGUsIHVuaXQsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIGNyZWF0ZUdhdWdlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUgPSAnaW50JyxcbiAgICB1bml0Pzogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IE1ldHJpY0dhdWdlIHtcbiAgICBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcIldvcmtmbG93J3MgYG1ldHJpY01ldGVyYCBjYW4gb25seSBiZSB1c2VkIHdoaWxlIGluIFdvcmtmbG93IENvbnRleHRcIik7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01ldHJpY0dhdWdlKG5hbWUsIHZhbHVlVHlwZSwgdW5pdCwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNNZXRlciB7XG4gICAgYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXCJXb3JrZmxvdydzIGBtZXRyaWNNZXRlcmAgY2FuIG9ubHkgYmUgdXNlZCB3aGlsZSBpbiBXb3JrZmxvdyBDb250ZXh0XCIpO1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNNZXRlcmApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljQ291bnRlciBpbXBsZW1lbnRzIE1ldHJpY0NvdW50ZXIge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9ICdjb3VudGVyJztcbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlVHlwZSA9ICdpbnQnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgYWRkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFnczogTWV0cmljVGFncyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNDb3VudGVyIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIChnb3QgJHt2YWx1ZX0pYCk7XG4gICAgfVxuICAgIGlmICghd29ya2Zsb3dJbmZvKCkudW5zYWZlLmlzUmVwbGF5aW5nKSB7XG4gICAgICBtZXRyaWNTaW5rLmFkZE1ldHJpY0NvdW50ZXJWYWx1ZSh0aGlzLm5hbWUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIGV4dHJhVGFncyk7XG4gICAgfVxuICB9XG5cbiAgd2l0aFRhZ3MoX3RhZ3M6IE1ldHJpY1RhZ3MpOiBNZXRyaWNDb3VudGVyIHtcbiAgICAvLyBUYWdzIGNvbXBvc2l0aW9uIGlzIGhhbmRsZWQgYnkgYSBNZXRyaWNNZXRlcldpdGhDb21wb3NlZFRhZ3Mgd3JhcHBlciBvdmVyIHRoaXMgb25lXG4gICAgdGhyb3cgbmV3IEVycm9yKGB3aXRoVGFncyBpcyBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5IG9uIFdvcmtmbG93TWV0cmljQ291bnRlcmApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljSGlzdG9ncmFtIGltcGxlbWVudHMgTWV0cmljSGlzdG9ncmFtIHtcbiAgcHVibGljIHJlYWRvbmx5IGtpbmQgPSAnaGlzdG9ncmFtJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgcmVjb3JkKHZhbHVlOiBudW1iZXIsIGV4dHJhVGFnczogTWV0cmljVGFncyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNIaXN0b2dyYW0gdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgKGdvdCAke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgaWYgKCF3b3JrZmxvd0luZm8oKS51bnNhZmUuaXNSZXBsYXlpbmcpIHtcbiAgICAgIG1ldHJpY1NpbmsucmVjb3JkTWV0cmljSGlzdG9ncmFtVmFsdWUodGhpcy5uYW1lLCB0aGlzLnZhbHVlVHlwZSwgdGhpcy51bml0LCB0aGlzLmRlc2NyaXB0aW9uLCB2YWx1ZSwgZXh0cmFUYWdzKTtcbiAgICB9XG4gIH1cblxuICB3aXRoVGFncyhfdGFnczogTWV0cmljVGFncyk6IE1ldHJpY0hpc3RvZ3JhbSB7XG4gICAgLy8gVGFncyBjb21wb3NpdGlvbiBpcyBoYW5kbGVkIGJ5IGEgTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzIHdyYXBwZXIgb3ZlciB0aGlzIG9uZVxuICAgIHRocm93IG5ldyBFcnJvcihgd2l0aFRhZ3MgaXMgbm90IHN1cHBvcnRlZCBkaXJlY3RseSBvbiBXb3JrZmxvd01ldHJpY0hpc3RvZ3JhbWApO1xuICB9XG59XG5cbmNsYXNzIFdvcmtmbG93TWV0cmljR2F1Z2UgaW1wbGVtZW50cyBNZXRyaWNHYXVnZSB7XG4gIHB1YmxpYyByZWFkb25seSBraW5kID0gJ2dhdWdlJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZVR5cGU6IE51bWVyaWNNZXRyaWNWYWx1ZVR5cGUsXG4gICAgcHVibGljIHJlYWRvbmx5IHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHt9XG5cbiAgc2V0KHZhbHVlOiBudW1iZXIsIHRhZ3M/OiBNZXRyaWNUYWdzKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXRyaWNHYXVnZSB2YWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSAoZ290ICR7dmFsdWV9KWApO1xuICAgIH1cbiAgICBpZiAoIXdvcmtmbG93SW5mbygpLnVuc2FmZS5pc1JlcGxheWluZykge1xuICAgICAgbWV0cmljU2luay5zZXRNZXRyaWNHYXVnZVZhbHVlKHRoaXMubmFtZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMudW5pdCwgdGhpcy5kZXNjcmlwdGlvbiwgdmFsdWUsIHRhZ3MgPz8ge30pO1xuICAgIH1cbiAgfVxuXG4gIHdpdGhUYWdzKF90YWdzOiBNZXRyaWNUYWdzKTogTWV0cmljR2F1Z2Uge1xuICAgIC8vIFRhZ3MgY29tcG9zaXRpb24gaXMgaGFuZGxlZCBieSBhIE1ldHJpY01ldGVyV2l0aENvbXBvc2VkVGFncyB3cmFwcGVyIG92ZXIgdGhpcyBvbmVcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHdpdGhUYWdzIGlzIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkgb24gV29ya2Zsb3dNZXRyaWNHYXVnZWApO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8gTm90ZTogZ2l2ZW4gdGhhdCBmb3J3YXJkaW5nIG1ldHJpY3Mgb3V0c2lkZSBvZiB0aGUgc2FuYm94IGNhbiBiZSBxdWl0ZSBjaGF0dHkgYW5kIGFkZCBub25cbi8vIG5lZ2xpZ2VhYmxlIG92ZXJoZWFkLCB3ZSBlYWdlcmx5IGNoZWNrIGZvciBgaXNSZXBsYXlpbmdgIGFuZCBjb21wbGV0ZWx5IHNraXAgZG9pbmcgc2lua1xuLy8gY2FsbHMgaWYgd2UgYXJlIHJlcGxheWluZy5cbmNvbnN0IG1ldHJpY1NpbmsgPSBwcm94eVNpbmtzPE1ldHJpY1NpbmtzPigpLl9fdGVtcG9yYWxfbWV0cmljcztcblxuLyoqXG4gKiBTaW5rIGludGVyZmFjZSBmb3IgZm9yd2FyZGluZyBtZXRyaWNzIGZyb20gdGhlIFdvcmtmbG93IHNhbmRib3ggdG8gdGhlIFdvcmtlci5cbiAqXG4gKiBUaGVzZSBzaW5rIGZ1bmN0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIHdvcmtmbG93IGNvZGU7IGluc3RlYWQsXG4gKiBkZXZlbG9wZXJzIHNob3VsZCB1c2UgdGhlIGBtZXRyaWNNZXRlcmAgb2JqZWN0IGV4cG9zZWQgdG8gd29ya2Zsb3cgY29kZSBieSB0aGUgU0RLLCB3aGljaFxuICogcHJvdmlkZXMgYW4gQVBJIHRoYXQgaXMgZWFzaWVyIHRvIHdvcmsgd2l0aC5cbiAqXG4gKiBUaGlzIHNpbmsgaW50ZXJmYWNlIGlzIGFsc28gbm90IG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IHVzZXIuXG4gKlxuICogQGhpZGRlblxuICogQGludGVybmFsIFVzZXJzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBub3IgdXNlIGl0IGRpcmVjdGx5LiBVc2UgYG1ldHJpY01ldGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldHJpY1NpbmtzIGV4dGVuZHMgU2lua3Mge1xuICBfX3RlbXBvcmFsX21ldHJpY3M6IFdvcmtmbG93TWV0cmljTWV0ZXI7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGludGVybmFsIFVzZXJzIHNob3VsZCBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBub3IgdXNlIGl0IGRpcmVjdGx5LiBVc2UgYG1ldHJpY01ldGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93TWV0cmljTWV0ZXIgZXh0ZW5kcyBTaW5rIHtcbiAgYWRkTWV0cmljQ291bnRlclZhbHVlKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG5cbiAgcmVjb3JkTWV0cmljSGlzdG9ncmFtVmFsdWUoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlVHlwZTogTnVtZXJpY01ldHJpY1ZhbHVlVHlwZSxcbiAgICB1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGF0dHJzOiBNZXRyaWNUYWdzXG4gICk6IHZvaWQ7XG5cbiAgc2V0TWV0cmljR2F1Z2VWYWx1ZShcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVUeXBlOiBOdW1lcmljTWV0cmljVmFsdWVUeXBlLFxuICAgIHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgYXR0cnM6IE1ldHJpY1RhZ3NcbiAgKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIE1ldHJpY01ldGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW1pdCBtZXRyaWNzIGZyb20gd2l0aGluIGEgV29ya2Zsb3cuXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgTWV0cmljIEFQSSBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgbWF5IGJlIHN1YmplY3QgdG8gY2hhbmdlLlxuICovXG5leHBvcnQgY29uc3QgbWV0cmljTWV0ZXI6IE1ldHJpY01ldGVyID0gTWV0cmljTWV0ZXJXaXRoQ29tcG9zZWRUYWdzLmNvbXBvc2UoXG4gIG5ldyBXb3JrZmxvd01ldHJpY01ldGVySW1wbCgpLFxuICAoKSA9PiB7XG4gICAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93Lm1ldHJpY01ldGVyIG1heSBvbmx5IGJlIHVzZWQgZnJvbSB3b3JrZmxvdyBjb250ZXh0LicpO1xuICAgIGNvbnN0IGdldE1ldHJpY1RhZ3MgPSBjb21wb3NlSW50ZXJjZXB0b3JzKGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsICdnZXRNZXRyaWNUYWdzJywgKGEpID0+IGEpO1xuXG4gICAgY29uc3QgaW5mbyA9IGFjdGl2YXRvci5pbmZvO1xuICAgIHJldHVybiBnZXRNZXRyaWNUYWdzKHtcbiAgICAgIC8vIG5hbWVzcGFjZSBhbmQgdGFza1F1ZXVlIHdpbGwgYmUgYWRkZWQgYnkgdGhlIFdvcmtlclxuICAgICAgd29ya2Zsb3dUeXBlOiBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB9KTtcbiAgfSxcbiAgdHJ1ZVxuKTtcbiIsImltcG9ydCB0eXBlICogYXMgbmV4dXMgZnJvbSAnbmV4dXMtcnBjJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb1RzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IHVzZXJNZXRhZGF0YVRvUGF5bG9hZCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdXNlci1tZXRhZGF0YSc7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHsgbWFrZVByb3RvRW51bUNvbnZlcnRlcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVybmFsLXdvcmtmbG93L2VudW1zLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgQ2FuY2VsbGF0aW9uU2NvcGUgfSBmcm9tICcuL2NhbmNlbGxhdGlvbi1zY29wZSc7XG5pbXBvcnQgeyBnZXRBY3RpdmF0b3IgfSBmcm9tICcuL2dsb2JhbC1hdHRyaWJ1dGVzJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgU3RhcnROZXh1c09wZXJhdGlvbklucHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0LCBTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJjZXB0b3JzJztcblxuLyoqXG4gKiBBIE5leHVzIGNsaWVudCBmb3IgaW52b2tpbmcgTmV4dXMgT3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyBzZXJ2aWNlIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh1c1NlcnZpY2VDbGllbnQ8VCBleHRlbmRzIG5leHVzLlNlcnZpY2VEZWZpbml0aW9uPiB7XG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24gdGFraW5nIGEge0BsaW5rIG5leHVzLm9wZXJhdGlvbn0uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBleGVjdXRlT3BlcmF0aW9uPE8gZXh0ZW5kcyBUWydvcGVyYXRpb25zJ11ba2V5b2YgVFsnb3BlcmF0aW9ucyddXT4oXG4gICAgb3A6IE8sXG4gICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PE8+LFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICApOiBQcm9taXNlPG5leHVzLk9wZXJhdGlvbk91dHB1dDxPPj47XG5cbiAgLy8gVE9ETyhuZXh1cy9wb3N0LWluaXRpYWwtcmVsZWFzZSk6IFJldmlzaXQgdGhlIFwiT3BlcmF0aW9uIFByb3BlcnR5IE5hbWVcIiB0ZXJtaW5vbG9neSxcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZWZsZWN0IGluIHRoZSBOZXh1cyBSUEMgU0RLLlxuXG4gIC8qKlxuICAgKiBTdGFydCBhIE5leHVzIE9wZXJhdGlvbiBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQW4gT3BlcmF0aW9uJ3MgX3Byb3BlcnR5IG5hbWVfIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB1c2VkIHRvIGRlZmluZSB0aGF0IE9wZXJhdGlvbiBpblxuICAgKiB0aGUge0BsaW5rIG5leHVzLlNlcnZpY2VEZWZpbml0aW9ufSBvYmplY3Q7IGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICAgKiBpZiBvbmUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uIHRoZSB7QGxpbmsgbmV4dXMuT3BlcmF0aW9uRGVmaW5pdGlvbn0gb2JqZWN0LlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAgICovXG4gIGV4ZWN1dGVPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj47XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgTmV4dXMgT3BlcmF0aW9uIHRha2luZyBhIHtAbGluayBuZXh1cy5vcGVyYXRpb259LlxuICAgKlxuICAgKiBSZXR1cm5zIGEgaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIE9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbCBOZXh1cyBzdXBwb3J0IGluIFRlbXBvcmFsIFNESyBpcyBleHBlcmltZW50YWwuXG4gICAqL1xuICBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgIG9wOiBPLFxuICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxPPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+PjtcblxuICAvKipcbiAgICogU3RhcnQgYSBOZXh1cyBPcGVyYXRpb24sIHRha2luZyBhbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8uXG4gICAqIFJldHVybnMgYSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGUgT3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBBbiBPcGVyYXRpb24ncyBfcHJvcGVydHkgbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHVzZWQgdG8gZGVmaW5lIHRoYXQgT3BlcmF0aW9uIGluXG4gICAqIHRoZSB7QGxpbmsgbmV4dXMuU2VydmljZURlZmluaXRpb259IG9iamVjdDsgaXQgbWF5IGRpZmZlciBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgYG5hbWVgIHByb3BlcnR5XG4gICAqIGlmIG9uZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgb24gdGhlIHtAbGluayBuZXh1cy5PcGVyYXRpb25EZWZpbml0aW9ufSBvYmplY3QuXG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICAgKi9cbiAgc3RhcnRPcGVyYXRpb248SyBleHRlbmRzIG5leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+PihcbiAgICBvcDogSyxcbiAgICBpbnB1dDogbmV4dXMuT3BlcmF0aW9uSW5wdXQ8VFsnb3BlcmF0aW9ucyddW0tdPixcbiAgICBvcHRpb25zPzogUGFydGlhbDxTdGFydE5leHVzT3BlcmF0aW9uT3B0aW9ucz5cbiAgKTogUHJvbWlzZTxOZXh1c09wZXJhdGlvbkhhbmRsZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8VFsnb3BlcmF0aW9ucyddW0tdPj4+O1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgTmV4dXMgT3BlcmF0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHVzT3BlcmF0aW9uSGFuZGxlPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBPcGVyYXRpb24ncyBzZXJ2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBPcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0aW9uIHRva2VuIGFzIHNldCBieSB0aGUgT3BlcmF0aW9uJ3MgaGFuZGxlci4gTWF5IGJlIGVtcHR5IGlmIHRoZSBPcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2FpdCBmb3IgT3BlcmF0aW9uIGNvbXBsZXRpb24gYW5kIGdldCBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcmVzdWx0KCk6IFByb21pc2U8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dXNTZXJ2aWNlQ2xpZW50T3B0aW9uczxUPiB7XG4gIGVuZHBvaW50OiBzdHJpbmc7XG4gIHNlcnZpY2U6IFQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgTmV4dXMgY2xpZW50IGZvciBpbnZva2luZyBOZXh1cyBPcGVyYXRpb25zIGZyb20gYSBXb3JrZmxvdy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsIE5leHVzIHN1cHBvcnQgaW4gVGVtcG9yYWwgU0RLIGlzIGV4cGVyaW1lbnRhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5leHVzU2VydmljZUNsaWVudDxUIGV4dGVuZHMgbmV4dXMuU2VydmljZURlZmluaXRpb24+KFxuICBvcHRpb25zOiBOZXh1c1NlcnZpY2VDbGllbnRPcHRpb25zPFQ+XG4pOiBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICBjbGFzcyBOZXh1c1NlcnZpY2VDbGllbnRJbXBsPFQgZXh0ZW5kcyBuZXh1cy5TZXJ2aWNlRGVmaW5pdGlvbj4gaW1wbGVtZW50cyBOZXh1c1NlcnZpY2VDbGllbnQ8VD4ge1xuICAgIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb248TyBleHRlbmRzIFRbJ29wZXJhdGlvbnMnXVtrZXlvZiBUWydvcGVyYXRpb25zJ11dPihcbiAgICAgIG9wZXJhdGlvbjogc3RyaW5nIHwgVFsnb3BlcmF0aW9ucyddW25leHVzLk9wZXJhdGlvbktleTxUWydvcGVyYXRpb25zJ10+XSxcbiAgICAgIGlucHV0OiBuZXh1cy5PcGVyYXRpb25JbnB1dDxUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dPixcbiAgICAgIG9wZXJhdGlvbk9wdGlvbnM/OiBQYXJ0aWFsPFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zPlxuICAgICk6IFByb21pc2U8bmV4dXMuT3BlcmF0aW9uT3V0cHV0PE8+PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB0aGlzLnN0YXJ0T3BlcmF0aW9uKG9wZXJhdGlvbiwgaW5wdXQsIG9wZXJhdGlvbk9wdGlvbnMpO1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5yZXN1bHQoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzdGFydE9wZXJhdGlvbjxPIGV4dGVuZHMgVFsnb3BlcmF0aW9ucyddW2tleW9mIFRbJ29wZXJhdGlvbnMnXV0+KFxuICAgICAgb3BlcmF0aW9uOiBzdHJpbmcgfCBUWydvcGVyYXRpb25zJ11bbmV4dXMuT3BlcmF0aW9uS2V5PFRbJ29wZXJhdGlvbnMnXT5dLFxuICAgICAgaW5wdXQ6IG5leHVzLk9wZXJhdGlvbklucHV0PFRbJ29wZXJhdGlvbnMnXVtuZXh1cy5PcGVyYXRpb25LZXk8VFsnb3BlcmF0aW9ucyddPl0+LFxuICAgICAgb3BlcmF0aW9uT3B0aW9ucz86IFN0YXJ0TmV4dXNPcGVyYXRpb25PcHRpb25zXG4gICAgKSB7XG4gICAgICBjb25zdCBvcE5hbWUgPVxuICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gLy8gQ2FzdGluZyBhcyBzdHJpbmcgdG8gY292ZXIgdXAgdGhlIGZhY3QgdGhhdCBgb3BOYW1lYCBtaWdodCBiZSB1bmRlZmluZWQuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIHRoZW4gYGV4ZWN1dGVgIHdpbGwgcHJvZHVjZSBhIGBOZXh1c09wZXJhdGlvbkZhaWx1cmUuTk9UX0ZPVU5EYC5cbiAgICAgICAgICAgIChvcHRpb25zLnNlcnZpY2Uub3BlcmF0aW9uc1tvcGVyYXRpb25dPy5uYW1lIGFzIHN0cmluZylcbiAgICAgICAgICA6IG9wZXJhdGlvbi5uYW1lO1xuXG4gICAgICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5uZXh1c09wZXJhdGlvbisrO1xuXG4gICAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3N0YXJ0TmV4dXNPcGVyYXRpb24nLFxuICAgICAgICBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBpbnRlcmNlcHRvciByZXR1cm5zIGEgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0Piwgd2l0aCB0aGUgcmVzdWx0IHByb21pc2UgY29udGFpbmVkXG4gICAgICAvLyBpbiB0aGF0IE91dHB1dCBvYmplY3QuIEFzIGEgY29uc2VxdWVuY2Ugb2YgdGhpcywgdGhlIHJlc3VsdCBwcm9taXNlL2NvbXBsZXRpb24gZG9lcyBub3QgZXhpc3RcbiAgICAgIC8vIHVudGlsIHRoZSBTdGFydE5leHVzT3BlcmF0aW9uIGV2ZW50IGlzIHJlY2VpdmVkLiBUaGlzIGlzIHRvdGFsbHkgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBkaWQgaW5cbiAgICAgIC8vIENoaWxkV29ya2Zsb3csIGJ1dCBpcyBtdWNoIGNsZWFuZXIgZnJvbSB0aGUgaW50ZXJjZXB0b3JzIHBvaW50IG9mIHZpZXcuXG4gICAgICBjb25zdCB7IHRva2VuLCByZXN1bHQ6IHJlc3VsdFByb21pc2UgfSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBlbmRwb2ludDogb3B0aW9ucy5lbmRwb2ludCxcbiAgICAgICAgc2VydmljZTogb3B0aW9ucy5zZXJ2aWNlLm5hbWUsXG4gICAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgLi4ub3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBvcGVyYXRpb25PcHRpb25zPy5jYW5jZWxsYXRpb25UeXBlID8/ICdXQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQnLFxuICAgICAgICB9LFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgc2VxLFxuICAgICAgICBpbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2aWNlOiBvcHRpb25zLnNlcnZpY2UubmFtZSxcbiAgICAgICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgICAgIHRva2VuLFxuICAgICAgICBhc3luYyByZXN1bHQoKTogUHJvbWlzZTxuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz4+IHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0UHJvbWlzZSBhcyBuZXh1cy5PcGVyYXRpb25PdXRwdXQ8Tz47XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgTmV4dXNTZXJ2aWNlQ2xpZW50SW1wbDxUPigpO1xufVxuXG5mdW5jdGlvbiBzdGFydE5leHVzT3BlcmF0aW9uTmV4dEhhbmRsZXIoe1xuICBpbnB1dCxcbiAgZW5kcG9pbnQsXG4gIHNlcnZpY2UsXG4gIG9wdGlvbnMsXG4gIG9wZXJhdGlvbixcbiAgc2VxLFxuICBoZWFkZXJzLFxufTogU3RhcnROZXh1c09wZXJhdGlvbklucHV0KTogUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxTdGFydE5leHVzT3BlcmF0aW9uT3V0cHV0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShcbiAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wbGV0ZWQgPVxuICAgICAgICAgICAgIWFjdGl2YXRvci5jb21wbGV0aW9ucy5uZXh1c09wZXJhdGlvblN0YXJ0LmhhcyhzZXEpICYmXG4gICAgICAgICAgICAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLm5leHVzT3BlcmF0aW9uQ29tcGxldGUuaGFzKHNlcSk7XG5cbiAgICAgICAgICBpZiAoIWNvbXBsZXRlZCkge1xuICAgICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgICAgcmVxdWVzdENhbmNlbE5leHVzT3BlcmF0aW9uOiB7IHNlcSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICBzY2hlZHVsZU5leHVzT3BlcmF0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIHNlcnZpY2UsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgbmV4dXNIZWFkZXI6IGhlYWRlcnMsXG4gICAgICAgIGlucHV0OiBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlci50b1BheWxvYWQoaW5wdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zPy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucz8uc2NoZWR1bGVUb1N0YXJ0VGltZW91dCksXG4gICAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnM/LnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUob3B0aW9ucz8uY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnM/LnN1bW1hcnksIHVuZGVmaW5lZCksXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMubmV4dXNPcGVyYXRpb25TdGFydC5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzOlxuICogLSB3aGV0aGVyIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBzaG91bGQgYmUgcHJvcGFnYXRlZCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uXG4gKiAtIHdoZXRoZXIgYW5kIHdoZW4gc2hvdWxkIHRoZSBPcGVyYXRpb24ncyBjYW5jZWxsYXRpb24gYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgV29ya2Zsb3dcbiAqICAgKGkuZS4gYXQgd2hpY2ggbW9tZW50IHNob3VsZCB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0IHByb21pc2UgZmFpbCB3aXRoIGEgYE5leHVzT3BlcmF0aW9uRmFpbHVyZWAsXG4gKiAgIHdpdGggYGNhdXNlYCBzZXQgdG8gYSBgQ2FuY2VsbGVkRmFpbHVyZWApLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIGNhbmNlbGxhdGlvbiBvcmlnaW5hdGluZyBmcm9tIGFuIGV4dGVybmFsIHJlcXVlc3QgZm9yIHRoZVxuICogV29ya2Zsb3cgaXRzZWxmLCBvciBmcm9tIGludGVybmFsIGNhbmNlbGxhdGlvbiBvZiB0aGUgYENhbmNlbGxhdGlvblNjb3BlYCBpbiB3aGljaCB0aGVcbiAqIE9wZXJhdGlvbiBjYWxsIHdhcyBtYWRlLlxuICpcbiAqIEBleHBlcmltZW50YWwgTmV4dXMgc3VwcG9ydCBpbiBUZW1wb3JhbCBTREsgaXMgZXhwZXJpbWVudGFsLlxuICovXG4vLyBNQUlOVEVOQU5DRTogS2VlcCB0aGlzIHR5cGVkb2MgaW4gc3luYyB3aXRoIHRoZSBgU3RhcnROZXh1c09wZXJhdGlvbk9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZWAgZmllbGRcbmV4cG9ydCBjb25zdCBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPSB7XG4gIC8qKlxuICAgKiBEbyBub3QgcHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyB0byB0aGUgTmV4dXMgT3BlcmF0aW9uLCBhbmQgaW1tZWRpYXRlbHkgcmVwb3J0XG4gICAqIGNhbmNlbGxhdGlvbiB0byB0aGUgY2FsbGVyLlxuICAgKi9cbiAgQUJBTkRPTjogJ0FCQU5ET04nLFxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZvciB0aGUgTmV4dXMgb3BlcmF0aW9uIGFuZCBpbW1lZGlhdGVseSByZXBvcnQgY2FuY2VsbGF0aW9uIHRvXG4gICAqIHRoZSBjYWxsZXIuIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGNhbmNlbGxhdGlvbiBpcyBkZWxpdmVyZWQgdG8gdGhlIG9wZXJhdGlvbiBpZlxuICAgKiBjYWxsaW5nIHdvcmtmbG93IGV4aXRzIGJlZm9yZSB0aGUgZGVsaXZlcnkgaXMgZG9uZS4gSWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgY2FuY2VsbGF0aW9uIGlzXG4gICAqIGRlbGl2ZXJlZCB0byB0aGUgb3BlcmF0aW9uLCB1c2Uge0BsaW5rIFdBSVRfQ0FOQ0VMTEFUSU9OX1JFUVVFU1RFRH0uXG4gICAqXG4gICAqIFByb3BhZ2F0ZSBjYW5jZWxsYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBXb3JrZmxvdyB0byB0aGUgT3BlcmF0aW9uLCB5ZXQgX2ltbWVkaWF0ZWx5XyByZXBvcnRcbiAgICogY2FuY2VsbGF0aW9uIHRvIHRoZSBjYWxsZXIsIGkuZS4gd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvblxuICAgKiByZXF1ZXN0LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjYW5jZWxsYXRpb24gdHlwZSBwcm92aWRlcyBubyBndWFyYW50ZWUsIGZyb20gdGhlIFdvcmtmbG93LXNpZGUsIHRoYXQgdGhlXG4gICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBPcGVyYXRpb24gSGFuZGxlci4gSW4gcGFydGljdWxhciwgZWl0aGVyIHRoZVxuICAgKiBPcGVyYXRpb24gb3IgdGhlIFdvcmtmbG93IG1heSBjb21wbGV0ZSAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB1bmNlc3NmdWxseSkgYmVmb3JlIHRoZVxuICAgKiBjYW5jZWxsYXRpb24gcmVxdWVzdCBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZyBpbiBhIHNpdHVhdGlvbiB3aGVyZSB0aGUgT3BlcmF0aW9uIGNvbXBsZXRlZFxuICAgKiBzdWNjZXNzZnVsbHksIGJ1dCB0aGUgV29ya2Zsb3cgdGhpbmtzIGl0IHdhcyBjYW5jZWxsZWQuXG4gICAqXG4gICAqIFRvIGd1YXJhbnRlZSB0aGF0IHRoZSBPcGVyYXRpb24gd2lsbCBldmVudHVhbGx5IGJlIG5vdGlmaWVkIG9mIHRoZSBjYW5jZWxsYXRpb24gcmVxdWVzdCxcbiAgICogdXNlIHtAbGluayBXQUlUX0NBTkNFTExBVElPTl9SRVFVRVNURUR9LlxuICAgKi9cbiAgVFJZX0NBTkNFTDogJ1RSWV9DQU5DRUwnLFxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgZnJvbSB0aGUgV29ya2Zsb3cgdG8gdGhlIE9wZXJhdGlvbiwgdGhlbiB3YWl0IGZvciB0aGUgc2VydmVyXG4gICAqIHRvIGNvbmZpcm0gdGhhdCB0aGUgT3BlcmF0aW9uIGNhbmNlbGxhdGlvbiByZXF1ZXN0IHdhcyBkZWxpdmVyZWQgdG8gdGhlIE9wZXJhdGlvbiBIYW5kbGVyLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEJyxcblxuICAvKipcbiAgICogUHJvcGFnYXRlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGZyb20gdGhlIFdvcmtmbG93IHRvIHRoZSBPcGVyYXRpb24sIHRoZW4gd2FpdCBmb3IgY29tcGxldGlvblxuICAgKiBvZiB0aGUgT3BlcmF0aW9uLlxuICAgKi9cbiAgV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEOiAnV0FJVF9DQU5DRUxMQVRJT05fQ09NUExFVEVEJyxcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUgPVxuICAodHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSlba2V5b2YgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZV07XG5cbmNvbnN0IFtlbmNvZGVOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsIF9dID0gbWFrZVByb3RvRW51bUNvbnZlcnRlcnM8XG4gIGNvcmVzZGsubmV4dXMuTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLFxuICB0eXBlb2YgY29yZXNkay5uZXh1cy5OZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUsXG4gIGtleW9mIHR5cGVvZiBjb3Jlc2RrLm5leHVzLk5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgdHlwZW9mIE5leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZSxcbiAgJydcbj4oXG4gIHtcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLldBSVRfQ0FOQ0VMTEFUSU9OX0NPTVBMRVRFRF06IDAsXG4gICAgW05leHVzT3BlcmF0aW9uQ2FuY2VsbGF0aW9uVHlwZS5BQkFORE9OXTogMSxcbiAgICBbTmV4dXNPcGVyYXRpb25DYW5jZWxsYXRpb25UeXBlLlRSWV9DQU5DRUxdOiAyLFxuICAgIFtOZXh1c09wZXJhdGlvbkNhbmNlbGxhdGlvblR5cGUuV0FJVF9DQU5DRUxMQVRJT05fUkVRVUVTVEVEXTogMyxcbiAgfSBhcyBjb25zdCxcbiAgJydcbik7XG4iLCIvLyAuLi9wYWNrYWdlLmpzb24gaXMgb3V0c2lkZSBvZiB0aGUgVFMgcHJvamVjdCByb290RGlyIHdoaWNoIGNhdXNlcyBUUyB0byBjb21wbGFpbiBhYm91dCB0aGlzIGltcG9ydC5cbi8vIFdlIGRvIG5vdCB3YW50IHRvIGNoYW5nZSB0aGUgcm9vdERpciBiZWNhdXNlIGl0IG1lc3NlcyB1cCB0aGUgb3V0cHV0IHN0cnVjdHVyZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBwa2cgZnJvbSAnLi4vcGFja2FnZS5qc29uJztcblxuZXhwb3J0IGRlZmF1bHQgcGtnIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiIsIi8qKlxuICogVHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIFdvcmtmbG93IGVuZCBvZiB0aGUgc2lua3MgbWVjaGFuaXNtLlxuICpcbiAqIFNpbmtzIGFyZSBhIG1lY2hhbmlzbSBmb3IgZXhwb3J0aW5nIGRhdGEgZnJvbSB0aGUgV29ya2Zsb3cgaXNvbGF0ZSB0byB0aGVcbiAqIE5vZGUuanMgZW52aXJvbm1lbnQsIHRoZXkgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBXb3JrZmxvdyBoYXMgbm8gd2F5IHRvXG4gKiBjb21tdW5pY2F0ZSB3aXRoIHRoZSBvdXRzaWRlIFdvcmxkLlxuICpcbiAqIFNpbmtzIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgZXhwb3J0aW5nIGxvZ3MsIG1ldHJpY3MgYW5kIHRyYWNlcyBvdXQgZnJvbSB0aGVcbiAqIFdvcmtmbG93LlxuICpcbiAqIFNpbmsgZnVuY3Rpb25zIG1heSBub3QgcmV0dXJuIHZhbHVlcyB0byB0aGUgV29ya2Zsb3cgaW4gb3JkZXIgdG8gcHJldmVudFxuICogYnJlYWtpbmcgZGV0ZXJtaW5pc20uXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogQW55IGZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gYmUgdXNlZCBmb3IgU2luayBmdW5jdGlvbnMgYXMgbG9uZyBhcyB0aGUgcmV0dXJuIHR5cGUgaXMgYHZvaWRgLlxuICpcbiAqIFdoZW4gY2FsbGluZyBhIFNpbmsgZnVuY3Rpb24sIGFyZ3VtZW50cyBhcmUgY29waWVkIGZyb20gdGhlIFdvcmtmbG93IGlzb2xhdGUgdG8gdGhlIE5vZGUuanMgZW52aXJvbm1lbnQgdXNpbmdcbiAqIHtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3dvcmtlcl90aHJlYWRzLmh0bWwjd29ya2VyX3RocmVhZHNfcG9ydF9wb3N0bWVzc2FnZV92YWx1ZV90cmFuc2Zlcmxpc3QgfCBwb3N0TWVzc2FnZX0uXG5cbiAqIFRoaXMgY29uc3RyYWlucyB0aGUgYXJndW1lbnQgdHlwZXMgdG8gcHJpbWl0aXZlcyAoZXhjbHVkaW5nIFN5bWJvbHMpLlxuICovXG5leHBvcnQgdHlwZSBTaW5rRnVuY3Rpb24gPSAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbi8qKiBBIG1hcHBpbmcgb2YgbmFtZSB0byBmdW5jdGlvbiwgZGVmaW5lcyBhIHNpbmdsZSBzaW5rIChlLmcuIGxvZ2dlcikgKi9cbmV4cG9ydCB0eXBlIFNpbmsgPSBSZWNvcmQ8c3RyaW5nLCBTaW5rRnVuY3Rpb24+O1xuLyoqXG4gKiBXb3JrZmxvdyBTaW5rIGFyZSBhIG1hcHBpbmcgb2YgbmFtZSB0byB7QGxpbmsgU2lua31cbiAqL1xuZXhwb3J0IHR5cGUgU2lua3MgPSBSZWNvcmQ8c3RyaW5nLCBTaW5rPjtcblxuLyoqXG4gKiBDYWxsIGluZm9ybWF0aW9uIGZvciBhIFNpbmtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5rQ2FsbCB7XG4gIGlmYWNlTmFtZTogc3RyaW5nO1xuICBmbk5hbWU6IHN0cmluZztcbiAgYXJnczogYW55W107XG4gIHdvcmtmbG93SW5mbzogV29ya2Zsb3dJbmZvO1xufVxuXG4vKipcbiAqIEdldCBhIHJlZmVyZW5jZSB0byBTaW5rcyBmb3IgZXhwb3J0aW5nIGRhdGEgb3V0IG9mIHRoZSBXb3JrZmxvdy5cbiAqXG4gKiBUaGVzZSBTaW5rcyAqKm11c3QqKiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIFdvcmtlciBpbiBvcmRlciBmb3IgdGhpc1xuICogbWVjaGFuaXNtIHRvIHdvcmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwcm94eVNpbmtzLCBTaW5rcyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqXG4gKiBpbnRlcmZhY2UgTXlTaW5rcyBleHRlbmRzIFNpbmtzIHtcbiAqICAgbG9nZ2VyOiB7XG4gKiAgICAgaW5mbyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICogICAgIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gKiAgIH07XG4gKiB9XG4gKlxuICogY29uc3QgeyBsb2dnZXIgfSA9IHByb3h5U2lua3M8TXlEZXBlbmRlbmNpZXM+KCk7XG4gKiBsb2dnZXIuaW5mbygnc2V0dGluZyB1cCcpO1xuICpcbiAqIGV4cG9ydCBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICByZXR1cm4ge1xuICogICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gKiAgICAgICBsb2dnZXIuaW5mbyhcImhleSBob1wiKTtcbiAqICAgICAgIGxvZ2dlci5lcnJvcihcImxldHMgZ29cIik7XG4gKiAgICAgfVxuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eVNpbmtzPFQgZXh0ZW5kcyBTaW5rcz4oKTogVCB7XG4gIHJldHVybiBuZXcgUHJveHkoXG4gICAge30sXG4gICAge1xuICAgICAgZ2V0KF8sIGlmYWNlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGdldChfLCBmbk5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICAgICAgICAgICAgICAgJ1Byb3hpZWQgc2lua3MgZnVuY3Rpb25zIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBhY3RpdmF0b3Iuc2lua0NhbGxzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaWZhY2VOYW1lOiBpZmFjZU5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgZm5OYW1lOiBmbk5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgLy8gU2luayBmdW5jdGlvbiBkb2Vzbid0IGdldCBjYWxsZWQgaW1tZWRpYXRlbHkuIE1ha2UgYSBjbG9uZSBvZiB0aGUgc2luaydzIGFyZ3MsIHNvIHRoYXQgZnVydGhlciBtdXRhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZXNlIG9iamVjdHMgZG9uJ3QgY29ycnVwdCB0aGUgYXJncyB0aGF0IHRoZSBzaW5rIGZ1bmN0aW9uIHdpbGwgcmVjZWl2ZS4gT25seSBhdmFpbGFibGUgZnJvbSBub2RlIDE3LlxuICAgICAgICAgICAgICAgICAgYXJnczogKGdsb2JhbFRoaXMgYXMgYW55KS5zdHJ1Y3R1cmVkQ2xvbmUgPyAoZ2xvYmFsVGhpcyBhcyBhbnkpLnN0cnVjdHVyZWRDbG9uZShhcmdzKSA6IGFyZ3MsXG4gICAgICAgICAgICAgICAgICAvLyBhY3RpdmF0b3IuaW5mbyBpcyBpbnRlcm5hbGx5IGNvcHktb24td3JpdGUuIFRoaXMgZW5zdXJlIHRoYXQgYW55IGZ1cnRoZXIgbXV0YXRpb25zXG4gICAgICAgICAgICAgICAgICAvLyB0byB0aGUgd29ya2Zsb3cgc3RhdGUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByZXNlbnQgYWN0aXZhdGlvbiB3aWxsIG5vdCBjb3JydXB0IHRoZVxuICAgICAgICAgICAgICAgICAgLy8gd29ya2Zsb3dJbmZvIHN0YXRlIHRoYXQgZ2V0cyBwYXNzZWQgd2hlbiB0aGUgc2luayBmdW5jdGlvbiBhY3R1YWxseSBnZXRzIGNhbGxlZC5cbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93SW5mbzogYWN0aXZhdG9yLmluZm8sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfVxuICApIGFzIGFueTtcbn1cbiIsImltcG9ydCB7IG1heWJlR2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHByb21pc2UgZnJvbSBiZWluZyB0cmFja2VkIGZvciBzdGFjayB0cmFjZSBxdWVyeSBwdXJwb3Nlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW50cmFja1Byb21pc2UocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICBjb25zdCBzdG9yZSA9IG1heWJlR2V0QWN0aXZhdG9yKCk/LnByb21pc2VTdGFja1N0b3JlO1xuICBpZiAoIXN0b3JlKSByZXR1cm47XG4gIHN0b3JlLmNoaWxkVG9QYXJlbnQuZGVsZXRlKHByb21pc2UpO1xuICBzdG9yZS5wcm9taXNlVG9TdGFjay5kZWxldGUocHJvbWlzZSk7XG59XG4iLCJpbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSB9IGZyb20gJy4vY2FuY2VsbGF0aW9uLXNjb3BlJztcbmltcG9ydCB7IHVudHJhY2tQcm9taXNlIH0gZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcblxuLyoqXG4gKiBBIGBQcm9taXNlTGlrZWAgaGVscGVyIHdoaWNoIGV4cG9zZXMgaXRzIGByZXNvbHZlYCBhbmQgYHJlamVjdGAgbWV0aG9kcy5cbiAqXG4gKiBUcmlnZ2VyIGlzIENhbmNlbGxhdGlvblNjb3BlLWF3YXJlOiBpdCBpcyBsaW5rZWQgdG8gdGhlIGN1cnJlbnQgc2NvcGUgb25cbiAqIGNvbnN0cnVjdGlvbiBhbmQgdGhyb3dzIHdoZW4gdGhhdCBzY29wZSBpcyBjYW5jZWxsZWQuXG4gKlxuICogVXNlZnVsIGZvciBlLmcuIHdhaXRpbmcgZm9yIHVuYmxvY2tpbmcgYSBXb3JrZmxvdyBmcm9tIGEgU2lnbmFsLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgZGVmaW5lU2lnbmFsLCBzZXRIYW5kbGVyLCBzbGVlcCwgVHJpZ2dlciB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqXG4gKiBjb25zdCBjb21wbGV0ZVVzZXJJbnRlcmFjdGlvbiA9IGRlZmluZVNpZ25hbCgnY29tcGxldGVVc2VySW50ZXJhY3Rpb24nKTtcbiAqXG4gKiBleHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdE9uVXNlcih1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICogICBjb25zdCB1c2VySW50ZXJhY3Rpb24gPSBuZXcgVHJpZ2dlcjxib29sZWFuPigpO1xuICpcbiAqICAgLy8gcHJvZ3JhbW1hdGljYWxseSByZXNvbHZlIFRyaWdnZXJcbiAqICAgc2V0SGFuZGxlcihjb21wbGV0ZVVzZXJJbnRlcmFjdGlvbiwgKCkgPT4gdXNlckludGVyYWN0aW9uLnJlc29sdmUodHJ1ZSkpO1xuICpcbiAqICAgY29uc3QgdXNlckludGVyYWN0ZWQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3VzZXJJbnRlcmFjdGlvbiwgc2xlZXAoJzMwIGRheXMnKV0pO1xuICogICBpZiAoIXVzZXJJbnRlcmFjdGVkKSB7XG4gKiAgICAgYXdhaXQgc2VuZFJlbWluZGVyRW1haWwodXNlcklkKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4ge1xuICAvLyBUeXBlc2NyaXB0IGRvZXMgbm90IHJlYWxpemUgdGhhdCB0aGUgcHJvbWlzZSBleGVjdXRvciBpcyBydW4gc3luY2hyb25vdXNseSBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyByZWFkb25seSByZXNvbHZlOiAodmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyByZWFkb25seSByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9taXNlOiBQcm9taXNlPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgICAgaWYgKHNjb3BlLmNhbmNlbGxhYmxlKSB7XG4gICAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICB9KTtcbiAgICAvLyBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uc1xuICAgIHVudHJhY2tQcm9taXNlKHRoaXMucHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuXG4gIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IHVuZGVmaW5lZCB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGxcbiAgKTogUHJvbWlzZUxpa2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgIHJldHVybiB0aGlzLnByb21pc2UudGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXN5bmNMb2NhbFN0b3JhZ2UgYXMgQUxTIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8qKlxuICogT3B0aW9uIGZvciBjb25zdHJ1Y3RpbmcgYSBVcGRhdGVTY29wZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVNjb3BlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiAgQSB3b3JrZmxvdy11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB1cGRhdGUuXG4gICAqL1xuICBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgVGhlIHVwZGF0ZSB0eXBlIG5hbWUuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbi8vIEFzeW5jTG9jYWxTdG9yYWdlIGlzIGluamVjdGVkIHZpYSB2bSBtb2R1bGUgaW50byBnbG9iYWwgc2NvcGUuXG4vLyBJbiBjYXNlIFdvcmtmbG93IGNvZGUgaXMgaW1wb3J0ZWQgaW4gTm9kZS5qcyBjb250ZXh0LCByZXBsYWNlIHdpdGggYW4gZW1wdHkgY2xhc3MuXG5leHBvcnQgY29uc3QgQXN5bmNMb2NhbFN0b3JhZ2U6IG5ldyA8VD4oKSA9PiBBTFM8VD4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLkFzeW5jTG9jYWxTdG9yYWdlID8/IGNsYXNzIHt9O1xuXG5leHBvcnQgY2xhc3MgVXBkYXRlU2NvcGUge1xuICAvKipcbiAgICogIEEgd29ya2Zsb3ctdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdXBkYXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBUaGUgdXBkYXRlIHR5cGUgbmFtZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVXBkYXRlU2NvcGVPcHRpb25zKSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQ7XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIHRoZSBzY29wZSBhcyBjdXJyZW50IGFuZCBydW4gdGhlIHVwZGF0ZSBoYW5kbGVyIGBmbmAuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBgZm5gXG4gICAqL1xuICBydW48VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gc3RvcmFnZS5ydW4odGhpcywgZm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBcImFjdGl2ZVwiIHVwZGF0ZSBzY29wZS5cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KCk6IFVwZGF0ZVNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gc3RvcmFnZS5nZXRTdG9yZSgpO1xuICB9XG5cbiAgLyoqIEFsaWFzIHRvIGBuZXcgVXBkYXRlU2NvcGUoeyBpZCwgbmFtZSB9KS5ydW4oZm4pYCAqL1xuICBzdGF0aWMgdXBkYXRlV2l0aEluZm88VD4oaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgdGhpcyh7IGlkLCBuYW1lIH0pLnJ1bihmbik7XG4gIH1cbn1cblxuY29uc3Qgc3RvcmFnZTogQUxTPFVwZGF0ZVNjb3BlPiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuIiwiLyoqXG4gKiBFeHBvcnRlZCBmdW5jdGlvbnMgZm9yIHRoZSBXb3JrZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgV29ya2Zsb3cgaXNvbGF0ZVxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuaW1wb3J0IHsgZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yLCBJbGxlZ2FsU3RhdGVFcnJvciB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbic7XG5pbXBvcnQgeyBjb21wb3NlSW50ZXJjZXB0b3JzIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUgeyBjb3Jlc2RrIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludGVyY2VwdG9yc0ZhY3RvcnkgfSBmcm9tICcuL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93Q3JlYXRlT3B0aW9uc0ludGVybmFsIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFjdGl2YXRvciB9IGZyb20gJy4vaW50ZXJuYWxzJztcbmltcG9ydCB7IHNldEFjdGl2YXRvciwgZ2V0QWN0aXZhdG9yLCBtYXliZUdldEFjdGl2YXRvciB9IGZyb20gJy4vZ2xvYmFsLWF0dHJpYnV0ZXMnO1xuXG4vLyBFeHBvcnQgdGhlIHR5cGUgZm9yIHVzZSBvbiB0aGUgXCJ3b3JrZXJcIiBzaWRlXG5leHBvcnQgeyBQcm9taXNlU3RhY2tTdG9yZSB9IGZyb20gJy4vaW50ZXJuYWxzJztcblxuY29uc3QgT3JpZ2luYWxEYXRlID0gZ2xvYmFsVGhpcy5EYXRlO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGlzb2xhdGUgcnVudGltZS5cbiAqXG4gKiBTZXRzIHJlcXVpcmVkIGludGVybmFsIHN0YXRlIGFuZCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtmbG93IGFuZCBpbnRlcmNlcHRvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0UnVudGltZShvcHRpb25zOiBXb3JrZmxvd0NyZWF0ZU9wdGlvbnNJbnRlcm5hbCk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBuZXcgQWN0aXZhdG9yKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGluZm86IGZpeFByb3RvdHlwZXMoe1xuICAgICAgLi4ub3B0aW9ucy5pbmZvLFxuICAgICAgdW5zYWZlOiB7IC4uLm9wdGlvbnMuaW5mby51bnNhZmUsIG5vdzogT3JpZ2luYWxEYXRlLm5vdyB9LFxuICAgIH0pLFxuICB9KTtcbiAgLy8gVGhlcmUncyBvbmUgYWN0aXZhdG9yIHBlciB3b3JrZmxvdyBpbnN0YW5jZSwgc2V0IGl0IGdsb2JhbGx5IG9uIHRoZSBjb250ZXh0LlxuICAvLyBXZSBkbyB0aGlzIGJlZm9yZSBpbXBvcnRpbmcgYW55IHVzZXIgY29kZSBzbyB1c2VyIGNvZGUgY2FuIHN0YXRpY2FsbHkgcmVmZXJlbmNlIEB0ZW1wb3JhbGlvL3dvcmtmbG93IGZ1bmN0aW9uc1xuICAvLyBhcyB3ZWxsIGFzIERhdGUgYW5kIE1hdGgucmFuZG9tLlxuICBzZXRBY3RpdmF0b3IoYWN0aXZhdG9yKTtcblxuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIC8vIHdlYnBhY2sgYWxpYXMgdG8gcGF5bG9hZENvbnZlcnRlclBhdGhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGN1c3RvbVBheWxvYWRDb252ZXJ0ZXIgPSByZXF1aXJlKCdfX3RlbXBvcmFsX2N1c3RvbV9wYXlsb2FkX2NvbnZlcnRlcicpLnBheWxvYWRDb252ZXJ0ZXI7XG4gICAgLy8gVGhlIGBwYXlsb2FkQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgICBpZiAoY3VzdG9tUGF5bG9hZENvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciA9IGN1c3RvbVBheWxvYWRDb252ZXJ0ZXI7XG4gICAgfVxuICAgIC8vIHdlYnBhY2sgYWxpYXMgdG8gZmFpbHVyZUNvbnZlcnRlclBhdGhcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXIgPSByZXF1aXJlKCdfX3RlbXBvcmFsX2N1c3RvbV9mYWlsdXJlX2NvbnZlcnRlcicpLmZhaWx1cmVDb252ZXJ0ZXI7XG4gICAgLy8gVGhlIGBmYWlsdXJlQ29udmVydGVyYCBleHBvcnQgaXMgdmFsaWRhdGVkIGluIHRoZSBXb3JrZXJcbiAgICBpZiAoY3VzdG9tRmFpbHVyZUNvbnZlcnRlciAhPSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IuZmFpbHVyZUNvbnZlcnRlciA9IGN1c3RvbUZhaWx1cmVDb252ZXJ0ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpbXBvcnRXb3JrZmxvd3MsIGltcG9ydEludGVyY2VwdG9ycyB9ID0gZ2xvYmFsVGhpcy5fX1RFTVBPUkFMX187XG4gICAgaWYgKGltcG9ydFdvcmtmbG93cyA9PT0gdW5kZWZpbmVkIHx8IGltcG9ydEludGVyY2VwdG9ycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXJyb3IoJ1dvcmtmbG93IGJ1bmRsZSBkaWQgbm90IHJlZ2lzdGVyIGltcG9ydCBob29rcycpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IGltcG9ydEludGVyY2VwdG9ycygpO1xuICAgIGZvciAoY29uc3QgbW9kIG9mIGludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgZmFjdG9yeTogV29ya2Zsb3dJbnRlcmNlcHRvcnNGYWN0b3J5ID0gbW9kLmludGVyY2VwdG9ycztcbiAgICAgIGlmIChmYWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3b3JrZmxvd3MgaW50ZXJjZXB0b3JzOiBleHBlY3RlZCBhIGZ1bmN0aW9uLCBidXQgZ290OiAnJHtmYWN0b3J5fSdgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnRlcmNlcHRvcnMgPSBmYWN0b3J5KCk7XG4gICAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMuaW5ib3VuZC5wdXNoKC4uLihpbnRlcmNlcHRvcnMuaW5ib3VuZCA/PyBbXSkpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLnB1c2goLi4uKGludGVyY2VwdG9ycy5vdXRib3VuZCA/PyBbXSkpO1xuICAgICAgICBhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscy5wdXNoKC4uLihpbnRlcmNlcHRvcnMuaW50ZXJuYWxzID8/IFtdKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbW9kID0gaW1wb3J0V29ya2Zsb3dzKCk7XG4gICAgY29uc3Qgd29ya2Zsb3dGbiA9IG1vZFthY3RpdmF0b3IuaW5mby53b3JrZmxvd1R5cGVdO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZmxvd0ZuID0gbW9kWydkZWZhdWx0J107XG5cbiAgICBpZiAodHlwZW9mIHdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFjdGl2YXRvci53b3JrZmxvdyA9IHdvcmtmbG93Rm47XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmYXVsdFdvcmtmbG93Rm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFjdGl2YXRvci53b3JrZmxvdyA9IGRlZmF1bHRXb3JrZmxvd0ZuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZXRhaWxzID1cbiAgICAgICAgd29ya2Zsb3dGbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyAnbm8gc3VjaCBmdW5jdGlvbiBpcyBleHBvcnRlZCBieSB0aGUgd29ya2Zsb3cgYnVuZGxlJ1xuICAgICAgICAgIDogYGV4cGVjdGVkIGEgZnVuY3Rpb24sIGJ1dCBnb3Q6ICcke3R5cGVvZiB3b3JrZmxvd0ZufSdgO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2Zsb3cgb2YgdHlwZSAnJHthY3RpdmF0b3IuaW5mby53b3JrZmxvd1R5cGV9JzogJHtkZXRhaWxzfWApO1xuICAgIH1cbiAgICBpZiAoaXNXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnMoYWN0aXZhdG9yLndvcmtmbG93KSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3RpdmF0b3Iud29ya2Zsb3cud29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYWN0aXZhdG9yLnZlcnNpb25pbmdCZWhhdmlvciA9IGFjdGl2YXRvci53b3JrZmxvdy53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zLnZlcnNpb25pbmdCZWhhdmlvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRvci53b3JrZmxvd0RlZmluaXRpb25PcHRpb25zR2V0dGVyID0gYWN0aXZhdG9yLndvcmtmbG93LndvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENvcmUgd29uJ3Qgc2VuZCBhbiBldmljdGlvbiBqb2IgYWZ0ZXIgYW4gZWFybHkgZXJyb3IsIHNvIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgdHJpZ2dlcmluZ1xuICAgICAgLy8gZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0LiBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHJlc291cmNlIGxlYWtzLlxuICAgICAgZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKF9pbm5lckVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3IgZGlzcG9zaW5nIG9mIGFjdGl2YXRvciwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gcmV0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3JcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIE9iamVjdHMgdHJhbnNmZXJlZCB0byB0aGUgVk0gZnJvbSBvdXRzaWRlIGhhdmUgcHJvdG90eXBlcyBiZWxvbmdpbmcgdG8gdGhlXG4gKiBvdXRlciBjb250ZXh0LCB3aGljaCBtZWFucyB0aGF0IGluc3RhbmNlb2Ygd29uJ3Qgd29yayBpbnNpZGUgdGhlIFZNLiBUaGlzXG4gKiBmdW5jdGlvbiByZWN1cnNpdmVseSB3YWxrcyBvdmVyIHRoZSBjb250ZW50IG9mIGFuIG9iamVjdCwgYW5kIHJlY3JlYXRlIHNvbWVcbiAqIG9mIHRoZXNlIG9iamVjdHMgKG5vdGFibHkgQXJyYXksIERhdGUgYW5kIE9iamVjdHMpLlxuICovXG5mdW5jdGlvbiBmaXhQcm90b3R5cGVzPFg+KG9iajogWCk6IFgge1xuICBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopPy5jb25zdHJ1Y3Rvcj8ubmFtZSkge1xuICAgICAgY2FzZSAnQXJyYXknOlxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSgob2JqIGFzIEFycmF5PHVua25vd24+KS5tYXAoZml4UHJvdG90eXBlcykpIGFzIFg7XG4gICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iaiBhcyB1bmtub3duIGFzIERhdGUpIGFzIFg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pOiBbc3RyaW5nLCBhbnldID0+IFtrLCBmaXhQcm90b3R5cGVzKHYpXSkpIGFzIFg7XG4gICAgfVxuICB9IGVsc2UgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSB3b3JrZmxvdy4gT3IgdG8gYmUgZXhhY3QsIF9jb21wbGV0ZV8gaW5pdGlhbGl6YXRpb24sIGFzIG1vc3QgcGFydCBoYXMgYmVlbiBkb25lIGluIGNvbnN0cnVjdG9yKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemUoaW5pdGlhbGl6ZVdvcmtmbG93Sm9iOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uSUluaXRpYWxpemVXb3JrZmxvdyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IuaW5pdGlhbGl6ZVdvcmtmbG93KGluaXRpYWxpemVXb3JrZmxvd0pvYik7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gYSBjaHVuayBvZiBhY3RpdmF0aW9uIGpvYnMuXG4gKlxuICogTm90aWNlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgYXN5bmMgYW5kIHJ1bnMgX2luc2lkZV8gdGhlIFZNIGNvbnRleHQuIFRoZXJlZm9yZSwgbm8gbWljcm90YXNrXG4gKiB3aWxsIGdldCBleGVjdXRlZCBfd2hpbGVfIHRoaXMgZnVuY3Rpb24gaXMgYWN0aXZlOyB0aGV5IHdpbGwgaG93ZXZlciBnZXQgZXhlY3V0ZWQgX2FmdGVyXyB0aGlzXG4gKiBmdW5jdGlvbiByZXR1cm5zIChpLmUuIGFsbCBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzIGluIHRoZSBWTSB3aWxsIGdldCBleGVjdXRlZCBiZWZvcmUgZXhlY3V0aW9uXG4gKiByZXN1bWVzIG91dCBvZiB0aGUgVk0sIGluIGB2bS1zaGFyZWQudHM6YWN0aXZhdGUoKWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZhdGUoYWN0aXZhdGlvbjogY29yZXNkay53b3JrZmxvd19hY3RpdmF0aW9uLklXb3JrZmxvd0FjdGl2YXRpb24sIGJhdGNoSW5kZXggPSAwKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGludGVyY2VwdCA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdhY3RpdmF0ZScsICh7IGFjdGl2YXRpb24gfSkgPT4ge1xuICAgICAgLy8gQ2FzdCBmcm9tIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNsYXNzIHdoaWNoIGhhcyB0aGUgYHZhcmlhbnRgIGF0dHJpYnV0ZS5cbiAgICAgIC8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBhY3RpdmF0aW9uIGlzIGEgcHJvdG8gY2xhc3MuXG4gICAgICBjb25zdCBqb2JzID0gYWN0aXZhdGlvbi5qb2JzIGFzIGNvcmVzZGsud29ya2Zsb3dfYWN0aXZhdGlvbi5Xb3JrZmxvd0FjdGl2YXRpb25Kb2JbXTtcblxuICAgICAgLy8gSW5pdGlhbGl6YXRpb24gd2lsbCBoYXZlIGJlZW4gaGFuZGxlZCBhbHJlYWR5LCBidXQgd2UgbWlnaHQgc3RpbGwgbmVlZCB0byBzdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAgIGNvbnN0IHN0YXJ0V29ya2Zsb3dKb2IgPSBqb2JzWzBdPy52YXJpYW50ID09PSAnaW5pdGlhbGl6ZVdvcmtmbG93JyA/IGpvYnMuc2hpZnQoKT8uaW5pdGlhbGl6ZVdvcmtmbG93IDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgIGlmIChqb2IudmFyaWFudCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBqb2IudmFyaWFudCB0byBiZSBkZWZpbmVkJyk7XG5cbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGpvYltqb2IudmFyaWFudF07XG4gICAgICAgIGlmICghdmFyaWFudCkgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgam9iLiR7am9iLnZhcmlhbnR9IHRvIGJlIHNldGApO1xuXG4gICAgICAgIGFjdGl2YXRvcltqb2IudmFyaWFudF0odmFyaWFudCBhcyBhbnkgLyogVFMgY2FuJ3QgaW5mZXIgdGhpcyB0eXBlICovKTtcblxuICAgICAgICBpZiAoam9iLnZhcmlhbnQgIT09ICdxdWVyeVdvcmtmbG93JykgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0V29ya2Zsb3dKb2IpIHtcbiAgICAgICAgY29uc3Qgc2FmZUpvYlR5cGVzOiBjb3Jlc2RrLndvcmtmbG93X2FjdGl2YXRpb24uV29ya2Zsb3dBY3RpdmF0aW9uSm9iWyd2YXJpYW50J11bXSA9IFtcbiAgICAgICAgICAnaW5pdGlhbGl6ZVdvcmtmbG93JyxcbiAgICAgICAgICAnc2lnbmFsV29ya2Zsb3cnLFxuICAgICAgICAgICdkb1VwZGF0ZScsXG4gICAgICAgICAgJ2NhbmNlbFdvcmtmbG93JyxcbiAgICAgICAgICAndXBkYXRlUmFuZG9tU2VlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChqb2JzLnNvbWUoKGpvYikgPT4gIXNhZmVKb2JUeXBlcy5pbmNsdWRlcyhqb2IudmFyaWFudCkpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdSZWNlaXZlZCBib3RoIGluaXRpYWxpemVXb3JrZmxvdyBhbmQgbm9uLXNpZ25hbC9ub24tdXBkYXRlIGpvYnMgaW4gdGhlIHNhbWUgYWN0aXZhdGlvbjogJyArXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGpvYnMubWFwKChqb2IpID0+IGpvYi52YXJpYW50KSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgYWN0aXZhdG9yLnN0YXJ0V29ya2Zsb3coc3RhcnRXb3JrZmxvd0pvYik7XG5cbiAgICAgICAgdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnRlcmNlcHQoeyBhY3RpdmF0aW9uLCBiYXRjaEluZGV4IH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQ29uY2x1ZGUgYSBzaW5nbGUgYWN0aXZhdGlvbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgYWN0aXZhdGlvbiBqb2JzIGFuZCBxdWV1ZWQgbWljcm90YXNrcy5cbiAqXG4gKiBBY3RpdmF0aW9uIGZhaWx1cmVzIGFyZSBoYW5kbGVkIGluIHRoZSBtYWluIE5vZGUuanMgaXNvbGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNsdWRlQWN0aXZhdGlvbigpOiBjb3Jlc2RrLndvcmtmbG93X2NvbXBsZXRpb24uSVdvcmtmbG93QWN0aXZhdGlvbkNvbXBsZXRpb24ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhY3RpdmF0b3IucmVqZWN0QnVmZmVyZWRVcGRhdGVzKCk7XG4gICAgY29uc3QgaW50ZXJjZXB0ID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLmludGVybmFscywgJ2NvbmNsdWRlQWN0aXZhdGlvbicsIChpbnB1dCkgPT4gaW5wdXQpO1xuICAgIGNvbnN0IGFjdGl2YXRpb25Db21wbGV0aW9uID0gYWN0aXZhdG9yLmNvbmNsdWRlQWN0aXZhdGlvbigpO1xuICAgIGNvbnN0IHsgY29tbWFuZHMgfSA9IGludGVyY2VwdCh7IGNvbW1hbmRzOiBhY3RpdmF0aW9uQ29tcGxldGlvbi5jb21tYW5kcyB9KTtcbiAgICBpZiAoYWN0aXZhdG9yLmNvbXBsZXRlZCkge1xuICAgICAgYWN0aXZhdG9yLndhcm5JZlVuZmluaXNoZWRIYW5kbGVycygpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcnVuSWQ6IGFjdGl2YXRvci5pbmZvLnJ1bklkLFxuICAgICAgc3VjY2Vzc2Z1bDoge1xuICAgICAgICAuLi5hY3RpdmF0aW9uQ29tcGxldGlvbixcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlVmVyc2lvbmluZ0JlaGF2aW9yKGFjdGl2YXRpb25Db21wbGV0aW9uLnZlcnNpb25pbmdCZWhhdmlvciksXG4gICAgICB9LFxuICAgIH07XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29wIHRocm91Z2ggYWxsIGJsb2NrZWQgY29uZGl0aW9ucywgZXZhbHVhdGUgYW5kIHVuYmxvY2sgaWYgcG9zc2libGUuXG4gKlxuICogQHJldHVybnMgbnVtYmVyIG9mIHVuYmxvY2tlZCBjb25kaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ5VW5ibG9ja0NvbmRpdGlvbnMoKTogbnVtYmVyIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IHRydWU7XG4gIHRyeSB7XG4gICAgbGV0IG51bVVuYmxvY2tlZCA9IDA7XG4gICAgZm9yICg7Oykge1xuICAgICAgYWN0aXZhdG9yLm1heWJlUmV0aHJvd1dvcmtmbG93VGFza0Vycm9yKCk7XG4gICAgICBjb25zdCBwcmV2VW5ibG9ja2VkID0gbnVtVW5ibG9ja2VkO1xuICAgICAgZm9yIChjb25zdCBbc2VxLCBjb25kXSBvZiBhY3RpdmF0b3IuYmxvY2tlZENvbmRpdGlvbnMuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChjb25kLmZuKCkpIHtcbiAgICAgICAgICBjb25kLnJlc29sdmUoKTtcbiAgICAgICAgICBudW1VbmJsb2NrZWQrKztcbiAgICAgICAgICAvLyBJdCBpcyBzYWZlIHRvIGRlbGV0ZSBlbGVtZW50cyBkdXJpbmcgbWFwIGl0ZXJhdGlvblxuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByZXZVbmJsb2NrZWQgPT09IG51bVVuYmxvY2tlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bVVuYmxvY2tlZDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmF0b3IucmV0aHJvd1N5bmNocm9ub3VzbHkgPSBmYWxzZTtcbiAgfVxufVxuXG4vLyBIYW5kbGUgZGlzcG9zYWwgb2YgdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBjb250ZXh0IChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBkZXN0cm95aW5nXG4vLyB0aGUgc2FuZGJveCB2bSwgd2hpY2ggbWF5IHBvc3NpYmx5IGJlIHJldXNlZCBpZiBgcmV1c2VWOENvbnRleHRgIGlzIHRydWUpLlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgYWN0aXZhdG9yLnJldGhyb3dTeW5jaHJvbm91c2x5ID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzcG9zZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5pbnRlcm5hbHMsICdkaXNwb3NlJywgYXN5bmMgKCkgPT4ge30pO1xuICAgICAgZGlzcG9zZSh7fSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IgPSBlO1xuICAgIH1cblxuICAgIC8vIERlc3RydWN0b3JzIGFyZSBydW4gb3V0c2lkZSBvZiBpbnRlcmNlcHRvcnMsIGJlY2F1c2UgaW50ZXJjZXB0b3JzIHRoZW1zZWx2ZXMgb2Z0ZW4gcmVseVxuICAgIC8vIG9uIG9iamVjdHMgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZCAobm90YWJseSBBc3luY0xvY2FsU3RvcmFnZSBpbnN0YW5jZXMpLCBhbmQgYmVjYXVzZSB3ZVxuICAgIC8vIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgcmVzb3VyY2VzIGdldCBjbGVhbmVkIHVwIGV2ZW4gaWYgYW4gaW50ZXJjZXB0b3IgdGhyb3dzIGFuIGVycm9yLlxuICAgIC8vIE9ubHkgdGhlIGZpcnN0IGVycm9yIChpZiBhbnkpIGlzIHJldGhyb3duLlxuICAgIGZvciAoY29uc3QgZGVzdHJ1Y3RvciBvZiBhY3RpdmF0b3Iud29ya2Zsb3dTYW5kYm94RGVzdHJ1Y3RvcnMuc3BsaWNlKDApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZXN0cnVjdG9yKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2YXRvci5yZXRocm93U3luY2hyb25vdXNseSA9IGZhbHNlO1xuXG4gICAgLy8gVGhlIGFjdGl2YXRvciBpcyBubyBsb25nZXIgdmFsaWQgcGFzdCB0aGlzIHBvaW50LlxuICAgIHNldEFjdGl2YXRvcih1bmRlZmluZWQpO1xuICB9XG59XG5cbi8vIERlc3Ryb3kgdGhlIHNhbmRib3ggVk0gKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRpc3Bvc2luZyBvZiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQpLlxuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3koKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IG1heWJlR2V0QWN0aXZhdG9yKCk7XG4gIGlmIChhY3RpdmF0b3IpIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFcnJvcignV29ya2Zsb3cgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGhhdmUgYmVlbiBkaXNwb3NlZCBmaXJzdCcpO1xuXG4gIGxldCBlcnJvcjogdW5rbm93biB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBkZXN0cnVjdG9yIG9mIGdsb2JhbFRoaXMuX190ZW1wb3JhbF9nbG9iYWxTYW5kYm94RGVzdHJ1Y3RvcnM/LnNwbGljZSgwKSA/PyBbXSkge1xuICAgIHRyeSB7XG4gICAgICBkZXN0cnVjdG9yKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGVycm9yID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtmbG93RnVuY3Rpb25XaXRoT3B0aW9ucyhvYmo6IGFueSk6IG9iaiBpcyBXb3JrZmxvd0Z1bmN0aW9uV2l0aE9wdGlvbnM8YW55W10sIGFueT4ge1xuICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24ob2JqLCAnd29ya2Zsb3dEZWZpbml0aW9uT3B0aW9ucycpO1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBBY3Rpdml0eUZ1bmN0aW9uLFxuICBBY3Rpdml0eU9wdGlvbnMsXG4gIExvY2FsQWN0aXZpdHlPcHRpb25zLFxuICBRdWVyeURlZmluaXRpb24sXG4gIFNlYXJjaEF0dHJpYnV0ZXMsXG4gIFNlYXJjaEF0dHJpYnV0ZVZhbHVlLFxuICBTaWduYWxEZWZpbml0aW9uLFxuICBVbnR5cGVkQWN0aXZpdGllcyxcbiAgVXBkYXRlRGVmaW5pdGlvbixcbiAgV2l0aFdvcmtmbG93QXJncyxcbiAgV29ya2Zsb3csXG4gIFdvcmtmbG93UmVzdWx0VHlwZSxcbiAgV29ya2Zsb3dSZXR1cm5UeXBlLFxuICBXb3JrZmxvd1VwZGF0ZVZhbGlkYXRvclR5cGUsXG4gIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gIFdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnNPckdldHRlcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7XG4gIGNvbXBpbGVSZXRyeVBvbGljeSxcbiAgY29tcGlsZVByaW9yaXR5LFxuICBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVdvcmtmbG93SWRSZXVzZVBvbGljeSxcbiAgZXh0cmFjdFdvcmtmbG93VHlwZSxcbiAgSGFuZGxlclVuZmluaXNoZWRQb2xpY3ksXG4gIG1hcFRvUGF5bG9hZHMsXG4gIHRvUGF5bG9hZHMsXG4gIFR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uJztcbmltcG9ydCB7IHVzZXJNZXRhZGF0YVRvUGF5bG9hZCB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdXNlci1tZXRhZGF0YSc7XG5pbXBvcnQge1xuICBlbmNvZGVVbmlmaWVkU2VhcmNoQXR0cmlidXRlcyxcbiAgc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlcixcbn0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9jb252ZXJ0ZXIvcGF5bG9hZC1zZWFyY2gtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyB2ZXJzaW9uaW5nSW50ZW50VG9Qcm90byB9IGZyb20gJ0B0ZW1wb3JhbGlvL2NvbW1vbi9saWIvdmVyc2lvbmluZy1pbnRlbnQtZW51bSc7XG5pbXBvcnQgdHlwZSB7IER1cmF0aW9uIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IG1zT3B0aW9uYWxUb1RzLCBtc1RvTnVtYmVyLCBtc1RvVHMsIHJlcXVpcmVkVHNUb01zIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi90aW1lJztcbmltcG9ydCB7IGNvbXBvc2VJbnRlcmNlcHRvcnMgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24vbGliL2ludGVyY2VwdG9ycyc7XG5pbXBvcnQgdHlwZSB7IHRlbXBvcmFsIH0gZnJvbSAnQHRlbXBvcmFsaW8vcHJvdG8nO1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9pbnRlcm5hbC13b3JrZmxvdyc7XG5pbXBvcnQgeyB0aHJvd0lmUmVzZXJ2ZWROYW1lIH0gZnJvbSAnQHRlbXBvcmFsaW8vY29tbW9uL2xpYi9yZXNlcnZlZCc7XG5pbXBvcnQgeyBDYW5jZWxsYXRpb25TY29wZSwgcmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uIH0gZnJvbSAnLi9jYW5jZWxsYXRpb24tc2NvcGUnO1xuaW1wb3J0IHsgVXBkYXRlU2NvcGUgfSBmcm9tICcuL3VwZGF0ZS1zY29wZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEFjdGl2aXR5SW5wdXQsXG4gIExvY2FsQWN0aXZpdHlJbnB1dCxcbiAgU2lnbmFsV29ya2Zsb3dJbnB1dCxcbiAgU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQsXG4gIFRpbWVySW5wdXQsXG4gIFRpbWVyT3B0aW9ucyxcbn0gZnJvbSAnLi9pbnRlcmNlcHRvcnMnO1xuaW1wb3J0IHR5cGUge1xuICBDaGlsZFdvcmtmbG93T3B0aW9ucyxcbiAgQ2hpbGRXb3JrZmxvd09wdGlvbnNXaXRoRGVmYXVsdHMsXG4gIENvbnRpbnVlQXNOZXdPcHRpb25zLFxuICBEZWZhdWx0U2lnbmFsSGFuZGxlcixcbiAgRW5oYW5jZWRTdGFja1RyYWNlLFxuICBIYW5kbGVyLFxuICBRdWVyeUhhbmRsZXJPcHRpb25zLFxuICBTaWduYWxIYW5kbGVyT3B0aW9ucyxcbiAgVXBkYXRlSGFuZGxlck9wdGlvbnMsXG4gIFdvcmtmbG93SW5mbyxcbiAgVXBkYXRlSW5mbyxcbiAgRGVmYXVsdFVwZGF0ZUhhbmRsZXIsXG4gIERlZmF1bHRRdWVyeUhhbmRsZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuICBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZSxcbiAgQ29udGludWVBc05ldyxcbiAgZW5jb2RlQ2hpbGRXb3JrZmxvd0NhbmNlbGxhdGlvblR5cGUsXG4gIGVuY29kZVBhcmVudENsb3NlUG9saWN5LFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTG9jYWxBY3Rpdml0eURvQmFja29mZiB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGFzc2VydEluV29ya2Zsb3dDb250ZXh0LCBnZXRBY3RpdmF0b3IsIG1heWJlR2V0QWN0aXZhdG9yIH0gZnJvbSAnLi9nbG9iYWwtYXR0cmlidXRlcyc7XG5pbXBvcnQgeyB1bnRyYWNrUHJvbWlzZSB9IGZyb20gJy4vc3RhY2staGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IENoaWxkV29ya2Zsb3dIYW5kbGUsIEV4dGVybmFsV29ya2Zsb3dIYW5kbGUgfSBmcm9tICcuL3dvcmtmbG93LWhhbmRsZSc7XG5cbi8vIEF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeVxucmVnaXN0ZXJTbGVlcEltcGxlbWVudGF0aW9uKHNsZWVwKTtcblxuLyoqXG4gKiBBZGRzIGRlZmF1bHQgdmFsdWVzIG9mIGB3b3JrZmxvd0lkYCBhbmQgYGNhbmNlbGxhdGlvblR5cGVgIHRvIGdpdmVuIHdvcmtmbG93IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIG9wdHM6IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBDaGlsZFdvcmtmbG93T3B0aW9uc1dpdGhEZWZhdWx0cyB7XG4gIGNvbnN0IHsgYXJncywgd29ya2Zsb3dJZCwgLi4ucmVzdCB9ID0gb3B0cztcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkOiB3b3JrZmxvd0lkID8/IHV1aWQ0KCksXG4gICAgYXJnczogKGFyZ3MgPz8gW10pIGFzIHVua25vd25bXSxcbiAgICBjYW5jZWxsYXRpb25UeXBlOiBDaGlsZFdvcmtmbG93Q2FuY2VsbGF0aW9uVHlwZS5XQUlUX0NBTkNFTExBVElPTl9DT01QTEVURUQsXG4gICAgLi4ucmVzdCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc3RhcnRUaW1lciBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuZnVuY3Rpb24gdGltZXJOZXh0SGFuZGxlcih7IHNlcSwgZHVyYXRpb25Ncywgb3B0aW9ucyB9OiBUaW1lcklucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMudGltZXIuZGVsZXRlKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIGNhbmNlbFRpbWVyOiB7XG4gICAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRUaW1lcjoge1xuICAgICAgICBzZXEsXG4gICAgICAgIHN0YXJ0VG9GaXJlVGltZW91dDogbXNUb1RzKGR1cmF0aW9uTXMpLFxuICAgICAgfSxcbiAgICAgIHVzZXJNZXRhZGF0YTogdXNlck1ldGFkYXRhVG9QYXlsb2FkKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zPy5zdW1tYXJ5LCB1bmRlZmluZWQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy50aW1lci5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXMgc2xlZXAuXG4gKlxuICogU2NoZWR1bGVzIGEgdGltZXIgb24gdGhlIFRlbXBvcmFsIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIG1zIHNsZWVwIGR1cmF0aW9uIC0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbXMgfCBtcy1mb3JtYXR0ZWQgc3RyaW5nfS5cbiAqIElmIGdpdmVuIGEgbmVnYXRpdmUgbnVtYmVyIG9yIDAsIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDEuXG4gKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25hbCB0aW1lciBvcHRpb25zIGZvciBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsZWVwKG1zOiBEdXJhdGlvbiwgb3B0aW9ucz86IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuc2xlZXAoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nKTtcbiAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLnRpbWVyKys7XG5cbiAgY29uc3QgZHVyYXRpb25NcyA9IE1hdGgubWF4KDEsIG1zVG9OdW1iZXIobXMpKTtcblxuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc3RhcnRUaW1lcicsIHRpbWVyTmV4dEhhbmRsZXIpO1xuXG4gIHJldHVybiBleGVjdXRlKHtcbiAgICBkdXJhdGlvbk1zLFxuICAgIHNlcSxcbiAgICBvcHRpb25zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBY3Rpdml0eU9wdGlvbnMob3B0aW9uczogQWN0aXZpdHlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVpcmVkIGVpdGhlciBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0IG9yIHN0YXJ0VG9DbG9zZVRpbWVvdXQnKTtcbiAgfVxufVxuXG4vLyBVc2Ugc2FtZSB2YWxpZGF0aW9uIHdlIHVzZSBmb3Igbm9ybWFsIGFjdGl2aXRpZXNcbmNvbnN0IHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMgPSB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucztcblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gYWN0aXZhdG9yIGFjY3VtdWxhdG9yIGFuZCByZWdpc3RlciBjb21wbGV0aW9uXG4gKi9cbmZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcih7IG9wdGlvbnMsIGFyZ3MsIGhlYWRlcnMsIHNlcSwgYWN0aXZpdHlUeXBlIH06IEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIHZhbGlkYXRlQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gQWxyZWFkeSByZXNvbHZlZCBvciBuZXZlciBzY2hlZHVsZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgICAgICAgIHJlcXVlc3RDYW5jZWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlQWN0aXZpdHk6IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhY3Rpdml0eUlkOiBvcHRpb25zLmFjdGl2aXR5SWQgPz8gYCR7c2VxfWAsXG4gICAgICAgIGFjdGl2aXR5VHlwZSxcbiAgICAgICAgYXJndW1lbnRzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICBoZWFydGJlYXRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnN0YXJ0VG9DbG9zZVRpbWVvdXQpLFxuICAgICAgICBzY2hlZHVsZVRvU3RhcnRUaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLnNjaGVkdWxlVG9TdGFydFRpbWVvdXQpLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBjYW5jZWxsYXRpb25UeXBlOiBlbmNvZGVBY3Rpdml0eUNhbmNlbGxhdGlvblR5cGUob3B0aW9ucy5jYW5jZWxsYXRpb25UeXBlKSxcbiAgICAgICAgZG9Ob3RFYWdlcmx5RXhlY3V0ZTogIShvcHRpb25zLmFsbG93RWFnZXJEaXNwYXRjaCA/PyB0cnVlKSxcbiAgICAgICAgdmVyc2lvbmluZ0ludGVudDogdmVyc2lvbmluZ0ludGVudFRvUHJvdG8ob3B0aW9ucy52ZXJzaW9uaW5nSW50ZW50KSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAgICAgICBwcmlvcml0eTogb3B0aW9ucy5wcmlvcml0eSA/IGNvbXBpbGVQcmlvcml0eShvcHRpb25zLnByaW9yaXR5KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICB1c2VyTWV0YWRhdGE6IHVzZXJNZXRhZGF0YVRvUGF5bG9hZChhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgb3B0aW9ucy5zdW1tYXJ5LCB1bmRlZmluZWQpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5hY3Rpdml0eS5zZXQoc2VxLCB7XG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQdXNoIGEgc2NoZWR1bGVBY3Rpdml0eSBjb21tYW5kIGludG8gc3RhdGUgYWNjdW11bGF0b3IgYW5kIHJlZ2lzdGVyIGNvbXBsZXRpb25cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVMb2NhbEFjdGl2aXR5TmV4dEhhbmRsZXIoe1xuICBvcHRpb25zLFxuICBhcmdzLFxuICBoZWFkZXJzLFxuICBzZXEsXG4gIGFjdGl2aXR5VHlwZSxcbiAgYXR0ZW1wdCxcbiAgb3JpZ2luYWxTY2hlZHVsZVRpbWUsXG59OiBMb2NhbEFjdGl2aXR5SW5wdXQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gZ2V0QWN0aXZhdG9yKCk7XG4gIC8vIEVhZ2VybHkgZmFpbCB0aGUgbG9jYWwgYWN0aXZpdHkgKHdoaWNoIHdpbGwgaW4gdHVybiBmYWlsIHRoZSB3b3JrZmxvdyB0YXNrLlxuICAvLyBEbyBub3QgZmFpbCBvbiByZXBsYXkgd2hlcmUgdGhlIGxvY2FsIGFjdGl2aXRpZXMgbWF5IG5vdCBiZSByZWdpc3RlcmVkIG9uIHRoZSByZXBsYXkgd29ya2VyLlxuICBpZiAoIWFjdGl2YXRvci5pbmZvLnVuc2FmZS5pc1JlcGxheWluZyAmJiAhYWN0aXZhdG9yLnJlZ2lzdGVyZWRBY3Rpdml0eU5hbWVzLmhhcyhhY3Rpdml0eVR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBMb2NhbCBhY3Rpdml0eSBvZiB0eXBlICcke2FjdGl2aXR5VHlwZX0nIG5vdCByZWdpc3RlcmVkIG9uIHdvcmtlcmApO1xuICB9XG4gIHZhbGlkYXRlTG9jYWxBY3Rpdml0eU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLmFjdGl2aXR5LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEFscmVhZHkgcmVzb2x2ZWQgb3IgbmV2ZXIgc2NoZWR1bGVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICByZXF1ZXN0Q2FuY2VsTG9jYWxBY3Rpdml0eToge1xuICAgICAgICAgICAgICBzZXEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eToge1xuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCBleHBvc2luZyBhY3Rpdml0eUlkIGFzIGFuIG9wdGlvblxuICAgICAgICBhY3Rpdml0eUlkOiBgJHtzZXF9YCxcbiAgICAgICAgYWN0aXZpdHlUeXBlLFxuICAgICAgICBhcmd1bWVudHM6IHRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIC4uLmFyZ3MpLFxuICAgICAgICByZXRyeVBvbGljeTogb3B0aW9ucy5yZXRyeSA/IGNvbXBpbGVSZXRyeVBvbGljeShvcHRpb25zLnJldHJ5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZWR1bGVUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zdGFydFRvQ2xvc2VUaW1lb3V0KSxcbiAgICAgICAgc2NoZWR1bGVUb1N0YXJ0VGltZW91dDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5zY2hlZHVsZVRvU3RhcnRUaW1lb3V0KSxcbiAgICAgICAgbG9jYWxSZXRyeVRocmVzaG9sZDogbXNPcHRpb25hbFRvVHMob3B0aW9ucy5sb2NhbFJldHJ5VGhyZXNob2xkKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgY2FuY2VsbGF0aW9uVHlwZTogZW5jb2RlQWN0aXZpdHlDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMuc3VtbWFyeSwgdW5kZWZpbmVkKSxcbiAgICB9KTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuYWN0aXZpdHkuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYW4gYWN0aXZpdHkgYW5kIHJ1biBvdXRib3VuZCBpbnRlcmNlcHRvcnNcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlQWN0aXZpdHk8Uj4oYWN0aXZpdHlUeXBlOiBzdHJpbmcsIGFyZ3M6IGFueVtdLCBvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBQcm9taXNlPFI+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnNjaGVkdWxlQWN0aXZpdHkoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24nXG4gICk7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHb3QgZW1wdHkgYWN0aXZpdHkgb3B0aW9ucycpO1xuICB9XG4gIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5hY3Rpdml0eSsrO1xuICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhhY3RpdmF0b3IuaW50ZXJjZXB0b3JzLm91dGJvdW5kLCAnc2NoZWR1bGVBY3Rpdml0eScsIHNjaGVkdWxlQWN0aXZpdHlOZXh0SGFuZGxlcik7XG5cbiAgcmV0dXJuIGV4ZWN1dGUoe1xuICAgIGFjdGl2aXR5VHlwZSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBvcHRpb25zLFxuICAgIGFyZ3MsXG4gICAgc2VxLFxuICB9KSBhcyBQcm9taXNlPFI+O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGFuIGFjdGl2aXR5IGFuZCBydW4gb3V0Ym91bmQgaW50ZXJjZXB0b3JzXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZUxvY2FsQWN0aXZpdHk8Uj4oXG4gIGFjdGl2aXR5VHlwZTogc3RyaW5nLFxuICBhcmdzOiBhbnlbXSxcbiAgb3B0aW9uczogTG9jYWxBY3Rpdml0eU9wdGlvbnNcbik6IFByb21pc2U8Uj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuc2NoZWR1bGVMb2NhbEFjdGl2aXR5KC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uJ1xuICApO1xuICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR290IGVtcHR5IGFjdGl2aXR5IG9wdGlvbnMnKTtcbiAgfVxuXG4gIGxldCBhdHRlbXB0ID0gMTtcbiAgbGV0IG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCBzZXEgPSBhY3RpdmF0b3IubmV4dFNlcXMuYWN0aXZpdHkrKztcbiAgICBjb25zdCBleGVjdXRlID0gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgICAnc2NoZWR1bGVMb2NhbEFjdGl2aXR5JyxcbiAgICAgIHNjaGVkdWxlTG9jYWxBY3Rpdml0eU5leHRIYW5kbGVyXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IGV4ZWN1dGUoe1xuICAgICAgICBhY3Rpdml0eVR5cGUsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBhcmdzLFxuICAgICAgICBzZXEsXG4gICAgICAgIGF0dGVtcHQsXG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lLFxuICAgICAgfSkpIGFzIFByb21pc2U8Uj47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTG9jYWxBY3Rpdml0eURvQmFja29mZikge1xuICAgICAgICBhd2FpdCBzbGVlcChyZXF1aXJlZFRzVG9NcyhlcnIuYmFja29mZi5iYWNrb2ZmRHVyYXRpb24sICdiYWNrb2ZmRHVyYXRpb24nKSk7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyLmJhY2tvZmYuYXR0ZW1wdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGJhY2tvZmYgYXR0ZW1wdCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW1wdCA9IGVyci5iYWNrb2ZmLmF0dGVtcHQ7XG4gICAgICAgIG9yaWdpbmFsU2NoZWR1bGVUaW1lID0gZXJyLmJhY2tvZmYub3JpZ2luYWxTY2hlZHVsZVRpbWUgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlcih7XG4gIG9wdGlvbnMsXG4gIGhlYWRlcnMsXG4gIHdvcmtmbG93VHlwZSxcbiAgc2VxLFxufTogU3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uSW5wdXQpOiBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICBjb25zdCB3b3JrZmxvd0lkID0gb3B0aW9ucy53b3JrZmxvd0lkID8/IHV1aWQ0KCk7XG4gIGNvbnN0IHN0YXJ0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlID0gQ2FuY2VsbGF0aW9uU2NvcGUuY3VycmVudCgpO1xuICAgIGlmIChzY29wZS5jb25zaWRlcmVkQ2FuY2VsbGVkKSB7XG4gICAgICB1bnRyYWNrUHJvbWlzZShzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2gocmVqZWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgdW50cmFja1Byb21pc2UoXG4gICAgICAgIHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcGxldGUgPSAhYWN0aXZhdG9yLmNvbXBsZXRpb25zLmNoaWxkV29ya2Zsb3dDb21wbGV0ZS5oYXMoc2VxKTtcblxuICAgICAgICAgIGlmICghY29tcGxldGUpIHtcbiAgICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgICAgIGNhbmNlbENoaWxkV29ya2Zsb3dFeGVjdXRpb246IHsgY2hpbGRXb3JrZmxvd1NlcTogc2VxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTm90aGluZyB0byBjYW5jZWwgb3RoZXJ3aXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgIHNlcSxcbiAgICAgICAgd29ya2Zsb3dJZCxcbiAgICAgICAgd29ya2Zsb3dUeXBlLFxuICAgICAgICBpbnB1dDogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4ub3B0aW9ucy5hcmdzKSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnkgPyBjb21waWxlUmV0cnlQb2xpY3kob3B0aW9ucy5yZXRyeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUgfHwgYWN0aXZhdG9yLmluZm8udGFza1F1ZXVlLFxuICAgICAgICB3b3JrZmxvd0V4ZWN1dGlvblRpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dFeGVjdXRpb25UaW1lb3V0KSxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLCAvLyBOb3QgY29uZmlndXJhYmxlXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGNhbmNlbGxhdGlvblR5cGU6IGVuY29kZUNoaWxkV29ya2Zsb3dDYW5jZWxsYXRpb25UeXBlKG9wdGlvbnMuY2FuY2VsbGF0aW9uVHlwZSksXG4gICAgICAgIHdvcmtmbG93SWRSZXVzZVBvbGljeTogZW5jb2RlV29ya2Zsb3dJZFJldXNlUG9saWN5KG9wdGlvbnMud29ya2Zsb3dJZFJldXNlUG9saWN5KSxcbiAgICAgICAgcGFyZW50Q2xvc2VQb2xpY3k6IGVuY29kZVBhcmVudENsb3NlUG9saWN5KG9wdGlvbnMucGFyZW50Q2xvc2VQb2xpY3kpLFxuICAgICAgICBjcm9uU2NoZWR1bGU6IG9wdGlvbnMuY3JvblNjaGVkdWxlLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA/IHsgaW5kZXhlZEZpZWxkczogZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMob3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzLCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcykgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWVtbzogb3B0aW9ucy5tZW1vICYmIG1hcFRvUGF5bG9hZHMoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnMubWVtbyksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgcHJpb3JpdHk6IG9wdGlvbnMucHJpb3JpdHkgPyBjb21waWxlUHJpb3JpdHkob3B0aW9ucy5wcmlvcml0eSkgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgdXNlck1ldGFkYXRhOiB1c2VyTWV0YWRhdGFUb1BheWxvYWQoYWN0aXZhdG9yLnBheWxvYWRDb252ZXJ0ZXIsIG9wdGlvbnM/LnN0YXRpY1N1bW1hcnksIG9wdGlvbnM/LnN0YXRpY0RldGFpbHMpLFxuICAgIH0pO1xuICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jaGlsZFdvcmtmbG93U3RhcnQuc2V0KHNlcSwge1xuICAgICAgcmVzb2x2ZSxcbiAgICAgIHJlamVjdCxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gV2UgY29uc3RydWN0IGEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNoaWxkIFdvcmtmbG93IGJlZm9yZSB3ZSBrbm93XG4gIC8vIGlmIHRoZSBXb3JrZmxvdyBjb2RlIHdpbGwgYXdhaXQgaXQgdG8gY2FwdHVyZSB0aGUgcmVzdWx0IGluIGNhc2UgaXQgZG9lcy5cbiAgY29uc3QgY29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIENoYWluIHN0YXJ0IFByb21pc2UgcmVqZWN0aW9uIHRvIHRoZSBjb21wbGV0ZSBQcm9taXNlLlxuICAgIHVudHJhY2tQcm9taXNlKHN0YXJ0UHJvbWlzZS5jYXRjaChyZWplY3QpKTtcbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuY2hpbGRXb3JrZmxvd0NvbXBsZXRlLnNldChzZXEsIHtcbiAgICAgIHJlc29sdmUsXG4gICAgICByZWplY3QsXG4gICAgfSk7XG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShzdGFydFByb21pc2UpO1xuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UpO1xuICAvLyBQcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb24gYmVjYXVzZSB0aGUgY29tcGxldGlvbiBtaWdodCBub3QgYmUgYXdhaXRlZFxuICB1bnRyYWNrUHJvbWlzZShjb21wbGV0ZVByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKSk7XG4gIGNvbnN0IHJldCA9IG5ldyBQcm9taXNlPFtQcm9taXNlPHN0cmluZz4sIFByb21pc2U8dW5rbm93bj5dPigocmVzb2x2ZSkgPT4gcmVzb2x2ZShbc3RhcnRQcm9taXNlLCBjb21wbGV0ZVByb21pc2VdKSk7XG4gIHVudHJhY2tQcm9taXNlKHJldCk7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbFdvcmtmbG93TmV4dEhhbmRsZXIoeyBzZXEsIHNpZ25hbE5hbWUsIGFyZ3MsIHRhcmdldCwgaGVhZGVycyB9OiBTaWduYWxXb3JrZmxvd0lucHV0KSB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGdldEFjdGl2YXRvcigpO1xuICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKHNjb3BlLmNhbmNlbFJlcXVlc3RlZC5jYXRjaChyZWplY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGlmICghYWN0aXZhdG9yLmNvbXBsZXRpb25zLnNpZ25hbFdvcmtmbG93LmhhcyhzZXEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7IGNhbmNlbFNpZ25hbFdvcmtmbG93OiB7IHNlcSB9IH0pO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aXZhdG9yLnB1c2hDb21tYW5kKHtcbiAgICAgIHNpZ25hbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgc2VxLFxuICAgICAgICBhcmdzOiB0b1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCAuLi5hcmdzKSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgc2lnbmFsTmFtZSxcbiAgICAgICAgLi4uKHRhcmdldC50eXBlID09PSAnZXh0ZXJuYWwnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiBhY3RpdmF0b3IuaW5mby5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgLi4udGFyZ2V0LndvcmtmbG93RXhlY3V0aW9uLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBjaGlsZFdvcmtmbG93SWQ6IHRhcmdldC5jaGlsZFdvcmtmbG93SWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBhY3RpdmF0b3IuY29tcGxldGlvbnMuc2lnbmFsV29ya2Zsb3cuc2V0KHNlcSwgeyByZXNvbHZlLCByZWplY3QgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFN5bWJvbCB1c2VkIGluIHRoZSByZXR1cm4gdHlwZSBvZiBwcm94eSBtZXRob2RzIHRvIG1hcmsgdGhhdCBhbiBhdHRyaWJ1dGUgb24gdGhlIHNvdXJjZSB0eXBlIGlzIG5vdCBhIG1ldGhvZC5cbiAqXG4gKiBAc2VlIHtAbGluayBBY3Rpdml0eUludGVyZmFjZUZvcn1cbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc31cbiAqIEBzZWUge0BsaW5rIHByb3h5TG9jYWxBY3Rpdml0aWVzfVxuICovXG5leHBvcnQgY29uc3QgTm90QW5BY3Rpdml0eU1ldGhvZCA9IFN5bWJvbC5mb3IoJ19fVEVNUE9SQUxfTk9UX0FOX0FDVElWSVRZX01FVEhPRCcpO1xuXG4vKipcbiAqIFR5cGUgaGVscGVyIHRoYXQgdGFrZXMgYSB0eXBlIGBUYCBhbmQgdHJhbnNmb3JtcyBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCB7QGxpbmsgQWN0aXZpdHlGdW5jdGlvbn0gdG9cbiAqIHtAbGluayBOb3RBbkFjdGl2aXR5TWV0aG9kfS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIFVzZWQgYnkge0BsaW5rIHByb3h5QWN0aXZpdGllc30gdG8gZ2V0IHRoaXMgY29tcGlsZS10aW1lIGVycm9yOlxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcmZhY2UgTXlBY3Rpdml0aWVzIHtcbiAqICAgdmFsaWQoaW5wdXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPjtcbiAqICAgaW52YWxpZChpbnB1dDogbnVtYmVyKTogbnVtYmVyO1xuICogfVxuICpcbiAqIGNvbnN0IGFjdCA9IHByb3h5QWN0aXZpdGllczxNeUFjdGl2aXRpZXM+KHsgc3RhcnRUb0Nsb3NlVGltZW91dDogJzVtJyB9KTtcbiAqXG4gKiBhd2FpdCBhY3QudmFsaWQodHJ1ZSk7XG4gKiBhd2FpdCBhY3QuaW52YWxpZCgpO1xuICogLy8gXiBUUyBjb21wbGFpbnMgd2l0aDpcbiAqIC8vIChwcm9wZXJ0eSkgaW52YWxpZERlZmluaXRpb246IHR5cGVvZiBOb3RBbkFjdGl2aXR5TWV0aG9kXG4gKiAvLyBUaGlzIGV4cHJlc3Npb24gaXMgbm90IGNhbGxhYmxlLlxuICogLy8gVHlwZSAnU3ltYm9sJyBoYXMgbm8gY2FsbCBzaWduYXR1cmVzLigyMzQ5KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFjdGl2aXR5SW50ZXJmYWNlRm9yPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFjdGl2aXR5RnVuY3Rpb24gPyBBY3Rpdml0eUZ1bmN0aW9uV2l0aE9wdGlvbnM8VFtLXT4gOiB0eXBlb2YgTm90QW5BY3Rpdml0eU1ldGhvZDtcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgYWN0aXZpdHksIG92ZXJyaWRpbmcgaXRzIGV4aXN0aW5nIG9wdGlvbnMgd2l0aCB0aGVcbiAgICogcHJvdmlkZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgQWN0aXZpdHlPcHRpb25zXG4gICAqIEBwYXJhbSBhcmdzOiBsaXN0IG9mIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyByZXR1cm4gdmFsdWUgb2YgdGhlIGFjdGl2aXR5XG4gICAqXG4gICAqIEBleHBlcmltZW50YWwgZXhlY3V0ZVdpdGhPcHRpb25zIGlzIGEgbmV3IG1ldGhvZCB0byBwcm92aWRlIGNhbGwtc2l0ZSBvcHRpb25zIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZVxuICAgKi9cbiAgZXhlY3V0ZVdpdGhPcHRpb25zKG9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIFRoZSBsb2NhbCBhY3Rpdml0eSBjb3VudGVycGFydCB0byB7QGxpbmsgQWN0aXZpdHlJbnRlcmZhY2VGb3J9XG4gKi9cbmV4cG9ydCB0eXBlIExvY2FsQWN0aXZpdHlJbnRlcmZhY2VGb3I8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbiA/IExvY2FsQWN0aXZpdHlGdW5jdGlvbldpdGhPcHRpb25zPFRbS10+IDogdHlwZW9mIE5vdEFuQWN0aXZpdHlNZXRob2Q7XG59O1xuXG5leHBvcnQgdHlwZSBMb2NhbEFjdGl2aXR5RnVuY3Rpb25XaXRoT3B0aW9uczxUIGV4dGVuZHMgQWN0aXZpdHlGdW5jdGlvbj4gPSBUICYge1xuICAvKipcbiAgICogUnVuIHRoZSBsb2NhbCBhY3Rpdml0eSwgb3ZlcnJpZGluZyBpdHMgZXhpc3Rpbmcgb3B0aW9ucyB3aXRoIHRoZVxuICAgKiBwcm92aWRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuICAgKiBAcGFyYW0gYXJnczogbGlzdCBvZiBhcmd1bWVudHNcbiAgICogQHJldHVybnMgcmV0dXJuIHZhbHVlIG9mIHRoZSBhY3Rpdml0eVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsIGV4ZWN1dGVXaXRoT3B0aW9ucyBpcyBhIG5ldyBtZXRob2QgdG8gcHJvdmlkZSBjYWxsLXNpdGUgb3B0aW9ucyBhbmQgaXMgc3ViamVjdCB0byBjaGFuZ2VcbiAgICovXG4gIGV4ZWN1dGVXaXRoT3B0aW9ucyhvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucywgYXJnczogUGFyYW1ldGVyczxUPik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj47XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZSBBY3Rpdml0eSBmdW5jdGlvbnMgd2l0aCBnaXZlbiB7QGxpbmsgQWN0aXZpdHlPcHRpb25zfS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIHNldHVwIEFjdGl2aXRpZXMgd2l0aCBkaWZmZXJlbnQgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIGEge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5IHwgUHJveHl9IGZvclxuICogICAgICAgICB3aGljaCBlYWNoIGF0dHJpYnV0ZSBpcyBhIGNhbGxhYmxlIEFjdGl2aXR5IGZ1bmN0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBwcm94eUFjdGl2aXRpZXMgfSBmcm9tICdAdGVtcG9yYWxpby93b3JrZmxvdyc7XG4gKiBpbXBvcnQgKiBhcyBhY3Rpdml0aWVzIGZyb20gJy4uL2FjdGl2aXRpZXMnO1xuICpcbiAqIC8vIFNldHVwIEFjdGl2aXRpZXMgZnJvbSBtb2R1bGUgZXhwb3J0c1xuICogY29uc3QgeyBodHRwR2V0LCBvdGhlckFjdGl2aXR5IH0gPSBwcm94eUFjdGl2aXRpZXM8dHlwZW9mIGFjdGl2aXRpZXM+KHtcbiAqICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzMwIG1pbnV0ZXMnLFxuICogfSk7XG4gKlxuICogLy8gVXNlIGFjdGl2aXRpZXMgd2l0aCBkZWZhdWx0IG9wdGlvbnNcbiAqIGNvbnN0IHJlc3VsdDEgPSBhd2FpdCBodHRwR2V0KCdodHRwOi8vZXhhbXBsZS5jb20nKTtcbiAqXG4gKiAvLyBPdmVycmlkZSBvcHRpb25zIGZvciBzcGVjaWZpYyBhY3Rpdml0eSBjYWxsc1xuICogY29uc3QgcmVzdWx0MiA9IGF3YWl0IGh0dHBHZXQuZXhlY3V0ZVdpdGhPcHRpb25zKHtcbiAqICAgc3RhdGljU3VtbWFyeTogJ0ZldGNoZXMgZGF0YSBmcm9tIGV4dGVybmFsIEFQSScsXG4gKiAgIHNjaGVkdWxlVG9DbG9zZVRpbWVvdXQ6ICc1bSdcbiAqIH0sIFsnaHR0cDovL2FwaS5leGFtcGxlLmNvbSddKTtcbiAqXG4gKiBjb25zdCByZXN1bHQzID0gYXdhaXQgb3RoZXJBY3Rpdml0eS5leGVjdXRlV2l0aE9wdGlvbnMoe1xuICogICBzdGF0aWNTdW1tYXJ5OiAnUHJvY2Vzc2VzIHRoZSBmZXRjaGVkIGRhdGEnLFxuICogICB0YXNrUXVldWU6ICdzcGVjaWFsLXRhc2stcXVldWUnXG4gKiB9LCBbZGF0YV0pO1xuICpcbiAqIC8vIFNldHVwIEFjdGl2aXRpZXMgZnJvbSBhbiBleHBsaWNpdCBpbnRlcmZhY2UgKGUuZy4gd2hlbiBkZWZpbmVkIGJ5IGFub3RoZXIgU0RLKVxuICogaW50ZXJmYWNlIEphdmFBY3Rpdml0aWVzIHtcbiAqICAgaHR0cEdldEZyb21KYXZhKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+XG4gKiAgIHNvbWVPdGhlckphdmFBY3Rpdml0eShhcmcxOiBudW1iZXIsIGFyZzI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAqIH1cbiAqXG4gKiBjb25zdCB7XG4gKiAgIGh0dHBHZXRGcm9tSmF2YSxcbiAqICAgc29tZU90aGVySmF2YUFjdGl2aXR5XG4gKiB9ID0gcHJveHlBY3Rpdml0aWVzPEphdmFBY3Rpdml0aWVzPih7XG4gKiAgIHRhc2tRdWV1ZTogJ2phdmEtd29ya2VyLXRhc2tRdWV1ZScsXG4gKiAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICc1bScsXG4gKiB9KTtcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAqICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwR2V0KFwiaHR0cDovL2V4YW1wbGUuY29tXCIpO1xuICogICAvLyBPciB3aXRoIGN1c3RvbSBvcHRpb25zOlxuICogICBjb25zdCByZXNwb25zZTIgPSBhd2FpdCBodHRwR2V0RnJvbUphdmEuZXhlY3V0ZVdpdGhPcHRpb25zKHtcbiAqICAgICBzdGF0aWNTdW1tYXJ5OiAnSmF2YSBIVFRQIGNhbGwgd2l0aCB0aW1lb3V0IG92ZXJyaWRlJyxcbiAqICAgICBzdGFydFRvQ2xvc2VUaW1lb3V0OiAnMm0nXG4gKiAgIH0sIFtcImh0dHA6Ly9mYXN0LWFwaS5leGFtcGxlLmNvbVwiXSk7XG4gKiAgIC8vIC4uLlxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eUFjdGl2aXRpZXM8QSA9IFVudHlwZWRBY3Rpdml0aWVzPihvcHRpb25zOiBBY3Rpdml0eU9wdGlvbnMpOiBBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUFjdGl2aXR5T3B0aW9ucyhvcHRpb25zKTtcblxuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIEFjdGl2aXR5SW50ZXJmYWNlRm9yPEE+LCB7XG4gICAgZ2V0KF8sIGFjdGl2aXR5VHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpdml0eVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE9ubHkgc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBBY3Rpdml0eSB0eXBlcywgZ290OiAke1N0cmluZyhhY3Rpdml0eVR5cGUpfWApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUFjdGl2aXR5KGFjdGl2aXR5VHlwZSBhcyBzdHJpbmcsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICBhY3Rpdml0eVByb3h5RnVuY3Rpb24uZXhlY3V0ZVdpdGhPcHRpb25zID0gZnVuY3Rpb24gKFxuICAgICAgICBvdmVycmlkZU9wdGlvbnM6IEFjdGl2aXR5T3B0aW9ucyxcbiAgICAgICAgYXJnczogYW55W11cbiAgICAgICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVBY3Rpdml0eShhY3Rpdml0eVR5cGUsIGFyZ3MsIGRlZXBNZXJnZShvcHRpb25zLCBvdmVycmlkZU9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhY3Rpdml0eVByb3h5RnVuY3Rpb247XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogQ29uZmlndXJlIExvY2FsIEFjdGl2aXR5IGZ1bmN0aW9ucyB3aXRoIGdpdmVuIHtAbGluayBMb2NhbEFjdGl2aXR5T3B0aW9uc30uXG4gKlxuICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0byBzZXR1cCBBY3Rpdml0aWVzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMuXG4gKlxuICogQHJldHVybiBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSB8IFByb3h5fVxuICogICAgICAgICBmb3Igd2hpY2ggZWFjaCBhdHRyaWJ1dGUgaXMgYSBjYWxsYWJsZSBBY3Rpdml0eSBmdW5jdGlvblxuICpcbiAqIEBzZWUge0BsaW5rIHByb3h5QWN0aXZpdGllc30gZm9yIGV4YW1wbGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm94eUxvY2FsQWN0aXZpdGllczxBID0gVW50eXBlZEFjdGl2aXRpZXM+KFxuICBvcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9uc1xuKTogTG9jYWxBY3Rpdml0eUludGVyZmFjZUZvcjxBPiB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zIG11c3QgYmUgZGVmaW5lZCcpO1xuICB9XG4gIC8vIFZhbGlkYXRlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBpbW1lZGlhdGUgdXNlciBmZWVkYmFja1xuICB2YWxpZGF0ZUxvY2FsQWN0aXZpdHlPcHRpb25zKG9wdGlvbnMpO1xuXG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTG9jYWxBY3Rpdml0eUludGVyZmFjZUZvcjxBPiwge1xuICAgIGdldChfLCBhY3Rpdml0eVR5cGUpIHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aXZpdHlUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgQWN0aXZpdHkgdHlwZXMsIGdvdDogJHtTdHJpbmcoYWN0aXZpdHlUeXBlKX1gKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbG9jYWxBY3Rpdml0eVByb3h5RnVuY3Rpb24oLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZUxvY2FsQWN0aXZpdHkoYWN0aXZpdHlUeXBlIGFzIHN0cmluZywgYXJncywgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uLmV4ZWN1dGVXaXRoT3B0aW9ucyA9IGZ1bmN0aW9uIChcbiAgICAgICAgb3ZlcnJpZGVPcHRpb25zOiBMb2NhbEFjdGl2aXR5T3B0aW9ucyxcbiAgICAgICAgYXJnczogYW55W11cbiAgICAgICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVMb2NhbEFjdGl2aXR5KGFjdGl2aXR5VHlwZSwgYXJncywgZGVlcE1lcmdlKG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGxvY2FsQWN0aXZpdHlQcm94eUZ1bmN0aW9uO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vLyBUT0RPOiBkZXByZWNhdGUgdGhpcyBwYXRjaCBhZnRlciBcImVub3VnaFwiIHRpbWUgaGFzIHBhc3NlZFxuY29uc3QgRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIID0gJ19fdGVtcG9yYWxfaW50ZXJuYWxfY29ubmVjdF9leHRlcm5hbF9oYW5kbGVfY2FuY2VsX3RvX3Njb3BlJztcbi8vIFRoZSBuYW1lIG9mIHRoaXMgcGF0Y2ggY29tZXMgZnJvbSBhbiBhdHRlbXB0IHRvIGJ1aWxkIGEgZ2VuZXJpYyBpbnRlcm5hbCBwYXRjaGluZyBtZWNoYW5pc20uXG4vLyBUaGF0IGVmZm9ydCBoYXMgYmVlbiBhYmFuZG9uZWQgaW4gZmF2b3Igb2YgYSBuZXdlciBXb3JrZmxvd1Rhc2tDb21wbGV0ZWRNZXRhZGF0YSBiYXNlZCBtZWNoYW5pc20uXG5jb25zdCBDT05ESVRJT05fMF9QQVRDSCA9ICdfX3Nka19pbnRlcm5hbF9wYXRjaF9udW1iZXI6MSc7XG5cbi8qKlxuICogUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNpZ25hbCBhbmQgY2FuY2VsIGFuIGV4aXN0aW5nIFdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqIEl0IHRha2VzIGEgV29ya2Zsb3cgSUQgYW5kIG9wdGlvbmFsIHJ1biBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVybmFsV29ya2Zsb3dIYW5kbGUod29ya2Zsb3dJZDogc3RyaW5nLCBydW5JZD86IHN0cmluZyk6IEV4dGVybmFsV29ya2Zsb3dIYW5kbGUge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuZ2V0RXh0ZXJuYWxXb3JrZmxvd0hhbmRsZSguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4gQ29uc2lkZXIgdXNpbmcgQ2xpZW50LndvcmtmbG93LmdldEhhbmRsZSguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICB3b3JrZmxvd0lkLFxuICAgIHJ1bklkLFxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIENvbm5lY3QgdGhpcyBjYW5jZWwgb3BlcmF0aW9uIHRvIHRoZSBjdXJyZW50IGNhbmNlbGxhdGlvbiBzY29wZS5cbiAgICAgICAgLy8gVGhpcyBpcyBiZWhhdmlvciB3YXMgaW50cm9kdWNlZCBhZnRlciB2MC4yMi4wIGFuZCBpcyBpbmNvbXBhdGlibGVcbiAgICAgICAgLy8gd2l0aCBoaXN0b3JpZXMgZ2VuZXJhdGVkIHdpdGggcHJldmlvdXMgU0RLIHZlcnNpb25zIGFuZCB0aHVzIHJlcXVpcmVzXG4gICAgICAgIC8vIHBhdGNoaW5nLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXZSB0cnkgdG8gZGVsYXkgcGF0Y2hpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBhdm9pZCBwb2xsdXRpbmdcbiAgICAgICAgLy8gaGlzdG9yaWVzIHVubGVzcyBzdHJpY3RseSByZXF1aXJlZC5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBDYW5jZWxsYXRpb25TY29wZS5jdXJyZW50KCk7XG4gICAgICAgIGlmIChzY29wZS5jYW5jZWxsYWJsZSkge1xuICAgICAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICAgICAgc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHBhdGNoZWQoRVhURVJOQUxfV0ZfQ0FOQ0VMX1BBVENIKSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjb3BlLmNvbnNpZGVyZWRDYW5jZWxsZWQpIHtcbiAgICAgICAgICBpZiAocGF0Y2hlZChFWFRFUk5BTF9XRl9DQU5DRUxfUEFUQ0gpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VxID0gYWN0aXZhdG9yLm5leHRTZXFzLmNhbmNlbFdvcmtmbG93Kys7XG4gICAgICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICAgICAgcmVxdWVzdENhbmNlbEV4dGVybmFsV29ya2Zsb3dFeGVjdXRpb246IHtcbiAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgIHdvcmtmbG93RXhlY3V0aW9uOiB7XG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogYWN0aXZhdG9yLmluZm8ubmFtZXNwYWNlLFxuICAgICAgICAgICAgICB3b3JrZmxvd0lkLFxuICAgICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGl2YXRvci5jb21wbGV0aW9ucy5jYW5jZWxXb3JrZmxvdy5zZXQoc2VxLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdleHRlcm5hbCcsXG4gICAgICAgICAgd29ya2Zsb3dFeGVjdXRpb246IHsgd29ya2Zsb3dJZCwgcnVuSWQgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gQnkgZGVmYXVsdCwgYSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZTogc3RyaW5nLFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqIC0gUmV0dXJucyBhIGNsaWVudC1zaWRlIGhhbmRsZSB0aGF0IGltcGxlbWVudHMgYSBjaGlsZCBXb3JrZmxvdyBpbnRlcmZhY2UuXG4gKiAtIERlZHVjZXMgdGhlIFdvcmtmbG93IHR5cGUgYW5kIHNpZ25hdHVyZSBmcm9tIHByb3ZpZGVkIFdvcmtmbG93IGZ1bmN0aW9uLlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqXG4gKiBBIGNoaWxkIFdvcmtmbG93IGhhbmRsZSBzdXBwb3J0cyBhd2FpdGluZyBjb21wbGV0aW9uLCBzaWduYWxpbmcgYW5kIGNhbmNlbGxhdGlvbiB2aWEge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKiBJbiBvcmRlciB0byBxdWVyeSB0aGUgY2hpbGQsIHVzZSBhIHtAbGluayBXb3JrZmxvd0NsaWVudH0gZnJvbSBhbiBBY3Rpdml0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxDaGlsZFdvcmtmbG93SGFuZGxlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvblxuICpcbiAqICoqT3ZlcnJpZGUgZm9yIFdvcmtmbG93cyB0aGF0IGFjY2VwdCBubyBhcmd1bWVudHMqKi5cbiAqXG4gKiAtIFJldHVybnMgYSBjbGllbnQtc2lkZSBoYW5kbGUgdGhhdCBpbXBsZW1lbnRzIGEgY2hpbGQgV29ya2Zsb3cgaW50ZXJmYWNlLlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEEgY2hpbGQgV29ya2Zsb3cgaGFuZGxlIHN1cHBvcnRzIGF3YWl0aW5nIGNvbXBsZXRpb24sIHNpZ25hbGluZyBhbmQgY2FuY2VsbGF0aW9uIHZpYSB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqIEluIG9yZGVyIHRvIHF1ZXJ5IHRoZSBjaGlsZCwgdXNlIGEge0BsaW5rIFdvcmtmbG93Q2xpZW50fSBmcm9tIGFuIEFjdGl2aXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDaGlsZDxUIGV4dGVuZHMgKCkgPT4gUHJvbWlzZTxhbnk+Pih3b3JrZmxvd1R5cGU6IHN0cmluZyk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbi8qKlxuICogU3RhcnQgYSBjaGlsZCBXb3JrZmxvdyBleGVjdXRpb25cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBSZXR1cm5zIGEgY2xpZW50LXNpZGUgaGFuZGxlIHRoYXQgaW1wbGVtZW50cyBhIGNoaWxkIFdvcmtmbG93IGludGVyZmFjZS5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoZSBjaGlsZCB3aWxsIGJlIHNjaGVkdWxlZCBvbiB0aGUgc2FtZSB0YXNrIHF1ZXVlIGFzIGl0cyBwYXJlbnQuXG4gKlxuICogQSBjaGlsZCBXb3JrZmxvdyBoYW5kbGUgc3VwcG9ydHMgYXdhaXRpbmcgY29tcGxldGlvbiwgc2lnbmFsaW5nIGFuZCBjYW5jZWxsYXRpb24gdmlhIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICogSW4gb3JkZXIgdG8gcXVlcnkgdGhlIGNoaWxkLCB1c2UgYSB7QGxpbmsgV29ya2Zsb3dDbGllbnR9IGZyb20gYW4gQWN0aXZpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyAoKSA9PiBQcm9taXNlPGFueT4+KHdvcmtmbG93RnVuYzogVCk6IFByb21pc2U8Q2hpbGRXb3JrZmxvd0hhbmRsZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydENoaWxkPFQgZXh0ZW5kcyBXb3JrZmxvdz4oXG4gIHdvcmtmbG93VHlwZU9yRnVuYzogc3RyaW5nIHwgVCxcbiAgb3B0aW9ucz86IFdpdGhXb3JrZmxvd0FyZ3M8VCwgQ2hpbGRXb3JrZmxvd09wdGlvbnM+XG4pOiBQcm9taXNlPENoaWxkV29ya2Zsb3dIYW5kbGU8VD4+IHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnN0YXJ0Q2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5zdGFydCguLi4pIGluc3RlYWQuKSdcbiAgKTtcbiAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IGFkZERlZmF1bHRXb3JrZmxvd09wdGlvbnMob3B0aW9ucyA/PyAoe30gYXMgYW55KSk7XG4gIGNvbnN0IHdvcmtmbG93VHlwZSA9IGV4dHJhY3RXb3JrZmxvd1R5cGUod29ya2Zsb3dUeXBlT3JGdW5jKTtcbiAgY29uc3QgZXhlY3V0ZSA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoXG4gICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAnc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uJyxcbiAgICBzdGFydENoaWxkV29ya2Zsb3dFeGVjdXRpb25OZXh0SGFuZGxlclxuICApO1xuICBjb25zdCBbc3RhcnRlZCwgY29tcGxldGVkXSA9IGF3YWl0IGV4ZWN1dGUoe1xuICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLmNoaWxkV29ya2Zsb3crKyxcbiAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIHdvcmtmbG93VHlwZSxcbiAgfSk7XG4gIGNvbnN0IGZpcnN0RXhlY3V0aW9uUnVuSWQgPSBhd2FpdCBzdGFydGVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dJZDogb3B0aW9uc1dpdGhEZWZhdWx0cy53b3JrZmxvd0lkLFxuICAgIGZpcnN0RXhlY3V0aW9uUnVuSWQsXG4gICAgYXN5bmMgcmVzdWx0KCk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gICAgICByZXR1cm4gKGF3YWl0IGNvbXBsZXRlZCkgYXMgYW55O1xuICAgIH0sXG4gICAgYXN5bmMgc2lnbmFsPEFyZ3MgZXh0ZW5kcyBhbnlbXT4oZGVmOiBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgc3RyaW5nLCAuLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICByZXR1cm4gY29tcG9zZUludGVyY2VwdG9ycyhcbiAgICAgICAgYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCxcbiAgICAgICAgJ3NpZ25hbFdvcmtmbG93JyxcbiAgICAgICAgc2lnbmFsV29ya2Zsb3dOZXh0SGFuZGxlclxuICAgICAgKSh7XG4gICAgICAgIHNlcTogYWN0aXZhdG9yLm5leHRTZXFzLnNpZ25hbFdvcmtmbG93KyssXG4gICAgICAgIHNpZ25hbE5hbWU6IHR5cGVvZiBkZWYgPT09ICdzdHJpbmcnID8gZGVmIDogZGVmLm5hbWUsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIHR5cGU6ICdjaGlsZCcsXG4gICAgICAgICAgY2hpbGRXb3JrZmxvd0lkOiBvcHRpb25zV2l0aERlZmF1bHRzLndvcmtmbG93SWQsXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgV29ya2Zsb3c+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZyxcbiAgb3B0aW9uczogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PjtcblxuLyoqXG4gKiBTdGFydCBhIGNoaWxkIFdvcmtmbG93IGV4ZWN1dGlvbiBhbmQgYXdhaXQgaXRzIGNvbXBsZXRpb24uXG4gKlxuICogLSBCeSBkZWZhdWx0LCBhIGNoaWxkIHdpbGwgYmUgc2NoZWR1bGVkIG9uIHRoZSBzYW1lIHRhc2sgcXVldWUgYXMgaXRzIHBhcmVudC5cbiAqIC0gRGVkdWNlcyB0aGUgV29ya2Zsb3cgdHlwZSBhbmQgc2lnbmF0dXJlIGZyb20gcHJvdmlkZWQgV29ya2Zsb3cgZnVuY3Rpb24uXG4gKiAtIFRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxhYmxlIHVzaW5nIHtAbGluayBDYW5jZWxsYXRpb25TY29wZX1zLlxuICpcbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgY2hpbGQgV29ya2Zsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dGdW5jOiBULFxuICBvcHRpb25zOiBXaXRoV29ya2Zsb3dBcmdzPFQsIENoaWxkV29ya2Zsb3dPcHRpb25zPlxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBUaGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsYWJsZSB1c2luZyB7QGxpbmsgQ2FuY2VsbGF0aW9uU2NvcGV9cy5cbiAqXG4gKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIGNoaWxkIFdvcmtmbG93LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNoaWxkPFQgZXh0ZW5kcyAoKSA9PiBXb3JrZmxvd1JldHVyblR5cGU+KFxuICB3b3JrZmxvd1R5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdFR5cGU8VD4+O1xuXG4vKipcbiAqIFN0YXJ0IGEgY2hpbGQgV29ya2Zsb3cgZXhlY3V0aW9uIGFuZCBhd2FpdCBpdHMgY29tcGxldGlvbi5cbiAqXG4gKiAqKk92ZXJyaWRlIGZvciBXb3JrZmxvd3MgdGhhdCBhY2NlcHQgbm8gYXJndW1lbnRzKiouXG4gKlxuICogLSBUaGUgY2hpbGQgd2lsbCBiZSBzY2hlZHVsZWQgb24gdGhlIHNhbWUgdGFzayBxdWV1ZSBhcyBpdHMgcGFyZW50LlxuICogLSBEZWR1Y2VzIHRoZSBXb3JrZmxvdyB0eXBlIGFuZCBzaWduYXR1cmUgZnJvbSBwcm92aWRlZCBXb3JrZmxvdyBmdW5jdGlvbi5cbiAqIC0gVGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGFibGUgdXNpbmcge0BsaW5rIENhbmNlbGxhdGlvblNjb3BlfXMuXG4gKlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBjaGlsZCBXb3JrZmxvdy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVDaGlsZDxUIGV4dGVuZHMgKCkgPT4gV29ya2Zsb3dSZXR1cm5UeXBlPih3b3JrZmxvd0Z1bmM6IFQpOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0VHlwZTxUPj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlQ2hpbGQ8VCBleHRlbmRzIFdvcmtmbG93PihcbiAgd29ya2Zsb3dUeXBlT3JGdW5jOiBzdHJpbmcgfCBULFxuICBvcHRpb25zPzogV2l0aFdvcmtmbG93QXJnczxULCBDaGlsZFdvcmtmbG93T3B0aW9ucz5cbik6IFByb21pc2U8V29ya2Zsb3dSZXN1bHRUeXBlPFQ+PiB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5leGVjdXRlQ2hpbGQoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uIENvbnNpZGVyIHVzaW5nIENsaWVudC53b3JrZmxvdy5leGVjdXRlKC4uLikgaW5zdGVhZC4nXG4gICk7XG4gIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSBhZGREZWZhdWx0V29ya2Zsb3dPcHRpb25zKG9wdGlvbnMgPz8gKHt9IGFzIGFueSkpO1xuICBjb25zdCB3b3JrZmxvd1R5cGUgPSBleHRyYWN0V29ya2Zsb3dUeXBlKHdvcmtmbG93VHlwZU9yRnVuYyk7XG4gIGNvbnN0IGV4ZWN1dGUgPSBjb21wb3NlSW50ZXJjZXB0b3JzKFxuICAgIGFjdGl2YXRvci5pbnRlcmNlcHRvcnMub3V0Ym91bmQsXG4gICAgJ3N0YXJ0Q2hpbGRXb3JrZmxvd0V4ZWN1dGlvbicsXG4gICAgc3RhcnRDaGlsZFdvcmtmbG93RXhlY3V0aW9uTmV4dEhhbmRsZXJcbiAgKTtcbiAgY29uc3QgZXhlY1Byb21pc2UgPSBleGVjdXRlKHtcbiAgICBzZXE6IGFjdGl2YXRvci5uZXh0U2Vxcy5jaGlsZFdvcmtmbG93KyssXG4gICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB3b3JrZmxvd1R5cGUsXG4gIH0pO1xuICB1bnRyYWNrUHJvbWlzZShleGVjUHJvbWlzZSk7XG4gIGNvbnN0IGNvbXBsZXRlZFByb21pc2UgPSBleGVjUHJvbWlzZS50aGVuKChbX3N0YXJ0ZWQsIGNvbXBsZXRlZF0pID0+IGNvbXBsZXRlZCk7XG4gIHVudHJhY2tQcm9taXNlKGNvbXBsZXRlZFByb21pc2UpO1xuICByZXR1cm4gY29tcGxldGVkUHJvbWlzZSBhcyBQcm9taXNlPGFueT47XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFdvcmtmbG93LlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZyb3plbiBjb3B5IG9mIFdvcmtmbG93SW5mbywgYXQgdGhlIHBvaW50IHdoZXJlIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAqIENoYW5nZXMgaGFwcGVuaW5nIGF0IGxhdGVyIHBvaW50IGluIHdvcmtmbG93IGV4ZWN1dGlvbiB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cbiAqXG4gKiBGb3IgdGhpcyByZWFzb24sIHdlIHJlY29tbWVuZCBjYWxsaW5nIGB3b3JrZmxvd0luZm8oKWAgb24gZXZlcnkgYWNjZXNzIHRvIHtAbGluayBXb3JrZmxvd0luZm99J3MgZmllbGRzLFxuICogcmF0aGVyIHRoYW4gY2FjaGluZyB0aGUgYFdvcmtmbG93SW5mb2Agb2JqZWN0IChvciBwYXJ0IG9mIGl0KSBpbiBhIGxvY2FsIHZhcmlhYmxlLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGB0c1xuICogLy8gR09PRFxuICogZnVuY3Rpb24gbXlXb3JrZmxvdygpIHtcbiAqICAgZG9Tb21ldGhpbmcod29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlcylcbiAqICAgLi4uXG4gKiAgIGRvU29tZXRoaW5nRWxzZSh3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzKVxuICogfVxuICogYGBgXG4gKlxuICogdnNcbiAqXG4gKiBgYGB0c1xuICogLy8gQkFEXG4gKiBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICBjb25zdCBhdHRyaWJ1dGVzID0gd29ya2Zsb3dJbmZvKCkuc2VhcmNoQXR0cmlidXRlc1xuICogICBkb1NvbWV0aGluZyhhdHRyaWJ1dGVzKVxuICogICAuLi5cbiAqICAgZG9Tb21ldGhpbmdFbHNlKGF0dHJpYnV0ZXMpXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93SW5mbygpOiBXb3JrZmxvd0luZm8ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cud29ya2Zsb3dJbmZvKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICByZXR1cm4gYWN0aXZhdG9yLmluZm87XG59XG5cbi8qKlxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHVwZGF0ZSBpZiBhbnkuXG4gKlxuICogQHJldHVybiBJbmZvIGZvciB0aGUgY3VycmVudCB1cGRhdGUgaGFuZGxlciB0aGUgY29kZSBjYWxsaW5nIHRoaXMgaXMgZXhlY3V0aW5nXG4gKiB3aXRoaW4gaWYgYW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3VycmVudFVwZGF0ZUluZm8oKTogVXBkYXRlSW5mbyB8IHVuZGVmaW5lZCB7XG4gIGFzc2VydEluV29ya2Zsb3dDb250ZXh0KCdXb3JrZmxvdy5jdXJyZW50VXBkYXRlSW5mbyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nKTtcbiAgcmV0dXJuIFVwZGF0ZVNjb3BlLmN1cnJlbnQoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGNvZGUgaXMgZXhlY3V0aW5nIGluIHdvcmtmbG93IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluV29ya2Zsb3dDb250ZXh0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbWF5YmVHZXRBY3RpdmF0b3IoKSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiBgZmAgdGhhdCB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IFdvcmtmbG93IHRvIENvbnRpbnVlQXNOZXcgd2hlbiBjYWxsZWQuXG4gKlxuICogYGZgIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgV29ya2Zsb3cgZnVuY3Rpb24gc3VwcGxpZWQgdG8gdHlwZXBhcmFtIGBGYC5cbiAqXG4gKiBPbmNlIGBmYCBpcyBjYWxsZWQsIFdvcmtmbG93IEV4ZWN1dGlvbiBpbW1lZGlhdGVseSBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29udGludWVBc05ld0Z1bmM8RiBleHRlbmRzIFdvcmtmbG93PihcbiAgb3B0aW9ucz86IENvbnRpbnVlQXNOZXdPcHRpb25zXG4pOiAoLi4uYXJnczogUGFyYW1ldGVyczxGPikgPT4gUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cuY29udGludWVBc05ldyguLi4pIGFuZCBXb3JrZmxvdy5tYWtlQ29udGludWVBc05ld0Z1bmMoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBjb25zdCBpbmZvID0gYWN0aXZhdG9yLmluZm87XG4gIGNvbnN0IHsgd29ya2Zsb3dUeXBlLCB0YXNrUXVldWUsIC4uLnJlc3QgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHJlcXVpcmVkT3B0aW9ucyA9IHtcbiAgICB3b3JrZmxvd1R5cGU6IHdvcmtmbG93VHlwZSA/PyBpbmZvLndvcmtmbG93VHlwZSxcbiAgICB0YXNrUXVldWU6IHRhc2tRdWV1ZSA/PyBpbmZvLnRhc2tRdWV1ZSxcbiAgICAuLi5yZXN0LFxuICB9O1xuXG4gIHJldHVybiAoLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICBjb25zdCBmbiA9IGNvbXBvc2VJbnRlcmNlcHRvcnMoYWN0aXZhdG9yLmludGVyY2VwdG9ycy5vdXRib3VuZCwgJ2NvbnRpbnVlQXNOZXcnLCBhc3luYyAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHsgaGVhZGVycywgYXJncywgb3B0aW9ucyB9ID0gaW5wdXQ7XG4gICAgICB0aHJvdyBuZXcgQ29udGludWVBc05ldyh7XG4gICAgICAgIHdvcmtmbG93VHlwZTogb3B0aW9ucy53b3JrZmxvd1R5cGUsXG4gICAgICAgIGFyZ3VtZW50czogdG9QYXlsb2FkcyhhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlciwgLi4uYXJncyksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRhc2tRdWV1ZTogb3B0aW9ucy50YXNrUXVldWUsXG4gICAgICAgIG1lbW86IG9wdGlvbnMubWVtbyAmJiBtYXBUb1BheWxvYWRzKGFjdGl2YXRvci5wYXlsb2FkQ29udmVydGVyLCBvcHRpb25zLm1lbW8pLFxuICAgICAgICBzZWFyY2hBdHRyaWJ1dGVzOlxuICAgICAgICAgIG9wdGlvbnMuc2VhcmNoQXR0cmlidXRlcyB8fCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA/IHsgaW5kZXhlZEZpZWxkczogZW5jb2RlVW5pZmllZFNlYXJjaEF0dHJpYnV0ZXMob3B0aW9ucy5zZWFyY2hBdHRyaWJ1dGVzLCBvcHRpb25zLnR5cGVkU2VhcmNoQXR0cmlidXRlcykgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgd29ya2Zsb3dSdW5UaW1lb3V0OiBtc09wdGlvbmFsVG9UcyhvcHRpb25zLndvcmtmbG93UnVuVGltZW91dCksXG4gICAgICAgIHdvcmtmbG93VGFza1RpbWVvdXQ6IG1zT3B0aW9uYWxUb1RzKG9wdGlvbnMud29ya2Zsb3dUYXNrVGltZW91dCksXG4gICAgICAgIHZlcnNpb25pbmdJbnRlbnQ6IHZlcnNpb25pbmdJbnRlbnRUb1Byb3RvKG9wdGlvbnMudmVyc2lvbmluZ0ludGVudCksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgaW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcjogZW5jb2RlSW5pdGlhbFZlcnNpb25pbmdCZWhhdmlvcihvcHRpb25zLmluaXRpYWxWZXJzaW9uaW5nQmVoYXZpb3IpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZuKHtcbiAgICAgIGFyZ3MsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIG9wdGlvbnM6IHJlcXVpcmVkT3B0aW9ucyxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL2NvbmNlcHRzL3doYXQtaXMtY29udGludWUtYXMtbmV3LyB8IENvbnRpbnVlcy1Bcy1OZXd9IHRoZSBjdXJyZW50IFdvcmtmbG93IEV4ZWN1dGlvblxuICogd2l0aCBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogU2hvcnRoYW5kIGZvciBgbWFrZUNvbnRpbnVlQXNOZXdGdW5jPEY+KCkoLi4uYXJncylgLiAoU2VlOiB7QGxpbmsgbWFrZUNvbnRpbnVlQXNOZXdGdW5jfS4pXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY29udGludWVBc05ldyB9IGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93JztcbiAqIGltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZVR5cGUgfSBmcm9tICdAdGVtcG9yYWxpby9jb21tb24nO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KG46IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICogICAvLyAuLi4gV29ya2Zsb3cgbG9naWNcbiAqICAgYXdhaXQgY29udGludWVBc05ldzx0eXBlb2YgbXlXb3JrZmxvdz4obiArIDEpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250aW51ZUFzTmV3PEYgZXh0ZW5kcyBXb3JrZmxvdz4oLi4uYXJnczogUGFyYW1ldGVyczxGPik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIG1ha2VDb250aW51ZUFzTmV3RnVuYygpKC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIFJGQyBjb21wbGlhbnQgVjQgdXVpZC5cbiAqIFVzZXMgdGhlIHdvcmtmbG93J3MgZGV0ZXJtaW5pc3RpYyBQUk5HIG1ha2luZyBpdCBzYWZlIGZvciB1c2Ugd2l0aGluIGEgd29ya2Zsb3cuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGluc2VjdXJlLlxuICogU2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQgfCBzdGFja292ZXJmbG93IGRpc2N1c3Npb259LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKTogc3RyaW5nIHtcbiAgLy8gUmV0dXJuIHRoZSBoZXhhZGVjaW1hbCB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIG51bWJlciBgbmAsIHBhZGRlZCB3aXRoIHplcm9lcyB0byBiZSBvZiBsZW5ndGggYHBgXG4gIGNvbnN0IGhvID0gKG46IG51bWJlciwgcDogbnVtYmVyKSA9PiBuLnRvU3RyaW5nKDE2KS5wYWRTdGFydChwLCAnMCcpO1xuICAvLyBDcmVhdGUgYSB2aWV3IGJhY2tlZCBieSBhIDE2LWJ5dGUgYnVmZmVyXG4gIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7XG4gIC8vIEZpbGwgYnVmZmVyIHdpdGggcmFuZG9tIHZhbHVlc1xuICB2aWV3LnNldFVpbnQzMigwLCAoTWF0aC5yYW5kb20oKSAqIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gIHZpZXcuc2V0VWludDMyKDQsIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgdmlldy5zZXRVaW50MzIoOCwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICB2aWV3LnNldFVpbnQzMigxMiwgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMCkgPj4+IDApO1xuICAvLyBQYXRjaCB0aGUgNnRoIGJ5dGUgdG8gcmVmbGVjdCBhIHZlcnNpb24gNCBVVUlEXG4gIHZpZXcuc2V0VWludDgoNiwgKHZpZXcuZ2V0VWludDgoNikgJiAweGYpIHwgMHg0MCk7XG4gIC8vIFBhdGNoIHRoZSA4dGggYnl0ZSB0byByZWZsZWN0IGEgdmFyaWFudCAxIFVVSUQgKHZlcnNpb24gNCBVVUlEcyBhcmUpXG4gIHZpZXcuc2V0VWludDgoOCwgKHZpZXcuZ2V0VWludDgoOCkgJiAweDNmKSB8IDB4ODApO1xuICAvLyBDb21waWxlIHRoZSBjYW5vbmljYWwgdGV4dHVhbCBmb3JtIGZyb20gdGhlIGFycmF5IGRhdGFcbiAgcmV0dXJuIGAke2hvKHZpZXcuZ2V0VWludDMyKDApLCA4KX0tJHtobyh2aWV3LmdldFVpbnQxNig0KSwgNCl9LSR7aG8odmlldy5nZXRVaW50MTYoNiksIDQpfS0ke2hvKFxuICAgIHZpZXcuZ2V0VWludDE2KDgpLFxuICAgIDRcbiAgKX0tJHtobyh2aWV3LmdldFVpbnQzMigxMCksIDgpfSR7aG8odmlldy5nZXRVaW50MTYoMTQpLCA0KX1gO1xufVxuXG4vKipcbiAqIFBhdGNoIG9yIHVwZ3JhZGUgd29ya2Zsb3cgY29kZSBieSBjaGVja2luZyBvciBzdGF0aW5nIHRoYXQgdGhpcyB3b3JrZmxvdyBoYXMgYSBjZXJ0YWluIHBhdGNoLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLnRlbXBvcmFsLmlvL3R5cGVzY3JpcHQvdmVyc2lvbmluZyB8IGRvY3MgcGFnZX0gZm9yIGluZm8uXG4gKlxuICogSWYgdGhlIHdvcmtmbG93IGlzIHJlcGxheWluZyBhbiBleGlzdGluZyBoaXN0b3J5LCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoYXRcbiAqIGhpc3Rvcnkgd2FzIHByb2R1Y2VkIGJ5IGEgd29ya2VyIHdoaWNoIGFsc28gaGFkIGEgYHBhdGNoZWRgIGNhbGwgd2l0aCB0aGUgc2FtZSBgcGF0Y2hJZGAuXG4gKiBJZiB0aGUgaGlzdG9yeSB3YXMgcHJvZHVjZWQgYnkgYSB3b3JrZXIgKndpdGhvdXQqIHN1Y2ggYSBjYWxsLCB0aGVuIGl0IHdpbGwgcmV0dXJuIGZhbHNlLlxuICpcbiAqIElmIHRoZSB3b3JrZmxvdyBpcyBub3QgY3VycmVudGx5IHJlcGxheWluZywgdGhlbiB0aGlzIGNhbGwgKmFsd2F5cyogcmV0dXJucyB0cnVlLlxuICpcbiAqIFlvdXIgd29ya2Zsb3cgY29kZSBzaG91bGQgcnVuIHRoZSBcIm5ld1wiIGNvZGUgaWYgdGhpcyByZXR1cm5zIHRydWUsIGlmIGl0IHJldHVybnMgZmFsc2UsIHlvdVxuICogc2hvdWxkIHJ1biB0aGUgXCJvbGRcIiBjb2RlLiBCeSBkb2luZyB0aGlzLCB5b3UgY2FuIG1haW50YWluIGRldGVybWluaXNtLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hlZChwYXRjaElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ1dvcmtmbG93LnBhdGNoKC4uLikgYW5kIFdvcmtmbG93LmRlcHJlY2F0ZVBhdGNoIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIHJldHVybiBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCBmYWxzZSk7XG59XG5cbi8qKlxuICogSW5kaWNhdGUgdGhhdCBhIHBhdGNoIGlzIGJlaW5nIHBoYXNlZCBvdXQuXG4gKlxuICogU2VlIHtAbGluayBodHRwczovL2RvY3MudGVtcG9yYWwuaW8vdHlwZXNjcmlwdC92ZXJzaW9uaW5nIHwgZG9jcyBwYWdlfSBmb3IgaW5mby5cbiAqXG4gKiBXb3JrZmxvd3Mgd2l0aCB0aGlzIGNhbGwgbWF5IGJlIGRlcGxveWVkIGFsb25nc2lkZSB3b3JrZmxvd3Mgd2l0aCBhIHtAbGluayBwYXRjaGVkfSBjYWxsLCBidXRcbiAqIHRoZXkgbXVzdCAqbm90KiBiZSBkZXBsb3llZCB3aGlsZSBhbnkgd29ya2VycyBzdGlsbCBleGlzdCBydW5uaW5nIG9sZCBjb2RlIHdpdGhvdXQgYVxuICoge0BsaW5rIHBhdGNoZWR9IGNhbGwsIG9yIGFueSBydW5zIHdpdGggaGlzdG9yaWVzIHByb2R1Y2VkIGJ5IHN1Y2ggd29ya2VycyBleGlzdC4gSWYgZWl0aGVyIGtpbmRcbiAqIG9mIHdvcmtlciBlbmNvdW50ZXJzIGEgaGlzdG9yeSBwcm9kdWNlZCBieSB0aGUgb3RoZXIsIHRoZWlyIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC5cbiAqXG4gKiBPbmNlIGFsbCBsaXZlIHdvcmtmbG93IHJ1bnMgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5IHdvcmtlcnMgd2l0aCB0aGlzIGNhbGwsIHlvdSBjYW4gZGVwbG95IHdvcmtlcnNcbiAqIHdoaWNoIGFyZSBmcmVlIG9mIGVpdGhlciBraW5kIG9mIHBhdGNoIGNhbGwgZm9yIHRoaXMgSUQuIFdvcmtlcnMgd2l0aCBhbmQgd2l0aG91dCB0aGlzIGNhbGxcbiAqIG1heSBjb2V4aXN0LCBhcyBsb25nIGFzIHRoZXkgYXJlIGJvdGggcnVubmluZyB0aGUgXCJuZXdcIiBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXRjaElkIEFuIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoaXMgcGF0Y2guIEl0IGlzIE9LIHRvIHVzZSBtdWx0aXBsZVxuICogY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCwgd2hpY2ggbWVhbnMgYWxsIHN1Y2ggY2FsbHMgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwcmVjYXRlUGF0Y2gocGF0Y2hJZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5wYXRjaCguLi4pIGFuZCBXb3JrZmxvdy5kZXByZWNhdGVQYXRjaCBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJ1xuICApO1xuICBhY3RpdmF0b3IucGF0Y2hJbnRlcm5hbChwYXRjaElkLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgIG9yIGB0aW1lb3V0YCBleHBpcmVzLCBwcm92aWRpbmdcbiAqIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSB0aW1lciAoaS5lLiBwcm92aWRlIG1ldGFkYXRhKVxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IG51bWJlciBvZiBtaWxsaXNlY29uZHMgb3Ige0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL21zIHwgbXMtZm9ybWF0dGVkIHN0cmluZ31cbiAqXG4gKiBAcmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjb25kaXRpb24gd2FzIHRydWUgYmVmb3JlIHRoZSB0aW1lb3V0IGV4cGlyZXNcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFRpbWVyT3B0aW9ucyBpcyBhIG5ldyBhZGRpdGlvbiBhbmQgc3ViamVjdCB0byBjaGFuZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dDogRHVyYXRpb24sIG9wdGlvbnM6IFRpbWVyT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj47XG5cbi8qKlxuICogUmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGBmbmAgZXZhbHVhdGVzIHRvIGB0cnVlYCBvciBgdGltZW91dGAgZXhwaXJlcy5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yIHtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9tcyB8IG1zLWZvcm1hdHRlZCBzdHJpbmd9XG4gKlxuICogQHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29uZGl0aW9uIHdhcyB0cnVlIGJlZm9yZSB0aGUgdGltZW91dCBleHBpcmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25kaXRpb24oZm46ICgpID0+IGJvb2xlYW4sIHRpbWVvdXQ6IER1cmF0aW9uKTogUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYGZuYCBldmFsdWF0ZXMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZGl0aW9uKGZuOiAoKSA9PiBib29sZWFuKTogUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmRpdGlvbihmbjogKCkgPT4gYm9vbGVhbiwgdGltZW91dD86IER1cmF0aW9uLCBvcHRzPzogVGltZXJPcHRpb25zKTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnV29ya2Zsb3cuY29uZGl0aW9uKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICAvLyBQcmlvciB0byAxLjUuMCwgYGNvbmRpdGlvbihmbiwgMClgIHdhcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYGNvbmRpdGlvbihmbiwgdW5kZWZpbmVkKWBcbiAgaWYgKHRpbWVvdXQgPT09IDAgJiYgIXBhdGNoZWQoQ09ORElUSU9OXzBfUEFUQ0gpKSB7XG4gICAgcmV0dXJuIGNvbmRpdGlvbklubmVyKGZuKTtcbiAgfVxuICBpZiAodHlwZW9mIHRpbWVvdXQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aW1lb3V0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBDYW5jZWxsYXRpb25TY29wZS5jYW5jZWxsYWJsZShhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtzbGVlcCh0aW1lb3V0LCBvcHRzKS50aGVuKCgpID0+IGZhbHNlKSwgY29uZGl0aW9uSW5uZXIoZm4pLnRoZW4oKCkgPT4gdHJ1ZSldKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKS5jYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9uSW5uZXIoZm4pO1xufVxuXG5mdW5jdGlvbiBjb25kaXRpb25Jbm5lcihmbjogKCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhY3RpdmF0b3IgPSBnZXRBY3RpdmF0b3IoKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzY29wZSA9IENhbmNlbGxhdGlvblNjb3BlLmN1cnJlbnQoKTtcbiAgICBpZiAoc2NvcGUuY29uc2lkZXJlZENhbmNlbGxlZCkge1xuICAgICAgdW50cmFja1Byb21pc2Uoc2NvcGUuY2FuY2VsUmVxdWVzdGVkLmNhdGNoKHJlamVjdCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcSA9IGFjdGl2YXRvci5uZXh0U2Vxcy5jb25kaXRpb24rKztcbiAgICBpZiAoc2NvcGUuY2FuY2VsbGFibGUpIHtcbiAgICAgIHVudHJhY2tQcm9taXNlKFxuICAgICAgICBzY29wZS5jYW5jZWxSZXF1ZXN0ZWQuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGFjdGl2YXRvci5ibG9ja2VkQ29uZGl0aW9ucy5kZWxldGUoc2VxKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWFnZXIgZXZhbHVhdGlvblxuICAgIGlmIChmbigpKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZhdG9yLmJsb2NrZWRDb25kaXRpb25zLnNldChzZXEsIHsgZm4sIHJlc29sdmUgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlZmluZSBhbiB1cGRhdGUgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gdXBkYXRlIGEgV29ya2Zsb3cgdXNpbmcgYSB7QGxpbmsgV29ya2Zsb3dIYW5kbGV9LCB7QGxpbmsgQ2hpbGRXb3JrZmxvd0hhbmRsZX0gb3Ige0BsaW5rIEV4dGVybmFsV29ya2Zsb3dIYW5kbGV9LlxuICogQSBkZWZpbml0aW9uIGNhbiBiZSByZXVzZWQgaW4gbXVsdGlwbGUgV29ya2Zsb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVXBkYXRlPFJldCwgQXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgIG5hbWUsXG4gIH0gYXMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3MsIE5hbWU+O1xufVxuXG4vKipcbiAqIERlZmluZSBhIHNpZ25hbCBtZXRob2QgZm9yIGEgV29ya2Zsb3cuXG4gKlxuICogQSBkZWZpbml0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGluIHRoZSBXb3JrZmxvdyB2aWEge0BsaW5rIHNldEhhbmRsZXJ9IGFuZCB0byBzaWduYWwgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0sIHtAbGluayBDaGlsZFdvcmtmbG93SGFuZGxlfSBvciB7QGxpbmsgRXh0ZXJuYWxXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTaWduYWw8QXJncyBleHRlbmRzIGFueVtdID0gW10sIE5hbWUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICBuYW1lOiBOYW1lXG4pOiBTaWduYWxEZWZpbml0aW9uPEFyZ3MsIE5hbWU+IHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc2lnbmFsJyxcbiAgICBuYW1lLFxuICB9IGFzIFNpZ25hbERlZmluaXRpb248QXJncywgTmFtZT47XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcXVlcnkgbWV0aG9kIGZvciBhIFdvcmtmbG93LlxuICpcbiAqIEEgZGVmaW5pdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBpbiB0aGUgV29ya2Zsb3cgdmlhIHtAbGluayBzZXRIYW5kbGVyfSBhbmQgdG8gcXVlcnkgYSBXb3JrZmxvdyB1c2luZyBhIHtAbGluayBXb3JrZmxvd0hhbmRsZX0uXG4gKiBBIGRlZmluaXRpb24gY2FuIGJlIHJldXNlZCBpbiBtdWx0aXBsZSBXb3JrZmxvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVRdWVyeTxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSA9IFtdLCBOYW1lIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgbmFtZTogTmFtZVxuKTogUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncywgTmFtZT4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdxdWVyeScsXG4gICAgbmFtZSxcbiAgfSBhcyBRdWVyeURlZmluaXRpb248UmV0LCBBcmdzLCBOYW1lPjtcbn1cblxuLyoqXG4gKiBTZXQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBhIFdvcmtmbG93IHVwZGF0ZSwgc2lnbmFsLCBvciBxdWVyeS5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUsIHNpZ25hbCwgb3IgcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gZGVmIGFuIHtAbGluayBVcGRhdGVEZWZpbml0aW9ufSwge0BsaW5rIFNpZ25hbERlZmluaXRpb259LCBvciB7QGxpbmsgUXVlcnlEZWZpbml0aW9ufSBhcyByZXR1cm5lZCBieSB7QGxpbmsgZGVmaW5lVXBkYXRlfSwge0BsaW5rIGRlZmluZVNpZ25hbH0sIG9yIHtAbGluayBkZWZpbmVRdWVyeX0gcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGhhbmRsZXIgYSBjb21wYXRpYmxlIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBkZWZpbml0aW9uIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICogQHBhcmFtIG9wdGlvbnMgYW4gb3B0aW9uYWwgYGRlc2NyaXB0aW9uYCBvZiB0aGUgaGFuZGxlciBhbmQgYW4gb3B0aW9uYWwgdXBkYXRlIGB2YWxpZGF0b3JgIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxSZXQsIEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVCBleHRlbmRzIFF1ZXJ5RGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBRdWVyeUhhbmRsZXJPcHRpb25zXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEhhbmRsZXI8UmV0LCBBcmdzIGV4dGVuZHMgYW55W10sIFQgZXh0ZW5kcyBTaWduYWxEZWZpbml0aW9uPEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBTaWduYWxIYW5kbGVyT3B0aW9uc1xuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRIYW5kbGVyPFJldCwgQXJncyBleHRlbmRzIGFueVtdLCBUIGV4dGVuZHMgVXBkYXRlRGVmaW5pdGlvbjxSZXQsIEFyZ3M+PihcbiAgZGVmOiBULFxuICBoYW5kbGVyOiBIYW5kbGVyPFJldCwgQXJncywgVD4gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM/OiBVcGRhdGVIYW5kbGVyT3B0aW9uczxBcmdzPlxuKTogdm9pZDtcblxuLy8gRm9yIFVwZGF0ZXMgYW5kIFNpZ25hbHMgd2Ugd2FudCB0byBtYWtlIGEgcHVibGljIGd1YXJhbnRlZSBzb21ldGhpbmcgbGlrZSB0aGVcbi8vIGZvbGxvd2luZzpcbi8vXG4vLyAgIFwiSWYgYSBXRlQgY29udGFpbnMgYSBTaWduYWwvVXBkYXRlLCBhbmQgaWYgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhhdFxuLy8gICBTaWduYWwvVXBkYXRlLCB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuXCJcIlxuLy9cbi8vIEhvd2V2ZXIsIHRoYXQgc3RhdGVtZW50IGlzIG5vdCB3ZWxsLWRlZmluZWQsIGxlYXZpbmcgc2V2ZXJhbCBxdWVzdGlvbnMgb3Blbjpcbi8vXG4vLyAxLiBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgYSBoYW5kbGVyIHRvIGJlIFwiYXZhaWxhYmxlXCI/IFdoYXQgaGFwcGVucyBpZiB0aGVcbi8vICAgIGhhbmRsZXIgaXMgbm90IHByZXNlbnQgaW5pdGlhbGx5IGJ1dCBpcyBzZXQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlXG4vLyAgICBXb3JrZmxvdyBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhhdCBXRlQ/IFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpc1xuLy8gICAgc2V0IGFuZCB0aGVuIGRlbGV0ZWQsIG9yIHJlcGxhY2VkIHdpdGggYSBkaWZmZXJlbnQgaGFuZGxlcj9cbi8vXG4vLyAyLiBXaGVuIGlzIHRoZSBoYW5kbGVyIGV4ZWN1dGVkPyAoV2hlbiBpdCBmaXJzdCBiZWNvbWVzIGF2YWlsYWJsZT8gQXQgdGhlIGVuZFxuLy8gICAgb2YgdGhlIGFjdGl2YXRpb24/KSBXaGF0IGFyZSB0aGUgZXhlY3V0aW9uIHNlbWFudGljcyBvZiBXb3JrZmxvdyBhbmRcbi8vICAgIFNpZ25hbC9VcGRhdGUgaGFuZGxlciBjb2RlIGdpdmVuIHRoYXQgdGhleSBhcmUgY29uY3VycmVudD8gQ2FuIHRoZSB1c2VyXG4vLyAgICByZWx5IG9uIFNpZ25hbC9VcGRhdGUgc2lkZSBlZmZlY3RzIGJlaW5nIHJlZmxlY3RlZCBpbiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgb3IgaW4gdGhlIHZhbHVlIHBhc3NlZCB0byBDb250aW51ZS1Bcy1OZXc/IElmIHRoZSBoYW5kbGVyIGlzIGFuXG4vLyAgICBhc3luYyBmdW5jdGlvbiAvIGNvcm91dGluZSwgaG93IG11Y2ggb2YgaXQgaXMgZXhlY3V0ZWQgYW5kIHdoZW4gaXMgdGhlXG4vLyAgICByZXN0IGV4ZWN1dGVkP1xuLy9cbi8vIDMuIFdoYXQgaGFwcGVucyBpZiB0aGUgaGFuZGxlciBpcyBub3QgZXhlY3V0ZWQ/IChpLmUuIGJlY2F1c2UgaXQgd2Fzbid0XG4vLyAgICBhdmFpbGFibGUgaW4gdGhlIHNlbnNlIGRlZmluZWQgYnkgKDEpKVxuLy9cbi8vIDQuIEluIHRoZSBjYXNlIG9mIFVwZGF0ZSwgd2hlbiBpcyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBleGVjdXRlZD9cbi8vXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gZm9yIFR5cGVzY3JpcHQgaXMgYXMgZm9sbG93czpcbi8vXG4vLyAxLiBzZGstY29yZSBzb3J0cyBTaWduYWwgYW5kIFVwZGF0ZSBqb2JzIChhbmQgUGF0Y2hlcykgYWhlYWQgb2YgYWxsIG90aGVyXG4vLyAgICBqb2JzLiBUaHVzIGlmIHRoZSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlblxuLy8gICAgdGhlIFNpZ25hbC9VcGRhdGUgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgV29ya2Zsb3cgY29kZSBpcyBleGVjdXRlZC4gSWYgaXRcbi8vICAgIGlzIG5vdCwgdGhlbiB0aGUgU2lnbmFsL1VwZGF0ZSBjYWxscyBhcmUgcHVzaGVkIHRvIGEgYnVmZmVyLlxuLy9cbi8vIDIuIE9uIGVhY2ggY2FsbCB0byBzZXRIYW5kbGVyIGZvciBhIGdpdmVuIFNpZ25hbC9VcGRhdGUsIHdlIG1ha2UgYSBwYXNzXG4vLyAgICB0aHJvdWdoIHRoZSBidWZmZXIgbGlzdC4gSWYgYSBidWZmZXJlZCBqb2IgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBqdXN0LXNldFxuLy8gICAgaGFuZGxlciwgdGhlbiB0aGUgam9iIGlzIHJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyIGFuZCB0aGUgaW5pdGlhbFxuLy8gICAgc3luY2hyb25vdXMgcG9ydGlvbiBvZiB0aGUgaGFuZGxlciBpcyBpbnZva2VkIG9uIHRoYXQgaW5wdXQgKGkuZS5cbi8vICAgIHByZWVtcHRpbmcgd29ya2Zsb3cgY29kZSkuXG4vL1xuLy8gVGh1cyBpbiB0aGUgY2FzZSBvZiBUeXBlc2NyaXB0IHRoZSBxdWVzdGlvbnMgYWJvdmUgYXJlIGFuc3dlcmVkIGFzIGZvbGxvd3M6XG4vL1xuLy8gMS4gQSBoYW5kbGVyIGlzIFwiYXZhaWxhYmxlXCIgaWYgaXQgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgQWN0aXZhdGlvbiBvclxuLy8gICAgYmVjb21lcyBzZXQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgQWN0aXZhdGlvbi4gSWYgdGhlIGhhbmRsZXIgaXMgbm90IHNldFxuLy8gICAgaW5pdGlhbGx5IHRoZW4gaXQgaXMgZXhlY3V0ZWQgYXMgc29vbiBhcyBpdCBpcyBzZXQuIFN1YnNlcXVlbnQgZGVsZXRpb24gb3Jcbi8vICAgIHJlcGxhY2VtZW50IGJ5IGEgZGlmZmVyZW50IGhhbmRsZXIgaGFzIG5vIGltcGFjdCBiZWNhdXNlIHRoZSBqb2JzIGl0IHdhc1xuLy8gICAgaGFuZGxpbmcgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBhbmQgYXJlIG5vIGxvbmdlciBpbiB0aGUgYnVmZmVyLlxuLy9cbi8vIDIuIFRoZSBoYW5kbGVyIGlzIGV4ZWN1dGVkIGFzIHNvb24gYXMgaXQgYmVjb21lcyBhdmFpbGFibGUuIEkuZS4gaWYgdGhlXG4vLyAgICBoYW5kbGVyIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIEFjdGl2YXRpb24gdGhlbiBpdCBpcyBleGVjdXRlZCB3aGVuXG4vLyAgICBmaXJzdCBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIFNpZ25hbC9VcGRhdGUgam9iOyBhbHRlcm5hdGl2ZWx5LCBpZiBpdCBpc1xuLy8gICAgc2V0IGJ5IGEgc2V0SGFuZGxlciBjYWxsIG1hZGUgYnkgV29ya2Zsb3cgY29kZSwgdGhlbiBpdCBpcyBleGVjdXRlZCBhc1xuLy8gICAgcGFydCBvZiB0aGF0IGNhbGwgKHByZWVtcHRpbmcgV29ya2Zsb3cgY29kZSkuIFRoZXJlZm9yZSwgYSB1c2VyIGNhbiByZWx5XG4vLyAgICBvbiBTaWduYWwvVXBkYXRlIHNpZGUgZWZmZWN0cyBiZWluZyByZWZsZWN0ZWQgaW4gZS5nLiB0aGUgV29ya2Zsb3cgcmV0dXJuXG4vLyAgICB2YWx1ZSwgYW5kIGluIHRoZSB2YWx1ZSBwYXNzZWQgdG8gQ29udGludWUtQXMtTmV3LiBBY3RpdmF0aW9uIGpvYnMgYXJlXG4vLyAgICBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHN1cHBsaWVkIGJ5IHNkay1jb3JlLCBpLmUuIFNpZ25hbHMsIHRoZW4gVXBkYXRlcyxcbi8vICAgIHRoZW4gb3RoZXIgam9icy4gV2l0aGluIGVhY2ggZ3JvdXAsIHRoZSBvcmRlciBzZW50IGJ5IHRoZSBzZXJ2ZXIgaXNcbi8vICAgIHByZXNlcnZlZC4gSWYgdGhlIGhhbmRsZXIgaXMgYXN5bmMsIGl0IGlzIGV4ZWN1dGVkIHVwIHRvIGl0cyBmaXJzdCB5aWVsZFxuLy8gICAgcG9pbnQuXG4vL1xuLy8gMy4gU2lnbmFsIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhIFNpZ25hbCBqb2IgdGhlblxuLy8gICAgdGhlIGpvYiByZW1haW5zIGluIHRoZSBidWZmZXIuIElmIGEgaGFuZGxlciBmb3IgdGhlIFNpZ25hbCBiZWNvbWVzXG4vLyAgICBhdmFpbGFibGUgaW4gYSBzdWJzZXF1ZW50IEFjdGl2YXRpb24gKG9mIHRoZSBzYW1lIG9yIGEgc3Vic2VxdWVudCBXRlQpXG4vLyAgICB0aGVuIHRoZSBoYW5kbGVyIHdpbGwgYmUgZXhlY3V0ZWQuIElmIG5vdCwgdGhlbiB0aGUgU2lnbmFsIHdpbGwgbmV2ZXIgYmVcbi8vICAgIHJlc3BvbmRlZCB0byBhbmQgdGhpcyBjYXVzZXMgbm8gZXJyb3IuXG4vL1xuLy8gICAgVXBkYXRlIGNhc2U6IElmIGEgaGFuZGxlciBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGZvciBhbiBVcGRhdGUgam9iIHRoZW5cbi8vICAgIHRoZSBVcGRhdGUgaXMgcmVqZWN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgQWN0aXZhdGlvbi4gVGh1cywgaWYgYSB1c2VyIGRvZXNcbi8vICAgIG5vdCB3YW50IGFuIFVwZGF0ZSB0byBiZSByZWplY3RlZCBmb3IgdGhpcyByZWFzb24sIHRoZW4gaXQgaXMgdGhlaXJcbi8vICAgIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZWlyIGFwcGxpY2F0aW9uIGFuZCB3b3JrZmxvdyBjb2RlIGludGVyYWN0XG4vLyAgICBzdWNoIHRoYXQgYSBoYW5kbGVyIGlzIGF2YWlsYWJsZSBmb3IgdGhlIFVwZGF0ZSBkdXJpbmcgYW55IEFjdGl2YXRpb25cbi8vICAgIHdoaWNoIG1pZ2h0IGNvbnRhaW4gdGhlaXIgVXBkYXRlIGpvYi4gKE5vdGUgdGhhdCB0aGUgdXNlciBvZnRlbiBoYXNcbi8vICAgIHVuY2VydGFpbnR5IGFib3V0IHdoaWNoIFdGVCB0aGVpciBTaWduYWwvVXBkYXRlIHdpbGwgYXBwZWFyIGluLiBGb3Jcbi8vICAgIGV4YW1wbGUsIGlmIHRoZXkgY2FsbCBzdGFydFdvcmtmbG93KCkgZm9sbG93ZWQgYnkgc3RhcnRVcGRhdGUoKSwgdGhlbiB0aGV5XG4vLyAgICB3aWxsIHR5cGljYWxseSBub3Qga25vdyB3aGV0aGVyIHRoZXNlIHdpbGwgYmUgZGVsaXZlcmVkIGluIG9uZSBvciB0d29cbi8vICAgIFdGVHMuIE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBzaXR1YXRpb25zIHdoZXJlIHRoZXkgd291bGQgaGF2ZSByZWFzb25cbi8vICAgIHRvIGJlbGlldmUgdGhleSBhcmUgaW4gdGhlIHNhbWUgV0ZULCBmb3IgZXhhbXBsZSBpZiB0aGV5IGRvIG5vdCBzdGFydFxuLy8gICAgV29ya2VyIHBvbGxpbmcgdW50aWwgYWZ0ZXIgdGhleSBoYXZlIHZlcmlmaWVkIHRoYXQgYm90aCByZXF1ZXN0cyBoYXZlXG4vLyAgICBzdWNjZWVkZWQuKVxuLy9cbi8vIDQuIElmIGFuIFVwZGF0ZSBoYXMgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHRoZW4gaXQgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcbi8vICAgIHByaW9yIHRvIHRoZSBoYW5kbGVyLiAoTm90ZSB0aGF0IHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGJlXG4vLyAgICBzeW5jaHJvbm91cykuXG5leHBvcnQgZnVuY3Rpb24gc2V0SGFuZGxlcjxcbiAgUmV0LFxuICBBcmdzIGV4dGVuZHMgYW55W10sXG4gIFQgZXh0ZW5kcyBVcGRhdGVEZWZpbml0aW9uPFJldCwgQXJncz4gfCBTaWduYWxEZWZpbml0aW9uPEFyZ3M+IHwgUXVlcnlEZWZpbml0aW9uPFJldCwgQXJncz4sXG4+KFxuICBkZWY6IFQsXG4gIGhhbmRsZXI6IEhhbmRsZXI8UmV0LCBBcmdzLCBUPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9ucz86IFF1ZXJ5SGFuZGxlck9wdGlvbnMgfCBTaWduYWxIYW5kbGVyT3B0aW9ucyB8IFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+XG4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnNldEhhbmRsZXIoLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIC8vIENhbm5vdCByZWdpc3RlciBoYW5kbGVyIGZvciByZXNlcnZlZCBuYW1lc1xuICB0aHJvd0lmUmVzZXJ2ZWROYW1lKGRlZi50eXBlLCBkZWYubmFtZSk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gb3B0aW9ucz8uZGVzY3JpcHRpb247XG4gIGlmIChkZWYudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZU9wdGlvbnMgPSBvcHRpb25zIGFzIFVwZGF0ZUhhbmRsZXJPcHRpb25zPEFyZ3M+IHwgdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB1cGRhdGVPcHRpb25zPy52YWxpZGF0b3IgYXMgV29ya2Zsb3dVcGRhdGVWYWxpZGF0b3JUeXBlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5maW5pc2hlZFBvbGljeSA9IHVwZGF0ZU9wdGlvbnM/LnVuZmluaXNoZWRQb2xpY3kgPz8gSGFuZGxlclVuZmluaXNoZWRQb2xpY3kuV0FSTl9BTkRfQUJBTkRPTjtcbiAgICAgIGFjdGl2YXRvci51cGRhdGVIYW5kbGVycy5zZXQoZGVmLm5hbWUsIHsgaGFuZGxlciwgdmFsaWRhdG9yLCBkZXNjcmlwdGlvbiwgdW5maW5pc2hlZFBvbGljeSB9KTtcbiAgICAgIGFjdGl2YXRvci5kaXNwYXRjaEJ1ZmZlcmVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgICBhY3RpdmF0b3IudXBkYXRlSGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRlZi50eXBlID09PSAnc2lnbmFsJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3Qgc2lnbmFsT3B0aW9ucyA9IG9wdGlvbnMgYXMgU2lnbmFsSGFuZGxlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB1bmZpbmlzaGVkUG9saWN5ID0gc2lnbmFsT3B0aW9ucz8udW5maW5pc2hlZFBvbGljeSA/PyBIYW5kbGVyVW5maW5pc2hlZFBvbGljeS5XQVJOX0FORF9BQkFORE9OO1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLnNldChkZWYubmFtZSwgeyBoYW5kbGVyOiBoYW5kbGVyIGFzIGFueSwgZGVzY3JpcHRpb24sIHVuZmluaXNoZWRQb2xpY3kgfSk7XG4gICAgICBhY3RpdmF0b3IuZGlzcGF0Y2hCdWZmZXJlZFNpZ25hbHMoKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnNpZ25hbEhhbmRsZXJzLmRlbGV0ZShkZWYubmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkZWYudHlwZSA9PT0gJ3F1ZXJ5Jykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuc2V0KGRlZi5uYW1lLCB7IGhhbmRsZXI6IGhhbmRsZXIgYXMgYW55LCBkZXNjcmlwdGlvbiB9KTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPT0gbnVsbCkge1xuICAgICAgYWN0aXZhdG9yLnF1ZXJ5SGFuZGxlcnMuZGVsZXRlKGRlZi5uYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaGFuZGxlciB0byBiZSBlaXRoZXIgYSBmdW5jdGlvbiBvciAndW5kZWZpbmVkJy4gR290OiAnJHt0eXBlb2YgaGFuZGxlcn0nYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZGVmaW5pdGlvbiB0eXBlOiAkeyhkZWYgYXMgYW55KS50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgc2lnbmFsIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSBzaWduYWxzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBzaWduYWwgbmFtZXMuXG4gKlxuICogU2lnbmFscyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCBzaWduYWwgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiBzaWduYWwgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgc2lnbmFscyBmb3Igbm9uLXJlZ2lzdGVyZWQgc2lnbmFsIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTaWduYWxIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRTaWduYWxIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0U2lnbmFsSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0U2lnbmFsSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRTaWduYWxzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRTaWduYWxIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgdXBkYXRlIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGhhbmRsZSB1cGRhdGVzIGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCB1cGRhdGUgbmFtZXMuXG4gKlxuICogVXBkYXRlcyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgZGVmYXVsdCB1cGRhdGUgaGFuZGxlciBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlci5cbiAqXG4gKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgYSBnaXZlbiB1cGRhdGUgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgdXBkYXRlcyBmb3Igbm9uLXJlZ2lzdGVyZWQgdXBkYXRlIG5hbWVzLCBvciBgdW5kZWZpbmVkYCB0byB1bnNldCB0aGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRVcGRhdGVIYW5kbGVyKGhhbmRsZXI6IERlZmF1bHRVcGRhdGVIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0VXBkYXRlSGFuZGxlciguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0VXBkYXRlSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgYWN0aXZhdG9yLmRpc3BhdGNoQnVmZmVyZWRVcGRhdGVzKCk7XG4gIH0gZWxzZSBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgYWN0aXZhdG9yLmRlZmF1bHRVcGRhdGVIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGhhbmRsZXIgdG8gYmUgZWl0aGVyIGEgZnVuY3Rpb24gb3IgJ3VuZGVmaW5lZCcuIEdvdDogJyR7dHlwZW9mIGhhbmRsZXJ9J2ApO1xuICB9XG59XG5cbi8qKlxuICogU2V0IGEgcXVlcnkgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgaGFuZGxlIHF1ZXJ5IGNhbGxzIGZvciBub24tcmVnaXN0ZXJlZCBxdWVyeSBuYW1lcy5cbiAqXG4gKiBRdWVyaWVzIGFyZSBkaXNwYXRjaGVkIHRvIHRoZSBkZWZhdWx0IHF1ZXJ5IGhhbmRsZXIgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIuXG4gKlxuICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gcXVlcnkgbmFtZSB0aGUgbGFzdCBoYW5kbGVyIHdpbGwgb3ZlcndyaXRlIGFueSBwcmV2aW91cyBjYWxscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBoYW5kbGUgcXVlcmllcyBmb3Igbm9uLXJlZ2lzdGVyZWQgcXVlcnkgbmFtZXMsIG9yIGB1bmRlZmluZWRgIHRvIHVuc2V0IHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFF1ZXJ5SGFuZGxlcihoYW5kbGVyOiBEZWZhdWx0UXVlcnlIYW5kbGVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2YXRvciA9IGFzc2VydEluV29ya2Zsb3dDb250ZXh0KFxuICAgICdXb3JrZmxvdy5zZXREZWZhdWx0UXVlcnlIYW5kbGVyKC4uLikgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLidcbiAgKTtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nIHx8IGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGFjdGl2YXRvci5kZWZhdWx0UXVlcnlIYW5kbGVyID0gaGFuZGxlcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBoYW5kbGVyIHRvIGJlIGVpdGhlciBhIGZ1bmN0aW9uIG9yICd1bmRlZmluZWQnLiBHb3Q6ICcke3R5cGVvZiBoYW5kbGVyfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhpcyBXb3JrZmxvdydzIFNlYXJjaCBBdHRyaWJ1dGVzIGJ5IG1lcmdpbmcgdGhlIHByb3ZpZGVkIGBzZWFyY2hBdHRyaWJ1dGVzYCB3aXRoIHRoZSBleGlzdGluZyBTZWFyY2hcbiAqIEF0dHJpYnV0ZXMsIGB3b3JrZmxvd0luZm8oKS5zZWFyY2hBdHRyaWJ1dGVzYC5cbiAqXG4gKiBTZWFyY2ggYXR0cmlidXRlcyBjYW4gYmUgdXBzZXJ0ZWQgdXNpbmcgZWl0aGVyIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpIG9yIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSAocHJlZmVycmVkKVxuICpcbiAqIFVwc2VydGluZyBhIHdvcmtmbG93J3Mgc2VhcmNoIGF0dHJpYnV0ZXMgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBpbnRLZXkgPSBkZWZpbmVTZWFyY2hLZXkoJ0N1c3RvbUludEZpZWxkJywgJ0lOVCcpO1xuICogY29uc3QgYm9vbEtleSA9IGRlZmluZVNlYXJjaEtleSgnQ3VzdG9tQm9vbEZpZWxkJywgJ0JPT0wnKTtcbiAqIGNvbnN0IGtleXdvcmRMaXN0S2V5ID0gZGVmaW5lU2VhcmNoS2V5KCdDdXN0b21LZXl3b3JkRmllbGQnLCAnS0VZV09SRF9MSVNUJyk7XG4gKlxuICogdXBzZXJ0U2VhcmNoQXR0cmlidXRlcyhbXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGludEtleSwgMSksXG4gKiAgZGVmaW5lU2VhcmNoQXR0cmlidXRlKGJvb2xLZXksIHRydWUpXG4gKiBdKTtcbiAqIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoW1xuICogIGRlZmluZVNlYXJjaEF0dHJpYnV0ZShpbnRLZXksIDQyKSxcbiAqICBkZWZpbmVTZWFyY2hBdHRyaWJ1dGUoa2V5d29yZExpc3RLZXksIFsnZHVyYWJsZSBjb2RlJywgJ2lzIGdyZWF0J10pXG4gKiBdKTtcbiAqIGBgYFxuICpcbiAqIFdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIFNlYXJjaCBBdHRyaWJ1dGVzOlxuICpcbiAqIGBgYHRzXG4gKiB7XG4gKiAgIEN1c3RvbUludEZpZWxkOiBbNDJdLFxuICogICBDdXN0b21Cb29sRmllbGQ6IFt0cnVlXSxcbiAqICAgQ3VzdG9tS2V5d29yZEZpZWxkOiBbJ2R1cmFibGUgY29kZScsICdpcyBncmVhdCddXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2VhcmNoQXR0cmlidXRlcyBUaGUgUmVjb3JkIHRvIG1lcmdlLlxuICogSWYgdXNpbmcgU2VhcmNoQXR0cmlidXRlVXBkYXRlUGFpcltdIChwcmVmZXJyZWQpLCBzZXQgYSB2YWx1ZSB0byBudWxsIHRvIHJlbW92ZSB0aGUgc2VhcmNoIGF0dHJpYnV0ZS5cbiAqIElmIHVzaW5nIFNlYXJjaEF0dHJpYnV0ZXMgKGRlcHJlY2F0ZWQpLCBzZXQgYSB2YWx1ZSB0byB1bmRlZmluZWQgb3IgYW4gZW1wdHkgbGlzdCB0byByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydFNlYXJjaEF0dHJpYnV0ZXMoc2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyB8IFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXJbXSk6IHZvaWQge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dChcbiAgICAnV29ya2Zsb3cudXBzZXJ0U2VhcmNoQXR0cmlidXRlcyguLi4pIG1heSBvbmx5IGJlIHVzZWQgZnJvbSBhIFdvcmtmbG93IEV4ZWN1dGlvbi4nXG4gICk7XG5cbiAgaWYgKHNlYXJjaEF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2VhcmNoQXR0cmlidXRlcyBtdXN0IGJlIGEgbm9uLW51bGwgU2VhcmNoQXR0cmlidXRlcycpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VhcmNoQXR0cmlidXRlcykpIHtcbiAgICAvLyBUeXBlZCBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IGVuY29kZVVuaWZpZWRTZWFyY2hBdHRyaWJ1dGVzKHVuZGVmaW5lZCwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAgICBjb25zdCBuZXdTZWFyY2hBdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzID0geyAuLi5pbmZvLnNlYXJjaEF0dHJpYnV0ZXMgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZFxuICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHNlYXJjaEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKHBhaXIudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBudWxsLCByZW1vdmUgdGhlIHNlYXJjaCBhdHRyaWJ1dGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgbXV0YXRlIHRoZSBleGlzdGluZyBzdGF0ZSAoanVzdCB0aGUgbmV3IG1hcCkgc28gdGhpcyBpcyBzYWZlLlxuICAgICAgICAgIGRlbGV0ZSBuZXdTZWFyY2hBdHRyaWJ1dGVzW3BhaXIua2V5Lm5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1NlYXJjaEF0dHJpYnV0ZXNbcGFpci5rZXkubmFtZV0gPSBBcnJheS5pc0FycmF5KHBhaXIudmFsdWUpXG4gICAgICAgICAgICA/IHBhaXIudmFsdWVcbiAgICAgICAgICAgIDogKFtwYWlyLnZhbHVlXSBhcyBTZWFyY2hBdHRyaWJ1dGVWYWx1ZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5mbyxcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczogbmV3U2VhcmNoQXR0cmlidXRlcyxcbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvcHkgYW5kIGFwcGx5IGV4aXN0aW5nIGFuZCBuZXcgdXBkYXRlcy4gS2VlcCBpbiBtaW5kIHRoZSBvcmRlciBtYXR0ZXJzIGhlcmUgKGV4aXN0aW5nIGZpcnN0LCBuZXcgc2Vjb25kIC0gdG8gcG9zc2libHkgb3ZlcndyaXRlIGV4aXN0aW5nKS5cbiAgICAgICAgdHlwZWRTZWFyY2hBdHRyaWJ1dGVzOiBpbmZvLnR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFsuLi5zZWFyY2hBdHRyaWJ1dGVzXSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIExlZ2FjeSBzZWFyY2ggYXR0cmlidXRlc1xuICAgIGFjdGl2YXRvci5wdXNoQ29tbWFuZCh7XG4gICAgICB1cHNlcnRXb3JrZmxvd1NlYXJjaEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoQXR0cmlidXRlczoge1xuICAgICAgICAgIGluZGV4ZWRGaWVsZHM6IG1hcFRvUGF5bG9hZHMoc2VhcmNoQXR0cmlidXRlUGF5bG9hZENvbnZlcnRlciwgc2VhcmNoQXR0cmlidXRlcyksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb3B5IG9mIHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgbGV0IHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IGluZm8udHlwZWRTZWFyY2hBdHRyaWJ1dGVzLnVwZGF0ZUNvcHkoW10pO1xuICAgICAgY29uc3QgbmV3U2VhcmNoQXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlcyA9IHsgLi4uaW5mby5zZWFyY2hBdHRyaWJ1dGVzIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWRcblxuICAgICAgLy8gVXBzZXJ0IGxlZ2FjeSBzZWFyY2ggYXR0cmlidXRlcyBpbnRvIHR5cGVkU2VhcmNoQXR0cmlidXRlcy5cbiAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHNlYXJjaEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkodikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlYXJjaCBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvciB1bmRlZmluZWQsIGdvdCAke3Z9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIGFuIGVtcHR5IGxpc3QsIHRoaXMgc2lnbmlmaWVzIGRlbGV0aW9uLlxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBib3RoIHVudHlwZWQgJiB0eXBlZCBzZWFyY2ggYXR0cmlidXRlcy5cbiAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAvLyBXZSBjYW5ub3QgZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgZnJvbSB0aGVzZSB2YWx1ZXMuXG4gICAgICAgICAgLy8gSW5zdGVhZCwgd2UgZG8gYSBcImJlc3QgZWZmb3J0XCIgZGVsZXRpb24gZnJvbSB0eXBlZCBzZWFyY2ggYXR0cmlidXRlczpcbiAgICAgICAgICAvLyAtIGNoZWNrIGlmIGEgbWF0Y2hpbmcga2V5IG5hbWUgZXhpc3RzLCBpZiBzbywgcmVtb3ZlIGl0LlxuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSBrKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMgPSB0eXBlZFNlYXJjaEF0dHJpYnV0ZXMudXBkYXRlQ29weShbXG4gICAgICAgICAgICAgIHsga2V5OiBtYXRjaGluZ1BhaXIua2V5LCB2YWx1ZTogbnVsbCB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIG5ld1NlYXJjaEF0dHJpYnV0ZXNba107XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRlbXB0IHRvIGRpc2Nlcm4gYSB2YWxpZCBrZXkgdHlwaW5nIGZvciB0aGUgdXBkYXRlLlxuICAgICAgICBjb25zdCB0eXBlZEtleSA9IFR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRLZXlGcm9tVW50eXBlZChrLCB2KTtcblxuICAgICAgICAvLyBVbmFibGUgdG8gZGlzY2VybiBhIHZhbGlkIGtleSB0eXBpbmcgKG5vIHZhbGlkIHR5cGUgZm9yIGRlZmluZWQgdmFsdWUpLlxuICAgICAgICAvLyBTa2lwIGFwcGx5aW5nIHRoaXMgdXBkYXRlIChuby1vcCkuXG4gICAgICAgIGlmICh0eXBlZEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBURVhUIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSBhIHN0cmluZyB2YWx1ZSwgYnV0IGl0IGNvdWxkIGFsc28gYmUgS0VZV09SRC5cbiAgICAgICAgLy8gSWYgYSBtYXRjaGluZyBwYWlyIGV4aXN0cyB3aXRoIEtFWVdPUkQgdHlwZSwgdXNlIHRoYXQgaW5zdGVhZC5cbiAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdURVhUJykge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nUGFpciA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy5nZXRBbGwoKS5maW5kKChwYWlyKSA9PiBwYWlyLmtleS5uYW1lID09PSB0eXBlZEtleS5uYW1lKTtcbiAgICAgICAgICBpZiAobWF0Y2hpbmdQYWlyKSB7XG4gICAgICAgICAgICB0eXBlZEtleS50eXBlID0gbWF0Y2hpbmdQYWlyLmtleS50eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXdWYWx1ZTogdW5rbm93biA9IHY7XG4gICAgICAgIC8vIFVucGFjayB2YWx1ZSBpZiBpdCBpcyBhIHNpbmdsZS1lbGVtZW50IGFycmF5LlxuICAgICAgICBpZiAodi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHZbMF07XG4gICAgICAgICAgLy8gQ29udmVydCB2YWx1ZSBiYWNrIHRvIERhdGUuXG4gICAgICAgICAgaWYgKHR5cGVkS2V5LnR5cGUgPT09ICdEQVRFVElNRScpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3IERhdGUobmV3VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGEgZGVmaW5lZCB2YWx1ZSB3aXRoIHZhbGlkIHR5cGUuIEFwcGx5IHRoZSB1cGRhdGUuXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyA9IHR5cGVkU2VhcmNoQXR0cmlidXRlcy51cGRhdGVDb3B5KFtcbiAgICAgICAgICB7IGtleTogdHlwZWRLZXksIHZhbHVlOiBuZXdWYWx1ZSB9IGFzIFNlYXJjaEF0dHJpYnV0ZVVwZGF0ZVBhaXIsXG4gICAgICAgIF0pO1xuICAgICAgICBuZXdTZWFyY2hBdHRyaWJ1dGVzW2tdID0gdjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmluZm8sXG4gICAgICAgIHNlYXJjaEF0dHJpYnV0ZXM6IG5ld1NlYXJjaEF0dHJpYnV0ZXMsXG4gICAgICAgIHR5cGVkU2VhcmNoQXR0cmlidXRlcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoaXMgV29ya2Zsb3cncyBNZW1vcyBieSBtZXJnaW5nIHRoZSBwcm92aWRlZCBgbWVtb2Agd2l0aCBleGlzdGluZ1xuICogTWVtb3MgKGFzIHJldHVybmVkIGJ5IGB3b3JrZmxvd0luZm8oKS5tZW1vYCkuXG4gKlxuICogTmV3IG1lbW8gaXMgbWVyZ2VkIGJ5IHJlcGxhY2luZyBwcm9wZXJ0aWVzIG9mIHRoZSBzYW1lIG5hbWUgX2F0IHRoZSBmaXJzdFxuICogbGV2ZWwgb25seV8uIFNldHRpbmcgYSBwcm9wZXJ0eSB0byB2YWx1ZSBgdW5kZWZpbmVkYCBvciBgbnVsbGAgY2xlYXJzIHRoYXRcbiAqIGtleSBmcm9tIHRoZSBNZW1vLlxuICpcbiAqIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiB1cHNlcnRNZW1vKHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTM6IHsgc3Via2V5MTogdmFsdWUgfVxuICogICBrZXk0OiB2YWx1ZSxcbiAqIH0pO1xuICogdXBzZXJ0TWVtbyh7XG4gKiAgIGtleTI6IHZhbHVlXG4gKiAgIGtleTM6IHsgc3Via2V5MjogdmFsdWUgfVxuICogICBrZXk0OiB1bmRlZmluZWQsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIHdvdWxkIHJlc3VsdCBpbiB0aGUgV29ya2Zsb3cgaGF2aW5nIHRoZXNlIE1lbW86XG4gKlxuICogYGBgdHNcbiAqIHtcbiAqICAga2V5MTogdmFsdWUsXG4gKiAgIGtleTI6IHZhbHVlLFxuICogICBrZXkzOiB7IHN1YmtleTI6IHZhbHVlIH0gIC8vIE5vdGUgdGhpcyBvYmplY3Qgd2FzIGNvbXBsZXRlbHkgcmVwbGFjZWRcbiAqICAgLy8gTm90ZSB0aGF0IGtleTQgd2FzIGNvbXBsZXRlbHkgcmVtb3ZlZFxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG1lbW8gVGhlIFJlY29yZCB0byBtZXJnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwc2VydE1lbW8obWVtbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ1dvcmtmbG93LnVwc2VydE1lbW8oLi4uKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG5cbiAgaWYgKG1lbW8gPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWVtbyBtdXN0IGJlIGEgbm9uLW51bGwgUmVjb3JkJyk7XG4gIH1cblxuICBhY3RpdmF0b3IucHVzaENvbW1hbmQoe1xuICAgIG1vZGlmeVdvcmtmbG93UHJvcGVydGllczoge1xuICAgICAgdXBzZXJ0ZWRNZW1vOiB7XG4gICAgICAgIGZpZWxkczogbWFwVG9QYXlsb2FkcyhcbiAgICAgICAgICBhY3RpdmF0b3IucGF5bG9hZENvbnZlcnRlcixcbiAgICAgICAgICAvLyBDb252ZXJ0IG51bGwgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG1lbW8pLm1hcCgoW2ssIHZdKSA9PiBbaywgdiA/PyB1bmRlZmluZWRdKSlcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSk7XG5cbiAgYWN0aXZhdG9yLm11dGF0ZVdvcmtmbG93SW5mbygoaW5mbzogV29ya2Zsb3dJbmZvKTogV29ya2Zsb3dJbmZvID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIG1lbW86IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoe1xuICAgICAgICAgIC4uLmluZm8ubWVtbyxcbiAgICAgICAgICAuLi5tZW1vLFxuICAgICAgICB9KS5maWx0ZXIoKFtfLCB2XSkgPT4gdiAhPSBudWxsKVxuICAgICAgKSxcbiAgICB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHVwZGF0ZSBhbmQgc2lnbmFsIGhhbmRsZXJzIGhhdmUgZmluaXNoZWQgZXhlY3V0aW5nLlxuICpcbiAqIENvbnNpZGVyIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24gYmVmb3JlIHdvcmtmbG93IHJldHVybiBvciBjb250aW51ZS1hcy1uZXcsIHRvIHByZXZlbnRcbiAqIGludGVycnVwdGlvbiBvZiBpbi1wcm9ncmVzcyBoYW5kbGVycyBieSB3b3JrZmxvdyBleGl0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCB3b3JrZmxvdy5jb25kaXRpb24od29ya2Zsb3cuYWxsSGFuZGxlcnNGaW5pc2hlZClcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluLXByb2dyZXNzIHVwZGF0ZSBvciBzaWduYWwgaGFuZGxlciBleGVjdXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsSGFuZGxlcnNGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2FsbEhhbmRsZXJzRmluaXNoZWQoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1NpZ25hbHMuc2l6ZSA9PT0gMCAmJiBhY3RpdmF0b3IuaW5Qcm9ncmVzc1VwZGF0ZXMuc2l6ZSA9PT0gMDtcbn1cblxuLyoqXG4gKiBDYW4gYmUgdXNlZCB0byBhbHRlciB3b3JrZmxvdyBmdW5jdGlvbnMgd2l0aCBjZXJ0YWluIG9wdGlvbnMgc3BlY2lmaWVkIGF0IGRlZmluaXRpb24gdGltZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGU6XG4gKiBgYGB0c1xuICogc2V0V29ya2Zsb3dPcHRpb25zKHsgdmVyc2lvbmluZ0JlaGF2aW9yOiAnUElOTkVEJyB9LCBteVdvcmtmbG93KTtcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gKiAgIC8vIFdvcmtmbG93IGNvZGUgaGVyZVxuICogICByZXR1cm4gXCJoaVwiO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFRvIGFubm90YXRlIGEgZGVmYXVsdCBvciBkeW5hbWljIHdvcmtmbG93OlxuICogYGBgdHNcbiAqIGV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICogICAvLyBXb3JrZmxvdyBjb2RlIGhlcmVcbiAqICAgcmV0dXJuIFwiaGlcIjtcbiAqIH1cbiAqIHNldFdvcmtmbG93T3B0aW9ucyh7IHZlcnNpb25pbmdCZWhhdmlvcjogJ1BJTk5FRCcgfSwgbW9kdWxlLmV4cG9ydHMuZGVmYXVsdCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgZGVmaW50aW9uLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBvcHRpb25zLiBJZiBhXG4gKiBmdW5jdGlvbiBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgb25jZSBqdXN0IGJlZm9yZSB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciB0aGVcbiAqIGZpcnN0IHRpbWUuIEl0IGlzIHNhZmUgdG8gY2FsbCB7QGxpbmsgd29ya2Zsb3dJbmZvfSBpbnNpZGUgc3VjaCBhIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZuIFRoZSB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdvcmtmbG93T3B0aW9uczxBIGV4dGVuZHMgYW55W10sIFJUPihcbiAgb3B0aW9uczogV29ya2Zsb3dEZWZpbml0aW9uT3B0aW9uc09yR2V0dGVyLFxuICBmbjogKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8UlQ+XG4pOiB2b2lkIHtcbiAgT2JqZWN0LmFzc2lnbihmbiwge1xuICAgIHdvcmtmbG93RGVmaW5pdGlvbk9wdGlvbnM6IG9wdGlvbnMsXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8c3RyaW5nPignX19zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IGVuaGFuY2VkU3RhY2tUcmFjZVF1ZXJ5ID0gZGVmaW5lUXVlcnk8RW5oYW5jZWRTdGFja1RyYWNlPignX19lbmhhbmNlZF9zdGFja190cmFjZScpO1xuZXhwb3J0IGNvbnN0IHdvcmtmbG93TWV0YWRhdGFRdWVyeSA9IGRlZmluZVF1ZXJ5PHRlbXBvcmFsLmFwaS5zZGsudjEuSVdvcmtmbG93TWV0YWRhdGE+KCdfX3RlbXBvcmFsX3dvcmtmbG93X21ldGFkYXRhJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50RGV0YWlscygpOiBzdHJpbmcge1xuICBjb25zdCBhY3RpdmF0b3IgPSBhc3NlcnRJbldvcmtmbG93Q29udGV4dCgnZ2V0Q3VycmVudERldGFpbHMoKSBtYXkgb25seSBiZSB1c2VkIGZyb20gYSBXb3JrZmxvdyBFeGVjdXRpb24uJyk7XG4gIHJldHVybiBhY3RpdmF0b3IuY3VycmVudERldGFpbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDdXJyZW50RGV0YWlscyhkZXRhaWxzOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZhdG9yID0gYXNzZXJ0SW5Xb3JrZmxvd0NvbnRleHQoJ2dldEN1cnJlbnREZXRhaWxzKCkgbWF5IG9ubHkgYmUgdXNlZCBmcm9tIGEgV29ya2Zsb3cgRXhlY3V0aW9uLicpO1xuICBhY3RpdmF0b3IuY3VycmVudERldGFpbHMgPSBkZXRhaWxzO1xufVxuIiwiaW1wb3J0IHsgaW5qZWN0U3ltYm9sQmFzZWRJbnN0YW5jZU9mIH0gZnJvbSBcIi4uL2ludGVybmFsL3N5bWJvbC1pbnN0YW5jZW9mXCI7XG5pbXBvcnQgdHlwZSB7IEZhaWx1cmUgfSBmcm9tIFwiLi9mYWlsdXJlXCI7XG5cbi8qKlxuICogQSBOZXh1cyBoYW5kbGVyIGVycm9yLlxuICpcbiAqIFRoaXMgZXJyb3IgY2xhc3MgcmVwcmVzZW50cyBhbiBlcnJvciB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgaGFuZGxpbmcgb2YgYVxuICogTmV4dXMgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBjYWxsZXIgYXMgYSBoYW5kbGVyIGVycm9yLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgdHNcbiAqICAgICBpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgYmFkIHJlcXVlc3QgZXJyb3JcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGJhZCByZXF1ZXN0IGVycm9yLCB3aXRoIGEgY2F1c2VcbiAqICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFwiQkFEX1JFUVVFU1RcIiwgXCJJbnZhbGlkIGlucHV0IHByb3ZpZGVkXCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgcmV0cnlhYmxlIGludGVybmFsIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IEhhbmRsZXJFcnJvcihcIklOVEVSTkFMXCIsIFwiRGF0YWJhc2UgdW5hdmFpbGFibGVcIiwgeyByZXRyeWFibGVPdmVycmlkZTogdHJ1ZSB9KTtcbiAqXG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBIYW5kbGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBPbmUgb2YgdGhlIHByZWRlZmluZWQgZXJyb3IgdHlwZXMuXG4gICAqXG4gICAqIElmIHRoZSBjb25zdHJ1Y3RvciByZWNlaXZlZCBhbiB1bmtub3duIHN0cmluZywgdGhpcyB3aWxsIGJlIGBcIlVOS05PV05cImAuXG4gICAqIFVzZSB7QGxpbmsgcmF3RXJyb3JUeXBlfSB0byBhY2Nlc3MgdGhlIG9yaWdpbmFsIHN0cmluZy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBIYW5kbGVyRXJyb3JUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGVycm9yIHR5cGUgc3RyaW5nLlxuICAgKlxuICAgKiBGb3Iga25vd24gdHlwZXMsIHRoaXMgZXF1YWxzIHtAbGluayB0eXBlfS4gRm9yIHVua25vd24gdHlwZXMsIHRoaXMgcHJlc2VydmVzXG4gICAqIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZyB3aGlsZSB7QGxpbmsgdHlwZX0gaXMgc2V0IHRvIGBcIlVOS05PV05cImAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmF3RXJyb3JUeXBlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBzaG91bGQgYmUgY29uc2lkZXJlZCByZXRyeWFibGUuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSByZXRyeSBiZWhhdmlvciBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGVycm9yIHR5cGUuXG4gICAqIEZvciBleGFtcGxlLCBieSBkZWZhdWx0LCBgSU5URVJOQUxgIGlzIHJldHJ5YWJsZSwgYnV0IGBVTkFWQUlMQUJMRWAgaXMgbm9uLXJldHJ5YWJsZS5cbiAgICpcbiAgICogSWYgc3BlY2lmaWVkLCBgcmV0cnlhYmxlT3ZlcnJpZGVgIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZXRyeSBiZWhhdmlvciBkZXRlcm1pbmVkIGJhc2VkIG9uXG4gICAqIHRoZSBlcnJvciB0eXBlLiBVc2Uge0BsaW5rIHJldHJ5YWJsZX0gdG8gZGV0ZXJtaW5lIHRoZSBlZmZlY3RpdmUgcmV0cnkgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHJldHJ5YWJsZX0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlhYmxlT3ZlcnJpZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgSGFuZGxlckVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgZXJyb3IuIE11c3QgYmUgYSBrbm93biB7QGxpbmsgSGFuZGxlckVycm9yVHlwZX0uXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV4dHJhIG9wdGlvbnMgZm9yIHRoZSBlcnJvciwgaW5jbHVkaW5nIHRoZSBjYXVzZSBhbmQgcmV0cnlhYmxlIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlOiBIYW5kbGVyRXJyb3JUeXBlLCBtZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcHRpb25zPzogSGFuZGxlckVycm9yT3B0aW9ucykge1xuICAgIGNvbnN0IGFjdHVhbE1lc3NhZ2UgPSBtZXNzYWdlIHx8IGBIYW5kbGVyIGVycm9yOiAke3R5cGV9YDtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuXG4gICAgaWYgKCFPYmplY3QuaGFzT3duKEhhbmRsZXJFcnJvclR5cGUsIHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIEhhbmRsZXJFcnJvclR5cGU6ICR7dHlwZX1gKTtcbiAgICB9XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnJhd0Vycm9yVHlwZSA9IHR5cGUgPT09IFwiVU5LTk9XTlwiID8gKG9wdGlvbnM/LnJhd0Vycm9yVHlwZSA/PyB0eXBlKSA6IHR5cGU7XG4gICAgdGhpcy5yZXRyeWFibGVPdmVycmlkZSA9IG9wdGlvbnM/LnJldHJ5YWJsZU92ZXJyaWRlO1xuICAgIHRoaXMub3JpZ2luYWxGYWlsdXJlID0gb3B0aW9ucz8ub3JpZ2luYWxGYWlsdXJlO1xuICAgIGlmIChvcHRpb25zPy5zdGFja1RyYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2sgPSBvcHRpb25zLnN0YWNrVHJhY2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlcnJvciBpcyByZXRyeWFibGUuXG4gICAqXG4gICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9IHByb3BlcnR5IGluIHRoYXQgYHJldHJ5YWJsZWAgdGFrZXMgaW50b1xuICAgKiBhY2NvdW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHJlc3VsdGluZyBmcm9tIHRoZSBlcnJvciB0eXBlLCBpZiBubyBvdmVycmlkZSBpcyBwcm92aWRlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgcmV0cnlhYmxlT3ZlcnJpZGV9LlxuICAgKi9cbiAgcHVibGljIGdldCByZXRyeWFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnJldHJ5YWJsZU92ZXJyaWRlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHRoaXMucmV0cnlhYmxlT3ZlcnJpZGU7XG5cbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBcIkJBRF9SRVFVRVNUXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIRU5USUNBVEVEXCI6XG4gICAgICBjYXNlIFwiVU5BVVRIT1JJWkVEXCI6XG4gICAgICBjYXNlIFwiTk9UX0ZPVU5EXCI6XG4gICAgICBjYXNlIFwiTk9UX0lNUExFTUVOVEVEXCI6XG4gICAgICBjYXNlIFwiQ09ORkxJQ1RcIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjYXNlIFwiVU5BVkFJTEFCTEVcIjpcbiAgICAgIGNhc2UgXCJVUFNUUkVBTV9USU1FT1VUXCI6XG4gICAgICBjYXNlIFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCI6XG4gICAgICBjYXNlIFwiSU5URVJOQUxcIjpcbiAgICAgIGNhc2UgXCJSRVFVRVNUX1RJTUVPVVRcIjpcbiAgICAgIGNhc2UgXCJVTktOT1dOXCI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEZvcmNlIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIG1pc3NpbmcgYSBjYXNlXG4gICAgICAgIGNvbnN0IF9ub01pc3NpbmdDYXNlOiBuZXZlciA9IHRoaXMudHlwZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmluamVjdFN5bWJvbEJhc2VkSW5zdGFuY2VPZihIYW5kbGVyRXJyb3IsIFwiSGFuZGxlckVycm9yXCIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBIYW5kbGVyRXJyb3J9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyRXJyb3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVuZGVybHlpbmcgY2F1c2Ugb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgY2F1c2U/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZXJyb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmV0cnlhYmxlLlxuICAgKlxuICAgKiBJZiBub3Qgc2V0LCB0aGUgcmV0cnkgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlcnJvciB0eXBlLlxuICAgKiBGb3IgZXhhbXBsZSwgYnkgZGVmYXVsdCwgYElOVEVSTkFMYCBpcyByZXRyeWFibGUsIGJ1dCBgVU5BVkFJTEFCTEVgIGlzIG5vbi1yZXRyeWFibGUuXG4gICAqL1xuICByZXRyeWFibGVPdmVycmlkZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBlcnJvciB0eXBlIHN0cmluZywgcHJlc2VydmluZyB0aGUgcmF3IHdpcmUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBrbm93biB0eXBlcywgdGhpcyBvcHRpb24gaXMgaWdub3JlZC5cbiAgICogV2hlbiB0aGUgZXJyb3IncyB0eXBlIGlzIHNldCB0byBgXCJVTktOT1dOXCJgLCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCB3aXJlIHN0cmluZy5cbiAgICovXG4gIHJhd0Vycm9yVHlwZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0eXBlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBIYW5kbGVyRXJyb3J9LCBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUgTmV4dXMgc3BlY2lmaWNhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJFcnJvclR5cGUgPSAodHlwZW9mIEhhbmRsZXJFcnJvclR5cGUpW2tleW9mIHR5cGVvZiBIYW5kbGVyRXJyb3JUeXBlXTtcbmV4cG9ydCBjb25zdCBIYW5kbGVyRXJyb3JUeXBlID0ge1xuICAvKipcbiAgICogVGhlIGVycm9yIHR5cGUgaXMgdW5rbm93bi5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOS05PV046IFwiVU5LTk9XTlwiLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlciBjYW5ub3Qgb3Igd2lsbCBub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBkdWUgdG8gYW4gYXBwYXJlbnQgY2xpZW50IGVycm9yLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIEJBRF9SRVFVRVNUOiBcIkJBRF9SRVFVRVNUXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZGlkIG5vdCBzdXBwbHkgdmFsaWQgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgZm9yIHRoaXMgcmVxdWVzdC5cbiAgICpcbiAgICogQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBVTkFVVEhFTlRJQ0FURUQ6IFwiVU5BVVRIRU5USUNBVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24uXG4gICAqXG4gICAqIENsaWVudHMgc2hvdWxkIG5vdCByZXRyeSB0aGlzIHJlcXVlc3QgdW5sZXNzIGFkdmlzZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgVU5BVVRIT1JJWkVEOiBcIlVOQVVUSE9SSVpFRFwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdGVkIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZCBidXQgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgZnV0dXJlLlxuICAgKi9cbiAgTk9UX0ZPVU5EOiBcIk5PVF9GT1VORFwiLFxuXG4gIC8qKlxuICAgKiBSZXR1cm5lZCBieSB0aGUgc2VydmVyIHdoZW4gaXQgaGFzIGdpdmVuIHVwIGhhbmRsaW5nIGEgcmVxdWVzdC4gVGhpcyBtYXkgb2NjdXIgYnkgZW5mb3JjaW5nXG4gICAqIGEgY2xpZW50IHByb3ZpZGVkIGBSZXF1ZXN0LVRpbWVvdXRgIG9yIGZvciBhbnkgYXJiaXRyYXJ5IHJlYXNvbiBzdWNoIGFzIGVuZm9yY2luZyBzb21lXG4gICAqIGNvbmZpZ3VyYWJsZSBsaW1pdC5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFJFUVVFU1RfVElNRU9VVDogXCJSRVFVRVNUX1RJTUVPVVRcIixcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIG1hZGUgZHVlIHRvIGEgY29uZmxpY3QuIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHRyeWluZyB0byBjcmVhdGUgYW5cbiAgICogb3BlcmF0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLlxuICAgKlxuICAgKiBDbGllbnRzIHNob3VsZCBub3QgcmV0cnkgdGhpcyByZXF1ZXN0IHVubGVzcyBhZHZpc2VkIG90aGVyd2lzZS5cbiAgICovXG4gIENPTkZMSUNUOiBcIkNPTkZMSUNUXCIsXG5cbiAgLyoqXG4gICAqIFNvbWUgcmVzb3VyY2UgaGFzIGJlZW4gZXhoYXVzdGVkLCBwZXJoYXBzIGEgcGVyLXVzZXIgcXVvdGEsIG9yIHBlcmhhcHMgdGhlIGVudGlyZSBmaWxlIHN5c3RlbVxuICAgKiBpcyBvdXQgb2Ygc3BhY2UuXG4gICAqXG4gICAqIFN1YnNlcXVlbnQgcmVxdWVzdHMgYnkgdGhlIGNsaWVudCBhcmUgcGVybWlzc2libGUuXG4gICAqL1xuICBSRVNPVVJDRV9FWEhBVVNURUQ6IFwiUkVTT1VSQ0VfRVhIQVVTVEVEXCIsXG5cbiAgLyoqXG4gICAqIEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgSU5URVJOQUw6IFwiSU5URVJOQUxcIixcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBlaXRoZXIgZG9lcyBub3QgcmVjb2duaXplIHRoZSByZXF1ZXN0IG1ldGhvZCwgb3IgaXQgbGFja3MgdGhlIGFiaWxpdHkgdG8gZnVsZmlsbCB0aGVcbiAgICogcmVxdWVzdC4gQ2xpZW50cyBzaG91bGQgbm90IHJldHJ5IHRoaXMgcmVxdWVzdCB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuXG4gICAqL1xuICBOT1RfSU1QTEVNRU5URUQ6IFwiTk9UX0lNUExFTUVOVEVEXCIsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS5cbiAgICpcbiAgICogU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS5cbiAgICovXG4gIFVOQVZBSUxBQkxFOiBcIlVOQVZBSUxBQkxFXCIsXG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgZ2F0ZXdheXMgdG8gcmVwb3J0IHRoYXQgYSByZXF1ZXN0IHRvIGFuIHVwc3RyZWFtIHNlcnZlciBoYXMgdGltZWQgb3V0LlxuICAgKlxuICAgKiBTdWJzZXF1ZW50IHJlcXVlc3RzIGJ5IHRoZSBjbGllbnQgYXJlIHBlcm1pc3NpYmxlLlxuICAgKi9cbiAgVVBTVFJFQU1fVElNRU9VVDogXCJVUFNUUkVBTV9USU1FT1VUXCIsXG59IGFzIGNvbnN0O1xuIiwiZXhwb3J0IHsgdHlwZSBGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZVwiO1xuZXhwb3J0IHsgSGFuZGxlckVycm9yLCBIYW5kbGVyRXJyb3JUeXBlLCB0eXBlIEhhbmRsZXJFcnJvck9wdGlvbnMgfSBmcm9tIFwiLi9oYW5kbGVyLWVycm9yXCI7XG5leHBvcnQgeyB0eXBlIExpbmsgfSBmcm9tIFwiLi9saW5rXCI7XG5leHBvcnQge1xuICBPcGVyYXRpb25FcnJvcixcbiAgdHlwZSBPcGVyYXRpb25FcnJvclN0YXRlLFxuICB0eXBlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWVycm9yXCI7XG4iLCJpbXBvcnQgeyBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YgfSBmcm9tIFwiLi4vaW50ZXJuYWwvc3ltYm9sLWluc3RhbmNlb2ZcIjtcbmltcG9ydCB0eXBlIHsgRmFpbHVyZSB9IGZyb20gXCIuL2ZhaWx1cmVcIjtcblxuLyoqXG4gKiBBIE5leHVzIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBUaGlzIGVycm9yIGNsYXNzIHJlcHJlc2VudHMgdGhlIGFibm9ybWFsIGNvbXBsZXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24sXG4gKiB0aGF0IHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgY2FsbGVyIGFzIGFuIG9wZXJhdGlvbiBlcnJvci5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgICAgaW1wb3J0IHsgT3BlcmF0aW9uRXJyb3IgfSBmcm9tIFwibmV4dXMtcnBjXCI7XG4gKlxuICogICAgIC8vIFRocm93IGEgZmFpbGVkIG9wZXJhdGlvbiBlcnJvclxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIpO1xuICpcbiAqICAgICAvLyBUaHJvdyBhIGZhaWxlZCBvcGVyYXRpb24gZXJyb3IsIHdpdGggYSBjYXVzZVxuICogICAgIHRocm93IG5ldyBPcGVyYXRpb25FcnJvcihcImZhaWxlZFwiLCBcIk5vdCBlbm91Z2ggaW52ZW50b3J5XCIsIHsgY2F1c2UgfSk7XG4gKlxuICogICAgIC8vIFRocm93IGEgY2FuY2VsZWQgb3BlcmF0aW9uIGVycm9yXG4gKiAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkVycm9yKFwiY2FuY2VsZWRcIiwgXCJVc2VyIGNhbmNlbGVkIHRoZSBvcGVyYXRpb25cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFN0YXRlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBlcnJvciB0aGF0IHJlc3VsdGVkIGluIHRoaXMgb3BlcmF0aW9uIGVycm9yLlxuICAgKi9cbiAgZGVjbGFyZSBwdWJsaWMgcmVhZG9ubHkgY2F1c2U6IEVycm9yO1xuXG4gIC8qKlxuICAgKiBTZXQgaWYgdGhpcyBlcnJvciB3YXMgY29uc3RydWN0ZWQgZnJvbSBhIHtAbGluayBGYWlsdXJlfSBvYmplY3QuXG4gICAqXG4gICAqIFByZXNlcnZlcyB0aGUgb3JpZ2luYWwgZmFpbHVyZSBmb3Igcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgd2lyZSBmb3JtYXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3JpZ2luYWxGYWlsdXJlPzogRmFpbHVyZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXh0cmEgb3B0aW9ucyBmb3IgdGhlIGVycm9yLCBlLmcuIHRoZSBjYXVzZS5cbiAgICpcbiAgICogQGV4cGVyaW1lbnRhbFxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgc3RhdGU6IE9wZXJhdGlvbkVycm9yU3RhdGUsXG4gICAgbWVzc2FnZT86IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zPzogT3BlcmF0aW9uRXJyb3JPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBkZWZhdWx0TWVzc2FnZSA9IHN0YXRlID09PSBcImNhbmNlbGVkXCIgPyBgT3BlcmF0aW9uIGNhbmNlbGVkYCA6IGBPcGVyYXRpb24gZmFpbGVkYDtcbiAgICBjb25zdCBhY3R1YWxNZXNzYWdlID0gbWVzc2FnZSB8fCBkZWZhdWx0TWVzc2FnZTtcblxuICAgIHN1cGVyKGFjdHVhbE1lc3NhZ2UsIHsgY2F1c2U6IG9wdGlvbnM/LmNhdXNlIH0pO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLm9yaWdpbmFsRmFpbHVyZSA9IG9wdGlvbnM/Lm9yaWdpbmFsRmFpbHVyZTtcbiAgICBpZiAob3B0aW9ucz8uc3RhY2tUcmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YWNrID0gb3B0aW9ucy5zdGFja1RyYWNlO1xuICAgIH1cbiAgfVxufVxuXG5pbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2YoT3BlcmF0aW9uRXJyb3IsIFwiT3BlcmF0aW9uRXJyb3JcIik7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBPcGVyYXRpb25FcnJvcn0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQGlubGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkVycm9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIGNhdXNlPzogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHN0YWNrIHRyYWNlIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgdGhpcyBvdmVycmlkZXMgdGhlIG5hdGl2ZSBgc3RhY2tgIHByb3BlcnR5IG9uIHRoZSBlcnJvci5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcmVtb3RlIHN0YWNrIHRyYWNlcyByZWNlaXZlZCBvdmVyIHRoZSB3aXJlLFxuICAgKiB3aGljaCBtYXkgb3JpZ2luYXRlIGZyb20gYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgcnVudGltZS5cbiAgICovXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHtAbGluayBGYWlsdXJlfSBvYmplY3QgZnJvbSB3aGljaCB0aGlzIGVycm9yIHdhcyBjb25zdHJ1Y3RlZC5cbiAgICpcbiAgICogUHJlc2VydmVzIHRoZSBvcmlnaW5hbCBmYWlsdXJlIGZvciByb3VuZC10cmlwcGluZyB0aHJvdWdoIHRoZSB3aXJlIGZvcm1hdC5cbiAgICovXG4gIG9yaWdpbmFsRmFpbHVyZT86IEZhaWx1cmU7XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHN0YXRlIG9mIGFuIG9wZXJhdGlvbiB0aGF0IGRpZCBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqIEBpbmxpbmVcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uRXJyb3JTdGF0ZSA9IFwiZmFpbGVkXCIgfCBcImNhbmNlbGVkXCI7XG4iLCJleHBvcnQge1xuICB0eXBlIE9wZXJhdGlvbkNvbnRleHQsXG4gIHR5cGUgU3RhcnRPcGVyYXRpb25Db250ZXh0LFxuICB0eXBlIENhbmNlbE9wZXJhdGlvbkNvbnRleHQsXG59IGZyb20gXCIuL29wZXJhdGlvbi1jb250ZXh0XCI7XG5cbmV4cG9ydCB7XG4gIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdCxcbiAgdHlwZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jLFxuICB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jLFxufSBmcm9tIFwiLi9zdGFydC1vcGVyYXRpb24tcmVzdWx0XCI7XG5cbmV4cG9ydCB7XG4gIC8vXG4gIHR5cGUgT3BlcmF0aW9uSGFuZGxlcixcbiAgdHlwZSBTeW5jT3BlcmF0aW9uSGFuZGxlcixcbn0gZnJvbSBcIi4vb3BlcmF0aW9uLWhhbmRsZXJcIjtcblxuZXhwb3J0IHtcbiAgU2VydmljZUhhbmRsZXIsXG4gIHNlcnZpY2VIYW5kbGVyLFxuICB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3IsXG4gIHR5cGUgU2VydmljZUhhbmRsZXJGb3IsXG59IGZyb20gXCIuL3NlcnZpY2UtaGFuZGxlclwiO1xuIiwiaW1wb3J0IHsgSGFuZGxlckVycm9yIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0IH0gZnJvbSBcIi4vc3RhcnQtb3BlcmF0aW9uLXJlc3VsdFwiO1xuaW1wb3J0IHsgQ2FuY2VsT3BlcmF0aW9uQ29udGV4dCwgU3RhcnRPcGVyYXRpb25Db250ZXh0IH0gZnJvbSBcIi4vb3BlcmF0aW9uLWNvbnRleHRcIjtcbmltcG9ydCB7XG4gIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIE9wZXJhdGlvbklucHV0LFxuICBPcGVyYXRpb25LZXksXG4gIE9wZXJhdGlvbk1hcCxcbiAgT3BlcmF0aW9uT3V0cHV0LFxufSBmcm9tIFwiLi4vc2VydmljZVwiO1xuXG4vKipcbiAqIEEgaGFuZGxlciBmb3IgYSBOZXh1cyBvcGVyYXRpb24uXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgTmV4dXMgc2VydmljZSBpbXBsZW1lbnRvcnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICAvKipcbiAgICogSGFuZGxlIHJlcXVlc3RzIHRvIHN0YXJ0IGFuIG9wZXJhdGlvbi5cbiAgICpcbiAgICogUmV0dXJuIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jfSB0byByZXNwb25kIHN1Y2Nlc3NmdWxseSBpbmxpbmUsIG9yXG4gICAqIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luY30gdG8gaW5kaWNhdGUgdGhhdCBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHdhcyBzdGFydGVkLlxuICAgKiBUaHJvdyBhbiB7QGxpbmsgT3BlcmF0aW9uRXJyb3J9IHRvIGluZGljYXRlIHRoYXQgYW4gb3BlcmF0aW9uIGNvbXBsZXRlZCBhcyBmYWlsZWQgb3IgY2FuY2VsZWQuXG4gICAqL1xuICBzdGFydChjdHg6IFN0YXJ0T3BlcmF0aW9uQ29udGV4dCwgaW5wdXQ6IEkpOiBQcm9taXNlPEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxPPj47XG5cbiAgLyoqXG4gICAqIEhhbmRsZSByZXF1ZXN0cyB0byBjYW5jZWwgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQ2FuY2VsYXRpb24gb2YgYSBOZXh1cyBvcGVyYXRpb24gaXM6XG4gICAqIDEuIF9hc3luY2hyb25vdXNfIC0gcmV0dXJuaW5nIGZyb20gdGhpcyBtZXRob2Qgb25seSBjb25maXJtcyB0aGF0IGNhbmNlbGF0aW9uIHdhcyBub3RpZmllZDtcbiAgICogICAgdGhlIGltcGxlbWVudGF0aW9uIG1heSBob3dldmVyIGNob29zZSB0byBwcm9jZXNzIHRoZSBjYW5jZWxsYXRpb24gYXQgYSBsYXRlciB0aW1lLCBvciB0b1xuICAgKiAgICBpZ25vcmUgaXQgZW50aXJlbHkuXG4gICAqIDIuIF9pZGVtcG90ZW50XyAtIGltcGxlbWVudGF0aW9ucyBtdXN0IGlnbm9yZSBkdXBsaWNhdGUgY2FuY2VsYXRpb25zIGZvciB0aGUgc2FtZSBvcGVyYXRpb24uXG4gICAqL1xuICBjYW5jZWwoY3R4OiBDYW5jZWxPcGVyYXRpb25Db250ZXh0LCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHNob3J0Y3V0IGZvciBkZWZpbmluZyBhbiBvcGVyYXRpb24gaGFuZGxlciB0aGF0IG9ubHkgaW1wbGVtZW50cyB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9XG4gKiBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm5zIGEge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmN9LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gPSAoY3R4OiBTdGFydE9wZXJhdGlvbkNvbnRleHQsIGlucHV0OiBJKSA9PiBQcm9taXNlPE8+O1xuXG4vKipcbiAqIENvbXBpbGVzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGludG8gYSB7QGxpbmsgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyfS4gQSBjb21waWxlZCBvcGVyYXRpb25cbiAqIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYSBmdWxsLWZsZWRnZWQgb3BlcmF0aW9uXG4gKiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVPcGVyYXRpb25IYW5kbGVyPEksIE8+KFxuICBkZWZpbml0aW9uOiBPcGVyYXRpb25EZWZpbml0aW9uPEksIE8+LFxuICBoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPEksIE8+IHwgU3luY09wZXJhdGlvbkhhbmRsZXI8SSwgTz4gfCB1bmRlZmluZWQsXG4pOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXI8SSwgTz4ge1xuICBpZiAoaGFuZGxlciA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIGBObyBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtkZWZpbml0aW9uLm5hbWV9JyAoZXhwZWN0ZWQgcHJvcGVydHkgbmFtZSAnJHtkZWZpbml0aW9uLm5hbWV9JylgLFxuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIE9wZXJhdGlvbiBoYW5kbGVyIGlzIGRlY2xhcmVkIHVzaW5nIHRoZSBzaG9ydGN1dCBzeW50YXguIFdyYXAgaXQgaW50byBhIGZ1bGwtZmxlZGdlZCBoYW5kbGVyLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZpbml0aW9uLFxuXG4gICAgICBzdGFydDogYXN5bmMgKGN0eCwgaW5wdXQpID0+IHtcbiAgICAgICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKGF3YWl0IGhhbmRsZXIoY3R4LCBpbnB1dCkpO1xuICAgICAgfSxcbiAgICAgIGNhbmNlbDogbm90SW1wbGVtZW50ZWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5zdGFydCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSGFuZGxlciBmb3Igb3BlcmF0aW9uICcke2RlZmluaXRpb24ubmFtZX0nIGhhcyBubyBzdGFydCBtZXRob2RgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZGVmaW5pdGlvbixcblxuICAgIC8vIERlZmVuc2l2ZWx5IGVuc3VyZSB0aGF0IHRoZSBoYW5kbGVyIGhhcyBhbGwgdGhlIHJlcXVpcmVkIG1ldGhvZHMsXG4gICAgLy8gZGVmYXVsdGluZyB0byB0aHJvd2luZyBhIG5vdCBpbXBsZW1lbnRlZCBlcnJvciBpZiBzb21lIG1ldGhvZHMgYXJlIG1pc3NpbmcuXG4gICAgc3RhcnQ6IGhhbmRsZXIuc3RhcnQuYmluZChoYW5kbGVyKSxcbiAgICBjYW5jZWw6IGhhbmRsZXIuY2FuY2VsPy5iaW5kKGhhbmRsZXIpID8/IG5vdEltcGxlbWVudGVkLFxuICB9O1xufVxuXG4vKipcbiAqIEEgY29tcGlsZWQgb3BlcmF0aW9uIGhhbmRsZXIgaXMgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaXMgYm90aCBhbiBvcGVyYXRpb24gZGVmaW5pdGlvbiBhbmQgYVxuICogZnVsbC1mbGVkZ2VkIG9wZXJhdGlvbiBoYW5kbGVyIGZvciB0aGF0IG9wZXJhdGlvbi5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPEksIE8+ID0gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiAmIE9wZXJhdGlvbkhhbmRsZXI8SSwgTz47XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBpbGVkT3BlcmF0aW9uSGFuZGxlckZvcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+ID0gQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyPFxuICBPcGVyYXRpb25JbnB1dDxPcHNbT3BlcmF0aW9uS2V5PE9wcz5dPixcbiAgT3BlcmF0aW9uT3V0cHV0PE9wc1tPcGVyYXRpb25LZXk8T3BzPl0+XG4+O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBub3RJbXBsZW1lbnRlZCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBIYW5kbGVyRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIiwgXCJOb3QgaW1wbGVtZW50ZWRcIik7XG59XG4iLCJpbXBvcnQgeyBIYW5kbGVyRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25EZWZpbml0aW9uLCBPcGVyYXRpb25LZXksIE9wZXJhdGlvbk1hcCwgU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi4vc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yLFxuICBjb21waWxlT3BlcmF0aW9uSGFuZGxlcixcbiAgT3BlcmF0aW9uSGFuZGxlcixcbiAgU3luY09wZXJhdGlvbkhhbmRsZXIsXG59IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCI7XG5cbi8qKlxuICogQSBOZXh1cyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLCB0aGF0IHByb3ZpZGVzIGhhbmRsZXJzIGZvciBlYWNoIG9mIGl0cyBvcGVyYXRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VIYW5kbGVyPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICAvKipcbiAgICogQnVpbGQgYSBgU2VydmljZUhhbmRsZXJgIGZyb20gYSBzZXJ2aWNlIGRlZmluaXRpb24gYW5kIGEgY29sbGVjdGlvbiBvZiBvcGVyYXRpb24gaGFuZGxlcnMuXG4gICAqXG4gICAqIFRoZXJlIG11c3QgYmUgYW4gb3BlcmF0aW9uIGhhbmRsZXIgZm9yIGV2ZXJ5IG9wZXJhdGlvbiBpbiB0aGUgc2VydmljZSBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVycyBUaGUgY29sbGVjdGlvbiBvZiBoYW5kbGVyc1xuICAgKiBAcmV0dXJucyBUaGUgY29tcGlsZWQgc2VydmljZSBoYW5kbGVyXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8T3BzIGV4dGVuZHMgT3BlcmF0aW9uTWFwPihcbiAgICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIGhhbmRsZXJzOiBTZXJ2aWNlSGFuZGxlckZvcjxPcHM+LFxuICApOiBTZXJ2aWNlSGFuZGxlcjxPcHM+IHtcbiAgICBjb25zdCBvcGVyYXRpb25zID0gbmV3IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgZGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VydmljZS5vcGVyYXRpb25zKSkge1xuICAgICAgY29uc3QgY29tcGlsZWRPcEhhbmRsZXIgPSBjb21waWxlT3BlcmF0aW9uSGFuZGxlcihkZWZpbml0aW9uLCBoYW5kbGVyc1twcm9wTmFtZV0pO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IGNvbXBpbGVkT3BIYW5kbGVyLm5hbWUgYXMgT3BlcmF0aW9uS2V5PE9wcz47XG5cbiAgICAgIGlmIChvcGVyYXRpb25zLmhhcyhvcGVyYXRpb25OYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBPcGVyYXRpb24gd2l0aCBuYW1lICcke29wZXJhdGlvbk5hbWV9JyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNlcnZpY2UgJyR7c2VydmljZS5uYW1lfSdgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcGVyYXRpb25zLnNldChvcGVyYXRpb25OYW1lLCBjb21waWxlZE9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlSGFuZGxlcihzZXJ2aWNlLCBoYW5kbGVycywgb3BlcmF0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBkZWZpbml0aW9uOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICAgIHB1YmxpYyByZWFkb25seSBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wZXJhdGlvbnNNYXA6IE1hcDxPcGVyYXRpb25LZXk8T3BzPiwgQ29tcGlsZWRPcGVyYXRpb25IYW5kbGVyRm9yPE9wcz4+LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlZmluaXRpb24gYW5kIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZVxuICAgKi9cbiAgcHVibGljIGdldE9wZXJhdGlvbkhhbmRsZXI8SyBleHRlbmRzIE9wZXJhdGlvbktleTxPcHM+PihcbiAgICBvcGVyYXRpb25OYW1lOiBLLFxuICApOiBDb21waWxlZE9wZXJhdGlvbkhhbmRsZXJGb3I8T3BzPiB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLm9wZXJhdGlvbnNNYXAuZ2V0KG9wZXJhdGlvbk5hbWUpO1xuICAgIGlmIChlbnRyeSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSGFuZGxlckVycm9yKFxuICAgICAgICBcIk5PVF9GT1VORFwiLFxuICAgICAgICBgT3BlcmF0aW9uIGhhbmRsZXIgbm90IHJlZ2lzdGVyZWQgZm9yIG9wZXJhdGlvbiAnJHtvcGVyYXRpb25OYW1lfScgaW4gc2VydmljZSAnJHt0aGlzLmRlZmluaXRpb24ubmFtZX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBzZXJ2aWNlIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlSGFuZGxlcjxPcHMgZXh0ZW5kcyBPcGVyYXRpb25NYXA+KFxuICBzZXJ2aWNlOiBTZXJ2aWNlRGVmaW5pdGlvbjxPcHM+LFxuICBoYW5kbGVyczogU2VydmljZUhhbmRsZXJGb3I8T3BzPixcbik6IFNlcnZpY2VIYW5kbGVyPE9wcz4ge1xuICByZXR1cm4gU2VydmljZUhhbmRsZXIuYnVpbGQoc2VydmljZSwgaGFuZGxlcnMpO1xufVxuXG4vKipcbiAqIEEgdHlwZSB0aGF0IGRlZmluZXMgYSBoYW5kbGVyIGZvciBhIGdpdmVuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbkhhbmRsZXJGb3I8VD4gPVxuICBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uSGFuZGxlcjxJLCBPPiB8IFN5bmNPcGVyYXRpb25IYW5kbGVyPEksIE8+XG4gICAgOiBuZXZlcjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBoYW5kbGVycyBmb3IgYSBnaXZlbiBjb2xsZWN0aW9uIG9mIG9wZXJhdGlvbiBpbnRlcmZhY2VzLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgU2VydmljZUhhbmRsZXJGb3I8VCBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBPcGVyYXRpb25IYW5kbGVyRm9yPFRbS10+O1xufTtcbiIsIi8qKiBAaW1wb3J0IHsgT3BlcmF0aW9uSGFuZGxlciB9IGZyb20gXCIuL29wZXJhdGlvbi1oYW5kbGVyXCIgKi9cblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBzeW1ib2wsIHVzZWQgdG8gcHJldmVudCBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlcy5cbiAqXG4gKiBAaGlkZGVuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgaXNIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW1ib2wgPSBTeW1ib2woXCJfX25leHVzX2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0XCIpO1xuXG4vKipcbiAqIFRoZSByZXR1cm4gdHlwZSBmcm9tIHRoZSB7QGxpbmsgT3BlcmF0aW9uSGFuZGxlci5zdGFydH0gbWV0aG9kLlxuICpcbiAqIFVzZSBlaXRoZXIge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jfSBvciB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LmFzeW5jfVxuICogdG8gY3JlYXRlIGEgcmVzdWx0IG9iamVjdC4gRG8gbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBkaXJlY3RseS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdDxUID0gdW5rbm93bj4gPVxuICB8IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bmM8VD5cbiAgfCBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRBc3luYztcblxuLyoqXG4gKiBUaGUgcmV0dXJuIHR5cGUgZnJvbSB0aGUge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuc3RhcnR9IG1ldGhvZC5cbiAqXG4gKiBVc2UgZWl0aGVyIHtAbGluayBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuc3luY30gb3Ige0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY31cbiAqIHRvIGNyZWF0ZSBhIHJlc3VsdCBvYmplY3QuIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY29uc3QgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0ID0ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgcmVzdWx0IHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGFjY2VwdGVkIGFuZCB3aWxsIGNvbXBsZXRlIGFzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgYXN5bmModG9rZW46IHN0cmluZyk6IEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdEFzeW5jIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogdHJ1ZSxcbiAgICAgIHRva2VuLFxuICAgICAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZXN1bHQgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHN5bmM8VD4odmFsdWU6IFQpOiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNBc3luYzogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICAgIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWUsXG4gICAgfTtcbiAgfSxcblxuICBbU3ltYm9sLmhhc0luc3RhbmNlXTogZnVuY3Rpb24gKHRoaXM6IGFueSwgdmFsdWU6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAodmFsdWUgYXMgYW55KVtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF0gPT09IHRydWVcbiAgICApO1xuICB9LFxufTtcblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIFVzZSB7QGxpbmsgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0LnN5bmN9IHRvIGNyZWF0ZSBhIHN5bmMgcmVzdWx0IG9iamVjdC5cbiAqIERvIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICAgcmV0dXJuIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5zeW5jKDQyKTtcbiAqIGBgYFxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHRTeW5jPFQgPSB1bmtub3duPiB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN5bmNocm9ub3VzbHkgKGZhbHNlKSBvciB3aWxsIGNvbXBsZXRlXG4gICAqIGFzeW5jaHJvbm91c2x5ICh0cnVlKS5cbiAgICovXG4gIGlzQXN5bmM6IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICB2YWx1ZTogVDtcblxuICAvKipcbiAgICogUHJldmVudHMgZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAaGlkZGVuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgW2lzSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0U3ltYm9sXTogdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCB0aGF0IGluZGljYXRlcyB0aGF0IGFuIG9wZXJhdGlvbiBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgd2lsbCBjb21wbGV0ZSBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBVc2Uge0BsaW5rIEhhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdC5hc3luY30gdG8gY3JlYXRlIGFuIGFzeW5jIHJlc3VsdCBvYmplY3QuXG4gKiBEbyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGRpcmVjdGx5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgIHJldHVybiBIYW5kbGVyU3RhcnRPcGVyYXRpb25SZXN1bHQuYXN5bmMoXCJ1bmlxdWUgdG9rZW5cIik7XG4gKiBgYGBcbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclN0YXJ0T3BlcmF0aW9uUmVzdWx0QXN5bmMge1xuICAvKipcbiAgICogSW5kaWNhdGUgd2hldGhlciB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzeW5jaHJvbm91c2x5IChmYWxzZSkgb3Igd2lsbCBjb21wbGV0ZVxuICAgKiBhc3luY2hyb25vdXNseSAodHJ1ZSkuXG4gICAqL1xuICBpc0FzeW5jOiB0cnVlO1xuXG4gIC8qKlxuICAgKiBBIHRva2VuIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gaW4gZm9sbG93dXAgaGFuZGxlciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuZ2V0UmVzdWx0fVxuICAgKiBhbmQge0BsaW5rIE9wZXJhdGlvbkhhbmRsZXIuY2FuY2VsfS5cbiAgICovXG4gIHRva2VuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByZXZlbnRzIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS5cbiAgICpcbiAgICogQGhpZGRlblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFtpc0hhbmRsZXJTdGFydE9wZXJhdGlvblJlc3VsdFN5bWJvbF06IHRydWU7XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb21tb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2hhbmRsZXJcIjtcbiIsIi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgYnkgbWFwcGluZyBhbGwgc3RyaW5nIHByb3BlcnRpZXMgKGtleXMgYW5kIHZhbHVlcykgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0XG4gKiB0aHJvdWdoIGEgbWFwcGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgc291cmNlIG9iamVjdCwgd2hvc2UgcHJvcGVydGllcyB3aWxsIGJlIG1hcHBlZC5cbiAqIEBwYXJhbSBmbiAtIFRoZSBtYXBwZXIgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IHdpdGggdGhlIHByb3BlcnRpZXMgbWFwcGVkIHRvIHRoZSBuZXcgdHlwZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEtleVZhbHVlczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiwgVT4oXG4gIG9iajogVCxcbiAgZm46IChrZXk6IGtleW9mIFQgJiBzdHJpbmcsIHZhbHVlOiBUW2tleW9mIFQgJiBzdHJpbmddKSA9PiBVLFxuKTogUmVjb3JkPGtleW9mIFQsIFU+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhvYmopLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBmbihrZXksIHZhbHVlKV0pLFxuICApIGFzIFJlY29yZDxrZXlvZiBULCBVPjtcbn1cbiIsIi8qKlxuICogSW5qZWN0IGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIG9uIHRoZSBnaXZlbiBjbGFzcywgdGhhdCB3b3JrcyBjb3JyZWN0bHkgYWNyb3NzIGV4ZWN1dGlvbiBjb250ZXh0cy5cbiAqXG4gKiAjIyMgRGV0YWlscyAjIyNcbiAqXG4gKiBBY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQncyBzcGVjLCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBKYXZhU2NyaXB0J3MgYHggaW5zdGFuY2VvZiBZYCBvcGVyYXRvciBpcyB0byB3YWxrIHVwIHRoZVxuICogcHJvdG90eXBlIGNoYWluIG9mIG9iamVjdCAneCcsIGNoZWNraW5nIGlmIGFueSBjb25zdHJ1Y3RvciBpbiB0aGF0IGhpZXJhcmNoeSBpcyBfZXhhY3RseSB0aGUgc2FtZSBvYmplY3RfIGFzIHRoZVxuICogY29uc3RydWN0b3IgZnVuY3Rpb24gJ1knLlxuICpcbiAqIFVuZm9ydHVuYXRlbHksIGl0IGhhcHBlbnMgaW4gdmFyaW91cyBzaXR1YXRpb25zIHRoYXQgZGlmZmVyZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIG9iamVjdHMgZ2V0IGNyZWF0ZWQgZm9yIHdoYXRcbiAqIGFwcGVhcnMgdG8gYmUgdGhlIHZlcnkgc2FtZSBjbGFzcy4gVGhpcyBsZWFkcyB0byBzdXJwcmlzaW5nIGJlaGF2aW9yIHdoZXJlIGBpbnN0YW5jZW9mYCByZXR1cm5zIGZhbHNlIHRob3VnaCBpdCBpc1xuICoga25vd24gdGhhdCB0aGUgb2JqZWN0IGlzIGluZGVlZCBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLiBPbmUgcGFydGljdWxhciBjYXNlIHdoZXJlIHRoaXMgaGFwcGVucyBpcyB3aGVuIGNvbnN0cnVjdG9yXG4gKiAnWScgYmVsb25ncyB0byBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoZSBjb25zdHVjdG9yIHdpdGggd2hpY2ggJ3gnIHdhcyBpbnN0YW50aWF0ZWQuIEFub3RoZXIgY2FzZSBpcyB3aGVuIHR3byBjb3BpZXNcbiAqIG9mIHRoZSBzYW1lIGxpYnJhcnkgZ2V0cyBsb2FkZWQgaW4gdGhlIHNhbWUgcmVhbG0uXG4gKlxuICogSW4gcHJhY3RpY2UsIHRoaXMgdGVuZHMgdG8gY2F1c2UgaXNzdWVzIHdoZW4gY3Jvc3NpbmcgdGhlIHdvcmtmbG93LXNhbmRib3hpbmcgYm91bmRhcnkgKHNpbmNlIE5vZGUncyB2bSBtb2R1bGVcbiAqIHJlYWxseSBjcmVhdGVzIG5ldyBleGVjdXRpb24gcmVhbG1zKSwgYXMgd2VsbCBhcyB3aGVuIHJ1bm5pbmcgdGVzdHMgdXNpbmcgSmVzdCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qZXN0anMvamVzdC9pc3N1ZXMvMjU0OVxuICogZm9yIHNvbWUgZGV0YWlscyBvbiB0aGF0IG9uZSkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpbmplY3RzIGEgY3VzdG9tICdpbnN0YW5jZW9mJyBoYW5kbGVyIGludG8gdGhlIHByb3RvdHlwZSBvZiAnY2xhenonLCB3aGljaCBpcyBib3RoIGNyb3NzLXJlYWxtIHNhZmUgYW5kXG4gKiBjcm9zcy1jb3BpZXMtb2YtdGhlLXNhbWUtbGliIHNhZmUuIEl0IHdvcmtzIGJ5IGFkZGluZyBhIHNwZWNpYWwgc3ltYm9sIHByb3BlcnR5IHRvIHRoZSBwcm90b3R5cGUgb2YgJ2NsYXp6JywgYW5kIHRoZW5cbiAqIGNoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhhdCBzeW1ib2wuXG4gKlxuICogQGludGVybmFsXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTeW1ib2xCYXNlZEluc3RhbmNlT2Y8RT4oY2xheno6IENsYXNzPEU+LCBtYXJrZXJOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gSXQgbWF5IHNlZW0gcmVkdW5kYW50IHRvIGhhdmUgYW4gZXhwbGljaXQgbWFya2VyTmFtZSBhcmd1bWVudCBoZXJlLiBDYW4ndCB3ZSBzaW1wbHkgdXNlIHRoZSBjbGFzc1xuICAvLyBmdW5jdGlvbiBuYW1lIGZvciB0aGF0PyBVbmZvcnR1bmF0ZWx5LCBubywgYXMgdGhlIGNsYXNzIG5hbWUgbWF5IGdldCBtYW5nbGVkIGlmIHRoZSBmaWxlIGdldHMgbWluaWZpZWQuXG4gIGNvbnN0IG1hcmtlciA9IFN5bWJvbC5mb3IoYF9fbmV4dXNfaXMke21hcmtlck5hbWV9YCk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsYXp6LnByb3RvdHlwZSwgXCJuYW1lXCIsIHsgdmFsdWU6IG1hcmtlck5hbWUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6ei5wcm90b3R5cGUsIG1hcmtlciwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbGF6eiwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICh0aGlzOiBhbnksIHZhbHVlOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgIGlmICh0aGlzID09PSBjbGF6eikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBhbnkpW21hcmtlcl0gPT09IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAndGhpcycgbXVzdCBiZSBhIF9zdWJjbGFzc18gb2YgY2xhenogdGhhdCBkb2Vzbid0IHJlZGVmaW5lZCBbU3ltYm9sLmhhc0luc3RhbmNlXSwgc28gdGhhdCBpdCBpbmhlcml0ZWRcbiAgICAgICAgLy8gZnJvbSBjbGF6eidzIFtTeW1ib2wuaGFzSW5zdGFuY2VdLiBJZiB3ZSBkb24ndCBoYW5kbGUgdGhpcyBwYXJ0aWN1bGFyIHNpdHVhdGlvbiwgdGhlblxuICAgICAgICAvLyBgeCBpbnN0YW5jZW9mIFN1YmNsYXNzT2ZQYXJlbnRgIHdvdWxkIHJldHVybiB0cnVlIGZvciBhbnkgaW5zdGFuY2Ugb2YgJ1BhcmVudCcsIHdoaWNoIGlzIGNsZWFybHkgd3JvbmcuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElkZWFsbHksIGl0J2QgYmUgcHJlZmVyYWJsZSB0byBhdm9pZCB0aGlzIGNhc2UgZW50aXJlbHksIGJ5IG1ha2luZyBzdXJlIHRoYXQgYWxsIHN1YmNsYXNzZXMgb2YgJ2NsYXp6J1xuICAgICAgICAvLyByZWRlZmluZSBbU3ltYm9sLmhhc0luc3RhbmNlXSwgYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdC4gV2UgdGhlcmVmb3JlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlb2ZcbiAgICAgICAgLy8gYmVoYXZpb3IgKHdoaWNoIGlzIE5PVCBjcm9zcy1yZWFsbSBzYWZlKS5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodmFsdWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFR5cGUgZGVmaW5pdGlvbiBmb3IgYSBjbGFzcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFzczxFPiB7XG4gIG5ldyAoLi4uYXJnczogYW55W10pOiBFO1xuICBwcm90b3R5cGU6IEU7XG59XG4iLCJpbXBvcnQgeyBtYXBLZXlWYWx1ZXMgfSBmcm9tIFwiLi4vaW50ZXJuYWwvb2JqZWN0LXV0aWxzXCI7XG5pbXBvcnQgeyBTaW1wbGlmeSB9IGZyb20gXCIuLi9pbnRlcm5hbC90eXBlc1wiO1xuaW1wb3J0IHsgaW5wdXRCcmFuZCwgb3V0cHV0QnJhbmQsIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24gfSBmcm9tIFwiLi9zZXJ2aWNlLWRlZmluaXRpb25cIjtcbmltcG9ydCB7IE9wZXJhdGlvbkRlZmluaXRpb24sIFNlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSBcIi4vc2VydmljZS1kZWZpbml0aW9uXCI7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgc2VydmljZSBkZWZpbml0aW9uIGZvciBhIGNvbGxlY3Rpb24gb2Ygb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlPE9wcyBleHRlbmRzIFBhcnRpYWxPcGVyYXRpb25NYXA+KFxuICBuYW1lOiBzdHJpbmcsXG4gIG9wZXJhdGlvbnM6IE9wcyxcbik6IFNlcnZpY2VEZWZpbml0aW9uPFNpbXBsaWZ5PE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsPE9wcz4+PiB7XG4gIGNvbnN0IHNlcnZpY2UgPSB7XG4gICAgbmFtZSxcbiAgICBvcGVyYXRpb25zOiBtYXBLZXlWYWx1ZXMob3BlcmF0aW9ucywgKGtleSwgb3A6IFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+KSA9PiAoe1xuICAgICAgLi4ub3AsXG4gICAgICBuYW1lOiBvcC5uYW1lIHx8IGtleSxcbiAgICB9KSksXG4gIH0gYXMgU2VydmljZURlZmluaXRpb248T3BlcmF0aW9uTWFwRnJvbVBhcnRpYWw8T3BzPj47XG5cbiAgdmFsaWRhdGVTZXJ2aWNlRGVmaW5pdGlvbihzZXJ2aWNlKTtcbiAgcmV0dXJuIHNlcnZpY2U7XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIG9wZXJhdGlvbiBkZWZpbml0aW9uIGFzIHBhcnQgb2YgYSBzZXJ2aWNlIGNvbnRyYWN0LlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZXJhdGlvbjxJLCBPPihvcD86IE9wZXJhdGlvbk9wdGlvbnM8SSwgTz4pOiBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+IHtcbiAgcmV0dXJuIHsgLi4ub3AgfSBhcyBQYXJ0aWFsT3BlcmF0aW9uPEksIE8+O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgb3BlcmF0aW9ufSBmdW5jdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uT3B0aW9uczxfSSwgX08+IHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG5hbWVkIGNvbGxlY3Rpb24gb2YgcGFydGlhbCBvcGVyYXRpb24gaGFuZGxlcnMuIElucHV0IGZvciB0aGUge0BsaW5rIHNlcnZpY2V9IGZ1bmN0aW9uLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgUGFydGlhbE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIFBhcnRpYWxPcGVyYXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCB0cmFuc2Zvcm1zIGEge0BsaW5rIFBhcnRpYWxPcGVyYXRpb25NYXB9IGludG8gYW4ge0BsaW5rIE9wZXJhdGlvbk1hcH0uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NYXBGcm9tUGFydGlhbDxUIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbk1hcD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBUW0tdIGV4dGVuZHMgUGFydGlhbE9wZXJhdGlvbjxpbmZlciBJLCBpbmZlciBPPlxuICAgID8gT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPlxuICAgIDogbmV2ZXI7XG59O1xuXG4vKipcbiAqIEEgcGFydGlhbCB7QGxpbmsgT3BlcmF0aW9uRGVmaW5pdGlvbn0gdGhhdCBpcyB1c2VkIHRvIGRlZmluZSBhbiBvcGVyYXRpb24gaW4gYSB7QGxpbmsgU2VydmljZURlZmluaXRpb259LlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQge0BsaW5rIE9wZXJhdGlvbkRlZmluaXRpb259IGlzIHRoYXQgdGhlIG5hbWUgaXMgb3B0aW9uYWwuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpYWxPcGVyYXRpb248SSwgTz4ge1xuICBuYW1lPzogc3RyaW5nO1xuICBbaW5wdXRCcmFuZF06IEk7XG4gIFtvdXRwdXRCcmFuZF06IE87XG59XG4iLCJleHBvcnQge1xuICB0eXBlIFNlcnZpY2VEZWZpbml0aW9uLFxuICB0eXBlIE9wZXJhdGlvbkRlZmluaXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbklucHV0LFxuICB0eXBlIE9wZXJhdGlvbk91dHB1dCxcbiAgdHlwZSBPcGVyYXRpb25LZXksXG59IGZyb20gXCIuL3NlcnZpY2UtZGVmaW5pdGlvblwiO1xuXG5leHBvcnQge1xuICBzZXJ2aWNlLFxuICBvcGVyYXRpb24sXG4gIHR5cGUgT3BlcmF0aW9uT3B0aW9ucyxcbiAgdHlwZSBQYXJ0aWFsT3BlcmF0aW9uTWFwLFxuICB0eXBlIE9wZXJhdGlvbk1hcEZyb21QYXJ0aWFsLFxuICB0eXBlIFBhcnRpYWxPcGVyYXRpb24sXG59IGZyb20gXCIuL2hlbHBlcnNcIjtcbiIsImV4cG9ydCBkZWNsYXJlIGNvbnN0IGlucHV0QnJhbmQ6IHVuaXF1ZSBzeW1ib2w7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBvdXRwdXRCcmFuZDogdW5pcXVlIHN5bWJvbDtcblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgTmV4dXMgc2VydmljZSBjb250cmFjdCwgaW5jbHVkaW5nIGl0cyBuYW1lIGFuZCBvcGVyYXRpb25zLlxuICpcbiAqIENhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIGJ5IHRoZSB7QGxpbmsgc2VydmljZX0gZnVuY3Rpb24uXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VEZWZpbml0aW9uPE9wcyBleHRlbmRzIE9wZXJhdGlvbk1hcCA9IE9wZXJhdGlvbk1hcD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9wZXJhdGlvbnM6IE9wcztcbn1cblxuLyoqXG4gKiBBbiBvcGVyYXRpb24gY29udHJhY3QgdGhhdCBkZXNjcmliZXMgdGhlIG5hbWUsIGFuZCBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uRGVmaW5pdGlvbjxJLCBPPiB7XG4gIG5hbWU6IHN0cmluZztcbiAgW2lucHV0QnJhbmRdOiBJO1xuICBbb3V0cHV0QnJhbmRdOiBPO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgY29sbGVjdGlvbiBvZiBvcGVyYXRpb25zLCBhcyBkZWZpbmVkIGJ5IGEge0BsaW5rIFNlcnZpY2VEZWZpbml0aW9ufS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1hcCA9IFJlY29yZDxzdHJpbmcsIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+PjtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIGlucHV0IHR5cGUgZnJvbSBhbiBvcGVyYXRpb24gaW4gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uSW5wdXQ8VD4gPSBUIGV4dGVuZHMgT3BlcmF0aW9uRGVmaW5pdGlvbjxpbmZlciBJLCBhbnk+ID8gSSA6IGFueTtcblxuLyoqXG4gKiBBIG1hcHBlZCB0eXBlIHRoYXQgZXh0cmFjdHMgdGhlIG91dHB1dCB0eXBlIGZyb20gYW4gb3BlcmF0aW9uIGluIGEgc2VydmljZS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk91dHB1dDxUPiA9IFQgZXh0ZW5kcyBPcGVyYXRpb25EZWZpbml0aW9uPGFueSwgaW5mZXIgTz4gPyBPIDogYW55O1xuXG4vKipcbiAqIEEgbWFwcGVkIHR5cGUgdGhhdCBleHRyYWN0cyBhbGwgb3BlcmF0aW9uIG5hbWVzIGZyb20gYSBzZXJ2aWNlLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uS2V5PFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogVFtLXSBleHRlbmRzIE9wZXJhdGlvbkRlZmluaXRpb248YW55LCBhbnk+ID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUICYgc3RyaW5nXTtcblxuLyoqXG4gKiBDb25maXJtIHRoYXQgYSBzZXJ2aWNlIGRlZmluaXRpb24gaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHNlcnZpY2UgLSBUaGUgc2VydmljZSBkZWZpbml0aW9uIHRvIHZhbGlkYXRlLlxuICpcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gSWYgdGhlIHNlcnZpY2UgZGVmaW5pdGlvbiBpcyBpbnZhbGlkLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VydmljZURlZmluaXRpb24oc2VydmljZTogU2VydmljZURlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBzZXJ2aWNlLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgIXNlcnZpY2UubmFtZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZXJ2aWNlIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmdcIik7XG4gIH1cblxuICBjb25zdCBvcGVyYXRpb25OYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgb3BlcmF0aW9uXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlLm9wZXJhdGlvbnMpKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5uYW1lO1xuICAgIGlmICh0eXBlb2Ygb3BlcmF0aW9uTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCAhb3BlcmF0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgT3BlcmF0aW9uIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcsIGZvciBwcm9wZXJ0eSAnJHtwcm9wTmFtZX0nYCk7XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb25OYW1lcy5oYXMob3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYER1cGxpY2F0ZSBvcGVyYXRpb24gZGVmaW5pdGlvbiBmb3IgbmFtZTogJyR7b3BlcmF0aW9uTmFtZX0nYCk7XG4gICAgfVxuICAgIG9wZXJhdGlvbk5hbWVzLmFkZChvcGVyYXRpb25OYW1lKTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSAnQHNodW1haS90cmFuc2NvZGUvc3JjL3dvcmtmbG93cy90cmFuc2NvZGUnXG4iLCJpbXBvcnQgdHlwZSB7IFdvcmtmbG93VGFzayB9IGZyb20gJ0BzaHVtYWkvZGInXG5pbXBvcnQgeyBleGVjdXRlQWN0aXZpdHksIGdldEFjdGl2aXRpZXMsIFRhc2tRdWV1ZVRyYW5zY29kZSB9IGZyb20gJ0BzaHVtYWkvd29ya2Zsb3ctY29yZSdcblxuaW1wb3J0IHsgQXBwbGljYXRpb25GYWlsdXJlIH0gZnJvbSAnQHRlbXBvcmFsaW8vd29ya2Zsb3cnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2NvZGVNZWRpYSh0YXNrOiBXb3JrZmxvd1Rhc2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSxcbiAgICB1cGRhdGVBc3NldFN0YXR1c0FjdGl2aXR5LFxuICAgIGdldEFzc2V0QWN0aXZpdHksXG4gICAgZ2V0TWVkaWFJbmZvQWN0aXZpdHksXG4gICAgdHJhbnNjb2RlVmlkZW9BY3Rpdml0eSxcbiAgICB0cmFuc2NvZGVBdWRpb0FjdGl2aXR5LFxuICAgIHRyYW5zY29kZUltYWdlQWN0aXZpdHksXG4gICAgZ2VuZXJhdGVTcHJpdGVBY3Rpdml0eSxcbiAgICB1cGRhdGVBc3NldE1lZGlhQWN0aXZpdHksXG4gICAgZ2V0VHJhbnNjb2RlV29ya2VyUXVldWVBY3Rpdml0eSxcbiAgICBkb3dubG9hZE1lZGlhVG9UbXBBY3Rpdml0eSxcbiAgICBjbGVhbnVwVG1wRGlyQWN0aXZpdHksXG4gICAgdGFrZVNjcmVlbnNob3RzQWN0aXZpdHksXG4gICAgb3ZlcmxheUFubm90YXRpb25zQWN0aXZpdHksXG4gICAgY3JlYXRlRW1iZWRkaW5nVGFza0lmRW5hYmxlZEFjdGl2aXR5LFxuICB9ID0gZ2V0QWN0aXZpdGllcygpXG5cbiAgbGV0IHRtcERpcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIGxldCB3b3JrZXJRdWV1ZSA9ICcnXG5cbiAgdHJ5IHtcbiAgICAvLyAwLiBHZXQgV29ya2VyLVNwZWNpZmljIFF1ZXVlIGZvciBUcmFuc2NvZGVcbiAgICB3b3JrZXJRdWV1ZSA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eShUYXNrUXVldWVUcmFuc2NvZGUsIGdldFRyYW5zY29kZVdvcmtlclF1ZXVlQWN0aXZpdHkpXG5cbiAgICAvLyAxLiBVcGRhdGUgc3RhdHVzIHRvIHByb2Nlc3NpbmdcbiAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgdGFza0lkOiB0YXNrLmlkLFxuICAgICAgc3RhdHVzOiAncHJvY2Vzc2luZycsXG4gICAgfSlcblxuICAgIGNvbnN0IHBheWxvYWQgPSB0YXNrLnBheWxvYWRcblxuICAgIGlmIChwYXlsb2FkPy5zY3JlZW5zaG90KSB7XG4gICAgICBjb25zdCBhc3NldCA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgZ2V0QXNzZXRBY3Rpdml0eSwgdGFzay5hc3NldElkKVxuICAgICAgY29uc3Qga2V5ID0gYXNzZXQ/LnN0b3JhZ2VLZXk/LmtleVxuICAgICAgaWYgKCFhc3NldCB8fCAha2V5KSB7XG4gICAgICAgIHRocm93IEFwcGxpY2F0aW9uRmFpbHVyZS5jcmVhdGUoe1xuICAgICAgICAgIG1lc3NhZ2U6ICdBc3NldCBub3QgZm91bmQgb3IgaGFzIG5vIGtleScsXG4gICAgICAgICAgbm9uUmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY3JlZW5zaG90cyA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgdGFrZVNjcmVlbnNob3RzQWN0aXZpdHksIHtcbiAgICAgICAgYXNzZXRLZXk6IGtleSxcbiAgICAgICAgYXNzZXRJZDogYXNzZXQuaWQsXG4gICAgICAgIHN0YXJ0OiBwYXlsb2FkLnNjcmVlbnNob3Quc3RhcnQsXG4gICAgICAgIGVuZDogcGF5bG9hZC5zY3JlZW5zaG90LmVuZCxcbiAgICAgICAgY291bnQ6IHBheWxvYWQuc2NyZWVuc2hvdC5jb3VudCxcbiAgICAgICAgY29tbWVudFRpbWVzdGFtcDogcGF5bG9hZC5zY3JlZW5zaG90LmNvbW1lbnRUaW1lc3RhbXAsXG4gICAgICAgIGFubm90YXRpb25zOiBwYXlsb2FkLnNjcmVlbnNob3QuYW5ub3RhdGlvbnMsXG4gICAgICB9KVxuXG4gICAgICAvLyBVcGRhdGUgVGFzayBTdGF0dXMgdG8gY29tcGxldGVkIHdpdGggb3V0cHV0XG4gICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgICB0YXNrSWQ6IHRhc2suaWQsXG4gICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dDogeyBzY3JlZW5zaG90cyB9LFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChwYXlsb2FkPy5pbWFnZUFubm90YXRpb24pIHtcbiAgICAgIGNvbnN0IGFzc2V0ID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCBnZXRBc3NldEFjdGl2aXR5LCB0YXNrLmFzc2V0SWQpXG4gICAgICBsZXQga2V5ID0gYXNzZXQ/LnN0b3JhZ2VLZXk/LmtleVxuICAgICAgaWYgKGFzc2V0Py5tZWRpYSkge1xuICAgICAgICBjb25zdCBtZWRpYUluZm8gPSBhc3NldC5tZWRpYSBhcyB1bmtub3duIGFzIFByaXNtYUpzb24uTWVkaWFJbmZvXG4gICAgICAgIGlmIChtZWRpYUluZm8uaW1hZ2VUcmFuc2NvZGVzICYmIG1lZGlhSW5mby5pbWFnZVRyYW5zY29kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGtleSA9IG1lZGlhSW5mby5pbWFnZVRyYW5zY29kZXNbMF0ua2V5IHx8IGtleVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghYXNzZXQgfHwgIWtleSkge1xuICAgICAgICB0aHJvdyBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHtcbiAgICAgICAgICBtZXNzYWdlOiAnQXNzZXQgbm90IGZvdW5kIG9yIGhhcyBubyBrZXknLFxuICAgICAgICAgIG5vblJldHJ5YWJsZTogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5V2l0aE92ZXJsYXkgPSBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIG92ZXJsYXlBbm5vdGF0aW9uc0FjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgICBhbm5vdGF0aW9uczogcGF5bG9hZC5pbWFnZUFubm90YXRpb24uYW5ub3RhdGlvbnMsXG4gICAgICB9KVxuXG4gICAgICAvLyBVcGRhdGUgVGFzayBTdGF0dXMgdG8gY29tcGxldGVkIHdpdGggb3V0cHV0XG4gICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgICB0YXNrSWQ6IHRhc2suaWQsXG4gICAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICAgIG91dHB1dDogeyBrZXk6IGtleVdpdGhPdmVybGF5IH0sXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB1cGRhdGVBc3NldFN0YXR1c0FjdGl2aXR5LCB7XG4gICAgICBhc3NldElkOiB0YXNrLmFzc2V0SWQsXG4gICAgICBzdGF0dXM6ICdwcm9jZXNzaW5nJyxcbiAgICB9KVxuXG4gICAgLy8gMi4gR2V0IEFzc2V0XG4gICAgY29uc3QgYXNzZXQgPSBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIGdldEFzc2V0QWN0aXZpdHksIHRhc2suYXNzZXRJZClcbiAgICBjb25zdCBrZXkgPSBhc3NldD8uc3RvcmFnZUtleT8ua2V5XG4gICAgaWYgKCFhc3NldCB8fCAha2V5KSB7XG4gICAgICB0aHJvdyBBcHBsaWNhdGlvbkZhaWx1cmUuY3JlYXRlKHtcbiAgICAgICAgbWVzc2FnZTogJ0Fzc2V0IG5vdCBmb3VuZCBvciBoYXMgbm8ga2V5JyxcbiAgICAgICAgbm9uUmV0cnlhYmxlOiB0cnVlLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA0LiBEb3dubG9hZCBNZWRpYSB0byBUbXBcbiAgICBjb25zdCBkb3dubG9hZCA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgZG93bmxvYWRNZWRpYVRvVG1wQWN0aXZpdHksIHtcbiAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgfSlcbiAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSBkb3dubG9hZFxuICAgIHRtcERpciA9IGRvd25sb2FkLnRtcERpclxuXG4gICAgLy8gNS4gR2V0IE1lZGlhIEluZm9cbiAgICBjb25zdCBzcGVjID0gdGFzay5wYXlsb2FkPy50cmFuc2NvZGUgfHwge31cbiAgICBjb25zdCBtZWRpYUluZm8gPSBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIGdldE1lZGlhSW5mb0FjdGl2aXR5LCB7XG4gICAgICBmaWxlUGF0aCxcbiAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgbWVkaWFUeXBlOiBhc3NldC5tZWRpYVR5cGUgfHwgJycsXG4gICAgfSlcblxuICAgIG1lZGlhSW5mby5vcmlnaW5hbCA9IHtcbiAgICAgIGtleSxcbiAgICAgIGRvd25sb2FkVXJsOiAnJyxcbiAgICAgIGZpbGVzaXplSW5CeXRlczogMCxcbiAgICAgIGNvZGVjOiAnJyxcbiAgICB9XG5cbiAgICBjb25zdCBtaW1lVHlwZSA9IG1lZGlhSW5mby5taW1lVHlwZVxuICAgIGNvbnN0IG1ldGFkYXRhID0gbWVkaWFJbmZvLm1ldGFkYXRhXG5cbiAgICAvLyA2LiBWaWRlbyBUcmFuc2NvZGluZ1xuICAgIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCd2aWRlby8nKSAmJiBtZXRhZGF0YSkge1xuICAgICAgY29uc3QgdmlkZW9SZXNvbHV0aW9ucyA9IGdldFRhcmdldFZpZGVvUmVzb2x1dGlvbnMoXG4gICAgICAgIHNwZWMudmlkZW9TdHJhdGVneSB8fCAnYmVzdF9tYXRjaCcsXG4gICAgICAgIG1ldGFkYXRhLm9yaWdpbmFsV2lkdGgsXG4gICAgICAgIG1ldGFkYXRhLm9yaWdpbmFsSGVpZ2h0LFxuICAgICAgKVxuICAgICAgZm9yIChjb25zdCByZXMgb2YgdmlkZW9SZXNvbHV0aW9ucykge1xuICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSByZXNvbHV0aW9uVG9EaW1lbnNpb25zKFxuICAgICAgICAgIHJlcyxcbiAgICAgICAgICBtZXRhZGF0YS5vcmlnaW5hbFdpZHRoLFxuICAgICAgICAgIG1ldGFkYXRhLm9yaWdpbmFsSGVpZ2h0LFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgdmlkZW9TcGVjOiBQcmlzbWFKc29uLlZpZGVvVHJhbnNjb2RlID0ge1xuICAgICAgICAgIHJlc29sdXRpb246IHJlcyxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aWRlb1RyYW5zY29kZSA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgdHJhbnNjb2RlVmlkZW9BY3Rpdml0eSwge1xuICAgICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgICAgdmlkZW9TcGVjLFxuICAgICAgICAgIGR1cmF0aW9uOiBtZXRhZGF0YS5kdXJhdGlvbixcbiAgICAgICAgICBvcmlnaW5hbEZwczogbWV0YWRhdGEuZnJhbWVSYXRlLFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChyZXMgPT09ICcxODBwJykge1xuICAgICAgICAgIG1lZGlhSW5mby52aWRlb1ByZXZpZXcgPSB2aWRlb1RyYW5zY29kZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lZGlhSW5mby52aWRlb1RyYW5zY29kZXMucHVzaCh2aWRlb1RyYW5zY29kZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMga2VlcCByYXdcbiAgICAgIG1lZGlhSW5mby52aWRlb1RyYW5zY29kZXMucHVzaCh7XG4gICAgICAgIGtleTogbWVkaWFJbmZvLm9yaWdpbmFsPy5rZXksXG4gICAgICAgIHdpZHRoOiBtZXRhZGF0YS5vcmlnaW5hbFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IG1ldGFkYXRhLm9yaWdpbmFsSGVpZ2h0LFxuICAgICAgICBpc1JhdzogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNi41IEF1ZGlvIFRyYW5zY29kaW5nXG4gICAgY29uc3QgaXNBdWRpbyA9IG1pbWVUeXBlLnN0YXJ0c1dpdGgoJ2F1ZGlvLycpXG4gICAgaWYgKGlzQXVkaW8gJiYgbWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IGF1ZGlvVHJhbnNjb2RlID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB0cmFuc2NvZGVBdWRpb0FjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgfSlcbiAgICAgIG1lZGlhSW5mby52aWRlb1RyYW5zY29kZXMucHVzaChhdWRpb1RyYW5zY29kZSlcbiAgICB9XG5cbiAgICAvLyA3LiBJbWFnZSBUcmFuc2NvZGluZ1xuICAgIGNvbnN0IGlzSW1hZ2UgPSBtaW1lVHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKVxuICAgIGNvbnN0IGlzUHNkID0gaXNNaW1lUHNkKG1pbWVUeXBlKVxuICAgIGlmICgoaXNJbWFnZSB8fCBpc1BzZCkgJiYgbWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IGltYWdlU3BlYzogUHJpc21hSnNvbi5JbWFnZVRyYW5zY29kZSA9IHtcbiAgICAgICAgd2lkdGg6IG1ldGFkYXRhLm9yaWdpbmFsV2lkdGgsXG4gICAgICAgIGhlaWdodDogbWV0YWRhdGEub3JpZ2luYWxIZWlnaHQsXG4gICAgICAgIHF1YWxpdHk6IDkwLFxuICAgICAgICBmb3JtYXQ6ICd3ZWJwJyxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltYWdlVHJhbnNjb2RlID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB0cmFuc2NvZGVJbWFnZUFjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBpbWFnZVNwZWMsXG4gICAgICB9KVxuICAgICAgbWVkaWFJbmZvLmltYWdlVHJhbnNjb2Rlcy5wdXNoKGltYWdlVHJhbnNjb2RlKVxuICAgIH1cblxuICAgIC8vIDkuIFN5c3RlbTogVGh1bWJuYWlsXG4gICAgaWYgKHNwZWMudGh1bWJuYWlsKSB7XG4gICAgICBjb25zdCB0aHVtYlRyYW5zY29kZSA9IGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgdHJhbnNjb2RlSW1hZ2VBY3Rpdml0eSwge1xuICAgICAgICBhc3NldEtleToga2V5LFxuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgaW1hZ2VTcGVjOiB7IHdpZHRoOiA0ODAsIGhlaWdodDogMCwgcXVhbGl0eTogODAsIGZvcm1hdDogJ3dlYnAnIH0sXG4gICAgICB9KVxuICAgICAgbWVkaWFJbmZvLnRodW1ibmFpbCA9IHRodW1iVHJhbnNjb2RlXG4gICAgfVxuXG4gICAgLy8gMTAuIFN5c3RlbTogU3ByaXRlL1Bvc3RlciAoVmlkZW8gb25seSB1c3VhbGx5KVxuICAgIGlmIChzcGVjLnNwcml0ZSB8fCBzcGVjLnBvc3Rlcikge1xuICAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSBrZXkubGFzdEluZGV4T2YoJy8nKVxuICAgICAgY29uc3QgYXNzZXREaXIgPSBsYXN0U2xhc2hJbmRleCA9PT0gLTEgPyAnJyA6IGtleS5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoSW5kZXgpXG5cbiAgICAgIGNvbnN0IHNwcml0ZVNwZWM6IFByaXNtYUpzb24uU3ByaXRlSW5mbyA9IHtcbiAgICAgICAga2V5OiBhc3NldERpciA/IGAke2Fzc2V0RGlyfS9zcHJpdGUud2VicGAgOiAnc3ByaXRlLndlYnAnLFxuICAgICAgICBmcmFtZXM6IDEwMCxcbiAgICAgICAgdGlsZVg6IDEwLFxuICAgICAgICB0aWxlWTogMTAsXG4gICAgICB9XG4gICAgICBjb25zdCBwb3N0ZXJTcGVjOiBQcmlzbWFKc29uLlBvc3RlckluZm8gPSB7XG4gICAgICAgIGtleTogYXNzZXREaXIgPyBgJHthc3NldERpcn0vcG9zdGVyLndlYnBgIDogJ3Bvc3Rlci53ZWJwJyxcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3ByaXRlUmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCBnZW5lcmF0ZVNwcml0ZUFjdGl2aXR5LCB7XG4gICAgICAgIGFzc2V0S2V5OiBrZXksXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICBzcHJpdGVTcGVjLFxuICAgICAgICBwb3N0ZXJTcGVjLFxuICAgICAgICBtZWRpYUluZm8sXG4gICAgICB9KVxuICAgICAgbWVkaWFJbmZvLnNwcml0ZSA9IHNwcml0ZVJlc3VsdC5zcHJpdGVcbiAgICAgIG1lZGlhSW5mby5wb3N0ZXIgPSBzcHJpdGVSZXN1bHQucG9zdGVyXG4gICAgfVxuXG4gICAgLy8gMTEuIFVwZGF0ZSBBc3NldCBNZWRpYSBhbmQgU3RhdHVzXG4gICAgYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB1cGRhdGVBc3NldE1lZGlhQWN0aXZpdHksIHtcbiAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgbWVkaWFJbmZvLFxuICAgIH0pXG5cbiAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZUFzc2V0U3RhdHVzQWN0aXZpdHksIHtcbiAgICAgIGFzc2V0SWQ6IGFzc2V0LmlkLFxuICAgICAgc3RhdHVzOiAncHJvY2Vzc2VkJyxcbiAgICB9KVxuXG4gICAgLy8gMTEuNSBDcmVhdGUgQUkgZW1iZWRkaW5nIHRhc2sgaWYgZW5hYmxlZFxuICAgIGF3YWl0IGV4ZWN1dGVBY3Rpdml0eSh3b3JrZXJRdWV1ZSwgY3JlYXRlRW1iZWRkaW5nVGFza0lmRW5hYmxlZEFjdGl2aXR5LCB7XG4gICAgICBhc3NldElkOiBhc3NldC5pZCxcbiAgICAgIHRlYW1JZDogdGFzay50ZWFtSWQsXG4gICAgICBwcm9qZWN0SWQ6IHRhc2sucHJvamVjdElkLFxuICAgIH0pXG5cbiAgICAvLyAxMi4gVXBkYXRlIFRhc2sgU3RhdHVzXG4gICAgYXdhaXQgZXhlY3V0ZUFjdGl2aXR5KHdvcmtlclF1ZXVlLCB1cGRhdGVUYXNrU3RhdHVzQWN0aXZpdHksIHtcbiAgICAgIHRhc2tJZDogdGFzay5pZCxcbiAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihgVHJhbnNjb2RlTWVkaWEgZmFpbGVkIGZvciB0YXNrICR7dGFzay5pZH06YCwgZXJyKVxuICAgIC8vIFVwZGF0ZSBzdGF0dXMgdG8gZmFpbGVkXG4gICAgaWYgKHdvcmtlclF1ZXVlKSB7XG4gICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIHVwZGF0ZVRhc2tTdGF0dXNBY3Rpdml0eSwge1xuICAgICAgICB0YXNrSWQ6IHRhc2suaWQsXG4gICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgIG91dHB1dDogeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0sXG4gICAgICB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodG1wRGlyICYmIHdvcmtlclF1ZXVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjdXRlQWN0aXZpdHkod29ya2VyUXVldWUsIGNsZWFudXBUbXBEaXJBY3Rpdml0eSwgeyB0bXBEaXIgfSlcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNsZWFudXAgdG1wIGRpcjonLCBjbGVhbnVwRXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc01pbWVQc2QobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKG1pbWVUeXBlKSB7XG4gICAgY2FzZSAnaW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcCc6XG4gICAgY2FzZSAnaW1hZ2UveC1waG90b3Nob3AnOlxuICAgIGNhc2UgJ2FwcGxpY2F0aW9uL3gtcGhvdG9zaG9wJzpcbiAgICBjYXNlICdpbWFnZS9wc2QnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgUkVTT0xVVElPTl9MT05HX1NJREVTOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAnMjE2MHAnOiAzODQwLFxuICAnMTA4MHAnOiAxOTIwLFxuICAnNzIwcCc6IDEyODAsXG4gICc1NDBwJzogOTYwLFxuICAnMzYwcCc6IDY0MCxcbiAgJzE4MHAnOiAzMjAsXG59XG5cbmZ1bmN0aW9uIHJlc29sdXRpb25Ub0RpbWVuc2lvbnMoXG4gIHJlc29sdXRpb246IHN0cmluZyxcbiAgb3JpZ2luYWxXaWR0aDogbnVtYmVyLFxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGNvbnN0IHRhcmdldExvbmdTaWRlID0gUkVTT0xVVElPTl9MT05HX1NJREVTW3Jlc29sdXRpb25dXG4gIGlmICghdGFyZ2V0TG9uZ1NpZGUpIHJldHVybiBbMCwgMF1cblxuICBsZXQgd2lkdGg6IG51bWJlclxuICBsZXQgaGVpZ2h0OiBudW1iZXJcblxuICBpZiAob3JpZ2luYWxXaWR0aCA+PSBvcmlnaW5hbEhlaWdodCkge1xuICAgIC8vIExhbmRzY2FwZSBvciBzcXVhcmU6IHdpZHRoIGlzIHRoZSBsb25nIHNpZGVcbiAgICB3aWR0aCA9IHRhcmdldExvbmdTaWRlXG4gICAgaGVpZ2h0ID0gTWF0aC5yb3VuZCh3aWR0aCAqIChvcmlnaW5hbEhlaWdodCAvIG9yaWdpbmFsV2lkdGgpKVxuICB9IGVsc2Uge1xuICAgIC8vIFBvcnRyYWl0OiBoZWlnaHQgaXMgdGhlIGxvbmcgc2lkZVxuICAgIGhlaWdodCA9IHRhcmdldExvbmdTaWRlXG4gICAgd2lkdGggPSBNYXRoLnJvdW5kKGhlaWdodCAqIChvcmlnaW5hbFdpZHRoIC8gb3JpZ2luYWxIZWlnaHQpKVxuICB9XG5cbiAgLy8gRW5zdXJlIGV2ZW4gZGltZW5zaW9ucyBmb3IgSC4yNjRcbiAgaWYgKHdpZHRoICUgMiAhPT0gMCkgd2lkdGgrK1xuICBpZiAoaGVpZ2h0ICUgMiAhPT0gMCkgaGVpZ2h0KytcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdXG59XG5cbmNvbnN0IFRBUkdFVF9SRVNPTFVUSU9OUyA9IFtcbiAgeyBuYW1lOiAnMjE2MHAnLCBsb25nU2lkZTogMzg0MCB9LFxuICB7IG5hbWU6ICcxMDgwcCcsIGxvbmdTaWRlOiAxOTIwIH0sXG4gIHsgbmFtZTogJzcyMHAnLCBsb25nU2lkZTogMTI4MCB9LFxuICB7IG5hbWU6ICc1NDBwJywgbG9uZ1NpZGU6IDk2MCB9LFxuICB7IG5hbWU6ICczNjBwJywgbG9uZ1NpZGU6IDY0MCB9LFxuXVxuXG5mdW5jdGlvbiBnZXRCZXN0TWF0Y2hSZXNvbHV0aW9uKFxuICBvcmlnaW5hbFdpZHRoOiBudW1iZXIsXG4gIG9yaWdpbmFsSGVpZ2h0OiBudW1iZXIsXG4pOiB7IG5hbWU6IHN0cmluZzsgbG9uZ1NpZGU6IG51bWJlciB9IHtcbiAgY29uc3QgcmF3TG9uZ1NpZGUgPSBNYXRoLm1heChvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodClcbiAgY29uc3QgbG93ZXIgPSBUQVJHRVRfUkVTT0xVVElPTlMuZmlsdGVyKChyKSA9PiByLmxvbmdTaWRlIDw9IHJhd0xvbmdTaWRlKVxuICBpZiAobG93ZXIubGVuZ3RoID4gMCkge1xuICAgIGxvd2VyLnNvcnQoKGEsIGIpID0+IGIubG9uZ1NpZGUgLSBhLmxvbmdTaWRlKVxuICAgIHJldHVybiBsb3dlclswXVxuICB9XG4gIHJldHVybiBUQVJHRVRfUkVTT0xVVElPTlNbVEFSR0VUX1JFU09MVVRJT05TLmxlbmd0aCAtIDFdIC8vIDM2MHAgKGxvbmdTaWRlIDY0MClcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0VmlkZW9SZXNvbHV0aW9ucyhcbiAgc3RyYXRlZ3k6IFByaXNtYUpzb24uVmlkZW9UcmFuc2NvZGVTdHJhdGVneSxcbiAgb3JpZ2luYWxXaWR0aDogbnVtYmVyLFxuICBvcmlnaW5hbEhlaWdodDogbnVtYmVyLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXNvbHV0aW9ucyA9IFsnMTgwcCddXG5cbiAgLy8gTm9ybWFsaXplIGxlZ2FjeSBzdHJhdGVnaWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGxldCBub3JtYWxpemVkU3RyYXRlZ3k6IHN0cmluZyA9IHN0cmF0ZWd5XG4gIGNvbnN0IHN0cmF0U3RyID0gc3RyYXRlZ3kgYXMgc3RyaW5nXG4gIGlmIChzdHJhdFN0ciA9PT0gJ3NpbmdsZScgfHwgc3RyYXRTdHIgPT09ICdkaXNhYmxlJykge1xuICAgIG5vcm1hbGl6ZWRTdHJhdGVneSA9ICdiZXN0X21hdGNoJ1xuICB9IGVsc2UgaWYgKHN0cmF0U3RyID09PSAnZnVsbCcpIHtcbiAgICBub3JtYWxpemVkU3RyYXRlZ3kgPSAnYWxsJ1xuICB9XG5cbiAgY29uc3QgYmVzdE1hdGNoID0gZ2V0QmVzdE1hdGNoUmVzb2x1dGlvbihvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodClcblxuICBpZiAobm9ybWFsaXplZFN0cmF0ZWd5ID09PSAnYmVzdF9tYXRjaCcpIHtcbiAgICByZXNvbHV0aW9ucy5wdXNoKGJlc3RNYXRjaC5uYW1lKVxuICB9IGVsc2UgaWYgKG5vcm1hbGl6ZWRTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICBjb25zdCBiZXN0TWF0Y2hJbmRleCA9IFRBUkdFVF9SRVNPTFVUSU9OUy5maW5kSW5kZXgoKHIpID0+IHIubmFtZSA9PT0gYmVzdE1hdGNoLm5hbWUpXG4gICAgaWYgKGJlc3RNYXRjaEluZGV4ICE9PSAtMSkge1xuICAgICAgZm9yIChsZXQgaSA9IGJlc3RNYXRjaEluZGV4OyBpIDwgVEFSR0VUX1JFU09MVVRJT05TLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc29sdXRpb25zLnB1c2goVEFSR0VUX1JFU09MVVRJT05TW2ldLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc29sdXRpb25zXG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc2NvZGVXb3JrZmxvdyA9IHRyYW5zY29kZU1lZGlhXG4iLCIvLyBVc2UgdHlwZS1vbmx5IGltcG9ydHMgZm9yIGFjdGl2aXRpZXMgdG8gYXZvaWQgYnVuZGxpbmcgdGhlbSBpbiBUZW1wb3JhbCB3b3JrZmxvd3NcbmltcG9ydCAqIGFzIHdmIGZyb20gJ0B0ZW1wb3JhbGlvL3dvcmtmbG93J1xuXG4vKipcbiAqIFRhc2sgcXVldWUgY29uc3RhbnRzLlxuICovXG5leHBvcnQgY29uc3QgVGFza1F1ZXVlQWdlbnQgPSAnYWdlbnRfcXVldWUnXG5leHBvcnQgY29uc3QgVGFza1F1ZXVlVHJhbnNjb2RlID0gJ3RyYW5zY29kZV9xdWV1ZSdcblxuLyoqXG4gKiBEZXRlY3RzIGlmIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpcyB3aXRoaW4gYSBUZW1wb3JhbCBXb3JrZmxvdyBpc29sYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZW1wb3JhbCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICAvLyBJbiBUZW1wb3JhbCBUUyBTREssIHdvcmtmbG93SW5mbygpIHRocm93cyBpZiBjYWxsZWQgb3V0c2lkZSBvZiBhIHdvcmtmbG93IGNvbnRleHQuXG4gICAgd2Yud29ya2Zsb3dJbmZvKClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5pbnRlcmZhY2UgTG9jYWxMb2dnZXIge1xuICBkZWJ1ZyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtc2c6IHN0cmluZyk6IHZvaWRcbiAgaW5mbyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtc2c6IHN0cmluZyk6IHZvaWRcbiAgZXJyb3Iob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbXNnOiBzdHJpbmcpOiB2b2lkXG4gIHdhcm4ob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbXNnOiBzdHJpbmcpOiB2b2lkXG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiAqL1xuY29uc3QgZ2xvYmFsT2JqID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgX19sb2NhbEFjdGl2aXRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBfX2xvY2FsTG9nZ2VyPzogTG9jYWxMb2dnZXJcbn1cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXG5cbi8qKlxuICogQSBwcm94eSB0aGF0IG1pbWljcyBwcm94eUFjdGl2aXRpZXMgZm9yIGxvY2FsIGV4ZWN1dGlvbi5cbiAqL1xuZnVuY3Rpb24gbG9jYWxBY3Rpdml0aWVzUHJveHkoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb25zdCBhY3RzID0gZ2xvYmFsT2JqLl9fbG9jYWxBY3Rpdml0aWVzXG4gIGlmICghYWN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignTG9jYWwgYWN0aXZpdGllcyBub3QgaW5qZWN0ZWQgaW50byBnbG9iYWxUaGlzLl9fbG9jYWxBY3Rpdml0aWVzJylcbiAgfVxuICByZXR1cm4gYWN0c1xufVxuXG4vKipcbiAqIEVudmlyb25tZW50LWF3YXJlIHNsZWVwIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNUZW1wb3JhbCgpKSB7XG4gICAgYXdhaXQgd2Yuc2xlZXAobXMpXG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuICB9XG59XG5cbi8qKlxuICogRW52aXJvbm1lbnQtYXdhcmUgYWN0aXZpdHkgcHJveHkuXG4gKi9cbi8vIGdldEFjdGl2aXRpZXMgbXVzdCBkZWZhdWx0IHRvIGBhbnlgIHNvIHRoYXQgd29ya2Zsb3dzIGNhbiBkeW5hbWljYWxseVxuLy8gZGVzdHJ1Y3R1cmUgYW5kIGNhbGwgYW55IGFjdGl2aXR5IHdoZW4gdGhleSBkbyBub3Qgc3VwcGx5IGEgcHJlY2lzZSB0eXBlIHBhcmFtZXRlci5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZpdGllczxUID0gYW55PigpOiBUIHtcbiAgLy8gYmFzZVByb3h5IGlzIGR5bmFtaWNhbGx5IHByb3h5aW5nIGFsbCBhY3Rpdml0aWVzLCBzbyB3ZSBtdXN0IHR5cGUgaXQgYXMgYW55LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBsZXQgYmFzZVByb3h5OiBhbnlcbiAgaWYgKGlzVGVtcG9yYWwoKSkge1xuICAgIC8vIFRlbXBvcmFsJ3MgcHJveHlBY3Rpdml0aWVzIHJlcXVpcmVzIGEgdHlwZSBwYXJhbWV0ZXIsIHNvIHdlIHVzZSBhbnkgZm9yIGdlbmVyaWMgYWN0aXZpdGllcy5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGJhc2VQcm94eSA9IHdmLnByb3h5QWN0aXZpdGllczxhbnk+KHtcbiAgICAgIHN0YXJ0VG9DbG9zZVRpbWVvdXQ6ICcxMCBtaW51dGVzJyxcbiAgICAgIHJldHJ5OiB7XG4gICAgICAgIG1heGltdW1BdHRlbXB0czogNSxcbiAgICAgICAgaW5pdGlhbEludGVydmFsOiAnMTBzJyxcbiAgICAgIH0sXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBiYXNlUHJveHkgPSBsb2NhbEFjdGl2aXRpZXNQcm94eSgpXG4gIH1cblxuICAvLyBXcmFwIHRoZSBiYXNlIHByb3h5IHRvIGF0dGFjaCB0aGUgYWN0aXZpdHkgbmFtZSB0byB0aGUgcmV0dXJuZWQgZnVuY3Rpb25zXG4gIC8vIFdlIHVzZSBhbnkgaGVyZSBiZWNhdXNlIHdlIGFyZSBkeW5hbWljYWxseSBpbnRlcmNlcHRpbmcgcHJvcGVydGllcyBvbiB0aGUgcHJveHlcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmV0dXJuIG5ldyBQcm94eShiYXNlUHJveHkgYXMgYW55LCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRhcmdldFtwcm9wXVxuICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGhhcyB0aGUgX2FjdGl2aXR5TmFtZSBwcm9wZXJ0eVxuICAgICAgICAgIGNvbnN0IHdyYXBwZWQgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiBvcmlnaW5hbCguLi5hcmdzKVxuICAgICAgICAgIC8vIFdlIGF0dGFjaCBhIGhpZGRlbiBwcm9wZXJ0eSB0byB0cmFjayB0aGUgYWN0aXZpdHkgbmFtZSBmb3IgZXhlY3V0ZUFjdGl2aXR5XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICA7KHdyYXBwZWQgYXMgYW55KS5fYWN0aXZpdHlOYW1lID0gcHJvcFxuICAgICAgICAgIHJldHVybiB3cmFwcGVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsXG4gICAgICB9XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKVxuICAgIH0sXG4gIH0pXG59XG5cbi8qKlxuICogRW52aXJvbm1lbnQtYXdhcmUgbG9nZ2VyIGZvciB3b3JrZmxvd3MgYW5kIGFjdGl2aXRpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldExvZ2dlcigpIHtcbiAgaWYgKGlzVGVtcG9yYWwoKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkZWJ1ZzogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cuZGVidWcobXNnLCBvYmopLFxuICAgICAgaW5mbzogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cuaW5mbyhtc2csIG9iaiksXG4gICAgICBlcnJvcjogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cuZXJyb3IobXNnLCBvYmopLFxuICAgICAgd2FybjogKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1zZzogc3RyaW5nKSA9PiB3Zi5sb2cud2Fybihtc2csIG9iaiksXG4gICAgfVxuICB9XG4gIHJldHVybiBnbG9iYWxPYmouX19sb2NhbExvZ2dlciB8fCBjb25zb2xlXG59XG5cbi8qKlxuICogRXhlY3V0ZSBhbiBhY3Rpdml0eSBvbiBhIHNwZWNpZmljIHRhc2sgcXVldWUuXG4gKiBAcGFyYW0gcXVldWUgVGhlIHRhc2sgcXVldWUgdG8gcnVuIHRoZSBhY3Rpdml0eSBvblxuICogQHBhcmFtIGFjdGl2aXR5RnVuYyBUaGUgcHJveHkgZnVuY3Rpb24gb2J0YWluZWQgZnJvbSBgZ2V0QWN0aXZpdGllcygpYFxuICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhY3Rpdml0eVxuICovXG4vLyBPdmVybG9hZCBzaWduYXR1cmUgZm9yIHVudHlwZWQgb3IgZ2VuZXJpYyBhY3Rpdml0eSBjYWxsYmFja3MuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGl2aXR5KFxuICBxdWV1ZTogc3RyaW5nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBhY3Rpdml0eUZ1bmM6IGFueSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLi4uYXJnczogYW55W11cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbik6IFByb21pc2U8YW55PlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpdml0eTxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJldD4oXG4gIHF1ZXVlOiBzdHJpbmcsXG4gIGFjdGl2aXR5RnVuYzogKC4uLmFyZ3M6IFRBcmdzKSA9PiBQcm9taXNlPFRSZXQ+LFxuICAuLi5hcmdzOiBUQXJnc1xuKTogUHJvbWlzZTxUUmV0PlxuLy8gSW1wbGVtZW50YXRpb24gc2lnbmF0dXJlIGZvciBleGVjdXRlQWN0aXZpdHkuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFjdGl2aXR5KFxuICBxdWV1ZTogc3RyaW5nLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBhY3Rpdml0eUZ1bmM6IGFueSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLi4uYXJnczogYW55W11cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbik6IFByb21pc2U8YW55PiB7XG4gIC8vIFdlIGV4dHJhY3QgdGhlIGhpZGRlbiBfYWN0aXZpdHlOYW1lIHByb3BlcnR5IGF0dGFjaGVkIGJ5IGdldEFjdGl2aXRpZXMoKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCBhY3Rpdml0eU5hbWUgPSAoYWN0aXZpdHlGdW5jIGFzIGFueSkuX2FjdGl2aXR5TmFtZVxuICBpZiAoIWFjdGl2aXR5TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdleGVjdXRlQWN0aXZpdHkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBhY3Rpdml0eSBmdW5jdGlvbiBvYnRhaW5lZCBmcm9tIGdldEFjdGl2aXRpZXMoKScsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKClcbiAgbG9nZ2VyLmRlYnVnKHsgcXVldWUsIGFjdGl2aXR5TmFtZSB9LCBgRXhlY3V0aW5nIGFjdGl2aXR5ICR7YWN0aXZpdHlOYW1lfSBvbiBxdWV1ZSAke3F1ZXVlfWApXG5cbiAgdHJ5IHtcbiAgICAvLyByZXN1bHQgaG9sZHMgdGhlIHVudHlwZWQgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgYWN0aXZpdHkgcHJveHksIHNvIHdlIHR5cGUgaXQgYXMgYW55LlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGV0IHJlc3VsdDogYW55XG4gICAgaWYgKGlzVGVtcG9yYWwoKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IGhhbmRsZSA9IHdmLnByb3h5QWN0aXZpdGllczxhbnk+KHtcbiAgICAgICAgc3RhcnRUb0Nsb3NlVGltZW91dDogJzEwIG1pbnV0ZXMnLFxuICAgICAgICB0YXNrUXVldWU6IHF1ZXVlLFxuICAgICAgICByZXRyeToge1xuICAgICAgICAgIG1heGltdW1BdHRlbXB0czogNSxcbiAgICAgICAgICBpbml0aWFsSW50ZXJ2YWw6ICcxMHMnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGhhbmRsZVthY3Rpdml0eU5hbWVdKC4uLmFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciBsb2NhbCBleGVjdXRpb24sIHF1ZXVlIGlzIGlnbm9yZWQgYW5kIHdlIGp1c3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb25cbiAgICAgIHJlc3VsdCA9IGF3YWl0IGFjdGl2aXR5RnVuYyguLi5hcmdzKVxuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICB7IHF1ZXVlLCBhY3Rpdml0eU5hbWUgfSxcbiAgICAgIGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvbiBxdWV1ZSAke3F1ZXVlfWAsXG4gICAgKVxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgeyBxdWV1ZSwgYWN0aXZpdHlOYW1lLCBlcnIgfSxcbiAgICAgIGBBY3Rpdml0eSAke2FjdGl2aXR5TmFtZX0gZmFpbGVkIG9uIHF1ZXVlICR7cXVldWV9OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxuICAgIClcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBhbmQgdmFsaWRhdGVzIGEgY29uY3VycmVuY3kgbGltaXQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBJZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBOYU4sIG9yIDw9IDAsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25jdXJyZW5jeUxpbWl0KGVudlZhcjogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gIGlmICghZW52VmFyKSByZXR1cm4gZGVmYXVsdFZhbHVlXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KGVudlZhciwgMTApXG4gIGlmIChpc05hTihwYXJzZWQpIHx8IHBhcnNlZCA8PSAwKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICB9XG4gIHJldHVybiBwYXJzZWRcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGdsb2JhbE9ialdpdGhDYW5jZWwgPSBnbG9iYWxUaGlzIGFzIGFueVxuaWYgKCFnbG9iYWxPYmpXaXRoQ2FuY2VsLl9fbG9jYWxDYW5jZWxIYW5kbGVycykge1xuICBnbG9iYWxPYmpXaXRoQ2FuY2VsLl9fbG9jYWxDYW5jZWxIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCAoKSA9PiB2b2lkPigpXG59XG5jb25zdCBsb2NhbENhbmNlbEhhbmRsZXJzOiBNYXA8c3RyaW5nLCAoKSA9PiB2b2lkPiA9IGdsb2JhbE9ialdpdGhDYW5jZWwuX19sb2NhbENhbmNlbEhhbmRsZXJzXG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckxvY2FsQ2FuY2VsSGFuZGxlcih0YXNrSWQ6IHN0cmluZywgY2FuY2VsRm46ICgpID0+IHZvaWQpIHtcbiAgbG9jYWxDYW5jZWxIYW5kbGVycy5zZXQodGFza0lkLCBjYW5jZWxGbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJMb2NhbENhbmNlbEhhbmRsZXIodGFza0lkOiBzdHJpbmcpIHtcbiAgbG9jYWxDYW5jZWxIYW5kbGVycy5kZWxldGUodGFza0lkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlckxvY2FsQ2FuY2VsKHRhc2tJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhhbmRsZXIgPSBsb2NhbENhbmNlbEhhbmRsZXJzLmdldCh0YXNrSWQpXG4gIGlmIChoYW5kbGVyKSB7XG4gICAgaGFuZGxlcigpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cbiIsIi8qIChpZ25vcmVkKSAqLyIsIi8qIChpZ25vcmVkKSAqLyIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gSGVscGVycy5cbmNvbnN0IHMgPSAxMDAwO1xuY29uc3QgbSA9IHMgKiA2MDtcbmNvbnN0IGggPSBtICogNjA7XG5jb25zdCBkID0gaCAqIDI0O1xuY29uc3QgdyA9IGQgKiA3O1xuY29uc3QgeSA9IGQgKiAzNjUuMjU7XG5mdW5jdGlvbiBtcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zPy5sb25nID8gZm10TG9uZyh2YWx1ZSkgOiBmbXRTaG9ydCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBpcyBub3QgYSBzdHJpbmcgb3IgbnVtYmVyLicpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGlzRXJyb3IoZXJyb3IpXG4gICAgICAgICAgICA/IGAke2Vycm9yLm1lc3NhZ2V9LiB2YWx1ZT0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgICAgICA6ICdBbiB1bmtub3duIGVycm9yIGhhcyBvY2N1cmVkLic7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG59XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy4nKTtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgICBjb25zdCB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3llYXJzJzpcbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIGNhc2UgJ3lycyc6XG4gICAgICAgIGNhc2UgJ3lyJzpcbiAgICAgICAgY2FzZSAneSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHk7XG4gICAgICAgIGNhc2UgJ3dlZWtzJzpcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB3O1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGQ7XG4gICAgICAgIGNhc2UgJ2hvdXJzJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ2hycyc6XG4gICAgICAgIGNhc2UgJ2hyJzpcbiAgICAgICAgY2FzZSAnaCc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIGg7XG4gICAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdtaW5zJzpcbiAgICAgICAgY2FzZSAnbWluJzpcbiAgICAgICAgY2FzZSAnbSc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIG07XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjYXNlICdzZWNzJzpcbiAgICAgICAgY2FzZSAnc2VjJzpcbiAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICByZXR1cm4gbiAqIHM7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnbXNlY3MnOlxuICAgICAgICBjYXNlICdtc2VjJzpcbiAgICAgICAgY2FzZSAnbXMnOlxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ci5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHVuaXQgJHt0eXBlfSB3YXMgbWF0Y2hlZCwgYnV0IG5vIG1hdGNoaW5nIGNhc2UgZXhpc3RzLmApO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IG1zO1xuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgY29uc3QgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gICAgaWYgKG1zQWJzID49IGQpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBkKX1kYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IGgpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBoKX1oYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBtKX1tYDtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIGAke01hdGgucm91bmQobXMgLyBzKX1zYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfW1zYDtcbn1cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKi9cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgICBjb25zdCBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke21zfSBtc2A7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gICAgY29uc3QgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zIC8gbil9ICR7bmFtZX0ke2lzUGx1cmFsID8gJ3MnIDogJyd9YDtcbn1cbi8qKlxuICogQSB0eXBlIGd1YXJkIGZvciBlcnJvcnMuXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnbWVzc2FnZScgaW4gZXJyb3I7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQ7XG4iLCIvLyBHRU5FUkFURUQgRklMRS4gRE8gTk9UIEVESVQuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBmdW5jdGlvbiBwcmVmZXJEZWZhdWx0KGV4cG9ydHMpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5kZWZhdWx0IHx8IGV4cG9ydHM7XG4gIH1cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXhwb3J0cyA9IHt9O1xuICAgICAgZmFjdG9yeShleHBvcnRzKTtcbiAgICAgIHJldHVybiBwcmVmZXJEZWZhdWx0KGV4cG9ydHMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzKTtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIikgbW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJEZWZhdWx0KGV4cG9ydHMpO1xuICB9IGVsc2Uge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXhwb3J0cyA9IHt9O1xuICAgICAgZmFjdG9yeShleHBvcnRzKTtcbiAgICAgIGdsb2JhbC5Mb25nID0gcHJlZmVyRGVmYXVsdChleHBvcnRzKTtcbiAgICB9KSgpO1xuICB9XG59KShcbiAgdHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCJcbiAgICA/IGdsb2JhbFRoaXNcbiAgICA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICA/IHNlbGZcbiAgICAgIDogdGhpcyxcbiAgZnVuY3Rpb24gKF9leHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2V4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBfZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEBsaWNlbnNlXG4gICAgICogQ29weXJpZ2h0IDIwMDkgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzXG4gICAgICogQ29weXJpZ2h0IDIwMjAgRGFuaWVsIFdpcnR6IC8gVGhlIGxvbmcuanMgQXV0aG9ycy5cbiAgICAgKlxuICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgICAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgICAqXG4gICAgICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgICAqXG4gICAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICAgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gICAgICpcbiAgICAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICAgICAqL1xuXG4gICAgLy8gV2ViQXNzZW1ibHkgb3B0aW1pemF0aW9ucyB0byBkbyBuYXRpdmUgaTY0IG11bHRpcGxpY2F0aW9uIGFuZCBkaXZpZGVcbiAgICB2YXIgd2FzbSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHdhc20gPSBuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UoXG4gICAgICAgIG5ldyBXZWJBc3NlbWJseS5Nb2R1bGUoXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgLy8gXFwwYXNtXG4gICAgICAgICAgICAwLCA5NywgMTE1LCAxMDksXG4gICAgICAgICAgICAvLyB2ZXJzaW9uIDFcbiAgICAgICAgICAgIDEsIDAsIDAsIDAsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwidHlwZVwiXG4gICAgICAgICAgICAxLCAxMywgMixcbiAgICAgICAgICAgIC8vIDAsICgpID0+IGkzMlxuICAgICAgICAgICAgOTYsIDAsIDEsIDEyNyxcbiAgICAgICAgICAgIC8vIDEsIChpMzIsIGkzMiwgaTMyLCBpMzIpID0+IGkzMlxuICAgICAgICAgICAgOTYsIDQsIDEyNywgMTI3LCAxMjcsIDEyNywgMSwgMTI3LFxuICAgICAgICAgICAgLy8gc2VjdGlvbiBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgIDMsIDcsIDYsXG4gICAgICAgICAgICAvLyAwLCB0eXBlIDBcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAvLyAxLCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyAyLCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyAzLCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyA0LCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyA1LCB0eXBlIDFcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiZ2xvYmFsXCJcbiAgICAgICAgICAgIDYsIDYsIDEsXG4gICAgICAgICAgICAvLyAwLCBcImhpZ2hcIiwgbXV0YWJsZSBpMzJcbiAgICAgICAgICAgIDEyNywgMSwgNjUsIDAsIDExLFxuICAgICAgICAgICAgLy8gc2VjdGlvbiBcImV4cG9ydFwiXG4gICAgICAgICAgICA3LCA1MCwgNixcbiAgICAgICAgICAgIC8vIDAsIFwibXVsXCJcbiAgICAgICAgICAgIDMsIDEwOSwgMTE3LCAxMDgsIDAsIDEsXG4gICAgICAgICAgICAvLyAxLCBcImRpdl9zXCJcbiAgICAgICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTUsIDAsIDIsXG4gICAgICAgICAgICAvLyAyLCBcImRpdl91XCJcbiAgICAgICAgICAgIDUsIDEwMCwgMTA1LCAxMTgsIDk1LCAxMTcsIDAsIDMsXG4gICAgICAgICAgICAvLyAzLCBcInJlbV9zXCJcbiAgICAgICAgICAgIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTUsIDAsIDQsXG4gICAgICAgICAgICAvLyA0LCBcInJlbV91XCJcbiAgICAgICAgICAgIDUsIDExNCwgMTAxLCAxMDksIDk1LCAxMTcsIDAsIDUsXG4gICAgICAgICAgICAvLyA1LCBcImdldF9oaWdoXCJcbiAgICAgICAgICAgIDgsIDEwMywgMTAxLCAxMTYsIDk1LCAxMDQsIDEwNSwgMTAzLCAxMDQsIDAsIDAsXG4gICAgICAgICAgICAvLyBzZWN0aW9uIFwiY29kZVwiXG4gICAgICAgICAgICAxMCwgMTkxLCAxLCA2LFxuICAgICAgICAgICAgLy8gMCwgXCJnZXRfaGlnaFwiXG4gICAgICAgICAgICA0LCAwLCAzNSwgMCwgMTEsXG4gICAgICAgICAgICAvLyAxLCBcIm11bFwiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI2LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICAgIC8vIDIsIFwiZGl2X3NcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEyNywgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgICAvLyAzLCBcImRpdl91XCJcbiAgICAgICAgICAgIDM2LCAxLCAxLCAxMjYsIDMyLCAwLCAxNzMsIDMyLCAxLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDMyLCAyLCAxNzMsXG4gICAgICAgICAgICAzMiwgMywgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAxMjgsIDM0LCA0LCA2NiwgMzIsIDEzNSwgMTY3LCAzNiwgMCxcbiAgICAgICAgICAgIDMyLCA0LCAxNjcsIDExLFxuICAgICAgICAgICAgLy8gNCwgXCJyZW1fc1wiXG4gICAgICAgICAgICAzNiwgMSwgMSwgMTI2LCAzMiwgMCwgMTczLCAzMiwgMSwgMTczLCA2NiwgMzIsIDEzNCwgMTMyLCAzMiwgMiwgMTczLFxuICAgICAgICAgICAgMzIsIDMsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMTI5LCAzNCwgNCwgNjYsIDMyLCAxMzUsIDE2NywgMzYsIDAsXG4gICAgICAgICAgICAzMiwgNCwgMTY3LCAxMSxcbiAgICAgICAgICAgIC8vIDUsIFwicmVtX3VcIlxuICAgICAgICAgICAgMzYsIDEsIDEsIDEyNiwgMzIsIDAsIDE3MywgMzIsIDEsIDE3MywgNjYsIDMyLCAxMzQsIDEzMiwgMzIsIDIsIDE3MyxcbiAgICAgICAgICAgIDMyLCAzLCAxNzMsIDY2LCAzMiwgMTM0LCAxMzIsIDEzMCwgMzQsIDQsIDY2LCAzMiwgMTM1LCAxNjcsIDM2LCAwLFxuICAgICAgICAgICAgMzIsIDQsIDE2NywgMTEsXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICAgIHt9LFxuICAgICAgKS5leHBvcnRzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm8gd2FzbSBzdXBwb3J0IDooXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIDY0IGJpdCB0d28ncy1jb21wbGVtZW50IGludGVnZXIsIGdpdmVuIGl0cyBsb3cgYW5kIGhpZ2ggMzIgYml0IHZhbHVlcyBhcyAqc2lnbmVkKiBpbnRlZ2Vycy5cbiAgICAgKiAgU2VlIHRoZSBmcm9tKiBmdW5jdGlvbnMgYmVsb3cgZm9yIG1vcmUgY29udmVuaWVudCB3YXlzIG9mIGNvbnN0cnVjdGluZyBMb25ncy5cbiAgICAgKiBAZXhwb3J0cyBMb25nXG4gICAgICogQGNsYXNzIEEgTG9uZyBjbGFzcyBmb3IgcmVwcmVzZW50aW5nIGEgNjQgYml0IHR3bydzLWNvbXBsZW1lbnQgaW50ZWdlciB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93IFRoZSBsb3cgKHNpZ25lZCkgMzIgYml0cyBvZiB0aGUgbG9uZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoIFRoZSBoaWdoIChzaWduZWQpIDMyIGJpdHMgb2YgdGhlIGxvbmdcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICovXG4gICAgZnVuY3Rpb24gTG9uZyhsb3csIGhpZ2gsIHVuc2lnbmVkKSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBsb3cgMzIgYml0cyBhcyBhIHNpZ25lZCB2YWx1ZS5cbiAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIHRoaXMubG93ID0gbG93IHwgMDtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgaGlnaCAzMiBiaXRzIGFzIGEgc2lnbmVkIHZhbHVlLlxuICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAqL1xuICAgICAgdGhpcy5oaWdoID0gaGlnaCB8IDA7XG5cbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB1bnNpZ25lZCBvciBub3QuXG4gICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAqL1xuICAgICAgdGhpcy51bnNpZ25lZCA9ICEhdW5zaWduZWQ7XG4gICAgfVxuXG4gICAgLy8gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbG9uZyBpcyB0aGUgdHdvIGdpdmVuIHNpZ25lZCwgMzItYml0IHZhbHVlcy5cbiAgICAvLyBXZSB1c2UgMzItYml0IHBpZWNlcyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgc2l6ZSBvZiBpbnRlZ2VycyBvbiB3aGljaFxuICAgIC8vIEphdmFzY3JpcHQgcGVyZm9ybXMgYml0LW9wZXJhdGlvbnMuICBGb3Igb3BlcmF0aW9ucyBsaWtlIGFkZGl0aW9uIGFuZFxuICAgIC8vIG11bHRpcGxpY2F0aW9uLCB3ZSBzcGxpdCBlYWNoIG51bWJlciBpbnRvIDE2IGJpdCBwaWVjZXMsIHdoaWNoIGNhbiBlYXNpbHkgYmVcbiAgICAvLyBtdWx0aXBsaWVkIHdpdGhpbiBKYXZhc2NyaXB0J3MgZmxvYXRpbmctcG9pbnQgcmVwcmVzZW50YXRpb24gd2l0aG91dCBvdmVyZmxvd1xuICAgIC8vIG9yIGNoYW5nZSBpbiBzaWduLlxuICAgIC8vXG4gICAgLy8gSW4gdGhlIGFsZ29yaXRobXMgYmVsb3csIHdlIGZyZXF1ZW50bHkgcmVkdWNlIHRoZSBuZWdhdGl2ZSBjYXNlIHRvIHRoZVxuICAgIC8vIHBvc2l0aXZlIGNhc2UgYnkgbmVnYXRpbmcgdGhlIGlucHV0KHMpIGFuZCB0aGVuIHBvc3QtcHJvY2Vzc2luZyB0aGUgcmVzdWx0LlxuICAgIC8vIE5vdGUgdGhhdCB3ZSBtdXN0IEFMV0FZUyBjaGVjayBzcGVjaWFsbHkgd2hldGhlciB0aG9zZSB2YWx1ZXMgYXJlIE1JTl9WQUxVRVxuICAgIC8vICgtMl42MykgYmVjYXVzZSAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRSAoc2luY2UgMl42MyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXNcbiAgICAvLyBhIHBvc2l0aXZlIG51bWJlciwgaXQgb3ZlcmZsb3dzIGJhY2sgaW50byBhIG5lZ2F0aXZlKS4gIE5vdCBoYW5kbGluZyB0aGlzXG4gICAgLy8gY2FzZSB3b3VsZCBvZnRlbiByZXN1bHQgaW4gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgIC8vXG4gICAgLy8gQ29tbW9uIGNvbnN0YW50IHZhbHVlcyBaRVJPLCBPTkUsIE5FR19PTkUsIGV0Yy4gYXJlIGRlZmluZWQgYmVsb3cgdGhlIGZyb20qXG4gICAgLy8gbWV0aG9kcyBvbiB3aGljaCB0aGV5IGRlcGVuZC5cblxuICAgIC8qKlxuICAgICAqIEFuIGluZGljYXRvciB1c2VkIHRvIHJlbGlhYmx5IGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBMb25nIG9yIG5vdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIExvbmcucHJvdG90eXBlLl9faXNMb25nX187XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KExvbmcucHJvdG90eXBlLCBcIl9faXNMb25nX19cIiwge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xvbmcob2JqKSB7XG4gICAgICByZXR1cm4gKG9iaiAmJiBvYmpbXCJfX2lzTG9uZ19fXCJdKSA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIG51bWJlclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3R6MzIodmFsdWUpIHtcbiAgICAgIHZhciBjID0gTWF0aC5jbHozMih2YWx1ZSAmIC12YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWUgPyAzMSAtIGMgOiBjO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgTG9uZy5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IG9iaiBPYmplY3RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nLmlzTG9uZyA9IGlzTG9uZztcblxuICAgIC8qKlxuICAgICAqIEEgY2FjaGUgb2YgdGhlIExvbmcgcmVwcmVzZW50YXRpb25zIG9mIHNtYWxsIGludGVnZXIgdmFsdWVzLlxuICAgICAqIEB0eXBlIHshT2JqZWN0fVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBJTlRfQ0FDSEUgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEEgY2FjaGUgb2YgdGhlIExvbmcgcmVwcmVzZW50YXRpb25zIG9mIHNtYWxsIHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLlxuICAgICAqIEB0eXBlIHshT2JqZWN0fVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBVSU5UX0NBQ0hFID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tSW50KHZhbHVlLCB1bnNpZ25lZCkge1xuICAgICAgdmFyIG9iaiwgY2FjaGVkT2JqLCBjYWNoZTtcbiAgICAgIGlmICh1bnNpZ25lZCkge1xuICAgICAgICB2YWx1ZSA+Pj49IDA7XG4gICAgICAgIGlmICgoY2FjaGUgPSAwIDw9IHZhbHVlICYmIHZhbHVlIDwgMjU2KSkge1xuICAgICAgICAgIGNhY2hlZE9iaiA9IFVJTlRfQ0FDSEVbdmFsdWVdO1xuICAgICAgICAgIGlmIChjYWNoZWRPYmopIHJldHVybiBjYWNoZWRPYmo7XG4gICAgICAgIH1cbiAgICAgICAgb2JqID0gZnJvbUJpdHModmFsdWUsIDAsIHRydWUpO1xuICAgICAgICBpZiAoY2FjaGUpIFVJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgfD0gMDtcbiAgICAgICAgaWYgKChjYWNoZSA9IC0xMjggPD0gdmFsdWUgJiYgdmFsdWUgPCAxMjgpKSB7XG4gICAgICAgICAgY2FjaGVkT2JqID0gSU5UX0NBQ0hFW3ZhbHVlXTtcbiAgICAgICAgICBpZiAoY2FjaGVkT2JqKSByZXR1cm4gY2FjaGVkT2JqO1xuICAgICAgICB9XG4gICAgICAgIG9iaiA9IGZyb21CaXRzKHZhbHVlLCB2YWx1ZSA8IDAgPyAtMSA6IDAsIGZhbHNlKTtcbiAgICAgICAgaWYgKGNhY2hlKSBJTlRfQ0FDSEVbdmFsdWVdID0gb2JqO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBMb25nIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gMzIgYml0IGludGVnZXIgdmFsdWUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSAzMiBiaXQgaW50ZWdlciBpbiBxdWVzdGlvblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkIFdoZXRoZXIgdW5zaWduZWQgb3Igbm90LCBkZWZhdWx0cyB0byBzaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21JbnQgPSBmcm9tSW50O1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiB1bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgIGlmICh1bnNpZ25lZCkge1xuICAgICAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gVVpFUk87XG4gICAgICAgIGlmICh2YWx1ZSA+PSBUV09fUFdSXzY0X0RCTCkgcmV0dXJuIE1BWF9VTlNJR05FRF9WQUxVRTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2YWx1ZSA8PSAtVFdPX1BXUl82M19EQkwpIHJldHVybiBNSU5fVkFMVUU7XG4gICAgICAgIGlmICh2YWx1ZSArIDEgPj0gVFdPX1BXUl82M19EQkwpIHJldHVybiBNQVhfVkFMVUU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPCAwKSByZXR1cm4gZnJvbU51bWJlcigtdmFsdWUsIHVuc2lnbmVkKS5uZWcoKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdmFsdWUgJSBUV09fUFdSXzMyX0RCTCB8IDAsXG4gICAgICAgICh2YWx1ZSAvIFRXT19QV1JfMzJfREJMKSB8IDAsXG4gICAgICAgIHVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgTG9uZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlLCBwcm92aWRlZCB0aGF0IGl0IGlzIGEgZmluaXRlIG51bWJlci4gT3RoZXJ3aXNlLCB6ZXJvIGlzIHJldHVybmVkLlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgbnVtYmVyIGluIHF1ZXN0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbU51bWJlciA9IGZyb21OdW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG93Qml0c1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoaWdoQml0c1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHVuc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21CaXRzKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCkge1xuICAgICAgcmV0dXJuIG5ldyBMb25nKGxvd0JpdHMsIGhpZ2hCaXRzLCB1bnNpZ25lZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSA2NCBiaXQgaW50ZWdlciB0aGF0IGNvbWVzIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxvdyBhbmQgaGlnaCBiaXRzLiBFYWNoIGlzXG4gICAgICogIGFzc3VtZWQgdG8gdXNlIDMyIGJpdHMuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhpZ2hCaXRzIFRoZSBoaWdoIDMyIGJpdHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tQml0cyA9IGZyb21CaXRzO1xuXG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJhc2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXhwb25lbnRcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBwb3dfZGJsID0gTWF0aC5wb3c7IC8vIFVzZWQgNCB0aW1lcyAoNCo4IHRvIDE1KzQpXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAgICogQHBhcmFtIHsoYm9vbGVhbnxudW1iZXIpPX0gdW5zaWduZWRcbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHJhZGl4XG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyLCB1bnNpZ25lZCwgcmFkaXgpIHtcbiAgICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB0aHJvdyBFcnJvcihcImVtcHR5IHN0cmluZ1wiKTtcbiAgICAgIGlmICh0eXBlb2YgdW5zaWduZWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgLy8gRm9yIGdvb2cubWF0aC5sb25nIGNvbXBhdGliaWxpdHlcbiAgICAgICAgcmFkaXggPSB1bnNpZ25lZDtcbiAgICAgICAgdW5zaWduZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVuc2lnbmVkID0gISF1bnNpZ25lZDtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgc3RyID09PSBcIk5hTlwiIHx8XG4gICAgICAgIHN0ciA9PT0gXCJJbmZpbml0eVwiIHx8XG4gICAgICAgIHN0ciA9PT0gXCIrSW5maW5pdHlcIiB8fFxuICAgICAgICBzdHIgPT09IFwiLUluZmluaXR5XCJcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgcmFkaXggPSByYWRpeCB8fCAxMDtcbiAgICAgIGlmIChyYWRpeCA8IDIgfHwgMzYgPCByYWRpeCkgdGhyb3cgUmFuZ2VFcnJvcihcInJhZGl4XCIpO1xuICAgICAgdmFyIHA7XG4gICAgICBpZiAoKHAgPSBzdHIuaW5kZXhPZihcIi1cIikpID4gMCkgdGhyb3cgRXJyb3IoXCJpbnRlcmlvciBoeXBoZW5cIik7XG4gICAgICBlbHNlIGlmIChwID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmcm9tU3RyaW5nKHN0ci5zdWJzdHJpbmcoMSksIHVuc2lnbmVkLCByYWRpeCkubmVnKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERvIHNldmVyYWwgKDgpIGRpZ2l0cyBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgc28gYXMgdG9cbiAgICAgIC8vIG1pbmltaXplIHRoZSBjYWxscyB0byB0aGUgdmVyeSBleHBlbnNpdmUgZW11bGF0ZWQgZGl2LlxuICAgICAgdmFyIHJhZGl4VG9Qb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgOCkpO1xuICAgICAgdmFyIHJlc3VsdCA9IFpFUk87XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkgKz0gOCkge1xuICAgICAgICB2YXIgc2l6ZSA9IE1hdGgubWluKDgsIHN0ci5sZW5ndGggLSBpKSxcbiAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHN0ci5zdWJzdHJpbmcoaSwgaSArIHNpemUpLCByYWRpeCk7XG4gICAgICAgIGlmIChzaXplIDwgOCkge1xuICAgICAgICAgIHZhciBwb3dlciA9IGZyb21OdW1iZXIocG93X2RibChyYWRpeCwgc2l6ZSkpO1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwocG93ZXIpLmFkZChmcm9tTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm11bChyYWRpeFRvUG93ZXIpO1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQoZnJvbU51bWJlcih2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHQudW5zaWduZWQgPSB1bnNpZ25lZDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHN0cmluZywgd3JpdHRlbiB1c2luZyB0aGUgc3BlY2lmaWVkIHJhZGl4LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIExvbmdcbiAgICAgKiBAcGFyYW0geyhib29sZWFufG51bWJlcik9fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSByYWRpeCBUaGUgcmFkaXggaW4gd2hpY2ggdGhlIHRleHQgaXMgd3JpdHRlbiAoMi0zNiksIGRlZmF1bHRzIHRvIDEwXG4gICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICovXG4gICAgTG9uZy5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVZhbHVlKHZhbCwgdW5zaWduZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcIm51bWJlclwiKSByZXR1cm4gZnJvbU51bWJlcih2YWwsIHVuc2lnbmVkKTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSByZXR1cm4gZnJvbVN0cmluZyh2YWwsIHVuc2lnbmVkKTtcbiAgICAgIC8vIFRocm93cyBmb3Igbm9uLW9iamVjdHMsIGNvbnZlcnRzIG5vbi1pbnN0YW5jZW9mIExvbmc6XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHZhbC5sb3csXG4gICAgICAgIHZhbC5oaWdoLFxuICAgICAgICB0eXBlb2YgdW5zaWduZWQgPT09IFwiYm9vbGVhblwiID8gdW5zaWduZWQgOiB2YWwudW5zaWduZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYSBMb25nIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmcm9tKiBmdW5jdGlvbiBmb3IgaXRzIHR5cGUuXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ3whe2xvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIsIHVuc2lnbmVkOiBib29sZWFufX0gdmFsIFZhbHVlXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEByZXR1cm5zIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLmZyb21WYWx1ZSA9IGZyb21WYWx1ZTtcblxuICAgIC8vIE5PVEU6IHRoZSBjb21waWxlciBzaG91bGQgaW5saW5lIHRoZXNlIGNvbnN0YW50IHZhbHVlcyBiZWxvdyBhbmQgdGhlbiByZW1vdmUgdGhlc2UgdmFyaWFibGVzLCBzbyB0aGVyZSBzaG91bGQgYmVcbiAgICAvLyBubyBydW50aW1lIHBlbmFsdHkgZm9yIHRoZXNlLlxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8xNl9EQkwgPSAxIDw8IDE2O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8yNF9EQkwgPSAxIDw8IDI0O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl8zMl9EQkwgPSBUV09fUFdSXzE2X0RCTCAqIFRXT19QV1JfMTZfREJMO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl82NF9EQkwgPSBUV09fUFdSXzMyX0RCTCAqIFRXT19QV1JfMzJfREJMO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAY29uc3RcbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVFdPX1BXUl82M19EQkwgPSBUV09fUFdSXzY0X0RCTCAvIDI7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGNvbnN0XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFRXT19QV1JfMjQgPSBmcm9tSW50KFRXT19QV1JfMjRfREJMKTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgWkVSTyA9IGZyb21JbnQoMCk7XG5cbiAgICAvKipcbiAgICAgKiBTaWduZWQgemVyby5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5aRVJPID0gWkVSTztcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgVVpFUk8gPSBmcm9tSW50KDAsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVW5zaWduZWQgemVyby5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5VWkVSTyA9IFVaRVJPO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBPTkUgPSBmcm9tSW50KDEpO1xuXG4gICAgLyoqXG4gICAgICogU2lnbmVkIG9uZS5cbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZy5PTkUgPSBPTkU7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7IUxvbmd9XG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIFVPTkUgPSBmcm9tSW50KDEsIHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVW5zaWduZWQgb25lLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLlVPTkUgPSBVT05FO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBORUdfT05FID0gZnJvbUludCgtMSk7XG5cbiAgICAvKipcbiAgICAgKiBTaWduZWQgbmVnYXRpdmUgb25lLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk5FR19PTkUgPSBORUdfT05FO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBNQVhfVkFMVUUgPSBmcm9tQml0cygweGZmZmZmZmZmIHwgMCwgMHg3ZmZmZmZmZiB8IDAsIGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gc2lnbmVkIHZhbHVlLlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKi9cbiAgICBMb25nLk1BWF9WQUxVRSA9IE1BWF9WQUxVRTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHshTG9uZ31cbiAgICAgKiBAaW5uZXJcbiAgICAgKi9cbiAgICB2YXIgTUFYX1VOU0lHTkVEX1ZBTFVFID0gZnJvbUJpdHMoMHhmZmZmZmZmZiB8IDAsIDB4ZmZmZmZmZmYgfCAwLCB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIE1heGltdW0gdW5zaWduZWQgdmFsdWUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTUFYX1VOU0lHTkVEX1ZBTFVFID0gTUFYX1VOU0lHTkVEX1ZBTFVFO1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqIEBpbm5lclxuICAgICAqL1xuICAgIHZhciBNSU5fVkFMVUUgPSBmcm9tQml0cygwLCAweDgwMDAwMDAwIHwgMCwgZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICogTWluaW11bSBzaWduZWQgdmFsdWUuXG4gICAgICogQHR5cGUgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmcuTUlOX1ZBTFVFID0gTUlOX1ZBTFVFO1xuXG4gICAgLyoqXG4gICAgICogQGFsaWFzIExvbmcucHJvdG90eXBlXG4gICAgICogQGlubmVyXG4gICAgICovXG4gICAgdmFyIExvbmdQcm90b3R5cGUgPSBMb25nLnByb3RvdHlwZTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGEgMzIgYml0IGludGVnZXIsIGFzc3VtaW5nIGl0IGlzIGEgMzIgYml0IGludGVnZXIuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uIHRvSW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgPyB0aGlzLmxvdyA+Pj4gMCA6IHRoaXMubG93O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgTG9uZyB0byBhIHRoZSBuZWFyZXN0IGZsb2F0aW5nLXBvaW50IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUgKGRvdWJsZSwgNTMgYml0IG1hbnRpc3NhKS5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIoKSB7XG4gICAgICBpZiAodGhpcy51bnNpZ25lZClcbiAgICAgICAgcmV0dXJuICh0aGlzLmhpZ2ggPj4+IDApICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sb3cgPj4+IDApO1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCAqIFRXT19QV1JfMzJfREJMICsgKHRoaXMubG93ID4+PiAwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIExvbmcgdG8gYSBzdHJpbmcgd3JpdHRlbiBpbiB0aGUgc3BlY2lmaWVkIHJhZGl4LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcj19IHJhZGl4IFJhZGl4ICgyLTM2KSwgZGVmYXVsdHMgdG8gMTBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqIEBvdmVycmlkZVxuICAgICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IElmIGByYWRpeGAgaXMgb3V0IG9mIHJhbmdlXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKHJhZGl4KSB7XG4gICAgICByYWRpeCA9IHJhZGl4IHx8IDEwO1xuICAgICAgaWYgKHJhZGl4IDwgMiB8fCAzNiA8IHJhZGl4KSB0aHJvdyBSYW5nZUVycm9yKFwicmFkaXhcIik7XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIFwiMFwiO1xuICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxuICAgICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSB7XG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIExvbmcgdmFsdWUgYmVmb3JlIGl0IGNhbiBiZSBuZWdhdGVkLCBzbyB3ZSByZW1vdmVcbiAgICAgICAgICAvLyB0aGUgYm90dG9tLW1vc3QgZGlnaXQgaW4gdGhpcyBiYXNlIGFuZCB0aGVuIHJlY3Vyc2UgdG8gZG8gdGhlIHJlc3QuXG4gICAgICAgICAgdmFyIHJhZGl4TG9uZyA9IGZyb21OdW1iZXIocmFkaXgpLFxuICAgICAgICAgICAgZGl2ID0gdGhpcy5kaXYocmFkaXhMb25nKSxcbiAgICAgICAgICAgIHJlbTEgPSBkaXYubXVsKHJhZGl4TG9uZykuc3ViKHRoaXMpO1xuICAgICAgICAgIHJldHVybiBkaXYudG9TdHJpbmcocmFkaXgpICsgcmVtMS50b0ludCgpLnRvU3RyaW5nKHJhZGl4KTtcbiAgICAgICAgfSBlbHNlIHJldHVybiBcIi1cIiArIHRoaXMubmVnKCkudG9TdHJpbmcocmFkaXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBEbyBzZXZlcmFsICg2KSBkaWdpdHMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AsIHNvIGFzIHRvXG4gICAgICAvLyBtaW5pbWl6ZSB0aGUgY2FsbHMgdG8gdGhlIHZlcnkgZXhwZW5zaXZlIGVtdWxhdGVkIGRpdi5cbiAgICAgIHZhciByYWRpeFRvUG93ZXIgPSBmcm9tTnVtYmVyKHBvd19kYmwocmFkaXgsIDYpLCB0aGlzLnVuc2lnbmVkKSxcbiAgICAgICAgcmVtID0gdGhpcztcbiAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHJlbURpdiA9IHJlbS5kaXYocmFkaXhUb1Bvd2VyKSxcbiAgICAgICAgICBpbnR2YWwgPSByZW0uc3ViKHJlbURpdi5tdWwocmFkaXhUb1Bvd2VyKSkudG9JbnQoKSA+Pj4gMCxcbiAgICAgICAgICBkaWdpdHMgPSBpbnR2YWwudG9TdHJpbmcocmFkaXgpO1xuICAgICAgICByZW0gPSByZW1EaXY7XG4gICAgICAgIGlmIChyZW0uaXNaZXJvKCkpIHJldHVybiBkaWdpdHMgKyByZXN1bHQ7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoIDwgNikgZGlnaXRzID0gXCIwXCIgKyBkaWdpdHM7XG4gICAgICAgICAgcmVzdWx0ID0gXCJcIiArIGRpZ2l0cyArIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoaWdoIDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGhpZ2ggYml0c1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0SGlnaEJpdHMgPSBmdW5jdGlvbiBnZXRIaWdoQml0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLmhpZ2g7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhpZ2ggMzIgYml0cyBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBVbnNpZ25lZCBoaWdoIGJpdHNcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldEhpZ2hCaXRzVW5zaWduZWQgPSBmdW5jdGlvbiBnZXRIaWdoQml0c1Vuc2lnbmVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCA+Pj4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYSBzaWduZWQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn0gU2lnbmVkIGxvdyBiaXRzXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZXRMb3dCaXRzID0gZnVuY3Rpb24gZ2V0TG93Qml0cygpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvdztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG93IDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgaW50ZWdlci5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge251bWJlcn0gVW5zaWduZWQgbG93IGJpdHNcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmdldExvd0JpdHNVbnNpZ25lZCA9IGZ1bmN0aW9uIGdldExvd0JpdHNVbnNpZ25lZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvdyA+Pj4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ2V0TnVtQml0c0FicyA9IGZ1bmN0aW9uIGdldE51bUJpdHNBYnMoKSB7XG4gICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpXG4gICAgICAgIC8vIFVuc2lnbmVkIExvbmdzIGFyZSBuZXZlciBuZWdhdGl2ZVxuICAgICAgICByZXR1cm4gdGhpcy5lcShNSU5fVkFMVUUpID8gNjQgOiB0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtcbiAgICAgIHZhciB2YWwgPSB0aGlzLmhpZ2ggIT0gMCA/IHRoaXMuaGlnaCA6IHRoaXMubG93O1xuICAgICAgZm9yICh2YXIgYml0ID0gMzE7IGJpdCA+IDA7IGJpdC0tKSBpZiAoKHZhbCAmICgxIDw8IGJpdCkpICE9IDApIGJyZWFrO1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCAhPSAwID8gYml0ICsgMzMgOiBiaXQgKyAxO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcgY2FuIGJlIHNhZmVseSByZXByZXNlbnRlZCBhcyBhIEphdmFTY3JpcHQgbnVtYmVyLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzU2FmZUludGVnZXIgPSBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKCkge1xuICAgICAgLy8gMl41My0xIGlzIHRoZSBtYXhpbXVtIHNhZmUgdmFsdWVcbiAgICAgIHZhciB0b3AxMUJpdHMgPSB0aGlzLmhpZ2ggPj4gMjE7XG4gICAgICAvLyBbMCwgMl41My0xXVxuICAgICAgaWYgKCF0b3AxMUJpdHMpIHJldHVybiB0cnVlO1xuICAgICAgLy8gPiAyXjUzLTFcbiAgICAgIGlmICh0aGlzLnVuc2lnbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBbLTJeNTMsIC0xXSBleGNlcHQgLTJeNTNcbiAgICAgIHJldHVybiB0b3AxMUJpdHMgPT09IC0xICYmICEodGhpcy5sb3cgPT09IDAgJiYgdGhpcy5oaWdoID09PSAtMHgyMDAwMDApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8oKSB7XG4gICAgICByZXR1cm4gdGhpcy5oaWdoID09PSAwICYmIHRoaXMubG93ID09PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgemVyby4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNpc1plcm99LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZXF6ID0gTG9uZ1Byb3RvdHlwZS5pc1plcm87XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBuZWdhdGl2ZS5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc05lZ2F0aXZlID0gZnVuY3Rpb24gaXNOZWdhdGl2ZSgpIHtcbiAgICAgIHJldHVybiAhdGhpcy51bnNpZ25lZCAmJiB0aGlzLmhpZ2ggPCAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBwb3NpdGl2ZSBvciB6ZXJvLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzUG9zaXRpdmUgPSBmdW5jdGlvbiBpc1Bvc2l0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5zaWduZWQgfHwgdGhpcy5oaWdoID49IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIG9kZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkKCkge1xuICAgICAgcmV0dXJuICh0aGlzLmxvdyAmIDEpID09PSAxO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBldmVuLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbigpIHtcbiAgICAgIHJldHVybiAodGhpcy5sb3cgJiAxKSA9PT0gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZXF1YWxzIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudW5zaWduZWQgIT09IG90aGVyLnVuc2lnbmVkICYmXG4gICAgICAgIHRoaXMuaGlnaCA+Pj4gMzEgPT09IDEgJiZcbiAgICAgICAgb3RoZXIuaGlnaCA+Pj4gMzEgPT09IDFcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCA9PT0gb3RoZXIuaGlnaCAmJiB0aGlzLmxvdyA9PT0gb3RoZXIubG93O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBlcXVhbHMgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2VxdWFsc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmVxID0gTG9uZ1Byb3RvdHlwZS5lcXVhbHM7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubm90RXF1YWxzID0gZnVuY3Rpb24gbm90RXF1YWxzKG90aGVyKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZXEoLyogdmFsaWRhdGVzICovIG90aGVyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNub3RFcXVhbHN9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5uZXEgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFscztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbm90RXF1YWxzfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubmUgPSBMb25nUHJvdG90eXBlLm5vdEVxdWFscztcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbiA9IGZ1bmN0aW9uIGxlc3NUaGFuKG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wKC8qIHZhbGlkYXRlcyAqLyBvdGhlcikgPCAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFufS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubHQgPSBMb25nUHJvdG90eXBlLmxlc3NUaGFuO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmxlc3NUaGFuT3JFcXVhbCA9IGZ1bmN0aW9uIGxlc3NUaGFuT3JFcXVhbChvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpIDw9IDA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjbGVzc1RoYW5PckVxdWFsfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubHRlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2xlc3NUaGFuT3JFcXVhbH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmxlID0gTG9uZ1Byb3RvdHlwZS5sZXNzVGhhbk9yRXF1YWw7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCdzLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW4gPSBmdW5jdGlvbiBncmVhdGVyVGhhbihvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcCgvKiB2YWxpZGF0ZXMgKi8gb3RoZXIpID4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbn0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmd0ID0gTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbjtcblxuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoaXMgTG9uZydzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ncmVhdGVyVGhhbk9yRXF1YWwgPSBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwob3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXAoLyogdmFsaWRhdGVzICovIG90aGVyKSA+PSAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUZXN0cyBpZiB0aGlzIExvbmcncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCdzLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2dyZWF0ZXJUaGFuT3JFcXVhbH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gb3RoZXIgT3RoZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmd0ZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xuXG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhpcyBMb25nJ3MgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNncmVhdGVyVGhhbk9yRXF1YWx9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5nZSA9IExvbmdQcm90b3R5cGUuZ3JlYXRlclRoYW5PckVxdWFsO1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdGhpcyBMb25nJ3MgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkJ3MuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIHZhbHVlXG4gICAgICogQHJldHVybnMge251bWJlcn0gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgMSBpZiB0aGUgdGhpcyBpcyBncmVhdGVyIGFuZCAtMVxuICAgICAqICBpZiB0aGUgZ2l2ZW4gb25lIGlzIGdyZWF0ZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIGlmICh0aGlzLmVxKG90aGVyKSkgcmV0dXJuIDA7XG4gICAgICB2YXIgdGhpc05lZyA9IHRoaXMuaXNOZWdhdGl2ZSgpLFxuICAgICAgICBvdGhlck5lZyA9IG90aGVyLmlzTmVnYXRpdmUoKTtcbiAgICAgIGlmICh0aGlzTmVnICYmICFvdGhlck5lZykgcmV0dXJuIC0xO1xuICAgICAgaWYgKCF0aGlzTmVnICYmIG90aGVyTmVnKSByZXR1cm4gMTtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHNpZ24gYml0cyBhcmUgdGhlIHNhbWVcbiAgICAgIGlmICghdGhpcy51bnNpZ25lZCkgcmV0dXJuIHRoaXMuc3ViKG90aGVyKS5pc05lZ2F0aXZlKCkgPyAtMSA6IDE7XG4gICAgICAvLyBCb3RoIGFyZSBwb3NpdGl2ZSBpZiBhdCBsZWFzdCBvbmUgaXMgdW5zaWduZWRcbiAgICAgIHJldHVybiBvdGhlci5oaWdoID4+PiAwID4gdGhpcy5oaWdoID4+PiAwIHx8XG4gICAgICAgIChvdGhlci5oaWdoID09PSB0aGlzLmhpZ2ggJiYgb3RoZXIubG93ID4+PiAwID4gdGhpcy5sb3cgPj4+IDApXG4gICAgICAgID8gLTFcbiAgICAgICAgOiAxO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGlzIExvbmcncyB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQncy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb21wYXJlfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IDAgaWYgdGhleSBhcmUgdGhlIHNhbWUsIDEgaWYgdGhlIHRoaXMgaXMgZ3JlYXRlciBhbmQgLTFcbiAgICAgKiAgaWYgdGhlIGdpdmVuIG9uZSBpcyBncmVhdGVyXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jb21wID0gTG9uZ1Byb3RvdHlwZS5jb21wYXJlO1xuXG4gICAgLyoqXG4gICAgICogTmVnYXRlcyB0aGlzIExvbmcncyB2YWx1ZS5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFMb25nfSBOZWdhdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICAgIGlmICghdGhpcy51bnNpZ25lZCAmJiB0aGlzLmVxKE1JTl9WQUxVRSkpIHJldHVybiBNSU5fVkFMVUU7XG4gICAgICByZXR1cm4gdGhpcy5ub3QoKS5hZGQoT05FKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTmVnYXRlcyB0aGlzIExvbmcncyB2YWx1ZS4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNuZWdhdGV9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gTmVnYXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5uZWcgPSBMb25nUHJvdG90eXBlLm5lZ2F0ZTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN1bSBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGFkZGVuZCBBZGRlbmRcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFN1bVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKGFkZGVuZCkge1xuICAgICAgaWYgKCFpc0xvbmcoYWRkZW5kKSkgYWRkZW5kID0gZnJvbVZhbHVlKGFkZGVuZCk7XG5cbiAgICAgIC8vIERpdmlkZSBlYWNoIG51bWJlciBpbnRvIDQgY2h1bmtzIG9mIDE2IGJpdHMsIGFuZCB0aGVuIHN1bSB0aGUgY2h1bmtzLlxuXG4gICAgICB2YXIgYTQ4ID0gdGhpcy5oaWdoID4+PiAxNjtcbiAgICAgIHZhciBhMzIgPSB0aGlzLmhpZ2ggJiAweGZmZmY7XG4gICAgICB2YXIgYTE2ID0gdGhpcy5sb3cgPj4+IDE2O1xuICAgICAgdmFyIGEwMCA9IHRoaXMubG93ICYgMHhmZmZmO1xuICAgICAgdmFyIGI0OCA9IGFkZGVuZC5oaWdoID4+PiAxNjtcbiAgICAgIHZhciBiMzIgPSBhZGRlbmQuaGlnaCAmIDB4ZmZmZjtcbiAgICAgIHZhciBiMTYgPSBhZGRlbmQubG93ID4+PiAxNjtcbiAgICAgIHZhciBiMDAgPSBhZGRlbmQubG93ICYgMHhmZmZmO1xuICAgICAgdmFyIGM0OCA9IDAsXG4gICAgICAgIGMzMiA9IDAsXG4gICAgICAgIGMxNiA9IDAsXG4gICAgICAgIGMwMCA9IDA7XG4gICAgICBjMDAgKz0gYTAwICsgYjAwO1xuICAgICAgYzE2ICs9IGMwMCA+Pj4gMTY7XG4gICAgICBjMDAgJj0gMHhmZmZmO1xuICAgICAgYzE2ICs9IGExNiArIGIxNjtcbiAgICAgIGMzMiArPSBjMTYgPj4+IDE2O1xuICAgICAgYzE2ICY9IDB4ZmZmZjtcbiAgICAgIGMzMiArPSBhMzIgKyBiMzI7XG4gICAgICBjNDggKz0gYzMyID4+PiAxNjtcbiAgICAgIGMzMiAmPSAweGZmZmY7XG4gICAgICBjNDggKz0gYTQ4ICsgYjQ4O1xuICAgICAgYzQ4ICY9IDB4ZmZmZjtcbiAgICAgIHJldHVybiBmcm9tQml0cygoYzE2IDw8IDE2KSB8IGMwMCwgKGM0OCA8PCAxNikgfCBjMzIsIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXG4gICAgICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uIHN1YnRyYWN0KHN1YnRyYWhlbmQpIHtcbiAgICAgIGlmICghaXNMb25nKHN1YnRyYWhlbmQpKSBzdWJ0cmFoZW5kID0gZnJvbVZhbHVlKHN1YnRyYWhlbmQpO1xuICAgICAgcmV0dXJuIHRoaXMuYWRkKHN1YnRyYWhlbmQubmVnKCkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIG9mIHRoaXMgYW5kIHRoZSBzcGVjaWZpZWQgTG9uZy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzdWJ0cmFjdH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gc3VidHJhaGVuZCBTdWJ0cmFoZW5kXG4gICAgICogQHJldHVybnMgeyFMb25nfSBEaWZmZXJlbmNlXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zdWIgPSBMb25nUHJvdG90eXBlLnN1YnRyYWN0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGlzIGFuZCB0aGUgc3BlY2lmaWVkIExvbmcuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG11bHRpcGxpZXIgTXVsdGlwbGllclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUHJvZHVjdFxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUubXVsdGlwbHkgPSBmdW5jdGlvbiBtdWx0aXBseShtdWx0aXBsaWVyKSB7XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAoIWlzTG9uZyhtdWx0aXBsaWVyKSkgbXVsdGlwbGllciA9IGZyb21WYWx1ZShtdWx0aXBsaWVyKTtcblxuICAgICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gICAgICBpZiAod2FzbSkge1xuICAgICAgICB2YXIgbG93ID0gd2FzbVtcIm11bFwiXShcbiAgICAgICAgICB0aGlzLmxvdyxcbiAgICAgICAgICB0aGlzLmhpZ2gsXG4gICAgICAgICAgbXVsdGlwbGllci5sb3csXG4gICAgICAgICAgbXVsdGlwbGllci5oaWdoLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZnJvbUJpdHMobG93LCB3YXNtW1wiZ2V0X2hpZ2hcIl0oKSwgdGhpcy51bnNpZ25lZCk7XG4gICAgICB9XG4gICAgICBpZiAobXVsdGlwbGllci5pc1plcm8oKSkgcmV0dXJuIHRoaXMudW5zaWduZWQgPyBVWkVSTyA6IFpFUk87XG4gICAgICBpZiAodGhpcy5lcShNSU5fVkFMVUUpKSByZXR1cm4gbXVsdGlwbGllci5pc09kZCgpID8gTUlOX1ZBTFVFIDogWkVSTztcbiAgICAgIGlmIChtdWx0aXBsaWVyLmVxKE1JTl9WQUxVRSkpIHJldHVybiB0aGlzLmlzT2RkKCkgPyBNSU5fVkFMVUUgOiBaRVJPO1xuICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICAgIGlmIChtdWx0aXBsaWVyLmlzTmVnYXRpdmUoKSkgcmV0dXJuIHRoaXMubmVnKCkubXVsKG11bHRpcGxpZXIubmVnKCkpO1xuICAgICAgICBlbHNlIHJldHVybiB0aGlzLm5lZygpLm11bChtdWx0aXBsaWVyKS5uZWcoKTtcbiAgICAgIH0gZWxzZSBpZiAobXVsdGlwbGllci5pc05lZ2F0aXZlKCkpXG4gICAgICAgIHJldHVybiB0aGlzLm11bChtdWx0aXBsaWVyLm5lZygpKS5uZWcoKTtcblxuICAgICAgLy8gSWYgYm90aCBsb25ncyBhcmUgc21hbGwsIHVzZSBmbG9hdCBtdWx0aXBsaWNhdGlvblxuICAgICAgaWYgKHRoaXMubHQoVFdPX1BXUl8yNCkgJiYgbXVsdGlwbGllci5sdChUV09fUFdSXzI0KSlcbiAgICAgICAgcmV0dXJuIGZyb21OdW1iZXIoXG4gICAgICAgICAgdGhpcy50b051bWJlcigpICogbXVsdGlwbGllci50b051bWJlcigpLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG5cbiAgICAgIC8vIERpdmlkZSBlYWNoIGxvbmcgaW50byA0IGNodW5rcyBvZiAxNiBiaXRzLCBhbmQgdGhlbiBhZGQgdXAgNHg0IHByb2R1Y3RzLlxuICAgICAgLy8gV2UgY2FuIHNraXAgcHJvZHVjdHMgdGhhdCB3b3VsZCBvdmVyZmxvdy5cblxuICAgICAgdmFyIGE0OCA9IHRoaXMuaGlnaCA+Pj4gMTY7XG4gICAgICB2YXIgYTMyID0gdGhpcy5oaWdoICYgMHhmZmZmO1xuICAgICAgdmFyIGExNiA9IHRoaXMubG93ID4+PiAxNjtcbiAgICAgIHZhciBhMDAgPSB0aGlzLmxvdyAmIDB4ZmZmZjtcbiAgICAgIHZhciBiNDggPSBtdWx0aXBsaWVyLmhpZ2ggPj4+IDE2O1xuICAgICAgdmFyIGIzMiA9IG11bHRpcGxpZXIuaGlnaCAmIDB4ZmZmZjtcbiAgICAgIHZhciBiMTYgPSBtdWx0aXBsaWVyLmxvdyA+Pj4gMTY7XG4gICAgICB2YXIgYjAwID0gbXVsdGlwbGllci5sb3cgJiAweGZmZmY7XG4gICAgICB2YXIgYzQ4ID0gMCxcbiAgICAgICAgYzMyID0gMCxcbiAgICAgICAgYzE2ID0gMCxcbiAgICAgICAgYzAwID0gMDtcbiAgICAgIGMwMCArPSBhMDAgKiBiMDA7XG4gICAgICBjMTYgKz0gYzAwID4+PiAxNjtcbiAgICAgIGMwMCAmPSAweGZmZmY7XG4gICAgICBjMTYgKz0gYTE2ICogYjAwO1xuICAgICAgYzMyICs9IGMxNiA+Pj4gMTY7XG4gICAgICBjMTYgJj0gMHhmZmZmO1xuICAgICAgYzE2ICs9IGEwMCAqIGIxNjtcbiAgICAgIGMzMiArPSBjMTYgPj4+IDE2O1xuICAgICAgYzE2ICY9IDB4ZmZmZjtcbiAgICAgIGMzMiArPSBhMzIgKiBiMDA7XG4gICAgICBjNDggKz0gYzMyID4+PiAxNjtcbiAgICAgIGMzMiAmPSAweGZmZmY7XG4gICAgICBjMzIgKz0gYTE2ICogYjE2O1xuICAgICAgYzQ4ICs9IGMzMiA+Pj4gMTY7XG4gICAgICBjMzIgJj0gMHhmZmZmO1xuICAgICAgYzMyICs9IGEwMCAqIGIzMjtcbiAgICAgIGM0OCArPSBjMzIgPj4+IDE2O1xuICAgICAgYzMyICY9IDB4ZmZmZjtcbiAgICAgIGM0OCArPSBhNDggKiBiMDAgKyBhMzIgKiBiMTYgKyBhMTYgKiBiMzIgKyBhMDAgKiBiNDg7XG4gICAgICBjNDggJj0gMHhmZmZmO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKChjMTYgPDwgMTYpIHwgYzAwLCAoYzQ4IDw8IDE2KSB8IGMzMiwgdGhpcy51bnNpZ25lZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgdGhpcyBhbmQgdGhlIHNwZWNpZmllZCBMb25nLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI211bHRpcGx5fS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBtdWx0aXBsaWVyIE11bHRpcGxpZXJcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFByb2R1Y3RcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm11bCA9IExvbmdQcm90b3R5cGUubXVsdGlwbHk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQuIFRoZSByZXN1bHQgaXMgc2lnbmVkIGlmIHRoaXMgTG9uZyBpcyBzaWduZWQgb3JcbiAgICAgKiAgdW5zaWduZWQgaWYgdGhpcyBMb25nIGlzIHVuc2lnbmVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBkaXZpc29yIERpdmlzb3JcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFF1b3RpZW50XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5kaXZpZGUgPSBmdW5jdGlvbiBkaXZpZGUoZGl2aXNvcikge1xuICAgICAgaWYgKCFpc0xvbmcoZGl2aXNvcikpIGRpdmlzb3IgPSBmcm9tVmFsdWUoZGl2aXNvcik7XG4gICAgICBpZiAoZGl2aXNvci5pc1plcm8oKSkgdGhyb3cgRXJyb3IoXCJkaXZpc2lvbiBieSB6ZXJvXCIpO1xuXG4gICAgICAvLyB1c2Ugd2FzbSBzdXBwb3J0IGlmIHByZXNlbnRcbiAgICAgIGlmICh3YXNtKSB7XG4gICAgICAgIC8vIGd1YXJkIGFnYWluc3Qgc2lnbmVkIGRpdmlzaW9uIG92ZXJmbG93OiB0aGUgbGFyZ2VzdFxuICAgICAgICAvLyBuZWdhdGl2ZSBudW1iZXIgLyAtMSB3b3VsZCBiZSAxIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0XG4gICAgICAgIC8vIHBvc2l0aXZlIG51bWJlciwgZHVlIHRvIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy51bnNpZ25lZCAmJlxuICAgICAgICAgIHRoaXMuaGlnaCA9PT0gLTB4ODAwMDAwMDAgJiZcbiAgICAgICAgICBkaXZpc29yLmxvdyA9PT0gLTEgJiZcbiAgICAgICAgICBkaXZpc29yLmhpZ2ggPT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGJlIGNvbnNpc3RlbnQgd2l0aCBub24td2FzbSBjb2RlIHBhdGhcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtW1wiZGl2X3VcIl0gOiB3YXNtW1wiZGl2X3NcIl0pKFxuICAgICAgICAgIHRoaXMubG93LFxuICAgICAgICAgIHRoaXMuaGlnaCxcbiAgICAgICAgICBkaXZpc29yLmxvdyxcbiAgICAgICAgICBkaXZpc29yLmhpZ2gsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gdGhpcy51bnNpZ25lZCA/IFVaRVJPIDogWkVSTztcbiAgICAgIHZhciBhcHByb3gsIHJlbSwgcmVzO1xuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKSB7XG4gICAgICAgIC8vIFRoaXMgc2VjdGlvbiBpcyBvbmx5IHJlbGV2YW50IGZvciBzaWduZWQgbG9uZ3MgYW5kIGlzIGRlcml2ZWQgZnJvbSB0aGVcbiAgICAgICAgLy8gY2xvc3VyZSBsaWJyYXJ5IGFzIGEgd2hvbGUuXG4gICAgICAgIGlmICh0aGlzLmVxKE1JTl9WQUxVRSkpIHtcbiAgICAgICAgICBpZiAoZGl2aXNvci5lcShPTkUpIHx8IGRpdmlzb3IuZXEoTkVHX09ORSkpXG4gICAgICAgICAgICByZXR1cm4gTUlOX1ZBTFVFOyAvLyByZWNhbGwgdGhhdCAtTUlOX1ZBTFVFID09IE1JTl9WQUxVRVxuICAgICAgICAgIGVsc2UgaWYgKGRpdmlzb3IuZXEoTUlOX1ZBTFVFKSkgcmV0dXJuIE9ORTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgfG90aGVyfCA+PSAyLCBzbyB8dGhpcy9vdGhlcnwgPCB8TUlOX1ZBTFVFfC5cbiAgICAgICAgICAgIHZhciBoYWxmVGhpcyA9IHRoaXMuc2hyKDEpO1xuICAgICAgICAgICAgYXBwcm94ID0gaGFsZlRoaXMuZGl2KGRpdmlzb3IpLnNobCgxKTtcbiAgICAgICAgICAgIGlmIChhcHByb3guZXEoWkVSTykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRpdmlzb3IuaXNOZWdhdGl2ZSgpID8gT05FIDogTkVHX09ORTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlbSA9IHRoaXMuc3ViKGRpdmlzb3IubXVsKGFwcHJveCkpO1xuICAgICAgICAgICAgICByZXMgPSBhcHByb3guYWRkKHJlbS5kaXYoZGl2aXNvcikpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkaXZpc29yLmVxKE1JTl9WQUxVRSkpIHJldHVybiB0aGlzLnVuc2lnbmVkID8gVVpFUk8gOiBaRVJPO1xuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLm5lZygpLmRpdihkaXZpc29yLm5lZygpKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWcoKS5kaXYoZGl2aXNvcikubmVnKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGl2aXNvci5pc05lZ2F0aXZlKCkpIHJldHVybiB0aGlzLmRpdihkaXZpc29yLm5lZygpKS5uZWcoKTtcbiAgICAgICAgcmVzID0gWkVSTztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZSBhbGdvcml0aG0gYmVsb3cgaGFzIG5vdCBiZWVuIG1hZGUgZm9yIHVuc2lnbmVkIGxvbmdzLiBJdCdzIHRoZXJlZm9yZVxuICAgICAgICAvLyByZXF1aXJlZCB0byB0YWtlIHNwZWNpYWwgY2FyZSBvZiB0aGUgTVNCIHByaW9yIHRvIHJ1bm5pbmcgaXQuXG4gICAgICAgIGlmICghZGl2aXNvci51bnNpZ25lZCkgZGl2aXNvciA9IGRpdmlzb3IudG9VbnNpZ25lZCgpO1xuICAgICAgICBpZiAoZGl2aXNvci5ndCh0aGlzKSkgcmV0dXJuIFVaRVJPO1xuICAgICAgICBpZiAoZGl2aXNvci5ndCh0aGlzLnNocnUoMSkpKVxuICAgICAgICAgIC8vIDE1ID4+PiAxID0gNyA7IHdpdGggZGl2aXNvciA9IDggOyB0cnVlXG4gICAgICAgICAgcmV0dXJuIFVPTkU7XG4gICAgICAgIHJlcyA9IFVaRVJPO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXBlYXQgdGhlIGZvbGxvd2luZyB1bnRpbCB0aGUgcmVtYWluZGVyIGlzIGxlc3MgdGhhbiBvdGhlcjogIGZpbmQgYVxuICAgICAgLy8gZmxvYXRpbmctcG9pbnQgdGhhdCBhcHByb3hpbWF0ZXMgcmVtYWluZGVyIC8gb3RoZXIgKmZyb20gYmVsb3cqLCBhZGQgdGhpc1xuICAgICAgLy8gaW50byB0aGUgcmVzdWx0LCBhbmQgc3VidHJhY3QgaXQgZnJvbSB0aGUgcmVtYWluZGVyLiAgSXQgaXMgY3JpdGljYWwgdGhhdFxuICAgICAgLy8gdGhlIGFwcHJveGltYXRlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVhbCB2YWx1ZSBzbyB0aGF0IHRoZVxuICAgICAgLy8gcmVtYWluZGVyIG5ldmVyIGJlY29tZXMgbmVnYXRpdmUuXG4gICAgICByZW0gPSB0aGlzO1xuICAgICAgd2hpbGUgKHJlbS5ndGUoZGl2aXNvcikpIHtcbiAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHJlc3VsdCBvZiBkaXZpc2lvbi4gVGhpcyBtYXkgYmUgYSBsaXR0bGUgZ3JlYXRlciBvclxuICAgICAgICAvLyBzbWFsbGVyIHRoYW4gdGhlIGFjdHVhbCB2YWx1ZS5cbiAgICAgICAgYXBwcm94ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihyZW0udG9OdW1iZXIoKSAvIGRpdmlzb3IudG9OdW1iZXIoKSkpO1xuXG4gICAgICAgIC8vIFdlIHdpbGwgdHdlYWsgdGhlIGFwcHJveGltYXRlIHJlc3VsdCBieSBjaGFuZ2luZyBpdCBpbiB0aGUgNDgtdGggZGlnaXQgb3JcbiAgICAgICAgLy8gdGhlIHNtYWxsZXN0IG5vbi1mcmFjdGlvbmFsIGRpZ2l0LCB3aGljaGV2ZXIgaXMgbGFyZ2VyLlxuICAgICAgICB2YXIgbG9nMiA9IE1hdGguY2VpbChNYXRoLmxvZyhhcHByb3gpIC8gTWF0aC5MTjIpLFxuICAgICAgICAgIGRlbHRhID0gbG9nMiA8PSA0OCA/IDEgOiBwb3dfZGJsKDIsIGxvZzIgLSA0OCksXG4gICAgICAgICAgLy8gRGVjcmVhc2UgdGhlIGFwcHJveGltYXRpb24gdW50aWwgaXQgaXMgc21hbGxlciB0aGFuIHRoZSByZW1haW5kZXIuICBOb3RlXG4gICAgICAgICAgLy8gdGhhdCBpZiBpdCBpcyB0b28gbGFyZ2UsIHRoZSBwcm9kdWN0IG92ZXJmbG93cyBhbmQgaXMgbmVnYXRpdmUuXG4gICAgICAgICAgYXBwcm94UmVzID0gZnJvbU51bWJlcihhcHByb3gpLFxuICAgICAgICAgIGFwcHJveFJlbSA9IGFwcHJveFJlcy5tdWwoZGl2aXNvcik7XG4gICAgICAgIHdoaWxlIChhcHByb3hSZW0uaXNOZWdhdGl2ZSgpIHx8IGFwcHJveFJlbS5ndChyZW0pKSB7XG4gICAgICAgICAgYXBwcm94IC09IGRlbHRhO1xuICAgICAgICAgIGFwcHJveFJlcyA9IGZyb21OdW1iZXIoYXBwcm94LCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgICAgICBhcHByb3hSZW0gPSBhcHByb3hSZXMubXVsKGRpdmlzb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5zd2VyIGNhbid0IGJlIHplcm8uLi4gYW5kIGFjdHVhbGx5LCB6ZXJvIHdvdWxkIGNhdXNlXG4gICAgICAgIC8vIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB3ZSB3b3VsZCBtYWtlIG5vIHByb2dyZXNzLlxuICAgICAgICBpZiAoYXBwcm94UmVzLmlzWmVybygpKSBhcHByb3hSZXMgPSBPTkU7XG4gICAgICAgIHJlcyA9IHJlcy5hZGQoYXBwcm94UmVzKTtcbiAgICAgICAgcmVtID0gcmVtLnN1YihhcHByb3hSZW0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI2RpdmlkZX0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBRdW90aWVudFxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuZGl2ID0gTG9uZ1Byb3RvdHlwZS5kaXZpZGU7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLm1vZHVsbyA9IGZ1bmN0aW9uIG1vZHVsbyhkaXZpc29yKSB7XG4gICAgICBpZiAoIWlzTG9uZyhkaXZpc29yKSkgZGl2aXNvciA9IGZyb21WYWx1ZShkaXZpc29yKTtcblxuICAgICAgLy8gdXNlIHdhc20gc3VwcG9ydCBpZiBwcmVzZW50XG4gICAgICBpZiAod2FzbSkge1xuICAgICAgICB2YXIgbG93ID0gKHRoaXMudW5zaWduZWQgPyB3YXNtW1wicmVtX3VcIl0gOiB3YXNtW1wicmVtX3NcIl0pKFxuICAgICAgICAgIHRoaXMubG93LFxuICAgICAgICAgIHRoaXMuaGlnaCxcbiAgICAgICAgICBkaXZpc29yLmxvdyxcbiAgICAgICAgICBkaXZpc29yLmhpZ2gsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3csIHdhc21bXCJnZXRfaGlnaFwiXSgpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN1Yih0aGlzLmRpdihkaXZpc29yKS5tdWwoZGl2aXNvcikpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyBtb2R1bG8gdGhlIHNwZWNpZmllZC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNtb2R1bG99LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IGRpdmlzb3IgRGl2aXNvclxuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUmVtYWluZGVyXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5tb2QgPSBMb25nUHJvdG90eXBlLm1vZHVsbztcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIG1vZHVsbyB0aGUgc3BlY2lmaWVkLiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI21vZHVsb30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ3xudW1iZXJ8YmlnaW50fHN0cmluZ30gZGl2aXNvciBEaXZpc29yXG4gICAgICogQHJldHVybnMgeyFMb25nfSBSZW1haW5kZXJcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnJlbSA9IExvbmdQcm90b3R5cGUubW9kdWxvO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBOT1Qgb2YgdGhpcyBMb25nLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5ub3QgPSBmdW5jdGlvbiBub3QoKSB7XG4gICAgICByZXR1cm4gZnJvbUJpdHMofnRoaXMubG93LCB+dGhpcy5oaWdoLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb3VudCBsZWFkaW5nIHplcm9zIG9mIHRoaXMgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jb3VudExlYWRpbmdaZXJvcyA9IGZ1bmN0aW9uIGNvdW50TGVhZGluZ1plcm9zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaCA/IE1hdGguY2x6MzIodGhpcy5oaWdoKSA6IE1hdGguY2x6MzIodGhpcy5sb3cpICsgMzI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY291bnQgbGVhZGluZyB6ZXJvcy4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNjb3VudExlYWRpbmdaZXJvc30uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IW51bWJlcn1cbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLmNseiA9IExvbmdQcm90b3R5cGUuY291bnRMZWFkaW5nWmVyb3M7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGNvdW50IHRyYWlsaW5nIHplcm9zIG9mIHRoaXMgTG9uZy5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFudW1iZXJ9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5jb3VudFRyYWlsaW5nWmVyb3MgPSBmdW5jdGlvbiBjb3VudFRyYWlsaW5nWmVyb3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb3cgPyBjdHozMih0aGlzLmxvdykgOiBjdHozMih0aGlzLmhpZ2gpICsgMzI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY291bnQgdHJhaWxpbmcgemVyb3MuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjY291bnRUcmFpbGluZ1plcm9zfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyFMb25nfVxuICAgICAqIEByZXR1cm5zIHshbnVtYmVyfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuY3R6ID0gTG9uZ1Byb3RvdHlwZS5jb3VudFRyYWlsaW5nWmVyb3M7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXR3aXNlIEFORCBvZiB0aGlzIExvbmcgYW5kIHRoZSBzcGVjaWZpZWQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7IUxvbmd8bnVtYmVyfGJpZ2ludHxzdHJpbmd9IG90aGVyIE90aGVyIExvbmdcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9XG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQob3RoZXIpIHtcbiAgICAgIGlmICghaXNMb25nKG90aGVyKSkgb3RoZXIgPSBmcm9tVmFsdWUob3RoZXIpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICB0aGlzLmxvdyAmIG90aGVyLmxvdyxcbiAgICAgICAgdGhpcy5oaWdoICYgb3RoZXIuaGlnaCxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJpdHdpc2UgT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgc3BlY2lmaWVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUub3IgPSBmdW5jdGlvbiBvcihvdGhlcikge1xuICAgICAgaWYgKCFpc0xvbmcob3RoZXIpKSBvdGhlciA9IGZyb21WYWx1ZShvdGhlcik7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgIHRoaXMubG93IHwgb3RoZXIubG93LFxuICAgICAgICB0aGlzLmhpZ2ggfCBvdGhlci5oaWdoLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0d2lzZSBYT1Igb2YgdGhpcyBMb25nIGFuZCB0aGUgZ2l2ZW4gb25lLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0geyFMb25nfG51bWJlcnxiaWdpbnR8c3RyaW5nfSBvdGhlciBPdGhlciBMb25nXG4gICAgICogQHJldHVybnMgeyFMb25nfVxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUueG9yID0gZnVuY3Rpb24geG9yKG90aGVyKSB7XG4gICAgICBpZiAoIWlzTG9uZyhvdGhlcikpIG90aGVyID0gZnJvbVZhbHVlKG90aGVyKTtcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgdGhpcy5sb3cgXiBvdGhlci5sb3csXG4gICAgICAgIHRoaXMuaGlnaCBeIG90aGVyLmhpZ2gsXG4gICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaGlmdExlZnQgPSBmdW5jdGlvbiBzaGlmdExlZnQobnVtQml0cykge1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgZWxzZSBpZiAobnVtQml0cyA8IDMyKVxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgdGhpcy5sb3cgPDwgbnVtQml0cyxcbiAgICAgICAgICAodGhpcy5oaWdoIDw8IG51bUJpdHMpIHwgKHRoaXMubG93ID4+PiAoMzIgLSBudW1CaXRzKSksXG4gICAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICAgKTtcbiAgICAgIGVsc2UgcmV0dXJuIGZyb21CaXRzKDAsIHRoaXMubG93IDw8IChudW1CaXRzIC0gMzIpLCB0aGlzLnVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNzaGlmdExlZnR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNobCA9IExvbmdQcm90b3R5cGUuc2hpZnRMZWZ0O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIGFyaXRobWV0aWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuXG4gICAgICogQHRoaXMgeyFMb25nfVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBmdW5jdGlvbiBzaGlmdFJpZ2h0KG51bUJpdHMpIHtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGVsc2UgaWYgKG51bUJpdHMgPCAzMilcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmxvdyA+Pj4gbnVtQml0cykgfCAodGhpcy5oaWdoIDw8ICgzMiAtIG51bUJpdHMpKSxcbiAgICAgICAgICB0aGlzLmhpZ2ggPj4gbnVtQml0cyxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICAgdGhpcy5oaWdoID4+IChudW1CaXRzIC0gMzIpLFxuICAgICAgICAgIHRoaXMuaGlnaCA+PSAwID8gMCA6IC0xLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBhcml0aG1ldGljYWxseSBzaGlmdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIGFuIGFsaWFzIG9mIHtAbGluayBMb25nI3NoaWZ0UmlnaHR9LlxuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfCFMb25nfSBudW1CaXRzIE51bWJlciBvZiBiaXRzXG4gICAgICogQHJldHVybnMgeyFMb25nfSBTaGlmdGVkIExvbmdcbiAgICAgKi9cbiAgICBMb25nUHJvdG90eXBlLnNociA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyBsb2dpY2FsbHkgc2hpZnRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNoaWZ0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkID0gZnVuY3Rpb24gc2hpZnRSaWdodFVuc2lnbmVkKG51bUJpdHMpIHtcbiAgICAgIGlmIChpc0xvbmcobnVtQml0cykpIG51bUJpdHMgPSBudW1CaXRzLnRvSW50KCk7XG4gICAgICBpZiAoKG51bUJpdHMgJj0gNjMpID09PSAwKSByZXR1cm4gdGhpcztcbiAgICAgIGlmIChudW1CaXRzIDwgMzIpXG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICAodGhpcy5sb3cgPj4+IG51bUJpdHMpIHwgKHRoaXMuaGlnaCA8PCAoMzIgLSBudW1CaXRzKSksXG4gICAgICAgICAgdGhpcy5oaWdoID4+PiBudW1CaXRzLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIDAsIHRoaXMudW5zaWduZWQpO1xuICAgICAgcmV0dXJuIGZyb21CaXRzKHRoaXMuaGlnaCA+Pj4gKG51bUJpdHMgLSAzMiksIDAsIHRoaXMudW5zaWduZWQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaHJ1ID0gTG9uZ1Byb3RvdHlwZS5zaGlmdFJpZ2h0VW5zaWduZWQ7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgbG9naWNhbGx5IHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjc2hpZnRSaWdodFVuc2lnbmVkfS5cbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gU2hpZnRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5zaHJfdSA9IExvbmdQcm90b3R5cGUuc2hpZnRSaWdodFVuc2lnbmVkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGlzIExvbmcgd2l0aCBiaXRzIHJvdGF0ZWQgdG8gdGhlIGxlZnQgYnkgdGhlIGdpdmVuIGFtb3VudC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucm90YXRlTGVmdCA9IGZ1bmN0aW9uIHJvdGF0ZUxlZnQobnVtQml0cykge1xuICAgICAgdmFyIGI7XG4gICAgICBpZiAoaXNMb25nKG51bUJpdHMpKSBudW1CaXRzID0gbnVtQml0cy50b0ludCgpO1xuICAgICAgaWYgKChudW1CaXRzICY9IDYzKSA9PT0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICBpZiAobnVtQml0cyA9PT0gMzIpIHJldHVybiBmcm9tQml0cyh0aGlzLmhpZ2gsIHRoaXMubG93LCB0aGlzLnVuc2lnbmVkKTtcbiAgICAgIGlmIChudW1CaXRzIDwgMzIpIHtcbiAgICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgICAgcmV0dXJuIGZyb21CaXRzKFxuICAgICAgICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgICAgICAgICh0aGlzLmhpZ2ggPDwgbnVtQml0cykgfCAodGhpcy5sb3cgPj4+IGIpLFxuICAgICAgICAgIHRoaXMudW5zaWduZWQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBudW1CaXRzIC09IDMyO1xuICAgICAgYiA9IDMyIC0gbnVtQml0cztcbiAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgKHRoaXMuaGlnaCA8PCBudW1CaXRzKSB8ICh0aGlzLmxvdyA+Pj4gYiksXG4gICAgICAgICh0aGlzLmxvdyA8PCBudW1CaXRzKSB8ICh0aGlzLmhpZ2ggPj4+IGIpLFxuICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSBsZWZ0IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoaXMgaXMgYW4gYWxpYXMgb2Yge0BsaW5rIExvbmcjcm90YXRlTGVmdH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucm90bCA9IExvbmdQcm90b3R5cGUucm90YXRlTGVmdDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhpcyBMb25nIHdpdGggYml0cyByb3RhdGVkIHRvIHRoZSByaWdodCBieSB0aGUgZ2l2ZW4gYW1vdW50LlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcGFyYW0ge251bWJlcnwhTG9uZ30gbnVtQml0cyBOdW1iZXIgb2YgYml0c1xuICAgICAqIEByZXR1cm5zIHshTG9uZ30gUm90YXRlZCBMb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS5yb3RhdGVSaWdodCA9IGZ1bmN0aW9uIHJvdGF0ZVJpZ2h0KG51bUJpdHMpIHtcbiAgICAgIHZhciBiO1xuICAgICAgaWYgKGlzTG9uZyhudW1CaXRzKSkgbnVtQml0cyA9IG51bUJpdHMudG9JbnQoKTtcbiAgICAgIGlmICgobnVtQml0cyAmPSA2MykgPT09IDApIHJldHVybiB0aGlzO1xuICAgICAgaWYgKG51bUJpdHMgPT09IDMyKSByZXR1cm4gZnJvbUJpdHModGhpcy5oaWdoLCB0aGlzLmxvdywgdGhpcy51bnNpZ25lZCk7XG4gICAgICBpZiAobnVtQml0cyA8IDMyKSB7XG4gICAgICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhcbiAgICAgICAgICAodGhpcy5oaWdoIDw8IGIpIHwgKHRoaXMubG93ID4+PiBudW1CaXRzKSxcbiAgICAgICAgICAodGhpcy5sb3cgPDwgYikgfCAodGhpcy5oaWdoID4+PiBudW1CaXRzKSxcbiAgICAgICAgICB0aGlzLnVuc2lnbmVkLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbnVtQml0cyAtPSAzMjtcbiAgICAgIGIgPSAzMiAtIG51bUJpdHM7XG4gICAgICByZXR1cm4gZnJvbUJpdHMoXG4gICAgICAgICh0aGlzLmxvdyA8PCBiKSB8ICh0aGlzLmhpZ2ggPj4+IG51bUJpdHMpLFxuICAgICAgICAodGhpcy5oaWdoIDw8IGIpIHwgKHRoaXMubG93ID4+PiBudW1CaXRzKSxcbiAgICAgICAgdGhpcy51bnNpZ25lZCxcbiAgICAgICk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoaXMgTG9uZyB3aXRoIGJpdHMgcm90YXRlZCB0byB0aGUgcmlnaHQgYnkgdGhlIGdpdmVuIGFtb3VudC4gVGhpcyBpcyBhbiBhbGlhcyBvZiB7QGxpbmsgTG9uZyNyb3RhdGVSaWdodH0uXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ8IUxvbmd9IG51bUJpdHMgTnVtYmVyIG9mIGJpdHNcbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFJvdGF0ZWQgTG9uZ1xuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUucm90ciA9IExvbmdQcm90b3R5cGUucm90YXRlUmlnaHQ7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gc2lnbmVkLlxuICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgKiBAcmV0dXJucyB7IUxvbmd9IFNpZ25lZCBsb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b1NpZ25lZCA9IGZ1bmN0aW9uIHRvU2lnbmVkKCkge1xuICAgICAgaWYgKCF0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdywgdGhpcy5oaWdoLCBmYWxzZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoaXMgTG9uZyB0byB1bnNpZ25lZC5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFMb25nfSBVbnNpZ25lZCBsb25nXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b1Vuc2lnbmVkID0gZnVuY3Rpb24gdG9VbnNpZ25lZCgpIHtcbiAgICAgIGlmICh0aGlzLnVuc2lnbmVkKSByZXR1cm4gdGhpcztcbiAgICAgIHJldHVybiBmcm9tQml0cyh0aGlzLmxvdywgdGhpcy5oaWdoLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhpcyBMb25nIHRvIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQnl0ZSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIExvbmdQcm90b3R5cGUudG9CeXRlcyA9IGZ1bmN0aW9uIHRvQnl0ZXMobGUpIHtcbiAgICAgIHJldHVybiBsZSA/IHRoaXMudG9CeXRlc0xFKCkgOiB0aGlzLnRvQnl0ZXNCRSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGxpdHRsZSBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gTGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzTEUgPSBmdW5jdGlvbiB0b0J5dGVzTEUoKSB7XG4gICAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXG4gICAgICAgIGxvID0gdGhpcy5sb3c7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBsbyAmIDB4ZmYsXG4gICAgICAgIChsbyA+Pj4gOCkgJiAweGZmLFxuICAgICAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIGxvID4+PiAyNCxcbiAgICAgICAgaGkgJiAweGZmLFxuICAgICAgICAoaGkgPj4+IDgpICYgMHhmZixcbiAgICAgICAgKGhpID4+PiAxNikgJiAweGZmLFxuICAgICAgICBoaSA+Pj4gMjQsXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGlzIExvbmcgdG8gaXRzIGJpZyBlbmRpYW4gYnl0ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdGhpcyB7IUxvbmd9XG4gICAgICogQHJldHVybnMgeyFBcnJheS48bnVtYmVyPn0gQmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgTG9uZ1Byb3RvdHlwZS50b0J5dGVzQkUgPSBmdW5jdGlvbiB0b0J5dGVzQkUoKSB7XG4gICAgICB2YXIgaGkgPSB0aGlzLmhpZ2gsXG4gICAgICAgIGxvID0gdGhpcy5sb3c7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBoaSA+Pj4gMjQsXG4gICAgICAgIChoaSA+Pj4gMTYpICYgMHhmZixcbiAgICAgICAgKGhpID4+PiA4KSAmIDB4ZmYsXG4gICAgICAgIGhpICYgMHhmZixcbiAgICAgICAgbG8gPj4+IDI0LFxuICAgICAgICAobG8gPj4+IDE2KSAmIDB4ZmYsXG4gICAgICAgIChsbyA+Pj4gOCkgJiAweGZmLFxuICAgICAgICBsbyAmIDB4ZmYsXG4gICAgICBdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9uZyBmcm9tIGl0cyBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCeXRlIHJlcHJlc2VudGF0aW9uXG4gICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGxlIFdoZXRoZXIgbGl0dGxlIG9yIGJpZyBlbmRpYW4sIGRlZmF1bHRzIHRvIGJpZyBlbmRpYW5cbiAgICAgKiBAcmV0dXJucyB7TG9uZ30gVGhlIGNvcnJlc3BvbmRpbmcgTG9uZyB2YWx1ZVxuICAgICAqL1xuICAgIExvbmcuZnJvbUJ5dGVzID0gZnVuY3Rpb24gZnJvbUJ5dGVzKGJ5dGVzLCB1bnNpZ25lZCwgbGUpIHtcbiAgICAgIHJldHVybiBsZVxuICAgICAgICA/IExvbmcuZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKVxuICAgICAgICA6IExvbmcuZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgbGl0dGxlIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBMaXR0bGUgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21CeXRlc0xFID0gZnVuY3Rpb24gZnJvbUJ5dGVzTEUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IExvbmcoXG4gICAgICAgIGJ5dGVzWzBdIHwgKGJ5dGVzWzFdIDw8IDgpIHwgKGJ5dGVzWzJdIDw8IDE2KSB8IChieXRlc1szXSA8PCAyNCksXG4gICAgICAgIGJ5dGVzWzRdIHwgKGJ5dGVzWzVdIDw8IDgpIHwgKGJ5dGVzWzZdIDw8IDE2KSB8IChieXRlc1s3XSA8PCAyNCksXG4gICAgICAgIHVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvbmcgZnJvbSBpdHMgYmlnIGVuZGlhbiBieXRlIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBieXRlcyBCaWcgZW5kaWFuIGJ5dGUgcmVwcmVzZW50YXRpb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnNpZ25lZCBXaGV0aGVyIHVuc2lnbmVkIG9yIG5vdCwgZGVmYXVsdHMgdG8gc2lnbmVkXG4gICAgICogQHJldHVybnMge0xvbmd9IFRoZSBjb3JyZXNwb25kaW5nIExvbmcgdmFsdWVcbiAgICAgKi9cbiAgICBMb25nLmZyb21CeXRlc0JFID0gZnVuY3Rpb24gZnJvbUJ5dGVzQkUoYnl0ZXMsIHVuc2lnbmVkKSB7XG4gICAgICByZXR1cm4gbmV3IExvbmcoXG4gICAgICAgIChieXRlc1s0XSA8PCAyNCkgfCAoYnl0ZXNbNV0gPDwgMTYpIHwgKGJ5dGVzWzZdIDw8IDgpIHwgYnl0ZXNbN10sXG4gICAgICAgIChieXRlc1swXSA8PCAyNCkgfCAoYnl0ZXNbMV0gPDwgMTYpIHwgKGJ5dGVzWzJdIDw8IDgpIHwgYnl0ZXNbM10sXG4gICAgICAgIHVuc2lnbmVkLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLy8gU3VwcG9ydCBjb252ZXJzaW9uIHRvL2Zyb20gQmlnSW50IHdoZXJlIGF2YWlsYWJsZVxuICAgIGlmICh0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIC8qKlxuICAgICAgICogUmV0dXJucyBhIExvbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBiaWcgaW50ZWdlci5cbiAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBiaWcgaW50ZWdlciB2YWx1ZVxuICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gdW5zaWduZWQgV2hldGhlciB1bnNpZ25lZCBvciBub3QsIGRlZmF1bHRzIHRvIHNpZ25lZFxuICAgICAgICogQHJldHVybnMgeyFMb25nfSBUaGUgY29ycmVzcG9uZGluZyBMb25nIHZhbHVlXG4gICAgICAgKi9cbiAgICAgIExvbmcuZnJvbUJpZ0ludCA9IGZ1bmN0aW9uIGZyb21CaWdJbnQodmFsdWUsIHVuc2lnbmVkKSB7XG4gICAgICAgIHZhciBsb3dCaXRzID0gTnVtYmVyKEJpZ0ludC5hc0ludE4oMzIsIHZhbHVlKSk7XG4gICAgICAgIHZhciBoaWdoQml0cyA9IE51bWJlcihCaWdJbnQuYXNJbnROKDMyLCB2YWx1ZSA+PiBCaWdJbnQoMzIpKSk7XG4gICAgICAgIHJldHVybiBmcm9tQml0cyhsb3dCaXRzLCBoaWdoQml0cywgdW5zaWduZWQpO1xuICAgICAgfTtcblxuICAgICAgLy8gT3ZlcnJpZGVcbiAgICAgIExvbmcuZnJvbVZhbHVlID0gZnVuY3Rpb24gZnJvbVZhbHVlV2l0aEJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikgcmV0dXJuIExvbmcuZnJvbUJpZ0ludCh2YWx1ZSwgdW5zaWduZWQpO1xuICAgICAgICByZXR1cm4gZnJvbVZhbHVlKHZhbHVlLCB1bnNpZ25lZCk7XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIENvbnZlcnRzIHRoZSBMb25nIHRvIGl0cyBiaWcgaW50ZWdlciByZXByZXNlbnRhdGlvbi5cbiAgICAgICAqIEB0aGlzIHshTG9uZ31cbiAgICAgICAqIEByZXR1cm5zIHtiaWdpbnR9XG4gICAgICAgKi9cbiAgICAgIExvbmdQcm90b3R5cGUudG9CaWdJbnQgPSBmdW5jdGlvbiB0b0JpZ0ludCgpIHtcbiAgICAgICAgdmFyIGxvd0JpZ0ludCA9IEJpZ0ludCh0aGlzLmxvdyA+Pj4gMCk7XG4gICAgICAgIHZhciBoaWdoQmlnSW50ID0gQmlnSW50KHRoaXMudW5zaWduZWQgPyB0aGlzLmhpZ2ggPj4+IDAgOiB0aGlzLmhpZ2gpO1xuICAgICAgICByZXR1cm4gKGhpZ2hCaWdJbnQgPDwgQmlnSW50KDMyKSkgfCBsb3dCaWdJbnQ7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgX2RlZmF1bHQgPSAoX2V4cG9ydHMuZGVmYXVsdCA9IExvbmcpO1xuICB9LFxuKTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyBtb2R1bGVJZCArIFwiJ1wiKTtcblx0XHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdFx0dGhyb3cgZTtcblx0fVxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIlxuY29uc3QgYXBpID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL3dvcmtlci1pbnRlcmZhY2UuanMnKTtcbmV4cG9ydHMuYXBpID0gYXBpO1xuXG5jb25zdCB7IG92ZXJyaWRlR2xvYmFscyB9ID0gcmVxdWlyZSgnQHRlbXBvcmFsaW8vd29ya2Zsb3cvbGliL2dsb2JhbC1vdmVycmlkZXMuanMnKTtcbm92ZXJyaWRlR2xvYmFscygpO1xuXG5leHBvcnRzLnByZWxvYWRNb2R1bGVzID0gZnVuY3Rpb24gcHJlbG9hZE1vZHVsZXMoKSB7XG5cbn1cblxuZXhwb3J0cy5pbXBvcnRXb3JrZmxvd3MgPSBmdW5jdGlvbiBpbXBvcnRXb3JrZmxvd3MoKSB7XG4gIHJldHVybiByZXF1aXJlKC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCIvaG9tZS9ydW5uZXIvd29yay9zaHVtYWkvc2h1bWFpL2FwcHMvdHJhbnNjb2RlL3NyYy93b3JrZmxvd3MudHNcIik7XG59XG5cbmV4cG9ydHMuaW1wb3J0SW50ZXJjZXB0b3JzID0gZnVuY3Rpb24gaW1wb3J0SW50ZXJjZXB0b3JzKCkge1xuICByZXR1cm4gW1xuICAgIFxuICBdO1xufVxuIl0sIm5hbWVzIjpbImV4ZWN1dGVBY3Rpdml0eSIsImdldEFjdGl2aXRpZXMiLCJUYXNrUXVldWVUcmFuc2NvZGUiLCJBcHBsaWNhdGlvbkZhaWx1cmUiLCJ0cmFuc2NvZGVNZWRpYSIsInRhc2siLCJ1cGRhdGVUYXNrU3RhdHVzQWN0aXZpdHkiLCJ1cGRhdGVBc3NldFN0YXR1c0FjdGl2aXR5IiwiZ2V0QXNzZXRBY3Rpdml0eSIsImdldE1lZGlhSW5mb0FjdGl2aXR5IiwidHJhbnNjb2RlVmlkZW9BY3Rpdml0eSIsInRyYW5zY29kZUF1ZGlvQWN0aXZpdHkiLCJ0cmFuc2NvZGVJbWFnZUFjdGl2aXR5IiwiZ2VuZXJhdGVTcHJpdGVBY3Rpdml0eSIsInVwZGF0ZUFzc2V0TWVkaWFBY3Rpdml0eSIsImdldFRyYW5zY29kZVdvcmtlclF1ZXVlQWN0aXZpdHkiLCJkb3dubG9hZE1lZGlhVG9UbXBBY3Rpdml0eSIsImNsZWFudXBUbXBEaXJBY3Rpdml0eSIsInRha2VTY3JlZW5zaG90c0FjdGl2aXR5Iiwib3ZlcmxheUFubm90YXRpb25zQWN0aXZpdHkiLCJjcmVhdGVFbWJlZGRpbmdUYXNrSWZFbmFibGVkQWN0aXZpdHkiLCJ0bXBEaXIiLCJ3b3JrZXJRdWV1ZSIsImFzc2V0IiwidGFza0lkIiwiaWQiLCJzdGF0dXMiLCJwYXlsb2FkIiwic2NyZWVuc2hvdCIsImFzc2V0SWQiLCJrZXkiLCJzdG9yYWdlS2V5IiwiY3JlYXRlIiwibWVzc2FnZSIsIm5vblJldHJ5YWJsZSIsInNjcmVlbnNob3RzIiwiYXNzZXRLZXkiLCJzdGFydCIsImVuZCIsImNvdW50IiwiY29tbWVudFRpbWVzdGFtcCIsImFubm90YXRpb25zIiwib3V0cHV0IiwiaW1hZ2VBbm5vdGF0aW9uIiwibWVkaWEiLCJtZWRpYUluZm8iLCJpbWFnZVRyYW5zY29kZXMiLCJsZW5ndGgiLCJrZXlXaXRoT3ZlcmxheSIsImRvd25sb2FkIiwiZmlsZVBhdGgiLCJzcGVjIiwidHJhbnNjb2RlIiwibWVkaWFUeXBlIiwib3JpZ2luYWwiLCJkb3dubG9hZFVybCIsImZpbGVzaXplSW5CeXRlcyIsImNvZGVjIiwibWltZVR5cGUiLCJtZXRhZGF0YSIsInN0YXJ0c1dpdGgiLCJ2aWRlb1Jlc29sdXRpb25zIiwiZ2V0VGFyZ2V0VmlkZW9SZXNvbHV0aW9ucyIsInZpZGVvU3RyYXRlZ3kiLCJvcmlnaW5hbFdpZHRoIiwib3JpZ2luYWxIZWlnaHQiLCJyZXMiLCJ3aWR0aCIsImhlaWdodCIsInJlc29sdXRpb25Ub0RpbWVuc2lvbnMiLCJ2aWRlb1NwZWMiLCJyZXNvbHV0aW9uIiwidmlkZW9UcmFuc2NvZGUiLCJkdXJhdGlvbiIsIm9yaWdpbmFsRnBzIiwiZnJhbWVSYXRlIiwidmlkZW9QcmV2aWV3IiwidmlkZW9UcmFuc2NvZGVzIiwicHVzaCIsImlzUmF3IiwiaXNBdWRpbyIsImF1ZGlvVHJhbnNjb2RlIiwiaXNJbWFnZSIsImlzUHNkIiwiaXNNaW1lUHNkIiwiaW1hZ2VTcGVjIiwicXVhbGl0eSIsImZvcm1hdCIsImltYWdlVHJhbnNjb2RlIiwidGh1bWJuYWlsIiwidGh1bWJUcmFuc2NvZGUiLCJzcHJpdGUiLCJwb3N0ZXIiLCJsYXN0U2xhc2hJbmRleCIsImxhc3RJbmRleE9mIiwiYXNzZXREaXIiLCJzdWJzdHJpbmciLCJzcHJpdGVTcGVjIiwiZnJhbWVzIiwidGlsZVgiLCJ0aWxlWSIsInBvc3RlclNwZWMiLCJzcHJpdGVSZXN1bHQiLCJ0ZWFtSWQiLCJwcm9qZWN0SWQiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJFcnJvciIsIlN0cmluZyIsImNsZWFudXBFcnIiLCJSRVNPTFVUSU9OX0xPTkdfU0lERVMiLCJ0YXJnZXRMb25nU2lkZSIsIk1hdGgiLCJyb3VuZCIsIlRBUkdFVF9SRVNPTFVUSU9OUyIsIm5hbWUiLCJsb25nU2lkZSIsImdldEJlc3RNYXRjaFJlc29sdXRpb24iLCJyYXdMb25nU2lkZSIsIm1heCIsImxvd2VyIiwiZmlsdGVyIiwiciIsInNvcnQiLCJhIiwiYiIsInN0cmF0ZWd5IiwicmVzb2x1dGlvbnMiLCJub3JtYWxpemVkU3RyYXRlZ3kiLCJzdHJhdFN0ciIsImJlc3RNYXRjaCIsImJlc3RNYXRjaEluZGV4IiwiZmluZEluZGV4IiwiaSIsInRyYW5zY29kZVdvcmtmbG93Iiwid2YiLCJUYXNrUXVldWVBZ2VudCIsImlzVGVtcG9yYWwiLCJ3b3JrZmxvd0luZm8iLCJnbG9iYWxPYmoiLCJnbG9iYWxUaGlzIiwibG9jYWxBY3Rpdml0aWVzUHJveHkiLCJhY3RzIiwiX19sb2NhbEFjdGl2aXRpZXMiLCJzbGVlcCIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiYmFzZVByb3h5IiwicHJveHlBY3Rpdml0aWVzIiwic3RhcnRUb0Nsb3NlVGltZW91dCIsInJldHJ5IiwibWF4aW11bUF0dGVtcHRzIiwiaW5pdGlhbEludGVydmFsIiwiUHJveHkiLCJnZXQiLCJ0YXJnZXQiLCJwcm9wIiwid3JhcHBlZCIsImFyZ3MiLCJfYWN0aXZpdHlOYW1lIiwiUmVmbGVjdCIsImdldExvZ2dlciIsImRlYnVnIiwib2JqIiwibXNnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJfX2xvY2FsTG9nZ2VyIiwicXVldWUiLCJhY3Rpdml0eUZ1bmMiLCJhY3Rpdml0eU5hbWUiLCJsb2dnZXIiLCJyZXN1bHQiLCJoYW5kbGUiLCJ0YXNrUXVldWUiLCJnZXRDb25jdXJyZW5jeUxpbWl0IiwiZW52VmFyIiwiZGVmYXVsdFZhbHVlIiwicGFyc2VkIiwicGFyc2VJbnQiLCJpc05hTiIsImdsb2JhbE9ialdpdGhDYW5jZWwiLCJfX2xvY2FsQ2FuY2VsSGFuZGxlcnMiLCJNYXAiLCJsb2NhbENhbmNlbEhhbmRsZXJzIiwicmVnaXN0ZXJMb2NhbENhbmNlbEhhbmRsZXIiLCJjYW5jZWxGbiIsInNldCIsInVucmVnaXN0ZXJMb2NhbENhbmNlbEhhbmRsZXIiLCJkZWxldGUiLCJ0cmlnZ2VyTG9jYWxDYW5jZWwiLCJoYW5kbGVyIl0sInNvdXJjZVJvb3QiOiIifQ==`,sourceMap:`deprecated: this is no longer in use
|
|
11511
11534
|
`};export{B as default};
|